1. IoC (Inversion of Control, 제어의 역행)
-
객체지향 언어에서 Object간의 연결 관계를 런타임에 결정
-
객체 간의 관계가 느슨하게 연결됨(loose coupling)
-
IoC의 구현 방법 중 하나가 DI(Dependency Injection)
-
Spring DI Container
- Spring DI Container가 관리하는 객체를 빈(Bean)이라 한다
- 빈 들의 생명주기(life-cycle)를 관리한다는 뜻으로 빈 팩토리(BeanFactory)라 한다.
- BeanFactory에 여러 가지 컨테이너 기능을 추가한 ApplicationContext가 있다.
-
객체 제어 방식
- 기존 : 필요한 위치에서 개발자가 필요한 객체 생성 로직 구현
- IoC : 객체 생성을 Container에게 위임하여 처리
-
IoC 사용에 따른 장점
- 객체 간의 결합도를 떨어뜨릴 수 있음 (loose coupling)
-
객체간 결합도가 높으면?
- 해당 클래스가 유지보수될 때 그 클래스와 결합된 다른 클래스도 같이 유지보수 되어야 할 가능성이 높음
2. DI(Dependency Injection) -> 의존성 주입
- 객체 간의 결합을 느슨하게 하는 스프링의 핵심 기술이다
-
객체사이의 의존관계를 자기자신이 아닌 외부에 의해서 설정된다는 개념이다
-
제어의 역행(IoC)이라는 의미로 사용한다.
-
DI컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역할을 한다.
-
느슨한 결합(loose coupling)의 주요강점
- 객체는 인터페이스에 의한 의존관계만을 알고 있으며, 이 의존관계는 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능하다
- 객체간 결합도가 강한 프로그램
- HelloApp에서 MessageBean을 직접 객체 생성하여 사용하고 있다.
- MessageBean 클래스를 다른 클래스로 변경할 경우 HelloApp의 소스를 같이 수정해주어야 한다.
- 인터페이스를 사용하여 객체간 결합도를 낮춘 프로그램
- HelloApp은 MessageBean이라는 인터페이스를 통해서 객체를 사용한다
- 일반적으로 팩토리 메서드를 활용하여 사용할 객체(MessageBeanKo 또는 MessageBeanEn)를 생성한다. MessageBean이라는 MessageBeanKo의 객체가 생성되든 MessageBeanEn의 객체가 생성되든 HelloApp는 수정될 사항이 없다.
- 스프링을 사용한 객체간 결합도를 낮춘 프로그램
- 프로그램에서 필요한 객체를 스프링컨테이너가 미리 생성하여 이 객체를 필요로 하는 프로그램에 생성자 또는 Setter 메서드를 통해서 전달(주입)한다.
- 어떠한 개게를 생성하여 전달할지는 디스크립터 파일(XML로 작성)을 한다.
※ 스프링 설정파일
※ 의존 관계를 관리하기 위한 방법
1. Constructor Injection
생성자를 통해서 의존관계를 연결시키는 것을 말함
2. Setter Injection
클래스 사이의 의존관계를 연결시키기 위해서 setter메소드를 이용하는 방법을 말함