728x90
반응형


Servlet

- Client에 의해 요청된 request를 동적으로 처리하고 이에 대한 response를 생성해 내는 java object

- Java 플랫폼에서 동적인 contents를 생성하기 위해 사용

- 주로 HTML문서를 생성해서 client에게 돌려줌





Servlet container (=Web container)

- Servlet을 관리하고 실행하는 component

- 자체적으로 JVM과 JRE를 포함

- 웹서버의 URL요청을 받아 매핑되는 servlet을 실행

- Servlet의 전반적인 lifecylcle을 관리

- Apache Tomcat, BEA WebLogic...

- JSP도 내부적으로 servlet으로 변환되어 실행





Container와 Servlet 동작방식

1. Cilent의 URL 요청

2. 웹서버가 Request, Response 객체 생성 

3. Servlet 인스턴스와 Thread 생성

4. 스레드가 service() 메소드 호출

5. doGet() 또는 doPost()에서 각 response, request 객체를 인자로 호출

6. 메소드 호출 뒤, 웹페이지를 생성하면 웹 컨테이너가 응답(Response)형태로 바꾸어 웹서버에 전송 


=> 서블릿 생성자가 호출되면 서블릿 클래스에서 단 한번만 실행되는 메소드인 init() 메소드가 호출되어 초기화를 수행

     service() 메소드가 스레드에 의해 호출되어 사용자 요청을 반복적으로 처리함

     작업이 끝난 후 destroy() 메소드가 호출되서 response, request 객체가 소멸되어 스레드를 종료


더 자세한 내용은 아래 링크 참고

http://eehoeskrap.tistory.com/2





요청 URL과 Servlet 매핑

- web.xml에 매핑 정보를 작성함으로써 유연성과 보안성이 증가

- 최근에는 annotation 기반으로 매핑을 설정

ex ) Servlet 파일에 생성됨 => @WebServlet("/CalcServlet")


ps. 정말 화나는게 이 줄이 없으면 매핑 정보가 설정되지않아서 404에러가 떠서 한참을 헤메는 수고가 든다.






Servlet의 문제점에 대한 논의

1. 서블릿 문제점 대두 : 프로그램에서 HTML 핸들링 개발과 관리가 어려웠음

2. JSP 등장 : JSP를 통해 HTML에서 프로그램 핸들링

3. JSP 스크립트 기술의 한계 : 뷰와 비즈니스 로직이 분리되지 않았음 => 유지보수에 상당한 불편함을 초래함

4. MVC 패턴 주목 받기 시작 : 애플리케이션 구성 요소 단위로 역할을 분담 

Model - 자바 클래스(DAO, AO)

View - JSP, JSTL

Controller - Servlet


Servlet의 장점 

- Thread를 기반으로 하여 성능이 우수

- JAVA API를 직접 사용할 수 있음

- OS나 HW의 영향을 받지 않음


웹 애플리케이션 개발 시 Servlet의 장점

- 뷰와 비즈니스 로직을 분리

- 기능 확장 및 유지보수 용이

- 리스너, 필터 등 고급 기법을 사용할 수 있음


Servlet만 사용할 때의 단점

- Servlet 내에서 Print를 통해 HTML 문서를 출력

- 유지 보수가 까다로움 

아래와 같이 써야 하니까 유지보수가 까다로웠음 !! 


out.println("<html>");

out.println("<head><title> result </title></head>");

out.println("<body><center>");

out.println("<h2> POST 결과 </h2>");

out.println("<hr>");

out.println("id :"+first+" <br> password: "+second);

out.println("</body>");

out.println("</html>");






Servlet Lifecycle


1. Servlet loading

- Container가 시작되거나 요청을 처리하기 전에 container에 의해 관리

- 새로은 servlet 인스턴스를 생성 후 init() 메소드를 호출

- init() 메소드에서 각종 초기화 작업을 수행

- DB 접속 등 해당 servlet 내에서 수행할 작업이 있으면 init()을 override


2. 요청 처리

- 새로운 요청이 들어오면 container가 servlet의 새로운 thread를 생성

- 해당 thread의 service()를 호출

- service() 내에서 요청이 GET 방식인지 POST 방식인지 구분해서 doGet() or doPost()를 호출

- 이 때, request객체와 response 객체가 파라미터로 전송

- doGet or doPost에서 해당 요청을 처리

- service()가 종료되면 thread 종료


3. Servlet 종료

- 보통 container가 종료되는 시점에 destroy() 호출

- 특정 servlet 로드/언로드 시에도 사용







728x90
반응형