본문 바로가기
백엔드/JSP

Servlet

by shinyou1024 2020. 4. 24.

개요

Servlet : 웹 서버(컨테이너)에서 수행되는 자바 클래스

  • 서버의 응용 프로그램을 구현하는 기술

  • 서버 프로토콜 종류에 관계없이 여러 애플리케이션 기반의 응용프로그램 개발 가능

  • 주요 서버 환경 : HTTP 프로토콜

  • 클라이언트의 요청에 대해 서블릿 컨테이너에 의해 독립된 스레드 기반으로 서비스

    ⇒ 프로세스 기반 서비스인 CGI보다 속도 빠름

  • 서블릿 컨테이너 : 클라이언트에서 전송되는 서블릿 요청/응답에 대한 처리 담당

  • 비즈니스 로직과 프레젠테이션 로직이 혼합된 형태

  • 단점 : html 코드가 변경되면 매번 서블릿을 재컴파일 해야 함

동작 과정

  1. 웹 클라이언트가 웹 서버에게 HTTP 요청 메시지 보냄 (GET/POST)
  2. 웹 서버가 HTTP 요청을 해석
    • 서블릿에 대한 요청일 경우 서블릿 컨테이너에게 요청 전달
  3. 서블릿 컨테이너가 서블릿을 생성해 서비스를 수행
    • init() : 서블릿 인스턴스 생성
    • service() : 실제 서비스 수행
  4. 서블릿에서 서비스 수행 후 결과를 알려주기 위한 결과 페이지를 웹 서버 통해 전달
  5. 웹 서버가 서블릿 컨테이너로부터 받은 결과 페이지를 클라이언트에게 되돌려 줌

서블릿 API

javax.servlet 패키지

  • 특정 프로토콜에 종속되지 않은 서블릿을 작성하기 위해 필요한 기본 클래스와 인터페이스 제공
  • 인터페이스 : Servlet, ServletRequest, ServletResponse, ServletConfig, ServletContext, RequestDispatcher
  • 클래스 : ServletInputStream, ServletOutputStream, CenericServlet

javax.servlet.http 패키지

  • 특정 http 프로토콜을 따르는 서블릿 작성에 필요한 기본 클래스, 인터페이스
  1. HttpServlet 클래스
  • HTTP 서블릿을 작성하려면 이 클래스를 상속받고 doGet(), doPost() 매소드를 재정의한다
  1. HttpServletRequest 인터페이스
  • HTTP 서블릿에서 웹 클라이언트로부터 전달된 요청 관련 작업
  • Servlet-Request 인터페이스를 상속받고 HttpServlet 클래스에 의해 상속됨
  • CGI 환경변수 참조, 웹 클라로부터 전달된 매개변수 파싱, 웹 클라로부터 전달된 Cokkie 데이터 파싱
  • HTTP 요청에 대한 헤더 정보 얻기
  1. HttpServletResponse 인터페이스
  • 웹 클라에게 전달할 응답 관련 작업
  • ServletRequest 인터페이스 상속 받고, HttpServlet 클래스에 의해 사용됨
  • 결과 페이지 출력, HTTP 응답에 대한 헤더 정보 설정, 웹 클라에게 부여할 Cokkie 추가
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet{
		private static final long serialVersionUID = 1L;
		public HelloServlet() {  }

		// Get 방식 요청을 처리하기 위한 서비스 메소드
		protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException) {
			// 응답위한 인코딩 설정
			response.setCharacterEncoding("UTF-8");
			// 클라에게 응답하기 위한 출력객체
			PrintWriter out = response.getWriter();
			out.print("<!DOCTYPE html>");
			//	... 생략
			out.printt("</html>");
			out.close();
	
		}
}

 

서블릿 라이프 사이클

서블릿 컨테이너가 서블릿 인스턴스의 라이프사이클을 관리함

  • 서블릿 클래스는 객체 생성 및 메소드를 호출하는 주체가 서블릿 컨테이너
  • 서블릿은 서블릿 컨테이너 내에서 실행되며 세션 유지 가능

메소드

init()

  • 서블릿 컨테이너가 서블릿 인스턴스를 생성하고 서블릿이 초기화 작업을 할 수 있게 함
  • 라이프 사이클 중 단 한 번만 실행

service(...)

  • 서블릿이 클라이언트로부터 온 요청을 받아 처리할 수 있게 함
  • service() 호출 시 ServletRequest/ServletResponse 객체를 매개변수로 전달
  • ServletRequest 객체를 이용해 요청 처리
  • ServletResponse 객체 이용해 얻은 PrintWriter 객체를 통해 결과 페이지 출력

destroy()

  • 서블릿이 요청 관련 작업을 모두 마치면 서블릿 컨테이너에 의해 스레드 풀에 들어가거나 메모리에서 내려감

  • 메모리에서 내려갈 때에는 GC가 됨

    ⇒ 서블릿이 GC가 되기 전에 마무리 작업을 할 수 있도록 해줘야 함

서블릿의 사용자 요청 처리 과정

  1. 컨테이너가 Servlet클래스를 메모리에 적재

  2. Servlet 클래스의 생성자 메소드를 호출해 인스턴스를 생성하여 메모리에 적재

  3. init() : 생성된 인스턴스의 init() 메소드 호출

  4. service() : 사용자 요청에 대해 web.xml 파일을 참조해 URL 매핑 확인

    ⇒ 해당 Servlet 인스턴스로부터 스레드를 생성해 service() 메소드 호출

    (Get 방식이면 doGet(), Post방식이면 doPost())

  5. destroy() : 서블릿 인스턴스의 존재이유가 없어서 메모리에서 소멸될 때

HTML 입력 태그 데이터 처리

FORM 태그

FORM

  • action : 처리될 서블릿 URL이나 jsp 파일명 기술

    ⇒ submit 버튼 누르면 사용자가 입력한 데이터를 전송 받을 서버쪽에서 실행가능한 프로그램의 URL

  • method : HTTP의 전송 방식 (GET/POST)

    get | post : 둘 중 하나 선택

<form action="Target JSP page" method="get|post">

INPUT

  • Text, password, submit, reset 등등

  • hidden : 브라우저에는 나오지 않지만, 지정한 value를 서버에 전송

    직접 입력 받지 않지만 서비스에 필요한 데이터

Form 태그와 GET 방식

GET 방식

  • GET 방식 : 서버의 데이터를 읽기전용으로 조회
  • HTTP의 기본 전송 방식 : GET방식 (디폴트)
  • 데이터 양에 제한
  • 클라이언트가 서버에 전달하는 내용은 URL의 끝 부분에 Query String 형태로 전달됨

QueryString

  • ?로 시작, "이름=값"
  • 여러 쌍이 나오면 & 문자로 구별
<!-- name 부분에 이름이라는 값이, addr 부분에 NewYork이라는 값이 전달됨 -->
http://<host>/servlet/webapp/name="이름"&addr=NewYork

Form 태그와 POST 방식

POST 방식

  • POST 방식 : HTTP 요청 body에 입력 스트림을 통해 정보 전달 ⇒ stdin방식으로 서블릿/JSP에 전달

  • 전달되는 데이터 양에 제한 x

  • 사용자가 브라우저상에서 전달되는 데이터 모습을 볼 수 없음

    ⇒ 로그인, 비번 전달에 유리

GET vs POST

차이 : 데이터를 어떻게 넘기느냐

  • GET : URL 뒤에 쿼리 스트링로 직접 전달
  • POST : HTTP 헤더 뒤에 입력 스트림 데이터로 전달

서블릿에서 Form 데이터 처리방법

FORM에서 전달된 값은 서블릿의 HttpServletRequest 객체를 통해 얻어낸다

  • getParameter(String name) : name에 해당하는 value 하나를 추출해 문자열로 리턴하고 없으면 null 리턴

    ⇒ <input> 태그의 name 속성값과 getParameter()의 인자로 전달하는 문자열이 동일해야 함

  • getParameterValues(String name) : name에 매핑되는 모든 value를 String[]로 리턴

  • getParameterNames() : 요청 데이터에서 name 값을 모두 추출해 Enumeration으로 리턴

Form 데이터가 한글인 경우

⇒ request.setCharacterEncoding() 이용해 'UTF-8'로 설정

 

public class FormBasedHello extends HttpServlet{
	private static final String DEFAULT_NAME = "World";
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// name을 인자로 전달하여 Form Data 추출
		String name = request.getParameter("myName");
		if((name==null) || (name.length()==0)
			name = DEFAULT_NAME;
		}

	}
	
}

 

ServletContext

ServletContext

  • 웹앱내의 서블릿이나 JSP 간 자원을 공유해서 사용하기 위한 객체

  • 웹앱의 파라미터 정보를 읽어 오기 위함

  • 웹앱 당 하나의 ServletContext 객체 생성

  • ServletConfig는 해당 서블릿에서만 사용 가능

    ⇒ ServletContext를 사용해 웹앱 내의 공통적인 내용을 공유하자

RequestDispatcher

클라로부터 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 보냄

 

메소드

  • getResource(String path) : 문자열 path에 지정된 자원을 URL 객체로 리턴
  • getContext : 문자열 path에 지정된 자원의 Context 정보 리턴
  • getRequestDispatcher : 문자열 path에 지정된 자원을 위한 request dispatcher 객체 리턴

 

Servlet의 페이지 이동

Forward

  • 서버 내부의 서블릿 간 페이지 이동

  • request 객체가 그대로 유지되어 전달

  • forward() 호출시 Request Dispatcher 객체가 req와 res를 전달

  • 이때 request.setAttribute() 로 forward된 servlet에 데이터를 전달할 수 있음

Redirect

  • 타 서버까지 자유롭게 이동
  • sendRedirect() 호출 시
    1. 웹 컨테이너는 이동하려는 새 URL을 브라우저의 클라이언트에게 전달
    2. 새로운 req를 생성할 수 있도록 함
  • 이전에 생성된 req와 res객체는 사라짐

    ⇒ 객체에 원하는 데이터를 저장하여 전달 불가

    ⇒ 세션, 쿠키에 저장해야 함

  • 느림 : req, res가 두 번 일어남

include

  • 현재 페이지에 다른 페이지를 포함
  • include된 서블릿의 response는 서블릿의 최종 response에 포함됨

'백엔드 > JSP' 카테고리의 다른 글

JSP  (0) 2020.04.24

댓글