본문 바로가기
Spring Study/MVC 패턴

[MVC 패턴] 서블릿 (Servlet)

by 정재인 2023. 8. 8.
@ServletComponentScan
@SpringBootApplication
public class ServletApplication{
    public static void main(String[] args){
        SpringApplication.run(ServletApplication.class, args);
    }
}

스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다.

 

package hello.servlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
  
    @WebServlet(name = "helloServlet", urlPatterns = "/hello")
    public class HelloServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
          System.out.println("HelloServlet.service");
          System.out.println("request = " + request);
          System.out.println("response = " + response);
          
          String username = request.getParameter("username");
          System.out.println("username = " + username);
          
          response.setContentType("text/plain");
          response.setCharacterEncoding("utf-8");
          response.getWriter().write("hello " + username);
    }
}

 

@WebServlet(name = " ", urlPatterns = " ") 서블릿 애노테이션

 - name: 서블릿 이름

 - urlPattern: URL 매핑

 

HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다.

protected void service(HttpServletRequest request, HttpServletResponse response)

 

 


HttpServletRequest

 역할

서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신 HTTP 요청 메시지를 파싱한다. 그 결과를 HttpServletRequest 객체에 담아서 제공한다. 이를 통해 HTTP 요청  메시지를 편리하게 조회할 수 있다.

 

임시 저장소 기능

해당 HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능

 - 저장: request.setAttribute(name, value)

 - 조회: request.getAttribute(name)

 

세션 관리 기능

 request.getSession(create: true)

 

 

 

HTTP 요청 데이터 (클라이언트 -> 서버로 데이터 전달 방법)

1. GET - 쿼리 파라미터
2. POST - HTML Form
3. HTTP message body에 데이터를 직접 담아서 요청

GET - 쿼리 파라미터

 - 메시지 바디 없이, URL의 쿼리 파라미터를 사용하여 데이터를 전달한다. ex) 검색, 필터, 페이징에서 많이 사용하는 방식

 - 전달 데이터: username = hello / age = 20일 경우

  ☞ http://localhost:8080/request-param?username=hello&age=20

쿼리 파라미터는 URL에 다음과 같이 ?를 시작으로 보낼 수 있다.추가 파라미터는 &로 구분하면 된다.

 

POST - HTML Form

 - 메시지 바디에 쿼리 파라미터 형식을 데이터를 전달한다. ex) 회원 가입, 상품 주문 등에서 사용하는 방식

 - 전달 데이터: username = hello / age = 20일 경우

<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/request-param" method="post">
            username: <input type="text" name="username" /> 
            age: <input type="text" name="age" /> <button type="submit">전송</button>
    </form>
    </body>
    </html>

 

이후 Postman을 사용하여 테스트 진행

 

HTTP message body에 데이터를 직접 담아서 요청

 단순 텍스트

  - HTTP API에서 주로 사용, JSON, XML, TEXT

  - 데이터 형식은 주로 JSON 사용

  - POST, PUT, PATCH

<Postman 결과>

content-type: text/plain

message body: hello

결과: messageBody = hello

 

 JSON

<Postman 결과>

content-type: application/json

message body: {"username": "hello", "age": 20}

결과: messageBody = {"username": "hello", "age": 20}

 


HttpServletResponse 

역할

 - HTTP 응답 메시지 생성

  - HTTP 응답코드 지정

  - 헤더 생성

  - 바디 생성

 - 편의 기능 제공

  - Content-Type, 쿠키, Redirect

 

편의 메서드

//[status-line]
response.setStatus(HttpServletResponse.SC_OK); //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");

//[Header 편의 메서드] 
content(response); 
cookie(response); 
redirect(response);
          
//[message body]
PrintWriter writer = response.getWriter();
writer.println("ok");

//[Content 편의 메서드]
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");

//[Cookie 편의 메서드]
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600"); 
Cookie cookie = new Cookie("myCookie", "good"); 
cookie.setMaxAge(600); //600초
response.addCookie(cookie);

//[redirect 편의 메서드]
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");

 

HTTP 응답 데이터

1. 단순 텍스트 응답
2. HTML 응답
3. HTTP API - MessageBody JSON 응답

 

단순 텍스트 응답

 write.println("ok");

 

HTML 응답

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
    @WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
    public class ResponseHtmlServlet extends HttpServlet {
         @Override
         protected void service(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
             //Content-Type: text/html;charset=utf-8
             response.setContentType("text/html");
             response.setCharacterEncoding("utf-8");
             
             PrintWriter writer = response.getWriter(); 
             writer.println("<html>"); 
             writer.println("<body>");
             writer.println(" <div>안녕?</div>"); 
             writer.println("</body>"); 
             writer.println("</html>");
        } 
}

 

HTTP 응답을 HTML을 반환할 때는 content-typetext/html로 지정해야 한다.

 

API  - JSON

package hello.servlet.basic.response;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * http://localhost:8080/response-json
 *
 */
    @WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
    public class ResponseJsonServlet extends HttpServlet {
        private ObjectMapper objectMapper = new ObjectMapper();
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //Content-Type: application/json
          response.setHeader("content-type", "application/json");
          response.setCharacterEncoding("utf-8");
          HelloData data = new HelloData();
          data.setUsername("kim");
          data.setAge(20);
          
          //{"username":"kim","age":20}
          String result = objectMapper.writeValueAsString(data);
          response.getWriter().write(result);
     } 
}

 

HTTP 응답으로 JSON을 반환할 때는 content-typeapplication/json으로 지정해야 한다.

'Spring Study > MVC 패턴' 카테고리의 다른 글

[MVC 패턴] 타임리프 (Thymeleaf)  (0) 2023.08.16
[MVC 패턴] MVC 기본 기능  (0) 2023.08.15
[MVC 패턴] MVC 구조  (0) 2023.08.14
[MVC 패턴] MVC 프레임워크 만들기  (0) 2023.08.12
[MVC 패턴] JSP / MVC 패턴  (0) 2023.08.09

댓글