Servlet (서블릿)
- Server+let 합성어로 웹서버에서 실행되는 간단한 프로그램 (Java Web server Program)
- Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술
- 웹프로그램은 클라이언트 요청에 의해 WAS(Web Application Server)에 의해 실행되며 실행결과로 웹문서를 동적으로 생성하여 클라이언트에게 응답한다. 웹을 만들때는 클라이언트의 다양한 요청(Request)과 그에 따른 서버의 응답(Response)이 있기 마련이고 이 요청과 응답에는 규칙이 존재한다. 서블릿은 이러한 웹요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이다. - Servlet 프로그램은 WAS에 의해 관리(생성, 사용, 소멸)된다.
한마디로,
1) 서블릿은 자바 클래스로 웹 애플리케이션을 작성한 뒤
2) 이후 웹 서버 안에 있는 웹 컨테이너에서 이것을 실행하고,
3) 웹 컨테이너에서는 서블릿 인스턴스를 생성 후 서버에서 실행되다가
4) 웹 브라우저에서 서버에 요청(Request)을 하면 요청에 맞는 동작을 수행하고
5) 웹 브라우저에 HTTP형식으로 응답(Response)합니다.
<Servlet 주요 특징>
- 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트이다.
- HTML을 사용하여 Response 한다.
- JAVA의 스레드를 이용하여 동작한다.
- MVC 패턴에서의 컨트롤러로 이용된다.
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
- UDP보다 속도가 느리다.
- HTML 변경 시 Servlet을 재 컴파일해야 하는 단점이 있다.
WAS(Web Appliacation Server)
: Web Server(요청과 응답) + Web Container(서블릿 관리)
서블릿 클래스는 클래스이고 클라이언트가 사용할 수 있는 URL 주소를 연결시키는 것이지 웹프로그램은 아니다.
<서블릿 프로그램 작성 방법(1~6)>
1. HttpServlet 클래스(J2EE >> ApacheTomcat)를 상속받은 자식클래스(= 서블릿 클래스)를 작성한다.
⇒ HttpServlet 클래스를 상속받은 자식클래스는 객체 직렬화 클래스로 serialVersionUID 필드를 선언하는 것을 권장한다. (경고를 상쇄하기 위한 것)
2. doGet() 메소드 또는 doPost() 메소드를 오버라이드 선언한다.
⇒ 클라이언트의 요청에 대한 처리 명령과 실행결과를 웹문서로 생성하는 명령을 작성하는 메소드 = 요청 처리 메소드 : WAS에 의해 자동 호출되는 메소드
① doGet() : 클라이언트가 서블릿 프로그램을 GET 방식으로 요청한 경우 호출되는 메소드
② doPost() : 클라이언트가 서블릿 프로그램을 POST 방식으로 요청한 경우 호출되는 메소드
[하지만 항상 기본값은 doGet이다.]
따라서, doGet 또는 doPost 메소드를 오버라이드를 시킨다.
GET
- 사용자 입력값을 URL 주소의 질의문자열(QueryString)으로 전달 [ex) a 태그]
- 보안을 필요로 하지 않는 소량의 값을 전달할 때 사용하는 요청방식 (많은 양을 전달할 수 없음.)
POST
- 사용자 입력값을 리퀘스트 메세지의 몸체부에 저장하여 전달 [ex. form 태그]
- 보안을 필요로 하거나 대량의 값을 전달할 때 사용하는 요청방식
리퀘스트 메세지(Request Message)
- 클라이언트의 모든 정보를 담아 웹프로그램에게 전달하기 위한 객체
- 머릿부(Header)와 몸체부(Body)로 구성되어 있다.
- [GET 방식]으로 웹프로그램을 요청한 경우 리퀘스트 메세지의 몸체부 사용하지X
- [POST 방식]으로 웹프로그램을 요청한 경우 리퀘스트 메세지의 몸체부 사용O**
but, doGet 또는 doPost 메소드 대신 service() 메소드를 오버라이드 선언 할 수도 있다.
③ service() 메소드 : 클라이언트가 서블릿 프로그램을 모든 방식으로 요청한 경우 호출되는 메소드
혹은 doGet, doPost 둘중 어느것을 써야할지 모를때도 사용가능하다.
⇒ doGet 또는 doPost 메소드보다 service() 메소드의 우선순위가 높게 설정되어있기 때문.
(따라서, service() 메소드를 사용했으면 doGet 또는 doPost 메소드를 절대 사용하면 안된다. 애초에 우선순위에 의해 호출이 안되기 때문에.)
WAS 프로그램에 의해 요청처리 메소드가 호출될 때 메소드 매개변수에는 HttpServletRequest객체와 HttpServletResponse 객체가 전달되어 저장된다.
HttpServeltResquest 객체
- Request 메세지(요청 관련 정보)를 표현한 객체
- http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있습니다.
HttpServletResponse 객체
- Response 메세지(응답 관련 정보)를 표현한 객체
- WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송합니다.
3. 클라이언트에게 응답될 결과에 대한 파일 형태(MimeType)를 변경
⇒ Response 메세지의 몸체부에 저장될 파일형태 설정
(HttpServletResponse.setContentType(String mimeType[;charset=encoding]) 메소드 호출)
⇒ Response 메시지의 몸체부에 저장될 파일형태를 변경하는 메소드
⇒ 응답파일이 문서파일인 경우에만 문자형태(CharacterSet - Encoding) 설정해야함.
>예시
response.setContentType("text/html;charset=utf-8");
기본 응답파일 형태 : text/html;charset=iso-8859-1 //서유럽어로 된 HTML 문서로 응답됨
response.setContentType("text/html;charset=utf-8"); //한글로 만들어진 HTML 문서로 응답되도록 언어 바꾼것.(선택적인 변경)
4. 응답파일을 생성하기 위한 출력스트림을 반환받아 저장
HttpServletResponse.getOutputStream() : 응답파일을 생성하기 위한 출력스트림(OutputStream 객체)을 반환하는 메소드
⇒ 원시데이타(1Byte)를 전달해 그림, 소리, 동영상 파일 등과 같은 이진파일 생성하기 위한 출력스트림
HttpServletResponse.getWriter() : 응답파일을 생성하기 위한 출력스트림(PrintWriter 객체)을 반환하는 메소드
⇒ 문자데이타(2Byte)를 전달해 HTML, XML 파일 등과 같은 문서파일을 생성하기 위한 출력스트림
💡 파일로 문서를 작성할때 3,4번이 필요한 것. 아니면 생략도 가능하다.
5. 클라이언트 요청에 대한 처리 명령 작성 및 출력스트림을 이용한 응답파일 생성
⇒ 클라이언트 요청에 대한 처리 명령에 필요한 값은 HttpServletRequest 객체로부터 제공받아 사용한다.
PrintWriter.println(String str) : 매개변수로 제공받은 모든 형태의 값을 출력스트림으로 문자열을 변환하여 전달하는 메소드 — 응답파일이 작성된다.
6. 서블릿 클래스를 서블릿 프로그램(웹프로그램)으로 실행되도록 설정
⇒ [Web.xml] 파일에서 서블릿 클래스를 서블릿으로 등록하고 서블릿을 요청할 수 있는 URL 주소를 매핑 설정
※(이름이 아닌 URL 주소를 매핑하기 때문)
클라이언트가 매핑된 URL 주소의 서블릿을 요청하면 WAS 프로그램은 서블릿 클래스를 객체로 생성하여 요청 처리 메소드를 호출하고 처리결과를 파일로 생성하여 클라이언트에게 전달하여 응답한다.
⇒ 클라이언트가 요청한 서블릿에 대한 클래스가 이미 객체로 생성된 경우 요청처리 메소드만 호출하여 실행
'Web > Servlet' 카테고리의 다른 글
Servlet / @ (Annotation), 요청 처리 메소드 (0) | 2023.06.20 |
---|