728x90
반응형
지금까지 순수한 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자
지금은 코드만 작성하고 설명은 마지막에 하겠다.
"AppConfig 스프링 기반으로 변경"
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.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 {
// Key : memberService , Value : new MemberServiceImpl(memberRepository())
@Bean // @Bean 을 붙여주면 스프링 컨테이너에 등록된다.
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository(); // DBRepository로 바뀔때 여기만 바꾸면 된다.
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy(); // RateDiscountPolicy로 바꿀때 여기만 바꾸면 된다.
}
}
"MemberApp을 스프링 기반으로 변경"
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) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService
= applicationContext.getBean("memberService", MemberService.class);
// Ctrl + ALT + V >> 좌항의 변수 완성
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
// soutv
System.out.println("findMember = " + member.getName());
System.out.println("findMember = " + findMember.getName());
}
}
"OrderApp을 스프링 기반으로 변경"
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.order.Order;
import hello.core.order.OrderService;
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", 10000);
System.out.println("order = " + order);
System.out.println("order.calculatePrice = " + order.calculatePrice());
}
}
AppConfig를 @Configuration 어노테이션을 붙여서 설정 정보로 사용하고,
하위의 메서드들을 @Bean 어노테이션을 붙여서 Bean Container에 등록한다.
MemberApp과 OrderApp을 실행하면 다음과 같이 결과가 나온다.
두 코드를 실행하면 스프링 관련 로그가 몇줄 실행되면서 기존과 동일한 결과가 출력된다.
"스프링 컨테이너"
- 'ApplicationContext'를 스프링 컨테이너라 한다.
- 기존에는 개발자가 'AppConfig'를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다.
- 스프링 컨테이너는 '@Configuration'이 붙은 'AppConfig'를 설정(구성) 정보로 사용한다. 여기서 '@Bean'이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
- 스프링 빈은 '@Bean'이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.('memberService', 'orderService')
- 이전에는 개발자가 필요한 객체를 'AppConfig'를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 'applicationContext.getBean()' 메서드를 사용해서 찾을 수 있다.
- 기존에는 개발자가 직접 자바 코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
- 코드가 약간 더 복잡해진 것 같은데, 스프링 컨테이너를 사용하면 어떤 장점이 있을까?
728x90
반응형
'스프링 > 핵심 원리' 카테고리의 다른 글
[Spring] 컨테이너에 등록된 모든 빈 조회 (0) | 2022.01.28 |
---|---|
[Spring] 스프링 컨테이너 생성 (0) | 2022.01.28 |
[Spring] IoC, DI, 그리고 컨테이너, (프레임워크? vs 라이브러리?) (0) | 2022.01.26 |
[Spring] 좋은 객체 지향 설계의 5가지 원칙의 적용 (0) | 2022.01.24 |
[Spring] 전체 흐름 정리 (0) | 2022.01.24 |
댓글