가자공부하러!

Spring Data Common(2) - Null 처리, 쿼리 작성 방법 본문

공부/Spring Boot

Spring Data Common(2) - Null 처리, 쿼리 작성 방법

오피스엑소더스 2019. 11. 27. 17:03

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) 

 

 

 

 

 

 

Comments