AR삽질러

Spring-기본예제-> Spring(6) 본문

JAVA/Spring

Spring-기본예제-> Spring(6)

아랑팡팡 2023. 7. 3. 13:28
728x90

이전코드에서 AppConfig클래스에서 직접 의존성을 주입하는 방법을 사용하고 MemberApp class, OrderApp class를 직접 생성하여 의존성을 주입하였다. 이전 코드의 단점은 객체의 생성과 의존성 주입을 개발자가 직접 해야하므로 코드가 복잡하고 유지보수가 어려울것이다. 

 

이후 변경된 코드는 AppConfig class에서 @Configuration 어노테이션을 추가해 스프링 설정파일로 지정하였고 @Bean 어노테이션을 사용하여 스프링 컨테이너에 빈 객체를 등록하였다. ApplicationContext를 사용하여 스프링 컨테이너를 생성하고 필요한 Bean을 가져와 사용할 수 있게되었다.

 

1. Spring Bean

 - 스프링빈은 스프링 컨테이너에서 생성되고 관리되는 객체로 일반적으로 핵심로직, 데이터접근객체 등을 포함한다.

 

2. Spring Container

 - 스프링 컨테이너는 스프링 빈을 생성 및 관리하는 컨테이너로 객체의 생명주기관리와 의존성 주입을 한다.

 - 스프링 컨테이너에서 스프링 빈의 설정 정보를 보존하고 의존성을 주입할 수 있다.

 

AppConfig

import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

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

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

 

MemberApp

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.ApplicationContext;

public class MemberApp {
    public static void main(String[] args) {
        //AppConfig appConfig = new AppConfig();
        //MemberService memberService = appConfig.memberService();
        // MemberService memberService = new MemberServiceImpl();

        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("find Member = " + findMember.getName());

    }
}

 

OrderApp

public class OrderApp {
    public static void main(String[] args) {

//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();
//        OrderService orderService = appConfig.orderService();

//        MemberService memberService = new MemberServiceImpl(null);
//        OrderService orderService = new OrderServiceImpl(null, null);

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

//      MemberService memberService = applicationContext.getBean("memberService", MemberService.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);
        System.out.println("order = " + order.calculatePrice());
    }
}
728x90
반응형
LIST