[Spring] Servlet Method

배창민·2025년 10월 1일
post-thumbnail

Servlet Method


0) HTTP 전송 방식 개요

GET vs POST

구분전송 위치특징보안/용도
GETURL 쿼리스트링(?a=1&b=2) / Header크기 제한·북마크 가능·캐시노출됨(민감정보 X), 조회/검색
POSTBody크기 제한 없음(시간 제한 有)URL 노출 X(개발자도구로는 보임), 등록/수정

브라우저는 요청/응답을 바이트 스트림으로 주고받고, 서버(Tomcat)가 이를 파싱해 Servlet의 service()doGet/doPost()를 호출.


1) Servlet Method 호출

  • HTML <form method="get|post">method에 따라 컨테이너가 doGet() 또는 doPost()를 호출
  • service() → 동적 바인딩으로 현재 클래스의 doGet/doPost 실행
  • 예외: ServletException 적절히 처리

1-1) doGet()

  • GET 파라미터는 쿼리스트링으로 전송, 브라우저가 URL 인코딩(퍼센트 인코딩) 처리
  • 헤더는 ASCII로 전달 → 서버 인코딩만 맞으면 한글 깨짐 거의 없음
  • 빠름/캐시/북마크에 유리, 민감 정보 X

1-2) doPost()

  • 본문(Body)로 전송, 브라우저 문서 인코딩(보통 UTF-8) 기준으로 보냄
  • 서버는 기본 ISO-8859-1로 해석 → 한글 깨짐 방지를 위해 먼저 인코딩 지정 필요
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // ★ 파라미터 꺼내기 전 설정!
    request.setCharacterEncoding("UTF-8");

    String name = request.getParameter("name");
    // ...
}

2) HttpServletRequest 핵심 메서드

메서드설명
getParameter(name)단일 값 조회
getParameterValues(name)다중 값 배열로 조회(체크박스 등)
getParameterNames()모든 파라미터 이름 열거
getParameterMap()모든 파라미터 맵
setAttribute(name, obj)요청 범위 공유 데이터 저장
getAttribute(name)요청 범위 데이터 조회
removeAttribute(name)요청 범위 데이터 삭제
setCharacterEncoding(cs)요청 본문 인코딩 지정(POST 한글 깨짐 방지)
getRequestDispatcher(path).forward(req, res)내부 forward (아래 참고)

2-1) Request Header 자주 보는 값

  • Host, User-Agent, Accept, Accept-Encoding, Accept-Language, Connection
  • Referer, Cache-Control, Upgrade-Insecure-Requests
  • Sec-Fetch-*(site/mode/dest/user): 요청 출처/의도 식별에 도움

3) HttpServletResponse 핵심 메서드

메서드설명
setContentType(mime)text/html, application/json
setCharacterEncoding(cs)응답 인코딩 지정
getWriter()문자 스트림(HTML/JSON 문자열)
getOutputStream()바이트 스트림(파일/이미지)
sendRedirect(url)302로 재요청 유도(redirect)

3-1) 에러 응답

// 상태코드 + 메시지
response.sendError(500, "서버 내부 오류");

web.xml에 에러 페이지 매핑 가능:

<error-page>
  <error-code>404</error-code>
  <location>/error404</location>
</error-page>
<error-page>
  <error-code>500</error-code>
  <location>/error500</location>
</error-page>

3-2) 동적 페이지 응답(문자 스트림)

response.setContentType("text/html; charset=UTF-8"); // ★ Writer 얻기 전!
PrintWriter out = response.getWriter();
out.println("<h1>Hello Servlet</h1>");
out.close();

4) Forward vs Redirect

4-1) 한눈 비교

구분forwardredirect
방식서버 내부에서 위임클라이언트에 재요청 지시(302)
URL 변화❌ (변경 안 됨)✅ (변경됨)
데이터 전달request.setAttribute() 로 전달 가능새 요청이므로 공유 안됨(세션/쿠키/쿼리 사용)
새로고침 영향재조회재요청(중복 처리 방지에 유리)
용도조회/합성/서버 내부 전파등록/수정/삭제 후 목록으로 이동 등

4-2) 코드 예시

forward

request.setAttribute("userId", userId);
request.getRequestDispatcher("/print").forward(request, response);

redirect

response.sendRedirect("/list");   // 또는 외부 URL도 가능

등록/수정/삭제 후에는 PRG(Post/Redirect/Get) 패턴으로 새로고침 중복 방지!


5) 공유 범위별 저장소(요약)

  • Request: setAttribute/getAttribute (요청 1회 동안)
  • Session: 로그인 등 사용자 세션 범위
  • Application(ServletContext): 애플리케이션 전역 설정값
API공통 메서드
ServletRequest / HttpSession / ServletContextsetAttribute(name,obj), getAttribute(name), removeAttribute(name)

6) 정리

  • POST 한글: request.setCharacterEncoding("UTF-8") (파라미터 꺼내기 )
  • 응답 인코딩: setContentType("...; charset=UTF-8")getWriter()
  • PRG 패턴: 변경 요청 후 sendRedirect로 중복 방지
  • forward vs redirect: 용도/공유 데이터/URL 변화 고려해 선택
  • 보안: GET 쿼리스트링에 민감 정보 금지, 세션/쿠키 사용 시 보안 옵션 검토

GET은 가볍게, POST는 정확하게.
화면 전환은 forward(내부위임) vs redirect(재요청)용도에 맞게

profile
개발자 희망자

0개의 댓글