우리가 Spring을 사용하는 수 많은 이유중에 대표적인 장점을 꼽으라면 의존성 주입 컨테이너에 관한 내용을 빼놓을 수 없다. 스프링은 자바 빈을 찾아서 ApplicationContext라고 하는 의존성 주입 컨테이너 오브젝트에 등록을 한다. 그리고 애플리케이션이 돌다가 어떤 오브젝트가 필요하다면 의존하는 오브젝트를 찾아서 연결해준다.
그렇다면 스프링은 어떻게 자바 빈을 찾아가지고 의존성 주입 컨테이너에 등록하는걸까?? @Component 어노테이션으로 이 클래스를 자바 빈으로 등록하라고 알려줄 수 있다. 이번 포스팅에서는 이 @Component에 대해서 알아보려고 한다.
@Component
@Component 어노테이션을 붙이면 이 클래스를 자바 빈으로 등록시키라고 알려줄 수 있다. 해당 어노테이션이 명시되어 있으면 Spring이 자동으로 클래스의 인스턴스를 생성하고 종속성을 포함하여 각종 lifecycle을 관리해준다. 이를 통해 개발자는 오브젝트 생성 및 관리에 대한 걱정보다 비즈니스 로직 자체에 집중할 수 있다고 한다.
@Component
public class MyComponent {
// ...
}
위의 예시처럼 MyComponent에 @Component 어노테이션을 붙여준다. 그러면 앞으로 MyComponent는 Spring에서 자동으로 관리해준다.
단, 모든 경우에 @Component를 클래스 앞에 붙여준다고 스프링이 자동으로 알아서 등록해줄까?? 이건 또 아니다. @ComponentScan이라는 어노테이션이 존재해야만 한다.
그러나 이걸 구현한 기억이 없어도 Spring은 마법처럼 알아서 빈을 관리해줬을 것이다. 왜냐하면 Spring boot 프로젝트를 생성하면 기본적으로 존재하는 @SpringBootApplication이라는 어노테이션 안에 명시되어 있기 때문이다.
+ 이전에 @SpringBootApplication 에 대해서 정리한 적이 있으니 필요한 분들은 참고해주세요.
@Autowired
@Autowired는 어노테이션을 @Component와 함께 사용된다. 이 어노테이션을 달면 ApplicationContext에 종속성을 주입할 수 있다. 클래스에 @Autowired를 달았다? 그러면 Spring에서 필요한 종속성의 인스턴스를 자동으로 주입한다.
@Component
public class MyComponent {
private MyService myService;
@Autowired
public MyComponent(MyService myService) {
this.myService = myService;
}
// ...
}
위의 예제에서는 @Autowired를 사용해 MyService 인스턴스를 MyComponent에 주입한다. MyComponent가 생성되면 Spring은 자동으로 MyService의 인스턴스를 생성하고 MyComponent의 생성자에 주입까지 해준다.
@Service, @Controller, @Repository
@Component는 클래스를 Spring 관리 빈으로 표시하기 위한 범용 어노테이션이지만, Spring은 @Service, @Controller 및 @Repository라는 보다 구체적인 어노테이션들을 제공한다. 이러한 주석은 모두 @Component의 메타 어노테이션이다.
뭔가 말이 복잡한데 @Component의 모든 기능을 상속하고 일부 추가적인 기능들이 들어간 어노테이션들이라고 보면 된다.
따라서 위의 어노테이션들을 사용하면 Spring이 자동으로 자바 빈을 찾아서 관리해줄 뿐만 아니라 이것이 Service인지 Controller인지에 따라 추가적인 기능들을 제공한다.
@Bean
그럼 @Bean 어노테이션은 뭘까? @Component는 클래스를 Spring에서 알아서 관리해주는 자바 빈으로 표시하는 데 사용되는 반면 @Bean은 Spring에서 관리할 Bean을 명시적으로 선언하는 데 사용된다.
처음 들을 때는 그게 그거 아닌가 싶은 문장이었는데 굳이 해석해보자면 이렇다.
@Component와 달리 @Bean은 개발자가 Bean의 생성 및 구성을 사용자 정의할 수 있도록 한다. 그러니 @Bean을 이용해 우리는 Spring에게 이 오브젝트는 언제 어떻게 생성이 되어야하고 매개변수는 무엇이 필요해를 직접 지시할 수 있다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocale(Locale.US);
return resolver;
}
// ...
}
이 예제에서는 Locale.US의 기본 로케일로 SessionLocaleResolver의 인스턴스를 반환하는 LocaleResolver 빈을 정의했다. 이 빈은 Spring MVC 애플리케이션에서 사용자의 로케일을 해결하는 데 사용된다.
이 글에서는 Spring Boot에서 @Component 어노테이션의 개념을 살펴봤다. 간단하게 @Component 동작 방식에 대해서 정리하며 글을 마무리한다.
@ComponentScan 어노테이션이 있는 경우, 베이스 패키지와 그 하위 패키지들을 돌면서 @Component가 명시된 클래스들을 찾아서 스프링이 관리하는 자바 빈에 등록한다. 필요에 따라서 @Component가 적힌 클래스 오브젝트를 생성한다.
이때 다른 오브젝트에 의존하고 있다면 그 오브젝트도 같이 찾아줘야 한다. @Autowired가 명시된 경우 Spring이 알아서 찾고 오브젝트를 생성해서 관리해준다. 만약 @Bean으로 명시된 오브젝트라면 @Bean이 달린 메서드를 불러서 오브젝트를 생성해준다.
'web > spring&spring boot' 카테고리의 다른 글
[Spring] Mybatis의 snake case를 camel case로 자동 변환하기 (0) | 2024.01.27 |
---|---|
API 호출을 위한 RestTemplate, WebClient 및 Feign 비교 (0) | 2023.05.11 |
[Spring Batch] Spring Batch의 장점 (0) | 2022.02.26 |
[Spring] REST API 구현 (0) | 2021.11.07 |
[spring boot] 스프링 부트 게시판 페이징 기능 구현하기 (0) | 2021.06.08 |