Servlet 톺아보기

서블릿이란?
- 클라이언트의 요청을 받고 응답을 생성하는 프로그램을 제작할 수 있도록 구성된 api
- WAS 서버에서 돌아간다.
- Java EE 플랫폼의 일부
단, Tomcat/Jetty와 같은 서블릿 컨테이너에 기본으로 포함되어있어 SE를 사용하더라도 별도로 설치할 필요는 없음 - JSP와 역할분배
- 서블릿의 주요 기능중 하나는 정적 리소스인 html에 java의 기술을 합쳐서 동적인 웹을 생산할 수 있게한다
- 해당 역할은 더 간결한 JSP에게 분배되었다.
서블릿 컨테이너
- 서블릿을 관리하고 실행하는 환경
- 서블릿 엔진이라고도 불린다
- 역할
1. 서블릿 로딩
요청이 들어오면 해당 서블릿 클래스를 메모리에 로드
2. 요청 처리
HTTP 요청을 서블릿에 전달하고, 서블릿이 생성한 응답을 클라이언트에게 반환
3. 생명주기 관리
서블릿의 생명주기를 관리하여 초기화, 요청 처리, 종료 등을 수행 - Tomcat
- 서블릿 컨테이너 기능을 갖춘 WAS서버
- 서블릿 뿐만 아니라 JSP를 실행할 수 있는 환경을 제공한다(웹서버의 역할)
다만 아파치와 함께쓰므로 웹서버로 사용될일은 거의없음
라이프 사이클
- (첫 번째 요청시) 객체 생성 및 init() 메소드 호출
1.1. 로딩 : 서블릿 컨테이너(Tomcat 등)에 서블릿 클래스 로드
1.2. 인스턴화 : 로드된 클래스의 인스턴스 생성
1.3. 초기화 : init(config) 메소드가 호출되면서 web.xml에 정의된 초기화 파라미터를 설정하고 DB연결, 파일읽기, 설정로딩 등 서비스 요청을 처리하기 위한 리소스가 준비된다.
생애주기에서 단 한번만 호출됨. - 실질적 작업은 service() 메소드가 진행
- 클라이언트 요청이 들어올때마다 service(request, response)가 호출
- service()는 HTTP 메서드에 따라 doGet()/doPost()를 호출
- 각 요청은 새로운 스레드에서 처리된다(다중 요청을 동시에 처리함) - 서블릿이 서비스 되지 않았을 때 destroy() 호출
- 관리자가 서버 재시작 및어플리케이션 종료하는 상황
- DB연결, 스레드 등의 리소스를 해제하고 메모리를 정리한다.
HTTP 메소드 살펴보기
- GET방식
- 서블릿의 doGet 메소드를 호출한다
- 사용자가 입력한 값들이 쿼리스트링으로 url에 노출되어 보안에 부적합
>> 대신 북마크가 가능하여 검색등에 적합
- url 길이의 제한때문에 전송가능한 데이터에 한계가 있다. - POST방식
- 서블릿의 doPost 메소드를 호출한다.
- Body영역에 데이터를 포함시켜서 보안이 필요한 경우 적합
- 데이터 길이에 제한이 없어 방대한 데이터에 적합
- GET에 비해 상대적으로 처리속도가 느리고 Timeout(최대요청받는시간)이 존재함

서블릿 인터페이스
- 서블릿의 주요 기능들은 서블릿이 정의해놓은 인터페이스를 서블릿 컨테이너들이 구현함으로써 작동한다.
- 대표적으로 HttpServletRequest와 HttpServletResponse, RequestDispatcher 등 이 있다.
- 인스턴스들은 서블릿 컨테이너에서 각자가 구현한 구현체로 생성된다.
이때 개발자는 타입을 인터페이스로 지정할 수 있기때문에 동일한 코드로 다양한 서블릿 컨테이너에서 돌려볼 수 있다.
요청받기 : HttpServletRequest
- 클라이언트가 보낸 HTTP 요청에 대한 정보를 제공하는 인터페이스
- 주요역할
1. HTTP 요청 정보 제공
2. 파라미터 접근
3. 세션 관리 - 키-값 구분
1. Parameter
- 클라이언트로부터 전송된 데이터
- 생명주기가 요청(Request) 범위 내에서만 유효하여 요청이 종료되면 삭제
- 키-값 모두 문자열로 취급
2. Attribute
- 서버 측에서 설정한 데이터
- 생명주기가 속성을 설정한 범위(Request, Session, Application)에 따라 달라진다.
- 문자열 외 다양한 형태의 타입을 저장할 수 있다. - 요청 정보 메소드
정보 메소드 반환값 요청 메소드 getMethod() 사용된 HTTP 메소드 반환 쿼리 매개변수 getParameter(String s) 요청데이터에서 전달된 키에 해당하는 값 반환 getParameterMap() 요청에 포함된 모든 매개변수의 이름과 값을 맵 형태로 반환 클라이언트 정보 getRemoteAddr() 클라이언트의 IP 주소를 반환 getRemoteHost() 클라이언트의 호스트 이름을 반환 세션 정보 getSession() 현재 요청에 대한 세션 객체를 반환(세션이 없으면 새로생성) 쿠키 정보 getCookies() 요청에 포함된 모든 쿠키를 배열로 반환
- 자주쓰이는 메소드
기능 메소드 설명 Attribute 설정 getAttribute(String s) 전달된 키에 해당하는 속성 값을 반환 setAttribute(String s, Object o) 새로운 속성을 설정 removeAttribute(String s) 전달된 키에 해당하는 값 삭제 문자 인코딩 설정 setCharacterEncoding("UTF-8") 파라미터를 읽기 전에 호출해야한다. 포워딩 준비 getRequestDispatcher(String s) RequestDispatcher를 반환한다
요청 전달 : RequestDispatcher
- 서블릿 내에서 요청을 다른 리소스(서블릿, JSP 등)로 전달하거나 해당 리소스를 현재 요청에 포함하는 인터페이스
- 생성하기
- HttpServletRequest 객체의 getRequestDispatcher(String path) 메소드로 생성
- path는애플리케이션 내의 리소스 경로로, 절대 경로(/) 또는 상대 경로를 사용할 수 있다. - 포워딩하기
- 생성된 인스턴스의 forward(ServletRequest req, ServletResponse res) 메소드 사용
- 현재 요청을 지정된 리소스(예: 다른 서블릿 또는 JSP)로 포워딩한다.
- 클라이언트는 포워딩된 리소스로 요청이 전달되었음을 알 수 없으며, URL도 변하지 않는다.
- 포워딩 이후에는 서블릿이 요청을 처리하지 않고 포워딩된 리소스가 처리한다.
요청 처리 : HttpServletReponse
- 서버가 클라이언트에 보낼 HTTP 응답을 작성하고 제어하는 인터페이스
- 정보 설정 메소드
정보 메소드 반환값 HTTP 상태 코드 setStatus(int statusCode) 200 (성공), 404 (찾을 수 없음), 500 (서버 오류) 등 sendError(int statusCode) 특정 상태 코드와 함께 에러 메시지를 전송 콘텐츠 설정 setContentType(String type) text/html, application/json, text/plain 등 콘텐츠 타입 설명 setCharacterEncoding("UTF-8") 문자 인코딩 설정 쿠키 관리 addCookie(Cookie cookie) 클라이언트에 전송할 쿠기 추가(Cookie 객체 사용) - 자주 쓰이는 메소드
기능 메소드 설명 쿠키 관리 addCookie(Cookie cookie) 클라이언트에 전송할 쿠기 추가(Cookie 객체 사용) URL 리다이렉션 sendRedirect(String s) 클라이언트를 해당 문자열로 리다이렉션한다. 텍스트 데이터 전송 getWriter() PrintWriter 객체 반환.
클라이언트로 응답 데이터를 전송할 수 있다.바이너리 데이터 전송 getOutputStream() ServletOutputStream 객체 반환.
이미지나 PDF 파일 같은 바이너리 데이터를 전송할 때 사용.


요청 처리 방식 차이
- 클라이언트의 요청을 다른 리소스로 연결하는 방법에는 아래 2가지가 있다
- getRequestDispatcher()
- 서버 내 포워딩을 통해 같은 요청 흐름 안에서 요청을 전달하여 url이 변경되지 않는다
- 서버 내부 경로만 접근할 수 있어서 다른 도메인으로 이동할 수 없다
- JSP 페이지를 다시 사용하는 경우 유용하다. - sendRedirect()
- 새로운 요청을 만들어 클라이언트 측에서 url을 변경시킨다.
- 다른 도메인으로 이동할 수 있다
- 사용자 세션에 영향을 주는 작업 후 새 요청을 시작해야할 때 유용하다.

'다양한 기술들 > Web 관련' 카테고리의 다른 글
| [JSP] 간단한 실습 (0) | 2023.01.10 |
|---|---|
| [JSP] HTML 위에서 작성하는 Java / 기본 문법 (0) | 2023.01.10 |
| [서블릿] 실습 : form태그를 통한 HTTP 통신 (0) | 2023.01.10 |
| [서버] 실습 : 아파치 톰캣 / 이클립스 세팅 (0) | 2022.12.29 |
| [서버] 이론 : 웹서버와 WAS (0) | 2022.12.29 |
댓글