티스토리 뷰

TIL

[Spring Boot] Bean & Component

호호홍얍얍 2022. 5. 23. 22:52

스프링 빈

스프링 IoC 컨테이너에 의해 자바 객체가 만들어지게 되는데, 이 객체가 스프링 빈이다. 컨테이너에 의해 빈은 인스턴스화되어 조립되거나 관리된다. 즉, 개발자가 작성한 코드를 컨테이너가 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다. 개발자는 싱글톤 패턴으로 인스턴스화된 객체를 재사용하게 된다. new 연산자로 만들어진 것은 Bean이 아니다.

빈과 빈 사이의 의존성은 컨테이너가 사용하는 메타데이터 환경설정에 반영된다.

 

빈을 등록하는 방법

스프링 빈을 등록하기 위해서는 @Component, @Controller, @Service, @Repository, @Configuration, @Bean 과 같은 어노테이션을 사용하여 등록할 수 있는데, @Controller, @Service, @Repository는 모두 @Component를 상속받고 있으며, 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 빈으로 등록된다(컨테이너는 @Component가 달린 클래스를 Component Scan을 통해 등록한다. 참고로, main 이 있는 하위 패키지만 뒤진다. 물론 이것은 설정으로도 변경 가능하다).

 

1) @Component: Class 위에 작성할 수 있다. 이름을 명시하지 않을 경우 소문자로 시작하는 클래스 이름이 자동으로 사용된다.

소스가 변경될 일이 없는 경우에 주로 활용한다. 예를 들어 컨트롤러나 서비스, 리포지터리는 한 번 만들어놓고 변경할 일이 거의 없다.

@Component
public class Search extends NaverShopSearch {
    public String search(String query) { ... }
}

 

2) @Bean: 개발자가 직접 컨트롤이 불가능한 외부 라이브러리를 등록하고 싶을 때,  @Configuration 어노테이션과 함께 사용하여 등록이 필요하다는 것을 알려준다. Class에는 선언이 불가능하고 메서드 상단에 써준다. 이름을 명시하지 않을 경우 소문자로 시작하는 메서드 이름이 자동으로 사용된다.

@Configuration
public class NaverShopSearch {
    @Bean
    @Primary
    public String search(String query) {...}
}

 

 

소스가 변경될 가능성이 있다면, Config 파일을 별도로 만들어서 Configuration-Bean을 활용한다.

 

등록된 빈을 사용하는 방법

- @Autowired: 빈 객체를 특정 참조변수에 매핑할 때 사용한다. 생성자, Setter, 필드 주입 세 가지 방식이 있다. 이것이 가능한 이유는 컨테이너에 빈이 등록되어 있기 때문이다. 컨테이너에서 인스턴스화된 빈을 알아서 주입해준다(DI).

- @Qualifier: 어떤 빈을 사용할지 정할 때 사용한다. 만약 동일한 인터페이스/클래스를 상속한 클래스가 두 개 있고, 각각 컴포넌트로 명시했다면, 참조변수는 어떤 객체를 참조해야 할지 몰라 에러를 발생시킬 것이다. 이때 참조변수의 상단에 이 어노테이션을 써준다.

@Autowired
@Qualifier("NaverShopSearch")
Search search;

- @Primary: 클래스 상단에 사용하여 동일한 클래스가 여러 개 있을 때 어떤 것을 참조해야 할지 우선순위를 정해준다. 만약 @Autowired와 함께 쓰였다면 @Autowired가 우선한다.

@Component
@Primary
public class Search extends NaverShopSearch {
    public String search(String query) { ... }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함