Project/Study

Spring Boot 유효성 검사

by somida 2021. 7. 20.

Spring Boot 유효성 검사

클라이언트에서만 validation을 하게 될 경우 얼마든지 브라우저에서 조작이 가능하기 때문에, 클라이언트 뿐만 아니라 백엔드에서도 함께 유효성 검사를 진행해야한다.

그래서 Spring Boot에서 유효성 검사를 진행하였다.

 

코드

build.gradle

dependencies {
	...
	implementation 'org.springframework.boot:spring-boot-starter-validation:2.5.2'
    ...
}

 

User.java

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "email", "nickname"})
public class User extends BaseTimeEntity implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long id;

    private String nickname;

    private String email;

    private String password;

    // 양방향 연관 관계
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Subtitle> subtitleList = new ArrayList<>();

    // private String salt;
    @Builder
    public User(String nickname, String email, String password, List<Subtitle> subtitleList) {
        this.nickname = nickname;
        this.email = email;
        this.password = password;
        this.subtitleList = subtitleList;
    }
}

 

UserDto.java

  • @NotBlank
    • @NotNull : null만 허용하지 않음 ("" or " "는 허용)
    • @NotEmpty : null과 ""를 허용하지 않음(" "는 허용)
    • @NotBlank : null, "", " " 모두 허용하지 않음
  • @Email : 올바른 형식의 이메일 주소여야한다. (null도 valid로 간주하기 때문에 @NotBlank 삽입)
  • @Pattern  지정한 정규식과 대응되는 문자열이어야한다. (null도 valid로 간주한다)
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserDto {

    @NotBlank(message="닉네임은 필수 입력 값입니다.")
    private String nickname;

    @NotBlank(message="이메일은 필수 입력 값입니다.")
    @Email(message="이메일 형식에 맞지 않습니다.")
    private String email;

    @NotBlank(message="비밀번호는 필수 입력 값입니다.")
    @Pattern(regexp="^(?=.*[A-Za-z])(?=.*\\d)(?=.*[~!@#$%^&*()+|=])[A-Za-z\\d~!@#$%^&*()+|=]{8,16}",
            message = "비밀번호는 영문, 숫자, 특수기호가 적어도 1개 이상씩 포함된 8자 ~ 20자의 비밀번호여야 합니다.")
    private String password;

    public User toEntity() {
        return User.builder()
                .email(email)
                .nickname(nickname)
                .password(new BCryptPasswordEncoder().encode(password))
                .build();
    }

}

 

UserController.java

  • 원하는 api내 requestbody에 @Valid를 추가하면 사용할 수 있음
  • Errors의 hasErrors()를 통해서 error를 찾아낸다.
  • getFieldErrors()로 에러들 중 gerField(), getDefaultMessage() 로 무슨 필드에서 무슨 메세지를 보내는지 object에 담는다.
@PostMapping("/register")
    public ResponseEntity<BaseResponse> UserRegister(@Valid UserDto userDto, Errors error) {
        ...
        if (error.hasErrors()) {
            result.status = "FORBIDDEN";
            Map<String, String> errors = new HashMap<>();
            for(FieldError value : error.getFieldErrors()) {
                errors.put(value.getField(), value.getDefaultMessage());
            };
            result.object = errors;
            return new ResponseEntity<>(result, HttpStatus.FORBIDDEN);
        }
        ...
    }

 

 

 

 

 

 

 

 

반응형

'Project > Study' 카테고리의 다른 글

[React] Recoil  (0) 2021.07.29
[WebSocket] Spring Boot + React WebSocket 코드 구현  (0) 2021.07.26
Spring Session + Redis  (0) 2021.07.19
[IntelliJ] Spring 서버 재시작 없이 반영  (0) 2021.07.19
Spring Boot Annotation  (0) 2021.07.16

댓글