[스프링 MVC 1편] 2

smj_716·2025년 5월 23일

스프링 완전 정복

목록 보기
16/16

서블릿은 서버에서 HTTP 요청 메시지를 파싱하고, 필요한 로직을 처리한 후 응답 메시지를 생성해 클라이언트에게 전달하는 핵심 웹 컴포넌트다. 또한 클라이언트와 서버를 잇는 HTTP 요청/응답의 중심이며 서블릿 컨테이너가 이를 실행해준다.

1. Hello 서블릿 등록 및 테스트

서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다.
👉 번거롭다!
👉 스프링 부트톰캣 서버를 내장하고 있어서 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행할 수 있다.

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

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write("hello " + username);
    }
}

브라우저에서 http://localhost:8080/hello?username=world를 호출하면 hello world가 출력된다.


2. HttpServletRequest - 요청 객체

서블릿은 HTTP 요청메시지를 파싱하여 HttpServletRequest 객체에 담아 개발자에게 제공한다. 즉, 개발자는 이 객체를 사용하여 요청 메시지를 편리하게 조회할 수 있다.

➡️ 주요 기능

  • 요청 메서드(GET/POST), URI, 프로토콜, 쿼리스트링 등 조회
  • 헤더, 파라미터, 쿠키, Body 등 다양한 정보 조회 가능
  • 임시 저장소 기능 (setAttribute, getAttribute)
  • 세션 관리 기능 (getSession())

➡️ HTTP 요청 메시지를 통해 서버로 데이터 전달하는 3가지 방법

1. GET - 쿼리 파타리터
2. POST - HTML Form
3. HTTP message body

📌 GET/POST

GET은 URL 쿼리 파라미터를 통해, POST는 메시지 바디에 데이터를 전달한다. 그러나 서버 입장에서는 둘 다 key=value 형식으로 같기 때문에 request.getParameter()로 동일하게 조회할 수 있다.

//단일 파라미터 조회
String username = request.getParameter("username");
//복수 파라미터 조회
String[] values = request.getParameterValues("username");

ex) http://localhost:8080/request-param?username=kim&age=20

  • GET 요청: URL에 파라미터 포함
  • POST 요청 (HTML Form): application/x-www-form-urlencoded

GET은 HTTP 메시지 바디를 사용하지 않아 content-type이 없지만, POST는 HTTP 메시지 바디에 해당 데이터를 포함해서 보내기 때문에 데이터가 어떤 형식인지 content-type을 지정해야한다. 이렇게 폼으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded 라 한다.

참고로 request.getParameter()는 같은 이름의 파라미터가 여러 개 있을 경우 첫 번째 값만 반환한다. 모두 조회하려면 getParameterValues()를 사용해야 한다.

📌 HTTP message body

  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식은 주로 JSON
  • POST, PUT, PATCH

➕ 단순 텍스트 (text/plain)

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

위와 같이 InputStream을 사용하여 Body에 담긴 순수 문자열을 직접 읽을 수 있다.

JSON 파싱 (application/json)

ObjectMapper objectMapper = new ObjectMapper();
HelloData data = objectMapper.readValue(messageBody, HelloData.class);

JSON은 단순한 텍스트 형태로 전달되지만 이를 객체로 변환하려면 Jackson,Gson 같은 JSON 파싱 라이브러리가 필요하다. 스프링 부트로 Spring MVC를 선택하면 Jackson 라이브러리(ObjectMapper)를 제공한다.

이러한 방식은 모바일 앱이나 API 서버 통신처럼 메시지 바디에 JSON 데이터를 담아 전달할 때 주로 사용된다. 이때 주로 사용하는 HTTP 메서드는 POST, PUT, PATCH 등이다.


3. HttpServletResponse - 응답 객체

➡️ 주요 기능

  • HTTP 응답코드 지정
  • 헤더/바디 생성
  • 편의 기능 제공 (Content-Type, 쿠키, Redirect)

📌 응답 상태 코드

response.setStatus(HttpServletResponse.SC_OK); // 200 OK

서블릿은 요청을 처리한 결과를 상태 코드로 표현한다. 200 OK 외에도 400 Bad Request, 404 Not Found 등의 상태 코드를 설정할 수 있다.

📌 헤더/바디 설정

//헤더
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");

//바디
PrintWriter writer = response.getWriter();
writer.println("ok");

응답의 문자 인코딩을 명확히 지정하지 않으면 브라우저가 문자를 잘못 해석해 깨지는 현상이 발생할 수 있다. UTF-8 설정은 다국어 처리에서 특히 중요하다.

👉 위 예시처럼 단순 텍스트가 아닌 HTML or JSON 형태라면?

  • HTML 응답
    • contextType을 text/html로 지정하고 바디는 아래와 같이 설정하면 된다.
    • writer.println("<html>");
       writer.println("<body>");
       writer.println("  <div>안녕?</div>");
       writer.println("</body>");
       writer.println("</html>");```
  • JSON 응답
    • contextType을 application/json로 지정하고 바디는 아래와 같이 설정하면 된다.
    • HelloData data = new HelloData();
      data.setUsername("kim");
      data.setAge(20);
      String result = objectMapper.writeValueAsString(data);
      response.getWriter().write(result);```
    • Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()을 사용하면 객체를 JSON 문자로 변경할 수 있다.

📌 쿠키 / 리다이렉트

Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);  //600초
response.addCookie(cookie);
response.sendRedirect("/home");

쿠키는 클라이언트에 데이터를 저장할 때 사용하며 setMaxAge()를 통해 유효 시간을 설정할 수 있다. sendRedirect()는 클라이언트를 지정한 URL로 리다이렉트시키는 메서드로 브라우저가 새로운 요청을 보내도록 유도한다.


더 자세한 코드는 깃허브 기록을 보자!
https://github.com/MinjiSeo16/inflearnSpring/commits/main/mvc1

0개의 댓글