인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

ㅈㅂㅇ님의 프로필 이미지
ㅈㅂㅇ

작성한 질문수

스프링 핵심 원리 - 기본편

다양한 의존관계 주입 방법

'다양한의존관계주입방법'강의 중 필드 주입

작성

·

432

0


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예

[질문 내용]

교재에 보면 참고: 부분에 '@Bean에서 파라미터에 의존관계는 자동주입된다. 수동 등록시 자동등록된 빈의 의존관계가 필요할 때 문제를 해결 할 수 있다' 되어있습니다.

앞의 @Bean에서 의존관계 자동주입되는것은 생성자주입(어노테이션이 없어도되는)을 통해 의존관계가 자동으로 주입된다고 이해했습니다.

그런데 다음 문장에서 수동등록시 자동등록된 빈의 의존관계가 필요할 때 문제를 해결한다라는 내용 자체가 정확히 이해가 되지않습니다. 빈을 수동등록한다는건지 의존관계를 수동등록한다는건지 아예 감이 안잡힙니다. 아래 OrderService 예시를 가지고 구체적으로 설명해주시면 감사하겠습니다.

답변 2

2

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

안녕하세요. ㅈㅂㅇ님

다음에 설명하는 코드는 수동으로 빈을 등록하는 코드입니다. 이 코드를 통해서 orderService가 스프링 빈으로 수동 등록 되는 것이지요. 참고로 자동 등록은 컴포넌트 스캔 같은 것을 뜻합니다.

@Bean
OrderService orderService(MemberRepository memberRepoisitory, DiscountPolicy discountPolicy) {
    return new OrderServiceImpl(memberRepository, discountPolicy);
}

스프링은 이 메서드를 실행해야 orderService를 스프링 빈으로 등록할 수 있는데요. 이때 파라미터로 정의한 MemberRepository, DiscountPolicy가 필요합니다.

스프링은 이때 자동이든, 수동이든 MemberRepository, DiscountPolicy가 스프링 빈으로 등록되어 있다면 스프링 빈으로 등록된 해당 빈들을 자동으로 파라미터에 대입해준다는 뜻입니다.

도움이 되셨길 바래요 :)

0

안녕하세요, 인프런 AI 인턴이에요.

다양한 의존관계 주입 방법 강의 중 필드 주입에 관한 질문이시군요.

먼저, @Bean 어노테이션을 사용해서 빈을 등록할 때, 파라미터에 의존관계를 자동으로 주입받을 수 있습니다. 이는 생성자 주입을 통해 이루어집니다. 하지만 수동으로 빈을 등록할 때 자동 등록된 빈의 의존관계가 필요한 경우에는 문제가 발생할 수 있습니다.

예를 들어, OrderService 클래스가 있다고 가정해보겠습니다. 이 클래스는 PaymentService 빈을 필요로 합니다. 보통 의존관계는 생성자 주입으로 해결하는 것이 좋지만, 수동으로 빈을 등록한 경우에는 생성자 주입이 자동으로 이루어지지 않습니다. 그래서 이때는 수동으로 빈의 의존관계를 지정해주어야 합니다.

간단한 예시로 설명드리자면, OrderService에서 생성자를 통해 PaymentService를 주입받고 싶을 때는 다음과 같이 코드를 작성할 수 있습니다.

public class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

하지만 수동으로 빈을 등록할 때는 이 생성자 주입이 자동으로 이루어지지 않습니다. 따라서 수동으로 등록한 다른 빈에 대한 의존관계를 수동으로 주입해야 합니다.

이렇게 필드 주입을 통해 의존관계를 해결하는 경우에는 @Autowired 어노테이션을 필드 위에 사용하면 됩니다. 즉, OrderService 클래스에서 필드 주입을 사용한다면 다음과 같이 코드를 작성할 수 있습니다.

public class OrderService {
    @Autowired
    private PaymentService paymentService;
}

이런 식으로 필드 주입을 통해 의존관계를 자동으로 해결할 수 있습니다.

더 자세한 내용은 해당 강의의 내용을 참고하시면 도움이 될 것 같습니다. 좋은 학습되세요!

ㅈㅂㅇ님의 프로필 이미지
ㅈㅂㅇ

작성한 질문수

질문하기