서블릿이란?
서블릿은 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스 이다.
서블릿의 동작 순서
- 클라이언트가 웹서버에 요청을 한다.
- 웹서버는 웹 어플리케이션 서버(WAS)에게 위임을 한다.
- 웹 어플리케이션 서버(WAS)는 각 요청에 해당하는 서블릿을 실행한다
- 서블릿은 요청에 대한 기능을 수항 한 후 결과를 반환하여 클라이언트에 전송한다.
서블릿의 계층 구조
서블릿의 생명주기
생명주기 단계 | 호출 매서드 | 특징 |
---|---|---|
초기화 | init() | 서블릿 요청시 한번만 호출 된다 |
서블릿 생성시 초기화 작업을 주로 한다. | ||
작업 수행 | doGet() | |
doPost() | 서블릿 요청 시 매번 호출 된다 | |
실제로 클라이언트의 요청 작업을 여기서 수행한다. | ||
종료 | destroy() | 서블릿이 기능을 수행하고 메모리에서 소멸 될 때 호출이 된다. |
서블릿의 마무리 작업을 주로 수행한다. |
서블릿 매핑하기
서블릿을 매핑하는 방법은 총 2가지가 있다.
- 각 프로젝트에 있는
web.xml
에서<servlet>
,<servlet-mapping>
태그를 이용한다. 애너태이션(@WebServlet('/'))
을 사용한다.
이중 web.xml
에서 사용하는 방법은 매핑 할것들이 많아진다면 복잡해진다는 단접이 있다
이를 해결하기 위해서는 @WebServlet
애너테이션을 사용하여 표시하면 훨씬 가독성이 좋아진 다는 장점이 있다.
방법은 클래스 위에 @WebServlet
애너테이션을 붙여주거나 servlet 파일을 만들 때 설정하면 된다.
주의점으로는 반드시 HttpServlet
클래스를 상속받은 상태여야 한다.
@webServlet("/login")
public class LoginServlet extends HttpServlet{
//...
}
이 때 중복된 매핑을 할시 오류가 나타남으로 주의해야 한다.
서블릿의 동작 과정
- 클라이언트 에서 http://localhost:8080/project/login으로 요청
- login이 메모리에 존재하는지 확인
- login을 메모리에 로드
init()
을 호출doGet()
또는doPost()
를 호출- 결과 응답
으로 동작이 진행된다. 만약 진행이되고 난 뒤 다른 클라이언트에서 또 login을 요청한다면
이 때는 init()
이 호출이 되지 않는 다는 것을 볼 수 있다.
왜냐하면 첫번째 클라이언트에 의해 이미 메모리에 로드가 되어있기 때문에 doGet()
또는 doPost()
가 로드가 된다.
이때 서블릿에서 값을 가져 올 때는 request
에서 getParmeter()
를 사용해 값을 가져 올 수 있다.
서블릿의 응답 처리 방법
서블릿이 처리한 결과를 클라이언트에게 응답하기 위해서는 다음과 같다.
doGet()
이나doPost()
매서드 안에서 처리한다.javax.servlet.http.HttpServletResponse
객체를 사용하여 응답을 처리한다,setContentType()
을 이용해 클라이언트에게 전송할 데이터 종류를 지정한다.- 클라이언트와 서블릿을 통신은 자바의
I/O스트림
을 사용하여 응답을 처리한다.
웹 브라우저에서 서블릿으로 데이터 전송하는 방법
GET과 POST방식을 사용하여 전송할 수 있다.
HTTP에서는 GET과 POST말고도 다른 것들이 많이 존재한다.
GET과 POST의 차이점
- GET 방식
- GET방식으로 데이터를 전송 할 때는 주소창에 name=value형태로 전송한 것이 보이기 때문에 보안에 취약하다.
- 전송할 수 있는 데이터가 최대 255자이다.
doGet
을 이용해서 서블릿에서 데이터를 처리한다.
- POST 방식
- 서블릿에 데이터를 전송할때 TCP/IP 프로토콜 데이터의 body 영역에 숨겨진 채 전송을 하므로 보안에 유리하다.
- 전송할 수 있는 데이터가 무제한이다.
- 서블릿에서 다시 가져오는 작업을 해야해서 GET보다 느리다
doPost()
를 이용해 서블릿에서 데이터를 처리한다.
이를 둘이 동시에 사용하기 위해서는 doHandle()
이라는 매서드를 doGet()
과 doPost()
에서 호출하여 doHandle()
에서 한꺼번에 처리한다.
이 글은 자바 웹을 다루는 기술 에서 참고하였습니다
'Spring > Servlet' 카테고리의 다른 글
[Java/Servlet] 서블릿의 비지니스 로직 처리 (0) | 2021.08.18 |
---|