Spring Bean ?
Spring Bean 스프링 컨테이너가 생성하고 관리하는 객체를 뜻한다.
스프링 빈은 컨테이너에 등록되어 있으며, 필요한 경우 스프링 컨테이너가 해당 객체를 제공한다.
Spring Bean 생성 주기 (1-8단계)
@SpringBootApplication 으로 어플리케이션 기동 시 Component Scanner가 발동하게 되는데 Bean 생성 주기는 아래와 같다.
1. @Configuration
2. @Controller
3. @Component
4. @Repository
5. @Service
6. @Bean
이 순서대로 Bean 을 등록한다. 이후에는
7. @Autowired 어노테이션으로 의존성 주입을 하고
8. @PostConstruct 생성자가 위의 모든 일들이 이루어지고 난 후 동작하는 어노테이션이 그 다음이다.
사용 용도는 아래와 같다.
어노테이션 | 설명 |
@Configuration | Spring Framework에서 설정 클래스로 사용함 해당 클레스는 어플리케이션의 설정을 제공하는 클래스가 됨 |
@Controller | 이 어노테이션이 붙은 클래스는 HTTP 요청을 처리하고 HTTP 응답을 반환하는 메소드를 포함 |
@Component | 이 어노테이션이 붙은 클래스는 빈으로 등록되어 컨테이너에서 관리함 |
@Repository | 이 어노테이션이 붙은 클래스는 DAO(Data Access Object)로 사용되며 데이터베이스와의 상호 작용을 담당함 |
@Service | @Service 어노테이션은 비즈니스 로직을 담당하는 서비스 계층 클래스에 붙임 |
@Bean | @Configuration 어노테이션이 붙은 클래스에서 빈으로 등록하고자 하는 메소드에 붙이는 어노테이션 |
@Autowired | 의존성 주입을 위해 사용 |
@PostConstruct | 해당 클래스의 인스턴스가 생성된 후 초기화 작업을 수행하는 메소드에 붙이는 어노테이션임 빈이 생성된 후 자동으로 호출됨 |
자주 사용되는 어노테이션 비교
1. @Component vs. @Bean
스프링 빈에는 크게 Component와 Bean 두 가지로 나뉜다.
Component 개발자가 직접 컨트롤 가능한 객체를 빈으로 등록할 때 사용하고
Bean 의 경우는 외부 라이브러리에서 반환하는 객체를 스프링 빈으로 등록해야 할 때 사용할 수 있다.
굳이 언급하자면 Component에는 Controller , Service, repository 와 같은 어노테이션들이 포함되어 있다고 볼 수 있다.
(Controller , Service, repository 대신에 Component 를 사용해도 좋지만 조금더 구체적으로 그리고 목적에 맞게 개발을 하고자 앞의 것들을 사용한다고 보면 된다)
2. @Autowired vs. @RequiredArgsConstructor
이 친구들은 의존성 주입과 관련이 있다.
의존성 주입(DI) 은 객체 간의 의존성을 낮추고, 코드의 재사용성과 유지 보수성을 높이기 위해 사용한다.
의존성 주입 방법은 다음과 같다.
생성자 주입 (Constructor Injection) | 생성자를 통해 의존성을 주입하는 방법 (권장) |
필드 주입 (Field Injection) | 필드에 @Autowired 어노테이션을 붙여 사용 간결하게 코드를 작성할 수 있음 객체 생성 시점 이후에 의존성 주입이 이루어져서 코드가 실행될 때 에러를 발생시킬 수 있음 |
세터 주입 (Setter Injection) | Setter 메소드를 통해 의존성 주입하는 방법 생성자 주입과 다르게 객체 생성 이후에 의존성이 주입되기 때문에 에러가 발생할 수 있 |
메소드 주입 (Method Injection) | 메소드의 파라미터를 통해 의존성을 주입하는 방법 (사용빈도 낮음) |
그렇다면 생성자 주입 방법을 왜 권장할까?
코드의 안정성, 의존성 추적, 테스트 용이성, 불변성 보장 등의 이유가 있으나 필자는 순환참조를 언급하고 싶다.
만약 의존성 주입 문제가 발생할 경우 런타임이 아닌 컴파일 때 문제를 발견할 수 있기 때문이다.
@RequiredArgsConstructor 는 생성자 자동 생성을 위해 사용되는 어노테이션이다.
해당 어노테이션이 사용된 클래스 내에서 final로 선언된 필드 값을 파라미터로 받는 생성자를 자동으로 생성해준다.
정리하자면 @Autowired 는 생성자, 필드, 메서드에 사용되고, @RequiredArgsConstructor 는 생성자에만 사용된다.
3. @PostConstruct vs. 생성자
생성자는 객체를 생성하는 역할을 하고 @PostConstruct 는 객체의 초기화 작업을 수행한다.
생성자는 객체 생성 시점에서 한 번 호출되고 @PostConstruct는 객체 생성 이후 한 번 호출된다.
스프링에서 개발을 진행하는 과정에서 객체를 생성하고 초기화할 때 이 두 가지의 요소를 사용한다.
'SpringBoot > 기본' 카테고리의 다른 글
[SpringBoot] @Scheduled 스케쥴링 적용 방법 (0) | 2023.03.08 |
---|---|
[Spring 입문] 포트번호 오류 해결 (0) | 2022.12.22 |
[SpringBoot] View 환경설정 (1) | 2022.12.21 |
[SpringBoot] 라이브러리 살펴보기 (0) | 2022.12.21 |
[SpringBoot] 프로젝트 생성 (0) | 2022.12.21 |