백기선님의 스프링 프레임워크 핵심 강좌를 학습하며 정리한 내용입니다.

IoC

의존 관계 주입이란 뜻으로 어떤 객체가 사용하는 의존 객체를 직접 생성해 사용하는 것이 아니라 주입을 받아 상황에 맞게 사용하는 방법을 말합니다.

스프링 IoC 컨테이너의 역할

  • BeanFactory (최상위 인터페이스, IoC의 핵심)
    • 다양한 라이프사이클을 통해 container 안에 bean을 가공하여 사용
  • Bean 설정 소스로부터 Bean의 정의를 읽어 가공하여 제공
  • 컴포넌트 중앙 저장소(Bean)

Bean

  • 스프링 IoC 컨테이너가 관리하는 객체
  • 의존성 관리
  • 라이프 사이클

    • 스프링 IoC 컨테이너에 등록된 Bean에 추가적 작업을 하기 위한 기능
  • Scope

    • 싱글톤 - 하나
    • Bean 등록시 @annotation을 사용하지 않을 때
    • 메모리 측면 효율적이며 성능 최적화에 좋음
    • 프로토타입 - 다른 객체
  • 빈에 대한 정의

    • 이름
    • 클래스
    • 스코프
    • 생성자 argument
    • 프로퍼티(setter)
  • @Component 어노테이션

    • 하위 어노테이션 @Autowired, @Service, @Repository 등등

@Autowired

required : default -> true (찾지 못하면 app 구동 실패)

사용 위치

  • 생성자
  • setter
  • 필드

BookService(생성자)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@Service 
public class BookService() {

BookRepository bookRepository;

@Autowired
public BookService(BookRepository bookRepository) {
	this.bookRepository = bookRepository;
}


}

BookRepository(생성자)

1
2
3
4
@Repository
public class BookRepository {

}

BookService(Setter)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@Service
public class BookService {
    
    BookRepository bookRepository;
    //setter
    @Autowired(required = false)
    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

BookRepository(Setter)

1
2
3
public class BookRepository {

}

BookService(필드)

1
2
3
4
5
6
7
8
@Service
public class BookService {
    
    //필드 
    @Autowired(required = false)
    BookRepository bookRepository;
   
}

BookRepository는 setter와 동일

Result(서버 구동 성공)

1
2
2019-07-10 22:37:20.254  INFO 4169 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-07-10 22:37:20.257  INFO 4169 --- [           main] c.e.s.StudySpringapplicationApplication  : Started StudySpringapplicationApplication in 2.177 seconds (JVM running for 2.623)

같은 타입 Bean이 여러개인 경우

  • @Primary(추천)
    • 하나의 빈을 선택하고자 할 때 사용 @Primary
  • 해당 타입을 모두 빈 주입
    • List<BookRepository> bookRepositories;
  • @Qualifier(빈 이름으로 주입)
    • @Qualifier("빈 이름 문자열")

동작 원리

BeanPostProcessor 라이프 사이클 인터페이스에 의해 구동됩니다. bean의 인스턴스를 생성 후initializing 라이프사이클 전/후에 부가적 작업을 할 수 있는 라이프사이클 콜백을 말합니다.

이러한 beanPostProcessor를 상속받는 AutowiredAnnotationBeanPostProcessor는 스프링 구동 후 Bean을 등록하는 기능을 합니다.

ComponentScan

Bean들의 스캔 위치 설정할 수 있으며, 필터를 통해 스캔 범위를 지정할 수 있습니다.

ComponentScan 클래스 내에 basePackageClasses() 에 전달된 클래스 기준으로 컴포넌트스캔 작동합니다.

라이프 사이클

1
2
3
4
5
6
//라이프사이클 콜백
@PostConstruct
public void postConstruct() {
	system.out.println("-----------");
	system.out.println("Life Cycle :)");
}

ApplicationContext

BeanFactory를 상속받아 스프링 IoC 컨테이너의 기능을 가지고 있으며 메세지소스(메세지 다국어), 리소스(파일시스템)를 읽어오는 기능등 다양한 기능을 제공합니다.

Reference