서블릿
- Category :
- spring
서블릿
서블릿은 JVM기반에서 웹 개발을 하기 위한 명세이자 API이다.
서블릿을 실행하려면 웹 애플리케이션 컨테이너가 필요하다.
서블릿은 Java EE 에 포함된 스펙 중의 하나로 HTTP 요청과 응답들을 처기하기 위한 내용들을 담고 있다.
그래들또는 메이븐을 이용하여 서블릿을 이용한 개발 환경을 설정할 수 있다.
그래들과 메이븐은 빌드 도구이다. 자바에서 라이브러리를 편리하게 추가할 수 있는 도구
서블릿의 생명주기
서블릿의 생명주기는 초기화, 서비스 , 소멸의 3단계로 구서되어 있다. WAS 에서 콘텍스트가 초기화되면 생명주기가 시작된다.
- 초기화 : 로드한 서블릿의 인스턴스를 생성하고 리소스를 로드하는 등 클래스 생성자의 초기화 작업과 동일한 역할 수행. 한번만 호출이 된다.
- 서비스 : 클라이언트의 요청(Post,Get)에 따라서 호출할 메서드를 결정한다.
- 소멸 : 서블릿이 언로드 된다.
HTTP 요청과 응답
-
GET요청 처리 GET : 데이터를 조회하기 위한 요청으로 데이터를 조회할 때 많이 사용된다.(SELECT와 동일한 역할)
서블릿에서는 doGet 메서드를 이용해서 GET 메서드 방식의 요청을 응답받을 수 있다. doGet은 HttpServletRequest와 HttpServletResponse를 파라미터로 전달받다.
HttpServletRequest : 요청에 대한 정보를 가지고 있다.
HttpServletResponse : 브라우저에 정보를 표현하기 위해 사용한다.
-
POST요청 처리 POST : 데이터를 추가하거나 갱신하는 데 사용된다.
서블릿에서는 doPost메서드를 사용한다. post 요청에 대해서만 처리할 수 있는 메서드이다.
405 Error : post와 get메서드를 다르게 요청했을 때
POST방식은 주로 폼 에서 데이터를 입력 후 전송할 때 사용하는데 회원가입, 로그인등의 기능을 구현할 때 많이 쓰인다.
멀티파트는 바이너리 데이터 전송을 위해 사용된다. 서블릿 3.0 이후 부터는 서블릿 스펙에 멀티파트가 추가되어서 별도의 라이브러리 없이 구현이 가능해졌다. 폼 속성에 enctype=”multipart/form-data” 를 입력함으로써 가능
서블릿 관련 객체
-
필터
웹 클라이언트의 요청에 대해서 필요한 사전 작업이 있을 경우에 필터를 사용한다. 필터는 필터 인터페이스를 상속받아 만들 수 있으며 서블릿의 생명주기 처럼 init 과 destroy메서드를 가지고 있다. 필터는 여러 개를 등록해서 사용할 수 있다. 하나의 요청에 대해서 다양한 변경이 필요하다면 여러 개의 필터를 매핑해서 처리할 수 있다. 이렇게 여러 개의 필터를 등록해서 처리하는 것을 필터 체인이라고 한다.
-
쿠키
쿠키는 사용자가 사이트를 방문했을 떄, 사용자의 컴퓨터에 저장되는 정보를 말한다.
쿠키의 구성요소
이름 : 각각의 쿠기의 값을 식별하기 위한 키 값 : 특정 이름으로 쿠키에 지정된 값 유효시간 : 쿠키의 유지 시간 도메인 : 쿠키를 전송할 도메인 경로 : 쿠키를 전송할 요청 경로
쿠키는 HTTP 헤더 정보에 포함되어 전달된다. HTTP 프로토콜은 비연결지향으로 상태 정보를 저장하지 않아 상태 정보를 저장할 공간이 필요하게 되며 이때 쿠키를 사용한다. 쿠키는 사용자의 PC에 저장되므로 로그인하지 않은 사용자에 대해서 다르게 적용할 필요가 있을 경우에 유용하다.
쿠키를 사용할 때 보통 도메인 기반으로 사용한다. 쿠키 생성 시에 setDomain 메서드를 이용하면 사용 가능한 도메인을 지정할 수 있다.
-
세션
세션은 서버와 클라이언트의 유효한 커넥션을 식별하는 정보이다. 서버는 클라이언트가 요청을 보내면 요청을 식별할 수 있는 ID를 부여하는 데, 이 ID가 세션 ID이다. 세션 ID 는 JSESSIONID란 이름으로 쿠키에 저장되고, 클라이언트가 재접속할 때 해당 쿠키를 이용해 세션 ID값을 서버에 전달한다. 생성된 세션 정보는 request 객체에서 꺼내서 사용할 수 있다.
디자인 패턴
-
프론트 컨트롤러 패턴
프론트 컨트롤러 패턴은 컨트롤러가 공통 요청을 먼저 수행하고 뷰를 호출하는 패턴이다. 요청에 대해서 컨트롤러가 응답하고, 결과에 따라 서블릿이나 JSP로 만든 뷰를 보여 주게 된다. 서버 측에서 메서드를 사용하여 화면을 전환하는 방법에는 두 가지가 있다.
- Response 객체의 sendRedirect 메서드 HttpServletResponse에 속한 메서드로 응답을 밖으로 던지는 것과 같으므로 속성을 저장할 수 없고 다른 로직을 추가할 수 없다. (request, response 세션 등을 가져가지 않는다.)
- RequestDispatcher 객체의 forward 메서드 서버 내부에서만 흐름이 이동하므로 속성을 저장할 수 있고, 브라우저에게 바로 전달하지 않고 원하는 작업을 처리한 후에 응답을 전환할 수 있다.
컨트롤러에서 직접적으로 forward 메서드를 사용하게 될 경우에는 URL이 변경되거나 뷰가 변경 될 때마다 컨트롤러를 변경하게 되어서 추후에 유지보수가 어려워진다. 이럴 때 커맨드 패턴을 이용하여 컨트롤러 클래스의 복잡도를 낮출 수 있다.
커맨드 패턴
커맨트 패턴은 명령을 객체 안에 캡슐화해서 저장함으로써 컨트롤러와 같은 클래스를 수정하지 않고 재사용할 수 있게 하는 패턴이다.