반응형

 

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.MemebrServiceImpl;
import hello.core.member.MemoryMemberRepositroy;
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 MemebrServiceImpl(memberRepository());
    }

    @Bean
    public static MemoryMemberRepositroy memberRepository() {
        return new MemoryMemberRepositroy();
    }

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

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

 

1. Class 상단에 @Configuration 넣기

AppConfig에 설정을 구성한다는 뜻

 

2. 각 메서드에 @Bean 넣기

스프링 컨테이너에 스프링 빈으로 등록됨

 

public class OrderApp {
    public static void main(String[] args) {
        //main 메서드보다 test에서 테스트 필요!
/*        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();*/

        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        OrderService orderService = ac.getBean("orderService", OrderService.class);

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "pizza", 5000);

        System.out.println(order);
        System.out.println(order.getDiscountPrice());
    }
}

주석된 코드는 기존에 스프링이 아닌 자바로 AppConfig를 사용해서 직접 객체 생성하고 DI를 한 코드

 

🍰ApplicationContext : 스프링 컨테이너(@Bean 관리)

 

스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다. 여기서 @Bean
이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에
등록된 객체를 스프링 빈이라 한다.

 

스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.

 

- 스프링 빈의 이름

@Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용하지만 다음과 같이 임의 설정이 가능하다.

(하지만, 관례에 따르는 것을 추천함)

//AppConfig
@Bean(name = "abc")

//OrderApp
OrderService orderService = ac.getBean("abc", OrderService.class);


이 전 강의에서는 직접 Java 코드로 구성을 하였는데 이제 스프링 컨테이너가 담당하게 되었다. 언뜻보면 더 복잡해보일 수 도 있는데 스프링 컨테이너의 역할이 프로젝트에 있어서 큰 역할을 차지한다. 어떠한 부분 때문에 이러한 스프링 컨테이너를 사용하는지 궁금하다!

 

 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 수강하며 기록한 글입니다.

반응형