일반적인 제어의 흐름


<aside> 💡 객체 생명주기를 직접 제어한다.

</aside>

public class A {
		private B b;
	
		public A() {
				this.b = new B(); //변경에 자유롭지 못하다.
		}
}

제어의 역전


<aside> 💡 객체 생명주기를 위임한다.

</aside>

public class A {
		private B b;

		//자신이 직접 객체를 생성을 안하고, 주입받아서 사용한다. (제어의 역전)
		public A(B b) {
			this.b = b; //변경이 자유롭다.
		}
}

public class UserDao {
		Connection connection;		

		public UserDao(Connection connection) {
				this.connection = connection; //coonnection 의 생명주기를 IoC 하고있다.
		}
}

//가장 간단하게 만들어본 IoC 컨테이너 / IoC 프레임워크
public class DataFactory {
		public UserDao userDao() {
				return new UserDao(connectionMaker()); //UserDao에 connection을 주입해준다.
		}

		public AccountDao accountDao() {
				return new AcoountDao(connectionMaker());
		}

		public MessageDao messageDao() {
				return new MessageDao(connectionMaker());
		}
		
		public Connection connectionMaker() {
				return new Connection();
		}

IoC를 사용하면, 역할과 관심을 분리해 응집도를 높이고, 결합도를 낮출 수 있다.

이에 따라 변경에 유연한 코드를 작성할수 있는 구조가 된다.

→ 즉 IoC는 기본적으로 프레임워크만의 기술도 아니고 프레임워크가 꼭 필요한 개념도 아니다. 단순하게 생각하면 디자인 패턴에서도 발견할 수 있는 것처럼 상당히 폭 넓ㅅ게 사용되는 프로그래밍 모델이다.