[JSP] Servlet과 Spring MVC

WAS

웹 애플리케이션 서버라고 부르며, 동적 컨텐츠를 처리하는 서버이다.

자바에서는 대표적으로 톰캣을 가장 많이 사용하며, 톰캣은 자바 코드로 작성된 Open Source WAS로 정적 컨텐츠를 처리하는 Apache Web Server와 동적 컨텐츠를 처리하기 위한 Servlet Container로 구성되어 있다.

 

 

Servlet

Servlet은 클라이언트의 요청과 서버의 응답을 처리하기 위한 자바 객체로 Servlet Container에 의해 생성되고 관리된다.

 

브라우저가 요청을 보내면 다음 서블릿 객체를 찾고, 없다면 생성하고, 존재한다면 새로운 스레드에 기존 서블릿을 할당하여 사용한다.

 

서블릿 객체는 서블릿 클래스 내부의 service() 메서드를 통해 실행되는데 service()는 내부적으로 GET, POST HTTP 메서드 종류에 따라 doGet(), doPost()가 실행된다.

 

Servlet 객체를 생성하기 위해서는 Servlet Container에서 접근이 가능해야하기 때문에 public 클래스이며, 기본 생성자가 필수이다.

또한, Servlet 표준 명세를 따라야 하기 때문에 Servlet Interface를 구현해야한다.

 

HttpServlet은 GenericServlet을 상속하고 GenericServlet은 Servlet 인터페이스의 구현체이기 때문에 Servlet 클래스 구현 시 다형성을 이용해서 HttpServlet, GenericServlet, Servlet 중 어떤 것을 상속해도 무방하지만, HTTP 프로토콜 상에서 사용자의 요청을 처리하는 서블릿 클래스는 HttpServlet을 상속해야한다.

 

 

 

Servlet Life Cycle

Servlet Object는 브라우저가 서버에 최초로 요청을 보낼 때 생성된다. (지연 로딩)

xml에서 설정을 통해, 브라우저의 요청과 상관없이 서버 실행과 동시에 생성할 수 있다.(즉시 로딩)

지연로딩은 필요할 때 객체를 생성하기 때문에 메모리 효율이 좋고, 즉시 로딩은 미리 생성해두기 때문에 빠르다는 장점이 있다.

 

서블릿 컨테이너는 서블릿 클래스 당 하나의 객체만 생성되며, 한번 생성된 서블릿 객체는 재사용 되어 이후 서버가 종료될 때 destroy() 메서드가 호출되면서 서블릿 객체가 삭제된다.

 

 

 

HttpServletRequest &  HttpServletResponse

Http 요청을 처리하는 HttpServlet는 클라이언트에서 보낸 HTTP 요청의 모든 데이터가 들어있는 HttpServletRequest와 응답 데이터를 담을 수 있는 HttpServletResponse 클래스를 통해 요청을 처리한다.

 

HttpServletRequest, HttpServletResponse는 인터페이스이며 ServletRequest와 ServletResponse 인터페이스를 상속하는 명세이기 때문에 톰캣이 아닌 다른 서블릿 컨테이너에서도 동일하게 동작할 수 있다.

 

 

 

정보 공유

Servlet 객체 간에는 Session을 통해서 정보 공유가 가능한데, 세션 정보는 HttpServletRequest, HttpSession, ServletContext에서 각각 다른 생명 주기를 가진다.

HttpServletRequest는 요청이 끝남과 동시에 사라지기 때문에 객체 정보 또한 사라지기 때문에 새로고침이 되지않는 forward 방식에서는 정보를 볼 수 있으나, 응답을 보낸 후 url로 이동하는 리다이렉션에서는 응답 데이터를 볼 수 없다.

HttpSession은 브라우저가 살아있는 동안 세션이 유지되기 때문에 브라우저가 일정 시간 동안 응답이 없거나, 로그아웃 할 때까지 유지할 수 있다.

servletContext는 서버가 실행될 때 생성되어 종료될 때 삭제되기 때문에 서버가 살아있는 동안 정보 유지가 가능하다.

 

 

 

 

Spring MVC에서의 Servlet

서블릿을 활용한 MVC 패턴에는 Dispatcher Servlet과 ViewResolver, HandlerMapping의 개념이 등장한다.

 

Dispatcher Servlet은 클라이언트의 요청을 가장 먼저 받아서 해당 요청을 처리하기 위한 적절한 컨트롤러로 요청을 전달하는 프론트 컨트롤러 역할을 한다.

 

HandlerMapping은 각각의 요청 경로에 해당하는 컨트롤러를 찾아주는 역할을 하며, ViewResolver는 응답 결과에 해당하는 String에 prefix, suffix를 붙여 뷰 파일을 찾아준다.

spring MVC