이번에 하는 관리자 프로젝트를 새로 만들어서 초기 설정 중 오류가 발생했다.
관리자 프로젝트의 경우 두개의 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
어노테이션은 다음의 역할을 한다.
다중 후보가 단일 값 종속성을 자동 연결하도록 규정될 때 Bean에 우선 순위를 부여해야 함을 나타낸다.
후보들 사이에 정확히 하나의Primary
bean이 존재한다면 autowired 값이 될 것입니다.
위 문제에서는 우선 순위
의 기준이 관리자 페이지여서 Admin DB
가 아니라 자주 사용하는 Service DB
에 @Primary
어노테이션이 붙어있는 것이 더 적합하다.
우선순위에 대해 어떻게 부여할 것인지 잘못 파악해서 생긴 문제였다. 관리자 페이지여서 관리자가 우선순위가 아니라 얼마나 더 DB에 많이 접근하는지를 생각해 볼 필요가 있는 계기가 되었다. 요즘들어 생각이 들지만 생각보다 내 생각이 맞는지 확인하는 절차가 중요하고 그래서 테스트를 성실히 해야된다고 느낀다.