rhanziy

ResponseEntity객체와 @ResponseBody 본문

Java

ResponseEntity객체와 @ResponseBody

rhanziy 2023. 6. 1. 10:51

@ResponseBody

@ResponseBody 는 핸들러 메소드에 붙일 수 있는 어노테이션으로 컨트롤러가 데이터를 반환할 때
HttpMessageConverter 를 사용해서 자바 객체를 응답 본문(body) 메시지를 만들어 반환할 수 있게 도와준다.

@RestController를 사용하면 자동으로 모든 핸들러 메소드에 @ResponseBody가 적용된다..

@Controller
public class AccountController {

    @GetMapping("/accounts/{id}")
    @ResponseBody
    public Account handle(@PathVariable long id) {
        // ...
    }
}


@RestController 
public class AccountController {

    @GetMapping("/accounts/{id}")
    public Account handle(@PathVariable long id) {
        // ...
    }
}

 

  • 단점으로는 HTTP 규격 구성 요소 중 하나인 Header에 대해서 유연하게 설정 못함
  • 또한 Status도 메서드 밖에서 어노테이션을 사용하여 따로 설정을 해주어야한다는 점도 있다

 

@ResponseEntity

@ResponseEntity는 반환값에 상태코드와 응답메세지를 전달하는 등 좀 더 세밀한 제어가 필요한 경우 사용한다. 

 

@RestController
@RequestMapping("/api/refnews")
public class RefNewsApi {

    @PostMapping
    public ResponseEntity<News> createNews(@Valid @RequestBody News news,
                                           BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseEntity.badRequest().build();
        }

        return ResponseEntity.ok(news);
    }
}

 

※ ResponseEntity를 사용할 때는 생성자 대신 빌더를 사용하자

ResponseEntity 사용 시 생성자를 사용하면 HTTP 상태 코드를 하드 코딩으로 지정할 수 있기 때문에

잘못된 상태 코드를 넣을 수 있다. 물론 HttpStatus에 없는 코드를 넣게 되면 에러가 발생하긴 하지만 컴파일 타임이 아닌

런타임에 발생하기 때문에 좋지 않다. 따라서, ResponseEntity 에 있는 빌더를 사용하면 이를 방지하고 가독성도 좋은 코드를 얻을 수 있다.

 

* 생성자 사용
// OK인 200을 2000으로 오타 -> 런타임 에러
return new ResponseEntity<GameResponse>(gameResponse, headers, HttpStatus.valueOf(2000));

* 빌더 사용
return ResponseEntity.ok()
                    .headers(headers)
                    .body(gameResponse);

 

ResponseEntity API 참고


 

두 가지 모두 경우 http response 메시지의 body에 데이터를 첨부한다는 점은 동일하지만, ResponseEntity의 경우 http response 메시지의 header와 status(상태 코드)를 조작할 수 있다는 차이점이 있다.

@ResponseBody의 경우 파라미터로 객체를 받아 header를 변경하고,
@ResponseEntity의 경우 클래스 객체를 생성 후 객체에서 header 값을 변경한다.

'Java' 카테고리의 다른 글

Java - map의 개념과 hash table 동작원리  (0) 2023.07.20
이클립스 단축키  (0) 2023.07.10
Spring - @ModelAttribute (feat. @RequestParam)  (0) 2023.05.26
SQL - 페이징 기능 구현 쿼리  (0) 2023.04.27
Spring - 계층 구조  (0) 2023.04.25
Comments