• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@Primary vs @Qualifier 관련 질문입니다.

18.10.21 10:04 작성 조회수 207

7

백기선님 안녕하세요. 강의를 잘 듣고 있습니다.

강의 중 강사님께서 같은 인터페이스를 구현한 빈이 여러개 있을 경우 주입하는 방법으로 @Primary와 @Qualifier라는 두 개의 어노테이션에 대해 설명해주셨습니다. 그러면서 Type-Safety 때문에 @Primary 어노테이션을 사용하길 권장한다고 말씀해주셨습니다. 이 부분에 대해서 질문이 있습니다.

@Primary 어노테이션을 사용할 경우를 생각해 보았을 때 두 가지 경우가 생각납니다.

1번, 인터페이스를 구현한 클래스가 여러 개이고 등록된 빈이 여러 개이나 실제로는 하나의 빈만 사용할 경우
2번, 인터페이스를 구현한 클래스가 여러 개이고 등록된 빈이 여러 개이며 실제로 여러 개의 빈을 사용할 경우

1번 경우에 대해선 사용하지 않는 클래스를 지워버리거나 최소한 빈으로 등록하지 않는게 맞지 않나 생각합니다.

2번 경우에 대해선 (인스턴스 변수 이름을 맞춰 주입받는 경우를 제외한다면) 어짜피 @Qualifier와 같이 사용할 수 밖에 없지 않나 생각합니다. 그럴 경우 어짜피 @Qualifier를 사용하는 코드에선 Type-Safety가 무너지게 됩니다. @Primary와 @Qualifier를 같이 사용하는 것 vs @Qualifier를 사용하는 것에서 서로 장단점이 있을 것 같습니다. 같이 사용하면 Type-Safety하지 않은 부분을 조금이라도 줄일 수 있다는 장점이 있을 것 같습니다. @Qualifier만 사용한다면 두 개의 어노테이션을 사용하는 것 보다 코드에서 일관성이 생길 것 같습니다. 저는 @Qualifier만 사용하여 일관성을 가져가는게 좋다고 생각하는데 강사님께선 조금이라도 Type-Safety 하지 않는 부분을 줄이는 것 때문에 @Primary 사용을 권하신건지 혹은 제가 알아차리지 못한 다른 이유가 있는 것인지 궁금합니다.

답변을 기다리겠습니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

5

우와 좋은 질문이자 토론거리가 될 수 있는 글이네요. 우선 감사합니다.

먼저, 1번인 경우에 저도 동의합니다.

2번인 경우에 @Primary를 써야 하는 경우가 있는데, 가령 해당 타입의 빈 하나를 스프링 부트의 자동 설정으로 만들어지는 빈들이 그 특정 타입의 빈을 사용하고 있는 경우입니다. 대표적으로 DataSource가 그러한데요. 만약에 DataSource를 두 개 이상 사용해여 하는 경우에, 스프링 부트가 제공하는 여러 데이터 관련 빈들이 DataSource 타입의 빈을 주입 받아 사용하고 있을텐데, 그 때에는 @Primay를 사용해서 여러개 중 하나를 명시해 주어야 해당 DataSource를 스프링 부트가 제공하는 인프라성 빈들이 참조해서 쓰게 되니까 불필요하게 해당 모든 빈들을 직접 설정해야 하는 수고를 덜 수 있습니다. (물론 다른 DataSource용 인프라 빈들은 직접 또 등록해야 겠지만요.ㅋ)

@Qualifier와 같이 사용하는 경우는 빈들의 의존성을 우리가 직접 관리할 수 있는 경우에 유리할 것입니다. 그리고 스프링이 제공하는 애노테이션들은 조합이 가능한 애노테이션들입니다. 그 부분도 수업에서 언급을 했으면 좋았을텐데, 애노테이션을 여러개 붙이는게 번거롭다면 커스텀 애노테이션을 만들어 하나로 줄일 수도 있지요.

맞습니다. 말씀하신대로 저는 개인적으로 가능한한 타입 안정성을 보장하는 방식으로 코딩하는 것을 선호해서 그렇게 말씀드렸을 뿐 @Qualifier를 쓰지 말아야 할 이유는 없습니다.

수강해 주셔서 감사하구요. 앞으로도 좋은 질문 부탁드립니다.

감사합니다.

1

박태민님의 프로필

박태민

질문자

2018.10.21

빠르게 답변 주셔서 감사합니다. 앞으로도 좋은 강의 부탁드립니다 :)