Spring @Configuration
스프링 컨테이너는 싱글톤 방식을 지원하게 해준다 -> 이거에 대한 자세한 설명은 IOC 컨테이너 글에서 다루겠다.
그렇기에 java config class에서 @Configuration Annotation을 붙이지 않는다면 싱글톤을 지원해 주지 않는다.
스프링 컨테이너는 @Bean으로 등록되어있는 객체들을 관리하고, 이에 맞춰서 올바르게 의존성을 주입시켜 준다.
그렇기에 @Configuration을 통해서 싱글톤을 보장하는 것이다.

의존성 주입 방법
그렇기에 의존성을 주입해 주는 방법이 있다.
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 |