728x90
IOC (Inversion of Control)
- 제어의 역전이라는 의미
- 애플리케이션 흐름의 주도권을 Spring이 갖는다라는 것
- 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 함
- 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 함
- IOC 컨테이너는 객체의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 객체의 생명주기를 관리
DI(Dependency Injection)
의존성
- 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것
- A 객체가 B 객체 없이 동작 불가능한 상황을 'A가 B에 의존적이다'라고 표현
public class Store {
private Pencil pencil;
public Store() {
this.pencil = new Pencil();
}
}
/*
두 클래스가 강하게 결합되어 있음
객체들 간의 관계가 아니라 클래스 간의 관계가 맺어짐
*/
연필 없으면 장사를 할 수 없는 일이 발생
➔ 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미
발생하는 근본적인 이유는 Store에서 불필요하게 어떤 제품을 판매할 지에 대한 관심이 분리되지 않았기 때문이다.
Spring에서는 DI를 적용하여 이러한 문제를 해결하고자 하였다.
의존성 주입
- 어떤 객체가 필요한 객체를 외부에서 밀어 넣는 것
- 종속적인 걸 느슨하게 만듬, 모듈 간의 결합도가 낮아지고 유연성이 높아짐
- Spring Framework에서 적용한 것으로 생각해보면 생성자를 통해서 어떤 클래스의 객체를 전달 받는 것
- 1) 생성자 주입과 2) Setter 주입을 사용
➔ 주입은 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.
➔ 어떤 객체에 의존하든 자신의 역할은 변하지 않는다.
public class Store {
private Product product;
public Store(Product product) {
// 외부에서 상품을 주입(Injection)받아야 한다
// Store에서 구체 클래스에 의존하지 않게 된다
this.product = product;
}
}
public interface Product {
}
public class Pencil implements Product {
}
public class BeanFactory {
public void store() {
// Bean의 생성
Product pencil = new Pencil();
// 의존성 주입
Store store = new Store(pencil);
}
}
- A객체에서 B/C 객체를 직접 생성하는 방식
- A는 B/C가 필요하다는 신호만 보내고, B/C 객체를 주입하는 것은 외부에서 이루어지는 방식
의존성 주입의 장점
- 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
- 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
- 유지보수가 쉬우며 테스트가 용이해진다
- 확장성을 가진다
의존성 주입의 단점
- 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
- 주입된 객체들에 관한 코드 추적이 어렵다.
- 초기 개발 노력이 필요하다.
- 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.
ApplicationContext
- 필요한 객체를 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조
- 스프링에서는 ApplicationContext가 관리하는 객체들을 'Bean(빈)'이라는 용어로 부름
- 빈과 빈 사이의 의존관계를 처리한느 방식으로 XML 설정, 어노테이션 설정, Java 설정 방식을 이용
- 별도의 설정 정보를 참고하고 IoC를 적용하여 빈의 생성, 관계설정 등의 제어 작업을 총괄
의존성 주입 컨테이너 어노테이션
2023.09.14 - [Spring] - @Component, @Bean 어노테이션
728x90