[Spring] Bean Scope - Prototype 빈에 try-with-resources 적용해보기
·
Spring/Core
빈 스코프가 뭐에요?기존에 업로드 한 자바에서 스코프를 떠올려보자. 자바에서 스코프라는 용어는 해당 변수가 생존할 수 있는 생존 범위를 의미 했다. [Java] Java에서의 스코프(Scope)배그 하시는 분들 검색 키워드에 이끌려 오셨다면 죄송합니다ㅋㅋJava에서 스코프(Scope) 란 무엇인가?스코프(Scope)란 변수가 접근 가능한 범위를 의미한다.자세한건 아래 코드의 예제를 통해 설명bdisappointed.tistory.com 스프링에서 빈 스코프란 말 그대로 스프링 빈이 생존할 수 있는 범위를 뜻한다.스프링은 다음과 같은 다양한 스코프를 지원한다1. 싱글톤 : 기본 스코프로써, 스프링 컨테이너가 생성될 때 만들어지고 종료될 때 소멸되는 가장 넓은 범위의 스코프이다.2. 프로토타입 : 프로토타입..
[Spring] 한 컨테이너 안에 같은 타입의 빈이 2개라면?
·
Spring/Core
@Autowired는 타입을 기준으로 조회한다.스프링 컨테이너 안에 한타입의 하나의 빈만 존재한다면 아무 걱정이 없겠지만, 만약 FixDiscountPolicy() 나 RateDiscountPolicy() 처럼 한 타입의 두개의 빈이 존재하면 DI에 어떤 영향을 줄까? Bean 이 Unique 하지 않아요DI 프레임워크가 자동 의존 관계 주입을 시도하는 과정에서 동일 타입 빈 2개를 만나면 다음과 같이 NoUniqueBeanDefinitionException 예외가 발생한다.NoUniqueBeanDefinitionException: No qualifying bean of type'hello.core.discount.DiscountPolicy' available: expected single matchin..
[Spring] DI : 생성자 주입을 선택해야 하는 이유
·
Spring/Core
최근 트렌드는 DI 프레임워크 대부분이 생성자 주입을 권장한다. 이유를 알아보자.생성자 주입이 권장되는 이유불변대부분 주입된 의존 관계는 한번 일어나면 애플리케이션의 종료 시점까지 의존관계를 변경할 일이 거의 없다. 오히려 대부분의 의존 관계는 종료시점까지 변경되면 안되는 불변을 지향한다.이러한 이유 때문에, 메서드를 public으로 열어놓아야하는 수정자 주입은 누군가 이 메서드로 중간에 의존 관계를 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 것은 좋은 방법이 아니다.즉, 생성자 주입은 딱 1회 일어나므로 값이 변경될 수 없는 불변의 특성을 가지고 있기 때문에 생성자 주입이 권장된다. 누락인터페이스가 DI 프레임워크에 의존적이 되므로, 어느 하나의 스프링빈이라도 의존 관계가 주입되지 않으면 실..
[Spring] Dependency Injection : 의존 관계 주입의 4가지 방법
·
Spring/Core
의존 관계 주입 방법의존 관계를 주입 하는 방법은 4가지 방법이 있다 -> [생성자 주입, 수정자(setter) 주입, 필드 주입, 일반 메서드 주입]생성자 주입이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방식 -> 즉 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.final 키워드가 붙어있는 불변, 필수 의존관계에 사용한다.(참고로 생성자가 밑에처럼 하나면 @AutoWired 를 생략해도 된다.)@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; ..
[Spring] @ComponentScan , @AutoWired - 자동 Bean 등록
·
Spring/Core
스프링 컨테이너에 스프링 빈을 등록하는 가장 원초적이고 직관적인 방법은 @Bean 에노테이션을 활용하는 것이다.하지만 서비스가 커지면 커질 수록 몇백개, 몇천개로 늘어나는 빈을 일일히 등록하고 관리하는 것은 쉽지 않다.스프링은 이런 귀차니즘을 해소하기 위해 설정 정보 없이 스프링 빈을 자동으로 등록해주는 컴포넌트 스캔이라는 기능을 제공하고, 의존 관계를 자동으로 주입해주는 @Autowired 라는 에노테이션도 제공한다.컴포넌트 스캔 사용 예시@ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다. @ComponentScan컴포넌트 스캔을 사용하기 위해선 먼저 @ComponentScan 에노테이션을 붙여주면 된다.import hello.core.member.Memb..
[Spring] Singleton 패턴 : 인스턴스 아나바다 운동
·
Spring/Core
싱글톤 패턴클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. -> 즉 우리는 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.대표적인 방법으로는 private 생성자를 사용하여 외부에서 호출할 수 없도록 하는 방법이 있다.public class SingletonService { // 1. static 영역에 딱 하나만 미리 생성 private static final SingletonService instance = new SingletonService(); // 2. public 으로 열어서 객체 인스턴스가 필요하면 조회가 가능하도록 static 허용 public static SingletonService getInstance() { Sys..
[Spring] 스프링 컨테이너 - ApplicationContext, Bean 조회
·
Spring/Core
스프링을 사용하면서, 각 컴포넌트별로 인터페이스들의 구현체 의존성을 자동으로 주입하고, 관리하는 컨테이너를 스프링 컨테이너라고 한다. 스프링 컨테이너 생성ApplicationContext ac = new AnnotationConfigApplicationCOntext(AppConfig.class);우리는 ApplicationContext를 스프링 컨테이너라고 하고 이는 인터페이스이며, 이는 다양한 방식을 기반으로 생성한 구현체를 주입할 수 있다 (에노테이션, XML 등)어떤 구현체를 사용할지 명세 해놓은 AppConfig를 기반으로 생성하기 위해 해당 클래스를 파라미터로 넘긴다.import hello.core.Order.OrderService;import hello.core.Order.OrderServic..
[Spring] BeanFactory와 ApplicationContext
·
Spring/Core
스프링 컨테이너는 BeanFactory와 ApplicationContext로 구분할 수 있다.BeanFactory빈 팩토리는 스프링 컨테이너의 최상위 인터페이스이고, 스프링 빈을 관리하고 조회하는 역할을 한다 -> 즉 우리가 사용하는 getBean() 메서드는 BeanFactory 인터페이스에서 재공하는 기능이다. ApplicationContextBeanFactory를 상속받아 사용하고, 추가로 부가 기능을 제공한다1. MessageSource : 메시지 소스를 위한 국제화 기능2. EnvironmentCapable : 환경변수3. ApplicatoionEventPublisher : 애플리케이션 이벤트4.ResourceLoader : 편리한 리소스 조회정리- ApplicationContext는 BeanF..
[Spring] @PostConstruct, @PreDestroy 와 컴포넌트 스캔의 궁합
·
Spring/Core
https://bdisappointed.tistory.com/113 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 셧다운초기화 콜백 : 빈이 생성 되고, 빈의 의존 " data-og-host="bdisappointed.tistory.com" data-og-source-url="https://bdisappointed.tistory.com/113" data-og-url="https://bdisappointed.tistory.com/113" data-og-image="https://blog.kakaocdn.net/dna/bEZHoC/hyYTqlNl9o/AAAAAAAAAAAAAAAAAAAAAN9hf7WvdVLAFXzOLdtjZVK7KBjz51NWERnv7HI2atSL/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1756652399&allow_ip=&allow_referer=&signature=MNUyqp36G3Y3AVNW9ANg877X2gU%3D