강의

멘토링

로드맵

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

박진우님의 프로필 이미지
박진우

작성한 질문수

스프링 핵심 원리 - 기본편

다양한 의존관계 주입 방법

결론적으로 DI를 관리하는 것은 AppConfig에서 하나요?

작성

·

348

·

수정됨

0

@Component 애노테이션을 사용하여 스프링 빈에 자동으로 클래스를 등록하고, 각 스프링 빈 간의 의존관계를 주입하는 방법에 대해 이해했습니다.

의존관계 주입의 목적이, SOLID원칙에서 특히 DIP원칙을 위반하지 않기 위함이라고 생각됩니다. 추상화에 의존하고, 클라이언트 코드의 변경을 줄이기 위함입니다.

그렇다면 실제 런타임에서 인스턴스(구현체)간의 의존 관계를 주입해주는 로직은 AppConfig에서 진행되는 건가요?

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {

        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

}

위 코드는 기존에 사용하던 AppConfig클래스입니다. 여기서는 @Bean을 사용하여 수동으로 빈 등록을 해주므로 충돌이 존재할 것이라 무언가 수정이 필요하다고 생각되고 @Bean만 제거한 코드를 사용하면 되나요?

생성자 주입을 통해 DI를 하는 것은 이해가 되었으나, AppConfig처럼 하나의 파일에서 런타임에 사용 될 의존관계를 정하는 코드가 궁금합니다

 

퀴즈

66%나 틀려요. 한번 도전해보세요!

필드 주입(Field Injection) 방식이 일반적으로 권장되지 않는 이유는 무엇일까요?

불변성을 보장하기 어려워서

의존성 변경이 쉬워서

순수 Java 코드로 테스트하기 어려워서

설정 코드 작성이 복잡해서

답변 1

1

안녕하세요. 박진우님, 공식 서포터즈 David입니다.

지금 작성하신 AppConfig를 통해 빈 의존관계가 설정됩니다.

충돌을 회피하기 위한 거라면 @Bean만 제거하셔도 됩니다.

AppConfig처럼 하나의 파일에서 런타임에 사용 될 의존관계를 정하는 코드가 궁금합니다 이 말씀이 정확히 어디의 어떤 코드가 궁금하신 건지 이해가 잘 안 됩니다🙂

감사합니다.

박진우님의 프로필 이미지
박진우

작성한 질문수

질문하기