Spring Data Common(2) - Null 처리, 쿼리 작성 방법
1. Null 처리 방법
1.1. Optional 활용(Java 8)
- 단일값을 리턴하는 경우(리턴 엔티티가 1개)
- Optional 인터페이스가 제공하는 메소드를 통해 null 검사를 수행할 수 있다.
> isPresent() : 값이 있는지 확인
> orElse(T other) : 값이 없으면 other로 대체
> orElseThrow(IllegalArgumentException::new) : 값이 있으면 값 리턴, 없으면 예외
1.2. 엔티티 활용
1.3. 리턴타입이 컬렉션이면 null은 나오지 않음(size가 0)
1.4. Spring Framework 5.0 부터 지원하는 Null 애노테이션 활용
- @NonNull, @Nullable
package com.exam.demo.repo;
import com.exam.demo.domain.Comment;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import java.io.Serializable;
import java.util.List;
import java.util.Optional;
/**
* 여러 레파지토리에서 공통으로 사용하고 싶은 메소드가 있을 때 공통 메소드들을 설정하는 방법
*/
@NoRepositoryBean
public interface MyRepository<T, Id extends Serializable> extends Repository<T, Id> {
//타입 T와 T를 상속받는 하위타입 E까지 허용
//런타임 시점에 null체크
<E extends T> E save(@NonNull E entity);
List<T> findAll();
long count();
//엔티티타입 리턴, 메소드 널 리턴 허용
@Nullable
<E extends T> E findById(Id id);
//Optional 인터페이스가 제공하는 메소드를 통해 검사 가능
//<E extends T> Optional<E> findById(Id id);
}
> InteliJ runtime assertions 도움받기 가능
- Preferences(Cmd + ,) -> Build, Execution, Deployment -> Compiler -> Configure annotations...
-> Nullable annotations에 spring Nullable 추가, NotNull annotatioins에 spring NonNull 추가
-> 프로젝트 종료 후 재시작
- @NonNullApi, @NonNullField
> 패키지 레벨에 적용하는 애노테이션
- 패키지 안에 있는 모든 메소드, 리턴타입, 파라미터 NonNull 적용
@org.springframework.lang.NonNullApi
package com.exam.demo
2. 쿼리 작성 방법
2.1. 쿼리 전략
- 기본전략
> 선언한 쿼리(@Query(...))가 있으면 선언된 쿼리를 활용하고 없으면 메소드 이름을 분석해서 쿼리를 만들어줌
- 전략 선택 - @EnableJpaRepositories
package com.exam.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.repository.query.QueryLookupStrategy;
@SpringBootApplication
//선언된 쿼리가 없으면 메소드 이름을 분석해서 쿼리 생성
//@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
//메소드 이름을 분석해서 쿼리 생성
//@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE)
//선언된 쿼리 사용
//@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.USE_DECLARED_QUERY)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.2. 메소드 이름 활용(CREATE)
- 내가 메소드 이름을 규칙에 맞게 작성하면 Spring Data JPA가 분석해서 쿼리를 만들어 준다.
- 규칙
> 리턴타입 {접두어}{도입부}By{프로퍼티표현식}{조건식}[{And|Or}{프로퍼티표현식}{조건식}]{정렬조건}(매개변수)
2.3. 선언한 쿼리 활용(USE_DECLARED_QUERY)
- 메소드에 추가한 @Query("쿼리")에 미리 정의해 둔 쿼리를 사용
> JPQL : @Query(value = "SELECT c FROM Comment AS c"), @NamedQuery(name = "findAllAccounts")
> Native Query : @Query(value = "SELECT ", nativeQuery = true)