Spring
[Spring] 간단한 주문 시스템 예제4 - AppConfig 스프링 기반으로 변경
먹태
2021. 4. 10. 23:01
- 드디어 스프링으로 변경해보기
AppConfig.java
package com.hello.core;
import com.hello.core.Order.OrderService;
import com.hello.core.Order.OrderServiceImpl;
import com.hello.core.discount.DiscountPolicy;
import com.hello.core.discount.RateDiscountPolicy;
import com.hello.core.member.MemberRepository;
import com.hello.core.member.MemberService;
import com.hello.core.member.MemberServiceImpl;
import com.hello.core.member.MemoryMemberRepository;
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 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 : AppConfig에 설정을 구성한다는 뜻
- @Bean : @Bean이 붙은 메소드들은 스프링 컨테이너에 등록됨
MemberApp.java / 스프링 컨테이너 적용
package com.hello.core;
import com.hello.core.member.Grade;
import com.hello.core.member.Member;
import com.hello.core.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberApp {
public static void main(String[] args) {
///MemberService memberService = new MemberServiceImpl();
//Appaonfig 사용
////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());
}
}
OrderApp.java / 스프링 컨테이너 적용
package com.hello.core;
import com.hello.core.Order.Order;
import com.hello.core.Order.OrderService;
import com.hello.core.member.Grade;
import com.hello.core.member.Member;
import com.hello.core.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class OrderApp {
public static void main(String[] args) {
///MemberService memberService = new MemberServiceImpl();
///OrderService orderService = new OrderServiceImpl();
///OrderService orderService = new OrderServiceImpl();
//AppConfig사용
//// 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",20000);
System.out.println("order = " + order);
System.out.println("calculatePrice = " + order.calculatePrice());
}
}
- ApplicationContext : 스프링 컨테이너
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용하고 @Bean이 붙은 메소드들을 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록
- .getBean()은 @Bean이 붙은 메소드의 명을 스프링 빈의 이름으로 사용
- 이전에는 필요한 객체를 AppConfig를 사용해 직접 조회했지만 이제부터는 스프링 컨테이너를 통해 applicationContext.getBean() 메소드로 필요한 스프링 빈을 찾음
실행시켜보면 이전과 결과값은 같으나 스프링 어쩌구 크레이팅 어쩌고 싱글톤 빈어쩌고 하는걸 확인할수 있음