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 |
댓글