ResponseEntity란?

yookyungmin·2023년 10월 1일
0

ResponseEntity 를 사용 블로그 포스팅에 앞서ResponseBody부터 간단하게 설명하자면

@ResponseBody

  • @ResponseBody는 HTTP 규격에 맞는 응답을 만들어주기 위한 어노테이션 이다.
  • HTTP 요청을 객체로 변환하거나, 객체를 응답으로 변환하는 HttpMessageConverter 를 사용합니다.
  • @ResponseBody을 이용하면 자바 객체를 HTTP 응답 body로 전송할 수 있다.

ResponseEntity란

  • HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이고,

즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해준다.

  • ResponseEntity를 사용하는 이유는 HTTP response header의 융통성있는 추가가 가능하기 때문.

회원가입을 기준으로 설명드리자면

사용하기에 앞서 응답 객체 DTO를 만들어주었습니다

@ToString
    @Getter
    @Setter
    public static class JoinRespDto{
        private Long id;
        private String username;
        private String fullname;

        public JoinRespDto(User user) {
            this.id = user.getId();
            this.username = user.getUsername();
            this.fullname = user.getFullname();
        }
    }
    

외부 클래스의 인스턴스 생성없이 내부 클래스로 접근 하기 위해 static class를 로 작성 하였습니다.

@RequiredArgsConstructor
@Getter
public class ResponseDto<T> { //응답의 dto는 수정할일이 없어서 final
    private final Integer code;//1. 성공 -1 실패
    private final String msg;
    private final T data;
}

ResponseDTO 입니다.

@RequiredArgsConstructor
@RequestMapping("/api")
@RestController
public class UserController {
    private final UserService userService;

    @PostMapping("/join") // 시큐리티 인증이 필요없는 주소
    public ResponseEntity<?> join(@RequestBody @Valid JoinReqDto joinReqDto, BindingResult bindingResult){
        //joinReqDto 통과못하면 bindingResult에 담긴다.
        JoinRespDto joinRespDto = userService.회원가입(joinReqDto);
        return new ResponseEntity<>(new ResponseDto<>(1, "회원가입 성공", joinRespDto), HttpStatus.CREATED);//201리턴
    }
}

컨트롤러 부분입니다. 회원가입에 성공하게 된다면 new ResponseEntitiy<> 객체의 매개변수로 new ResponseDto와 HttpStatus 를 넘겨줍니다.

회원가입에 성공을 했을 시 사진과 같이 ResponseDto 에 맞게 반환합니다.

이름 중복으로 회원가입에 실패 하게 된다면,

 @Transactional
    public JoinRespDto 회원가입(JoinReqDto joinReqDto){
        //1. 동일 유저네임 문제 검사
        Optional<User> userOp = userRepository.findByUsername(joinReqDto.getUsername());
        if(userOp.isPresent()){
            //유저네임 중복
            throw new CustomApiException("동일한 username이 존재합니다");
        }
        //2. 패스워드 인코딩+회원가입
        User userPS = userRepository.save(joinReqDto.toEntity(passwordEncoder));
        //persistence컨텍스트에 들어갔다온거라 ps를 붙임

        //3.dto 응답
        return new JoinRespDto(userPS);
    }

서비스 계층에서 커스텀 익셉션 핸들러를 통하여

사진과 같이 반환하게 됩니다.

ResponseBody를 사용했을 당시에 비동기 통신을 구현할 때 사용을 해보았는데,
ResponseEntity를 사용하면서 좀더 세밀하게 제어를 할수 있었던거 같습니다.

참고
https://tecoble.techcourse.co.kr/post/2021-05-10-response-entity/
https://velog.io/@poochii96/ResponseBody-vs-ResponseEntity

0개의 댓글