본문 바로가기
Programming

Spring Boot Model validation 관련 애노테이션

by BTC_동동 2024. 1. 12.

베하!

새로운 한 해가 시작되었습니다.

저도 아직 마음만 먹고 시작을 하지 못했답니다. ㅠㅠ

하지만 반드시 새해라고 무언가를 해야한다는 압박에서 벗어나서 늘 잘해왔던 여러분들이 이번 해도 똑같이 꾸준하기만 한다면 다른 목표를 달성하는 것보다 더 좋은 여러분과 제가 되지 않을까 생각합니다.

 

 

시작말

오늘 들고 온 이야기 주제는 Spring boot에서 웹 백엔드를 개발할 때 객체를 통해 Request를 받아 처리하는 경우가 많죠?

그럴 때 우리는 model 혹은 vo, dto class에 valid 애노테이션에게 알려줄 제한사항을 쉽게 설정해서 유효성을 검사하기도 합니다.

저는 그 유효성 검사를 도와주는 애노테이션들을 가볍게 정리하려 합니다. 사실 진작에 알았다면 굳이 controller나 service 레이어에서 별도의 작업 없이 편하게 개발할 수 있었겠지만 저도 해당 애노테이션에 대해 이제 알기 시작했습니다 ㅎㅎ

Validation 애노테이션 정리

@Null

@Null 애노테이션은 해당 필드가 반드시 null이어야 함을 나타냅니다.

javaCopy code
public class ExampleRequest {
    @Null
    private String nullableField;
}

@NotNull

@NotNull 애노테이션은 해당 필드가 반드시 null이 아니어야 함을 나타냅니다. 빈 문자열(""," ")은 허용됩니다.

public class ExampleRequest {
    @NotNull
    private String notNullField;
}

@NotEmpty

@NotEmpty 애노테이션은 해당 필드가 반드시 null 또는 빈 문자열이 아니어야 함을 나타냅니다. null, ""을 허용하지 않습니다. " "는 허용합니다.

public class ExampleRequest {
    @NotEmpty
    private String notEmptyField;
}

@NotBlank

@NotBlank 애노테이션은 해당 필드가 반드시 null, 빈 문자열 또는 공백이 아니어야 함을 나타냅니다. null, "", " " 모두 허용하지 않습니다. 문자열에만 적용되는 애노테이션 입니다. 다른 type에 적용하면 컴파일 에러는 발생하지 않지만 request와 동시에 에러가 발생합니다.

javaCopy code
public class ExampleRequest {
    @NotBlank
    private String notBlankField;
}

@Email

@Email 애노테이션은 해당 필드가 유효한 이메일 주소 형식을 가져야 함을 나타냅니다. 빈 문자열은 허용됩니다.

javaCopy code
public class ExampleRequest {
    @Email
    private String email;
}

@Pattern

@Pattern 애노테이션은 정규식 패턴에 해당해야 함을 나타냅니다.

@Email 보다 아래 나올 @Patten을 통한 정규식 검사를 더 많이 사용합니다.

javaCopy code
public class ExampleRequest {
    @Pattern(regexp = "[a-zA-Z0-9]+")
    private String patternField;
		@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\\\.)+[a-zA-Z]{2,7}$")
    private String email;
}

@Size

@Size 애노테이션은 필드의 길이를 제한할 때 사용됩니다. null 체크는 하지 않는 것에 유의해주세요.

javaCopy code
public class ExampleRequest {
    @Size(min = 2, max = 10 , message="메시지 길이를 확인해주세요")
    private String sizedField;
}

@Max

@Max 애노테이션은 해당 필드의 값이 지정된 최대값 이하여야 함을 나타냅니다.

javaCopy code
public class ExampleRequest {
    @Max(value = 100)
    private int maxValue;
}

@Min

@Min 애노테이션은 해당 필드의 값이 지정된 최소값 이상이어야 함을 나타냅니다.

javaCopy code
public class ExampleRequest {
    @Min(value = 10)
    private int minValue;
}

@Positive, @PositiveOrZero, @Negative, @NegativeOrZero

이 애노테이션들은 각각 양수, 양수 또는 0, 음수, 음수 또는 0의 값을 나타냅니다.

javaCopy code
public class ExampleRequest {
    @Positive
    private int positiveValue;

    @PositiveOrZero
    private int positiveOrZeroValue;

    @Negative
    private int negativeValue;

    @NegativeOrZero
    private int negativeOrZeroValue;
}

@Future, @Past

@Future 애노테이션은 해당 필드의 값이 현재보다 미래의 날짜여야 함을 나타냅니다. 반대로, @Past 애노테이션은 현재보다 과거의 날짜여야 함을 나타냅니다. null은 체크하지 않습니다.

javaCopy code
public class ExampleRequest {
    @Future
    private Date futureDate;

    @Past
    private Date pastDate;
}

@AssertFalse, @AssertTrue

이 애노테이션들은 각각 해당 필드의 값이 false 또는 true 여야 함을 나타냅니다. null은 체크하지 않습니다.

javaCopy code
public class ExampleRequest {
    @AssertFalse
    private boolean assertFalseValue;

    @AssertTrue
    private boolean assertTrueValue;
}

각 애노테이션의 사용 예시와 함께 해당 애노테이션에서 발생할 수 있는 예외를 명시하여 데이터의 유효성을 적절히 검사할 수 있습니다.

BindingResult

이번에 관련 vaildation 애노테이션들을 공부하다가 알게된 것이 BindingResult였습니다.

**BindingResult**는 Spring에서 데이터 바인딩 및 유효성 검사를 수행한 결과를 담는 객체입니다. 주로 컨트롤러의 메소드에서 **@Valid**나 @Validated 애노테이션과 함께 사용되어 유효성 검사 결과를 확인하고 처리하는 데에 활용됩니다.

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExampleController {

    @PostMapping("/example")
    public ResponseEntity<String> exampleMethod(@RequestBody @Valid ExampleRequest request, BindingResult result) {
        if (result.hasErrors()) {
            // 유효성 검사 에러가 있을 경우 처리
            return ResponseEntity.badRequest().body("Validation failed");
        }
        // 메소드 내용
    }
}
  • @RequestBody @Valid ExampleRequest request: 해당 메소드에 전달되는 요청 바디를 ExampleRequest 객체로 매핑하고, @Valid 애노테이션을 통해 유효성 검사를 수행합니다.
  • BindingResult result: 유효성 검사 결과를 담는 객체입니다.
  • result.hasErrors(): 유효성 검사에서 에러가 발생했는지 여부를 확인합니다.
if (result.hasErrors()) {
    List<FieldError> errors = result.getFieldErrors();
    for (FieldError error : errors) {
        String fieldName = error.getField();
        String errorMessage = error.getDefaultMessage();
        // 에러 메시지 처리 로직
    }
}
  • result.getFieldErrors(): 유효성 검사에서 발생한 각 필드에 대한 에러 목록을 얻습니다.
  • error.getField(): 발생한 에러와 관련된 필드의 이름을 얻습니다.
  • error.getDefaultMessage(): 발생한 에러에 대한 기본 메시지를 얻습니다.

BindingResult 를 사용하면 컨트롤러에서 유효성 검사 결과를 쉽게 확인하고 웹 client에게 적절히 응답을 커스텀 할 수 있으며, 필요한 로직에 따라 에러를 처리할 수 있습니다.

오늘의 준비한 내용은 여기까지 입니다.

 

 

 

모두 새해 복 많이 받으시고 2024년도 화이팅 해보자구요!

'Programming' 카테고리의 다른 글

[Mybatis] For input string 에러  (1) 2024.01.17
HTTP 상태 코드 정리  (2) 2024.01.13
Overloading과 Overriding의 차이  (1) 2024.01.05
LLM 이란?  (1) 2024.01.05
[MyBatis] Collection과 Association  (0) 2023.12.22

댓글