Spring - DI(Dependency injection)

see1237·2022년 8월 12일
0

Section2

목록 보기
7/10

Spring Container

컨테이너 : 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미
스프링 컨테이너

  • Bean들의 생명주기를 관리한다.
    -> 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다.(의존성 주입)
  • 사용하는 이유? 객체 간의 의존성을 낮추기 위해 사용
  • 스프링 컨테이너는 Configuration Metadata를 사용한다.
// Annotation
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// XML
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

Spring Bean

빈(bean)은 인스턴스화된 객체를 의미. (스프링 컨테이너등록된 객체를 스프링 빈이라고 한다)

Bean Definition

스프링의 다양한 설정 형식추상화한 것
-> 스프링 컨테이너는 BeanDefinition이라는 추상화를 통해 Spring Bean을 생성한다
즉, 스프링이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.

관련 annotation

  • @Configuration
    해당 객체가 bean definitions의 소스임을 나타내는 애너테이션
    클래스 자체가 Bean 정의로 등록되고 클래스 내에서 선언된 모든 @Bean 메서드도 빈으로 등록
  • @ComponentScan
    @ComponentScan이 붙은 클래스부터 하위 패키지를 탐색하여 @Component가 붙은 모든 클래스를 스프링 빈으로 등록해준다. 스프링 부트를 사용하면 @SpringBootApplication 를 프로젝트 시작 루트 위치에 두는 것이 좋다.(@SpringBootApplication에 @ComponentScan이 들어있음)
  • @Bean
    메서드에 추가해서 사용한다. return 객체를 빈으로 등록
  • @Component
    클래스에 추가해서 사용한다. 해당 클래스를 빈으로 등록

실습과제 에러 경험 - Bean과 Component

NoUniqueBeanDefinitionException: 
expected single matching bean but found 2: userServiceImpl,userService
// 에러 발생이 일어난 코드
UserService userService = ac.getBean(UserService.class);
-> @Bean 해놨던 부분을 지우지 않고 @Component 추가해서 문제 발생(@Bean, @Component 두가지 조회됨)
참고) @Bean은 메서드 이름으로 등록되기 때문에 
ac.getBean("userService", UserService.class); 와 같이 쓰면 나오고,
@Component는 클래스 이름의 첫 문자를 소문자로 바꾼 것이 이름이 되기 때문에 아래와 같이 쓰면 나온다.
ac.getBean("userServiceImpl", UserService.class);

0개의 댓글