package hello.springbasic;
import hello.springbasic.discount.DiscountPolicy;
import hello.springbasic.discount.FixdiscountPolicy;
import hello.springbasic.discount.RatediscountPolicy;
import hello.springbasic.member.MemberService;
import hello.springbasic.member.MemberServiceImpl;
import hello.springbasic.member.MemoryMemberRepository;
import hello.springbasic.order.OrderService;
import hello.springbasic.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(new MemoryMemberRepository());
}
@Bean
public OrderService orderService() {
//orderserviceImpl은 두개를 받고 있는데,
return new OrderServiceImpl(new MemoryMemberRepository(), new FixdiscountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixdiscountPolicy(); 이전 할인 정책
return new RatediscountPolicy();
}
}
package hello.springbasic;
import hello.springbasic.member.Grade;
import hello.springbasic.member.Member;
import hello.springbasic.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);
Member member = new Member("sua", Grade.Basic, 1L);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println(findMember);
}
}
package hello.springbasic;
import hello.springbasic.member.Grade;
import hello.springbasic.member.Member;
import hello.springbasic.member.MemberService;
import hello.springbasic.order.Order;
import hello.springbasic.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);
Member member = new Member("맴버a" , Grade.VIP, 1L);
memberService.join(member);
Order order = orderService.createOrder(1L,"음료" , 5000);
System.out.println(order);
}
}
기존에는 Appconfig을 불러와서 객체를 생성하고 그 안에서 객체를 생성하고 했지만, '@configuration' 을 사용해서 @Bean 과 연결하여 @Bean이 적힌 모든 메서드를 가져온다. 이렇게 모든 메서드를 호출하여 반환하는 객체를 스프링 컨테이너에 등록한다.
Appconfig을 불러오지 않아도 알아서 객체를 컨테이너에 넣어두고 사용하는 것이다.
이렇게 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.
이렇게 사용하면 무슨 장점이 있을 까?
ApplicationContext 는 스프링 컨테이너이며, 인터페이스이다.
위에서 Appconfig를 사용한 방식은 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.
new AnnotationConfigApplicationContext(AppConfig.class)를 실행하면서 스프링컨터네이가 생성된다.
@Bean이라고 적힌 것들을 컨테이너에 저장한다. 빈 이름은 보통 메서드 이름을 사용한다. 다만 빈의 이름은 무조건 다 다르게 해야한다.
스프링 컨테이너는 안에 코드를 보고 참고하여 의존관계를 주입한다(DI)
memberService() 는 memberRepository 를 의존하고, orderService는 memberRepository, discountPolicy 를 의존하는 등등 전부 확인하고 주입한다.
1. 빈을 먼저 생성 2. 의존관계 주입한다.
'Spring' 카테고리의 다른 글
[Spring] 주문과 할인 도메인 설계 (0) | 2025.03.16 |
---|---|
[Spring] 회원등록 불러오기 (0) | 2025.03.04 |
[Spring] 회원게시판 만들어보기 (1) | 2025.03.02 |
[Spring] 웹 기초 (0) | 2025.03.01 |