Validation
- 예외를 방지하기 위해 미리 검증하는 과정 (방어적 코드를 대신해서 사용할 수 있음)
- 검증해야 할 값이 많은 경우 코드의 길이가 길어짐
→ 횡단 관심사 (AOP 기반) : 핵심 기능과의 분리
- 흩어져 있는 경우 어디에서 검증하는지 알기 어려움
→ 재사용에 대한 한계가 있음
- 검증 로직이 변경되는 경우, 참조하는 클래스에서 로직이 변경되어야 하는 부분이 발생할 수 있음
- 메서드 호출 전/후에 필터링 및 검증 수행
# Validation 라이브러리 추가하기 (Gradle 빌드)
1. build.gradle 파일에 명시
1 2 3 4 | dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' // Validation // ... (나머지) } | cs |
2. build.gradle 파일 내 아무 곳이나 우클릭해서 메뉴 → [Gradle] → [Refresh Gradle Project] 클릭
관련 어노테이션
어노테이션 | 설명 |
@Valid 또는 @Validated | 해당 객체에 대해 유효성 검사 실행 |
@Size(max = 최대길이, min = 최소길이) | 문자 길이에 대한 제한 지정 |
@NotNull | null 불가 |
@NotEmpty | null, "" 불가 |
@NotBlank | null, "", " " 불가 |
@Max(최댓값) | 최댓값 지정 |
@Min(최솟값) | 최솟값 지정 |
@가 포함되어야 함 | |
@Past | 과거 날짜 |
@PastOrPresent | 오늘 or 과거 날짜 |
@Future | 미래 날짜 |
@FutureOrPresent | 오늘 or 미래 날짜 |
@Pattern | 정규식 적용 |
@AssertTrue / False | 별도 로직 적용 |
# 오류 발생 시 생성되는 defaultMessage 직접 설정하기
: @어노테이션(message = "메세지")
POST/PUT 방식일 때 유효성 검사
- key-value 구조 사용 시, 매개변수에 제약조건 어노테이션 지정
+ 클래스 상단부에 반드시 @Validated 지정
- DTO 형식 사용 시, 매개변수에 @Validated 선언
+ DTO의 멤버변수에 제약조건 어노테이션 지정
DTO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Data @NoArgsConstructor @AllArgsConstructor @Builder // 빌더패턴 자동 생성 public class User { private String name; @Min(10) private int age; // message 지정 @Email(message = "이메일 형식이 틀렸습니다.") private String email; private String phoneNumber; } | cs |
Controller
1 2 3 4 5 6 7 | @PostMapping("/user2") public ResponseEntity<User> user2(@Valid @RequestBody User user) { // 관점 지향 패러다임 추가 // AOP 기반의 Valid 라이브러리를 활용하면 공통적으로 들어가야 하는 부분의 코드를 분리시킬 수 있음 return ResponseEntity.ok(user); } | cs |
GET/DELETE 방식일 때 유효성 검사
- key-value 구조 사용 시, 매개변수에 제약조건 어노테이션 지정
+ 클래스 상단부에 반드시 @Validated 지정
- DTO 형식 사용 시, 매개변수에 @Validated 선언
+ DTO의 멤버변수에 제약조건 어노테이션 지정
DTO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Data @NoArgsConstructor @AllArgsConstructor @Builder // 빌더패턴 자동 생성 public class User { private String name; @Min(10) private int age; // message 지정 @Email(message = "이메일 형식이 틀렸습니다.") private String email; private String phoneNumber; } | cs |
Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @RestController @Validated // <- GET 방식일 때에는 컨트롤러 상단부에 @Validated를 반드시 지정 public class UserController { // GET 방식일 때, 파라미터 앞에 어떤 유효성 검사를 할지 지정해주어야 함 @GetMapping("/user") public User user(@Size(min = 2) @RequestParam String name, @NotNull @Min(1) @RequestParam Integer age) { User user = new User(); user.setAge(age); user.setName(name); return user; } // object mapper를 통해서 파싱 처리하고 싶다면 @GetMapping("/user2") public User user2(@Valid User user) { return user; } } | cs |
'Java > Spring Boot' 카테고리의 다른 글
[Spring Boot] 예외 처리 (exception) (0) | 2023.04.12 |
---|---|
[Spring Boot] Validation 관련 : BindingResult 클래스 (0) | 2023.04.11 |
[Spring Boot] AOP (관점 지향 프로그래밍) ★ (0) | 2023.04.11 |
[Spring Boot] ResponseEntity (0) | 2023.04.11 |
[Spring Boot] IoC (제어의 역전) / DI (의존성 주입) ★ (0) | 2023.04.11 |