제어의 역전, 스프링의 IoC
1.4~1.5
4. 제어의 역전(IoC: Inversion of Control)
제어권의 이전을 통한 제어관계 역전
- 일반적인 프로그램의 흐름
- main() 메서드와 같이 프로그램이 시작되는 지점에 다음에 사용할 오브젝트 결정
- 결정된 오브젝트 생성
- 만들어진 오브젝트에 있는 메서드 호출
- 호출된 메서드 안에서 다음에 사용할 것을 결정하고 호출
- 반복
- 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여
- 제어의 역전
- 프로그램의 제어 흐름 구조가 뒤바뀌는 것
- 오브젝트의 제어 권한을 자신이 아닌 다른 대상에게 위임
- 오브젝트가 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않음
- 자신이 어떻게 만들어지고 어디서 사용되는지 알 수 없음
- 프로그램의 시작인 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