Spring | Spring Data JPA 이용 | Bean설정 클래스 이용

Bean 설정 파일을 사용하지 않고 클래스로 정의할 수 있다. 이전에 dbbean.xml에서 엔티티 관리자 팩토리를 준비했지만 클래스를 사용하여 같은 것을 해보자.

여기에서는 com.devkuma.spring.db 패키지에 “SampleEntityConfig"라는 클래스를 만들고, 거기에 Bean 생성 메소드을 준비하도록 하자. 아래와 같이 샘플로 아래와 같이 소스 코드를 재 작성하자.

package com.devkuma.spring.db;
 
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
 
@Configuration
class SampleEntityConfig {
 
    @Bean
    public DataSource dataSource() {
        EmbeddedDatabaseBuilder builder = 
            new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2).build();
    }
 
    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = 
            new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
 
        LocalContainerEntityManagerFactoryBean factory = 
            new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.devkuma.spring.db");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }
 
}

그리고 App 클래스에 있는 다음의 문장을 수정한다.

ApplicationContext app = new ClassPathXmlApplicationContext("dbbean.xml");

    ↓

ApplicationContext app = new AnnotationConfigApplicationContext(SampleEntityConfig.class);

이것으로 SampleEntityConfig 클래스를 사용하여 Bean을 작성 할 수 있다. dbbean.xml은 불필요해 졌다. 그뿐만 아니라 persistence.xml도 application.properties도 사실 필요가 없어졌다 (application.properties없이 클래스에 직접 값을 쓰고 있기 때문이다). 클래스를 사용하는 것이 보다 깔끔하게 엔티티 관리자를 준비할 있다는 것을 알 수 있다. 그럼 포인트를 정리해 보자.

DataSource의 작성

EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.H2).build();

DataSource는 EmbeddedDatabaseBuilder라는 클래스의 인스턴스를 만든다. setType에서 데이터베이스 종류을 설정하고, build를 호출하면 생성된다.

EntityManagerFactory 만들기

이것은 조금 귀찮은 작업을 해야 한다. 여기에서 하고 있는 작업을 대충 정리하면 이런 느낌이 될 것이다.

  • HibernateJpaVendorAdapter 인스턴스를 생성한다.
  • LocalContainerEntityManagerFactoryBean 인스턴스를 생성한다.
  • setJpaVendorAdapter에서 LocalContainerEntityManagerFactoryBean에 HibernateJpaVendorAdapter를 설정한다.
  • 그밖에 setPackagesToScan, setDataSource 같은 방법으로 속성을 설정한다.
  • afterPropertiesSet를 호출한다.
  • getObject에서 EntityManager 인스턴스를 가져온다.

이것 저것 해야 할 일이 있어서 귀찮은 느낌이 있긴 있지만, Java 코드만으로 (XML 파일 등) 다른 아무것도 필요없이 Bean 생성 할 수있는 것을 생각하면, Java 프로그래머으로써는 이쪽 방식이 더 편할 것이다.