스프링 적용
드디어 본격적으로 스프링을 적용해볼 것이다.
먼저 이전에 작성했던 소스 중 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. 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아서 사용한다.
해당 글은 인프런 > 스프링 핵심 원리 기본편(김영한)강의를 참고하여 작성하였습니다.
이전에 작성한 코드 내역 및 그에 대한 설명은 추후에 업로드하겠습니다.
'기초이론 > Spring' 카테고리의 다른 글
[인프런]스프링 핵심원리 기본편_스프링 컨테이너와 스프링 빈(BeanFactory와 ApplicationContext) (0) | 2022.11.06 |
---|---|
[인프런]스프링 핵심원리 기본편_스프링 컨테이너와 스프링 빈(스프링 컨테이너 생성) (0) | 2022.11.02 |
[인프런]스프링 핵심원리 기본편_IoC, DI, 그리고 컨테이너 (2) | 2022.10.29 |
[인프런]스프링 핵심원리 기본편_좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2022.09.28 |
[인프런]스프링 핵심원리 기본편_좋은 객체 지향 프로그램이란? (2) | 2022.09.23 |