
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 애너테이션을 추가하였다
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("다른 객체 입니다");
}
}
}

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이라 적힌 메서드명을 스프링 빈의 이름으로 사용한다.