3.9.1 스프링으로 전환하기 - AppConfig 클래스
지금까지는 순수한 Java 코드로 DI 를 적용하였다.
이를 스프링으로 전환시켜보자.
먼저, 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;
@Configuration
public class AppConfig {
@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();
}
}
@Configuration
:스프링 컨테이너는 @Configuration 을 설정 정보로 사용한다.
@Bean
: 각 메소드 상단에 붙여 주어, 스프링 컨테이너에 스프링 빈으로 등록되도록 한다.
3.9.2 MemberApp 클래스
MemberApp 클래스에 스프링 컨테이너를 적용시켜 보자.
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());
}
}
ApplicationContext applicationContext
: ApplicationContext 는 스프링 컨테이너이다.
: AppConfig 에 있는 환경 설정 정보를 가지고, 스프링빈에 생성한 객체를 넣어 관리해준다.
applicationContext.getBean("memberService", MemberService.class)
: 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾는다.
: @Bean 이 붙은 메서드 이름을 스프링 빈의 이름으로 사용한다. ("memberService")
이전의 코드와는 다르게,
기존에는 개발자가 직접 자바 코드로 모든 것을 했지만,
스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 이를 찾아서 사용하도록 변경되었다.
실행해보면, 다음과 같이 정상적으로 작동되는 것을 볼 수 있다.
3.9.3 OrderApp 클래스
OrderApp 클래스에 스프링 컨테이너를 적용시켜 보자.
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);
}
}
OrderApp 의 코드는 MemberApp 의 코드와 동일하다.
실행하면, 정상적으로 동작하는 것을 확인할 수 있다.
김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.
'SPRING 핵심 원리 [ 기본편 ]' 카테고리의 다른 글
9. 빈 스코프 (-ing) (0) | 2023.06.24 |
---|---|
8. 빈 생명주기 콜백 (-ing) (0) | 2023.06.24 |
[스프링 핵심 원리] 섹션 3.8 객체 지향 원리 적용 (IoC, DI, 그리고 컨테이너) (0) | 2023.01.31 |
[스프링 핵심 원리] 섹션 3.7 객체 지향 원리 적용 (좋은 객체 지향 설계의 5가지 원칙의 적용) (0) | 2023.01.31 |
[스프링 핵심 원리] 섹션 3.5 객체 지향 원리 적용 (새로운 구조와 할인정책 적용) (0) | 2023.01.31 |