3 minute read

1.4~1.5

4. 제어의 역전(IoC: Inversion of Control)

제어권의 이전을 통한 제어관계 역전

  • 일반적인 프로그램의 흐름
    1. main() 메서드와 같이 프로그램이 시작되는 지점에 다음에 사용할 오브젝트 결정
    2. 결정된 오브젝트 생성
    3. 만들어진 오브젝트에 있는 메서드 호출
    4. 호출된 메서드 안에서 다음에 사용할 것을 결정하고 호출
    5. 반복
      • 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여
  • 제어의 역전
    • 프로그램의 제어 흐름 구조가 뒤바뀌는 것
    • 오브젝트의 제어 권한을 자신이 아닌 다른 대상에게 위임
    • 오브젝트가 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않음
    • 자신이 어떻게 만들어지고 어디서 사용되는지 알 수 없음
    • 프로그램의 시작인 main() 같은 엔트리 포인트를 제외하면 모든 오브젝트는 권한을 위임받은 오브젝트에 의해 결정되고 만들어짐

팩토리

  • 객체의 생성 방법을 결정하고, 만들어진 객체를 돌려주는 객체
  • 오브젝트를 생성하는 쪽과 오브젝트를 사용하는 쪽의 역할과 책임을 분리하는 목적으로 사용
  • 예시

      public class DaoFactory {
      	public UserDao userDao() {
      		return new UserDao(connectionMaker());
      	}
        
      	public MessageDao messageDao() {
      		return new UserDao(connectionMaker());
      	}
        
      	public ConnectionMaker connectionMaker() {
      		return new DConnectionMaker();
      	}
      }
    

5. 스프링의 IoC

오브젝트 팩토리를 이용한 스프링 IoC

  • 스프링 빈(Spring Bean)
    • 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트
  • 빈 팩토리(Bean Factory)
    • 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트
  • 어플리케이션 컨텍스트
    • 어플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진
    • 빈 팩토리를 포함하는 더 넒은 개념
    • 별도의 정보를 참조해서 빈의 생성, 관계설정 등의 제어 작업 총괄
  • @Configuration: 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스로 인식
  • @Bean: 오브젝트를 만들어 주는 메서드에 붙힘

      @Configurateion // 어플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
      public class DaoFactory {
      	@Bean         // 오브젝트 생성을 담당하는 IoC용 메서드라는 표시
      	public UserDao userDao() {
      		return new UserDao(connectionMaker());
      	}
        
      	@Bean 
      	public MessageDao messageDao() {
      		return new UserDao(connectionMaker());
      	}
        	
      	@Bean 
      	public ConnectionMaker connectionMaker() {
      		return new DConnectionMaker();
      	}
      }
    
  • 어플리케이션 컨텍스트를 적용한 UserDaoTest

      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);
      }
    
    • getBean(”bean 이름”, 클래스 이): ApplicationContext가 관리하는 오브젝트를 요청

Leave a comment