2014년 4월 5일 토요일

[Servlet/Jsp] headFirst - Ch3 - 배포 서술자


0. 환경

macbook-pro 13” 2012 mid / 10GB
tomcat7
교재: Head First Servlet/Jsp, 한빛미디어, 2012


1. 학습목표

Web Application Directory

1) 디렉토리 구조를 만들 수 있음
2) 정적 컨텐츠, JSP페이지, 서블릿 클래스, 배포 서술자, 태그 라이브러리, JAR파일, 자바 클래스 파일

Deployment Descriptor

1) 항목의 용도 및 문법 설명
2) 항목을 정확한 구조로 만들 수 있음

배포의 흐름

1) 처음부터 끝까지 전 과정


2. 환경

Maven project 기준으로 pom.xml 설정환경에 따라 달라질 수 있음

Directory 구조

maven개발환경

배포 환경

maven배포환경

1) Tomcat Container 영역

tomcat - webapps - maven_webapp_project

이하 영역은 Web Application 영역으로 어떤 Container를 사용하든지 동일
2) Servlet spec. 영역

WEB-INF - classes
WEB-INF - lib
WEB-INF - web.xml
*.[jsp|html|…]

3) Application 영역

WEB-INF - classes - me - dec7 - 이하


3. 개발 진행흐름

  1. 사용자가 제일 먼저 볼 HTML 폼 생성
  2. Controller Servlet ver.1
    • HTML 폼이 서블릿 호출시 단순히 파라미터 값을 출력
  3. 관련 Model Class 완성
    • Test Class
    • Model Class
  4. Controller Servlet ver.2
    • Servlet에 Model을 조작할 수 있는 기능 추가
  5. JSP 완성
  6. Controller Servlet ver.3
    • JSP로 요청을 전달(Dispaching)하는 기능 추가
  7. 전체 어플리케이션 테스트

4. Servlet 흐름

  1. 사용자가 특정 서블릿 요청
  2. Container는 DD에 접근하여 항목에서 찾음
  3. 과 맵핑된 을 통해 일치하는 이 있는지 찾음
  4. 찾으면 를 읽음
    • 서블릿이 초기화된 적이 없는 경우 class를 로드하고 초기화
  5. Container는 요청을 처리할 새로운 Thread를 시작하고 Service() 메소드에 Request 객체 참조를 인자로 전달
  6. Service() 메소드는 HTTP 메소드에 따라 doGet()나 doPost()를 호출
  7. Thread 완료시 사용자에게 응답 전달

Servlet 요청시

servlet에 요청시 웹 어플리케이션의 컨텍스트 루트 (tomcat에 배포된 project 이름) 를 붙이지 않더라도 상대경로로 인식하고 절대경로로 변경

<form method="POST" action="ABCServlet">

5. MVC 디자인 패턴

비지니스 로직과 프리젠테이션 로직의 분리가 MVC의 핵심

Controller

Servlet
Request객체에서 사용자가 입력한 정보를 추출
모델에 대해 어떤 작업을 해야할지 알아냄

  • 모델 정보를 수정할지
  • 뷰(JSP)에게 전달할 새로운 모델을 만들지

View

JSP, 프리젠테이션 로직
View는 Controller로 부터 Model정보를 읽어 옴

  • 직접 / 간접적 방법 모두 가능
  • View가 찾을 수 있는 곳에 Controller가 두는 방식을 많이 사용

사용자가 입력한 정보를 Controller에게 전달

Model

비지니스 로직
getter, setter 로직 포함
MVC pattern에서 DB와 통신하는 유일한 곳

  • MVC 아키텍쳐에서 Model은 Back-End라고 함
    • 대부분 Model은 일반 자바 클래스로 코딩함
    • Model은 자신이 호출된다는 것을 알 필요 없음
      • 안다면 특정 App에 종속된다는 의미이며 꼭 필요할 경우 Utility Package로 옮겨야 함

6. Dispach

  • Servlet이 JSP를 호출하도록 기능 확장
  • 요청 처리 부탁 (Request dispaching) 매커니즘 제공
    • Container는 자신이 관리하는 컴포넌트끼리 서로 호출할 수 있는 기능

위 기능 이용하여 Servlet은 Model에게 받은 정보를
Request 객체 안에 저장하고 JSP에 요청을 처리해 줄 것을 부탁(Dispatch) 할 수 있음

code

// head first servlet/jsp, ch3, servlet ver.3 code


// 나중에 jsp가 styles란 값으로 result를 읽을 수 있도록 request 객체 속성에 값을 설정
request.setAttribute("styles", result);

// jsp로 작업을 부탁할 RequestDispatcher를 인스턴스화
RequestDispatcher view = request.getRequestDispatcher("result.jsp");

// jsp에게 request, response 객체를 전달
view.forward(request, response);

Written with Dec7.

[Servlet/Jsp] headFirst - Ch2 - 웹 어플리케이션 아키텍쳐


0. 환경

macbook-pro 13” 2012 mid / 10GB
tomcat7
교재: Head First Servlet/Jsp, 한빛미디어, 2012


1. 학습목표

Http method

1) 각각의 사용 목적
2) Http method protocal의 기술적 특징
3) 각 method에 대응되는 HttpServlet method

Servlet

1) 생명주기 이벤트
2) 위 이벤트의 각각의 목적

Web Application 디렉토리 구조

배포 서술자

1) 문법
2) 사용 목적


2. Container

Tomcat은 Web Container로 Servlet의 좋은 예제
Servlet을 실행하고 관리

실행흐름

  1. 사용자는 웹 서버(Apache-httpd)에게 Servlet에 대한 요청
  2. 웹 서버는 Servlet을 관리하는 Container에게 http요청을 넘김
    • Container는 Servlet이 배포(deploy)된 Container
  3. Container는 HttpServletResponse, HttpServletRequest 객체를 만듦
  4. Container는 url분석하여 DD(Deploy Descriptor, 배포 서술자)를 바탕으로 어떤 서블릿에 대한 요청인지 파악
  5. Container는 해당 서블릿 스레드를 생성하여 HttpServletResponse / HttpServletRequest 객체를 인자로 전달
  6. Container는 서블릿 service() 메소드를 호출
  7. Service()메소드는 doGet() 혹은 doPost()를 호출할지 결정
  8. 위 method는 동적인 페이지 생성 후 HttpServletReponse 객체에 내용을 실어 보냄
    • 보낸 후에도 Container는 HttpServletResponse 객체에 대한 참조를 유지함
  9. 스레드 작업 완료시, Container는 HttpServletResponse 객체를 Http 응답으로 전환하여 사용자에게 전달
  10. Conatiner는 Request / Response 객체를 소멸

Container가 주는 혜택

  1. 통신 지원
    • Servlet과 웹 서버가 서로 통신할 수 방법을 구현하여 API로 제공
    • 개발자는 Servlet에서 구현해야할 비지니스 로직에 집중 가능
  2. 생명주기 관리
    • 서블릿 로딩, 인스턴스화, 초기화 메소드 호출
    • 웹 서버로부터 요청시 적절한 서블릿 메소드 호출
    • 서블릿 사용 완료 후 가비지 컬렉션 진행
  3. 멀티스레딩 지원
    • 요청이 들어올 때마다 새로운 스레드 생성
    • http 서비스 종료 후 스레스 소멸
  4. 선언적 보안 관리
    • XML 배포 서술자에 기록
    • 서블릿 내부에 보안에 관련된 내용을 하드코딩할 필요없음
  5. JSP 지원
    • JSP 코드를 Java 코드로 변환

Servlet을 찾는 방법

  1. 클라이언트가 보낸 요청에 들어있는 url을 이용해 서블릿을 찾음
  2. url과 servlet을 맵핑하는 방법은 몇 가지가 있음

3. Servlet

기본 코드

// head first servlet/jsp chapter2, servlet code 예제

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Ch2Servlet extends HttpServlet {
    public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter out = response.getWriter();
        java.util.Date today = new java.util.Date();
        out.println(“<html> “ + “<body>” + “<h1 style=”text-align:center>” + “HF\’s Chapter2 Servlet</h1>” + “<br>” + today + “</body>” + “</html>”);
    }
}
  1. servlet의 대부분은 HttpServlet을 상속 받음
  2. main() method가 없음
  3. 웹 브라우져가 요청한 메소드에 따라 호출될 doGet()이나 doPost()를 재정의

이름

  1. url이름
  2. 내부적인 이름
  3. 실제 파일명
    • 파일 위치명
    • 디렉토리 구조가 패키지에 대한 정보를 가짐

서블릿의 이름을 다른 이름으로 맵핑하면 어플리케이션의 유연성, 보안성이 좋아짐
디렉토리 구조가 변경되어도 code는 변경할 필요 없음
디렉토리 구조를 외부에서 알 수 없음


4. 배포 서술자

Web Container도 Servlet을 배포하기 위해 배포 서술자 (DD, Deployment Descriptor)라는 XML 파일을 먼저 만들어야 함

장점

  1. 이미 테스트된 소스코드에 대한 수정 최소화
  2. 소스코드 없더라도 어플리케이션을 목적에 맞게 수정 가능

DD가 할 수 있는 일

  1. 보안 역할 설정
  2. 오류페이지 설정
  3. 항목 라이브러리
  4. 초기화 구성
  5. 관련정보 설정
  6. etc…

web.xml

<!-- head first servlet/jsp chapter2, DD 예제 -->

<!-- web-app 뒤에는 설정해야할 속성이 첨부됨 -->
<web-app ...>
    <servlet>
        <servlet-name>Internal name 1</servlet-name>

        <!-- 패키지 이름까지 포함된 서블릿 이름 기입 -->
        <servlet-class>foo.Servlet1</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Internal name 2</servlet-name>
        <servlet-class>foo.Servlet2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Internal name 1</servlet-name>

        <!-- 클라이언크가 사용하는 서블릿 이름 -->
        <url-pattern>/Public1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Internal name 2</servlet-name>
        <url-pattern>/Public2</url-pattern>
    </servlet-mapping>
</web-app>

서블릿 검색 과정

  1. 런타임시 요청이 들어오면
  2. Container는 DD에서 항목을 검색
  3. 요청된 url을 바탕으로 servlet-name이 동등한 servlet을 찾아 실행

servlet-class 항목에 패키지 명과 클래스 명만 존재
정확한 경로가 없는 이유는 컨테이너는 정해진 위치에서만 서블릿을 찾기 때문
사실 파일시스템 상의 서블릿 파일을 찾는 과정엔 좀 복잡한 매커니즘이 존재함


5. J2EE

Web Container

Web Component(Servlet, JSP)

EJB Container

Business Component (Session Bean, Entity Bean, Message-Driven Bean)

Tomcat

Web Component만 구현되어있고, Business Component는 구현되어있지 않음
따라서 완벽한 J2EE Application Server가 아님


Written with Dec7.

[Servlet/Jsp] headFirst - Ch1 - 개론


0. 환경

macbook-pro 13” 2012 mid / 10GB
tomcat7
교재: Head First Servlet/Jsp, 한빛미디어, 2012


1. 학습목표

Http method

1) http method 장점
2) http method 기능
3) 각 메소드간 클라이언트에서 일어나는 일


2. 주체간 하는 일

웹 서버

물리적 하드웨어
서버 어플리케이션 소프트웨어

클라이언트

웹 브라우져
사용자의 요청을 서버에 전달
서버로부터 응답을 받음 ( html파일, 소리파일, 그림파일… )
HTML 코드를 읽고 화면에 출력


3. HTTP

언어

서버: 요청을 받고 응답을 할 수 있는
클라이언트: 요청을 보내고, 응답을 사용자에게 보여줄 수 있는

즉 요청과 응답을 할 수 있는 서버와 클라이언트간 공통된 언어가 필요

HTTP

HTTP (hyper text transfer protocal)로 웹 상에서 클라이언트와 서버가 서로 대화하기 위한 규약
즉, 서버는 클라이언트에게 html 문서를 전달하기 위해 HTTP를 사용

  • TCP/IP 기반으로 동작

HTTP 요청 구성요소

  1. http method
    • 실행할 액션을 의미
  2. 접근 url
  3. form parameter

HTTP 응답 구성요소

  1. 상태 코드
    • 요청의 성공 여부
  2. content-type
    • 텍스트, 그림, html …
  3. contents

따라서, HTML은 HTTP응답의 일부


4. HTTP 요청

HTTP method

종류: get, post, head, trace, put, delete, connect

GET

  • 단순하게 서버에게 자원을 요청
  • 자원은 html, jpeg, pdf와 같은 file
  • 서버에게 돌려받다 (Get back)는 의미를 가짐

POST

  • GET보다 강력
  • 자원을 요청할 때 필요한 정보도 함께 전달

GET과 POST 차이점

  • GET은 보낼 수 있는 글자 수 제한
  • GET은 url로 데이터를 전달하여 보안에 취약
  • GET은 url로 자원을 요청할 수 있으므로 즐겨찾기 등록 가능

5. HTTP 응답

구성요소

  1. header
    • 사용된 프로토콜
    • 요청의 성공여부 (상태코드)
    • 몸체에 포함된 contents의 종류
  2. body
    • contents ( html, jpeg, pdf … )

Content-type (MIME type)

response body에 포함된 내용의 type


6. 진행흐름

  1. 사용자 웹 브라우져를 이용하여 url 검색
  2. 웹 브라우져는 http를 get방식으로 서버에 전달
  3. 서버는 요청된 자료를 찾고 그 자료를 바탕으로 http를 작성
  4. 서버는 웹 크라이언트에게 http 응답을 보냄
  5. 웹 브라우져는 http 응답을 해석하고 화면에 보여줌
  6. 사용자는 happy

7. url

URL (Uniform Resource Locators)은 웹 상에서 존재하는 모든 자원에게 이름을 부여하는 방식

http://www.abc.com:80/nice/to/meet/you.htm

http://

서버와 대화하기 위한 protocal 명시

www.abc.com

도메인
서버를 찾기 위한 이름
DNS 서버를 통해 특정 IP로 연결됨
host라고 부르며(호스트명)

:80

port를 의미하고 80은 웹 서비스를 위한 기본 port로 생략가능
포트는 어떤 컴퓨터의 다양한 프로그램 중 특정 어플리케이션을 찾기 위해 사용됨 (정확한 의미는 아님)
16bit 숫자 값으로 0~65535를 사용가능

/nice/to/meet/

서버에서 자원의 위치

you.htm

요청된 콘텐츠 이름


8. 웹 서버

웹 서버 (Apache-httpd)는 http의 요청, 응답만 할 수 있다.
따라서 서버 내 정적인 페이지를 찾아서 클라이언트에게 전달할 뿐이다.

웹 서버가 못하는 일

  1. 동적 컨텐츠 생성
  2. 서버 내부에 데이터 저장

즉, 웹 서버의 능력 밖의 일을 요청할 경우 그 일을 할 수 있는 다른 어플리케이션에게 작업을 요청

CGI (Common Gateway Interface)

웹 서버가 못하는 일을 처리해 줄 수 있는 도우미 어플리케이션을 의미

  1. 사용자는 cgi 프로그램에 대한 url 클릭
  2. 웹 서버는 사용자의 요청을 이해하고 해당 프로그램을 실행
  3. 해당 프로그램은 실행된 결과를 html문서로 작성하고 웹 서버에 전달
    • 웹 서버가 요청받은 시점에 해당 문서는 정적인 html 문서
  4. 클라이언트는 html 문서를 전달받고 화면에 출력

9. Servlet

servlet 또한 웹 서버의 도우미 어플리케이션

JSP

java코드와 html코드를 분리하기 위한 Servlet의 보완 기술


Written with Dec7.

[C언어] scanf double형 %f시 문제


0. 환경

macbook-pro 13” 2012 mid / 10GB
GCC


1. 문제점

scanf를 사용할 때 double형 변수를 %f로 입력받는 경우
결과처럼 숫자를 제대로 인지 못하는 경우가 발생

#include <stdio.h>

int main (void) {
    double on;
    scanf ("%f", &on);

    printf ("result: %f\n", on);
    return 0;
 }
# 결과
$ ./a.out
100
result: 0.000000

2. 해결책

#include <stdio.h>

int main (void) {
    double on;
    # 아래와 같이 수정함
    # scanf ("%f", &on);
    scanf ("%lf", &on);

    printf ("result: %f\n", on);
    return 0;
 }

3. 의문

printf는 double형도 %f로 해도 잘 되는데 왜 scanf는 문제가 발생하는가?

scanf는 모든 자료형의 입력을 받을 수 있어야만하므로
모든 파라미터를 void형 포인터로 받는다.
따라서 포인터 정보로 해당 자료형(double인지 float인지)의 정보를 알 수 없다.
그러므로 float와 double을 각각 %f, %lf로 구별해줘야 한다.


* 참고자료

Luyin - scanf의 %f %lf의 차이


Written with Dec7.

[jenkins] github의 일부 project만 빌드


0. 환경

macbook-pro 13” 2012 mid / 10GB
parallels9 ubuntu 12.04 LTS
tomcat7, jenkins, maven project


jenkins와 연동된 github 중 일부 프로젝트만 빌드해야 할 때

요약

pom.xml 및 빌드 결과물의 위치를 신경쓰자


1. github 상황

아래 github에 Crawler project 폴더와 wildgoose project 폴더가 있다.
github

그리고 wildgoose project만 jenkins의 job으로 선택하고자 한다.

아래의 사진은 wildgoose 폴더의 내부이고 maven project로 생성되었다.
wildgoose project


2. job 설정

pom.xml 위치 지정

아래 그림처럼 jenkins의 job(item)을 Build a maven2/3 project 로 생성하면
jenkins maven project

이때 jeckins에게 pom.xml의 위치를 알려줘야 하는데
github의 상위 directory를 기준으로 pom.xml이 있는 상대위치를 적어주면 된다.
pom.xml location


3. 결과물 위치

일반적으로 (ubuntu 기준) 결과물은 [user home directory]/.jenkins/workspace/[job name] 이하 에 위치하며 project의 위치에 따라 약간씩 달라질 수 있다.

빌드 결과

job의 빌드를 실행 후 결과를 보면 결과물이 어디에 위치했는지를 알 수 있다.


Written with Dec7.

2014년 4월 3일 목요일

[Visual Studio] 솔루션 탐색기


0. 환경

macbook-pro 13” 2012 mid / 10GB
parallels9 windows8.1 pro k
visual studio professional 2013


솔루션 탐색기가 안보일 때


1. 단축키

Ctrl + Alt + L


2. 메뉴 이용

메뉴(Alt) - 보기(v) - 솔루션 탐색기(p)

스크린샷

1) 프로젝트를 생성했는데 보여지는 화면이 아님
문제의 그 화면

2) 메뉴의 보기 탭으로 이동하여 솔루션 탐색기를 클릭
보기 탭 클릭

3) 따로 창이 보여질 경우 창을 오른쪽으로 끌어다 옮김
짜잔
이동

4) 완료!!
완료


Written with Dec7.

C언어 결과

10+ 20= 40
20 +40 =100

Written with Dec7.