컴포넌트 - @Component 어노테이션 및 하위 어노테이션이 붙은 클래스
컴포넌트 스캔 - 스프링 빈으로 등록될 컴포넌트 클래스를 검색하는 행위
ApplicationContext - 스프링 빈 컨테이너
스프링은 @Configuration 클래스를 통한 수동 빈 등록, @Component 클래스를 검색 및 생성하는 자동 빈 등록을 지원한다.
클래스 선언 위에 알맞는 어노테이션을 붙인다.


필요한 객체는 @Autowired 를 통해 전달받을 수 있다.
@Component 를 통한 자동 빈 등록을 위해서는 검색범위를 지정해주어야 한다.
스프링 MVC - 스프링 부트를 사용하지 않은 - 의 경우 ApplicationContext가 생성될 때 사용할 자바 설정 클래스를 직접 지정한다. 따라서 해당 설정 클래스에 @ComponentScan 를 붙인다.
@ComponentScan(basePackage = "com.fundly")
베이스 패키지로 지정된 경로부터 모든 하위 패키지를 탐색해 @Component 클래스를 찾아 빈으로 등록한다.
베이스패키지 옵션을 제거하면 해당 자바 설정 클래스가 위치한 패키지부터 그 하위 패키지를 검색해 빈을 등록한다.
스프링 MVC 예시


스프링 부트 예시


@SpringBootApplication 어노테이션에는 @ComponentScan 어노테이션 설정이 포함된다.
또한 @ComponentScan 어노테이션에 basePackages 옵션이 없기 때문에 @SpringBootApplication 이 붙은 클래스가 포함된 패키지로 부터 그 하위 패키지를 검색해 빈을 등록한다.
@SpringBootApplication 이 붙은 클래스 자체를 ApplicationContext를 생성하기 위한 자바 설정클래스로 활용한다.

메서드의 인자로 @SpringBootApplication 클래스의 클래스 객체를 전달하고있다.
이때 메서드 안에서 ApplicationContext 생성 및 초기화가 일어나며, 이때 @SpringBootApplication(@ComponentScan 포함) 클래스를 ApplicationContext가 사용할 설정 클래스로 전달하는 과정이 일어난다.

SpringApplication.run() 메서드의 반환 타입이 ConfigurableApplicationContext 이다. 메서드의 인자로 전달 된 클래스의 정보 - 컴포넌트 스캔 범위 등 - 를 활용해서 ApplicationContext를 생성하고 빈을 등록하는 과정들이 일어나게 된다.
@SpringBootApplication 클래스의 탐색 범위 안에 있는 컴포넌트를 검색하고 이 정보를 통해 ApplicationContext 를 만든다.
- @Component
- @Controller
- @RestController
- @Service
- @Repository
- @Configuration
스프링은 위의 어노테이션을 찾아 빈으로 등록한다.
각 객체의 역할에 맞는 어노테이션을 붙여 빈으로 생성할 수 있다.
@ResponseBody - 컨트롤러 메서드의 반환값을 브라우저로 전송한다.
스프링 예외 추상화 - DB 제품별로 다른 예외들을 공통으로 처리하기 위한 추상화 된 예외를 제공한다.
자바 설정파일과 싱글톤 관련.
https://velog.io/@mulgoms2/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%B1%EA%B8%80%ED%86%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
수동 VS 자동 = 수동 WIN
@Component 스캔을 통한 자동 등록시 중복 되는 경우 예외가 발생한다.
@Component와 자바 설정클래스의 수동 등록 된 빈이 충돌하는 경우에 수동 등록 빈이 등록된다. 스프링 부트에서는 이 경우에 오류가 발생한다.