[spring] 자바 → 스프링 전환

정원석·2023년 12월 28일

AppConfig 스프링 기반으로 변경

🌮 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() {
     r eturn new RateDiscountPolicy();
    }
}
  • AppConfig에 @Configuration을 붙인다.
  • 각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다.

🥮 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());
 }
}

🌼 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);
  
    }
}

🐥 스프링 컨테이너

  • ApplicationContext 를 스프링 컨테이너라 한다.
  • 기존에는 개발자가 AppConfig 를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제 스프링 컨테이너를 통해 사용한다.
  • 스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다. 여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 컨테이너에 등록된 객체를 스프링 빈이라 한다. (memberService, orderService)
  • 이전에는 개발자가 필요한 객체를 AppConfig 를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해 필요한 스프링 빈(객체)를 찾아야 한다.

⭐ 기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.

profile
Back-End-Dev

0개의 댓글