[Spring] IoC, DI

Hoon·2022년 10월 6일

Spring

목록 보기
3/18

IoC (Inversion of Control)

아래와 같은 코드는 클라이언트가 필요한 서버 구현 객체를 스스로 생성하고, 연결하고, 실행하였다. 즉 구현 객체가 프로그램의 제어 흐름을 스스로 조종하였다. 또한 아래 주석에 있는 문제가 일어난다.

public class MemberService {
    
    // 구현체 의존 DIP 위반
    // 구현체 변경을 하려면 클라이언트에서 수정해야 하므로 OCP 위반
    private MemberRepository memberRepository = new JdbcMemberRepository(); 
    
    // private MemberRepository memberRepository = new MemoryMemberRepository();
}

여기서 IoC를 적용하여 보자.

아래의 AppConfig 클래스는 프로그램의 제어를 담당하는 클래스이다.

public class AppConfig {

    public MemberRepository memberRepository() {
        return new JdbcMemberRepository();
    }

    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

}
public class MemberService {

    // 클라이언트는 인터페이스에만 의존한다. DIP O
    // 구현체를 변경해도 클라이언트의 변화는 없다. OCP O
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public String save(String username) {
        return memberRepository.save(username);
    }
}

이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 IoC(제어의 역전)이라고 한다.

DI (Dependency Injection)

public class MemberService {

    private final MemberRepository memberRepository;

	// MemberRepository 의존
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public String save(String username) {
        return memberRepository.save(username);
    }
}

위의 코드에서 MemberService는 MemberRepository를 의존하고 있다. 하지만 실제 어떤 객체가 MemberService에 주입될지 모른다.

애플리케이션 실행시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트(위 코드에선 MemberService)와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입이라고 한다.

IoC설명때 나온 AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC컨테이너 혹은 DI컨테이너라 한다.

Reference

스프링 핵심 원리 - 기본편 (김영한님)

profile
개발이 즐거워

0개의 댓글