ResponseEntity 를 사용 블로그 포스팅에 앞서ResponseBody부터 간단하게 설명하자면
즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해준다.
회원가입을 기준으로 설명드리자면
사용하기에 앞서 응답 객체 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