[Spring] : Spring IoC/DI

dohyoungK·2024년 5월 10일
0

면접 스크립트

목록 보기
27/30
post-thumbnail

[Spring] : Spring IoC/DI


IoC (Inversion of Control)

IoC 제어의 역전이란, 메소드나 객체의 호출 작업을 개발자가 결정하는 게 아니라 외부에서 결정되는 것을 말한다.

객체의 의존성을 역전시켜 객체 간 결합도를 줄이고 유연한 코드를 작성 가능하게 함으로써 가독성과 코드 중복, 유지 보수를 편하게 할 수 있다.

기존과 다르게 스프링에서는 의존성 객체를 생성할 때 제어권을 스프링에 위임해 스프링이 만들어 놓은 객체를 주입함으로써 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리한다.

스프링 IoC 컨테이너

스프링은 객체의 생성, 관계설정, 사용 제거 등의 작업을 애플리케이션과 독립된 컨테이너를 통해 실행한다.

우리가 new 키워드를 사용해 객체를 생성하고, 의존성을 주입하고, 연관관계를 맺었다면 스프링은 빈으로 등록하는 것 만으로 컨테이너에게 객체들을 관리받을 수 있다.

컨테이너는 여러 계층으로 이루어져 있는데, 빈을 생성하고 의존성을 주입하는 BeanFactory, 애플리케이션을 동작시키기 위한 ApplicationContext가 존재한다.


DI (Dependency Injection)

DI 의존성 주입이란, 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로
객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입시켜주는 방식이다.

의존성 주입에는 세 가지 주요 스타일이 있다.

생성자 주입

public class A {
    private final B b;
    
    @Autowired
    public A(B b) {
        this.b = b;
    }
}

스프링에서 권장하는 방식이다.

Setter 주입

public class A {
    private final B b;
    
    @Autowired
    public void setB(B b) {
        this.b = b;
    }
}

필드 주입

public class A {
	@Autowired
    private B b;
}

가장 간단한 방법으로 변수에 @Autowired 붙여 사용한다.

대부분의 의존 관계는 어플리케이션 종료까지 변경될 일이 없다.

만약 setter 주입을 사용한다면 실수로라도 변경 가능성이 생기지만 생성자 주입은 호출 시점에 1번만 호출하기 때문에 불변으로 설계가 가능하다.

또한 단위 테스트시에 setter 주입은 임의의 관련 객체를 만들어야 하지만 누락 발생 가능하다.

하지만 생성자 주입을 사용하면 누락을 막을 수 있다.

이러한 이유들로 인해 생성자 주입을 권장하고 있다.

DI의 장점은 아래와 같다.

  • 의존성이 줄어들어 변경에 덜 취약해진다.
  • 가독성이 높아진다.
  • 재사용성이 높아진다.

0개의 댓글