springframework/Spring Data JPA 41

Spring Data Common : Domain Event

도메인 이벤트 Entity 의 변화를 이벤트로 간주 ApplicationContext 의 EventPublisher 의 기능을 이용하여 EventListener 로 받아줌 이벤트 기반 프로그래밍 에 사용 이벤트 작성 방법.(Spring Frame Work ApplicationContext 의 EventPublisher 에 기술 되어 있음) ApplicationEvent 구현클래스 작성 public class PostPublishedEvent extends ApplicationEvent { private final Post post; public PostPublishedEvent(Object source) { super(source); this.post = (Post)source; } public Post..

Spring Data Common : 공통 리포지토리 커스터마이징

모든 리포지토리에 공통적으로 추가할 기능이나 재정의할 기능을 정의한다. 유지보수 관점에서의 이득을 보기위한 커스텀 리포지토리 생성 방법이다. 즉, 직접 코드를 작성하여 리포지토리 메서드를 만드는 방법의 확장성을 증가시킨 방법이다. JpaRepository 상속 인터페이스 정의, @NoRepositoryBean, 원하는 메서드 선언 @NoRepositoryBean public interface MyCommonRepository extends JpaRepository { boolean contatins(T entity); } JPA 가장 아래 단에 있는 SimpleJpaRepository 를 상속하고 , JpaRepository 를 상속했던 인터페이스를 상속하는 구현 클래스 작성 super 클래스를 호출하는..

Spring Data Common : 커스텀 리포지토리 생성

부가적으로 varchar 사이즈 255 를 넘을 경우 @ColumnDefinition 이나 @Lob 을 사용한다. 직접 함수를 작성하여 리포지토리를 구성하고 싶다. 스프링에서 DAO 를 만드는 것과 같다. 인터페이스에 필요한 메서드를 정의 구현클래스(접미어는 반드시 Impl) 생성 및 @Repository, @Transactional 선언 EntityManager 등을 이용한 메서드 작성 만약 구현클래스에 Impl 이라는 접미사 외에 다른 접미사를 채택하고 싶다면 @EnableRepositories 의 repositoryImplementationPostfix 속성에 원하는 접미사를 제시하면 된다. 재정의 CustomRepository 인터페이스에 기존 메서드 시그니처를 동일하게 선언하면, JPA 는 사용..

Spring Data Common : Async Query Method

권장되지 않는 방법이다. 비동기 식으로 쿼리를 날려 받아오는 식으로 동작하며 이는 백그라운드에 있는 Thread Pool 에 Task 를 맡긴 후 콜백으로 결과 값을 받는 방식이다. 테스트 코드 작성이 힘들며 테스트 코드가 지저분해 진다. 컴퓨팅 파워가 받쳐주는 현재 시점에서는 DB 튜닝이 어플리케이션의 속도를 판가름한다. 쓰레드가 분리되면 다른 스레드에서 조작하는 데이터를 감지하지 못한다. 즉 기존의 데이터는 가져올 수 있으나, insert와 select 동작이 언제 완료될지 모르는 상황에서 서로 조작하는 데이터를 감지할 수 없어 문제가 일어나는 것이다. Async 설정방법 @Configuration 클래스에 @EnableAsync 어노테이션을 붙인다. 백그라운드에서 돌게 되는 Thread Pool 을..

Spring Data Common : 쿼리 작성

public interface CommentRepository extends MyRepository{ List findByCommentContains(String keyword); // comment 프로퍼티 기준으로 keyword 를 가졌는지 찾아보게 됨 } @Test public void testQuery(){ Comment comment = new Comment(); comment.setComment("Spring Data JPA"); commentRepository.save(comment); List comments = commentRepository.findByCommentContains("spring"); assertThat(comments.size()).isEqualTo(1); } 문제는 대..

Spring Data Common : 쿼리 작성 키워드

쿼리 작성 방법 전략은 3개가 있다. 메서드 이름 분석 방법 : Spring Data JPA 가 쿼리를 작성 메서드 부가정보 분석 방법 : JPQL 사용, Native Query 사용시 @Query 어노테이션 속성에 nativeQuery=true 정의한 쿼리를 찾아보고 없다면 메서드 이름 분석 : DEFAULT 값, @EnableJpaRepositories 의 queryLookupStrategy 속성에 상수로 지정 // 메서드 이름 분석 public interface CommentRepository extends MyRepository{ List findByCommentContains(String keyword); } // 부가정보 분석 public interface CommentRepository ex..

Spring Data Common : Null 처리

Spring Data 2.0 부터 Java 8 부터 나온 Optional 을 제공한다. 리턴 타입이 하나일 경우 Optional 선언이 가능하다. 리턴타입이 하나일 경우 Optional 사용이 권장된다. null 처리에 대한 코드를 줄이고 null 상황에 따른 동작의 기댓 값을 직관적으로 확인할 수 있다. 다만, JPA 리턴타입이 컬렉션일 경우 Empty 상태의 컬렉션이 리턴되므로 주의한다. @NoRepositoryBean public interface MyRepository extends Repository { // T 의 하위타입 E E save( E entity); List findAll(); long count(); Optional findById(@NonNull Long id); } Option..

Spring Data Common : Repository 인터페이스 정의

JpaRepository 를 상속하면, JpaRepository 가 제공하는 메서드들을 사용할 수 있게 되는데, 이와는 다르게 자신이 직접 원하는 메서드만을 정의하고 싶다면 @RepositoryDefinition 을 사용한다. @RepositoryDefinition 의 속성에 도메인 클래스, Entity 식별자 클래스를 정의하면 된다. 메서드 이름에 따라 JPA 가 쿼리를 만들어 주기 때문에 원하는 메서드만을 인터페이스에 정의 할수 있게 되지만, 검증을 위해 메서드 테스트가 필요하다. @RepositoryDefinition(domainClass = Comment.class,idClass = Long.class) public interface CommentRepository { Comment save(Co..

Spring Data Common : Repository

리포지토리 인터페이스를 만들 때 사용하던 JpaRepository 는 Spring Data JPA 의 영역이다. JpaRepository 는 PagingAndSortingRepository 를 상속하고 있으며 이 부터 Spring Data Common 의 영역이다. PagingAndSortingRepository 는 페이징 기능과 소팅 기능을 제공하며 CrudRepsitory를 상속하고 있다. CrudRepository 는 기본적인 CRUD 기능을 정의하고 있으며 Repository 를 상속하고 있다. Repository 인터페이스는 마커 인터페이스이며 실질적 기능은 없고 마커용일 뿐이다. Repository 인터페이스를 제외하고 CrudRepository 부터는 @NoRepositoryBean 이 붙어..

Spring Data JPA 활용 개요.

스프링 데이터는 여러 프로젝트의 묶음이며 그 안에 Spring Data JPA가 존재한다. 스프링 데이터의 서브 프로젝트들의 공통 프로젝트는 Spring Data Common 이다. Spring Data 서브 프로젝트가 관리하는 데이터를 REST API 로 제공하는 프로젝트가 Spring Data REST 이다. Spring Data JPA 는 Spring Data Common 의 기능에 Java Persistence API 기능을 추가한 것이다. 그러므로 Spring Data Common 에 대한 학습을 마치고 JPA를 이해하는 것이 좋으며, Spring Data Common 은 Spring Data Mongo DB, JDBC, Redis 등 다른 저장소 프로젝트에도 공통적으로 사용되는 기술이기에 알고..