[토비의 스프링 3.1] 1.5 스프링의 IoC
2022. 5. 27. 11:08ㆍ토비의 스터디
1.5, 1.6장은 스터디에서 내가 맡은 부분이라 발표에 사용한 자료를 그대로 가져왔다.
이제 스프링을 사용해본다.
기존에 만든 DaoFactory을 스프링이 사용 가능하도록 만들어보자.
간단한 개념을 소개하자면,
- 스프링이 제어권을 가지고 직접 생성과 관계를 맺어주는 오브젝트를 빈(Bean)이라고 한다.
- 빈의 생성, 관계 설정 등의 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 하며 애플리케이션 컨텍스트를 사용한다.
- 애플리케이션 컨텍스트는 별도의 설정 정보를 참고해서 빈에 대한 제어 작업을 총괄한다.
1.5.1 오브젝트 팩토리를 이용한 스프링 IoC
앞서 만든 DaoFactory를 스프링의 애플리케이션 컨텍스트가 사용할 수 있는 설정정보로 만들어보자.
- 먼저, 설정을 담당하는 클래스는 스프링이 인식할 수 있도록 @Configuration이라는 애노테이션을 추가한다.
- 오브젝트를 생성해주는 메소드에는 @Bean이라는 애노테이션을 붙여준다.
@Configuration // 애플리케이션 컨텍스트가 사용할 설정정보
public class DaoFactory{
@Bean // 오브젝트 생성을 담당하는 메소드
public UserDao userDao(){
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker(){
return new DConnectionMaker();
}
}
이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자. @Configuration 애노테이션을 사용하므로 AnnotationConfigApplicationContext를 이용한다.
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);
}
}
ApplicationContext을 생성했다면 이제 클라이언트는 getBean() 메소드를 이용해 ApplicationContext가 관리하는 오브젝트를 요청할 수 있다.
- 첫 번째 파라미터는 ApplicationContext에 등록된 빈의 이름이다. @Bean 애노테이션이 붙은 메소드 이름이 빈의 이름이다.
- 두 번째 파라미터에는 리턴타입을 입력할 수 있다. getBean()메서드는 Object를 반환하므로, 리턴타입을 입력할 경우 지저분한 형 변환 코드를 생략할 수 있다.
참고로 타입만 입력하는 경우, 검색한 타입의 자손 타입의 Bean들도 함께 조회된다. 첫 번째 파라미터로 이름을 적어주면 원하는 Bean을 단건으로 조회할 수 있다.
1.5.2. 애플리케이션 컨텍스트의 동작방식
- 기존의 오브젝트 팩토리인 DaoFactory는 직접 DAO 오브젝트를 생성하고 DB 오브젝트와 관계를 직접 맺어주었다. 이와 달리 ApplicationContext는 생성과 연관관계 정보를 별도의 설정정보를 통해 얻는다.
- 애플리케이션 컨텍스트는 등록된 설정정보에서 @Bean이 붙은 메소드의 이름을 가져와 Bean 목록을 생성한다.
- 클라이언트가 getBean() 메소드를 호출하면, 만들어둔 Bean 목록에서 요청한 이름을 찾는다.
- 일치하는 이름이 있다면 Bean을 생성하는 메소드를 호출해서 오브젝트를 생성한 후 클라이언트에 돌려준다.
- 오브젝트 팩토리와 비교한 ApplicationContext의 장점
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
- 애플리케이션이 발전할수록 오브젝트는 계속 추가된다. 각각의 오브젝트가 요하는 팩토리 클래스를 알 필요 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
- 종합 IoC 서비스를 제공해준다.
- 오브젝트 생성, 관계 설정뿐만 아니라 오브젝트의 생성 방식, 시점과 전략을 선택할 수 있다.
- 부가적으로 자동생성, 오브젝트에 대한 후처리, 인터셉팅 등 다양한 기능을 제공한다.
- 빈을 검색하는 다양한 방법을 제공한다.
- getBean() 메소드는 빈의 이름을 이용해 빈을 찾는다.
- 타입으로도 빈을 검색할 수 있으며 특정 애노테이션 설정이 되어 있는 빈을 찾을 수도 있음.
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
1.5.3. 스프링 IoC 용어 정리
- Bean(빈)
- 스프링이 IoC 방식으로 관리하는 오브젝트
- 스프링이 직접 생성과 제어를 담당하는 오브젝트
- Bean Factory(빈 팩토리)
- 스프링 IoC를 담당하는 핵심 컨테이너
- 빈을 등록, 생성, 조회, 반환, 관리하는 기능
- Application Context(애플리케이션 컨텍스트)
- 빈 팩토리를 확장한 IoC 컨테이너
- 빈 팩토리의 기능에 부가 서비스를 추가로 제공
- Configuration metadata(설정정보)
- 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보
- IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할때 사용
- 애플리케이션의 청사진
- IoC Container(IoC 컨테이너)
- IoC 방식으로 빈을 관리하는 애플리케이션 컨텍스트, 빈 팩토리
'토비의 스터디' 카테고리의 다른 글
[토비의 스프링 3.1] 1.7 의존관계 주입(DI) (0) | 2022.05.28 |
---|---|
[토비의 스터디 3.1] 1.6 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2022.05.27 |
[토비의 스프링 3.1] 1.4 제어의 역전(IoC) (0) | 2022.05.26 |
[토비의 스프링 3.1] 1.3 DAO의 확장 (0) | 2022.05.25 |
[토비의 스프링 3.1] 1.2 DAO의 분리 - 포포 (0) | 2022.05.24 |