Spring

의존성 주입 (Dependency Injection)

snail voyager 2020. 5. 11. 22:51
728x90
반응형

Spring DI

  • 의존 : 한 클래스가 다른 클래스의 메서드를 실행할 때 '의존'한다

  • 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식 : 생성자, setter()

    • 생성자 방식 :
      • Bean 객체를 생성하는 시점에 모든 의존 객체가 주입
      • 생성자의 파라미터 수가 많아지면 생성자 코드를 확인해야함
    • setter() 방식 :
      • 메서드 이름을 통해 어떤 의존 객체가 주입되는지 알 수 있음
      • 필요한 의존 객체가 전달받지 못해도 Bean 객체가 생성되기 때문에 문제
  • 객체를 생성하고 의존 객체를 주입하는 기능을 분리하여 변경의 유연함 : @Configuration Spring 설정 클래스

  • ApplicationContext(BeanFactory)는 Bean 객체의 라이프 사이클을 관리 : 스프링 컨테이너

  • 설정 클래스를 이용하여 컨테이너를 생성하고 컨테이너가 Bean 객체 관리

  • Bean 객체는 싱글톤 객체. @Bean 붙은 메서드 이름을 Bean 객체 이름으로 사용

  • @Import : 설정 클래스에서 함께 사용할 다른 설정 클래스를 지정

의존 자동 주입

  • @Autowired : 스프링 자동 주입 기능. 해당 타입의 Bean을 찾아 필드에 할당

    • 생성자, setter()를 사용해서 의존 주입을 명시하지 않아도 됨
    • 메서드에 자동주입 시 파라미터 타입에 해당하는 Bean 객체를 찾아 주입
  • @Qualifier : 자동 주입 가능한 Bean이 두개 이상일 때 주입할 빈을 지정

    • @Autowired 처럼 필드와 메서드에 모두 적용 가능
    • @Qualifier 없다면 Bean 객체 이름(메서드명)으로 구분

Component Scan

  • @ComponentScan : 스프링이 직접 클래스를 검색해서 Bean 으로 등록해주는 기능

    • basePackages 속성값 : 스캔 대상 패키지 목록 지정
    • excludeFilters 속성값 : 스캔 대상 제외
  • @Component : 컴포넌트 스캔 대상 클래스

    • @Controller, @Service, @Repository, @Aspect, @Configuration 도 스캔 대상
    • 자동 등록된 Bean 이름은 클래스 이름의 첫 글자를 소문자로 바꾼 값
    • 수동 등록한 Bean이 우선으로 등록하여 한개만 존재
728x90
반응형