velog에서 이전한 글 입니다.

DTO/LomBoK

@Getter
public class UserSignUpDto {
    ...
    private boolean admin = false;
    ...
}

boolean @getter 는 isAdmin() 으로 작성된다.
boolean값은 is로 시작하는게 보통이다. ex) OptionalType.isEmpty()/isPresent()

@Getter
@Setter
@ToString(callSuper = true)
public class PostUpdateDto extends PostUserDto {
    private Optional<String> title;
    private Optional<String> contents;

    public PostUpdateDto(String username, String password) {
        super(username, password);
    }
}
@AllArgsConstructor
@Getter
@Setter
@ToString
public class PostUserDto {
    @NotBlank
    private String username;
    @NotBlank
    private String password;
}

상속받았을 때 @ToString(callSuper = true)을 적용하면 부모까지 출력된다.
ex) PostUpdateDto(super=PostUserDto(username=choi0, password=abcd), title=Optional[hi2], contents=null)

 

@Getter/Setter는 부모 class와 무관하다. 생성자를 따로 작성해줘야 한다.
위와 같이 부모에 validate가 있어도 validate 잘 동작한다.

validation

implementation 'org.springframework.boot:spring-boot-starter-validation' 을 gradle에 추가한다.

(controller)
@PatchMapping("/{postId}")
public PostResponseDto patchPost(@PathVariable Long postId, @Valid PostUpdateDto requestDto, BindingResult bindResult) {
        List<FieldError> fieldErrors = bindResult.getFieldErrors();
        if(fieldErrors.size() > 0) throw new IllegalArgumentException("Dto fail");
        ...
    }

기본 DTO는 null값이 할당될 수 있었다. validate를 DTO에 적용하고 Controller에 명시하면 검증을 거치고 BindingResult를 통해 결과를 반환한다.
결과에서 Error가 있다면 던지고 @ExceptionHandler(Error.class) 에서 처리하는 등의 방법이 있다.