베하!
새로운 한 해가 시작되었습니다.
저도 아직 마음만 먹고 시작을 하지 못했답니다. ㅠㅠ
하지만 반드시 새해라고 무언가를 해야한다는 압박에서 벗어나서 늘 잘해왔던 여러분들이 이번 해도 똑같이 꾸준하기만 한다면 다른 목표를 달성하는 것보다 더 좋은 여러분과 제가 되지 않을까 생각합니다.
시작말
오늘 들고 온 이야기 주제는 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 애노테이션은 해당 필드가 유효한 이메일 주소 형식을 가져야 함을 나타냅니다. 빈 문자열은 허용됩니다.
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 |
댓글