다중 DB 사용시 오류와 @Primary

크리링·2023년 8월 28일
0

오늘의 문제

목록 보기
8/9
post-thumbnail

이번에 하는 관리자 프로젝트를 새로 만들어서 초기 설정 중 오류가 발생했다.
관리자 프로젝트의 경우 두개의 AWS RDS DB를 사용한다.

1. 관리자용 DB
2. 서비스 DB

하지만 이 DB를 사용하면서 예기치 않은 해당 오류를 맞이하였다.
java.lang. IllegalArgumentException: org.hibernate.hql.internal.ast. QuerySyntaxException: User is not mapped



환경

Spring Boot - 2.7.0
Java - 11



문제 내용

당시 상황에서 Admin DB에 접근하는 테스트는 문제가 없었지만 새로운 DB 환경을 추가하고 다음과 같은 에러가 발생했다. 버전 문제나 build 설정에서 문제가 발생했는지 다양하게 찾아보았다.

구글링을 어느정도 해본 결과 DB의 설정이 잘못 돼있어서 다른 서비스 DB에 들어있는 User 테이블을 불러오지 못했다는 문제라는 것을 파악했다.


DB 설정 파일 모두 경로에 문제가 있지 않았다. 그렇다면 원인은 어디서 왔을까?



원인과 해결

원인은 @Primary의 위치에 있었다. 위의 상황에서 @Primary 어노테이션이 Admin DB Config 쪽에 위치해서 발생한 문제였다. @Primary 어노테이션을 Service DB Config 쪽에 위치하니 코드가 정상적으로 동작하였다.

@Primary가 설정 간의 충돌을 막아주고 우선 주입시켜 주는 것으로 알고있었는데, 해당 프로젝트는 관리자 페이지이니 Admin DB Config가 우선 주입 필요하다 생각되어 주입시켰는데 어떤 문제가 발생한 것일까?



@Primary

일단 @Primary 어노테이션은 다음의 역할을 한다.

다중 후보가 단일 값 종속성을 자동 연결하도록 규정될 때 Bean에 우선 순위를 부여해야 함을 나타낸다.
후보들 사이에 정확히 하나의 Primary bean이 존재한다면 autowired 값이 될 것입니다.

위 문제에서는 우선 순위의 기준이 관리자 페이지여서 Admin DB가 아니라 자주 사용하는 Service DB@Primary 어노테이션이 붙어있는 것이 더 적합하다.



우선순위에 대해 어떻게 부여할 것인지 잘못 파악해서 생긴 문제였다. 관리자 페이지여서 관리자가 우선순위가 아니라 얼마나 더 DB에 많이 접근하는지를 생각해 볼 필요가 있는 계기가 되었다. 요즘들어 생각이 들지만 생각보다 내 생각이 맞는지 확인하는 절차가 중요하고 그래서 테스트를 성실히 해야된다고 느낀다.



참고

0개의 댓글