본문 바로가기
스프링/핵심 원리

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

by drCode 2022. 1. 26.
728x90
반응형

지금까지 순수한 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자

지금은 코드만 작성하고 설명은 마지막에 하겠다.

 

"AppConfig 스프링 기반으로 변경"

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
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 {

            // Key : memberService , Value : new MemberServiceImpl(memberRepository())
    @Bean   // @Bean 을 붙여주면 스프링 컨테이너에 등록된다.
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository(); // DBRepository로 바뀔때 여기만 바꾸면 된다.
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();  // RateDiscountPolicy로 바꿀때 여기만 바꾸면 된다.
    }
}

 

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


        // Ctrl + ALT + V >> 좌항의 변수 완성
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        // soutv
        System.out.println("findMember = " + member.getName());
        System.out.println("findMember = " + 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);
        System.out.println("order.calculatePrice = " + order.calculatePrice());
    }
}

 

AppConfig를 @Configuration 어노테이션을 붙여서 설정 정보로 사용하고,

 

하위의 메서드들을 @Bean 어노테이션을 붙여서 Bean Container에 등록한다.

 

MemberApp과 OrderApp을 실행하면 다음과 같이 결과가 나온다.

 

두 코드를 실행하면 스프링 관련 로그가 몇줄 실행되면서 기존과 동일한 결과가 출력된다.

 

"스프링 컨테이너"

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

  • 코드가 약간 더 복잡해진 것 같은데, 스프링 컨테이너를 사용하면 어떤 장점이 있을까?
728x90
반응형

댓글