Post

01 Servlet

01 Servlet

1. Servlet

1. Servlet

  • HTTP 요청-응답을 처리하기 위해 서버 사이드 자바 기반 서버 컴포넌트
  • Java 기반 웹 애플리케이션에서 HTTP 요청을 받아 처리하고, 그 결과를 HTTP 응답으로 돌려주는 서버 측 컴포넌트
  • 브라우저 → 서버로 들어오는 요청을 자바 코드로 처리하게 해주는 역할

2. 주요개념

개념설명
HttpServletRequest클라이언트 요청 정보 (파라미터, 헤더 등) 담고 있음
HttpServletResponse서버 → 클라이언트로 보낼 응답 (컨텐츠타입, 상태코드, body 등) 다룸
web.xml / @WebServlet서블릿 URL 매핑 정보
실제 서블릿 클래스를 공개하지 않기 위해서 URL로 접근함.
Lifecycleinit() → service() → destroy() 순으로 동작

3. Servlet 동작 흐름

  • 클라이언트 요청 수신
    • 브라우저가 HTTP 요청을 보냄 (GET /hello HTTP/1.1)
    • WAS(Tomcat 등)는 지정된 포트에서 TCP 소켓으로 요청 수신
  • HTTP 메시지 파싱 및 객체 생성
    • WAS가 원시 HTTP 메시지를 파싱
    • 요청 정보를 담은 HttpServletRequest, 응답을 담을 HttpServletResponse 객체 생성
    • 필요 시 세션(HttpSession)과 애플리케이션 컨텍스트(ServletContext)도 연결
  • 서블릿 로딩 및 인스턴스화
    • WAS는 요청 URL에 매핑된 서블릿 클래스를 확인
    • 최초 요청이면 JVM이 클래스 로드, 메서드/필드 메모리 할당 후 서블릿 인스턴스 생성
    • init() 메서드 호출로 초기화 수행
  • 요청 처리
    • WAS가 생성한 request/response 객체를 서블릿 인스턴스의 service(request, response)에 전달
    • service() 메서드에서 HTTP 메서드(GET/POST)에 맞는 doGet()/doPost() 호출
    • JVM 안에서 서블릿 코드 실행 → request에서 파라미터 읽고, response에 결과 작성
  • 응답 반환
    • 서블릿 실행 후 response 객체에 담긴 내용 기반으로 WAS가 HTTP 응답 메시지 생성
    • TCP 소켓을 통해 브라우저로 응답 전송
  • 정리
    • 요청이 끝나면 WAS가 request/response 객체 정리
    • 서블릿 인스턴스는 JVM 메모리에 유지 → 다음 요청 재사용 가능

4. 라이프사이클

객체나 컴포넌트가 생성되어 소멸될 때까지 거치는 단계와 상태 변화 과정

1
 클래스 로딩 → 인스턴스 생성 → init() → service() → destroy()
  • 클래스 로딩 & 인스턴스 생성
    • 서버가 처음 요청을 받거나, 서블릿이 초기화될 때
    • .class 를 메모리에 로딩하고 Servlet 객체를 1개만 생성 (Singleton)
  • init(ServletConfig config)
    • 생성 직후 단 한번만 호출
    • 초기화 파라미터 세팅 등 서블릿 시작 준비 수행
    • 이 시점 이후에 요청 받기 시작함
  • service(HttpServletRequest req, HttpServletResponse resp)
    • 클라이언트 요청이 들어올 때마다 호출되는 메소드
    • HTTP 방식에 따라 내부에서 doGet(), doPost() 등 각 메소드를 호출
    • 핵심 비즈니스 로직이 실행되는 영역
  • destroy()
    • WAS가 종료되거나 서블릿이 언로드 될 때 단 한번 호출
    • 리소스 반납, 연결 종료 같은 정리(clean-up) 작업 수행

2. Request / Response 메소드 및 객체

1. 서블릿 별 http method

1
2
3
4
 protected void doGet(HttpServletRequest request, HttpServletResponse response) { ... }
 protected void doPost(HttpServletRequest request, HttpServletResponse response) { ... }
 protected void doPut(HttpServletRequest request, HttpServletResponse response) { ... }
 protected void doDelete(HttpServletRequest request, HttpServletResponse response) { ... }
  • WebServlet으로 요청온 http method에 따라서 get/post/put/delete 등으로 각기 분류됨

2. HttpServletRequest 객체

  • HttpServletRequest 는 서블릿 간, JSP와 같은 서버 사이에서 데이터를 전달하는 용도
  • request 속성은 같은 요청 내에서만 유효
  • 메서드 종류
메서드반환 / 설명용도
getParameter(String name)StringGET/POST 파라미터 조회
getParameterValues(String name)String[]체크박스 등 다중값 조회
getParameterMap()Map<String, String[]>전체 파라미터 Map 조회
getHeader(String name)String요청 헤더 조회
getContentType()String요청 Content-Type 조회
getMethod()StringHTTP 메서드(GET, POST 등) 확인
getRequestURI()String요청 URI 조회
getContextPath()String서블릿 컨텍스트 경로 조회
getSession()HttpSession세션 객체 얻기
getCookies()Cookie[]요청 쿠키 조회
getReader()BufferedReader요청 Body 문자 읽기 (JSON 등)
getInputStream()ServletInputStream요청 Body 바이트 읽기

3. HttpServletRequest 객체

메서드설명용도
setContentType(String type)Content-Type 지정클라이언트가 데이터를 올바르게 해석하도록
setCharacterEncoding(String enc)문자 인코딩 지정UTF-8 등
setHeader(String name, String value)응답 헤더 설정Cache-Control, Location 등
setStatus(int sc)상태 코드 설정200, 404, 500 등
sendError(int sc, String msg)에러 응답 전송404 Not Found 등
sendRedirect(String location)클라이언트 리다이렉트다른 URL로 이동
getWriter()PrintWriter문자 기반 응답 출력
getOutputStream()ServletOutputStream바이너리 응답 출력 (파일, 이미지 등)
addCookie(Cookie cookie)쿠키 추가Set-Cookie 헤더 전송

3.Servlet에서 응답(Response) 처리 방식

방식메서드동작특징
직접 출력response.getWriter(), response.getOutputStream()응답 바디에 직접 작성API, 파일 다운로드
내부 위임RequestDispatcher.forward()같은 서버 내 다른 JSP/Servlet이 응답 생성MVC 패턴
클라이언트 리다이렉트response.sendRedirect()브라우저가 새로운 요청 전송URL 변경, 요청 새로 시작

1. 직접 응답 작성 (스트림 이용)

1. response 객체 이용

  • response.getWriter() → PrintWriter로 HTML 같은 텍스트를 직접 작성
  • response.getOutputStream() → 이미지/파일 같은 바이너리 데이터를 직접 작성
  • 특징
    • 응답 바디를 개발자가 직접 생성
    • 간단한 응답(“Hello World”)은 편하지만, 화면이 커지면 유지보수 어려움
    • 주로 API 응답(JSON/XML)이나 파일 다운로드 같은 경우 사용

      2. 예시

      ``` @WebServlet(“/hello”) // URL 패턴 설정 public class FirstServlet extends HttpServlet { // HttpServlet 확장

    @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // http method

    1
    2
    3
    4
    5
    6
    7
    
     resp.setContentType("text/html"); // 응답 타입 설정
     resp.setContentType("text/html; charset=UTF-8"); // 응답 타입 설정 + UTF8로 설정
    
     PrintWriter out = resp.getWriter(); // 리턴 객체 설정 
     out.print("<html><body><h1>"); // HTTP 형식으로 작성
     out.print("Hello Servlet");  // HTTP 형식으로 작성
     out.print("</h1></body></html>");  // HTTP 형식으로 작성  } ```
    

2. 서버 내부 이용

1. RequestDispatcher 객체

  • RequestDispatcher.forward(request, response)
  • 다른 JSP/Servlet이 대신 응답을 만들어줌
  • 특징
    • 비즈니스 로직(Servlet)과 뷰(JSP)를 분리 가능
    • MVC 패턴에서 흔히 사용됨
    • forward된 대상이 최종적으로 response에 쓰기 때문에, 원래 Servlet이 직접 출력할 필요 없음

      2. 예시

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
        String id = request.getParameter("id");
        String pw = request.getParameter("pw");
      
              
        if ("admin".equals(id) && "1234".equals(pw)) {
            // 로그인 성공 → main.jsp로 서버 내부 위임    
                  
            //**서버 안에서 "xxx.html"이라는 리소스를 실행할 수 있는 전달자(RequestDispatcher 객체)**
            RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
                  
            //서블릿에서 쓰던 request, response 객체 그대로 다음 리소스(JSP, HTML, 또 다른 서블릿 등)한테 전달됨.
            dispatcher.forward(request, response);
        } else {
            // 로그인 실패 → login.jsp로 다시 위임
            RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
            dispatcher.forward(request, response);
        }
       }
      

3. 클라이언트 리다이렉트

1. redirect

  • response.sendRedirect(“url”)
  • 브라우저에 “다른 URL로 다시 요청하라”는 HTTP 302 응답을 보냄
  • 특징
    • 브라우저 주소창이 바뀜
    • 새로운 요청이기 때문에 request에 담긴 데이터는 초기화됨

2. 예시

1
2
3
4
5
6
7
8
@WebServlet("/redirectExample")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 로그인 성공 시 메인 페이지로 리다이렉트
        resp.sendRedirect("main.jsp");
    }
}

3. Forward - Redirect

상황ForwardRedirect
브라우저 URL 바꾸고 싶을 때XO
POST-재전송 방지(PRG)XO
외부 서버 이동XO
서버 내부 요청 위임OX

3. Content-Type

HTTP 메시지에서 전송되는 데이터의 형식(MIME 타입)을 나타내는 헤더(Header)

1. 요청구분

  • 요청 방향에 따라서 Content-Type의 역할과 Servlet에서 가지는 의미가 달라짐.

    요청 방향사용 목적Servlet에서 의미
    요청(Request)서버가 어떤 형식으로 데이터를 받았는지 알려줌request.getContentType() 으로 확인 → 어떤 방식으로 읽을지 결정
    응답(Response)클라이언트에게 어떤 형식으로 데이터를 보낼지 알려줌response.setContentType() 으로 지정 → 브라우저나 클라이언트가 올바르게 해석

2. Content-Type 종류

Content-Type의미Servlet에서 처리 방법
application/x-www-form-urlencoded일반 HTML 폼 전송request.getParameter() 로 자동 파라미터 추출 가능
multipart/form-data파일 업로드 폼Servlet 3.0 이상: @MultipartConfig + request.getPart() 사용
application/jsonJSON 데이터request.getReader() / request.getInputStream() 로 직접 읽어서 JSON 파싱 필요
text/plain일반 텍스트request.getReader() 로 읽음

3. Request에서 파라미터 확인

  • QueryString과 Pom
    1
    2
    3
    4
    5
    6
    7
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        // 쿼리스트링 파라미터 꺼내기
        String key1 = request.getParameter("key1"); // key1 = value1 
        String key2 = request.getParameter("key2"); // key2 = valeu2
    }
    
  • Json Type
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
     @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
       // 1. Request Body 획득
       StringBuilder sb = new StringBuilder();
       BufferedReader reader = request.getReader(); //버퍼로 한줄씩 읽음.
       String line;
       while((line = reader.readLine()) != null) {
           sb.append(line); 
       }
    
       String jsonString = sb.toString(); // JSON 문자열 획득 
    
       // 2. JSON 파싱 (예: org.json 사용)
       JSONObject json = new JSONObject(jsonString);
       String name = json.getString("name");
       int age = json.getInt("age");
    
     }
    
This post is licensed under CC BY 4.0 by the author.