반응형
서블릿이라는 단어를 많이 접하게 되었지만 어렴풋이 어떤 일을 하는지만 알고 정확한 정의에 대하여 알지 못하였었다... 또한 Servlet과 Servlet Container등 용어들도 많아 헷갈리기도 일수였던 것 같다.. 자바로 백엔드를 공부하는 나로써 한번 제대로 정리를 해봐야겠다는 생각이 들었고 이번 기회에 Servlet에 대해 다시 한 번 정리해 보는 시간을 가지려한다.
서블릿에 대하여 알아보기 전에…
CGI란?
- CGI는 Common Gateway Interface의 약자로 웹서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약들을 의미한다.
- 쉽게말해, 사용자의 요청에 의한 서버의 응답이라고 할 수 있다.
왜 CGI가 필요한가요?
- 초기 웹 서비스에서는 주로 웹사이트에 필요한 정보만을 원하는 측에서 받아가거나 참조하는 방식의 단방향으로 이루어졌지만, 단뱡향이 아닌 클라이언트와 서버 간의 의사 교환이나 정보 교환의 필요성이 생기면서 CGI도 필요하게 되었다.
- 예를들어, 클라이언트가 로그인을 하기위해 아이디와 비밀번호를 입력하고 서버에 제출을 하게되면 서버는 입력받은 아이디와 비밀번호를 가지고 인증절차를 거친 후 가입되어있는 회원이라면 “~~님 반갑습니다.”와 같은 정보로 로그인에 성공했다고 응답을 클라이언트에게 보내주어야합니다. 이처럼 클라이언트와 서버간의 단방향이 아닌 양방향 의사소통이 필요할 때 CGI가 이 역할을 해주게됩니다.
Servlet이란?
- 자바로 구현된 CGI입니다.
- 즉, 웹 프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래의 구현 규칙을 지킨 자바 프로그래밍 기술이라 할 수 있습니다.
- 클라이언트의 요청에 대하여 동적으로 동작하는 웹 애플리케이션 컴포넌트입니다.
Servlet의 특징
- HTML을 사용하여 요청에 응답한다.
- Thread를 이용하여 동작
- MVC 패턴에서 Controller로 이용
- javax.servlet.http.HttpServlet 클래스를 상속받는다.
- UDP보다 속도가 느리다.
Servlet의 동작 순서
- 클라이언트가 해당 서버의 Servlet Container로 http request를 보낸다.
- Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 만든다.
- Request를 분석해
web.xml
에 있는 DD(Deployment Descriptor)를 참조하여 어느 서블릿에 대한 요청인지 탐색 - Servlet Container가 service()를 호출
- GET 또는 POST 여부에 따라 doGet() 또는 doPost()를 호출
- doGet()과 doPost()는 동적인 html 페이지를 생성 후 HttpServletResponse 객체에 응답
- 모두 완료되면 HttpServletRequest, HttpServletResponse 객체를 소멸
Servlet의 생명주기
- Servlet 객체 생성 : 처음 요청된 경우 메모리에 로딩하여 객체를 생성, 생성된 객체는 메모리에 계속 존재하므로 한 번 생성된 이후 요청이 들어오면 새로 생성이 되지않고 메모리에 존재하는 객체를 사용한다.
- init() : 객체가 생성될 시 최초 한 번만 호출
- service() : 클라이언트의 요청이 있을때 쓰레드를 생성하여 실행, GET과 POST의 여부에 따라 doGet(), doPost()를 실행
- destroy() : 서블릿이 더 이상 필요로 하지 않을 경우 destroy()를 실행하여 연결을 해지
Servlet Container란?
- Servlet의 동작 순서의 그림에서 이미 나왔듯이 Servlet을 관리해주는 컨테이너이다.
- 클라이언트의 요청을 받고, 그에대한 응답을 할 수 있게 웹서버와 소켓을 만들어 통신한다.
- 예를들면, Servlet은 어떠한 역할을 수행하는 정의서라고 한다면, Servlet Container는 그 정의서를 보고 그대로 수행하는 것이라고 볼 수 있다.
- Tomcat(톰캣)이 대표적인 예이다.
Servlet Container의 역할
- 웹 서버와의 통신 지원
- 소켓을 만들고 listen, accept 등을 구현해야하지만 이러한 기능들을 API로 제공한다.
- 서블릿 생명주기 관리
- 멀티쓰레드 지원 및 관리
- 요청이 들어올때마다 서비스 쓰레드를 자동으로 생성하고 역할을 다하면 죽게하여 쓰레드의 안정성에 대하여 걱정을 덜어준다.
- 선언적인 보안관리
- xml 배포 서술자에 보안관리를 기록하므로 보안에 대한 수정할 일이 생겨도 자바 소스코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능
참고 문서
반응형
'Web > Spring' 카테고리의 다른 글
[Spring Boot] 새로운 프로젝트 생성하기 (0) | 2020.08.10 |
---|---|
[Spring Boot] 로그인 실패 핸들링 - Spring Security (0) | 2020.05.11 |
[Spring Boot] Thymeleaf를 사용해 PathVariable 넘기는 방법 (0) | 2020.05.07 |
[Spring Boot] 간단한 로그인 기능 구현 - Spring Security (2) | 2020.05.03 |
[Spring MVC] @ControllerAdvice로 전역 컨트롤러 만들기 (0) | 2020.02.05 |