Repository 활용

소개

Repository 활용법

Optional

  • Optional 클래스를 넣은 경우, Null처리에 대해 방어 로직을 만들 수 있다.
java
Optional<SampleEntity> findAllHowTo(...);

Page, Pageable

  • Page클래스를 넣은 경우, 마지막 매개변수에 Pageable을 넣어서, Page로 리턴할 수 있다.
  • @Query 를 사용해도 Page 속성을 갖고 있으면, 별도 쿼리 추가 없이 Pageable을 적용할 수 있다.
java
Page<SampleEntity> findAllHowTo(..., Pageable pageable);

Stream

  • List, Page와 다르게 순차적으로 데이터를 가져와서 사용함 (메모리 효율성 증가)
  • ~1000건은 List,Page를 써도 무방하나, 1만건 이상이면 Stream 효율 증가
  • @Transactional 필수
  • Stream은 데이터베이스를 계속 연결하는 속성이 있어서 close를 해줘야하는데
    try-with-resource 방식으로 사용하면, 안전하게 자동으로 close를 할 수 있다
  • QueryHints를 통하여 Stream시, 1회당 가져오는 값 설정도 가능하다
    @QueryHints(value = @QueryHint(name = "org.hibernate.fetchSize", value = "500"))

Repository

java
Stream<SampleEntity> findAllHowTo(...);

코드 사용시

java
try(Stream<SampleEntity> stream = repository.streamAll()) { ... }

default 함수

  • 로직을 구현할 수 없는 interface에 로직을 구현할 수 있도록 해주는 함수
  • 공통 에러 처리의 경우 Service 레이어가 아닌 Repository 레이어에서 처리가 가능
  • 메소드명으로 조건 처리를 할 때, 메소드명이 너무 길어지면 메소드명 간소화를 할 수 있기도 한다.
java
public interface SampleRepository extends JpaRepository<SampleEntity, Long> { default SampleEntity findById(long id) { return findById(id).orElseThrow( () -> new IllegalArgumentException("Sample not found") ); } }

JPQL

JPQL 사용

  • SQL가 유사한 언어로 쿼리를 직접 작성해서 사용 가능
  • 변수 사용시 :를 앞에 붙여서 사용 가능

select

java
@Query("select e from SampleEntity e where id = :findId") Optional<SampleEntity> findById(Long findId);

update

java
@Modifying("update ") void updateById(Long findId);

delete

java
@Modifying("delete from SampleEntity e where e.id = :findId") void deleteById(Long findId);

Native Query 사용

  • 옵션에 nativeQuery를 true로 지정하면 사용중인 Database의 SQL을 사용할 수 있다.
  • 단, Page는 사용 불가능

Interface로 Custom View로 뽑기

  • Entity가 아닌 특정 클래스로 리턴하고 싶은 경우, interface 클래스를 만든다
  • Interface 생성시 get을 prefix로 붙이면 맵핑되어 값을 연결해준다.

VO Interface Class

java
public interface SampleView { String getName(); }

Entity 사용법

  • 위 View 클래스에 대한 예시
java
@Query("select m.name as name from MemberEntity m") Optional<MemberEntity> getMemberName(Long id);