인프런 커뮤니티 질문&답변

harden님의 프로필 이미지
harden

작성한 질문수

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

빈 2개 이상일 때, Autowired의 DIP에 대한 질문

작성

·

271

1

안녕하세요! 좋은 강의 감사드립니다.

Impl 클래스에서 하위 타입을 직정 명시하는 DI의 경우 DIP를 위반하고 유연성이 떨어진다고 학습했습니다.

그런데 만약 빈 2개 이상일 경우 DI를 위한 3가지 방법들 모두 Impl 클래스의 수정이 필요할 때, 수정을 하는 것은 동일하다고 생각을 하는데 이 경우에는 DIP 위반이라고 볼 수 없는걸까요?

그리고 커스텀 어노테이션을 만들고 Qualifier를 사용하고, 롬복의 @RequiredArgsConstructor을 사용 할 때는 final 변수에 명시하면 될까요?

답변 3

4

맨 윗분 질문에 제 개인적인 생각을 덧붙이자면 하위 구현체를 바로 명시하는 것은 DIP원칙에 위반되는 것이 맞습니다. 결국 역할과 구현에 모두 의존하는게 되니 말이죠.

하지만 단순히 우선순위를 명시해 주는 것은 결과적으론 추상화에 의존 하기 때문에 DIP원칙은 위배되지 않습니다. @primary를 쓸 경우 코드상에는 아무런 의존관계도 명시되지 않습니다. 하지만 이러한 코드 추가가 수정이라는 관점에서는 OCP원칙에 의거해서 봤을 때 좀 더 생각해봐야 할 거 같네요.

김석중님의 질문에 대한 제 생각은, 어노테이션을 추가하는 작업은 기존 코드를 수정하는 작업과는 조금 별개로 볼 수 있지 않을까요? 

@primary를 사용할 경우 기존 Impl 클래스에서는 아무것도 변경 할 것이 없습니다. 단지 주입되는 대상 클래스에 @primary만 추가해주면 되는 것이죠.  @primary 대상이 바뀌면 바뀐 대상에만 해당 어노테이션을 붙여주면 됩니다.

이정도 수정은 스프링빈에 등록하기 위해 @conponent를 붙이는 것과 별반 다르지 않다고 생각합니다. 또한 확장을 했음에도 의존관계를 주입 받는 Impl 클래스에는 어떠한 코드의 변화도 없었습니다. 

그러므로 OCP원칙에 위배되지 않는다고 생각됩니다.

제 개인적인 의견일 뿐입니다. 잘못됬거나, 의문 사항, 또는 모순이 있다면 언제든 말씀주시기 바랍니다. 감사합니다!

1

저도 비슷한 의문이 들었는데 빈이 2개 이상일 때, @Primary나 @Qualifier를 사용하여 자동주입을 설정하면, 정책에 변경이 있어 Fix -> Rate로 바뀌었을 때 변경에 닫혀있어야 하는 OCP에 어긋나는 것이 아닌가 생각이듭니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. harden님

도움을 드리고 싶은데, 첫번째 질문은 어떤 내용을 질문하시는지 제가 이해를 잘 못했습니다. 구체적인 예시를 자세히, 코드로 풀어서 설명부탁드립니다.

두번째 질문은 https://www.inflearn.com/questions/71872 를 참고해주세요.

감사합니다.

harden님의 프로필 이미지
harden

작성한 질문수

질문하기