[Spring] 스프링으로 전환하기

jy9922·2022년 8월 19일
0

Spring

목록 보기
20/34
post-thumbnail

스프링으로 전환하기 🍀

AppConfig

  • @Configuration은 애플리케이션의 설정 정보를 담고 있다.
    • 애플리케이션의 설정을 구성한다는 뜻!
  • 각 메서드에 @Bean을 붙여준다.
  • 이는 스프링 컨테이너에 스프링 빈으로 등록한다.
// AppConfig
@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService(){
        return new MemberServiceImp(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService(){
        return new OrderServiceImp(memberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy(){
        return new RateDiscountPolicy();
    }
}

MemberApp에 스프링 컨테이너 적용

public class MemberApp {

    public static void main(String[] args) {
//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();

        /* Spring 생성 */
        /*
        * 1. Spring의 시작은 모두 ApplicationContext에서 시작된다.
        * 2. Spring의 컨테이너라고 보면 된다.
        * 3. 파라미터로 AppConfig.class를 넘겨주면 되는데 이는 AppConfig에 있는 환경 설정 정보를 가진다.
        * 4. Spring이 안에 있는 요소들을 Spring 컨테이너에 집어넣어 관리해준다.
        */
        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에 스프링 컨테이너 적용

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", 20000);

        System.out.println("order = "+ order);
        System.out.println("order.calculator = "+ order.calculatorPrice());
    }
}

아래와 같은 결과가 나오는 것을 확인할 수 있어요~!

스프링 컨테이너

  • @ApplicationContext를 스프링 컨테이너라 한다.
  • 기존에는 개발자가 AppConfig를 직접 객체를 생성하고 DI를 했다.
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
  • 이제부터는 스프링 컨테이너를 통해 사용한다.
    • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성) 정보로 사용한다.

    • 여기서 @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
      • 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. (memberService, orderService)
      • Spring에 @Bean이 붙은 메서드들이 key는 메서드 이름, value는 반환된 객체 들어간 상태로 Spring 컨테이너에 등록이 된다.
    • 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.

    아래와 같이 이름을 따로 설정할 수도 있다.

    @Bean(name = "mmm")

    키 값에 해당되는 이름을 별도로 설정해서 할 수 있지만, 관례는 메서드 명이 키 이름이 되는 것!


    이전에는 개발자가 필요한 객체를 AppConfig를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다.

    • 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.
    • 기존에는 개발자가 직접 자바 코드에서 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.

0개의 댓글