소개
Repository 활용법
Optional
- Optional 클래스를 넣은 경우, Null처리에 대해 방어 로직을 만들 수 있다.
javaOptional<SampleEntity> findAllHowTo(...);
Page, Pageable
- Page클래스를 넣은 경우, 마지막 매개변수에 Pageable을 넣어서, Page로 리턴할 수 있다.
@Query를 사용해도 Page 속성을 갖고 있으면, 별도 쿼리 추가 없이 Pageable을 적용할 수 있다.
javaPage<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
javaStream<SampleEntity> findAllHowTo(...);
코드 사용시
javatry(Stream<SampleEntity> stream = repository.streamAll()) { ... }
default 함수
- 로직을 구현할 수 없는 interface에 로직을 구현할 수 있도록 해주는 함수
- 공통 에러 처리의 경우 Service 레이어가 아닌 Repository 레이어에서 처리가 가능
- 메소드명으로 조건 처리를 할 때, 메소드명이 너무 길어지면 메소드명 간소화를 할 수 있기도 한다.
javapublic 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
javapublic interface SampleView { String getName(); }
Entity 사용법
- 위 View 클래스에 대한 예시
java@Query("select m.name as name from MemberEntity m") Optional<MemberEntity> getMemberName(Long id);