ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 데이터 Common - 2 (스프링 데이터 JPA - 5)
    Programming/Spring Data JPA 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

    댓글

Designed by Tistory.