Spring Boot Validation으로 입력 데이터 검증하기 🚀
안녕, 친구들! 오늘은 정말 재미있고 유용한 주제에 대해 이야기해볼 거야. 바로 Spring Boot Validation을 사용해서 입력 데이터를 검증하는 방법에 대해서 말이야. 😎 이 기술은 우리가 개발하는 애플리케이션의 안정성과 신뢰성을 높이는 데 정말 중요한 역할을 해. 마치 우리가 재능넷에서 다양한 재능을 거래할 때, 서로의 신뢰를 확인하는 것처럼 말이야!
🎨 재능넷 팁: 프로그래밍 실력도 하나의 재능이에요! Spring Boot Validation 같은 고급 기술을 익히면, 재능넷에서 더 높은 가치의 서비스를 제공할 수 있답니다.
자, 이제 본격적으로 Spring Boot Validation의 세계로 들어가볼까? 준비됐어? 그럼 출발~! 🚀
1. Spring Boot Validation이 뭐야? 🤔
Spring Boot Validation은 말 그대로 우리 애플리케이션에 들어오는 데이터가 올바른지 확인하는 작업을 도와주는 도구야. 이게 왜 중요하냐고? 음... 상상해봐. 네가 재능넷에서 그림 그리기 수업을 신청했는데, 선생님이 연락처를 잘못 입력해서 연락이 안 되는 상황! 😱 이런 일이 없도록 하는 게 바로 데이터 검증의 역할이야.
Spring Boot Validation은 다음과 같은 일들을 해줘:
- 입력된 데이터가 올바른 형식인지 확인 (예: 이메일 주소가 진짜 이메일 주소 형식인지)
- 필수 입력 항목이 모두 채워졌는지 확인
- 숫자 데이터의 범위가 적절한지 확인 (예: 나이가 음수는 아닌지)
- 문자열의 길이가 적절한지 확인 (예: 비밀번호가 너무 짧지는 않은지)
이런 검증 작업을 우리가 일일이 코드로 작성하려면 정말 힘들겠지? 그래서 Spring Boot가 이 귀찮은 작업을 대신 해주는 거야. 우리는 그냥 몇 가지 어노테이션만 붙이면 돼. 완전 편하지 않아? 😄
💡 알아두면 좋은 점: Spring Boot Validation은 Bean Validation이라는 자바 표준 스펙을 구현한 거야. 그래서 다른 자바 프레임워크에서도 비슷하게 사용할 수 있어!
자, 이제 Spring Boot Validation이 뭔지 대충 감이 왔지? 그럼 이제 어떻게 사용하는지 자세히 알아볼까? 🕵️♂️
2. Spring Boot Validation 시작하기 🚀
자, 이제 본격적으로 Spring Boot Validation을 사용해볼 거야. 먼저 프로젝트에 필요한 의존성을 추가하는 것부터 시작해보자!
2.1 의존성 추가하기
Spring Boot 프로젝트의 pom.xml
파일 (Maven을 사용한다면) 또는 build.gradle
파일 (Gradle을 사용한다면)에 다음 의존성을 추가해줘야 해:
<!-- Maven -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
// Gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
이 의존성을 추가하면 Hibernate Validator라는 Bean Validation의 구현체가 우리 프로젝트에 포함돼. 이게 바로 실제로 검증 작업을 수행하는 녀석이야.
2.2 모델 클래스 만들기
자, 이제 검증할 데이터를 담을 모델 클래스를 만들어볼까? 예를 들어, 재능넷에서 사용자 정보를 담을 User
클래스를 만들어보자:
import javax.validation.constraints.*;
public class User {
@NotBlank(message = "이름은 필수입니다.")
private String name;
@Email(message = "올바른 이메일 주소를 입력해주세요.")
private String email;
@Min(value = 0, message = "나이는 0보다 작을 수 없습니다.")
@Max(value = 150, message = "나이는 150보다 클 수 없습니다.")
private int age;
// 생성자, getter, setter 등은 생략
}
여기서 우리가 사용한 어노테이션들을 살펴볼까?
@NotBlank
: 문자열이 null이 아니고, 공백이 아닌 문자를 하나 이상 포함해야 해.@Email
: 입력된 문자열이 이메일 형식인지 검사해.@Min
과@Max
: 숫자의 최소값과 최대값을 지정할 수 있어.
이렇게 어노테이션만 붙여주면 Spring Boot가 알아서 검증을 해준다니, 정말 편하지 않아? 😊
🎨 재능넷 팁: 프로그래밍에서 이런 검증 작업은 정말 중요해요. 재능넷에서 서비스를 제공하거나 이용할 때도 항상 정확한 정보를 입력하는 것이 중요하답니다!
자, 이제 기본적인 설정은 끝났어. 다음 섹션에서는 이 검증을 실제로 어떻게 사용하는지 알아볼 거야. 준비됐지? 계속 가보자고! 🏃♂️💨
3. 컨트롤러에서 Validation 사용하기 🎮
자, 이제 우리가 만든 User
클래스를 실제로 사용해볼 차례야. Spring Boot의 컨트롤러에서 이 모델을 어떻게 검증하는지 살펴보자!
3.1 컨트롤러 만들기
먼저, UserController
라는 이름의 컨트롤러 클래스를 만들어볼게:
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
// 사용자 생성 로직
return ResponseEntity.ok("사용자가 성공적으로 생성되었습니다.");
}
}
여기서 주목해야 할 부분은 @Valid 어노테이션이야. 이 어노테이션을 @RequestBody User user
앞에 붙이면, Spring Boot가 자동으로 User
객체의 유효성을 검사해줘. 완전 편하지?
3.2 검증 오류 처리하기
하지만 잠깐, 만약 검증에 실패하면 어떻게 될까? 그냥 오류가 나고 끝날까? 아니야, 우리가 이걸 잘 처리해줘야 해. 다음과 같이 MethodArgumentNotValidException
을 처리하는 메서드를 추가해보자:
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.FieldError;
@RestController
@RequestMapping("/api/users")
public class UserController {
// 이전 코드 생략
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(
MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ResponseEntity.badRequest().body(errors);
}
}
이 코드는 검증 오류가 발생했을 때 어떤 필드에서 어떤 오류가 발생했는지 자세히 알려줘. 이렇게 하면 클라이언트 쪽에서 무엇이 잘못되었는지 정확히 알 수 있지!
💡 알아두면 좋은 점: 이런 방식으로 오류를 처리하면, API를 사용하는 프론트엔드 개발자들이 정말 고마워할 거야. 어떤 입력이 잘못되었는지 정확히 알 수 있으니까!
3.3 실제로 테스트해보기
자, 이제 우리가 만든 API를 테스트해볼까? Postman이나 curl 같은 도구를 사용해서 다음과 같은 요청을 보내보자:
POST /api/users
Content-Type: application/json
{
"name": "",
"email": "not-an-email",
"age": -5
}
이런 요청을 보내면, 우리의 API는 다음과 같은 응답을 줄 거야:
{
"name": "이름은 필수입니다.",
"email": "올바른 이메일 주소를 입력해주세요.",
"age": "나이는 0보다 작을 수 없습니다."
}
짜잔! 🎉 우리가 설정한 모든 검증 규칙이 잘 작동하는 걸 볼 수 있어. 이제 클라이언트는 정확히 어떤 입력이 잘못되었는지 알 수 있게 됐어.
🎨 재능넷 팁: 재능넷에서도 이런 방식으로 사용자 입력을 검증해요. 덕분에 사용자들은 항상 정확한 정보를 입력할 수 있답니다!
여기까지 왔다면, 너희는 이제 Spring Boot Validation의 기본을 마스터한 거나 다름없어! 👏 하지만 아직 더 재미있는 내용이 남아있어. 다음 섹션에서는 좀 더 복잡한 검증 규칙을 만드는 방법을 알아볼 거야. 준비됐어? 그럼 고고! 🚀
4. 커스텀 Validation 만들기 🛠️
지금까지 우리는 Spring Boot Validation이 제공하는 기본적인 어노테이션들을 사용해봤어. 하지만 때로는 이것만으로는 부족할 때가 있지. 예를 들어, 재능넷에서 사용자의 닉네임에 특정 단어가 포함되지 않도록 하고 싶다면 어떻게 해야 할까? 이럴 때 바로 커스텀 Validation을 만들어 사용하면 돼! 😎
4.1 커스텀 어노테이션 만들기
먼저, 우리만의 커스텀 어노테이션을 만들어보자. 이 어노테이션은 닉네임에 특정 단어가 포함되지 않도록 검사할 거야.
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NicknameValidator.class)
@Documented
public @interface ValidNickname {
String message() default "닉네임에 부적절한 단어가 포함되어 있습니다.";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
이 코드에서 @Constraint(validatedBy = NicknameValidator.class) 부분을 주목해봐. 이건 실제로 검증을 수행할 클래스를 지정하는 거야.
4.2 Validator 클래스 만들기
이제 실제로 검증을 수행할 NicknameValidator
클래스를 만들어보자:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;
public class NicknameValidator implements ConstraintValidator<ValidNickname, String> {
private final List<String> FORBIDDEN_WORDS = Arrays.asList("admin", "root", "system");
@Override
public boolean isValid(String nickname, ConstraintValidatorContext context) {
if (nickname == null) {
return true; // null 값은 @NotNull 등으로 처리
}
return FORBIDDEN_WORDS.stream().noneMatch(nickname::containsIgnoreCase);
}
}
이 validator는 닉네임에 "admin", "root", "system" 같은 단어가 포함되어 있는지 검사해. 이런 단어가 포함되어 있으면 false를 반환하고, 그렇지 않으면 true를 반환해.
4.3 커스텀 Validation 사용하기
이제 우리의 User
클래스에 이 커스텀 Validation을 적용해보자:
public class User {
@NotBlank(message = "이름은 필수입니다.")
private String name;
@Email(message = "올바른 이메일 주소를 입력해주세요.")
private String email;
@Min(value = 0, message = "나이는 0보다 작을 수 없습니다.")
@Max(value = 150, message = "나이는 150보다 클 수 없습니다.")
private int age;
@ValidNickname
private String nickname;
// 생성자, getter, setter 등은 생략
}
짜잔! 🎉 이제 우리는 닉네임에 대한 특별한 규칙을 가진 커스텀 Validation을 만들어 사용할 수 있게 됐어. 이렇게 하면 재능넷 같은 플랫폼에서 사용자들이 부적절한 닉네임을 사용하는 것을 방지할 수 있지!
💡 알아두면 좋은 점: 커스텀 Validation을 만들면 정말 다양한 상황에 대응할 수 있어. 예를 들어, 주민등록번호 형식 검사, 특정 도메인의 이메일만 허용하기 등 프로젝트의 특별한 요구사항을 쉽게 구현할 수 있지!
4.4 복합 필드 Validation
때로는 여러 필드를 동시에 검사해야 할 때도 있어. 예를 들어, 비밀번호와 비밀번호 확인 필드가 일치하는지 검사하는 경우 말이야. 이런 경우에는 클래스 레벨의 Validation을 사용할 수 있어.
@PasswordMatch
public class UserRegistration {
private String password;
private String confirmPassword;
// 다른 필드들...
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordMatchValidator.class)
public @interface PasswordMatch {
String message() default "비밀번호가 일치하지 않습니다.";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
public class PasswordMatchValidator implements ConstraintValidator<PasswordMatch, UserRegistration> {
@Override
public boolean isValid(UserRegistration userRegistration, ConstraintValidatorContext context) {
return userRegistration.getPassword().equals(userRegistration.getConfirmPassword());
}
}
이렇게 하면 비밀번호와 비밀번호 확인 필드가 일치하는지 자동으로 검사할 수 있어. 정말 편리하지? 😊
🎨 재능넷 팁: 재능넷에서도 이런 복합 필드 Validation을 사용해요. 예를 들어, 수업 시작 시간이 종료 시간보다 늦지 않은지 확인하는 데 활용할 수 있죠!
자, 여기까지 왔으면 너희는 이제 Spring Boot Validation의 고급 사용자가 된 거야! 👏 기본적인 Validation부터 커스텀 Validation, 그리고 복합 필드 Validation까지 모두 마스터했으니 말이야. 하지만 아직 끝이 아니야. 다음 섹션에서는 Validation 결과를 어떻게 효과적으로 처리하고 사용자에게 전달할 수 있는지 알아볼 거야. 준비됐어? 그럼 고고! 🚀
5. Validation 결과 처리하기 🎭
자, 이제 우리는 다양한 방법으로 입력 데이터를 검증할 수 있게 됐어. 근데 검증 결과를 어떻게 처리하고 사용자에게 보여줄까? 이번 섹션에서는 바로 그 방법을 알아볼 거야! 😎
5.1 BindingResult 사용하기
Spring MVC에서는 BindingResult
라는 인터페이스를 제공해. 이걸 사용하면 Validation 결과를 아주 세밀하게 다룰 수 있어.
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
List<String> errors = result.getAllErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
return ResponseEntity.badRequest().body(errors);
}
// 사용자 등록 로직
return ResponseEntity.ok("사용자가 성공적으로 등록되었습니다.");
}
이 코드에서 BindingResult를 사용하면, 검증 오류가 발생했을 때 어떤 오류가 발생했는지 정확히 알 수 있어. 그리고 이 정보를 사용자에게 전달할 수 있지!
5.2 @ControllerAdvice 사용하기
앞서 우리는 각 컨트롤러에서 @ExceptionHandler
를 사용해 예외를 처리했어. 하지만 이 방법을 모든 컨트롤러에 적용하려면 코드가 중복될 수 있어. 이럴 때 사용하는 게 바로 @ControllerAdvice
야!
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(
MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ResponseEntity.badRequest().body(errors);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleAllExceptions(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An unexpected error occurred");
}
}
이렇게 하면 모든 컨트롤러에서 발생하는 Validation 예외를 한 곳에서 처리할 수 있어. 깔끔하지? 😊
5.3 커스텀 응답 형식 만들기
때로는 Validation 오류 메시지를 포함해 더 구조화된 응답을 보내고 싶을 수 있어. 이럴 때는 커스텀 응답 클래스를 만들어 사용하면 돼!
public class ApiResponse<T> {
private boolean success;
private T data;
private Map<String, String> errors;
// 생성자, getter, setter 생략
public static <T> ApiResponse<T> success(T data) {
ApiResponse<T> response = new ApiResponse<>();
response.setSuccess(true);
response.setData(data);
return response;
}
public static ApiResponse<Void> error(Map<String, String> errors) {
ApiResponse<Void> response = new ApiResponse<>();
response.setSuccess(false);
response.setErrors(errors);
return response;
}
}
이제 이 ApiResponse
를 사용해서 Validation 결과를 반환할 수 있어:
@PostMapping("/register") public ResponseEntity<apiresponse>> registerUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
Map<string string> errors = new HashMap<>();
result.getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage())
);
return ResponseEntity.badRequest().body(ApiResponse.error(errors));
}
// 사용자 등록 로직
return ResponseEntity.ok(ApiResponse.success("사용자가 성공적으로 등록되었습니다."));
}
</string></apiresponse>
이렇게 하면 성공/실패 여부, 데이터, 오류 메시지 등을 일관된 형식으로 클라이언트에 전달할 수 있어. 프론트엔드 개발자들이 좋아할 거야! 😄
🎨 재능넷 팁: 재능넷에서도 이런 방식으로 API 응답을 구조화해요. 덕분에 프론트엔드와 백엔드 간의 소통이 훨씬 수월해졌답니다!
5.4 국제화(i18n) 지원하기
만약 재능넷이 여러 나라에서 서비스된다면? 오류 메시지도 여러 언어로 제공해야 할 거야. Spring Boot에서는 이런 국제화(Internationalization, 줄여서 i18n)를 쉽게 구현할 수 있어.
먼저, messages.properties
파일을 만들어 각 언어별 메시지를 정의해:
# messages.properties (기본)
user.name.notblank=이름은 필수입니다.
# messages_en.properties (영어)
user.name.notblank=Name is required.
# messages_ja.properties (일본어)
user.name.notblank=名前は必須です。
그리고 Validation 어노테이션에서 이 메시지 키를 사용해:
public class User {
@NotBlank(message = "{user.name.notblank}")
private String name;
// 다른 필드들...
}
이렇게 하면 사용자의 로케일(언어 설정)에 따라 자동으로 적절한 언어의 메시지가 표시돼. 멋지지 않아? 🌍
5.5 Validation 그룹 사용하기
때로는 같은 모델 클래스를 다른 상황에서 다르게 검증하고 싶을 때가 있어. 예를 들어, 사용자 등록할 때와 정보 수정할 때 검증 규칙이 다를 수 있지. 이럴 때 Validation 그룹을 사용하면 돼!
public interface RegistrationValidation {}
public interface UpdateValidation {}
public class User {
@NotBlank(groups = {RegistrationValidation.class, UpdateValidation.class})
private String name;
@NotBlank(groups = RegistrationValidation.class)
@Email(groups = {RegistrationValidation.class, UpdateValidation.class})
private String email;
// 다른 필드들...
}
그리고 컨트롤러에서 이렇게 사용해:
@PostMapping("/register")
public ResponseEntity> registerUser(@Validated(RegistrationValidation.class) @RequestBody User user) {
// 등록 로직
}
@PutMapping("/update")
public ResponseEntity> updateUser(@Validated(UpdateValidation.class) @RequestBody User user) {
// 수정 로직
}
이렇게 하면 상황에 따라 다른 Validation 규칙을 적용할 수 있어. 유연하지? 😎
💡 알아두면 좋은 점: Validation 그룹을 사용하면 코드 재사용성을 높이고 복잡한 비즈니스 규칙을 더 쉽게 구현할 수 있어요. 재능넷 같은 복잡한 플랫폼에서 특히 유용하답니다!
자, 이제 우리는 Spring Boot Validation의 거의 모든 것을 배웠어! 🎉 기본적인 사용법부터 고급 기능까지, 이제 너희는 어떤 상황에서도 데이터 검증을 완벽하게 할 수 있을 거야. 마지막으로, 이 모든 것을 종합해서 실제 프로젝트에 어떻게 적용할 수 있는지 알아보자. 준비됐어? 마지막 섹션으로 고고! 🚀
6. 실전 적용: 재능넷 프로젝트에 Validation 통합하기 🏆
자, 이제 우리가 배운 모든 것을 종합해서 실제 프로젝트에 적용해볼 시간이야. 재능넷 프로젝트를 예로 들어 설명해볼게. 준비됐지? 😊
6.1 모델 클래스 정의하기
먼저, 재능넷의 핵심 모델인 Talent
클래스를 정의해보자:
import javax.validation.constraints.*;
import java.math.BigDecimal;
public class Talent {
@NotBlank(message = "{talent.title.notblank}")
@Size(max = 100, message = "{talent.title.size}")
private String title;
@NotBlank(message = "{talent.description.notblank}")
@Size(max = 1000, message = "{talent.description.size}")
private String description;
@NotNull(message = "{talent.price.notnull}")
@DecimalMin(value = "0.0", inclusive = false, message = "{talent.price.min}")
@DecimalMax(value = "1000000.0", message = "{talent.price.max}")
private BigDecimal price;
@NotNull(message = "{talent.category.notnull}")
private Category category;
@Future(message = "{talent.availableFrom.future}")
private LocalDateTime availableFrom;
// 생성자, getter, setter 등은 생략
}
여기서 우리는 다양한 Validation 어노테이션을 사용했어. 제목과 설명의 길이 제한, 가격의 범위 제한, 미래 날짜 확인 등 재능넷에 필요한 모든 규칙을 적용했지!
6.2 커스텀 Validator 만들기
재능넷에는 특별한 규칙이 있어. 바로 "부적절한 단어"가 포함된 제목이나 설명을 금지하는 거야. 이를 위해 커스텀 Validator를 만들어보자:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = InappropriateWordValidator.class)
public @interface NoInappropriateWords {
String message() default "{validation.noinappropriatewords}";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
public class InappropriateWordValidator implements ConstraintValidator<noinappropriatewords string> {
private final List<string> inappropriateWords = Arrays.asList("바보", "멍청이", "얼간이");
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return inappropriateWords.stream().noneMatch(word -> value.toLowerCase().contains(word));
}
}
</string></noinappropriatewords>
이제 이 커스텀 Validator를 Talent
클래스에 적용해보자:
public class Talent {
@NotBlank(message = "{talent.title.notblank}")
@Size(max = 100, message = "{talent.title.size}")
@NoInappropriateWords(message = "{talent.title.noinappropriatewords}")
private String title;
@NotBlank(message = "{talent.description.notblank}")
@Size(max = 1000, message = "{talent.description.size}")
@NoInappropriateWords(message = "{talent.description.noinappropriatewords}")
private String description;
// 나머지 필드는 동일
}
6.3 컨트롤러 구현하기
이제 이 모델을 사용하는 컨트롤러를 만들어보자:
@RestController
@RequestMapping("/api/talents")
public class TalentController {
@PostMapping
public ResponseEntity<apiresponse>> createTalent(@Valid @RequestBody Talent talent, BindingResult result) {
if (result.hasErrors()) {
Map<string string> errors = new HashMap<>();
result.getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage())
);
return ResponseEntity.badRequest().body(ApiResponse.error(errors));
}
// 재능 등록 로직
return ResponseEntity.ok(ApiResponse.success("재능이 성공적으로 등록되었습니다."));
}
// 다른 메서드들 (getTalent, updateTalent, deleteTalent 등)
}
</string></apiresponse>
6.4 전역 예외 처리
마지막으로, 전역 예외 처리기를 만들어 모든 Validation 오류를 일관되게 처리하자:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<apiresponse>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<string string> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ResponseEntity.badRequest().body(ApiResponse.error(errors));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<apiresponse>> handleAllExceptions(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(ApiResponse.error(Collections.singletonMap("error", "An unexpected error occurred")));
}
}
</apiresponse></string></apiresponse>
짜잔! 🎉 이제 우리는 재능넷 프로젝트에 완벽한 Validation 시스템을 구축했어. 이 시스템은:
- 기본적인 데이터 검증 (빈 값, 길이, 범위 등)
- 커스텀 규칙 적용 (부적절한 단어 필터링)
- 일관된 오류 처리 및 응답
- 국제화 지원
이 모든 기능을 갖추고 있지. 이제 재능넷 사용자들은 항상 정확하고 적절한 데이터만을 입력할 수 있게 됐어. 👏
🎨 재능넷 팁: 이런 강력한 Validation 시스템은 사용자 경험을 크게 향상시켜요. 사용자들이 실수로 잘못된 정보를 입력하는 것을 방지하고, 더 나은 서비스 품질을 제공할 수 있답니다!
자, 이제 우리의 여정이 끝났어. Spring Boot Validation의 기초부터 고급 기능까지, 그리고 실제 프로젝트에 적용하는 방법까지 모두 배웠지. 이제 너희는 어떤 프로젝트에서도 완벽한 데이터 검증 시스템을 구축할 수 있을 거야. 멋진 개발자의 길을 걸어가는 너희를 응원할게! 화이팅! 💪😄