스프링없는 순수한 DI 컨테이너인 AppConfig는 요청할 때 마다 객채를 새로 생성한다. 예를 들어, 클라이언트 A, B, C가 MemberService를 요청하면 각자 3번 MemberServiceImpl를 요청하게 된다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! 메모리 낭비가 심하다. ▶ 해결방안 : 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. => 싱글톤 패턴 테스트 코드 import hello.core.AppConfig; import hello.core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import s..
bean
스프링 빈 설정 메타 정보 - BeanDefinition 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 스프링 컨테이너는 왜 어노테이션을 활용한 자바코드(@bean)인지 xml로 빈을 등록한 건지 상관이 없는 걸까? 그 중심에는 BeanDefinition 이라는 추상화가 있다. 쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것이다! XML을 읽어서 BeanDefinition을 만들면 된다. 자바 코드를 읽어서 BeanDefinition을 만들면 된다. 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 추상화(역할)인 BeanDefinition을 사용하기 때문에, 오직 BeanDefinition만 알면 된다. BeanDefinition 을 빈 설정 메타정보라 한다. @Bean , 당 ..
BeanFactory 스프링 컨테이너의 최상위 인터페이스 스프링 빈을 관리하고 조회하는 역할 getBean()을 제공 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능 ApplicationContext BeanFactory기능을 모두 상속받아서 제공 그럼 BeanFacotory와의 차이는?? 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능 + 알파(수 많은 부가기능) ApplicationContext가 제공하는 부가기능 메시지소스를 활용한 국제화 기능(MessageSource) 예를 들어, 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력 환경 변수EnvironmentCapable) 로컬, 개발, 운영 등을 구분해서 처리 애플리케이션 이벤트(Applicati..
전체코드 보기 더보기 package hello.core.beanfind; import hello.core.AppConfig; import hello.core.dicsount.DiscountPolicy; import hello.core.dicsount.FixDiscountPolicy; import hello.core.dicsount.RateDiscountPolicy; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; ..
테스트 코드로 진행하겠다. 등록된 빈 보기 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); SameBeanConfig에 타입이 MemberRepository인 것 2개 만들기 @Configuration static class SameBeanConfig { @Bean public MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2() { return new MemoryMemberRepository(); ..
Test코드 진행로 진행해보겠다. 코드 전체보기 더보기 package hello.core.beanfind; import hello.core.AppConfig; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationCon..
AppConfig 스프링 기반으로 변경 // AppConfig는 애플리케이션의 실제 동작에 필요한 "구현 객체를 생성"한다. // AppConfig는 MemoryMemberRepository객체를 생성하고 그 참조값 MemberServiceImpl을 생성하면서 생성자로 전달한다. // 클라이언트인 MemberServiceImpl입장에서 보면 의존관계를 마치 외부에서 주입해주는 것 같다고 해서 DI(Dependency Injection) = 의존관계 주입 또는 의존성 주입이라고 한다. @Configuration : AppConfig에 설정을 구성 @Bean : 각 메서드에 사용. 스프링 컨테이너에 스프링 빈으로 등록 🟢🟡🟠 주의 빈 이름은 메서드의 이름을 사용하지만, 빈 이름을 직접 부여할 수도 있다.(@..