🗂️ Study/🌿Spring

IoC Container & Bean

litlight 2024. 5. 21. 19:25

빈(Bean)

  • Spring이 관리하는 객체

Spring IoC 컨테이너

  • 'Bean'을 모아둔 컨테이너

Spring Bean을 등록하는 방법

  • @Component를 Bean으로 등록하려고 하는 클래스 위에 작성
  • Bean의 이름은 클래스의 앞 글자만 소문자로 변경하여 저장
  • 이때 제대로 Bean이 되었다면 커피콩 모양의 Bean 아이콘 생성

@ComponentScan Spring

  • 서버가 뜰 때 @ComponentScan에 설정해 준 packages 위치와 하위 packages 들을 전부 확인하여 @Component가 설정된 클래스들을 ‘Bean’으로 등록해줌.

Spring 'Bean' 사용 방법

@Autowired

  • 필드 위에 @Autowired
  • Spring에서 IoC 컨테이너에 저장된 memoRepository ‘Bean’을 해당 필드에 DI 즉, 의존성을 주입해줌.
  • 객체의 불변성을 확보할 수 있기 때문에 일반적으로는 생성자를 사용하여 DI 하는 것이 좋음.
  • @Autowired 적용 조건 : Spring IoC 컨테이너에 의해 관리되는 클래스에서만 가능.
    • Spring IoC 컨테이너에 의해 관리되는 ‘Bean’ 객체만 DI에 사용 가능.
  • @Autowired 생략 조건 : 생성자 선언이 1개 일 때만 생략 가능.

3 Layer Annotation 

  • Spring 3 Layer Annotation은 Controller, Service, Repository의 역할로 구분된 클래스들을 ‘Bean’으로 등록할 때 해당 ‘Bean’ 클래스의 역할을 명시하기 위해 사용됨.
    1. @Controller, @RestController
    2. @Service
    3. @Repository

Bean 수동 등록

  • @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해줌.
  • 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋음.
    • 프로젝트의 규모가 커질수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리함.
    • 비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리함.
  • Bean 수동 등록 사용 시점
    • 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음.
      • 공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가 적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동등록함.
      • 비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않음.
      • 또한 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있음.
  • Bean 수동 등록 방법 
    • Bean으로 등록하고자 하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정.
    • Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정.
    • Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장됨.

같은 타입의 Bean이 2개 일 때

  • 같은 타입의 Bean이 2개이면 Bean을 주입해줘야하는데 같은 타입의 Bean 객체가 하나 이상이기 때문에 어떤 Bean을 등록해줘야할지 몰라 오류가 발생함.

해결방법

  1. 등록된 Bean 이름 을 정확하게 명시하여 해결할 수 있음.
  2. @Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입 함.
  3. @Qualifier 사용하여 Bean으로 등록한 클래스와 주입하고자 하는 필드에 @Qualifier("사용할 Bean") 를 추가해주면 해당 Bean 객체가 주입 됨. 
    • 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높음.
    • 하지만 Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야함.
    • 따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋음.