개요
Spring boot를 쓰다보면 필연적으로 접하는 개념이 있습니다.
그 중, 대표적으로 Spring이 관리하는 객체를 뜻하는 Componenet 와 Bean 을 예로 들 수 있겠습니다.
그렇다면 컴포넌트와 빈은 과연 무엇이며, Spring 에게 객체를 관리하도록 등록시키는 방법은 무엇일까요?
첫 번째 방법 : Component Scan 을 통한 빈 등록 ( @Component )
첫 번째 방법으로는 컴포넌트 스캔 기술을 이용해 빈으로 등록하는 방법이 있습니다.
스프링은 기본적으로 클래스 위에 @Component 어노테이션이 붙은 객체를 빈으로 등록시킵니다.
@Controller , @Service , @Repository , @Configuration 등 모두 Ctrl + 클릭을 통해 들어가보면 @Component가 붙어있는 것을 알 수 있습니다.
이렇게, @Component, 혹은 @Component 를 포함한 어노테이션이 붙어있는 객체는,
스프링이 Application이 실행 될 때 Component Scan 과정을 거치면서, 자동으로 스프링이 컨테이너에 빈 등록을 해주게 됩니다.
저희가 자주 봤던 @Controller 와, @Service로 간단한 웹 출력 테스트로 컴포넌트 스캔을 알아보겠습니다.
@Controller
public class TestController {
private final TestService testService;
public TestController(TestService testService) {
this.testService = testService;
}
@GetMapping("/hi")
@ResponseBody
public String test(){
return testService.test();
}
}
@Service
public class TestService {
public String test() {
return "서비스 반환값 임니다~";
}
}
해당 어노테이션들에는 모두 @Component 어노테이션이 존재했기 때문에 개발자가 객체를 생성하는 어떠한 코드 없이도, 스스로 객체를 생성하고 빈으로 등록 되어지는 모습을 볼 수 있습니다.
두 번째 방법 : @Bean 을 통한 빈 등록 ( + @Configuration )
두 번째 방법으로는, 메서드 위에 @Bean 을 사용하는 방법을 통해서 빈을 등록할 수 있습니다.
스프링은 @Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록합니다.
앞선 @Component 와의 차이점은, 개발자가 객체를 직접 생성하고, 원하는 객체에 한해서 빈으로 등록시킬 수 있다라는 점 입니다.
또한 @Bean 을 하나라도 등록시키는 클래스 상단에는 @Configuration 어노테이션을 반드시 명시시켜주어야 @Bean 어노테이션을 인식시킬 수 있습니다.
위 예제를 그대로 갖고와서 @Service 컴포넌트 어노테이션을 없앤 후,
@Bean 어노테이션의 쓰임을 파악해보겠습니다.
//@Service // 어노테이션 제거
public class TestService {
public String test() {
return "서비스 반환값 임니다~";
}
}
@Service 어노테이션을 삭제하고 애플리케이션을 실행해보면 어떤일이 발생할까요?
Description:
Parameter 0 of constructor in com.example.spring.controller.TestController required a bean of type 'com.example.spring.service.TestService' that could not be found.
Action:
Consider defining a bean of type 'com.example.spring.service.TestService' in your configuration.
의존성을 주입받는 매개변수에 빨간줄이 그어짐과 동시에, 바로 Bean 정의를 확인하라는 에러 문구를 확인할 수 가 있습니다!
그럼 곧바로 에러를 해결해보기 위해서, 이번엔 @Bean 등록을 통해서 빈을 등록시켜보도록 하겠습니다.
@Configuration
public class TestConfiguration {
@Bean // Service 클래스를 빈으로 등록
public TestService testService(){
return new TestService();
}
}
저는 TestConfiguraiton 이라는 클래스를 생성하고, 해당 클래스 위에 @Configuration 을 달아주었습니다. 그리고
등록하고자 하는 객체를 생성하는 메서드 위에 @Bean을 달아주기만 하는, 간단한 작업을 거쳐주었습니다.
해당 코드를 작성한 후, 애플리케이션을 다시 실행해보겠습니다.
빨간 줄이 사라지고, 웹에 잘 띄워지는 것을 보아, 스프링이 Bean등록을 잘 해놨다는 것을 알 수 있었습니다 :)
이상 간단한 예제를 통해 알아봤던, 스프링이 관리하는 객체인 "빈 객체"를 등록시키는 방법이었습니다!
'[Spring]' 카테고리의 다른 글
다양한 Lock 기법을 활용한 동시성 제어 방법 ( Synchronized , Database , Redis ) (1) | 2024.12.30 |
---|---|
Spring Boot JPA : @Entity를 사용할 때 @NoArgsConstructor를 하지 않으면 에러가 나는 이유 (6) | 2024.10.20 |
Spring Security로 로그인 구현해보기 (0) | 2024.07.25 |
Lombok 롬복의 @Builder, @NoArgsConstructor 와의 충돌 이유 (0) | 2024.07.08 |
ORM, JPA, Hibernate 그리고 Spring Data JPA (1) | 2024.06.24 |