Spring | JpaRepository 이용 | Bean 설정 클래스를 이용

Bean은 설정 파일을 사용하지 않고, 클래스로 정의 할 수 있다. 그럼 이것도 해보자.

com.devkuma.spring.db 패키지의 “SampleEntityConfig"클래스 소스 코드를 아래와 같이 고쳐 보자.

package com.devkuma.spring.db;
 
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import javax.transaction.TransactionManager;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
 
@Configuration
@EnableJpaRepositories("com.tuyano.libro.db")
@EnableTransactionManagement
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.tuyano.libro.db");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();
 
        return factory.getObject();
    }
 
    @Bean
    protected JpaTransactionManager transactionManager
            (EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

그리고 App에서 다음의 문장을 수정하여 해당 Bean 설정 파일에서 이 SampleEntityConfig 클래스를 이용하도록 변경하자.

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

    ↓

ApplicationContext app = new  AnnotationConfigApplicationContext(SampleEntityConfig.class);

수정하면 App을 실행하여 보자. 앞서 살펴본 바와 같이 더미 데이터가 나열된다. 여기에서는 우선 눈길을 끄는 것은 클래스 선언 앞에 있는 어노테이션이다.

@EnableJpaRepositories("com.devkuma.spring.db")

이것은 JpaRepository를 ON으로 하기 위한 것이다. 이 어노테이션을 작성하는 것으로, 지정된 패키지를 검색하고 @Repository를 붙인 클래스를 Bean으로 등록한다. 괄호 () 내에는 검색할 패키지를 지정해야 한다. <jpa:repositories>에 해당하는 것으로 생각해도 된다.

@EnableTransactionManagement

이것은 TransactionManagement를 사용하기 위한 것이다. 이것을 준비해 두는 것으로 TransactionManager가 ON된다.

@Bean 어노테이션을 붙인 Bean 생성을 위한 메소드으로는 “JpaTransactionManager"라는 메소드가 추가되어 있다. 이것으로 JpaTransactionManager 인스턴스를 만들고 return한다. 보면 알 수 있는 거처럼, new JpaTransactionManager 한 것을 돌려주고있을 뿐이다. 인수는 EntityManagerFactory 인스턴스를 전달하도록 하고 있다.

보면 알 수 있듯이, 준비되어있는 Bean 생성 메소드에는 레파지토리 생성을 위한 것은 아니다. 레파지토리는 자동으로 Bean 화되는 것을 잘 알것이다.