ApplicatoinContext는 Spring 컨테이너의 최상위 Interface인 BeanFactory를 상속받은 Class이자 Spring 컨테이너이다.
Spring 컨테이너 : 객체들의 설정 정보를 전달받아 생성하고 관리하는 역할이다.
Spring 컨테이너는 Interface인 ApplicationContext
를 통해 생성되며,
구현체는 AnnotationConfigApplicationContext
이다.
getBean()
메서드를 통해 Spring Bean, 즉 객체를 조회한다.Spring Bean : Spring 컨테이너가 생성하고 관리하는 객체를 의미한다.
Spring Bean의 이름은 @Bean
이 붙은 메서드 이름을 default로 사용한다.
Spring Bean은
getBean()
메서드를 통해 조회하며, 방법은 크게 세 가지가 있다.
NoSuchBeanDefinitionException
에러가 발생한다.NoUniqueBeanDefinitionException
에러가 발생한다.Spring은
@Configuration
이 붙은 Class를 Spring Container에 등록한다.
여기서@Bean
이 붙은 메서드를 Spring Bean에 등록한다.
package spring_basic.core;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring_basic.core.discount.DiscountPolicy;
import spring_basic.core.discount.FixDiscountPolicy;
import spring_basic.core.discount.RateDiscountPolicy;
import spring_basic.core.member.MemberRepository;
import spring_basic.core.member.MemberService;
import spring_basic.core.member.MemberServiceImpl;
import spring_basic.core.member.MemoryMemberRepository;
import spring_basic.core.order.OrderService;
import spring_basic.core.order.OrderServiceImpl;
@Configuration
public class AppConfig
{
@Bean
public MemberService memberService()
{
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService()
{
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy()
{
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
@Bean
public MemberRepository memberRepository()
{
return new MemoryMemberRepository();
}
}
package spring_basic.core;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import spring_basic.core.member.Grade;
import spring_basic.core.member.Member;
import spring_basic.core.member.MemberService;
import spring_basic.core.member.MemberServiceImpl;
import spring_basic.core.order.Order;
import spring_basic.core.order.OrderService;
import spring_basic.core.order.OrderServiceImpl;
public class OrderApp
{
public static void main(String[] args)
{
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = ac.getBean("memberService", MemberService.class);
OrderService orderService = ac.getBean("orderService", OrderService.class);
//실행 로직
}
}
순수 Java로만 객체를 생성하고 DI를 하는 것에서 Spring Container를 통해 하도록 적용했다.
오히려 코드만 더 길어진 것같은데, 어떤 장점때문에 사용하는 것일까?
Spring의 장점은 어마무시하다. 다음 글부터 하나씩 살펴보자.