ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Data JPA 2. null 처리 관련 애노테이션
    Spring/Spring Data JPA 2020. 6. 1. 23:00

     

    리포지토리를 튜닝해보기

     

    리포지토리는 Repository, CrudRepository, PagingAndSortingRepository를 상속받을 것이다.

     

     

     

    @RepositoryDefinition

    • 이런 상속을 받고 싶지 않은 경우 애노테이션으로 처리가 가능하다.
    • @RepositoryDefinition로 가능하며 CrudRepository를 상속받는 식으로 만든다면
    • 메서드 들은 전부 공개가 되게 되지만 이런 어노테이션 방식은
    • 노출하고 싶은 메서드만 노출이 가능한 것 같다.

     

    @NoRepositoryBean

     

    • 다음과 같이 CRUD repository를 대신하는 Repository만 쓰고
    • Repository는 빈 영역이니 직접 CRUD repository를 만들고
    • 선택적인 노출을 가능하게 할 수도 있다.

     


     

    • 스프링 데이터 2.0부터는 repository CRUD 메서드가
    • 자바 8의 Optional을 사용해서 리턴하게 된다.
    • 따라서 그 값이 있는지 없는지를 알려주게 된다.

     

     

     

    • 다음과 같이 Book에 title을 추가하고 findByTitleIsLike 메서드를 만들어 보자

     

     

    • 이 같은 경우 null이 나와야 하지만 Optional을 지원하므로 empty List가 나오게 된다.
    • 즉 null이 아닌 비어있는 empty 컬렉션들이 반환이 된다.

     

     

    Nullability annotations

     

    Null이 가능한지 여부를 리포지토리 메서드에 애노테이션으로 알려줄 수 있다.

     

    @NonNull @Nullable

    • 날이 될 수 없는 파라미터, 리턴 타입, 필드에 설정 가능하다.

     

     

    @NonNullApi @NonNullFields

    • 패키지 레벨에 설정
    • 모든 메서드와 파라미터에 NonNull을 붙이면 지저분하니 Package 레벨로 설정을 하는 듯싶다.

     

     

     

     

     

    • 다음과 같이 RuneTime시 Value must not be null으로 에러가 나는 것을 알 수 있다.

     

     

     

     

    • 다음과 같이 com.acme 패키지는 NonNullApi가 설정되었다고 가정하자.
    • 그러면 모든 파라미터와 리턴 타입에는 Null이 올 수 없고 온다면 runtime시 에러가 나게 된다.
    • 하지만 더 가까운 쪽에 영향을 받기 때문에 findByEmailAddress에 있는 User과 EmailAddress는
    • Null이 가능하게 된다.

     

     

     

Designed by Tistory.