작성
·
320
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
할인정책 같이 변경이 일어날 수 있는 상황에서 그냥 AppConfig에서는 @Bean에서 단지 return값을 바꿔주는 걸로 OrderServiceImpl라는 구체화 클래스에 변경 없이 의존관계주입을 바꾸어 주었는데 @Component로 빈 저장소에 저장한 뒤 @AutoWired로 자동의존관계 주입을 해줄때
1. RateDiscountPolicy와 FixDiscountPolicy 둘다 @Component로 빈 저장소에 저장을 하는 것인지
1-1. 만약 둘다 저장해서 @AutoWired하는 경우 어떤 정책을 사용할지는 OrderServiceImpl 생성자에 @Qualifier라는 에노테이션을 사용한다고 gpt가 알려 주더라구요 그럼 할인 정책을 바꾸게 되면 OrderServiceImpl 구체화 클래스에 변경이 일어나니 좋지 않는 코드이지 않은가 라는 의문과
아니면 그냥 사용 할 정책만 @Component해서 자동의존주입하는게 맞는건지 궁금합니다
혹시 제가 이상한 질문을 한거라면 그냥 강의나 다시보라고 말씀해주시면 감사드리겠습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
@Component와 @Autowired를 사용하여 의존성 주입을 할 경우, 정책에 변경이 생기면 구체화 클래스를 수정해야 할 때도 있습니다.
해당 상황에서는 AppConfig에서 @Bean 메서드를 통해 할인 정책을 변경하는 것보다는, @Component로 해당 정책을 빈으로 등록하고 @Autowired를 통해 주입하는 것이 더 효율적입니다.
만약 RateDiscountPolicy와 FixDiscountPolicy 둘 다 @Component로 빈으로 등록되어 있다면, OrderServiceImpl에서 어떤 정책을 사용할지 선택해야 합니다. 이 때 @Qualifier 애노테이션을 사용하여 명시적으로 어떤 빈을 주입할지 지정할 수 있습니다.
하지만 정책에 변경이 생길 경우, OrderServiceImpl에 변경이 발생하게 됩니다. 이는 좋지 않은 코드입니다. 따라서 이러한 문제를 해결하기 위해서는 인터페이스와 실제 구현 클래스를 분리하여 의존성 주입을 해주는 것이 좋습니다. 변경이 예상되는 정책에 대해서는 구현 클래스를 따로 생성하여 관리하는 것이 유지보수에 용이합니다.
따라서, @Component와 @Autowired를 사용하여 의존성 주입을 할 때는 구체화 클래스에 변경이 생길 수 있으므로, 유연한 설계를 위해 인터페이스와 구현 클래스를 분리하는 것을 권장합니다.
더 자세한 내용은 인프런의 스프링 강의나 관련 문서를 참고하시면 도움이 될 것입니다. 감사합니다.