-
Spring 기본 9 - 스프링으로 전환하기FrameWork/Spring&Spring-boot 2023. 11. 9. 17:38
스프링으로 전환하기
지금까지 순수한 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자
import org.springframework.beans.factory.annotation.Configurable; import org.springframework.context.annotation.Bean; @Configurable public class AppConfig { @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService(){ return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPolicy(){ // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }
@Configuration 어노테이션 해당 클래스가 해당 어플리케이션의 구성정보를 담당하는 클래스라는 의미이다. 즉 스프링 컨테이너에게 스프링 환경 정보를 등록하는 것이다. 그리고 각각의 참조 형 인스턴스를 생성한는 메서드 위에 @Bean이라는 어노테이션을 붙이면 해당 메서드가 모두 스프링 컨테이너에 등록된다.
ApplicationContext
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
스프링은 모든 것이 ApplicationContext에서 시작을 하고 ApplicationContext를 곧 스프링 컨테이너라고 봐도 무방하다. 이것이 @Bean을 통해 등록한 객체들을 모두 관리해준다.
getBean()
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = ac.getBean("memberService", MemberService.class); //ac.getBean("메서드이름",참조type)
따라서 이제 AppConfig 타입의 인스턴스를 생성할 필요 없이 applicationContext를 통해서 필요한 객체 인스터스를 찾아올 수 있다.
@Bean으로 스프링 컨테이너에 등록할 시에 메서드 이름이 key가 되고, 메서드의 return값이 value가 되어 key-value 형태로 스프링 컨테이너에 등록되므로 메서드 이름을 통해서 해당 객체 인스턴스를 꺼내면 된다.
*스프링 컨테이너*
- ApplicationContext를 스프링 컨테이너와 동일한 개념이다. (전체 어플리케이션의 문맥이라는 의)
- 기존에는 AppConfig를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 사용해서 객체 인스턴스를 생성한다.
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성)정보로 사용한다. 여기서 @Bean이 붙은 메서드를 모두 호출해 반환된 객첼르 스프링 컨테이너에 등록한다. 이런 방식으로 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
- 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ex. ("memberService",MemberService.class), ("orderService",OrderService.class)
- 이전에는 개발자가 필요한 객체를 AppConfig를 상용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체 인스턴스)를 찾아야한다. 스프링 빈은 applicationContext.getBean()메서드를 사용해서 찾을 수있다.
- 즉, 기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터 스프링 컨테이너 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 한다.
- 스프링 컨테이너를 사용하면 어떤 장점이 있을까?
[출처 - 스프링 핵심 원리 - 기본편]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
Spring 기본 11 - 스프링 빈 조회 (0) 2023.11.10 Spring 기본 10 - 스프링 컨테이너와 스프링 (0) 2023.11.10 Spring 기본 8 - IoC, DI 그리고 컨테이너 (1) 2023.11.09 Spring 기본 7 - 좋은 객체 지향 설계의 5가지 원칙 적용 (0) 2023.11.09 Spring 기본 6 - 새로운 구조와 할인 정책 적용, 전체 흐름 정리 (0) 2023.11.09