[F-Lab 모각코 챌린지] 28일차 - DI, Autowrired 사용 시 주의할점 / PropertyEditor
F-Lab 모각코 챌린지 28일차 입니다 Autowired, DI 사용 시 주의 할 점과 PropertyEditor, 기본 등록 Bean 을 정리하였습니다
![[F-Lab 모각코 챌린지] 28일차 - DI, Autowrired 사용 시 주의할점 / PropertyEditor](/content/images/size/w1200/2023/06/-------_--------_-------22.png)
DI 주의 할 점
- @Configuration 안에 선언 시 Singleton
@Configuration 애노테이션이 붙은 클래스 안에서의 @Bean 은 기본적으로 싱글톤으로 작성되어 언제나 동일한 인스턴스를 반환한다 - 의도하지 않은 동작 가능성
그 외에 @Service 같은 애노테이션에서는 동일하지 않은 객체를 리턴한다. 때문에, @Service 애노테이션이 붙은 클래스 안에서 @Bean 애노테이션을 사용 할 때는 외부에서 DI 받는 형식으로 구현하는 것이 좋다
@Autowired 애노테이션 사용 시 주의 할 점
- 필수 여부 확인
Autowired 애노테이션은 기본적으로 대상 Bean 이 반드시 존재해야 한다.
빈이 존재하지 않으면 예외가 발생되며@Autowired(required = false)
로 필수가 아님을 명시 할 수 있다 - Bean 중복 문제
Bean 주입은 Type, 이름 을 기준으로 판단하고 DI 를 수행한다.
하지만 같은 타입의 같은 이름이 있을 때 어떤 빈을 주입해야 하는지 알 수 없다 - 순환 의존성 주의
- 지연 초기화 가능(Lazy Loading)
빈을 생성하는 시점을 정할 수 있다. @Lazy 애노테이션을 이용해서 가능하다. - 프록시 객체
Spring 의 AOP 와 같은 기능을 사용 할 때 프록시 객체가 생성될 수 있다
이 경우 @Autowired 가 주입하는 빈이 실제 객체가 아닌 프록시 객체일 수 있으므로 주의가 필요하다
PropertyEditor
@Value 애노테이션을 사용하여 기본적으로 property 값을 바인딩 할 수 있다
이 때 사용되는 것이 PropertyEditor 인터페이스 이다
지원되는 타입은 아래와 같다
- 기본타입
boolean , Boolean , byte , Byte , short , Short , int , Integer , long , Long , float , Float , double , Double , BigDecimal , Biglnteger , char , Character , String - 배열
byte[] , char[] , short[] , int[] , long[] - Collections
List, Set, Map, Properties - 기타
Chatset, Class, Class[], Currency(ISO 4217), File(리소스 로더에서 사용하는 접두사 사용 가능. ex:"file:"
,"classpath:"
), InputStream, Locale, Pattern, Resource, Resource[], Timezone, URL, URI
기본 등록 Bean
- ApplicationContext
- BeanFactory
- ResourceLoader
- ApplicationEventPublisher
ApplicationListener 인터페이스를 구현한 빈에게 이벤트를 발생 시킬 수 있는 publishEvent() 메소드를 가진 인터페이스
스프링 컨테이너에는 빈 사이에 이벤트를 발생시키고 이를 전달받을 수 있는 기능이 포함되어 있다.
내부적으로 이벤트 기반을 테스트 해볼 때 유용하겠으나, 해당 기능과 다른 라이브러리, 프레임워크를 동시에 사용 할 경우 논리적인 문제가 발생할 수 있다. 대표적으로 JPA 의 의미없는 save 함수 호출이 있다. - systemProperties
- systemEnvironment