스프링의 IoC
스프링은 애플리케이션 개발의 다양한 영역과 기술에 관여한다. 그리고 매우 많은 기능을 제공한다. 하지만 스프링의 핵심을 담당하는 건, 바로 빈 팩토리 또는 애플리케이션 컨텍스트라고 불리는 것이다. 이 두 가지는 우리가 만든 MemberFactory
가 하는 일을 좀 더 일반화한 것이라고 설명할 수 있다.
오브젝트 팩토리를 이용한 스프링 IoC
팩토리
먼저 우리가 만든 MemberFactory
를 살펴보자. 이 클래스의 역할은 무엇일까?
1
2
3
4
5
public class MemberFactory {
public MemberRepository memberRepository() {
return new JdbcMemberReposititory();
}
}
이 클래스는 단순히 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 역할만을 한다. 이런 일을 하는 오브젝트를 흔히 팩토리(Factory)라고 부른다.
이러한 팩토리는 단지 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용한다. (MemberFactory
를 통해 우리는 OCP와 DIP를 지킬 수 있었다)
스프링에서 MemberFactory 사용하기
이제 MemberFactory
를 스프링에서 사용이 가능하도록 변경해 보려한다.
1
2
3
4
5
6
7
8
@Configuration
public class MemberFactory {
@Bean
public MemberRepository memberRepository() {
return new JdbcMemberReposititory();
}
}
먼저 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할 수 있도록 @Configuration
이라는 어노테이션을 추가하였다. 그리고 오브젝트를 만들어주는 메소드에는 @Bean
이라는 어노테이션을 붙여주었다. 이 두가지 어노테이션만으로 스프링 프레임워크의 빈 팩토리가 IoC 방식의 기능을 제공할 수 있다.
애플리케이션 컨텍스트
스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈(bean)이라고 부른다. 그리고 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(bean factory)라고 부른다.
- 빈(bean) :
MemberRepository
- 빈 팩토리(bean factory) :
MemberFactory
이후 자세히 설명하겠지만 보통 빈 팩토리보다는 이를 좀 더 확장한 애플리케이션 컨텍스트(application context)를 주로 사용한다. 애플리케이션 컨텍스트는 IoC 방식을 따라 만들어진 일종의 빈 팩토리라고 생각하면 된다.
애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈(bean)의 생성, 관계설정 등의 제어 작업을 총괄한다.
(위의 코드에서 사용한@Configuration
과 @Bean
이 별도의 설정정보에 해당한다. 이를 통해 어떤 클래스의 오브젝트를 생성하고 어디에서 사용하도록 연결해줄 것인가를 판단한다.)
아래의 코드는 MemberFactory
를 설정정보로 사용하는 애플리케이션 컨텍스트를 만든 것이다. 그리고 이를 통해 스프링이 관리하는 빈(bean)인 MemberRepository
를 가져 온다.
1
2
3
4
5
6
7
public class ApplicationContextTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MemberFactory.class);
MemberRepository memberRepository = context.getBean("memberRepository", MemberRepository.class);
MemberService memberService = new MemberService(memberRepository);
}
}
정리
스프링을 적용한 빈 팩토리를 살펴보았다. 그런데 이전 우리가 순수한 자바 코드로 만든 MemberFactory
를 직접 사용한 것과 기능적으로 다를 바 없다. 오히려 MemberFactory
를 만들어서 바로 사용한 것보다 좀 더 번거로운 작업과 코드가 필요하다.
이로인해 스프링을 사용하는 것이 별로 장점이 없지 않을까 하는 의문이 들 수도 있다. 하지만 스프링은 우리가 만들었던 MemberFactory
가 제공해주지 못하는 많은 이점을 제공해준다. 이러한 특성은 이후 포스팅에서 자세히 다룰 예정이다.
Comments powered by Disqus.