@RequestBody vs @ResponseBody (+ Map)

박영준·2023년 7월 2일
0

Spring

목록 보기
33/58

일반적으로 웹에서 화면 전환이 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다.

비동기 통신에서는 다음과 같은 방식으로 데이터를 주고받는다.

  • Client : Server 로 요청 메시지의 본문(Body)에 데이터를 담아서 보내야 한다

    • 이 떄의 body 를 Request Body 라고 한다
      • JSON 형식으로 담긴다
  • Server : Client 에 응답하기 위해, 응답 메시지의 본문(Body)에 데이터를 담아서 보내야 한다

    • 이 떄의 body 를 Response Body 라고 한다
      • JSON 형식으로 담긴다

(참고: 비동기 통신 vs 동기 통신)

@RequestBody

1. 정의

비동기 통신에서 쓰이는 Body 안의 데이터(JSON객체)를 --> 자바 객체(VO)로 변환

@ResponseBody

1. 정의

보내려는 자바 객체(VO)를 --> 데이터(JSON객체)로 바꿔 Body 안에 넣어준다

2. 단점

  • @ResponseBody 만 사용시, 별도의 뷰를 제공하지 않고 데이터만 전송

  • Header(HTTP 규격 구성 요소 中 하나)에 대해서 유연하게 설정을 할 수 없다

이 문제들을 해결해주는 것이 ResponseEntity

Map

1. 사용 가능한 이유

@RequestBody 와 @ResponseBody 를 사용하면서, Map 으로 데이터를 주고받을 수 있다.
Map 은 key:value 값을 저장하고, JSON 형식 또한 key 와 value 를 가지기 때문이다.

참고: 자바 컬렉션 프레임워크 - Map 인터페이스

2. 예시

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;
    }
  • @RequestBody 를 사용해서, Map 형태로 데이터를 요청한다.
    • deleteResponse 변수에 "success"라는 key 값과 deletePost메서드를 호출한 결과인 value 를 담는다.

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는 없습니다.")
        );
    }
  • Controller 에서 deletePost메서드를 호출한 결과인 value 에 담길 반환값이다.
  • 성공할 경우 : { "success" : true }
  • 실패할 경우 : { "success" : false }

참고: [Spring] @Controller와 @RestController의 차이

profile
개발자로 거듭나기!

0개의 댓글