Dev/Spring

[스프링 핵심 원리] Spring 적용

oxdjww 2023. 9. 20. 18:52
728x90
반응형

이전 포스팅 : [스프링 핵심 원리] SoC와 DI

Intro

본 카테고리는 Inflearn 김영한 강사님의 스프링 핵심 원리 강의를 수강하며 이해하고 학습한 내용을 정리한 내용으로 구성되어 있다.
본 포스팅에서는 객체지향 설계원칙을 적용하여 개발한 순수 자바코드에 Spring을 도입하는 과정을 담았다.

기존 코드


package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemberService;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class AppConfig {
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    private static MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

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

    private static DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

}

Spring 적용 코드


package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemberService;
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
    private static MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    @Bean
    private static DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
//        return new FixDiscountPolicy();
    }

}

차이점


@Bean 어노테이션과 @Configuration 어노테이션을 적용한다.
AppConfig에 설정을 구성한다는 뜻으로 해석된다.

또, 각각의 메서드에 @Bean을 붙여줌으로써 스프링 컨테이너에 빈으로 등록할 수 있다.

이렇게 등록한 객체인 bean을 ApplicationContext 라이브러리를 통해 사용할 수 있다. (하단참조)


마치며


즉, 다음과 같이 정리할 수 있다.

  • ApplicationContext를 Spring Container라 한다.
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig을 설정 정보로 사용함
  • @Bean이 적힌 메서드를 모두 호출하여 Spring Container에 Bean으로 등록한다.
  • 이렇게 등록된 Bean은 등록된 메서드의 이름으로 호출하여 사용될 수 있다.
  • 실제로 Spring Container 내부에는 Key-Value 형식으로 methodName-객체 형식으로 저장되어 있다.
  • applicationContext.getBean() 메서드를 이용하여 bean을 호출할 수 있다.

감사합니다.

728x90
반응형