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

Ambition님의 프로필 이미지
Ambition

작성한 질문수

스프링 핵심 원리 - 기본편

스프링 컨테이너 생성

안녕하세요 스프링 컨테이너를 들으면서 정적인 의존관계와 동적인 의존관계가 어떻게 연결되는지 궁금합니다.

작성

·

427

0


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

[질문 내용]
추상적인 내용을 코드로 먼저 보여드리고 질문하겠습니다. 먼저 정적인 클래스 의존관계는 다음과 같은데요

import hello.core.discount.DiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;

public class OrderServiceImpl implements OrderService{
    
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

제가 이해한 바로는, DIP 원칙을 지키기 위해 생성자를 통한 인터페이스 주입을 해야 한다고 들었습니다.

다음은 동적인 인스턴스 의존관계 관련 코드입니다.

public class AppConfig {  
   
    public MemberService memberService() {  
        
        return new MemberServiceImpl(memberRepository());  
    }  
  
    public MemberRepository memberRepository() {  
        return new MemoryMemberRepository();  
    }  
  
    public OrderService orderService() {  
        return new OrderServiceImpl(memberRepository(), discountPolicy());  
    }  
  
    public DiscountPolicy discountPolicy() {  
        return new RateDiscountPolicy();  
    }  
}

먼저 앱을 실행하기 전인 정적인 클래스 의존관계 단계에서 생성자를 통한 인터페이스 의존성 주입으로 OrderService 객체가 MemberRepository와 DiscountPolicy 인터페이스를 사용할 것이라고 알린 후, 실제로 앱을 구동하면 런타임 환경에서 사용할 인스턴스를 생성하고 이전의 정적인 클래스 단계에서 주입한 것을 구현 객체로 반환하면서 의존성이 물리적으로 연결되었다고 볼 수 있나요? 그래서 정적인 단계와 동적인 단계로 구분한 것인가요?

답변 1

0

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

스프링 컨테이너에서 정적인 의존관계와 동적인 의존관계가 어떻게 연결되는지 궁금하시군요.

정적인 의존관계는 코드상에서 클래스 간의 의존관계를 나타내는 것으로, 직접 코드에서 의존하는 클래스를 호출하는 방식입니다. 여기에서는 OrderServiceImpl 클래스가 MemberRepository와 DiscountPolicy 인터페이스에 의존하는 것을 확인할 수 있습니다.

동적인 의존관계는 스프링 컨테이너에서 의존하는 객체를 주입받는 방식입니다. 스프링 컨테이너는 객체 생성과 의존성 주입을 담당하며, 주입 받을 객체의 타입을 스프링 컨테이너에 알려주면 컨테이너가 해당 타입의 객체를 생성하여 주입해줍니다.

이전에 작성하신 예시 코드에서 OrderServiceImpl 클래스는 MemberRepository와 DiscountPolicy 인터페이스에 의존하고 있습니다. 이 의존 객체들은 외부에서 주입받습니다. 스프링 컨테이너를 사용한다면, 아래와 같이 해당 의존 객체를 스프링에 등록하여 주입받을 수 있습니다.

@Configuration
public class AppConfig {

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

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

@Bean
public OrderService orderService() {
    return new OrderServiceImpl(memberRepository(), discountPolicy());
}

}

위 코드에서 @Configuration 어노테이션은 해당 클래스가 스프링의 설정을 담당하는 클래스임을 나타내고, @Bean 어노테이션은 스프링 컨테이너에 빈 객체를 등록하는 역할을 합니다. 각각 MemberRepository, DiscountPolicy, OrderService 객체를 스프링 컨테이너에서 관리하도록 등록하고, OrderServiceImpl에 필요한 객체들을 주입받아서 반환하도록 설정하였습니다.

이렇게 스프링 컨테이너를 통해 동적인 의존관계를 구성하면, 코드에서 객체간의 의존성을 직접 관리하지 않아도 됩니다. 스프링 컨테이너가 의존관계를 주입해주므로, 객체 간의 결합도가 낮고 유연한 설계를 할 수 있습니다.

더 자세한 내용이나 실제 코드 예시는 스프링 프레임워크의 의존성 주입(Dependency Injection)에 대해 알아보시면 도움이 될 것입니다. 감사합니다.

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기