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