일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Paging
- Docker
- JUnit5
- 자바
- yml
- HTTP
- 미션
- REDIS
- 우테코
- 세션
- 우아한세미나
- mock
- 프로그래머스
- AWS
- 스프링 부트
- AOP
- 의존성
- 백준
- 스프링부트
- MSA
- 우아한테크코스
- 서블릿
- 코드리뷰
- CircuitBreaker
- 레벨2
- 프리코스
- 트랜잭션
- Level2
- Spring Batch
- JPA
- Today
- Total
늘
@RestController와 @ResponseBody없이 json으로 통신하는 방법 본문
ResponseEntity의 body에 객체를 넣고 보내주면 json형식으로 주고받아진다.
@Controller
public class HelloController {
@GetMapping(path = "/hello")
public ResponseEntity<MoveDto> hello() {
MoveDto moveDto = new MoveDto("start", "finish");
return ResponseEntity.ok(moveDto);
}
}
@Controller를 통해서 Json이 반환되는 현상이 발생했습니다..
흔히들 알기론 controller는 데이터를 Model에 담고 반환할 view를 찾는 방식이고
restController는 단순히 json형식의 데이터만 주고받는 것으로 알고 있습니다. 그리고 RestController는 Controller+ResponseBody로 이루어져 있죠.
따라서 JSON형식으로 보내줄 때는 RestController를 사용하는 것이 좋다고 알고 있습니다.
그런데 우테코 체스 미션도중 @Controller 어노테이션을 주고 @ResponseBody를 걷어냈는데도 정상적으로 application/json형식으로 통신이 되더라고요..
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으로 나오게 된다.
따라서 Json으로 통신할 일이 있다면 @RestController를 활용하자
Reference
https://stackoverflow.com/questions/18385361/return-json-for-responseentitystring
'백앤드 개발일지 > 스프링부트' 카테고리의 다른 글
@Mock vs @MockBean vs @InjectMocks (1) | 2022.05.31 |
---|---|
[Spring bean lifecycle, hook]빈 생명주기 (0) | 2022.05.23 |
@RequestBody와 @ModelAttribute 차이 (0) | 2022.04.27 |
[Gradle] runtimeOnly와 implementation와 testImplementation의 차이 (0) | 2022.03.31 |
[아키텍처] 계층형 아키텍처와 MSA (2) | 2022.02.11 |