1. Servlet (서블릿) 출현 배경
일반적으로 웹서버는 정적 페이지만을 제공한다. (Web Server는 정적 데이터만 전달할 수 있었다.)
따라서 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야만 한다.
따라서 나온 것이 CGI이다.
CGI
- 동적 데이터를 처리하는 인터페이스 (Web Server와 프로그램 사이의 규약)
- CGI는 어떠한 프로그래밍 언어로도 구현이 가능하며, 별도로 만들어 놓은 프로그램에 HTML의 GET/POST 방법으로 클라이언트의 데이터를 환경변수로 전달하고, 프로그램의 표준 출력 결과를 클라이언트에게 전송하는 것이다.
- 한계
- request가 들어올 때 마다 Process를 생성하기 때문에 많은 사용자를 처리하기엔 무리였다.
- 같은 request가 들어와도 각 쓰레드마다 CGI 구현체가 각각 생겼다.
- 개선
- Process를 Thread로 변경
- 여러 Instance에서 Singleton으로 변경
- 이러한 개선점을 지니고 있는 것이 서블릿이다.
웹 서버 vs 웹 애플리케이션 서버
- Web Server : 정적 데이터 처리
- ex)Apache
- Web Application Server : 동적 데이터 처리
- ex)Tomcat
2. Servlet (서블릿)
- 자바를 사용하여 웹을 만들기 위해 필요한 기술
- 클라이언트의 요청에 대한 결과를 다시 전송하는 역할을 맡은 자바 프로그램
서블릿 특징
- 클라이언트 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- html을 사용하여 요청에 응답
- 자바 쓰레드를 이용하여 동작
- MVC 패턴에서 Controller로 이용
서블릿 동작 방식
- 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송
- 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성
- web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다
- 해당 서블릿에서 service메소드를 호출한 후 클라이언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출
- doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸
3. Servlet 컨테이너
- 서블릿은 스스로 작동하는 것이 아닌, 서블릿을 관리하는 서블릿컨테이너에 의해 수행된다.
- 컨테이너는 클라이언트의 요청을 받아주고 응답할 수 있도록, 웹서버와 소켓으로 통신한다.
Servlet 컨테이너 역할
- 웹서버와의 통신 지원
- 서블릿 생명주기 관리
- 멀티스레드 지원 및 관리
- 서블릿 컨테이너는 요청이 올 때마다 자바 스레드를 하나 생성한다.
- HTTP 서비스 메소드를 실행한 뒤, 스레드는 자동으로 소멸된다.
- 선언적인 보안 관리
- 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다.
- 일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.
Servlet 생명주기
- 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init()메소드를 호출하여 적재
- init()메소드는 처음 한번만 실행되기 때문에, 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현한다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다.
- init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다. 이때 서블릿 컨테이너가 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공된다.
- 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현하면 된다.
4. Dispatcher Servlet
- Spring Web MVC에서 사용하는 서블릿 기술
- 클라이언트 요청을 디스패처 서블릿이 받음
- 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
- 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
- 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
- ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
- View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
- 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다.
출저
https://www.youtube.com/watch?v=2pBsXI01J6M
'Spring' 카테고리의 다른 글
스프링 배치(Spring Batch)로 대용량 데이터 관리하기 (0) | 2024.04.01 |
---|---|
[Spring] Spring Security (0) | 2023.02.08 |
[Spring] 빈 스코프 (0) | 2023.02.01 |
[Spring] 빈 생명주기 콜백 (0) | 2023.01.30 |
[Spring] 조회된 Bean이 두 개 이상일 때 - @Autowired 필드명, @Qualifier, @Primary (0) | 2023.01.30 |