본문 바로가기
백엔드 자료집/Spring

[Spring] Spring 기능

by cogito30 2025. 3. 5.

Validation

- validation: 문제 발생을 방지하기 위해 미리 검증하는 과정

- Validation 구현은 서비스 로직과 분리 되어야 함

- AssertTrue/AssertFalse와 같은 method 지정 혹은 ConstraintValidator를 적용하여 재사용이 가능한 Validation 적용 가능

 

(Validation Annotation)

더보기
Annotation Description
@Size 문자 길이 측정. Int Type 불가
@NotNull Null 불가
@NotEmpty Null, "" 불가
@NotBlank Null, "", " "(공백) 불가
@Past 과거 날짜
@PastOrPresent 금일 또는 과거 날짜
@Future 미래 날짜
@FutureOrPresent 금일 또는 미래 날짜
@Pattern 정규식 적용
@Max 최댓값 제한
@Min 최솟값 제한
@AssertTrue / @AssertFalse 사용자 정의 검증
@Valid 해당 object validation 실행

(Validation 구현 예시)

- build.gradle에 implementation("org.springframework.boot:spring-boot-starter-validation") 적용

- 정규표현 예시: "^\\d{2, 3}-\\d{3, 4}- \\d{4}$"

- 재활용을 위해서는 Custom Validation Annotation 작성하여 사용(Interface)

더보기

(Class: User)

public class User {
    @NotBlank
    private String name;
    
    @Min(value = 0)
    @Max(value = 100)
    private int age;
    
    @Email
    private String email;
    
    @Pattern(regexp = "^\\d{2, 3}-\\d{3, 4}- \\d{4}$", message="핸드폰 양식을 확인하세요")
    private String phoneNumber;
    
    //@Size(min = 6, max = 6)
    @YearMonth(pattern = "yyyyMM")
    private String reqYearMonth;

    @AssertTrue(message = "yyyyMM의 형식을 맞춰주세요" // Boolean 반환 메서드는 is 접두어가 붙어야 동작
    public boolean isReqYearMonthValidation() {
        try {
            LocalDate localDate = LocalDate.parse(getReqYearMonth() + "01", DataTimeFormatter.ofPattern("yyyyMMdd"));
        
        } catch (Exception e) {
            return false;
        }
        
        return true;
    }
    
    // getter
    // setter
    // toString
}

(Class: ApiController)

@RestController
@RequestMapping("/api")
public class ApiController {
    @PostMapping("/user")
    public ResponseEntity user(@Valid @RequestBody User user, BindingResult bidingResult) { // bindingResult는 에러값이 담김
    
        System.out.println(user);
        
        if(user.getAge() >= 90) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(user);
        }
        
        if(buindintReseult.hasErrors()) {
            StringBuilder sb = new StringBuilder();
            bindingResult.getAllErrors().forEach(objectError -> {
                FieldError field = (FieldError) objectError;
                String message = objectError.getDefaultMessage();
                
                sb.append("field : " + field.getField());
                sb.append("message : " + message);
            });
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).bogy(sb.toString());
        }
        
        
        return ResponseEntity.ok(user);
    }
}

(Interface: YearMonth)

@Conatraint(validateBy = {})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface YearMonth {
    String message() default "{javax.validation.constraints.Email.message}" ;
    
    Class<?>[] groups() default { } ;
    
    Class<? extends Payload>[] payload() default { } ;
    
    String pattern() default "yyyyMM" ;

}

(Class: YearMonthValidator)

public class YearMonthValidator implements ConstraintValidator<YearMonth, String> {

}

 

 

Exception

 

Filter Interceptor

 

비동기 처리

 

'백엔드 자료집 > Spring' 카테고리의 다른 글

[Spring] Spring 핵심 개념  (0) 2025.03.04
[Spring] 참고자료  (0) 2025.03.03