본문 바로가기
Spring MVC

[MVC] 서블릿(4)

by 개발 Blog 2024. 10. 15.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

HttpServletResponse - 기본 사용법

HttpServletResponse란?

HttpServletResponse는 클라이언트로부터의 요청에 응답을 보낼 때 사용되는 객체이다. 이 객체를 통해 상태 코드 설정, 헤더 추가, 쿠키 설정, 리다이렉트 처리 등의 기능을 사용할 수 있다.

 

ResponseHeaderServlet 예제

다음은 HttpServletResponse의 기본 사용법을 보여주는 서블릿 예제이다.

package hello.servlet.basic.response;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // [status-line]
        response.setStatus(HttpServletResponse.SC_OK);

        // [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 편의 메서드
    private void content(HttpServletResponse response) {
        //Content-Type: text/plain;charset=utf-8
        //Content-Length: 2
        //response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        //response.setContentLength(2); //(생략시 자동 생성)
    }
	
    // 쿠키 편의 메서드
    private void cookie(HttpServletResponse response) {
        //Set-Cookie: myCookie=good; Max-Age=600;
        //response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
        Cookie cookie = new Cookie("myCookie", "good");
        cookie.setMaxAge(600); //600초
        response.addCookie(cookie);
    }
    
    // redirect 편의 메서드
    private void redirect(HttpServletResponse response) throws IOException {
        //Status Code 302
        //Location: /basic/hello-form.html
        //response.setStatus(HttpServletResponse.SC_FOUND); //302
        //response.setHeader("Location", "/basic/hello-form.html");
        response.sendRedirect("/basic/hello-form.html");
    }
}

 

1. Content 편의 메서드

서블릿에서 response.setHeader 메서드를 사용하지 않고도 setContentType, setCharacterEncoding과 같은 편의 메서드를 이용하여 응답 콘텐츠의 타입과 인코딩을 설정할 수 있다.

  • response.setContentType("text/plain");
  • response.setCharacterEncoding("utf-8");

2. 쿠키 편의 메서드

쿠키는 클라이언트에 저장되어 서버와 클라이언트 간의 상태를 유지하는 데 사용된다. response.addCookie 메서드를 통해 쿠키를 클라이언트에 보낼 수 있다.

myCookie라는 이름의 쿠키를 생성하고, 600초 동안 유지되도록 설정하여 클라이언트에게 전달한다.

 

3. 리다이렉트 편의 메서드

리다이렉트는 클라이언트에게 다른 URL로 이동하라고 응답하는 방식이다. response.sendRedirect 메서드를 사용하여 간편하게 리다이렉트를 구현할 수 있다.

서버는 클라이언트에게 /basic/hello-form.html 경로로 이동하라는 302 응답을 보낸다.

 

Http 응답 데이터 - 단순 텍스트, HTML

 

HTTP 응답 메시지란?

HTTP 응답 메시지는 클라이언트의 요청에 대한 서버의 응답을 전달하는 데 사용된다. 응답 메시지는 주로 다음과 같은 내용을 담고 있다.

  1. 상태 코드: 응답이 성공했는지, 실패했는지 등을 나타내는 코드. 예: 200 OK, 404 Not Found.
  2. 헤더: 응답에 대한 메타데이터. 예: Content-Type, Cache-Control 등.
  3. 메시지 바디: 실제 응답 데이터(HTML, JSON, 텍스트 등).

단순 텍스트 응답

이전 예시에서 writer.println("ok");로 간단한 텍스트 응답을 보내는 방법을 다루었다. 이는 PrintWriter를 사용해 응답 메시지의 바디에 텍스트를 전송하는 방식이다.

 

HTML 응답

HTML을 반환할 때는 Content-Type을 text/html로 지정해야 브라우저가 이를 HTML로 렌더링할 수 있다.

다음은 HTML 응답을 보내는 서블릿의 예시이다.

package hello.servlet.basic.response;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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, HttpServletResponse response) throws ServletException, IOException {
        //Content-Type: text/html;charset=utf-8
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter writer = response.getWriter();
        writer.print("<html>");
        writer.print("<body>");
        writer.print(" <div>안녕</div>");
        writer.print("</body>");
        writer.print("</html>");
    }
}
  • Content-Type 설정
    • response.setContentType("text/html");로 응답의 콘텐츠 타입을 text/html로 설정한다.
    • response.setCharacterEncoding("utf-8");로 UTF-8 인코딩을 지정한다.
  • HTML 출력
    • PrintWriter 객체를 이용해 HTML 태그를 직접 응답 바디에 출력한다.
    • <html>, <body>, <div> 등의 HTML 태그를 사용하여 브라우저에 표시될 내용을 구성한다.

실행

해당 서블릿을 실행하려면 브라우저에서 다음 URL을 입력하면 된다.

http://localhost:8080/response-html

 

또한, 브라우저의 페이지 소스 보기 기능을 사용하여 실제 HTML 결과를 확인할 수 있다. 이 방법을 통해 서블릿이 브라우저로 전송한 HTML 코드가 어떻게 렌더링 되는지 확인할 수 있다.

 

 

이와 같은 방식으로 단순 텍스트HTML 응답을 처리할 수 있다.

 

Http 응답 데이터 - API JSON

JSON 응답

API 서버는 주로 JSON 형태로 데이터를 응답한다. JSON은 경량 데이터 형식으로, 다양한 언어에서 쉽게 처리할 수 있어 API 통신에 널리 사용된다.

 

JSON 응답 서블릿 예제

package hello.servlet.basic.response;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(name = "responseJasonServlet", urlPatterns = "/response-json")
public class ResponseJasonServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Content-Type: application/json
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        HelloData helloData = new HelloData();
        helloData.setUsername("kim");
        helloData.setAge(20);

        //{"username":"kim", "age":20}
        String result = objectMapper.writeValueAsString(helloData);
        response.getWriter().write(result);
    }
}
  • Content-Type 설정
    • response.setContentType("application/json");로 JSON 응답을 명시.
    • response.setCharacterEncoding("utf-8");로 UTF-8 인코딩 설정.
  • Jackson 라이브러리 사용
    • ObjectMapper를 사용하여 Java 객체를 JSON 문자열로 변환.
    • writeValueAsString() 메서드를 통해 Java 객체(HelloData)를 JSON 문자열로 변환한 후, 이를 응답으로 전송한다.

JSON 응답 처리

Jackson 라이브러리의 ObjectMapper는 Java 객체를 JSON 형식으로 쉽게 변환할 수 있도록 도와준다. 

 

Java 객체

HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);

 

변환된 JSON 문자열

{"username":"kim", "age":20}

 

서블릿에서 이 JSON 데이터를 클라이언트로 반환하게 된다.

 

실행

해당 서블릿을 실행하려면 브라우저에서 다음 URL을 입력한다.

http://localhost:8080/response-json

 

참고 사항

  • application/json은 스펙상 UTF-8 형식을 사용하도록 정의되어 있다. 즉, charset=utf-8 같은 추가 파라미터는 명시할 필요가 없다.
  • 하지만 response.getWriter()를 사용하면 자동으로 charset=utf-8이 추가된다. 이를 피하고 싶다면 response.getOutputStream()을 사용할 수 있다.

'Spring MVC' 카테고리의 다른 글

[MVC] 서블릿(3)  (0) 2024.10.14
[MVC] 서블릿(2)  (1) 2024.10.11
[MVC] 서블릿(1)  (3) 2024.10.10
[MVC] 웹 애플리케이션 이해  (0) 2024.10.10