1. 스프링으로 전환하기
- AppConfig 파일
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 어노테이션 기반의 스프링컨테이너
// AppConfig에 설정을 구성한다는 뜻의 @Configuration 을 붙여준다.
@Configuration
public class AppConfig {
// 각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다.
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(),discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
- 회원 서비스 클라이언트 수정
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- 주문 서비스 클라이언트 수정
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.order.Order;
import hello.core.order.OrderService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
ApplicationContext 를 스프링 컨테이너라 한다.
- 기존에는 개발자가 AppConfig 를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다.
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성) 정보로 사용한다. 여기서 @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
- 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ( memberService , orderService )
- 이전에는 개발자가 필요한 객체를 AppConfig 를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.
- 기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
2. 스프링 컨테이너
ApplicationContext = 인터페이스
스프링 컨테이너는 XML 기반으로 만들 수도 있고 어노테이션 기반으로 만들수도 있음
위의 예제는 어노테이션 기반으로 만듦
// AnnotationConfigApplicationContext는 ApplicationContext의 구현체 (어노테이션 기반)
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)
// GenericXmlApplicationContext는 ApplicationContext의 구현체 (xml기반)
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
※ BeanFactory
스프링 컨테이너의 최상위 인터페이스, 스프링 빈을 관리하고 조회하는 역할을 담당, getBean() 제공
※ ApplicationContext
BeanFactory 기능을 모두 상속받아서 제공, 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.(메시지 소스를 활용한 국제화 기능, 환경변수, 애플리케이션 이벤트, 편리한 리소스 조회)
3. 스프링 Bean 설정 메타 정보 (BeanDefinition)
- 다양한 설정 형식을 지원 가능하게 해주는 BeanDefinition 추상화
역할과 구현을 개념적으로 나누어 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 BeanDefinition만 알면 된다.
@Bean , <bean> 당 각각 하나씩 메타 정보가 생성되고, 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성.
'일상의 흔적 > Study' 카테고리의 다른 글
인프런 스프링 핵심 원리 요약 : 자동 의존 관계 주입(1) - 6 (0) | 2023.03.04 |
---|---|
인프런 스프링 핵심 원리 요약 : 싱글톤 패턴과 컨테이너 - 5 (0) | 2023.03.02 |
인프런 스프링 핵심 원리 요약 : DI와 IoC- 3 (0) | 2023.03.01 |
인프런 스프링 핵심 원리 요약 : 순수 자바 로직의 문제 - 2 (0) | 2023.03.01 |
인프런 스프링 핵심 원리 요약 : 객체지향 - 1 (0) | 2023.02.22 |