지난번에 이어서...
막상 기존 운영 서비스의 소스를 보니 데이터베이스 스키마가 하나가 더 있다. 아....
즉, 물리적 Database Server하나에 기존 서비스에서 사용되는 schema는 총 3개였던 것이다.
"계정용DB, 파트너용DB, 고객운영용DB" 이렇게 3개.
파트너용 백오피스에서 예약 내역 조회는 가장 기본적인 비즈니스인데 파트너용DB와 고객운영용DB가 궂이 분리했고.. 거기서 테이블을 7-8개씩 조인을 한다. 아....
여튼 그래서 3개 모두 datasources를 따로 가져갈까 하다가 계정DB는 따로하는게 맞을 듯 해보이고 두개는 하나의 커넥션 내에서 하는게 맞을 듯 해서 datasource는 하나로 통합하기로 했다.
이때 조건이나 방법을 적어보면 아래와 같다.
- 두개의 schema를 모두 connection 이 가능한 계정이 있어야 한다.
- Datasource설정에 해당 스키마 entity와 repository가 놓일 package를 스캔하도록 한다.
- Entity에 schema또는 catalog를 지정해준다.
다음과 같다.
Auth DataSource : HikariCpSellerDataSource.java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {
"xxx.pelican.repository.selleroffice",
"xxx.pelican.entity.selleroffice",
"xxx.pelican.repository.livedb",
"xxx.pelican.entity.livedb"})
public class HikariCpSellerDataSource {
@Autowired
private HikariConfig pelicanhikariConfig;
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource sellerofficeDataSource() throws SQLException {
HikariDataSource hikariDataSource = new HikariDataSource();
return hikariDataSource;
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean sellerofficeEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("sellerofficeDataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages(
"xxx.pelican.repository.selleroffice",
"xxx.pelican.entity.selleroffice"
"xxx.pelican.repository.livedb",
"xxx.pelican.entity.livedb"
).build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager sellerofficeTransactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Entity : Reservation.java - 고객운영용DB
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(catalog = "livedb", name = "reservation")
public class Reservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idx", nullable = false, unique = true)
private Long idx;
Entity : PartnerReservation.java - 파트너용DB
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(catalog = "selleroffce", name = "partner_reservation")
public class PartnerReservation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idx", nullable = false, unique = true)
private Long idx;