서블릿
동작 흐름
1. 서블릿 등록
> `@WebServlet` 을 통해 서블릿 이름과 URL 매핑을 설정하면 서블릿 클래스로 설정된다.
( 이때 클래스는 `HttpServlet` 을 상속해야 한다.)
> `@ServletComponentScan` 를 추가하여 패키지 스캔을 통해 서블릿 클래스를 서블릿으로 자동 등록한다.
@ServletComponentScan
@SpringBootApplication
public class ServletMain {
public static void main(String[] args) {
}
}
@WebServlet(name = "myServlet", urlPatterns = "/test")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
> 참고 <
- 서블릿 이름, URL 매핑은 중복되면 안 된다.
- 서블릿도 스프링 빈처럼 init( ) 초기화 메서드, destroy( ) 종료 메서드가 실행된다.
2. HTTP 요청이 들어오면 서블릿 컨테이너가 동작
> 서블릿 컨테이너가 URL 매핑을 확인하고 해당 서블릿을 찾는다.
> 요청을 service( ) 메서드에 전달하여 service( ) 메서드를 실행한다.
protected void service(HttpServletRequest request, HttpServletResponse response)
HttpServletRequest
- HTTP 요청 메시지를 편리하게 사용하도록 도와주는 객체
- HTTP 요청 메시지를 파싱하여 저장한다.
: 시작 라인 조회 (HTTP 메서드, URL, 쿼리 스트링, 스키마/프로토콜)
: 헤더 조회
: 바디 조회 (form 파라미터 형식, message body 데이터)
- 임시 저장소 기능 제공
- 세션 관리 기능 제공
시작 라인 조회
String method = request.getMethod(); // HTTP 메서드 조회
String requestURI = request.getRequestURI(); // 요청된 URI 조회
String protocol = request.getProtocol(); // 프로토콜 조회
String queryString = request.getQueryString(); // 쿼리 파라미터 조회
헤더 정보 조회
String header = request.getHeader("User-Agent"); // 클라이언트 브라우저 조회
request.getHeaderNames().asIterator() // 모든 헤더 조회
.forEachRemaining(headerName ->
System.out.println(headerName + ": " + request.getHeader(headerName)));
임시 저장소 기능
request.setAttribute("item", item); // Item 객체를 "item" 이름으로 저장
Item item = request.getAttribute("item") // "item" 이름으로 저장된 데이터 조회
세션 관리 기능
HttpSession session = request.getSession();
session.setAttribute("user", "Kim"); // 세션에 데이터 저장
String user = (String) session.getAttribute("user"); // 세션 데이터 조회
요청 데이터 처리 방법
1. GET - 쿼리 파라미터
- 검색, 필터, 페이징 등에서 사용
- 메시지 바디 없이 URL의 쿼리 파라미터를 사용
- `?` : 시작, `&` : 추가 파라미터
2. POST - HTML Form
- 회원가입, 상품 주문 등에서 사용
- 메시지 바디에 쿼리 파라미터 형식으로 전달
String username = request.getParameter("username"); // 단일 파라미터 조회
String[] usernames = request.getParameterValues("username"); // 복수 파라미터 조회
Map<String, String[]> parameterMap = request.getParameterMap(); // 파라미터를 Map으로 조회
request.getParameterNames().asIterator() // 모든 파라미터 이름 조회
.forEachRemaining(paramName ->
System.out.println(paramName + "=" + request.getParameter(paramName)));
3. HTTP message body
- API 에서 사용
- 주로 JSON 사용
- POST, PUT, PATCH 에서 주로 사용
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // String 메시지 바디를 문자열로 조회
ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class); // Json 메시지 바디를 객체로 조회
`inputStream` 을 통해 message body 를 바이트 코드로 변환한다.
`StreamUtils` 를 통해 바이트 코드를 문자로 변환하여 message body 를 조회할 수 있다.
추가적으로 Json 인 경우, Jackson 라이브러리인 `ObjectMapper` 를 통해 문자를 객체로 변환할 수 있다.
HttpServletResponse
- HTTP 응답 메시지를 편리하게 생성하도록 도와주는 객체
: HTTP 응답코드 설정
: 헤더 설정
: 바디 생성
- 쿠키, 리다이렉트 기능 제공
응답코드 설정
response.setStatus(HttpServletResponse.SC_OK); // 응답코드 200 설정
헤더 설정
response.setHeader("Content-Type", "text/plain;charset=utf-8"); // Content-Type 설정
response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate"); // 캐시 설정
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello"); // 사용자지정 헤더 설정
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
바디 메시지 생성
PrintWriter writer = response.getWriter();
writer.println("ok"); // 메시지 바디 생성
쿠키 기능
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); // 쿠키 지속시간 600초 설정
response.addCookie(cookie);
리다이렉트 기능
response.sendRedirect("/basic/hello-form.html"); // 리다이렉트 설정
응답 데이터 처리 방법
1. 단순 텍스트 응답
2. HTML 응답
- content-type 을 `text/html` 로 설정해야 함
response.setContentType("text/html"); // content-type 설정
response.setCharacterEncoding("utf-8"); // content-type 설정
PrintWriter writer = response.getWriter();
writer.print("<html>\n");
writer.print("<body>\n");
writer.print(" <div>안녕?</div>\n");
writer.print("</body>\n");
writer.print("</html>"); // html 메시지 바디 생성
3. HTTP API - message body Json 응답
- content-type 을 `application/json` 으로 설정해야 함
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8"); // content-type 설정
HelloData data = new HelloData();
String result = objectMapper.writeValueAsString(data); // 객체를 Json으로 변환하여 메시지 바디 생성
response.getWriter().write(result);
Jackson 라이브러리인 `ObjectMapper` 를 통해 객체를 Json 으로 변환할 수 있다.
출처 | 스프링 MVC 1(김영한) - 인프런
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[Spring] 리팩토링하며 점진적으로 Spring MVC 프레임워크 만들기 !! (0) | 2025.03.14 |
---|---|
[Spring] MVC 패턴이 등장하게 된 이유 !! (feat. 서블릿, JSP) (1) | 2025.03.14 |
[Spring] 웹 서버와 웹 애플리케이션 서버(WAS) + 서블릿 컨테이너 (0) | 2025.03.13 |
[Spring] 프로토타입 빈, request 빈에 대해 ! (Provider, 프록시) (1) | 2025.02.28 |
[Spring] 빈 생명주기 콜백 (@PostConstruct, @PreDestroy) (0) | 2025.02.26 |