다양한 의존관계 주입 방법 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy disco..
Spring 이론 공부
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. AutoAppConfig.java @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes =..
@Configuration과 싱글톤 @Configuration public class AppConfig { @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPoli..
웹 애플리케이션 싱글톤 싱글톤 패턴은 객체가 현재 나의 JVM에 하나만 존재는 것이다. 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 가능하다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 이 그림과 같이 여러 고객이 동시에 요청을 한다. 스프링 없는 순수한 DI 컨테이너 테스트 @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer(){ AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할 때 마다 객체를 생성 Member..
BeanFactory와 ApplicationContext BeanFactory 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. getBean()을 제공한다. 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다. 메시지소스를 활용한 국제화 기능 : 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력한다. 환경 변수 : 로컬, 개발, 운영등을 구분해서 처리한다. 애플리케이션 이벤트 : 이벤트를 발행하고 구독하는 모델을 편리하게 지원해 준다. 편..
스프링 컨테이너 생성 //스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext 를 스프링 컨테이너라 한다. ApplicationContext 는 인터페이스이다. (다형성 적용) AnnotationConfigApplicationContext는 구현체이다. 즉 에노테이션 기반의 자바 설정 클래스로 만든 것이다. 직전에 AppConfig 를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 스프링 컨테이너 생성 과정 1. 스프링 컨테이너 생성 new AnnotationConfigApplicationCo..
이제 부터 스프링으로 전환하는 것이다. @Configuration public class AppConfig { @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPo..
제어의 역전 IoC(Inversion of Control) 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 자연스럽게 받아들일 수 있는 부분이다. 우리가 무엇을 만들면 연계적으로 다음 일들이 일어나기 때문에 제어의 흐름은 우리가 조종했다. 하지만 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당했다. 프로그램에서 제어의 흐름은 이제 AppConfig가 담당한다. OrderServiceImpl 입장에서 생각해보면 자신이 어떤 역할을 하는지는 알지만 어떤 것을 실행 할지는 AppConfig가 전해주는 것이다. 그러므로 프로그램에 대한 제어 흐름에 대한 권한은 모두 Ap..