[Spring] IoC, DI

dustle·2023년 8월 21일

IoC(Inversion Of Controll)

  • 개발자가 직접 오브젝트 생성하고 관리하는 것이 아니라 스프링 프레임워크에서 관리 대상을 생성하고 관계를 맺어 줍니다.
  • ApplicationContext 에서 작동 (스프링컨테이너 / IoC 컨테이너)
  • IoC 컨테이너는 객체를 생성하고, 의존관계를 설정하고 생명주기를 관리합니다.
  • 구현 관계 : BeanFactory ← ApplicationContext ← WebAppliactionContext

IoC 용어 정리

  1. bean : 스프링에서 제어권을 가지고 직접 만들어 관계를 부여하는 오브젝트
  • 스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 빈은 아닙니다.
    (ex: 개발자가 new 로 만든 객체)
  • 스프링의 빈은 스프링 컨테이너가 생성하고 관계설정, 사용을 제어해주는 오브젝트를 말합니다.
  1. bean factory : 스프링의 IoC를 담당하는 핵심 컨테이너
  • Bean을 등록/생성/조회/반환/관리 한다. 보통 bean factory 를 바로 사용하지 않고 이를 확장한 application context 를 이용합니다.
  • BeanFactory는 bean factory가 구현하는 interface 입니다. (getBean() 등의 메서드가 정의)
  1. application context : bean factory를 확장한 IoC 컨테이너
    Bean의 등록/생성/조회/반환/관리 기능은 bean factory와 같지만, 추가적으로 spring의 각종 부가 서비스를 제공 합니다.
    ApplicationContext 는 application context가 구현해야 하는 interface이며, BeanFactory를 상속합니다.
    <부가 서비스>
  • MessageSource : 메시지 다국화를 위한 인터페이스
  • EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
  • ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
  • ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
  1. configuration metadata : application context 혹은 bean factory가 IoC를 적용하기 위해 사용하는 메타정보
  • 스프링의 설정정보는 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만 주로 bean을 생성/구성하는 용도로 사용합니다.
  1. container (ioC container) : IoC 방식으로 bean을 관리한다는 의미에서 bean factory나 application context를 가리킵니다.
  • application context는 그 자체로 ApplicationContext 인터페이스를 구현한 오브젝트를 말하기도 하는데, 하나의 애플리케이션에 하나의 ApplicationContext 객체가 만들어집니다.
  • 이를 통칭해서 spring container라고 부를 수 있습니다.

DI(Dependency Injection)

  • 의존관계 설정을 런타임 시에 스프링에서 대신 해줍니다.

  • 필드 주입 방식

    • @Autowired
    • SRP 위반
    • 의존성 숨음
    • final 키워드 불가 (불변성 깨짐)
    • 런타임시 주입
  • setter 주입 방식

    • 선택적인 의존성 사용 가능합니다.
    • 런타임시 주입 → 낮은 결합도 순환참조 터져도 확인이 불가능합니다.
    • 주입이 필요한 객체가 주입 되지 않아도 객체 생성이 가능합니다.
  • 생성자 주입 방식

    • 의존성 없이 Instance 생성이 불가능
    • 객체 생성하는 시점에 필요한 빈 주입
    • 애플리케이션 구동 시점에서 순환 참조 오류 찾기 가능

0개의 댓글