[Spring Boot] 다중 데이터베이스 사용하기

이종현·2022년 6월 23일
1

Spring / Spring Boot

목록 보기
5/6

회사에서 2개의 서로다른 DB에 접근해야 하는 업무가 생겨서 해당 내용을 기록하고자 한다.

하나의 서버에서 여러 DB에 접근할수 있게끔 서버 구조를 변경했다.

대략적인 순서는 아래와 같다.

  • 패키지 구조 변경 (Mapper 인터페이스, xml파일 패키지로 감싸기)
  • 서버 설정파일에 DB 연결정보 작성
  • Config 파일 생성 및 수정

패키지 구조나 파일명은 모두 다르기때문에 1번 사항은 스킵한다.

프로젝트 패키지 구조 변경

Mapper 인터페이스 파일과 쿼리를 작성하는 XML 구현체 부분을 데이터베이스 별로 나눠서 사용할 수 있게끔 패키지로 나누었다.

서버 설정파일에 DB 연결정보 작성

이러한 구조로 각각의 연결 정보를 작성한다.

DB Config 파일 생성 및 수정

Mybatis를 사용하려면 DataSource, SqlSessiontTemplate, SqlSessionFactory Bean 객체를 등록해야 한다.

다중 데이터 베이스를 사용하려면 데이터베이스마다 해당 작업을 진행해야 하는데, Spring의 Bean 관리 방법이 싱글톤을 사용하기 때문에 여러 DataSource 관련 Bean이 있으면 충돌난다..!

그렇기 때문에 특정 데이터베이스의 config 파일에 @Primaery 어노테이션을 붙여서 Bean을 생성해주고, 그 외에 데이터베이스 설정 파일에는 @Qualifier 어노테이션 같은 걸로 지칭을 해줘야 한다.

그래서 필자는 기존에 사용하던 DB 설정 파일에 Primary를 붙여서 사용하게끔 하고, 추가되는 DB 설정 파일에 @Qualifier 어노테이션을 붙여서 각각 설정했다.

  • @Primary를 붙인 설정파일

  • @Qualifier를 붙인 설정파일

Config파일 작성 순서 요약

  1. @Configuration 어노테이션을 붙여서 Spring Framework가 기동시 등록할수 있게 한다.

  2. @MapperScan 어노테이션을 사용해서 사용할 Mapper 인터페이스 경로를 지정하고, sqlSessionFactoryRef로 어떤 sqlSessionFactory를 사용할건지 지정한다 !! (중요 sqlSessionFactoryRef 를 지정하지 않으면 충돌나서 그런건지 BindingException 떨어진다.)

  3. 특정 DB 설정 파일에 @Primary 어노테이션을 붙여준다.

    • Spring은 Bean 관리를 싱글톤으로 관리하기 때문에, dataSource가 여러개 있으면 어떤 Bean을 주입할지 모르기때문에 N개 중 1개 파일에는 @Primary 어노테이션을 붙여준다.
  4. DataSource 메소드 작성

    • 서버 설정 파일의 어떤 dataSource를 사용할건지 경로를 지정한다. (@ConfigurationProperties 어노테이션)
  5. SqlSessionFactory 메소드 작성

    • 메소드 인자로 DataSource를 받는데, 이때 @Qualifier 어노테이션을 사용해서 DataSource을 지정해서 충돌 안나게하기 (@Primary 붙인 파일은 예외)
    • Mapper Xml 경로 알맞게 지정 (필자는 DB별로 폴더를 따로 나눠서 관리했기 때문에 각각 지정해줬다)
  6. SqlSessionTemplate 메소드 작성

    • 메소드 인자로 SqlSessionFactory를 받는데, 이때 @Qualifier 어노테이션을 사용해서 sqlSessionFactory를 지정해서 충돌 안나게하기 (@Primary 붙인 파일은 예외)

위와 같이 설정 한 다음 Service 단에서 각각의 Mapper를 사용해서 DB에 접근하면 된다.

profile
백엔드 개발자의 소소한 개발 기록.

0개의 댓글