Programming/Spring Data JPA
스프링 데이터 Common - 2 (스프링 데이터 JPA - 5)
흠냐아뤼
2021. 1. 1. 15:47
728x90
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