일요일, 12월 22
Shadow

미분류

#024 요청과 응답

미분류
01. 서블릿이 되어 보자. 서블릿은 컨테이너가 관리합니다. Request, Response 객체를 생성하고, 서블릿의 새로운 스레드를 만들어 서블릿 service() 메소드를 호출하고, Request와 Response 객체에 대한 참조를 인자로 넘긴다는 내용입니다. 1. 사용자가 서블릿에 대한 링크(URL)을 클릭합니다. 2. 컨테이너는 요청된 Request가 서블릿이라는 것을 간파하고는 다음 두개의 객체를 생성합니다. 1)HttpServletResponse 2)HttpServletRequest 3. 접수한 요청의 URL을 분석하여 어떤 서블릿을 요청했즌지 파악합니다. 그다음 해당 서블릿 스레드를 생성하여 Request, Response  객체참조를 넘깁니다. 4. 컨테이너는 서블릿 Service() 메소드를 호출합니다. 브라우저에서 지정한 방식에 따라 doget()을 호출할지 doPost()를 호출할지 결정합니다. 클라이언트가 HTTP GET 메소드를 날렸다면, service()  메소드는 서블릿의 doGet(0 메소드를 호출합니다. 호출할때 Request와 Response객체를 인자로 넘깁니다. 5. 서블릿 클라이언트에게 응답을 작성하기 위하여 response 객체를 사용합니다. 이작업을 완료하면 Response에 대한 제어는 컨테이너에게 넘깁니다. 6. service() 메소드가 끝나면, 스레드를 소멸하거나 아니면 컨테이너가 관리하는 스레ㅐ드 풀로 돌려보냅니다. 그다음 Requset와 Response 객체는 가비지 컬렉션이 될 준비를 할 것이며, 이 객체에 댛나 참조는 이제 범위...

#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. 컨테이너는 이 페이지를 한껏 대하고 있는 사용자에게 넘겨줍...

#022 조금 더 깊이 들어가보죠

미분류
01. 웹애플리케이션 아키텍쳐 컨테이너, 넌 누구냐? 서블릿에는 main() 메소드가 없다는데. 서블릿은 컨테이너라 부르는 자바 애플리케이션의 지배를 받습니다. 아파치와 같은 웹 서버가 사용자로 부터 서블릿에 대한 요청을 받으면 서블릿을 바로 후출하는것이 아니라, 서블릿을 관리하고 있는 컨터네이너에게 이 요청을 넘깁니다. 여기서 컨테이너란 물론 서블잇이 배포된 컨테이너를 말하겠죠. 요청을 넘겨받은 컨테이너는 HTTP Request와 HTTP Response 객체를 만들어, 이를 인자로 서블릿 doPost()나 doGet() 메소드 중 하나를 호출합니다. 클라이언트->요청->웹서버->컨텐이너->서블릿->컨테이너->우베서버->응답->클라이언트 컨테이너가 주는 혜택? 컨테이너가 서블릿을 실해아고 관리한다는 것은 이미 말했다. 하지만 컨테이너가 꼭 필요한가요? 1. 통신 지원 : 서버와 대화하기 위해 개발자가 직접 ServerSocket을 만들고, 특정 포트에 리스닝하고, 연결 요청이 들어오면 스트림을 생성하는등 이러한 복잡한 인련의 일을 할 필요가 없다는 것이죠 컨테이너는 어떻게 웹서버와 통신해야 하는지 잘 알고 있으며, 이러한 통신 기능을 API로 제공합니다. 따라서 우베서버와 서블릿이 서로 통신하기 위한 통로인 통신API에 대해 개발자가 고민할 피룡가 없다는 것이죠 2. 생명주기 관리 : 컨테이너는 서블릿의 탄생과 죽음을 관리하빈다. 개발자 관점에서 보자면, 서블릿 클래스를 로딩하여 인스턴스호 하고, 초기화 메소드를 호출하고, 요청...

#021 먼저 간략히 알아봅시다.

미분류
01. 서블릿과 JSP는 어디에 쓰는 물건이고 웹 서버는 어떤일을 하나요? 클라이언트는 서버에게 요청을 한다. 서버는 요청한 내용을 응답한다. 요청 : 요청에는 요청한것에 대한 이름과 주소 정보가 들어있다. 응답 : 클라이언트가 요청한 내용이 들어있다. 물론 서버가 못찻는 경우, 오류 메시지가 대신 들어간다. 클라이언트는 무엇을 하나? 웹 클라이언트는 사용자가 서버에 요청을 보낼수 있는 기능을 제공합니다. 요청을 보내고 난 다음, 서버가 보애농ㄴ 요청의 결과를 화면에 출력하는 일도 클라이언트의 역할이죠 사용자 : 사용자가 웹 페이지에 있는 링크를 클릭합니다. 브라우저 : 부라우저는 이를 요청으로 만들어 서버에 넘깁니다. 서버 : 서버는 요청한 페이지를 열심히 찾습니다. 서버 : 서버는 응답을 만든다음, 이를 브라우저로 내려 보냅니다. 브라우저 : 브라우저느는 전달받은 HTML을 사용자가 볼수 있도록 화면에 출력합니다. HTTP 프로토콜 , 넌 누구냐! HTTP는 TCP/IP위에 들아갑니다. TCP는 한쪽 노드에서 다른 쪽 노드로 파일을 보내는 녀석입니다. 물론 여러개로 잘라서 보낼수도 있지요. IP는 한 호스트에 목적지 호수트까지 패킷을 옮기고 이동하기 위한 기반 프로토콜이라고 할수 있죠 HTTP는 이와 별개로 웹에서만 사용하는 프로토콜입니다. HTTP는 TCP/IP 기반으로 하여, TCP/IP를 이용해서 한지점에서 다른지점으로 요청과 응답을 전송합니다. HTTP의 구조는 요청/응답의 끊임없는 주고 받음 이라고 할수 있습니다. 클라이언트는 요청하고서버는 여기에 응답...

#020 두번째 이야기 . HeadFrist Servlet & JSP

미분류
좀더 자세한 Sevlet에 대해 알아보기 위해 HeadFirst 책을 고르기로 했다. 다들 이책을 추천해서 이책을 골라보았지만 초보자가 ㅗ기에는 조금 많이 어려운 내용이었습니다. 동작원리를 설명한것은 좋았지만 내용이 너무 과다하게 많을 뿐더라 너무 자세하게 나와있다는 것이 단점중에 단점이라고 할수 있겠다. 처음 SCWCD를 따기위해 이 책을 골랐지만 이책은 너무 어려워서 포기를 하다가 이번에 다시 보기로한../ 1년이라는 시간동안 먼지가 쌓여 있는 책을 다시 보기로 했다. 목차는 1. 서블릿과 JSP는 어디에 쓰는 물건인고?: 서문 학습 목표 웹 서버와 클라이언트는 무엇을 하나요, 어떻게 대화하죠? 2분짜리 HTML 가이드 HTTP 프로토콜. 넌 누구냐! HTTP GET, POST 요청 및 HTTP 응답을 해부해보자. URL로 웹 페이지가 어디 있는지 어떻게 알지? 웹 서버, 정적인 웹 페이지 그리고 CGI 서블릿의 신비를 벗겨보자: 작성, 배포, 실행 JSP는 'HTML에 자바를 넣을 순 없을까'라는 고민에서 탄생했다네요. 2. 웹 애플리케이션 아키텍처: 개요 학습 목표 컨테이너의 정체는 무엇이며 개발자에게 어떤 의미이죠? 코드는 어떤 모습일까?(무엇이 서블릿을 서블릿답게 만드는가) 서블릿에 이름을 붙인 뒤 DD에서 URL과 매핑하기 스토리: 밥은 지금 결혼정보 사이트를 만들고자 합니다(MVC 도입) MVC 디자인 패턴은 이런 문제를 해결합니다. 실제 배포 서술자(DD) J2EE에는 무엇이 들어 있나 3. 초 간단 미니 MVC 튜토리얼: 실...

#018 웹 어플리케이션 이벤트 처리

미분류
01. ServletContextListener를 이요한 이벤트 러치 웹 컨테이너는 우베 어플리케이션이 시작되거나 종료되는 시점에 특정 클래스의 메서드를 실행할수 있는 기능을 제공하고 있다. 이 기능을 사용하면 웹 어플리케이션을 실행하는데 필요한 초기화 작업이나 웹 어플리케이션이 종료된 후 사용된 자원을 반환하는등의 작업을 수행할수 있다. 웹 어플리케이션이 시작되고 종료될때 특정한 기능을 실행하려면 다음과 같이 코드를 작성하면 된다. javax.servlet.ServletContextListener 인터페이스를 구현한 클래스를 작성한다. web.xml 팡리에 1번에서 작성한 클래스를 등록한다. ServletContextListener 인터페이스를 구현한 클래스가 웹 어플리케이션이 시작되거나 종료될때 실행하도록 하려면  web.xml 파일에 <listener> 태그와 <listener-class> 태그를 사용해서 오나전한 클래스 이름을 명시해 주면 된다. <listener> <listener-class> kame.jdbc.loader.DBCPInitListener</listener-class> </listener>...

#019 MVC 패턴 구현

미분류
01. 모델 2구조와 MVC 패턴 JSP 기반 웹 어플리케이션의 구조에는 크게 모델1구조와 모델2구조가 있다. JSP 에서 모든 로직과 출력을 처리하느냐 아니면 JSP에서 출력만 처리하느냐에 따라서 모델 1구조와 모델2구조로 구분된다. 1.1 모델1구조 모델1구조는 JSP를 이용한 단순한 모델이다. 지금까지 살펴본 거의 대부분의 JSP 페이지가 모델1구조를 사용하고 있다. 보통 처음 JSP를 배울때 사용하는 구조가 모델1구조인데 웹브라우저의 요청이 곧바로 JSP에 전달된다. 웹 브라우저의 요청을 받은 JSP는 자바빈이나 서비스 클래스를 사용해서 웹 브라우저가 요청한 작업을 처리하고 그 결과를 클리이언트에 출력해 준다. JSP 페이지에서 웹 브라우저가 요청한 것들을 처리한다는것은 JSP 페이지에 비즈니스로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여줄출력 관련 코드가 섞인다는 것을 의미한다. 원하는 작업을 수행하고 그 결과를 출력하는 경우가 많은데 이것이 모델 1구조의 전형적인 예이다. 1.2 모델2구조 모델 2구조는 모델1구조와 달리 웹 브라우저의 요청을 하나의 서블릿이 받게 된다. 서블릿은 웹 브라우저의 요청을 알맞게 처리한후 그 결과를 보여줄 JSP 페이지로 포워딩한다. 포워딩을 통해서 요청 흐름을 받은 JSP 페이지는 결과화면을 클라이언트에 전송한다. 즉 서블릿이 비즈니스 로직 부분을 처리하게 되는 것이다. 모델2구조의 특징은 웹 브라우저의 모든 요청이 단일 진입점, 즉 하나의 서블릿에서 처리된다는 점이다. 하나의 서블릿이 우베 브라우저의 모든 요청을 받기 때문에 서블릿은 웹 ...

#017 필터(Filter)

미분류
01. 필터란 무엇인가 ? HTTP 요청과 응듭을 변경할수 있는 재 사용가능한 코드 이다. 필터는 객체의 형태로 존재하며 클라이언트로 부터 오는 요청과 최정자원 사이에 위치하여 클라이언트의 요청 정보를 알맞게 변경할수 있으며, 또한 필터는 최종 자원과 클라이언트 가능 응답 사이에 위치하여 최종자원의 요청결과를 알맞게 변경할수 있다. 자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필어에 의해 변경된 요청 정보가 되며, 도한 클라이언트가 보게 되는 응답 정보는 클라이언트와 자원사이에 존재하는 필터에 의해 변경된 응답 정보가 된다. 클라이언트와 자원사이에 한개의 필터만 존재할수 있는 것은 아니며, 여러개의 필터가 모여 하나의 필터 체인을 형성하게 된다. 여러개의 필터가 모여서 하나의 체인을 형성할떄 첫번째 필터가 변경하는 요청 정보는 클라이언트의 요청 정보가 되지만, 체인의 두번째 필터가 변경하는 요청정보는 첫번째 필터를 통해 변경된 요청정보가 된다. 즉, 요청 정보는 변경에 변경을 거듭하게 되는 것이다. 02. 필터의 구현 2.1 필터 인터페이스 Fileter 인터페이스는 다음과 같은 메서드를 선언하고 있으며, 필터 기능을 제공할 클래스느 ㄴ필터 인터페이스를 알맞게 구현해 주어야 한다. public void init(FilterConfig filterConfig) throwxception : 필터를 초기화 할때 호출 된다. public void doFilter(ServletRequest request, ServletResponse response, Filter Ch...

#016 커스텀 태그 만들기

미분류
때에 따라서 JSP 액션 태그나 JSTL 태그만으로는 뭔가 아쉬울 때가 있다. 예를 들어 로그인에 성공헀을때 세션의 member 속성에 Member 자바빈 객체를 저장한다고 해보자 이때 로그인 여부를 판단할때에는 다음과 같은 JSTL 태그를 사용할수 있다. <c:if test="${! empty sessionScope.member}"> 로그인한상태 </c:if> <c:if test="${empty sessionScope.member}"> 로그인 하지 않은 상태 </c:if> 하지만 다음과 같이 원하는 기능에 알맞은 태그를 사용할수 있다면 어떨가? <ct:login> 로그인한 상태 </ct:login> <ct:login value="false"> 로그인하지 않은 상태 </ct:login> 위와 같은 특정한 상황에 알맞은 태그가 존재한다면 코드를 더욱 간결하게 작성할수 있을 것이다. 또한 더 중요한 것은 코드의 의미가 명확해 진다는 것이다. JSP는 이처럼 JSTL이나 기본적인 JSP 액션 태그로 표현할수 없는 경우 스크립트 코드와 EL 코드를 혼합해서 사용하는 대신 또 다른 태그를 만들어서 사용할수 있도록 지원하고 있는데 이렇게 원하는 목적에 맞게 작성된 태그를 커스텀 태그라고 부른다. 그리고 커스텀 태그를 모아 놓은 것이 커스텀 태그 라이브러리라 한다. 1.1 커스텀 태그의 장점 ㅇ 재사용성 향상 : 한번 작성한 커스텀 태그는 어떤 JSP 컨테이너에서든지 사용이 가능하다. ㅇ 쉽...

#015 표준 태그 라이브러리(JSTL)

미분류
JSP는 개발자가 직접 <jsp:include>와 같은 태그를 작성할수있는 기능을 제공하는데 이를 태그라고 한다. 이것들을 모아서 JSTL이라는 규약을 만들었다. 1. JSTL이란 1.1 JSTL이 제공하는 태그의 종류 코어 : 변수지원, 흐름제어, URL처리 --> c xml : XML 코어, 흐름제어, XML 변호나 --> x 국제화 : 지역, 메시지 형식, 숫자 및 날짜 형식 --> fmt 데이터베이스 : SQL --> sql 함수 : 컬렉션 처리, String 커리 --> fn 02. 코어 태그 변수지원 set : JSP에서 사용될 변수를 설정한다. remove : 설정한 변수를 제거한다. 흐름제어 if : 조건에 따라 내부 코드를 수행한다. choose : 다중 조건을 처리할때 사용된다. forEach : 컬렉션이나 Map의 각 항목을 처리할때 사용된다. forTokens: 구분자로 분리된 각각의 토큰을 처리할때 사용된다. URL처리 import : URL을 사용하여 다른 자원의 결과를 삽입힌다. redirect : 지정한 경로로 리다이렉트 한다. url : URL을 사용하여 다른 자원의 결과를 삽입힌다. 기타 태그 catch : 예외처리에 사용된다. out : JspWriter에 내용을 알맞게 처리한 후 출력한다. 2.1 변수지원태그 (1) <c:set>태그 <c:set var = "varName" value="varvalue" [scpoe="영역"]/> <c:set var ...