1. 개요

이 예제 은 지속성 공급자로 Hibernate를 사용하여 JPA로 Spring을 설정하는 방법을 보여줍니다 .

Java 기반 구성 및 프로젝트의 기본 Maven pom을 사용하여 Spring 컨텍스트 설정에 대한 단계별 소개는 이 기사 를 참조하십시오 .

Spring Boot 프로젝트에서 JPA를 설정하는 것으로 시작하겠습니다. 그런 다음 표준 Spring 프로젝트가 있는 경우 필요한 전체 구성을 살펴보겠습니다.

다음은 Spring 4에서 Hibernate 4를 설정하는 방법에 대한 비디오입니다(전체 1080p로 시청하는 것이 좋습니다).

2. 스프링 부트의 JPA

Spring Boot 프로젝트는 Spring 애플리케이션을 훨씬 빠르고 쉽게 생성하기 위한 것입니다. 이는 다양한 Spring 기능(그 중 JPA)에 대한 스타터 및 자동 구성을 사용하여 수행됩니다.

2.1. 메이븐 의존성

Spring Boot 애플리케이션에서 JPA를 활성화하려면 spring-boot-starterspring-boot-starter-data-jpa 의존성이 필요합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

spring-boot-starter 에는 Spring JPA에 필요한 자동 구성이 포함되어 있습니다 . 또한 spring-boot-starter-jpa 프로젝트는 hibernate-core 와 같은 필요한 모든 의존성을 참조합니다 .

2.2. 구성

Spring Boot 는 Hibernate 를 기본 JPA 공급자로 구성하므로 사용자 지정하지 않는 한 entityManagerFactory을 정의할 필요가 더 이상 없습니다 .

Spring Boot 는 사용 중인 데이터베이스에 따라 dataSource 빈을 자동으로 구성할 수도 있습니다. H2 , HSQLDB  및 Apache Derby 유형의 메모리 내 데이터베이스의 경우 해당 데이터베이스 의존성이 클래스 경로에 있으면 Boot는 DataSource 를 자동으로 구성합니다.

예를 들어 Spring Boot JPA 애플리케이션에서 메모리 내 H2 데이터베이스 를 사용하려면 pom.xml 파일 에 h2 의존성을 추가하기만 하면 됩니다.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

이렇게 하면 dataSource bean을 정의할 필요가 없지만 사용자 지정하려는 경우 정의할 수 있습니다.

MySQL 데이터베이스 와 함께 JPA를 사용 하려면 mysql-connector-java 의존성이 필요합니다. DataSource 구성 도 정의해야 합니다.

@Configuration 클래스에서 또는 표준 Spring Boot 속성을 사용하여 이를 수행할 수 있습니다.

Java 구성은 표준 Spring 프로젝트에서와 동일하게 보입니다.

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUsername("mysqluser");
    dataSource.setPassword("mysqlpass");
    dataSource.setUrl(
      "jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true"); 
    
    return dataSource;
}

속성 파일을 사용하여 데이터 소스를 구성하려면 spring.datasource 접두사가 붙은 속성을 설정해야 합니다 .

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=mysqluser
spring.datasource.password=mysqlpass
spring.datasource.url=
  jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true

Spring Boot는 이러한 속성을 기반으로 데이터 소스를 자동으로 구성합니다.

또한 Spring Boot 1에서는 기본 연결 풀이 Tomcat 이었지만 Spring Boot 2 에서는 HikariCP 로 변경되었습니다 .

GitHub 프로젝트 의 Spring Boot에서 JPA를 구성하는 더 많은 예제가 있습니다 .

보시다시피 기본 JPA 구성은 Spring Boot를 사용하는 경우 매우 간단합니다.

그러나 표준 Spring 프로젝트가 있는 경우 Java 또는 XML을 사용하여 보다 명시적인 구성이 필요합니다. 이것이 우리가 다음 섹션에서 집중적으로 다룰 내용입니다.

3. 비부팅 프로젝트에서 Java를 사용한 JPA Spring 구성

Spring 프로젝트에서 JPA를 사용하려면 EntityManager 를 설정해야 합니다 .

이것은 구성의 주요 부분이며 Spring factory bean을 통해 수행할 수 있습니다. 이것은 더 단순한 LocalEntityManagerFactoryBean 이거나 더 유연한 LocalContainerEntityManagerFactoryBean 일 수 있습니다.

후자의 옵션을 사용하는 방법을 살펴보겠습니다.

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
      LocalContainerEntityManagerFactoryBean em 
        = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });

      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
   }
   
   // ...

}

또한 위에서 사용한 DataSource bean 을 명시적으로 정의해야 합니다 .

@Bean
public DataSource dataSource(){
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
    dataSource.setUsername( "tutorialuser" );
    dataSource.setPassword( "tutorialmy5ql" );
    return dataSource;
}

구성의 마지막 부분은 추가 Hibernate 속성과 TransactionManagerexceptionTranslation 빈입니다.

@Bean
public PlatformTransactionManager transactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
    return new PersistenceExceptionTranslationPostProcessor();
}

Properties additionalProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
       
    return properties;
}

4. XML을 사용한 JPA Spring 구성

다음으로 XML을 사용한 동일한 Spring 구성을 살펴보겠습니다.

<bean id="myEmf" 
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.baeldung.persistence.model" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" 
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/spring_jpa" />
    <property name="username" value="tutorialuser" />
    <property name="password" value="tutorialmy5ql" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="myEmf" />
</bean>
<tx:annotation-driven />

<bean id="persistenceExceptionTranslationPostProcessor" class=
  "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

XML과 새로운 Java 기반 구성 간에는 비교적 작은 차이가 있습니다. 즉, XML에서 다른 빈에 대한 참조는 해당 빈에 대한 빈 또는 빈 팩토리를 가리킬 수 있습니다.

그러나 Java에서는 유형이 다르기 때문에 컴파일러가 이를 허용하지 않으므로 EntityManagerFactory 는 먼저 빈 팩토리에서 검색된 다음 트랜잭션 관리자에게 전달됩니다.

transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

5. 완전한 XML리스로 전환

일반적으로 JPA는 META-INF/persistence.xml 파일 을 통해 지속성 단위를 정의 합니다. Spring 3.1부터는 persistence.xml 이 더 이상 필요하지 않습니다. LocalContainerEntityManagerFactoryBean이제 @Entity 클래스를 검색할 패키지를 지정할 수 있는 packagesToScan 속성을 지원합니다.

이 파일은 우리가 제거해야 하는 마지막 XML 조각이었습니다. 이제 XML 없이 JPA를 완전히 설정할 수 있습니다.

일반적으로 persistence.xml 파일 에서 JPA 속성을 지정 합니다.

또는 엔티티 관리자 팩토리 빈에 직접 속성을 추가할 수 있습니다.

factoryBean.setJpaProperties(this.additionalProperties());

참고로 Hibernate가 지속성 공급자인 경우 이는 Hibernate 특정 속성을 지정하는 방법이기도 합니다.

6. 메이븐 구성

Spring with Maven 예제 에 자세히 나와 있는 Spring Core 및 지속성 의존성 외에도 프로젝트에서 JPA 및 Hibernate와 MySQL 커넥터를 정의해야 합니다.

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>5.2.17.Final</version>
   <scope>runtime</scope>
</dependency>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.19</version>
   <scope>runtime</scope>
</dependency>

여기에는 MySQL 의존성이 예로 포함되어 있습니다. 데이터 소스를 구성하려면 드라이버가 필요 하지만 Hibernate 지원 데이터베이스이면 충분합니다.

7. 결론

이 예제 에서는 Spring Boot와 표준 Spring 애플리케이션 모두 에서 Spring의 Hibernate로 JPA 를 구성하는 방법을 설명했습니다.

항상 그렇듯이 이 기사에 제시된 코드는 GitHub 에서 사용할 수 있습니다 .

Persistence footer banner