Spring Boot

ResponseEntity에 body로 DTO를 보낼 때 주의할 점

OneMoreThing 2024. 2. 20. 21:12

스프링 부트를 공부하기 위해 간단한 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으로 올바르게 요청을 보내도 응답 바디에 아무것도 나타나지 않았다..

왜 Response Body에 아무것도 없는 것이냐!!! 대체 왜!!

 

한참을 찾아보다가 결과를 알게되었다..

 

범인은 바로!! <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시간이 아까워서 앞으로는 절대 까먹지 않을 것 같다.