# 목적
- IoC(제어역전, Inversion of Control)에 대한 이해
❓ IoC(제어역전) 이란?
- 자신이 사용할 객체에 대한 결정권이 자신에게 있지 않고, 외부(제 3자) 모듈에게 결정권을 위임한 것
- 자신이 사용할 객체를 직접 생성하지 않는다.
- 자신이 사용할 객체를 외부(제 3자) 모듈이 결정하는 것
🔎 제어역전의 종류
1. 의존성 검색(DL: Dependency Lookup, DP: Dependency Pull)
- 자신이 사용할 객체를 자신이 직접 생성하지 않고, 미리 생성된 객체 중에서 적절한 객체를 찾아서 사용하는 것
- ex)
- 내가 입을 옷을 백화점에 가서 구입하는 것 - 공장에서 미리 만들어놓은 옷 중에서 하나를 골라서 사용한다. (나에게는 결정권이 없고 제약이 있음. 나열된 옷 중에서만 골라야 함)
- 내가 사용할 핸드폰을 매장에 가서 구입하는 것
2. 의존성 주입(DI: Dependency Injection)
- 자신이 사용할 객체를 자신이 직접 생성하지 않고, 외부 모듈이 조립해주는 객체를 사용하는 것
- ex)
- 아기가 입을 기저귀는 엄마(제 3자)가 직접 착용해준다.
- 고화질 영화감상을 위해서 내 노트북에 4k 모니터를 연결했다. (제3자인 내가 노트북에 모니터를 연결해줌)
📌 제어역전을 사용하는 이유
- 자신이 사용할 객체(의존하는 객체)를 직접 생성하지 않고, 제 3자로부터 제공받기 때문에 쉽게 다른 객체로 교체 가능
- 다른 객체로 쉽게 교체할 수 있다는 것은 애플리케이션의 확장성을 높이는 것
💡 애플리케이션의 확장성을 높이는 방법
- 자신이 사용할 객체를 자신이 결정(생성)하지 않는다.
- 인터페이스를 이용한 느슨한 결합을 유도한다.
- 의존성 주입을 통해서 외부 모듈(제3자)로부터 자신이 사용할 객체를 주입받는다.
* 클래스가 클래스를 의존하는 경우 : 결합이 높다.
* 클래스가 인터페이스를 의존하는 경우 : 결합이 낮다.
* 제어역전이 아닌 경우
- 다른 객체를 사용하기 위해서는 객체 생성을 다시 하고 해당 객체의 메소드명으로 다시 호출해야 함
-> 확장성이 떨어짐
public class UserService {
UserJdbcDao dao = new UserJdbcDao();
public void 회원가입기능() {
dao.insert();
}
public void 내정보조회기능() {
dao.select();
}
}