[F-Lab 모각코 챌린지] 28일차 - DI, Autowrired 사용 시 주의할점 / PropertyEditor

F-Lab 모각코 챌린지 28일차 입니다 Autowired, DI 사용 시 주의 할 점과 PropertyEditor, 기본 등록 Bean 을 정리하였습니다

[F-Lab 모각코 챌린지] 28일차 - DI, Autowrired 사용 시 주의할점 / PropertyEditor

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