월요일, 12월 23
Shadow

#023 초간단 MVC

01. 초간단 미니 MVC 튜토리얼

실제 웹 애플리케이션을 빌드해보자
1. 사용자화면(브라우저에 화면에 어떤 내용을 보여줄것인가)에 대하여 살표 봅시다. 이는 고차원 구조화 작업입니다.
2. 이번 프로젝트에서 사용할 개발 환경을 만들어 봅시다. 여기서 마든 개발 환경은 다른 장에서 계속하여 예제로 사용할 것입니다.
3. 이번 프로젝트에서 사용할 배포호나경을 만들어 봅시다. 여게서 마든 배포 호나경은 다른 장에서 계속해서 에제로 사용할 것입니다.
4. 웹 애플리케이션에 들어가는 여러 콤포넌트는 반복적인 개발과 테스트를 통하여  구현할것입니다.

애플리케이션 아캐텍처는 이렇게..
1. 클라이언트라 form.html을 요청합니다.
2. 요청을 받은 컨테이너가 form.html을 파일시스템에서 읽어 옵니다.
3. form.html을 브라우저로 넘겨줍니다. 화면을 보고 사용자가 맥주 색깔에 관련된 질문에 자신의 취향을 입력합니다.
4. 사용자가 선택한 정보를 컨테이너로 보냅니다.
5. 컨테이너는 URL을 분석하여 담당 서블릿을 찾아 요청을 넘깁니다.
6. 서블릿은 BeerExpert 클래스를 호출합니다.
7. BeerExpert클래스는 맥주에 대한 조언을 서블릿으로 넘겨줍니다. 서블릿은 이 정보를 Request객체에 저장합니다.
8. JSP에 Request 객체를 forwad 합니다.
9. JSP는 서블릿이 넣어 놓은 정보를 Request객체에서 추출합니다.
10. JSP는 여기에 바탕하여 HTML페이지를 작성합니다.
11. 컨테이너는 이 페이지를 한껏 대하고 있는 사용자에게 넘겨줍니다.

웹애플리케이션 개발을 위한 여정
1. 웹 애플리케이션에서 사용자 화면에 대한 검토
2. 아키텍처 살펴보기
3. 웹애플리케이션을 생성 및 배포하기 위한 개발 및 배포 환경 설정하기
4. 애플리케이션 개발
1) 사용자가 제일먼저 볼 HTML 폼을 생성하여 테스트 합니다ㅣ.
2) 컨트롤러 서블릿 버전 1을 마듭니다. 버전1에서는 HTML 폼이 서블릿을 호출하면, 단순히 파라미터값을 출력합니다.
3) BeerExpert 모델 클래스를 위한 테스트 클래스를 만듭니다. 그다음 진짜 BeerExper 모델 클래스를 만들겠죠.
4) 서블릿 버전을 2로 올립니다. 버전 2에서는 BeerExport에게 맥주에 대한 조언을 구할수 있는 기능을 추가합니다.
5) JSP를 마들고 서블릿 버전을 3으로 올립니다. 버전 3에서는 JSP로 요청을 전달하는 기능을 추가합니다. 이작업이 완료되면 전체 애플리케이션을 테스트 합니다.

이제 첫화면을 배포한 다음 데트스틀 해봅시다.
1. 개발 환경 디렉토리에 HTML 파일을 만듭니다.
form.html 파일을 생성하여 /beerV1/web/ 데릭토리 밑에 저장합니다.
2. 배포 디렉토리에 HTML 파일을 복사합니다.
form.html 파일의 복사본을 tomcat/webapps/Beer-v1/디렉토리밑에 저장합니다.
3. 톰캣을 실행합니다.
실제 프로젝트에서는 아파치와 같은 지능형 웹서버와 톰캣과 같은 웹 컨테이너를 따로 가져 갑니다. 톰캣 디렉토리로 가서 bin/startup.sh를 실행하세요

배포 서슬자를 만듭니다.
DD 작업중 핵심은 아무래도 클라이언트가 요청시 보내는 논리적인 이름과 실제 서블릿 클래스 간의 매핑이 아닐까요?
1. 개발 환경에  DD 파일을 만듭니다.
XMl 파일을 만든 다음 이름을 web.xml로 수정하여 /beerV1/etc 디렉토리 밑 개발환경에 저장하세요
<web-app…>
<servlet>
<servet-name>Ch Beer</servlet-name>
<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet>

<servlnet-mapping>
<servlet-name>Ch3 Beer</serv;et-name>
</url-pattern>/SelectBeer.do</url-pattern>
</servlnet-mapping>
</web-app>

2. 파일을 배포 환경으로 복사합니다.
web.xml 파일을 tomcat/webapps/Beer-v1/WEB-INF/ 밑으로 복사하세요. 잘못된 곳에 두ㅔ 되면 컨테이너가 찾을수 없게 되고, 화면에 아무것도 안나옵니다. 괜히 엉뚱한 데 갖다 놓고 안된다고 이리저리 헛수고 하는 사람 여럿 봤습니다.

논리적인 이름을 서블릿 클래스 파일에 매핑하기
1. 다이아나는 폼 화면에서 색깔을 선택하고 서밋 버튼을 클릭합니다. 브라우저는 다음 URL을 생성합니다.
/Beer-v1/ServletBeer.do
2. 컨테이너는 DD의 <servlet-mapping>항목에서 /servlectBeer.do라는 값을 가진 <URL-pattern>을 찾습니다. 여기서 /는 컨텍스트 루트를 의미하며, selectBeer.do는 자원의 논리적인 이름이빈다.
3. 컨테이너는 DD에서 <url-pattern>과 쌍을 이루는 <servlet-name>의 값 Ch3 Beer를 기억해 둡니다. 물론 이 이름도 실제 서블릿 클래스 파일명이 아님을 알고 있죠? ch3 Beer는 실제 서블릿 클래스 파일명이 아닌 DD내에서만 사용하는 서블릿 명입니다. 컨테이너는 내부 서블릿 명과 여기에 일치하는 <Servlet>항목을 매핑합니다.
4. 컨테이너는 <servlnet-name>항목 값 ch3 Beer와 일치하는 <servlet> 항목 이 있는 지 검색합니다.
5. <servlet>항목 을 찾으면 <servlet-class> 항목값을 읽어 옵니다. 이 값이 바로 요청을 처리할 서블릿 클래스 입니다. 서블릿이 초기화된 적이 없다면, 컨테이너는 클래스를 로드하고 초기화합니다.
6. 컨테이너는 요청을 처리할 새로운 스레드를 시작하고 서블릿의 service()  메소드에 request 객체 참조를 인자로넘깁니다.
7. 스레드가 오나료되면 클라이언트에게 응답을 보냅니다. 물론 웹 서버를 통해서 보내겟지요

서블릿 버전1
-서블릿 코드
package com.example.web;

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

public class beerSelect extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, servletException{
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(“Beer Selection Advice<br>”);
String c = request.getParameter(“color”;
out.println(“<br>Got beer color” + c);
}
}
서블릿 버전2 코드
모델은 일반 자바 객체(POJO)라는 것을 잊지 말아야 한다. 다른 자바 객체 메소드를 후출하듯이 하면된다.
package com.example.web;

import com.exple.mode.*
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class beerSelect extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, servletException{
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
out.println(“Beer Selection Advice<br>”);
String c = request.getParameter(“color”;
out.println(“<br>Got beer color” + c);

BeerExprt be = new BeerExpert();
List result = be.getBrands(c);
Interator it = result.iterator();
while(it.hasNext()){
out.print(“<br>try: ” + it.next());
}

}
}

완벽하지는 않지만 완성된 MVC BeerAdvisor 웹 애플리케이션을 리뷰해봅시다.
지금까지 작업한것.
1. 브라우저가 컨테이너에게 요청을 보냅니다.
2. 컨테이너는 URL,이 올바른 서블릿을 호출한것인지를 판단한 다음, 요청을 서블릿으로 넘김니다.
3. 서블릿은 BeerExprt에게도 도움을 요청합니다.
4. 서블릿은 Response 객체에게 쓰기 작업을 합니다.
5. 컨테이너는 페이지를 클라이언트로 보냅니다.

진짜로 원하는것
1. 브라우저가 컨테이너에게 요청을 보냅니다.
2. 컨테이너는 URL,이 올바른 서블릿을 호출한것인지를 판단한 다음, 요청을 서블릿으로 넘김니다.
3. 서블릿은 BeerExprt에게도 도움을 요청합니다.
4. BeerExpert 클래스가 값을 리턴합니다. 서블릿은 이 값을 Request 객체에 기억시켜 둡니다.
5. 서블릿은 요청을 JSP파일에게 넘깁니다.
6. JSP는 Request 객체에서 서블릿이 넣어 놓은 값을 끄집어 냅니다.
7. JSP는 페이지를 생성합니다.
8. 컨테이너는 페이지를 클라이언트로 보냅니다.

서블릿이 JSP를 호출하도록 수정합니다.(버전3)
서블릿의 중요 변경 사항
1. Request 객체에 모델 콤포넌트로 부터 받은 정보를 저장하는것 그래야 JSP가 이걸 꺼내 볼수 있으니까요
2. 컨테이너에게 요청을 result.jsp로 넘겨줄것을 요청하는것.

서블릿 버전 3코드
package com.example.web;

import com.exple.mode.*
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class beerSelect extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, servletException{
String c = request.getParameter(“color”;

BeerExprt be = new BeerExpert();
List result = be.getBrands(c);

request.setAttribute(“styles”, result);

RequestDispatcher view= request.getrequestDispatcter(“result.jsp”);
view.forward(request, response);
}
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.