-
스프링 데이터 Common - 2 (스프링 데이터 JPA - 5)Programming/Spring Data JPA 2021. 1. 1. 15:47728x90
1. 커스텀 리포지토리 만들기
- 스프링 데이터 리포지토리 인터페이스에 기능을 추가하거나 기본 기능을 덮어쓸 수 있음
1) 커스텀 리포지토리 인터페이스 정의
public interface PostCustomRepository<T> { List<Post> findMyPost(); void delete(T post); }
2) 인터페이스 구현 클래스 만들기 (기본 접미어는 Impl)
public class PostCustomRepositoryImpl implements PostCustomRepository<Post> { @Autowired EntityManager entityManager; @Override public List<Post> findMyPost() { return entityManager.createQuery("SELECT p FROM Post AS p", Post.class).getResultList(); } @Override public void delete(Post post) { System.out.println("my delete query"); entityManager.remove(post); } }
3) 엔티티 리포지토리에 커스텀 리포지토리 인터페이스 추가
public interface PostRepository extends JpaRepository<Post, Long>, PostCustomRepository<Post> { }
2. 기본 리포지토리 커스터마이징
1. MyRepository 인터페이스 생성
2. SimpleMyRepository 구현체 생성
앞으로 MyRepository만 상속받으면 기존 스프링 데이터 리포지토리 기능 + 커스터마이징 한 것을 사용할 수 있음
3. 도메인 이벤트
1. PostPublishedEvent 작성
2. PostListener 작성 및 빈으로 등록
3. ApplicationContext를 이용해 Event Publish
- 도메인 이벤트 Publisher 를 제공
AbstractAggregatiionRoot를 상속받으면 됨
4. QueryDSL
타입 세이프(Optional)한 쿼리를 만들 수 있게 도와주는 라이브러리
JPA, SQL, MongoDB, JDO 등을 지원
- Optional<T> findOne(Predicate) : 조건으로 무언가 하나를 찾는다
- List<T>, Page<T> findAll(Predicate) : 조건으로 무언가 여러개를 찾는다.
1) 의존성 추가 및 플러그인 추가, 빌드
쿼리용 도메인 스페시픽 랭귀지를 자동으로 만들어줌
<dependency> <groupId>com.querydsl</groupId> <artifactId>quertdsl-apt</artifactId> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>quertdsl-sql</artifactId> </dependency> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>
2) 리포지토리에서 상속
@Repository public interface AccountRepository extends JpaRepository<Account, Long>, QuerydslPredicateExecutor<Account> { }
3) 테스트 코드
@RunWith(SpringRunner.class) @DataJpaTest class AccountRepositoryTest { @Autowired AccountRepository accountRepository; @Test public void crud() { QAccount account = QAccount.account; Predicate predicate = account .firstName.containsIgnoreCase("hongchan") .and(account.lastName.startsWith("yun")); // findByFirstNameIgnoreCaseAndLastNameStartsWithIgnoreCase(); Optional<Account> hongchan = accountRepository.findOne(predicate); assertThat(hongchan).isEmpty(); } }
인프런 백기선님 '스프링 데이터 JPA’ 강의를 듣고 정리한 내용입니다.
728x90'Programming > Spring Data JPA' 카테고리의 다른 글
스프링 JPA (스프링 데이터 JPA - 7) (0) 2021.01.01 스프링 데이터 Common - Web (스프링 데이터 JPA - 6) (0) 2021.01.01 스프링 데이터 Common - 1 (스프링 데이터 JPA - 4) (0) 2021.01.01 JPA 프로그래밍 - 2 (스프링 데이터 JPA - 3) (0) 2021.01.01 JPA 프로그래밍 - 1 (스프링 데이터 JPA - 2) (0) 2020.04.30