@Valid, @Validated를 사용하면, 파라미터 받고 if문으로 이게 null인지 검증하는 로직이 필요없다! + 입력값 검증은 Controller단에서 이뤄지면 됨!
private void validateUserField(CreateUserParam createUserParam) { if (Stream.of(createUserParam.username(), createUserParam.email(), createUserParam.password()) .anyMatch(field -> field == null || field.isBlank())) { throw new IllegalArgumentException("username, email, password는 필수 입력값입니다."); } }
사용 예시 (@Valid 적용)
@RestController
@RequestMapping("/api/user")
public class UserController {
@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody UserDto userDto) {
return ResponseEntity.ok("User registered successfully");
}
}
public class UserDto {
@NotBlank(message = "이름은 필수 입력 값입니다.")
private String name;
@Email(message = "올바른 이메일 형식이 아닙니다.")
private String email;
}
결과:
사용 예시 (@Validated 적용)
@RestController
@RequestMapping("/api/user")
@Validated // 클래스 레벨에 적용 가능
public class UserController {
@PostMapping("/register")
public ResponseEntity<String> registerUser(@Validated(OnCreate.class) @RequestBody UserDto userDto) {
return ResponseEntity.ok("User registered successfully");
}
}
public class UserDto {
@NotBlank(message = "이름은 필수 입력 값입니다.", groups = OnCreate.class)
private String name;
@Email(message = "올바른 이메일 형식이 아닙니다.", groups = {OnCreate.class, OnUpdate.class})
private String email;
}
public interface OnCreate {}
public interface OnUpdate {} // 그룹 검증이 필요하다면 필수, 마커 인터페이스이므로 빈 인터페이스만 만들어주면 된다.
결과:
Service 계층에서 @Validated 적용
@Service
@Validated
public class UserService {
public void createUser(@Validated(OnCreate.class) UserDto userDto) {
// 비즈니스 로직
}
}
"Service단에선 어차피 Controller 계층에서 넘어온 파라미터를 쓰기 떄문에, @Valid로 검증해줄 필요가 거의 없다."
예외
String a = null;
String b = "Hello";
// NullPointerException 발생
if (a.equals(b)) {
System.out.println("같음");
}
import org.apache.commons.lang3.StringUtils;
String a = null;
String b = "Hello";
// Null 안전한 비교
if (StringUtils.equals(a, b)) {
System.out.println("같음");
}
=> 비즈니스 로직 상 null이 안들어오더라도 null일 가능성이 있다는 것을 염두에 두고 해야함 (방어적인 개발)
그러므로, 그냥 equals()를 쓰기 보단 null 체크 기능이 있는 StringUtils.equals()를 사용할 것!