DEVELOP/SPRING

IoC와 DI

콘순이 2025. 4. 25. 18:21

IoC(Inversion of Control) : 제어의 역전


원래 개발자가 직접 하던 '객체 생성'이나 '객체 사이의 의존 관계 설정' 같은 제어권스프링 프레임워크가 대신 맡는 것을 뜻함

예를 들어, 원래 개발자가 new 키워드로 객체를 직접 만들었겠지만, 스프링이 알아서 객체를 생성해서 관리해주고, 필요한 곳에 주입(injection)까지 해준다.

따라서, 제거(Control)가 개발자 -> 스프링으로 역전되었다는 의미로 IoC라고 부른다.

 

 

DI (Dependency Injection) : 의존성 주입


IoC 개념의 실행 방식 중 하나가 바로 DI이다.

어떤 객체가 다른 객체를 의존할 때, 원래는 개발자가 new로 직접 생성하거나 setter로 넣어준다. 

하지만, 이제는 스프링이 대신 객체를 만들어서, 알아서 주입해준다.

// 원래 방식
MemberService memberService = new MemberService(new MemberRepository());

// DI 방식
@Component
public class MemberService {
    private final MemberRepository memberRepository;

    // 생성자 주입
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

스프링은 @Component@Service, @Repository 같은 어노테이션을 보고 객체를 미리 만들어두고, MemberService 생성자에 알아서 주입을 해준다.

이게 의존성 주입(DI)이고, 이 방식을 통해서 제어의 역전(IoC)이 실현되는 것이다.

 

 

IoC 컨테이너 : 스프링 컨테이너


스프링에서 객체를 생성하고 관리하는 큰 통이 있다. 이걸 IoC 컨테이너라고 부르고, 스프링에서는 ApplicationContext에 해당한다.

  • 개발자가 등록한 @Component, @Bean 등을 읽기
  • 객체(빈, Bean)를 생성하기
  • 의존 관계 주입하기
  • 싱글톤으로 관리하기
  • 필요할 때 꺼내 쓸 수 있게 제공