개발자일지/Spring

Spring MVC 1편 - MVC 기본기능(응답+)

어쩌다한번 2022. 3. 12. 11:18

이번에는 응답에 대해서 자세하게 알아본다

 

응답도 세가지로 나뉜다

1. html, css등 정적 텍스트

2. 뷰 템플릿을 통한 동적 텍스트

3. API를 위한 데이터

@Controller
public class ResponseViewController {
	
    //ModelAndView 사용
    @RequestMapping("/response-view-v1")
    public ModelAndView responseViewV1(){
        ModelAndView mav = new ModelAndView("response/hello")
                .addObject("data","Hi Hi~");
        return mav;
    }
    //Model 사용 후 String으로 반환
    //Controller에 String을 반환하면 view의 논리적 이름이 된다.
    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model){
        model.addAttribute("data","Hi hi!");
        return "response/hello";
    }
	//요청 URL과 실행할 URL이 같은 경우 생략 가능
    @RequestMapping("/response/hello")
    public void responseViewV3(Model model){
        model.addAttribute("data","Hi hi!");
    }
}

세번째의 경우 조건이 더 있는데

HttpServletResponse나 OutputStream(Writer)같은 HTTP 메시지 바디를 처리하는

파라미터가 없어야한다. 이 경우 요청 URL을 참고해서 논리 뷰 이름으로 사용한다.

- 이 방식은 명시성이 떨어지고 조건도 까다로워서 권장하지 않는다고 한다.

 

또 두번째 방법에서 @ResponseBody를 사용하면 그냥 텍스트로 바로 출력해버린다.

 

HTTP API

 

@Slf4j
@Controller
public class ResponseBodyController {

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

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

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

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

        return helloData;
    }
}

마지막처럼 @ResponseBody로 객체를 반환하는 것이 가장 편하지만

조건에 따라 동적으로 변환할 필요가 있으면 ResponseEntity를 사용하면 된다.

 

또 메서드마다 @ResponseBody를 붙이지 않고

@Controller대신에 @RestController를 사용하면

모든 메서드에 @ResponseBody가 적용된다. 따라서 뷰 템플릿에 사용하는 것이 아니라

Rest API를 만들 때 사용하는 컨트롤러이다.