[Spring-기본] 순수 자바 코드 -> 스프링으로 전환하기

DANI·2023년 11월 22일

Spring[김영한T]

목록 보기
19/31
post-thumbnail

💾 AppConfig 파일

🔴 수정 전

package hello.core;


import hello.core.Discount.DiscountPolicy;
import hello.core.Discount.RateDiscountPolicy;
import hello.core.Order.OrderService;
import hello.core.Order.OrderServiceImpl;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;


public class AppConfig {

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

    public DiscountPolicy discountPolicy(){
        return new RateDiscountPolicy();
    }

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

🔵 수정 후

package hello.core;


import hello.core.Discount.DiscountPolicy;
import hello.core.Discount.RateDiscountPolicy;
import hello.core.Order.OrderService;
import hello.core.Order.OrderServiceImpl;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 애너테이션 추가
@Configuration
public class AppConfig {

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

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

    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
}

@Configuration, @Bean 애너테이션을 추가하였다



💾 MemberApp 파일

🔴 수정 전

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;

public class MemberApp {
    public static void main(String[] args) {
        
        AppConfig appConfig = new AppConfig();
        MemberService service = appConfig.memberService();
        Member member = new Member(1L, "홍길동", Grade.VIP);
        service.join(member);
        Member member1 = service.findByMember(member.getId());
        if(member1.equals(member)){
            System.out.println("같은 객체 입니다");
        }else{
            System.out.printf("다른 객체 입니다");
        }
    }
}

🔵 수정 후

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


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

        // 스프링 컨테이너의 시작  ApplicationContext
        // ApplicationContext에서 부터 시작함
        // AppConfig.class 내부의 Bean을 스프링 컨테이너에 넣어서 관리해줌.
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

        Member member = new Member(1L, "홍길동", Grade.VIP);
        memberService.join(member);
        Member member1 = memberService.findByMember(member.getId());
        if(member1.equals(member)){
            System.out.println(member.getName());
        }else{
            System.out.printf("다른 객체 입니다");
        }
    }
}

💻 실행 결과



💾 OrderApp 파일

🔴 수정 전

package hello.core;

import hello.core.Order.Order;
import hello.core.Order.OrderService;
import hello.core.Order.OrderServiceImpl;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;

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

        // 멤버 생성
        Long id = 1L;
        Member member = new Member(id, "홍길동", Grade.VIP);
        memberService.join(member);

        // 주문 생성
        Order order = orderService.createOrder(1L, "새우깡", 1700);


        // 주문 내용 출력
        System.out.println(order);
        System.out.println(order.calprice());

    }
}

🔵 수정 후

package hello.core;

import hello.core.Order.Order;
import hello.core.Order.OrderService;
import hello.core.Order.OrderServiceImpl;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class OrderApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        OrderService orderService = applicationContext.getBean("orderService", OrderService.class);

        // 멤버 생성
        Long id = 1L;
        Member member = new Member(id, "홍길동", Grade.VIP);
        memberService.join(member);

        // 주문 생성
        Order order = orderService.createOrder(1L, "새우깡", 1700);


        // 주문 내용 출력
        System.out.println(order);
        System.out.println(order.calprice());

    }
}

💻 실행 결과





💡 스프링 컨테이너


  • ApplicationContext를 스프링 컨테이너라 함
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성)정보로 사용하며, @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
  • @Bean이라 적힌 메서드명을 스프링 빈의 이름으로 사용한다.

0개의 댓글