일반적으로 웹에서 화면 전환이 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다.
비동기 통신에서는 다음과 같은 방식으로 데이터를 주고받는다.
Client : Server 로 요청 메시지의 본문(Body)에 데이터를 담아서 보내야 한다
Server : Client 에 응답하기 위해, 응답 메시지의 본문(Body)에 데이터를 담아서 보내야 한다
비동기 통신에서 쓰이는 Body 안의 데이터(JSON객체)를 --> 자바 객체(VO)로 변환
보내려는 자바 객체(VO)를 --> 데이터(JSON객체)로 바꿔 Body 안에 넣어준다
@ResponseBody 만 사용시, 별도의 뷰를 제공하지 않고 데이터만 전송
Header(HTTP 규격 구성 요소 中 하나)에 대해서 유연하게 설정을 할 수 없다
이 문제들을 해결해주는 것이 ResponseEntity
@RequestBody 와 @ResponseBody 를 사용하면서, Map 으로 데이터를 주고받을 수 있다.
Map 은 key:value 값을 저장하고, JSON 형식 또한 key 와 value 를 가지기 때문이다.
Controller
@DeleteMapping("/post/{id}")
public @ResponseBody Map<String, Boolean> deletePost(@PathVariable Long id, @RequestBody Map<String, String> password) {
Map<String, Boolean> deleteResponse = new HashMap<>();
deleteResponse.put("success", postService.deletePost(id, password.get("password")));
return deleteResponse;
}
Service
public Boolean deletePost(Long id, String password) {
Post post = findPost(id);
if (post.getPassword().equals(password)) {
postRepository.delete(post);
return true;
}
return false;
}
private Post findPost(Long id) {
return postRepository.findById(id).orElseThrow(() ->
new IllegalArgumentException("선택한 post는 없습니다.")
);
}