프로젝트를 진행하면서 RestTemplace을 커스터마이징하여 들어오는 응답을 자동으로 snake_case -> CamelCase로 바꾸었다.
📌 RestTemplate을 커스터마이징하는 방법은 아래 포스팅을 참고해주세요.
위와 같이 DI하면 내가 재정의한 configuration의 restTemplate이 어떻게 자동으로 실행되고, 어떤 순서로 이루어지는 건지 궁금했다.
그래서 Spring 애플리케이션의 실행 과정을 찾아보니, 아래와 같은 순서로 동작한다고 한다.
Spring 애플리케이션이 실행되면서 Spring 컨테이너가 초기화됨
@Configuration으로 표시된 클래스들을 스캔해서 @Bean으로 표시된 메서드들을 찾음
➜ 모두 찾아서 각각 반환 타입에 해당하는 객체를 생성하고, Spring 컨테이너에 의해 관리되는 Bean(객체)으로 등록됨
주입받아야하는 컴포넌트의 생성자를 스캔한 후,
Spring 컨테이너에 등록되어있는 Bean들 중 생성자의 파라미터에 필요한 타입의 Bean을 찾음
➜ 존재하면, Spring은 이를 자동으로 해당 컴포넌트의 생성자에 주입
👉 내가 만든 커스텀 restTemplate의 경우를 예로 들면,
Spring 컨테이너가@Bean으로 정의된 RestTemplate Bean을 관리하고 있다가,
GooglePlaceServiceImpl클래스에서 DI를 하려고 하니까
Spring 컨테이너가 내가 커스텀했던 RestTemplate 타입의 빈을 찾아서GooglePlaceServiceImpl클래스의 생성자로 주입해준 것 !
📌 @Configuration
📌 @Bean
@Configuration이 붙은 클래스 내부의 메서드 레벨에 @Bean 애너테이션을 붙이면,📌 컴포넌트 ( Component )
@Component, @Service, @Repository, @RestController를 사용하여 선언된 클래스들 말하는 것❗
@Configuration도 컴포넌트라고 볼 수 있지만,
이는 주로 애플리케이션의 구성(configuration)을 담당하는 특수한 목적을 가지고 있기 때문에
실행되는 시점이나 컨텍스트가 다른 컴포넌트들과 구별됨!
⠀ ⠀
✔️@Configuration
- 애플리케이션의 설정 정보를 담는 클래스에 붙임
- 애플리케이션 시작 시점에 실행됨
- 내부에 정의된
@Bean으로 선언된 메소드들은 Spring IoC 컨테이너에 의해 관리되는 빈(Bean)으로 등록되고,
애플리케이션의 구성 요소를 정의하고 초기화하는 데 사용됨
✔️
@Component,@Service,@Repository,@RestController
- 특정 기능을 구현하는 클래스에 붙임
- 애플리케이션의 로직에 따라 실행되거나, 사용자의 요청이 있을 때 흐름에 따라 실행됨
Ex.@RestController가 붙은 클래스 - 사용자의 웹 요청에 따라 실행
Ex.@Service/@Repository가 붙은 클래스 - 비즈니스 로직이나 데이터 접근 로직을 처리하는 과정에서 필요에 따라 실행