Bean을 등록하는 2가지 방법 (@Component / @Bean + @Configuration)

2024. 8. 4. 01:16·[Spring]

개요

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
'[Spring]' 카테고리의 다른 글
  • 다양한 Lock 기법을 활용한 동시성 제어 방법 ( Synchronized , Database , Redis )
  • Spring Boot JPA : @Entity를 사용할 때 @NoArgsConstructor를 하지 않으면 에러가 나는 이유
  • Spring Security로 로그인 구현해보기
  • Lombok 롬복의 @Builder, @NoArgsConstructor 와의 충돌 이유
7.06com
7.06com
우당탕탕 코딩하기
  • 7.06com
    우당탕탕 개발자의 이야기
    7.06com
  • 전체
    오늘
    어제
    • 분류 전체보기 (54)
      • [Spring] (7)
      • [JAVA] (3)
      • [디자인패턴] (1)
      • [TIL] (7)
      • [CI,CD] (5)
      • [협업] (1)
      • [Database] (4)
      • [CS] (1)
      • [코딩테스트] (15)
      • [알고리즘] (0)
      • [후기-회고] (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
7.06com
Bean을 등록하는 2가지 방법 (@Component / @Bean + @Configuration)
상단으로

티스토리툴바