1. 의존성 주입, DI
- 스프링 트라이앵글 중 가장 핵심적인 개념은 의존성 주입입니다. 의존성 주입은 객체 간 결합을 낮추는 유용한 방법입니다.
- 스프링 프레임워크는 스프링 빈을 선언하고, 스프링 빈 컨테이너를 사용하여 빈들 사이에 의존성을 주입합니다.
2. 빈, Bean
-
애플리케이션에서 공통으로 사용할 경우 정의
-
스프링 빈은 스프린 빈 컨테이너가 관리하는 순수 자바 객체를 의미합니다.
스프링 빈 컨테이너는 스프링 빈 정의를 읽고, 스프링 빈 객체를 생성한 후, 서로 의존성이 있는 스프링 빈 객체들을 주입한 후 애플리케이션 실행 준비 상태가 됩니다.
애플리케이션이 종료되기 전 스프링 빈 컨테이너는 관리하고 있던 스프링 빈들을 종료합니다.

- 스프링 빈 컨테이너 구현체에 따라 정해진 포맷의 설정 파일을 로딩합니다.
설정 파일 포맷은 자바 클래스, XML, 그루비 등 종류가 다양합니다.
스프링 부트의 기본 스프링 빈 컨테이너 구현체는 ConfigurableApplicationContext이며 설정 포맷은 자바 클래스입니다.
- 설정 파일에 정의된 스프링 빈 정의를 로드하고, 지정된 클래스패스에 위치한 클래스들을 스캔하고, 스프링 빈 정의가 있으면 로딩한다.
- 로딩을 마친 스프링 빈 컨테이너는 정의된 대로 스프링 빈을 생성하고 컨테이너에서 관리한다.
- 스프링 빈들 사이에 서로 의존성이 있는 객체들은 스프링 빈 컨테이너가 조립한다.
- 스프링 빈 컨테이너 구현 클래스에 따라 추가 작업을 한다.
- 작업이 완료되면 애플리케이션은 실행 준비를 완료한다.
-
스프링 빈을 관리하는 스프링 빈 컨테이너는 스프링 애플리케이션을 실행하면 가장 먼저 실행됩니다.
-
스프링 빈 객체들은 생성한 주체와 정의 방법에 따라 크게 세 가지로 분류할 수 있습니다.
- 스프링 프레임워크의 기능을 스프링 빈으로 정의한 것
- Environment, ApplicationContext 등
- 스프링 빈 컨테이너가 로딩하는 설정 파일에 정의된 것
- 클래스패스에 있는 스테레오 타입 어노테이션
2-1. Spring Boot에 Bean을 정의하는 방법
- 자바 설정 클래스에서 @Bean 어노테이션을 사용해 정의
- 스트레오 타입 어노테이션을 사용하여 정의
- BeanDefinition 인터페이스를 구현하여 정의
- XML 설정 방식을 사용하여 정의
2-2. @Configuration
@Configuration
public class ThreadPollConfig {
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
}
}
2-3. @ComponentScan
- 설정된 패키지 경로에 포함된 자바 설정 클래스들과 스테레오 타입 어노테이션을 스캔한다.
스테레오 타입 어노테이션
1. @Repository
2. @Component
3. @Controller
4. @Service
5. @RestController
@Configuration
@ComponentScan(
basePackages = {
"com.springboot.config",
"com.springboot.domain"
},
basePackageClasses = {
ThreadPoolConfig.class,
ServerConfig.class
}
)
- basePackages을 설정한 패키지 하위의 클래스들을 모두 스캔합니다.
- basePacakgeClasses로 특정 클래스를 스캔할 수 있습니다.
- @SpringBootApplication이 선언된 클래스의 상위 패키지나 다른 경로의 클래스는 @ComponentScan의 대상이 되지 않습니다.
2-3. @Import
- @Import는 명시된 여러 개의 자바 설정 클래스를 하나의 그룹으로 묶는 역할을 합니다.
- @Import 어노테아션이 정이된 자바 설정 클래스가 다른 자바 설정 클래스들을 임포트하는 개념입니다.
@Configuration
@Import(value = {ThreadPoolConfig.class, MailConfig.class}
public class ServerConfig {
...
}
- value에 입력받는 값은 @Configuration이 선언된 자바 설정 클래스입니다.
@ComponentScan과 동일한 기능입니다.
2-4. 스테레오 타입 빈