@RestController와 @ResponseBody없이 json으로 통신하는 방법 본문

백앤드 개발일지/스프링부트

@RestController와 @ResponseBody없이 json으로 통신하는 방법

giron 2022. 4. 30. 00:07
728x90

ResponseEntity의 body에 객체를 넣고 보내주면 json형식으로 주고받아진다.

@Controller
public class HelloController {

    @GetMapping(path = "/hello")
    public ResponseEntity<MoveDto> hello() {
        MoveDto moveDto = new MoveDto("start", "finish");
        return ResponseEntity.ok(moveDto);
    }
}

json

 

@Controller를 통해서 Json이 반환되는 현상이 발생했습니다..

 

흔히들 알기론 controller는 데이터를 Model에 담고 반환할 view를 찾는 방식이고

restController는 단순히 json형식의 데이터만 주고받는 것으로 알고 있습니다. 그리고 RestController는 Controller+ResponseBody로 이루어져 있죠.
따라서 JSON형식으로 보내줄 때는 RestController를 사용하는 것이 좋다고 알고 있습니다.

 

그런데 우테코 체스 미션도중 @Controller 어노테이션을 주고 @ResponseBody를 걷어냈는데도 정상적으로 application/json형식으로 통신이 되더라고요.. 

 

ResponseEntity내부를 보면 아래와 같이 HttpEntity를 상속받았습니다.

ResponseEntity
HttpEntity

HttpEntity를 보면 단순히 제네릭 타입으로 body를 갖는 모습입니다. 어디를 봐도 @ResponseBody의 흔적은 찾을 수 없었습니다. 

그렇다면 어째서 ResponseEntity의 body에 객체를 담으면 자동으로 json형식으로 통신이 될까요?

(..이 부분은 아직 찾지 못했습니다..😭 관련 문서를 찾기가 어렵네요..)


그렇다면 RestController를 안 써도 될까? 어차피 ResponseEntity로 감싸면 Header, Status, body까지 다 관리해줄 수 있으니..

1. ResponseEntity를 사용하지 않고 다른 api 포맷을 사용해서 보내고 싶을 때가 있다. 그럴 때를 대비해서 RestController를 사용하는 게 안전하다. (물론 저 포멧또한 ResponseEntity에 감쌀수 있지만 이미 저러한 형태의 레거시가 있어서 RestController를 사용하는게 좋다고 한다! - 리뷰어)

 

2. 원시 타입을 보내면 text/plain으로 나오기 때문에 RestController를 써두자.

@Controller
public class HelloController {

    @GetMapping("/hello")
    public ResponseEntity<String> hello() {
        return ResponseEntity.ok().body("hello");
    }
}

위와 같은 방식으로 통신을 하면 아래처럼 Content-Type이 text/plain으로 나오게 된다.

text

따라서 Json으로 통신할 일이 있다면 @RestController를 활용하자

 

Reference

https://stackoverflow.com/questions/18385361/return-json-for-responseentitystring

728x90
Comments