SPRING

2. 서블릿

ggomjiu 2025. 5. 23. 22:10

서블릿

: 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

- SpringBoot는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치없이 편리하게 서블릿 코드를 실행할 수 있음

1) SpringBoot 서블릿 환경 구성

- @ServletComponentScan

- 스프링이 자동으로 내 패키지를 포함한 모든 하위 패키지에 있는 서블릿을 찾아 자동으로 등록해주기 위해 @ServletComponentScan 어노테이션 추가

 

2) 서블릿 등록하기

- @WebServlet

- 서블릿으로 등록하기 위해서 어노테이션 추가

- name : 서블릿 이름, urlPatterns : URL 매핑

- /{urlPatterns}가 호출 -> 서블릿 컨테이너는 해당 메소드를 실행

- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 해당하는 메소드를 실행

- HttpRequest, HttpServletResponse는 인터페이스

- WAS 서버들이 Servlet 표준 스펙을 구현하는 것 -> 구현체 존재

  • getParameter : 쿼리 파라미터를 받아옴
  • getWriter().write() : HTTP 메시지 Body

3) 동작 과정

  • SpringBoot를 실행하면 내장 톰캣 서버를 띄워줌
  • 서블릿 컨테이너를 통해 서블릿을 생성

  • 웹 브라우저가 HTTP 요청, 응답 메시지를 서버 측에 던져줌

  • 서버는 Request, Response 객체를 만들어서 helloServlet을 호출
  • 서비스 메소드를 호출하면서 Request, Response를 덩져줌
  • 서블릿이 종료되고 나가면서 WAS 서버가 Response 정보를 가지고 HTTP 메시지를 만들어서 반환
  • 웹 브라우저에서 볼 수 있음

HttpServletRequest

: HTTP 요청 메시지를 개발자 대신 파싱하여 HttpServletRequest 객체에 담아 제공

POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
  • StartLine : HTTP 메소드, URL, 쿼리 스트링, 스키마, 프로토콜
  • Header : 헤더 조회
  • Body : form 파라미터 형식 조회, message body 데이터 직접 조회

- 부가적인 기능

  • 임시 저장소 기능 : 해당 Http 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
    • 저장 : request.setAttribute(name, value)
    • 조회 : request.getAttribute(name)
  • 세션 관리 기능
    • request.getSession(create : true)

HTTP 요청 데이터

- HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 3가지가 존재

  • GET - 쿼리 파라미터
    • /url?username=hello&age=20
    • 바디없이 URL의 쿼리 파라미터에 데이터를 포함해 전달
    • EX) 검색, 필터, 페이징
  • POST - HTML Form
    • 메시지 바디에 쿼리 파라미터 형식으로 전달
    • content-type : application/x-www-form-urlencoded
    • EX) 회원가입, 상품 주문, HTML Form
  • HTTP Message Body
    • HTTP API에서 주로 사용 -> JSON, XML, TEXT
    • 데이터 형식은 주로 JSON
    • POST, PUT, PATCH

1. GET 쿼리 파라미터

: 메시지 바디없이 URL의 쿼리 파라미터를 사용하여 데이터를 전달하는 방식

- ?를 시작으로 보낼 수 있음

- 추가 파라미터는 &를 통해 구분

- request.getParameter()을 통해 파라미터 값을 조회할 수 있음

 

2. POST HTML Form

: Form을 통해 클라이언트에서 서버로 데이터를 전달

- HTML Form을 통해서 데이터를 쿼리 파라미터 형식으로 전달

- application/x-www-form-urlencoded 형식은 GET 쿼리 파라미터 형식과 같아 쿼리 파라미터 조회 메소드를 그대로 사용할 수 있음

- request.getParameter()는 GET URL 쿼리 파라미터, POST HTML Form 둘 다 지원

 

cf)

- content-type은 HTTP 메시지 바디의 데이터 형식을 지정

- GET URL 쿼리 파라미터 형식은 HTTP 메시지 바디를 사용하지 않기 때문에 content-type이 없음

- POST HTML Form형식은 HTTP 메시지 바디에 해당 데이터를 포함하여 보내기 때문에 content-type을 지정해줘야 함

=> Form으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded라고 함

 

3. API 바디 메시지

: HTTP Message Body에 데이터를 직접 담아서 요청

- 데이터 형식은 주로 JSON

 

HttpServletResponse

- 역할

  • HTTP 응답 메시지 생성 : HTTP 응답 코드 지정, 헤더 생성, 바디 생성
  • 편의 기능 제공 : content-type, 쿠키, Redirect
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcetption, IOException {

        //[status-line]
        response.setStatus(HttpServletResponse.SC_OK); // http 응답코드 200

        //[response-headers]
        response.setHeader("Content-Type","text/plain;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header","hello");

        //[message body]
        PrintWriter writer = response.getWriter();
        writer.println("ok");
    }
}