[Servlet] Method

컨테이너·2025년 11월 18일
0

SpringFramework

목록 보기
7/15
post-thumbnail

Servlet Method


01. HTTP 데이터 전송 방식과 구조

01-01. 데이터 전송 구조 흐름

  1. 브라우저가 요청 정보를 HTTP 메시지에 담아 서버로 전송한다.
  2. 서버(Tomcat)가 HTTP 메시지를 해석하고, 해당 URL에 매핑된 Servlet의 service() 메서드를 호출한다.
  3. service() 메서드는 요청 방식에 따라 doGet() 또는 doPost()를 호출해 실제 로직을 수행한다.
  4. 이때 사용되는 요청 객체 타입은 HttpServletRequest / HttpServletResponse 이다.
    • HttpServletRequestServletRequest를 상속한 구현체이므로, 실제 사용 시에는 보통 HttpServletRequest로 캐스팅하여 사용한다.

01-02. GET / POST 방식 정리

1) GET 방식

  • URL의 ? 뒤에 데이터를 붙여 보내는 방식(쿼리스트링).
    • 예: http://localhost:8080/sendMessage?message=abc&code=20
  • 데이터가 HTTP Header(요청 라인 + 헤더)에 포함된다.
  • 특징
    • URL에 데이터가 노출되어 보안에 취약
    • 브라우저·서버 등에서 길이 제한 존재
    • 속도가 빠르고, 서버 상태를 바꾸지 않는 조회/검색에 적합

2) POST 방식

  • 데이터를 HTTP Body에 담아서 전송한다.
  • URL에 데이터가 노출되지 않아 GET보다 상대적으로 보안적
  • 데이터 크기 제한이 사실상 없다. (실제 제한은 서버 설정, 시간 제한 등)
  • 주 사용 용도
    • 생성, 수정 요청 (회원가입, 글쓰기, 수정, 등록 등)

02. 데이터 전송 방식에 따른 Servlet Method

02-01. Servlet Method 동작 방식

  • HTML의 <form method="GET/POST"> 설정에 따라 요청 방식이 결정된다.
    • 생략하면 기본값은 GET
  • Tomcat 동작 흐름
    1. URL에 매핑된 서블릿 객체 생성(또는 이미 만들어진 인스턴스 사용)
    2. 서블릿의 service(request, response) 메서드 호출
    3. 요청 방식에 따라 doGet() 또는 doPost()동적 바인딩되어 호출
  • service, doGet, doPost는 모두 ServletException(및 IOException)을 처리해야 한다.

02-02. doGet() 메서드

  • 클라이언트가 GET 방식으로 요청했을 때 호출.
  • 특징 정리
    • 브라우저가 HTML의 charset에 따라 한글을 인코딩하고, URL에 들어가는 값은 % 형식(URLEncoder)으로 변환해서 전송.
    • Header는 ASCII 기반 문자열이므로, 서버 인코딩 설정과 맞기만 하면 한글 깨짐 없이 해석 가능.
    • 보통 서버의 리소스를 가져오는(read) 요청에 사용.
    • 쿼리스트링으로 데이터가 노출되어 보안은 약하지만, 속도는 빠름.

02-03. doPost() 메서드

  • 클라이언트가 POST 방식으로 요청했을 때 호출.
  • 특징 정리
    • 서버 리소스에 내용을 추가·변경하는 요청에 사용.
    • 전송 데이터는 Body에 담으며, 헤더와는 별개로 URLEncoder를 사용하지 않고 전송.
    • 브라우저는 보통 페이지 meta charset(예: UTF-8) 기준으로 인코딩해서 Body에 담아 보낸다.
    • 서버는 별도 설정이 없으면 기본 ISO-8859-1로 해석 → 한글 깨짐 발생.
      • request.getCharacterEncoding() 호출 시 기본값은 null.
      • 따라서 parameter 읽기 전에 반드시 인코딩 지정 필요:
        request.setCharacterEncoding("UTF-8");
        
    • Body에 데이터를 담기 때문에 많은 데이터 전송 가능하나 속도는 상대적으로 느림.
    • 개발자 도구에서 Body 내용을 확인할 수 있으므로, 절대적인 보안 수단은 아님.

03. HttpServletRequest

03-01. HttpServletRequest의 역할

  • HTTP 요청 정보를 담고 있는 객체로, 요청 파라미터·헤더·바디 등을 조회하는 메서드를 제공한다.
  • 구현체는 컨테이너(Tomcat)가 제공하므로, 우리는 인터페이스 메서드만 사용한다.
    • 상속 관계: ServletRequestHttpServletRequest

03-02. 주요 메서드 암기

메서드내용
getParameter(String)단일 파라미터 값 String으로 가져오기
getParameterNames()모든 파라미터 이름 열거
getParameterValues(String)동일 이름으로 여러 값이 넘어올 때 배열로 받기
getParameterMap()전체 파라미터를 Map<String, String[]> 형태로 받기
setAttribute(String, Object)request 범위에 데이터 저장 (forward 시 공유)
getAttribute(String)저장된 속성 값 조회
removeAttribute(String)request 범위 데이터 삭제
setCharacterEncoding(String)요청 Body 문자 인코딩 설정(POST 한글 처리 필수)
getRequestDispatcher(String)forward 대상 컴포넌트(jsp, servlet 등) 지정

04. HttpServletResponse

04-01. Servlet의 전체 역할 3단계

  1. 요청 받기
    • GET/POST에 따라 parameter 추출
  2. 비즈니스 로직 처리
    • 서비스 호출, DB 접근, CRUD 처리
  3. 응답 보내기
    • 동기: HTML 문자열을 만들어서 스트림으로 출력
    • 비동기: JSON 등 데이터만 보내고 화면은 JS가 렌더링

04-02. HttpServletResponse의 역할

  • 요청 처리 결과를 클라이언트에게 돌려주는 객체
  • 구현체 역시 컨테이너가 제공. 우리는 인터페이스 메서드를 사용

주요 메서드:

메서드내용
setContentType(String)응답 MIME 타입 지정 ("text/html", "application/json" 등)
setCharacterEncoding(String)응답 데이터 인코딩 지정
getWriter()문자 기반 출력 스트림(PrintWriter) 반환
getOutputStream()바이트 기반 출력 스트림 반환(파일, 이미지 등)
sendRedirect(String)지정한 URL로 리다이렉트 응답(302)

04-03. 예외 처리 – sendError()

  • 서블릿에서 직접 에러 상태 코드를 내려줄 수 있다.
response.sendError(500, "서버 내부 오류입니다.");
  • web.xml<error-page>를 등록하면, 특정 상태 코드 발생 시 사용자 정의 에러 페이지로 보내도록 설정 가능:
<error-page>
    <error-code>404</error-code>
    <location>/showErrorPage</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/showErrorPage</location>
</error-page>

04-04. 스트림을 활용한 동적 페이지 응답 절차

  1. 응답 MIME 타입 설정

    response.setContentType("text/html");
    
  2. 응답 인코딩 설정

    response.setCharacterEncoding("UTF-8");
    // 또는
    response.setContentType("text/html; charset=UTF-8");
    

    주의: 반드시 getWriter() 호출 전에 설정해야 한다.

  3. 출력 스트림으로 내용 쓰기

    PrintWriter out = response.getWriter();
    out.print(responseBuilder.toString());
    
  4. 스트림 닫기

    out.close();
    

05. Forward vs Redirect

05-01. forward()

  • 정의
    • 서버 내부에서만 다른 자원(jsp, servlet 등)으로 요청을 넘기고, 최종 응답은 마치 원래 서블릿이 한 것처럼 보이게 하는 방식.
  • 요청/응답 객체 특징
    • request, response 객체를 그대로 전달한다.
    • 같은 요청 흐름 안에서만 사용되며, 요청 방식(GET/POST)도 그대로 유지.
    • 기존 request.setAttribute()로 담아둔 데이터가 그대로 전달된다.
  • 주소창
    • URL이 바뀌지 않는다.
  • 대표 코드
    request.setAttribute("userId", userId);
    
    RequestDispatcher rd = request.getRequestDispatcher("print");
    rd.forward(request, response);
    
  • 용도
    • 다단계 처리 로직에서 기능 분리
    • 주로 조회 화면에서 데이터 전달에 많이 사용

05-02. redirect()

  • 정의
    • 서버가 클라이언트에게 “이 URL로 다시 요청하라”고 지시하는 방식.
    • HTTP 상태 코드: 302 (일반적인 리다이렉트) 등.
  • 요청/응답 객체 특징
    • 기존 요청은 끝나고, 브라우저가 새 요청을 보낸다.
    • 따라서 request 범위 데이터는 사라진다.
    • 필요한 경우 쿠키/세션으로 데이터 유지.
  • 주소창
    • URL이 바뀐다.
  • 대표 코드
    response.sendRedirect("http://www.naver.com");
    // 또는
    response.sendRedirect("redirect"); // 다른 서블릿 url-pattern
    
  • 동작 흐름
    1. 첫 번째 서블릿이 sendRedirect()를 호출
    2. 서버는 302 상태 코드 + Location 헤더로 응답
    3. 브라우저가 Location에 적힌 URL로 다시 요청
    4. 두 번째 요청에 대한 응답이 브라우저에 표시
  • 용도
    • insert, update, delete 이후 중복 요청 방지를 위해 주로 사용
    • 로그인 성공 후 메인 페이지로 이동 등

05-03. forward vs redirect 정리

비교 항목forwardredirect
요청 횟수1회2회 (서버→브라우저→다시 서버)
주소창 URL변경되지 않음변경됨
request 데이터유지됨초기화됨(새 요청)
사용 위치서버 내부클라이언트까지 왕복
주 사용 용도조회, 내부 화면 이동생성/수정/삭제 후 이동, 새 요청 강제

실전에서 자주 쓰는 패턴:

  • 조회(SELECT): forward 많이 사용
  • 등록/수정/삭제(INSERT/UPDATE/DELETE): redirect 많이 사용 → 새로고침 시 같은 동작이 중복 수행되지 않도록 하기 위함.

06. 정리

마지막으로, 빠른 복습용으로 키워드만 모아 둔 섹션.

1) HTTP 전송 방식

  • GET
    • 쿼리스트링, URL 노출, Header
    • 길이 제한, 보안 약함
    • 조회/검색
  • POST
    • Body 전송
    • URL에 노출 안 됨
    • 한글 깨짐 방지: request.setCharacterEncoding("UTF-8"); 후 파라미터 읽기

2) Servlet 메서드 흐름

  • Tomcat → service()doGet() / doPost()
  • 예외: ServletException, IOException 처리 필수

3) HttpServletRequest

  • 파라미터: getParameter, getParameterValues, getParameterMap
  • 공유 데이터: setAttribute, getAttribute
  • 인코딩: setCharacterEncoding("UTF-8")
  • 이동: getRequestDispatcher().forward(...)

4) HttpServletResponse

  • 헤더 설정:
    • setContentType("text/html; charset=UTF-8")
    • 응답 전에 설정 후 getWriter() 사용
  • 스트림:
    • 문자: getWriter()
    • 바이너리: getOutputStream()
  • 리다이렉트:
    • sendRedirect("url")

5) forward vs redirect

  • forward
    • 서버 내부 이동
    • URL 그대로
    • request 유지
  • redirect
    • 클라이언트에 다시 요청 지시
    • URL 변경
    • request 초기화
    • 보통 CUD 후 사용

profile
백엔드

0개의 댓글