[Spring] IoC(제어역전, Inversion of Control)

류넹·2024년 2월 20일
1

Spring

목록 보기
4/50

# 목적

  • IoC(제어역전, Inversion of Control)에 대한 이해






❓ IoC(제어역전) 이란?

  • 자신이 사용할 객체에 대한 결정권이 자신에게 있지 않고, 외부(제 3자) 모듈에게 결정권을 위임한 것
    • 자신이 사용할 객체를 직접 생성하지 않는다.
    • 자신이 사용할 객체를 외부(제 3자) 모듈이 결정하는 것



🔎 제어역전의 종류

1. 의존성 검색(DL: Dependency Lookup, DP: Dependency Pull)

  • 자신이 사용할 객체를 자신이 직접 생성하지 않고, 미리 생성된 객체 중에서 적절한 객체를 찾아서 사용하는 것
  • ex)
    • 내가 입을 옷을 백화점에 가서 구입하는 것 - 공장에서 미리 만들어놓은 옷 중에서 하나를 골라서 사용한다. (나에게는 결정권이 없고 제약이 있음. 나열된 옷 중에서만 골라야 함)
    • 내가 사용할 핸드폰을 매장에 가서 구입하는 것

2. 의존성 주입(DI: Dependency Injection)

  • 자신이 사용할 객체를 자신이 직접 생성하지 않고, 외부 모듈이 조립해주는 객체를 사용하는 것
  • ex)
    • 아기가 입을 기저귀는 엄마(제 3자)가 직접 착용해준다.
    • 고화질 영화감상을 위해서 내 노트북에 4k 모니터를 연결했다. (제3자인 내가 노트북에 모니터를 연결해줌)




📌 제어역전을 사용하는 이유

  • 자신이 사용할 객체(의존하는 객체)를 직접 생성하지 않고, 제 3자로부터 제공받기 때문에 쉽게 다른 객체로 교체 가능
  • 다른 객체로 쉽게 교체할 수 있다는 것은 애플리케이션의 확장성을 높이는 것



💡 애플리케이션의 확장성을 높이는 방법

  1. 자신이 사용할 객체를 자신이 결정(생성)하지 않는다.
  2. 인터페이스를 이용한 느슨한 결합을 유도한다.
  3. 의존성 주입을 통해서 외부 모듈(제3자)로부터 자신이 사용할 객체를 주입받는다.
* 클래스가 클래스를 의존하는 경우 : 결합이 높다.
* 클래스가 인터페이스를 의존하는 경우 : 결합이 낮다.




* 제어역전이 아닌 경우

  • 다른 객체를 사용하기 위해서는 객체 생성을 다시 하고 해당 객체의 메소드명으로 다시 호출해야 함
    -> 확장성이 떨어짐
public class UserService {

	// UserService는 자신이 사용할 객체(의존하는 객체)를 직접 생성(결정)했다. --> 제어의 역전이 아님.
	UserJdbcDao dao = new UserJdbcDao(); // 확장성이 떨어진다.
	
	public void 회원가입기능() {
		dao.insert();
	}
	
	public void 내정보조회기능() {
		dao.select();
	}
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글