본문 바로가기
Backend, Server/Spring MVC

[Spring MVC] 스프링 MVC 기본 기능 - (3) HTTP 응답

by ggyongi 2022. 1. 18.
반응형

스프링에서 응답 데이터를 만드는 3가지 방법

1. 정적 리소스 : 웹브라우저에 정적인 HTML, CSS, JS 제공할 때는 정적 리소스 사용

2. 뷰 템플릿 사용 : 웹브라우저에 동적인 HTML 제공할 때는 뷰 템플릿 사용

3. HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 보냄

 

정적 리소스

정적 리소스 경로 : src/main/resources/static

파일 경로가 src/main/resources/static/basic/hello-form.html라면

웹브라우저에서 다음을 실행하면 된다. http://localhost:8080/basic/hello-form.html

 

뷰 템플릿

뷰 템플릿 경로 : src/main/resources/templates

@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";
    }


    @RequestMapping("/response/hello")
    public void responseViewV3(Model model) {
        model.addAttribute("data", "hello!");
    }

}

1. String을 반환하는 경우

@ResponseBody가 없으면 response/hello로 뷰 리졸버가 실행되고 뷰를 찾고, 렌더링 됨.

@ResponseBody가 있으면 HTTP 메시지 바디에 resonse/hello라는 문자가 직접 입력됨

 

2. Void를 반환하는 경우(권장되는 방법이 아님)

@Controller가 있고, HttpServletResponse, OuntputStream(Writer) 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용하게 됨

 

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

v1. HttpServletResponse 객체에 직접 메시지를 담아 전달

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

v2. HttpEntity를 상속받는 ResponseEntity를 사용 - 메시지뿐만 아니라 응답 코드도 설정 가능

더보기
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
    return new ResponseEntity<>("ok", HttpStatus.OK);
}

v3. @ResponseBody 사용

더보기
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
    return "ok";
}

 

JSON

v1. ResponseEntity 사용 : 후에 HTTP 메시지 컨버터가 JSON 형식으로 바꿔줌

더보기

@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1() {
    HelloData helloData = new HelloData();
    helloData.setUsername("kim");
    helloData.setAge(20);
    return new ResponseEntity<>(helloData, HttpStatus.OK);
}

v2. ResponseEntity는 안쓰고 싶은데 응답코드는 넣고 싶다면? => @ResponseStatus 어노테이션을 사용

더보기
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
    HelloData helloData = new HelloData();
    helloData.setUsername("kim");
    helloData.setAge(20);
    return helloData;
}

 

*@RestController

해당 컨트롤러에 모두 @ResponseBody가 적용됨. 따라서 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다. 이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.

 

 

---------------
참고: 인프런 김영한님 강의(스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술)

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글