Kim-Baek 개발자 이야기

[스프링 핵심원리] 21. 스프링으로 전환하기 본문

개발/Spring

[스프링 핵심원리] 21. 스프링으로 전환하기

김백개발자 2021. 10. 24. 19:15
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

지금까지 강의의 내용은 순수하게 자바만 사용해서 하는 것이였다. 그렇다면 스프링을 사용하면 어떤 좋은 점이 있는지를 알아야 하지 않을까? 이번부터 지금까지 생성한 내용을 스프링으로 변경하면서 진행을 하게 된다.

먼저 AppConfig를 스프링 기반으로 변경한다.

package core.order;

import core.order.discount.DiscountPolicy;
import core.order.discount.RateDiscountPolicy;
import core.order.member.MemberRepository;
import core.order.member.MemberService;
import core.order.member.MemberServiceImpl;
import core.order.member.MemoryMemberRepository;
import core.order.order.OrderService;
import core.order.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 MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

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

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }


}

변경된 것을 보면 AppConfig 에 @Configuration이 붙은 것을 알 수 있다. 구성을 한다는 뜻인데, 이 클래스가 설정을 구성해준다라고 Spring 에 알려주는 역할이라고 보면 된다.

그리고 각 메서드에는 @Bean 이라고 붙였다. 이렇게 하면 해당 클래스가 스프링 컨테이너에 스프링 빈으로 등록이 된다는 뜻이다.

MemberApp에 스프링 컨테이너 적용

package core.order;

import core.order.member.Grade;
import core.order.member.Member;
import core.order.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("findMember = " + findMember.getName());
    }
}

OrderApp에 스프링 컨테이너 적용

package core.order;

import core.order.member.Grade;
import core.order.member.Member;
import core.order.member.MemberService;
import core.order.order.Order;
import core.order.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", 20000);

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

실행을 시켜보면 기존과 결과는 동일하게 나오는 것을 볼 수 있다. 그런데 이런 스프링 관련된 로그가 좀 더 추가된 것을 알 수 있다.

스프링 컨테이너

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

작성 코드 : https://github.com/bgc8214/spring-core/tree/step9

사실 여기까지 해보면 도대체 왜 스프링을 쓰는 건지 이해가 안된다. AppConfig를 쓰는 것보다 복잡하지 않나? 라는 생각조차 드는 것이 사실이다. 

하지만 당연히 더 좋은 장점이 많으니까 사용하는 것이고 다음 강의에서 부터 이러한 것들을 설명을 하게 되니 계속 공부해보자

 


 

 

반응형
Comments