본문 바로가기
Spring/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

스프링 MVC - HTTP 응답 데이터 만들기

by hk27 2022. 2. 1.
스프링 MVC에서 HTTP 응답 데이터는 어떻게 만들까요?

안녕하세요. 

오늘은 스프링 MVC에서 HTTP 응답 데이터를 만드는 방법을 알아보겠습니다.

 

앞서 스프링 MVC를 도입하지 않고 서블릿의 HttpServletResponse 객체로 응답 메시지를 만드는 방법을 알아보았습니다. 궁금하신 분은 아래 게시글을 참고해주세요. 

HttpServletResponse 사용하기

 

서버에서 응답 데이터를 만드는 방법은 크게 3가지가 있습니다.

정적 리소스, 뷰 템플릿, HTTP 메시지입니다. 세 가지를 하나씩 알아봅시다.

 

정적 리소스

웹 브라우저에 정적인 HTML, css, js 파일을 제공하는 것입니다.

source/main/resources/static 경로에 파일을 넣어두면 정적 리소스를 제공할 수 있습니다.

예를 들어서 src/main/resources/static/basic/hello-form.html 에 파일이 있으면

웹 브라우저에서 http://localhost:8080/basic/hello-form.html로 접속하면 됩니다. 

 

뷰 템플릿

동적인 HTML을 제공할 때는 타임 리프, JSP와 같은 뷰 템플릿을 사용합니다.

뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달합니다. 

스프링 부트가 제공하는 기본 뷰 템플릿 경로는 src/main/resources/templates입니다. 

templates 폴더 안에 타임리프 파일을 만들어보겠습니다.

src/main/resources/templates/response/hello.html에 만들었습니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="${data}">empty</p>
</body>
</html>

컨트롤러 코드에서 위의 뷰 템플릿을 호출하려면 논리 이름으로 response/hello를 사용합니다. 

뷰 리졸버가 실행되어 물리 주소인 src/main/resources/templates/response/hello.html을 반환합니다. 

 

컨트롤러는 아래 코드처럼 사용합니다. 

@Controller
public class ResponseViewController {
    
    @RequestMapping("response-view-v1")
    public ModelAndView responseViewV1(){
        ModelAndView mav= new ModelAndView("response/hello").addObject("data", "hello!");
        return mav;
    }

    @RequestMapping("response-view-v2")
    public String responseViewV2(Model model){
        model.addAttribute("data", "hello!!");
        return "response/hello";
    }
}

뷰 템플릿을 호출하는 방법은 두 가지가 있습니다.

첫 번째는 코드의 responseViewV1 메소드와 같이 ModelAndView 객체를 반환하는 것입니다. 생성자에 논리 이름을 넣고, addObject 메소드로 모델에 값을 넣습니다.

두 번째는 responseViewV2 메소드와 같이 논리 이름 String을 반환하는 것입니다. 모델에 값을 넣어야 한다면 모델을 파라미터로 받고 addAttribute로 값을 넣습니다. String을 반환하면 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링합니다. 

 

HTTP API, 메시지 바디에 직접 입력

위에서 본 두 방법은 서버에서 바로 html을 전달하는 방법입니다.

그러나 보통은 프론트엔드와 함께 작업 하므로 json과 같은 데이터를 전달합니다. 

메시지 바디에 직접 데이터를 전달하려면 어떻게 해야 할까요?

 

먼저 일반 문자열 데이터를 전달하는 3가지 방법을 알아봅시다. 

@Slf4j
@Controller
public class ResponseBodyController {

    @GetMapping("/response-body-string-v1")
    public void responseBodyStringV1(HttpServletResponse response) throws IOException {
        response.getWriter().write("ok");
    }


    @GetMapping("/response-body-string-v2")
    public HttpEntity<String> responseBodyStringV2() throws IOException {
        return new ResponseEntity<String>("ok", HttpStatus.OK);
    }

    @ResponseBody
    @GetMapping("/response-body-string-v3")
    public String responseBodyStringV3() throws IOException {
        return "ok";
    }
}

response 객체에서 writer를 받아서 직접 write 할 수 있고, 혹은 HttpEntity를 String 타입 제너릭으로 지정하고 메시지를 전달할 수 있습니다. 

마지막으로 간단하게 @ResponseBody 어노테이션을 사용할 수 있습니다. 메소드에 @ResponseBody 어노테이션을 붙이면 String으로 리턴된 값을 바로 응답 메시지 바디로 전달합니다.

 

다음으로 json 데이터를 전달하는 방법을 알아봅시다.

@Slf4j
@Controller
public class ResponseBodyController {
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json")
    public HelloData responseBodyJson() throws IOException {
        HelloData data = new HelloData();
        data.setUsername("userA");
        data.setAge(20);
        return data;
    }
}

String을 전달하는 방법과 크게 다르지 않습니다. @ResponseBody 어노테이션을 쓰고 String 대신 전달할 객체를 리턴하면 자동으로 json으로 변환되어 전달됩니다.

참고로 @ResponseStatus 어노테이션을 쓰면 응답 상태 코드를 지정할 수 있습니다. 

 

 

이번 게시글에서는 스프링 MVC로 HTTP 응답 메시지를 만드는 방법을 알아보았습니다.

다음 게시글에서는 HTTP 메시지 컨버터를 알아보겠습니다. 

 

인프런  '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다. 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

참고 자료

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 6. 스프링 MVC - 기본 기능 https://www.inflearn.com/course/스프링-mvc-1

 

댓글