일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 벌크연산
- Generic
- 페이징
- 페치조인
- JQuery
- Hibernate
- 엔티티직접사용
- jQuery값전달
- jQuery값전송
- paging
- LIST
- 스프링데이터흐름
- fetchjoin
- 자바서블릿
- springflow
- joinfetch
- JPA
- JPQL
- calendar
- 제네릭
- fullcalendar
- values()
- javascriptcalendar
- javaservlet
- namedQuery
- 프로젝트생성
- 제너릭
- jscalendar
- jQueryUI
- 대량쿼리
- Today
- Total
가자공부하러!
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)
'공부 > Spring Boot' 카테고리의 다른 글
Spring REST Docs(2) - 링크(HATEOAS) (0) | 2019.12.26 |
---|---|
Spring REST Docs(1) - 기초 환경설정 (0) | 2019.12.24 |
Spring Data Common(1) - 개발환경 설정, 기초사용방법 (0) | 2019.11.27 |
Logback 활용(Spring Boot 2.2.0) - 이메일로 전송 (0) | 2019.11.05 |
Spring Boot Hibernate 사용(JPA) (0) | 2019.10.28 |