본문 바로가기

기초이론/Spring

[인프런]스프링 핵심원리 기본편_스프링으로 전환하기

스프링 적용

드디어 본격적으로 스프링을 적용해볼 것이다.

먼저 이전에 작성했던 소스 중 AppConfig에 어노테이션을 추가한다.

  • @Configuration : 스프링 컨테이너가 이 어노테이션이 붙어있는 클래스는 빈(Bean)을 구성하기 위한 클래스임을 알려준다. 이를 사용하면 자동으로 빈으로 등록하고 @Bean이 있는메소드를 찾아서 빈(Bean)을 생성한다.
  • @Bean : 개발자가 직접 작성한 메소드를 통해 반환되는 객체를 Bean으로 만든다.
  • @Component : 개발자가 직접 작성한 클래스를 빈으로 만든다.

 

먼저 AppConfig에 어노테이션을 추가한다.

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
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 MemberServiceImpl(memberRepository());
    }

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

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

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

}

이제 MemberApp에서 스프링 사용을 위해 기존 코드를 수정한다.

import hello.core.AppConfig;
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);
        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에도 스프링 사용을 위해 기존 코드를 수정한다.

import hello.core.AppConfig;
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) {

//        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 = " + order);
    }
}

이후 코드를 실행하면 이전과 동일한 결과가 출력됨을 확인할 수 있다.


스프링 컨테이너

1. ApplicationContext 를 스프링 컨테이너라고 한다.

2. 기존에는 AppConfig를 사용해서 직접 객체를 생성하고 DI(Dependency Injection : 의존관계 주입) 해주었으나, 이제는 스프링 컨테이너를 사용한다.

3. 스프링 컨테이너는 @Configuration 이 붙은 AppConfig를 설정(구성) 정보로 활용한다.

4. AppConfig에서 @Bean이라 적힌 메소드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

5. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.

6. 스프링 빈은 @Bean이 붙은 메소드명을 스프링 빈의 이름으로 사용한다.

7. 이전에는 개발자가 필요한 객체를 AppConfig 를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 객체(스프링 빈)을 찾아야 한다.

8. 스프링 빈은 applicationContext.getBean(메소드명, 반환타입)을 통해서 찾을 수 있다.

9. 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아서 사용한다.


해당 글은 인프런 > 스프링 핵심 원리 기본편(김영한)강의를 참고하여 작성하였습니다.


이전에 작성한 코드 내역 및 그에 대한 설명은 추후에 업로드하겠습니다.