1.5) 스프링의 IoC
오브젝트 팩토리를 이용한 스프링 IoC
- DaoFactory를 스프링에서 사용이 가능하도록 변신시켜보자.
- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈이라고 부른다.
- 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트이다.
그러므로 스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 부르며
IoC 방식을 따라 만들어진 일종의 빈 팩토리를 좀 더 확장한 애플리케이션 컨텍스트를 주로 사용한다. - 애플리케이션 컨텍스트는 직접 설정정보를 담고 있는 DaoFactory와 달리,
별도로 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진 같은 것이라고 볼 수 있다. - DaoFactory 자체는 설정정보까지 담고 있는 IoC 엔진이므로 이를 애플리케이션 컨텍스트의 설정정보로 활용하기 위해
스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식하도록 @Configuration 어노테이션을 추가한다.
그리고 오브젝트를 만들어주는 메소드에는 @Bean 어노테이션을 붙여준다.
이를 통해 스프링 프레임워크가 빈 팩토리 또는 애플리케이션 컨텍스트가 사용할 설정정보가 되게 된다. - DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트인 ApplicationContext 타입의 오브젝트를 만들기 위해
AnnotationConfigApplicatonContext에 생성자 파라미터로 DaoFactory 클래스를 넣어준 후
getBean() 메소드를 이용하여 메소드 이름이자 등록된 빈의 이름을 파라미터로 주면 UserDao의 오브젝트를 가져온다.
이때 getBean()은 기본적으로 Object 타입으로 리턴되게 되므로
제네릭 메소드 방식을 사용해 두 번째 파라미터로 리턴 타입을 주어 캐스팅 코드를 사용하지 않도록 한다.
/**
* 스프링 빈 팩토리가 사용할 설정정보를 담은 DaoFactory 클래스
*/
@Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
public class DaoFactory {
@Bean // 오브젝트 생성을 담당하는 IoC용 메소드라는 표시
public UserDao userDao() {
// UserDao 오브젝트를 생성한다. 그리고 사용할 ConnectionMaker 타입의 오브젝트를 제공한다.
// 결국 두 오브젝트 사이의 의존관계 설정 효과
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
// UserDao가 사용할 ConnectionMaker 구현 클래스를 결정하고 오브젝트를 만든다.
// 분리해서 중복을 제거
return new DConnectionMaker(); // D사
}
}
/**
* 테스트용 main() 메소드
*/
public class UserDaoTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 애플리케이션 컨텍스트로 UserDao 오브젝트를 받아온다.
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
// 프로퍼티에 값 넣는다.
User user = new User();
user.setId("gaga");
user.setName("김가경");
user.setPassword("gagakim");
// add() 메소드를 이용해 DB에 등록해본다.
userDao.add(user);
System.out.println(user.getId() + " 등록 성공");
// get() 메소드를 이용해 DB에 저장된 결과를 가져와 본다.
User user2 = userDao.get(user.getId());
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + " 조회 성공");
}
- 그런데 스프링을 적용하긴 했지만 사실 앞에서 만든 DaoFactory를 직접 사용한 것과 기능적으로 다를 바 없다.
- 오히려 DaoFactory를 바로 사용한 것보다 좀 더 번거로운 준비 작업과 코드가 필요하다.
- 하지만 스프링은 직접 구현했던 DaoFactory를 통해서는 얻을 수 없는 방대한 기능과 활용 방법을 제공해주며
범용적이고 유연한 방법으로 IoC 기능을 확장할 수 있으므로 이런 특성에 대해서 앞으로 계속 살펴보도록 하자.
애플리케이션 컨텍스트의 동작방식
- 기존에 오브젝트 팩토리를 이용했던 방식과 스프링의 애플리케이션 컨텍스트를 사용한 방식을 비교해보자.
- 스프링에서는 애플리케이션 컨텍스트를 IoC 컨테이너, 스프링 컨테이너, 빈 팩토리라고 부를 수도 있다.
- DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적 역할을 하며
직접 오브젝트를 생성하고 관계를 맺어주는 코드가 있다. - 반면 애플리케이션 컨텍스트는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 한다.
이는 @Configuration이 붙은 설정정보를 사용해 애플리케이션 컨텍스트가 @Bean이 붙은 메소드의 이름을 가져와
빈 목록을 만들어둔 후, 클라이언트가 애플리케이션 컨텍스트의 getBean() 메소드를 호출하면
자신의 빈 목록에서 요청한 이름이 있는지 찾으면 빈을 생성하는 메소드를 호출해서 오브젝트를 생성시킨 후 돌려준다.
- DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적 역할을 하며

- 직접 오브젝트 팩토리를 구현하는 것보다 애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점은?
- 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 어떤 팩토리 클래스를 사용할지 알아야 하거나
직접 팩토리 오브젝트를 생성해야 하는 번거로움이 필요가 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있다. - 자바 코드가 아닌, XML처럼 단순한 방법을 사용해 애플리케이션 컨텍스트가 사용할 IoC 설정정보를 만들 수도 있다.
- 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수 있고, 이에 부가적으로 자동생성, 오브젝트에 대한 후처리,
정보의 조합, 설정방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 종합 기능 서비스를 제공한다. - 빈의 이름 뿐만 아니라 타입만으로 검색하거나 특별한 어노테이션 설정이 되어 있는 빈을 찾는 등 다양한 검색을 제공한다.
- 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 어떤 팩토리 클래스를 사용할지 알아야 하거나
스프링 IoC의 용어 정리
- 빈(빈 오브젝트, 관리되는 오브젝트)은 스프링이 IoC 방식으로 관리하는 오브젝트이다.
스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다. - 빈 팩토리는 스프링의 IoC를 담당하는 핵심 컨테이너이다.
빈을 등록하고, 생성하고, 조회하고 돌려주고, 그 외 부가적인 빈을 관리하는 기능을 담당한다. - 애플리케이션 컨텍스트는 빈 팩토리를 확장한 IoC 컨테이너다.
빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하나 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
그러므로 애플리케이션 컨텍스트는 빈 팩토리를 상속한다. - 설정정보/설정 메타정보는 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타 정보이다.
IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다. - IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.
'Java-Spring > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (7) (0) | 2023.09.09 |
---|---|
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (6) (0) | 2023.09.08 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (4) (0) | 2023.09.08 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (3) (0) | 2023.09.07 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (2) (0) | 2023.09.07 |
1.5) 스프링의 IoC
오브젝트 팩토리를 이용한 스프링 IoC
- DaoFactory를 스프링에서 사용이 가능하도록 변신시켜보자.
- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈이라고 부른다.
- 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트이다.
그러므로 스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 부르며
IoC 방식을 따라 만들어진 일종의 빈 팩토리를 좀 더 확장한 애플리케이션 컨텍스트를 주로 사용한다. - 애플리케이션 컨텍스트는 직접 설정정보를 담고 있는 DaoFactory와 달리,
별도로 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진 같은 것이라고 볼 수 있다. - DaoFactory 자체는 설정정보까지 담고 있는 IoC 엔진이므로 이를 애플리케이션 컨텍스트의 설정정보로 활용하기 위해
스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식하도록 @Configuration 어노테이션을 추가한다.
그리고 오브젝트를 만들어주는 메소드에는 @Bean 어노테이션을 붙여준다.
이를 통해 스프링 프레임워크가 빈 팩토리 또는 애플리케이션 컨텍스트가 사용할 설정정보가 되게 된다. - DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트인 ApplicationContext 타입의 오브젝트를 만들기 위해
AnnotationConfigApplicatonContext에 생성자 파라미터로 DaoFactory 클래스를 넣어준 후
getBean() 메소드를 이용하여 메소드 이름이자 등록된 빈의 이름을 파라미터로 주면 UserDao의 오브젝트를 가져온다.
이때 getBean()은 기본적으로 Object 타입으로 리턴되게 되므로
제네릭 메소드 방식을 사용해 두 번째 파라미터로 리턴 타입을 주어 캐스팅 코드를 사용하지 않도록 한다.
/**
* 스프링 빈 팩토리가 사용할 설정정보를 담은 DaoFactory 클래스
*/
@Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
public class DaoFactory {
@Bean // 오브젝트 생성을 담당하는 IoC용 메소드라는 표시
public UserDao userDao() {
// UserDao 오브젝트를 생성한다. 그리고 사용할 ConnectionMaker 타입의 오브젝트를 제공한다.
// 결국 두 오브젝트 사이의 의존관계 설정 효과
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
// UserDao가 사용할 ConnectionMaker 구현 클래스를 결정하고 오브젝트를 만든다.
// 분리해서 중복을 제거
return new DConnectionMaker(); // D사
}
}
/**
* 테스트용 main() 메소드
*/
public class UserDaoTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 애플리케이션 컨텍스트로 UserDao 오브젝트를 받아온다.
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
// 프로퍼티에 값 넣는다.
User user = new User();
user.setId("gaga");
user.setName("김가경");
user.setPassword("gagakim");
// add() 메소드를 이용해 DB에 등록해본다.
userDao.add(user);
System.out.println(user.getId() + " 등록 성공");
// get() 메소드를 이용해 DB에 저장된 결과를 가져와 본다.
User user2 = userDao.get(user.getId());
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + " 조회 성공");
}
- 그런데 스프링을 적용하긴 했지만 사실 앞에서 만든 DaoFactory를 직접 사용한 것과 기능적으로 다를 바 없다.
- 오히려 DaoFactory를 바로 사용한 것보다 좀 더 번거로운 준비 작업과 코드가 필요하다.
- 하지만 스프링은 직접 구현했던 DaoFactory를 통해서는 얻을 수 없는 방대한 기능과 활용 방법을 제공해주며
범용적이고 유연한 방법으로 IoC 기능을 확장할 수 있으므로 이런 특성에 대해서 앞으로 계속 살펴보도록 하자.
애플리케이션 컨텍스트의 동작방식
- 기존에 오브젝트 팩토리를 이용했던 방식과 스프링의 애플리케이션 컨텍스트를 사용한 방식을 비교해보자.
- 스프링에서는 애플리케이션 컨텍스트를 IoC 컨테이너, 스프링 컨테이너, 빈 팩토리라고 부를 수도 있다.
- DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적 역할을 하며
직접 오브젝트를 생성하고 관계를 맺어주는 코드가 있다. - 반면 애플리케이션 컨텍스트는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 한다.
이는 @Configuration이 붙은 설정정보를 사용해 애플리케이션 컨텍스트가 @Bean이 붙은 메소드의 이름을 가져와
빈 목록을 만들어둔 후, 클라이언트가 애플리케이션 컨텍스트의 getBean() 메소드를 호출하면
자신의 빈 목록에서 요청한 이름이 있는지 찾으면 빈을 생성하는 메소드를 호출해서 오브젝트를 생성시킨 후 돌려준다.
- DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적 역할을 하며

- 직접 오브젝트 팩토리를 구현하는 것보다 애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점은?
- 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 어떤 팩토리 클래스를 사용할지 알아야 하거나
직접 팩토리 오브젝트를 생성해야 하는 번거로움이 필요가 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있다. - 자바 코드가 아닌, XML처럼 단순한 방법을 사용해 애플리케이션 컨텍스트가 사용할 IoC 설정정보를 만들 수도 있다.
- 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수 있고, 이에 부가적으로 자동생성, 오브젝트에 대한 후처리,
정보의 조합, 설정방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 종합 기능 서비스를 제공한다. - 빈의 이름 뿐만 아니라 타입만으로 검색하거나 특별한 어노테이션 설정이 되어 있는 빈을 찾는 등 다양한 검색을 제공한다.
- 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 어떤 팩토리 클래스를 사용할지 알아야 하거나
스프링 IoC의 용어 정리
- 빈(빈 오브젝트, 관리되는 오브젝트)은 스프링이 IoC 방식으로 관리하는 오브젝트이다.
스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다. - 빈 팩토리는 스프링의 IoC를 담당하는 핵심 컨테이너이다.
빈을 등록하고, 생성하고, 조회하고 돌려주고, 그 외 부가적인 빈을 관리하는 기능을 담당한다. - 애플리케이션 컨텍스트는 빈 팩토리를 확장한 IoC 컨테이너다.
빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하나 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
그러므로 애플리케이션 컨텍스트는 빈 팩토리를 상속한다. - 설정정보/설정 메타정보는 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타 정보이다.
IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다. - IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.
'Java-Spring > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (7) (0) | 2023.09.09 |
---|---|
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (6) (0) | 2023.09.08 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (4) (0) | 2023.09.08 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (3) (0) | 2023.09.07 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 오브젝트와 의존관계 (2) (0) | 2023.09.07 |