스프링 부트를 공부하기 위해 간단한 Todo 관리 앱을 만드는 것을 연습하는 과정 중 사소한 오류로 시간을 2시간을 버린 기록을 남긴다.
ResponseEntity의 body에 왜 DTO가 안들어가는거야!!?
어플리케이션 첫 번째 API로 회원가입 부분을 만드는 과정에서 문제가 발생했다. 내가 의도한 것은 사용자의 입력을 받아서 회원가입을 처리하고, 응답값을 ResponseEntity<CommonResponseDto> 로 보내주는 것이었다. Postman을 이용해 테스트를 하는데 이상하게 Response body에 아무런 값이 들어가 있지 않았다. 코드는 아래와 같다.
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL) //Json으로 만들 때 NULL 이 아닌 값만 만든다.
public class CommonResponseDto {
@Pattern(regexp = "^[a-z0-9]{4,11}$")
private String message;
@Pattern(regexp = "^[a-zA-Z0-9]{8,16}$")
private Integer statusCode;
}
위의 CommonResponseDto를 ResonseEntity에 담아서 보내기 위해 컨트롤러에서 아래의 코드로 처리해주었다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
public class UserController {
private final UserService userService;
@PostMapping("/signup")
public ResponseEntity<CommonResponseDto> signup(@RequestBody @Valid SignupRequestDto requestDto, BindingResult bindingResult){
if(bindingResult.hasFieldErrors()){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
String message = "";
for(FieldError fieldError : fieldErrors){
message += "<< " +fieldError.getField() + " : " + fieldError.getDefaultMessage() + ">> ";
}
return ResponseEntity.badRequest().body(new CommonResponseDto(message,HttpStatus.BAD_REQUEST.value()));
}
try{
userService.signup(requestDto);
}catch(IllegalArgumentException e){
return ResponseEntity.badRequest().body(new CommonResponseDto(e.getMessage(),HttpStatus.BAD_REQUEST.value()));
}
return ResponseEntity.status(HttpStatus.CREATED.value()).body(new CommonResponseDto("회원가입 완료", HttpStatus.CREATED.value()));
}
}
그런데 말입니다!!!!!
이상하게 Postman으로 올바르게 요청을 보내도 응답 바디에 아무것도 나타나지 않았다..
한참을 찾아보다가 결과를 알게되었다..
범인은 바로!! <Getter>
범인은 CommonResponseDto에 Getter를 설정해주지 않았기 때문이다. 정확한 이유는 모르겠지만, 추론하건데, ResponseEntity를 JSON으로 직렬화(Serialize) 하는 과정에서 Getter가 존재하지않아 null값으로 들어간 것 같다. 수정한 코드는 아래와 같다.
@NoArgsConstructor
@AllArgsConstructor
@Getter//@@@@@@@@@@@@@@@@@@@@@@@@@요놈시끼@@@@@@@@@@@@@@@@@@
@JsonInclude(JsonInclude.Include.NON_NULL) //Json으로 만들 때 NULL 이 아닌 값만 만든다.
public class CommonResponseDto {
@Pattern(regexp = "^[a-z0-9]{4,11}$", message = "경고 : a~z, 0~9 를 포함한 4~11자리")
private String message;
@Pattern(regexp = "^[a-zA-Z0-9]{8,16}$", message = "경고 : a~z(A-Z), 0~9 를 포함한 8~15자리")
private Integer statusCode;
}
@Getter를 빼먹지 말자.. 2시간이 아까워서 앞으로는 절대 까먹지 않을 것 같다.
'Spring Boot' 카테고리의 다른 글
Spring AOP / AOP에 대하여 (0) | 2024.03.12 |
---|---|
테스트 코드는 어디 부터 시작해야할까? (0) | 2024.02.24 |
@RequestParam, @RequestBody, @PathVariable 방식 (0) | 2024.01.24 |