거꾸로 바라본 세상
Published 2023. 3. 29. 23:47
[Spring Framework] IOC/DI Spring
반응형

IOC/DI

제어의 역전(IoC) / 의존성 주입(DI) 은 객체 지향 프로그래밍에서 오브젝트의 생명주기와 의존관계를 외부에서 관리하는 프로그래밍 모델을 말한다.

1. IOC

Inversion of Control이라는 용어로 제어의 역전이라고 한다.

개발자가 객체의 생성 또는 생명주기를 직접 제어하는 하지 않고 외부에서 객체를 생성하고 제어 및 관리하여 객체간의 의존성을 해결하한다. 즉, 제어권한을 다른 대상에게 위임하는 것을 말한다. (Bean을 관리해주는 Container)

이를 통해 객체 간의 결합도를 낮추고 유연성과 확장성을 높일 수 있다.

스프링 프레임워크 에서는 IOC Container가 존재하며 ApplicationContext와 Bean Factory라는 핵심 컨테이너가 있다. Bean을 등록/생성/조회 하고 그 외 빈 관리하는 기능을 담당한다.

이런 IOC Container는 Bean 객체를 관리한다.

BeanFactory

  • Bean 등록/생성/조회/반환을 관리
  • BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용
  • getBean() 메서드가 정의되어 있다.

ApplicationContext

  • Bean 등록/생성/조회/반환을 관리 (=BeanFactory)
  • Spring의 각종 부가 서비스를 추가로 제공
  • Spring이 제공하는 ApplicationContext 구현 클래스가 여러 가지 종류가 있다.(StaticApplicationContext, GenericXmlApplicationContext, WebApplicationContext,XmlWebApplicationContext)

2. DI

Dependency Injection라는 용어로 의존관계 주입이라고 한다.

스프링에서 지원하는 IoC의 한 형태로 객체 간의 의존 관계를 외부(IOC)에서 생성하여 주입하는 방식으로 객체 간 의존성을 문제를 해결해줄 수 있다. 스프링에서는 Bean 설정 정보로 바탕으로 컨테이너가 자동으로 연결해준다.

 

Spring에서 DI의 주입 방법

  • Constructor Injection : 생성자 삽입
    • 스프링에서 가장 권장하는 방법이다.
    • 4.3이상 버전부터 @Autowired의 생략가능
private final CustomerRepository customerRepository;

@Autowired
public CustomerServiceImpl(CustomerRepository customerRepository) {
		this.customerRepository = customerRepository;
}
  • Field Injection : 멤버 변수 삽입
    • 일반적이고 쉬운방법이지만 Runtime시에 순환참조 문제가 발생할 수 있다.
@Autowired
private CustomerRepository customerRepository;
  • Method(Setter) Injection : 메소드 매개 변수 삽입
    • 생성할 때 의존성을 주입하지 않고, 원할 때 함수를 호출하여 의존성 주입을 할 수 있다.
private customerRepository customerRepository;

public void setCustomerRepository(CustomerRepository customerRepository) {
    this.customerRepository = customerRepository;
}
반응형
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!