[백업][가리사니] 스프링 여러개의 jpa ( hibernate [ mysql, postgresql ] 예제 ) 연결
java, maven, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

1. pom.xml 설정

mysql, postgresql, hibernate, maven을 예제로 써보겠습니다.

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
	<groupId>org.postgresql</groupId>
	<artifactId>postgresql</artifactId>
	<version>9.4-1205-jdbc42</version>
</dependency>

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-jpamodelgen</artifactId>
</dependency>

2. application.properties 설정

여기서는 아래와 같은 이름으로 설정해보겠습니다. conn_pgsql_test : postgresql conn_mysql_test : mysql

spring.conn_mysql_test.driverClassName=com.mysql.jdbc.Driver
spring.conn_mysql_test.url=jdbc:mysql://<호스트>:<포트>/<db명>?useSSL=true&useUnicode=yes&characterEncoding=utf-8
spring.conn_mysql_test.username=<계정>
spring.conn_mysql_test.password=<암호>

spring.conn_pgsql_test.driverClassName=org.postgresql.Driver
spring.conn_pgsql_test.url=jdbc:postgresql://<호스트>:<포트>/<db명>?charSet=utf-8&prepareThreshold=1
spring.conn_pgsql_test.username=<계정>
spring.conn_pgsql_test.password=<암호>

3. 연결 설정

설정파일을 빨리 찾을 수 있도록 클래스를 2개로 각각 만들었습니다. 두개 이상의 데이터베이스 설정시 기본으로 사용될 Bean 에다가 @Primary 를 설정해줘야합니다. (필수사항) 대응할 도메인과 리포지토리의 패키지 위치를 적어줍니다.

@Configuration
@EnableJpaRepositories
(
	basePackages = "com.web.repository.pgsql",
	entityManagerFactoryRef = "pgsqlFactoryBean",
	transactionManagerRef = "pgsqlTransactionManager"
)
public class JdbcPgsqlConfig
{
	@Primary
	@Bean(name = "pgsqlDataSource")
	@ConfigurationProperties(prefix = "spring.conn_pgsql_test")
	public DataSource getDataSource()
	{
		return DataSourceBuilder.create().build();
	}

	@Primary
	@Bean(name = "pgsqlFactoryBean")
	public LocalContainerEntityManagerFactoryBean getFactoryBean(EntityManagerFactoryBuilder builder)
	{
		return builder.dataSource(getDataSource()).packages("com.web.domain.pgsql").build();
	}

	@Primary
	@Bean(name = "pgsqlTransactionManager")
	PlatformTransactionManager getTransactionManager(EntityManagerFactoryBuilder builder)
	{
		return new JpaTransactionManager(getFactoryBean(builder).getObject());
	}
}
@Configuration
@EnableJpaRepositories
(
	basePackages = "com.web.repository.mysql",
	entityManagerFactoryRef = "mysqlFactoryBean",
	transactionManagerRef = "mysqlTransactionManager"
)
public class JdbcMysqlConfig
{
	@Bean(name = "mysqlDataSource")
	@ConfigurationProperties(prefix = "spring.conn_mysql_test")
	public DataSource getDataSource()
	{
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "mysqlFactoryBean")
	public LocalContainerEntityManagerFactoryBean getFactoryBean(EntityManagerFactoryBuilder builder)
	{
		return builder.dataSource(getDataSource()).packages("com.web.domain.mysql").build();
	}

	@Bean(name = "mysqlTransactionManager")
	PlatformTransactionManager getTransactionManager(EntityManagerFactoryBuilder builder)
	{
		return new JpaTransactionManager(getFactoryBean(builder).getObject());
	}
}

아래처럼 만들어주시면 알아서 주입됩니다.!!

com.web.domain.mysql 패키지에는 mysql 엔티티 com.web.repository.mysql 패키지에는 mysql jpa리포지토리 적당한 데이터를 만들어서 테스트 해보시면 패키지 경로에 따라 서로다른 데이터소스에 주입되어 작동 할 겁니다.!!