1. 개요

이 기사에서는 Spring 프로젝트에 SpringData JPA를 도입 하고 지속성 계층을 완전히 구성하는 데 중점을 둡니다 . Java 기반 구성 및 프로젝트의 기본 Maven pom을 사용하여 Spring 컨텍스트를 설정하는 방법에 대한 단계별 소개는 이 기사를 참조 하십시오 .

2. 스프링 데이터 생성 DAO – 더 이상 DAO 구현 없음

이전 기사에서 논의했듯이 DAO 계층은 일반적으로 단순화 할 수 있고 단순화해야하는 많은 상용구 코드로 구성됩니다. 이러한 단순화의 장점은 많습니다. 정의 및 유지 관리해야하는 아티팩트 수 감소, 데이터 액세스 패턴 일관성 및 구성 일관성.

SpringData는 이러한 단순화를 한 단계 앞당겨 DAO 구현을 완전히 제거 할 수 있도록합니다 . DAO의 인터페이스는 이제 명시 적으로 정의해야하는 유일한 아티팩트입니다.

JPA로 SpringData 프로그래밍 모델을 활용하려면 DAO 인터페이스가 JPA 특정 Repository 인터페이스 인 JpaRepository 를 확장해야합니다 . 이렇게하면 SpringData가이 인터페이스를 찾고 자동으로 구현을 생성 할 수 있습니다.

인터페이스를 확장하여 표준 DAO에서 사용할 수있는 표준 데이터 액세스에 가장 관련성이 높은 CRUD 방법을 얻습니다.

3. 사용자 지정 액세스 방법 및 쿼리

논의 된 바와 같이 Repository 인터페이스 중 하나를 구현 함으로써 DAO는 이미 몇 가지 기본 CRUD 메서드 (및 쿼리)를 정의하고 구현 합니다.

보다 구체적인 액세스 방법을 정의하기 위해 Spring JPA는 몇 가지 옵션을 지원합니다.

  • 인터페이스에서 새 메소드정의하기 만하면 됩니다.
  • @Query 어노테이션 을 사용하여 실제 JPQL 쿼리제공합니다.
  • SpringData 에서 고급 사양 및 Querydsl 지원 사용
  • JPA 명명 된 쿼리를 통해 사용자 지정 쿼리 정의

세 번째 옵션 - 사양 및 Querydsl 지원 - JPA 기준과 유사하지만보다 유연하고 편리한 API를 사용합니다. 따라서 전체 작업을 훨씬 더 읽기 쉽고 재사용 할 수 있습니다. 이 API의 장점은 더 적은 수의 재사용 가능한 블록을 통해 더 간결하게 표현할 수 있기 때문에 많은 수의 고정 쿼리를 처리 할 때 더욱 두드러집니다.

이 마지막 옵션은 XML을 포함하거나 쿼리로 도메인 클래스에 부담을주는 단점이 있습니다.

3.1. 자동 사용자 지정 쿼리

SpringData는 새로운 Repository 구현을 생성 할 때 인터페이스에 정의 된 모든 메소드를 분석 하고 메소드 이름에서 자동으로 쿼리를 생성 하려고 합니다 . 여기에는 몇 가지 제한 사항이 있지만 아주 적은 노력으로 새로운 사용자 지정 액세스 방법을 정의하는 매우 강력하고 우아한 방법입니다.

예를 살펴 보겠습니다. 엔티티에 이름 필드 (및 Java Bean 표준 getNamesetName 메서드) 있는 경우 DAO 인터페이스에서 findByName 메서드를 정의합니다 . 그러면 올바른 쿼리가 자동으로 생성됩니다.

public interface IFooDAO extends JpaRepository<Foo, Long> {

    Foo findByName(String name);

}

이것은 비교적 간단한 예입니다. 쿼리 생성 메커니즘은 훨씬 더 많은 키워드 집합을 지원 합니다 .

파서가 도메인 개체 필드와 속성을 일치시킬 수없는 경우 다음 예외가 표시됩니다.

java.lang.IllegalArgumentException: No property nam found for type class com.baeldung.spring.data.persistence.model.Foo

3.2. 수동 사용자 지정 쿼리

이제 @Query 어노테이션을 통해 정의 할 사용자 지정 쿼리를 살펴 보겠습니다 .

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);

명명 된 매개 변수를 사용하거나 기존 쿼리를 수정하는 것과 같이 쿼리 생성을보다 세밀하게 제어 하려면 참조 를 시작하는 것이 좋습니다.

4. 트랜잭션 구성

Spring 관리 DAO의 실제 구현은 우리가 직접 작업하지 않기 때문에 실제로 숨겨져 있습니다. 그러나 이것은 어노테이션을 사용하여 트랜잭션 의미 체계를 정의 하는 SimpleJpaRepository 구현으로 충분히 간단 합니다 .

보다 명시 적으로 이것은 클래스 수준에서 읽기 전용 @Transactional 어노테이션을 사용하며, 읽기 전용 이 아닌 메서드에 대해 재정의됩니다. 나머지 트랜잭션 의미 체계는 기본값이지만 메서드별로 수동으로 쉽게 재정의 할 수 있습니다.

4.1. 예외 번역이 살아 있고 잘

질문은 이제 – SpringData JPA는 이전 ORM 템플릿 ( JpaTemplate , HibernateTemplate ) 에 의존하지 않고 Spring 5 이후 제거되었으므로 여전히 JPA 예외를 Spring의 DataAccessException 계층 구조로 변환 할 것인가?

물론, 우리는 – 예외 번역은 여전히 DAO 에서 @Repository 어노테이션을 사용함으로써 가능합니다 . 이 어노테이션은 Spring Bean 포스트 프로세서가 컨테이너에서 발견 된 모든 PersistenceExceptionTranslator 인스턴스 와 함께 모든 @Repository Bean 을 조언 하고 이전과 마찬가지로 예외 변환을 제공 할 수 있도록합니다.

통합 테스트를 통해 예외 번역을 확인하겠습니다.

@Test(expected = DataIntegrityViolationException.class)
public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() {
    service.create(new Foo());
}

있다는 사실을 숙지 예외 번역 프록시를 통해 이루어집니다. Spring이 DAO 클래스 주위에 프록시를 생성 할 수 있으려면, 이것들은 final 선언해서는 안됩니다 .

5. 스프링 데이터 JPA 리포지토리 구성

Spring JPA 저장소 지원을 활성화하기 위해 @EnableJpaRepositories 어노테이션을 사용하고 DAO 인터페이스를 포함하는 패키지를 지정할 수 있습니다 .

@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.repository") 
public class PersistenceConfig { 
    ...
}

XML 구성으로 동일한 작업을 수행 할 수 있습니다.

<jpa:repositories base-package="com.baeldung.spring.data.persistence.repository" />

6. Java 또는 XML 구성

이전 기사 에서 Spring 에서 JPA구성 하는 방법에 대해 이미 자세히 논의했습니다 . SpringData 는 또한 JPA @PersistenceContext 어노테이션에 대한 Spring의 지원을 활용합니다 . 이를 사용 하여 실제 DAO 구현을 생성하는 Spring 팩토리 빈 ( JpaRepositoryFactoryBean)에 EntityManager 를 연결합니다 .

이미 논의 된 구성에 추가로, XML을 사용하는 경우 SpringData XML Config도 포함해야합니다.

@Configuration
@EnableTransactionManagement
@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceJPAConfig {
    ...
}

7. Maven 의존성

JPA에 대한 Maven 구성 외에도 이전 기사 에서와 같이 spring-data-jpa 의존성을 추가 합니다 .

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
   <version>2.4.0</version>
</dependency>

8. 스프링 부트 사용

또한 자동으로 DataSource구성하는 Spring Boot Starter Data JPA 의존성을 사용할 수 있습니다 .

또한 사용하려는 데이터베이스가 클래스 경로에 있는지 확인해야합니다. 이 예에서는 H2 인 메모리 데이터베이스를 추가했습니다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
   <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

결과적으로 이러한 의존성을 수행하는 것만으로도 응용 프로그램이 실행되고 다른 데이터베이스 작업에 사용할 수 있습니다.

표준 Spring 애플리케이션에 대한 명시 적 구성이 이제 Spring Boot 자동 구성의 일부로 포함됩니다.

물론 사용자 정의 된 명시 적 구성을 추가하여 자동 구성을 수정할 수 있습니다.

Spring Boot는 application.properties 파일의 속성을 사용하여이를 쉽게 수행 할 수있는 방법을 제공 합니다.

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

이 예에서는 연결 URL과 자격 증명을 변경했습니다.

9. 결론

이 기사에서는 XML 및 Java 기반 구성을 모두 사용하여 Spring 5, JPA 2 및 SpringData JPA (SpringData 우산 프로젝트의 일부)로 지속성 계층의 구성 및 구현에 대해 설명했습니다.

우리 는 새로운 jpa 네임 스페이스를 사용 하는 구성과 트랜잭션 의미 체계 뿐만 아니라 고급 사용자 지정 쿼리 를 정의하는 방법에 대해 논의했습니다 . 최종 결과는 거의 실제 구현 작업없이 Spring을 사용한 새롭고 우아한 데이터 액세스입니다.

이 SpringData JPA Tutorial의 구현은 GitHub 프로젝트 에서 찾을 수 있습니다 .