[spring] @Configuration 어노테이션

이준규·2022년 1월 26일
0

백엔드

목록 보기
11/15
package isntkyu.core;

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

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

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

AppConfig 라는 클래스

순수한 자바 코드로 이해했을 경우

  1. MemberService
  2. OrderService
  3. MemberRepository

순서로 Bean 을 가져가게되면

MemberService와 OrderService 에서 각각 MEmberRepository 객체를 생성하여 리턴하기 때문에

call AppConfig.memberService 
call AppConfig.memberRepository 
call AppConfig.orderService 
call AppConfig.memberRepository 
call AppConfig.memberRepository

이 호출순서를 예상할 수 있다.

하지만 이는 싱글톤 방식의 위배 되기 때문에
싱글톤 방식을 보장하려는 스프링의 어노테이션이 있다

@Congifuration

이 어노테이션을 붙여 주어야 스프링에서

call AppConfig.memberService 
call AppConfig.memberRepository 
call AppConfig.orderService

순서로 memberRepository가 중복되지 않고 싱글톤 방식이 보장되는 것을 테스트 코드를 통해 확인했다.

profile
백엔드

0개의 댓글