minOS

스프링 핵심 원리 이해2 - 스프링으로 전환 본문

TIL/김영한의 스프링 핵심 원리

스프링 핵심 원리 이해2 - 스프링으로 전환

minOE 2024. 1. 31. 18:25
728x90

 

스프링 사용하여  AppConfig 변경 

package com.example.core;

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

 

MemberApp 스프링 사용 버전으로 변경

package com.example.core;

import com.example.core.member.Grade;
import com.example.core.member.Member;
import com.example.core.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);
        // 위 코드는 AppConfig 클래스에 정의된 설정 정보를 사용하여 스프링 ApplicationContext(스프링 컨테이너)를 생성한다.
        // 이는 ApplicationContext가 AppConfig에 정의된 객체(빈)들을 생성하고 관리하도록 하는 것을 의미한다.
        // AppConfig 클래스에는 빈 정의 같은 설정이 포함되어 있다.

        MemberService memberService = applicationContext.getBean("memberService",MemberService.class); // 인자로 메서드 이름과 빈환 타입을 받음

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

        Member findMember = memberService.findMember(1L);

        System.out.println("new member = "+memberA.getName());
        System.out.println("findMember = " + findMember.getName());
    }
}

 

출력 결과

 



OrderApp 스프링 사용 버전으로 변경

package com.example.core;

import com.example.core.member.Grade;
import com.example.core.member.Member;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.order.Order;
import com.example.core.order.OrderService;
import com.example.core.order.OrderServiceImpl;
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);
        System.out.println(order.calculate());


    }
}

출력 결과

 

 

스프링 컨테이너 정리

'ApplicationContext'를 스프링 컨테이너라 한다.
기존에는 개발자가 'AppConfig'를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터 스프링 컨테이너를 통해서 사용한다.
스프링 컨테이너는 '@Configuration'이 붙은 'AppConfig'를 설정(구성) 정보로 사용한다.
여기서 '@Bean'이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
스프링 빈은 '@Bean'이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다. (코드 참고)
이전에는 개발자가 AppConfig를 사용하여 직접 조회하였지만, 이제부터 스프링 컨테이너를 통해서 필요한 스프링빈(객체)를 찾아야한다.
이전에는 개발자가 직접 자바 코드로 모든 것을 했다면, 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다. 
728x90