@Validated와 @Valid & NotNull 처리방식

건미누·2023년 9월 19일

Spring Study

목록 보기
3/7

Validation

인자 값은 항상 정상적이지는 않다. Validation은 JSON객체로 넘어오는 값이
정상적인지 체크할 수 있다. 따라서, Null 체크에 유용하다.

@Valid

  • 인자 값을 받는 곳에 적어주면 된다. 주로 @ResponseBody를 체크할 때 쓰인다
@PostMapping()
public String signUp(@Valid @RequestBody UserRequest request) {
    return "ok";
}
  • 검사할 내용에 @NotNull 대신 @Valid를 사용해야한다.
public class UserRequest {
    @Email
    private String email;

    @NotBlank
    private String password;
    
    @Valid 
    private Address address;

@Validated

  • 쿼리 스트링이나 파라미터를 검증해야하는 경우에 사용한다.
  • 클래스레벨에서 선언하지 않으면 동작하지 않는다.
@RestController
@RequestMapping("/users")
@Validated
public class UserController {
    .
    .
    
    @GetMapping("/{id}")
    public String find(@PathVariable @Min(1)  Long id) {
        return "ok";
    }
}

NotNull, NonNull, nullable

@NonNull

Lombok에서 지원하는 어노테이션으로 엔티티 필드에서 Null 값을 가질 수 없게 해준다.

@NotNull vs nullable

두 어노테이션 모두 엔티티 필드에서 null 값을 가질 수 없도록 한다.

그러면 차이는 어떤 것이 있을까?

우선 nullable의 경우 @Column과 함께 쓰이며 nullable=false를 설정하지 않는 경우 true를 기본 값으로 가진다.

nullable은 JPA가 만든 엔티티의 필드 값이 null로 채워진 상태에서 정상적으로 수행이 되다가, DB쪽으로 SQL 쿼리가 도착하는 순간에 예외가 던져지는 반면 @NotNull의 경우 DB로 쿼리가 도착하기 전에, 엔티티 필드 값이 null로 채워지는 순간에 예외가 던져진다.

@NotNull 어노테이션이 더 빠른 단계에서 예외를 색출해내므로, 조금 더 안전하다고 할 수 있다. 또한 message 속성을 통해 적용 되었을 때 나타낼 문구 설정이 가능하다.


그러나, JPA를 이용해 Entity화 시킨 것이 아니라면 @NotNull을 해석하지 못한다. 또한 DDL-AUTO가 false 상태라면 적용되지 않는다. 해석하는 주체에 따라 단순 주석이 될 수 있다.

profile
꺾여도 해야지

0개의 댓글