Read Before
Servlet은 톰캣 위에서 동작하는 Java 프로그램입니다. Java언어를 기반으로 동적인 contents를 생성하는 기술입니다. Servlet은 Java를 잘 모르면 상당히 어려운 부분으로, 예전에는 JSP가 서블릿을 대체하는 기술이 되었지만, 현재는 MVC 패턴2가 등장하면서 상호보완적 기술로 자리 잡고 있습니다.
(1) MVC Pattern이란?
MVC(Model-Veiw-Controller) 패턴은 디자인 패턴 중 하나로서, 비지니스 영역과 로직 영역을 명확히 구분하기 위해서 만들어 졌습니다.
(2) MVC1과 MVC2의 비교
-- 1. MVC1 --
웹 브라우저의 요청을 JSP 페이지가 받아서 처리한다. 쉽게 페이지를 작성할 수 있는 장점이 있지만, JSP 페이지 내에 비지니스 로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여주는 코드가 함께 존재하여 재사용이 힘들고 읽기도 힘들어 가독성이 떨어지는 단점이 있다.
-- 2. MVC2 --
웹 브라우저의 요청을 하나의 서블릿이 수행하고, 그결과를 JSP 페이지로 포워딩(전송)시킨다. 따라서 클라이언트의 요청, 응답, 비지니스 로직 처리부분을 모듈화 시킨다. 처리작업의 분리로 인해 유지보수 및 확장이 용이한 장점이 있지만, 구조를 설계하는 시간이 많이 소요되어 개발 기간이 증가하는 단점이 있다.
서블릿(Servlet)
▶ 자바 개발환경 구조
(1) 서블릿이란?
- 서블릿은 JSP 표준이 나오기 전에 만들어 진 표준으로 자바에서 웹 애플리케션을 개발할 수 있도록 하기 위해 만들어졌다.
서블릿(Servlet)은 서버(Server)와 애플릿(Applet)의 합성어로 동적 웹페이지를 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 초창기 CGI(Common Gateway Interface) 방식 웹서버의 성능 개선을 목적으로 썬마이크로시스템스에서 발표하였다.
기존의 CGI는 멀티 프로세스 방식으로 요청이 증가할수록 시스템 부하율 기하급수적으로 높아져 문제였고, 그 대안으로 나온 것이 서블릿(Servlet)이라 할 수 있다. 서블릿은 JVM안에서 멀티 스레드 방식으로 동작하기 때문에, 아래의 사진을 통해 시스템 부하율이 현저히 저하된 것을 볼 수 있다.
- 자바 클래스를 웹에서 호출 및 실행할 수 있도록 한 표준 javax.servlet.http.HttpServlet 클래스로 부터 상속 받아 작성. 위의 클래스는 servlet-api.jar에 포함되어 있다
- Servlet의 상속구조는 아래와 같다.
- GenericServlet과 HttpServlet 구조는 아래에서 살펴볼 수 있는데, HttpServlet 클래스는 Gerneric 클래스를 상속받아 HTTP 프로토콜에 관련된 기능을 구현한 것이다. GernericServlet은 프로토콜에 독립적인 서블릿으로 service()를 오버라이딩해서 사용한다.
(2) 작성과정
- 서블릿 규칙에 따라 자바 코드 생성
- 작성한 코드를 컴파일해서 웹 프로젝트 WEB-INF classes 폴더에 복사
- 경우에 따라서 web.xml 파일에서 서블릿을 주소와 매핑
- 웹 컨테이너 재실행
(3) 서블릿 요청 처리
- 요청 방식에 따라 doGet이나 doPost 메소드를 재정의해서 처리한다.
- service 메소드를 재정의해서 사용할 수 있는데, 이메소드는 get방식이나 post 방식 상관없이 호출되며, 이메소드가 호출되면 doGet이나 doPost 메소드는 호출되지 않음.
- 서블릿에서 요청을 처리하기 위해 오버라이딩 한 메소드는 request 객체를 이용해서 웹 브라우저의 요청 정보를 읽어 오던가 아니면 response를 이용해서 응답을 전송.
- 응답을 전송하고자 하는 경우는 response 객체의 setContentType() 메소드를 이용해서 타입과 인코딩 방식을 지정
- 웹 브라우저에 데이터를 전송하려면 getWriter()를 호출해서 문자열 데이터를 출력할 수 있는 PrintWriter를 가져오고 print()나 println()을 이용해서 전송하면 됨
Servlet 선언
- 이클립스 5.0이전 버전에서는 web.xml 파일을 이용해서 매핑했지만, 지금은 annotation의 등장으로 주소와의 매핑을 코드 안에서 가능하여 클래스 정의 상단에 @WebServlet(주소 또는 urlPatterns="패턴")의 형태로 가능하다.
- web.xml(웹 프로젝트의 설정 파일)에서의 매핑
<servlet>
<servlet-name> 서블릿 이름 </servlet-name>
<servlet-class> 클래스 이름 </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> 서블릿 이름 </servlet-name>
<url-pattern> /호출url </url-pattern>
</servlet-mapping>
- <servlet-mapping> 엘리먼트 안에는 전체 URL이 아니라, 웹 서버의 도메인 이름, 포트번호, 웹 애플리케이션 디렉터리 이름을 제외한 나머지 부분만 기재해야 한다.
(1) 매개변수(parameter 폼 안에서 name을 가진 객체, 또는 URL의 ? 다음의 데이터) 처리
- 단일 항목 : request 객체의 getParameter("매개변수 이름")으로 처리
- 배열 : request 객체의 getParameterValues("매개변수 이름")으로 처리
(2) 요청시 응답
- 요청시 응답은 response 객체를 이용
- 출력 하고자하면, response 객체의 getWriter()를 호출해서 PrintWriter 객체를 받은 후 print 또는 println 메소드를 이용해서 html 코드를 리턴
(3) 특정 페이지로 이동
- request 공유( forward )
- RequestDispatcher 변수 = request.getRequestDispatcher("이동할 페이지");
- 변수.forward(request, response);
- request 공유하지 않고 이동( redirect )
- response.sendRedirect("이동할 페이지");
서블릿 호출
(1) Get 방식
- 주소에 매개변수를 붙여서 호출하는 방식; 주소와 매개변수를 ?로 구분
- a 태그를 이용해서 페이지를 요청하는 경우
- 자바스크립트를 이용해서 요청
- 폼에서 명시적으로 GET방식으로 요청하는 경우
- 매개변수의 데이터는 255자 이내이며 보안성이 없다
- 폼에서 사용하면 처리가 지연되는 경우 재요청
(2) Post 방식
- 매개변수를 본문에 포함시켜 전송하는 방식
- 폼에서 명시적으로 POST 방식으로 요청
- 데이터 크기에 제한이 없으며 URL에 표시가 되지 않으므로 보안성이 우수
[ References ]
- 그림 참고, Beom's Blog, Servlet, link
'청년취업아카데미 > DayLog' 카테고리의 다른 글
[ JSP ] Day 12 - ② File Upload (0) | 2019.07.25 |
---|---|
[ JSP ] Day 12 - ① JAVA BEANS (0) | 2019.07.25 |
[ JSP ] Day 11 - ① JSTL (0) | 2019.07.24 |
[ JSP ] Day 10 - ③ Error Page 정의하기 (0) | 2019.07.23 |
[ JSP ] Day 10 - ② Error 처리하는 방법 (0) | 2019.07.23 |