Spring Framework는 Servlet이 발전된 형태이기 때문에 Servlet과 닮은 부분이 많다. 또한 브라우저에서 요청을 받을 때도 Servlet인 DispatcherServlet을 사용하기 때문에 간단하게 알아보고자 한다.
Servlet과 Controller 비교
- TestServlet 작성 (Servlet)
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
String name = req.getParameter("name");
String age = req.getParameter("age");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
//...
}
}
@WebServlet
- 원격프로그램으로 연결할 때 사용
- @Controller와 @RequestMapping 이 합쳐진 것
- URL매핑은 클래스에 하나만 사용할 수 있다. 그러므로 하나의 클래스에 하나의 서블릿만 적용가능
HttpServlet을 상속
- service 메서드를 오버라이딩해서 작성해야 한다.
- Test 클래스 작성 (Controller)
@Controller
public class Test {
@RequestMapping("/test")
public void test(String name, String age, HttpServletResponse response) throws Exception {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
//...
}
}
@Controller
- 원격프로그램으로 연결할 때 사용
@RequestMapping
- 메서드마다 각각의 URL을 매핑해줄 수 있으므로 하나의 클래스 안에 여러개의 URL을 매핑해줄 수 있다.
상속을 받지 않아서 서블릿보다 이점이 있다.
서블릿의 생명주기
서블릿은 기본적으로 생명주기를 가지고 있다. 각각의 메서드는 직접 호출하는 것이 아니라 Servlet Container가 자동으로 호출해준다.
- @PostContruct - 서블릿이 생성되기 전에 준비하는 단계
- init() - 서블릿이 생성(초기화)되는 단계
- service - 개발자가 구현한 방식으로 서블릿이 일을 하는 단계 (doGet(),doPost() 등을 호출)
- destroy() - 서블릿이 일을 마치고 소멸되는 단계
- @PreDestroy - 서블릿 소멸 뒤 정리하는 단계
예제
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 서블릿 초기화 - 서블릿이 생성 또는 리로딩 될 때, 단 한번만 수행된다.
// 서블릿의 초기화 작업을 담당
System.out.println("HelloServlet.init");
}
@Override // 호출될 때마다 반복적으로 수행된다.
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 입력
// 처리
// 출력
System.out.println("HelloServlet.service");
}
@Override
public void destroy() {
// 뒷정리 작업 - 서블릿이 제거(Unload)될 때, 단 한번만 수행된다.
System.out.println("HelloServlet.destroy");
}
}
요청이 왔을 때 서블릿이 어떻게 처리되는가?
서블릿 인스턴스가 존재하는지는 map으로 저장되어 있는 서블릿 이름을 통해 확인한다.
서블릿은 기본적으로 싱글톤 객체를 사용
요청이 오면 처리되어야할 작업들이 대부분 같기 때문에 요청이 올 때 마다 서블릿 객체를 생성할 필요가 없다. 따라서 싱글톤 객체를 이용해서 하나의 객체로 여러 요청을 받는다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Servlet/JSP URL패턴과 DispatcherServlet (0) | 2021.12.30 |
---|---|
[Spring] Servlet/JSP Scope에 대해 알아보자 (0) | 2021.12.30 |
[Spring] 관심사의 분리와 MVC 패턴에 대해 알아보자 (0) | 2021.12.29 |
[Spring] Tomcat의 내부 구조, 설정 파일에 대해 알아보자 (0) | 2021.12.28 |
[Spring] 클라이언트와 서버에 대해 알아보자 (0) | 2021.12.28 |