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. Maven 의존성

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>

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

2.2. 구성

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

Spring Boot는 우리가 사용하는 데이터베이스에 따라 dataSource bean을 자동 구성 할 수도 있습니다 . H2 , HSQLDBApache 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를 구성하는 더 많은 예제를 찾을 수 있습니다 .

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

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

3. Java를 사용한 JPA Spring 구성 – Non-Boot 프로젝트에서

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

이것은 구성의 주요 부분이며 Spring 팩토리 빈을 통해 수행 할 수 있습니다. 이것은 더 간단한 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 스프링 구성

다음으로 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 는 먼저 Bean 팩토리에서 검색된 다음 트랜잭션 관리자로 전달됩니다.

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

5. 완전한 XML 사용 안함

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

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

일반적으로 persistence.xml 파일 에 JPA 속성을 지정 합니다. 또는 엔티티 관리자 팩토리 빈에 직접 속성을 추가 할 수 있습니다.

factoryBean.setJpaProperties(this.additionalProperties());

참고로, Hibernate가 지속성 제공자라면 이것은 Hibernate 특정 속성을 지정하는 방법이기도합니다.

6. Maven 구성

Spring Core 및 Persistence 의존성 ( Maven 을 사용하는 Spring 예제 에 자세히 표시) 외에도 프로젝트에서 MySQL 커넥터뿐만 아니라 JPA 및 Hibernate를 정의해야합니다.

<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에서 사용할 수 있습니다 .