Spring/Spring
-
Spring - 스프링 빈의 초기화, 소멸 메서드(생명주기 콜백)Spring/Spring 2022. 1. 25. 16:07
스프링 빈의 초기화, 소멸 메서드(생명주기 콜백) 스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸전 콜백 -> 스프링 종료 그런데 위 스프링 빈의 이벤트 라이프 사이클을 보면 초기화 콜백과 소멸전 콜백이 보인다. 둘의 정의를 정의하자면 다음과 같다. 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 이후에 호출 빈에 필요한 데이터들을 필드에 초기화 소멸전 콜백 : 빈이 소멸되기 직전에 호출 왜 빈을 등록할 당시에 초기화를 같이 해주지 않고 빈의 등록과 의존 주입이 끝난 이후에 해줄까? 생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 진다. 초기화는 객체 내부에서 값을 넣어..
-
Spring - 동일 타입의 빈을 모두 주입받을 수 있는 List, MapSpring/Spring 2022. 1. 24. 12:35
같은 타입의 빈 중 필요한 빈을 @Primary, @Qualifier를 통해 주입받아 사용할 수 있었다. 그런데 같은 타입의 빈이 모두 필요한 경우는 어떻게 해야 할까? 지금까지 블로깅 내용을 예로 들어보자. 지금까지 원하는 할인 정책(RateDiscountPolicy, FixDiscountPolicy) 중 필요한 정책을 선택하여 주입받아 사용해 왔다. 그런데 클라이언트가 할인의 종류를 선택할 수 있다고 가정했을 때 이 두 개의 정책 모두 주입받아야 사용해야 할 것이다. 물론 @Qualifier를 이용하여 주입받을 DiscountPolicy 필드를 2개 선언하여 주입할 수 있지만, 만약 할인 정책이 10개, 100개 라면 엄청난 코드 중복이 발생할 것이다. 이를 해결하기 위해 List와 Map을 이용한다..
-
Spring - 동일 타입의 빈이 2개 이상일 경우 의존관계 주입 방법Spring/Spring 2022. 1. 24. 12:32
동일 타입의 빈이 2개 이상일 경우 의존관계 주입 시 오류가 발생 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } } ... @Componen..
-
Spring - 다양한 의존관계 주입 방법(생성자 주입, 수정자 주입, 필드 주입)Spring/Spring 2022. 1. 24. 12:31
의존관계 주입 방법 생성자 주입 수정자 주입 (setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 생성자를 통해서 의존 관계를 주입하는 방법 생성자 호출 시점에 딱 1번만 호출되는 것을 보장한다. 불변, 필수 의존관계에 사용 불변 : 한번 주입하면 주입된 인스턴스는 변하지 않는 것을 보장 필수 : 주입받는 필드에 final 키워드를 이용함으로써 반드시 주입받아야 되는 것을 보장 @Autowired를 생략해도 자동 주입이 된다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discoun..
-
Spring - 컴포넌트 스캔(Component Scan)Spring/Spring 2022. 1. 23. 21:47
컴포넌트 스캔(Component Scan) 스프링 빈을 등록할 때 @Bean 어노테이션을 이용하여 설정 정보에 직접 등록할 스프링 빈을 나열했다. 등록해야 할 스프링 빈이 많을 경우에는 설정 정보도 커지고 누락하는 문제가 발생한다. 이러한 문제를 해결하기 위해 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔이라는 기능을 제공한다. 의존 관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 컴포넌트 스캔을 하게 되면 AppConfig에서 해주었던 빈 등록을 하지 않아도 된다. 대신 @Component 어노테이션이 붙은 클래스를 스캔하여 스프링 빈으로 등록하게 된다. 컴포넌트 스캔은 해당 패키지부터 하위 패키지까지 스캔해준다. @Configuration @Compone..
-
Spring - 싱글톤 컨테이너Spring/Spring 2022. 1. 23. 16:05
싱글톤 컨테이너 웹 어플리케이션은 싱글톤을 사용한다. 그 이유는 웹 어플리케이션을 이용하는 사람은 1명이 아닌 여러 사람이 동시 다발적으로 이용한다. 때문에 싱글톤을 사용하지 않으면 n명의 고객이 웹 요청시 n개의 인스턴스를 만들어 메모리 낭비가 심해지기 때문이다. 이제 순수 DI 컨테이너부터 만들어가며 왜 싱글톤 컨테이너가 필요한지 알아보자. 순수 DI 컨테이너 앞에 블로깅한 코드에서 스프링 컨테이너를 사용하지 않으면 어떻게 될까? 테스트를 해보자. @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer(){ AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig...
-
Spring - 스프링 컨테이너(Spring Container)와 종류, 그리고 Bean 조회 방법Spring/Spring 2022. 1. 18. 23:28
스프링 컨테이너(Spring Container) 스프링 컨테이너는 자바 객체의 생명 주기를 관리한다. 지금까지 포스팅해왔던 순수 자바 코드로 개발자가 직접 해왔던 작업들을 스프링 컨테이너가 객체를 등록, 소멸의 역할을 대신해주게 된다. 즉, 개발자가 흐름을 제어하는 것이 아닌 외부(스프링 컨테이너)에서 제어해주게 된다는 뜻이다. - 제어의 역전(IoC) 또한 스프링 컨테이너는 객체를 등록한 후 각 객체들의 의존 관계를 런타임 과정에서 설정해준다. - 의존관계주입(DI) 이전 포스팅한 코드로 스프링 컨테이너에 객체를 어떻게 등록하고 어떻게 의존관계가 설정되는지 알아보자. 스프링 컨테이너에 설정 클래스 등록 지금까지 작성한 설정 클래스(AppConfig)를 스프링 컨테이너에 등록해보자. Application..
-
스프링의 등장 - 순수 자바 코드에서 스프링까지 3 , IoC(제어의 역전)와 Di 그리고 등장하는 스프링Spring/Spring 2022. 1. 16. 23:40
IoC(Inversion of Control) - 제어의 역전 기존 프로그램은 클라이언트 구현 객체가 서버 구현 객체를 생성, 연결, 실행하여 스스로 제어 흐름을 조종했지만 AppConfig를 이용하여 구현 객체는 실행만 담당하게 되었다. 즉, 클라이언트 구현 객체는 실행만 담당하고, 프로그램의 제어 흐름을 AppConfig가 가져오게되었다. 클라이언트 구현 객체들은 어떤 구현 객체를 갖는지 신경을 안쓰게 되고 자신의 로직만 실행하게 되었다. 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아닌 외부에서 관리하는 것을 제어의 역전(IoC)라 한다. DI(Dependency Injection) - 의존관계 주입 DI 정적인 의존 관계 정적인 의존관계는 애플리케이션을 실행하지 않아도 분석할 수 있다. 즉,..