제어의 역전 (Ioc)

3 minute read

제어의 역전 (Inversion Of Control)

💎 제어의 역전(Inversion Of Control)이란 프로그램의 제어 흐름 개념을 거꾸로 뒤집는 것이다.
  • 일반적으로 프로그램의 흐름은 main() 메소드와 같이 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정하고, 결정한 오브젝트를 생성하고, 만들어진 오브젝트에 있는 메소드를 호출하고, 그 오브젝트 메소드 안에서 다음에 사용할 것을 결정하고 호출하는 식의 작업이 반복된다.
    • 이런 프로그램 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다.
  • 하지만 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 당연히 생성하지도 않으며, 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없다.
    • 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다. 프로그램의 시작을 담당하는 main()과 같은 엔트리 포인트를 제외하면 모든 오브젝트는 이렇게 위임받은 제어 권한을 갖는 특별한 오프젝트에 의해 결정되고 만들어진다.

💎 제어의 역전(IOC)는 기본적으로 프레임워크만의 기술도 아니고 프레임워크가 꼭 필요한 개념도 아니다.

🔗 제어의 역전의 사용 예

  • 서블릿

    • 서블릿을 개발해서 서버에 배포할 수는 있지만, 그 실행을 개발자가 직접 제어할 수 있는 방법은 없다. 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그 안의 메소드를 호출한다.
  • 디자인 패턴

    • 템플릿 메소드 패턴은 슈퍼클래스를 상속한 서브클래스가 추상 메서드를 구현하지만 해당 메소드가 언제 어떻게 사용될지 자신은 모른다. 서브클래스에서 결정 되는 것이 아닌, 슈퍼클래스에서 필요할 때 사용하는 것이다.

    • 즉 제어권을 상위 템플릿 메소드에 넘기고 자신은 필요할 때 호출되어 사용되도록 한다는, 제어의 역전 개념을 발견할 수 있다.

  • 프레임워크

    • 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용된다.

    • 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션 코드를 사용하도록 만드는 방식


💎 제어의 역전에서는 프레임워크 또는 컨테이너와 같이 애플리케이션 컴포넌트의 생성과 관계설정, 사용, 생명주기 관리 등을 관장하는 존재가 필요하다.
  • IoC를 애플리케이션 전반에 걸쳐 본격적으로 적용하려면 스프링과 같은 IoC 프레임워크의 도움을 받는 편이 훨씬 유리하다.

  • 스프링은 IoC를 모든 기능의 기초가 되는 기반기술로 삼고 있으며, IoC를 극한까지 적용하고 있는 프레임워크다.


스프링의 제어의 역전 (Inversion Of Control)

  • 스프링에서는 스프링이 제어권을 가지고 직접 만들고 부여하는 오브젝트를 빈(Bean)이라고 부른다.
    • 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.
  • 스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(Bean Factory) 라고 부른다.

    • 보통 빈 팩토리 보다는 어플리케이션 컨텍스트 (application Context)를 주로 사용한다.

    • 어플리케이션 컨텍스트는 IoC 방식을 따라 만들어진 일종의 빈 팩토리이며 별도의 정보를 참고해서 빈(오브젝트)의 생성, 관계설정 등의 제어 작업을 총괄한다.

    • 통상 전자와 후자는 동일하다고 생각하면 되지만 빈 팩토리는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을, 애플리케이션 컨텍스트는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC엔진이라는 의미가 좀 더 부각된다.


💎 스프링의 빈 팩토리가 사용할 수 있는 설정정보를 만드는 방법
  • 자바 코드
@Configuration //애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정 정보라는 표시
public class DaoFactory {
    @Bean // 오브젝트 생성을 담당하는 IoC용 메소드라는 표시
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }
    
    @Bean 
    public ConnectionMaker connectionMaker() {
        return new DConnectionMaker();
    }
}
public class UserDaoTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        ApplicationContext context =
            new AnnotationConfigApplicationContext(DaoFactory.class);
        UserDao dao = context.getBean("userDao", UserDao.class);
    }
}
  • @Configuration이 붙은 자바 코드를 설정정보로 사용하려면 AnnotationConfigApplicationContext를 사용하면 된다.

  • Xml

<beans>
	<bean id="connectionMaker" class="springbook.user.dao.DConnectionMaker"/>
    
    <bean id="userDao" class="springbook.user.dao.UserDao">
    	<property name="connectionMaker" ref="connectionMaker"/>
    </bean>
</beans>
public class UserDaoTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        ApplicationContext context =
            new GenericXmlApplicationContext("applicationContext.xml");
        UserDao dao = context.getBean("userDao", UserDao.class);
    }
}
  • xml 이용하는 설정정보를 사용하려면 GenericXmlApplicationContext를 사용해야 한다.

💎 애플리케이션 컨텍스트의 동작방식

image-20220616095739136

  • 애플리케이션 컨텍스트는 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만들어둔다.

  • 클라이언트가 애플리케이션 컨텍스트의 getBean() 메소드를 호출하면 자신의 빈 목록에서 요청한 이름이 있는지 찾고, 있다면 빈을 생성하는 메소드를 호출해서 오브젝트를 생성시킨 후 클라이언트에 돌려준다.


💎 애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점

  • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.

  • 애플리케이션 컨텍스트는 종합 Ioc 서비스를 제공해준다.

  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.


💎 스프링 Ioc 용어 정리
  • 빈 (bean)

    • 빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이다.

    • 주의 할 점은 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다.

  • 빈 팩토리 (bean factory)

    • 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
    • 빈을 등록하고, 생성하고 조회하고, 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당한다.
  • 애플리케이션 컨텍스트 (application context)

    • 빈 팩토리를 확장한 IoC 컨테이너로 빈 팩토리와 기본적인 기능은 동일하지만, 여기에 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
  • 설정정보/ 설정 메타 정보 (configuration metadata)

    • 스프링의 설정정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
  • 컨테이너 또는 IoC 컨테이너 (container or IoC container)

    • IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.

    • 때로는 컨테이너 말을 떼고 스프링이라고 부를 때도, 바로 이 스프링 컨테이너를 가리키는 것 일 수 있다.

  • 스프링 프레임워크

    • 스프링 프레임워크는 IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용한다. 그냥 스프링이라고 줄여서 말하기도 한다.

Comments