3부

groups을 하지 않고 Dto의 구조를
변경해 유효성검사를 하는 예제 입니다.


 

기존 구조

1부와 2부에서 소개된 구조는 groups에 클래스가 늘어나면 늘어날 수록, 유효성검사와 안하는 필드가 많을 수록 복잡하고 가독성이 떨어지는 단점이 있습니다. 

@PostMapping("/userUpdateTest")
public void UserNameUpdate(@RequestBody @Validated(UserValidGroup.UserUpdate.class) UserRequestDto userRequestDto) {
}

@PostMapping("/userCreatTest")
public void UserCreate(
        @RequestBody
        @Validated(UserValidGroup.UserCreate.class) UserRequestDto userRequestDto) {
}
@Email(groups = { UserValidGroup.UserUpdate.class, UserValidGroup.UserCreate.class }, message = "이메일 형식이 아닙니다.")
private String email;

@NotBlank(groups = UserValidGroup.UserCreate.class, message = "패스워드는 공백만 있으면 안됩니다.")
private String password;

@NotNull(groups = { UserValidGroup.UserUpdate.class, UserValidGroup.UserCreate.class }, message = "name은 null이여서는 안됩니다.")
private String name;

@Min(groups = UserValidGroup.UserCreate.class, value = 19, message = "나이는 19세 이상만 가능합니다.")
private int age;

 

 

변경된 구조

변경된 구조는 중복되는 필드는 여러개 생성은 되지만 저장하는 메소드에는 Create라는 클래스만 사용하고 업데이트하는 메소드에는 Update라는 클래스만 사용하여 좀 더 (개인적으로) 가독성이 높아지고 유지보수하기가 쉬워졌다고 생각한다.

@PostMapping
public void saveValid(@RequestBody @Valid UserRequestV2Dto.Create create){

}

@PutMapping("/{id}")
public void updateValid(@RequestBody @Valid UserRequestV2Dto.Update update, @PathVariable Long id){

}

@DeleteMapping("/{id}")
public void deleteValid(@PathVariable Long id){

}
public class UserRequestV2Dto {

    @Getter
    @Setter
    public static class Create {

        @Email(message = "이메일 형식이 아닙니다.")
        private String email;

        @NotBlank(message = "패스워드를 입력해주세요.")
        private String password;

        @NotBlank(message = "이름을 입력해주세요.")
        private String name;

        @Min(value = 19, message = "19미만은 가입할 수 없습니다.")
        private int age;
    }

    @Getter
    @Setter
    public static class Update {

        @Email(message = "이메일 형식이 아닙니다.")
        private String email;

        @NotBlank(message = "패스워드를 입력해주세요.")
        private String password;

        @NotBlank(message = "이름을 입력해주세요.")
        private String name;

        @Min(value = 19, message = "19미만은 가입할 수 없습니다.")
        private int age;
    }

    @Getter
    @Setter
    public static class Response {

        @Email(message = "이메일 형식이 아닙니다.")
        private String email;

        @NotBlank(message = "패스워드를 입력해주세요.")
        private String password;

        @NotBlank(message = "이름을 입력해주세요.")
        private String name;

        @Min(value = 19, message = "19미만은 가입할 수 없습니다.")
        private int age;
    }
}

 

 

복사했습니다!