[Springboot] IoC/DI

찌니·2023년 4월 6일
0

Spring Boot

목록 보기
1/2

안드로이드 할때 너무 어려웠던 di를 또 보다니...
코드를 기반으로 설명하겠습니다

1)

class A{
	private B b;
    
	public A(){
    	B b = new B();
    }
}

A a = new A();

2)

class A{
	private B b;
    
	public A(){
    }
    public void setB(B b){
    	this.b = b;
    }
}
B b = new B();
A a = new A();
a.setB(b);

IoC (제어의 역전)

IoC(Inversion of Control)란?
IoC란 제어의 역전으로 개발자가 객체를 생성하고, 의존성을 맺어주고, 초기화를 해주는게 아닌 스프링 컨테이터로 제어권이 넘어가 생명주기를 대신 관리해주는 것을 말한다. 이는 제어권의 흐름이 바뀌어 제어의 역전이라고 한다. 제어권이 컨테이너로 넘어옴으로써 객체 간의 결합도를 줄이고, 유연한 코드를 작성하게 하여 가독성 및 코드의 중복, 유지보수를 편하게 할 수 있게 한다.

DI (의존성 주입)

Di(Dependency Injection)란, 스프링 컨테이너가 다른 객체와 의존성을 맺어주는 행위이다. 필요한 클래스를 직접 생성하는 것이 아닌, 주입을 통해 객체 간의 결합도를 줄이고 좀 더 유연한 코드를 작성하는 것이 가능하다. 즉, 객체를 직접 생성하는 것이 아닌 외부에서 생성한 후 주입을 시켜주는 방식이다.

DIIoC를 달성하는 디자인 패턴중 하나이다. 즉, IoC는 외부에서 객체들을 제어하는 원칙이고, DI는 외부에서 객체를 주입해준다는 구체적인 행위인 것이다

너무 어려운 설명이지만, 코드로 간단히 보자면 1)은 B라는 객체를 A에서 직접 관리하고 있다. 하지만 2)의 코드의 경우에는 내부에서가 아닌 외부에서 관리해 제어를 역전시키고 있습니다. 이를 IoC라고 하며, 외부에서 객체를 생성해 주입시켜줌으로써 DI를 사용한다고도 말할 수 있다.

이렇게 되면, A 내에 B가 있는 것이 아닌 A와 B를 개별적으로 생성해 결합력을 낮출 수 있다.
그리고 스프링에서는 Bean으로 등록된 객체에 IoC 컨테이너가 관리해 자동으로 의존성을 주입해줄 수 있다.

class A{
	@Autowired
    private B b;
}

이 코드로 위 코드를 대신할 수 있는 것이다. 하지만 이 방법은 필더 주입으로, 스프링측에서도 추천하지 않는 방법이다. 위 2) 코드는 setter 주입 방법으로 스프링이 자동으로 setter를 사용해 자동으로 주입을 해줄 수 있습니다. 하지만 이 방법은 의존성의 불변을 보장할 수 없기 때문에 주로 의존성을 수정해줄때나, 선택적으로 주입할때 사용한다.
세번째 방법으로는 생성자 주입이 있는데,

class A{
	private B b;
    
    public A(B b){
    	this.b = b;
    }
}
A a = new A();

이 방법으로 객체의 최초 생성시에 스프링이 의존성을 주입해줄 수 있다. 그리고 이 방법을 스프링은 가장 추천한다고 한다.

*여기서 컨테이너란?

스프링에서 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이라 할 수 있다. 스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다. 이때 스프링 컨테이너에서 생성된 객체를 Bean 이라고 한다

profile
찌니's develog

0개의 댓글