본문 바로가기

Programming!

Multi DatabaseSource에 이어서 더..

지난번에 이어서...


막상 기존 운영 서비스의 소스를 보니 데이터베이스 스키마가 하나가 더 있다. 아....


즉,  물리적 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;