Spring

태태개발일지 -Spring bean

태태코 2024. 9. 22. 16:11
반응형

Spring @Configuration

스프링 컨테이너는 싱글톤 방식을 지원하게 해준다 -> 이거에 대한 자세한 설명은 IOC 컨테이너 글에서 다루겠다.

그렇기에  java config class에서 @Configuration Annotation을 붙이지 않는다면 싱글톤을 지원해 주지 않는다.

 

스프링 컨테이너는 @Bean으로 등록되어있는 객체들을 관리하고, 이에 맞춰서 올바르게 의존성을 주입시켜 준다.

그렇기에 @Configuration을 통해서 싱글톤을 보장하는 것이다.

출처: https://www.geeksforgeeks.org/spring-beanfactory/

 

 

의존성 주입 방법

그렇기에 의존성을 주입해 주는 방법이 있다.

 

1. 생성자 주입 -> 가장 많이 사용하는 방식

2. 필드 주입  -> final 사용을 할 수 없어 불변성 부족, 의존성 주입 테스트가 어렵다는 단점이 있다.

3. setter 주입 -> 단점 어플리케이션이 실행할 때 생성단계에서 생성자가 아니기에 여러 혼란이 있을 수 있다. ex) null

 

다 각기 다른 장단점을 가지지만 , 현재 1로 확정이 된 추세라고 한다.

1을 사용할 때 Spring에서 지원하는 @requiredargsconstructor

를 사용하는데

이것은 private final ~~ 로 선언된 부분이 final은 필수 객체이기때문에 이를 required하다 판다하고, 의존성을 주입시켜주겠다는 것이다.

이렇게 하게되면 필드가 늘어나도 위와 같은 Annotation 한개로 의존성 주입을 쉽게 할 수 있다는 장점이 있다.

 

 

Bean

 

Bean이 여러개일 때는

@Primary 와 @Qualifier를 사용하는데. 이 둘의 차이점은 사용의 범위이다.

만일  주요한 Bean을 고정해서 사용하고 싶다면 @Primary 이 Annotation을 붙이게 되면 가장 우선순위로 빈이 주입되게 된다.

좀더 세부적으로 특정해서 사용하고 싶다면, @Qualifier()를 통해서 직접 네이밍을 통해서 주입해줄 수 있다.

-> @Qualifier가 좀더 세부적이기 때문에 @Primary가 붙더라도 @Qualifier가 우선적으로 택해진다.


Annotaion 만들기

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy{


}

 

위의 속성을 가져오고, 특정 어너테이션을 상속받아서 특정 기능을 수행하고 싶을 때 위와같이 커스텀하게 어너테이션을 만들어서 사용할 수 있다. 하지만,  뚜렷한 목적 없이 무분별하게 재정이 하는 것은 유지 보수에 더 혼란을 가중할 수 있다.

 

 

스프링 부트가 아니라 내가 직접 기술 지원 객체를 스프링 빈으로 등록한다면 수동으로 등록해서 명확하게 들어내는 것이 좋다.

나머지는 자동으로 구성해주는 것이 좋다.

반응형

'Spring' 카테고리의 다른 글

태태개발일지 - 스프링부트 이해와 원리(토비님)  (1) 2024.11.25
태태개발일지 - singleton pattern  (0) 2024.11.08
태태개발일지 - Spring?  (0) 2024.09.20
EntityListener  (0) 2023.09.03
스프링 IOC  (0) 2023.05.26