[Spring] @Bean 과 @Component 의 차이를 알아보자.

2022-08-09


Photo by Pawel Czerwinski on Unsplash

 

@Bean과 @Component는 두 개다 스피링 IOC의 객체를 생성하는 기능을 한다. 이 둘의 차이점을 알아보자.


1. @Bean vs @Component

 

우선 @Bean 은 @Configuration와 세트로 사용된다. @Configuration은 기존의 config (XML에서 작성하던) 형식의 파일들을 java.class 형태로 작성할 수 있도록 도와주는 어노테이션이다.  @Configuration 안에는 IOC에 들어간 bean이 필요한데, 이러한 객체를 생성하는 메서드에게  @Bean 어노테이션을 적어준다. 

 

예로는 아래와 같이 DB 접속 정보가 들어간 config 파일에 사용한다.

@Configuration
public class DatasourceConfig {

    @Bean
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }
	// ........ 추가 코드 필요
}

 

여기서 @Component 는 사용하지 않는 이유는 바로 @Bean은 개발자가 임의로 만든 class 파일이 아닌 Map / List / Set /... 과 같은 직접 제어를 하지 않는 내외부 라이브러리에 대하여 사용하게 된다. DataSourceProperties 도 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties에서 제공하는 외부 라이브러리이기 때문에 @Bean으로 등록해서 사용한다.(@Component 쓰면 에러남)


@Component의 경우 사용자가 만든 임의의 클래스를 빈으로 등록시키기 위해 사용된다.  아래와 같은 방식으로 사용하면 된다.

 

import org.springframework.stereotype.Component;

@Component(value="Test")
public class TestClass {
	
	private String TestName = "Test";
	
}

 

이후 해당 @Component을 호출할 때는 @Autowired라는 어노테이션을 사용해 해당 @Component 선언된 클래스의 기능을 자유롭게 사용하면 된다.

 

	@Autowired
	TestClass testClass;

	@RequestMapping("/home")
	public String indexPage(HttpServletRequest request){	
		
		System.out.println(testClass.getTestName());	
		
		return "/home";
	}

만약에 위치에 @Component 위치에 @Bean 어노테이션을 사용하면, The injection point has the following annotations:
- @org. springframework.beans.factory.annotation.Autowired(required=true) 이와 같이 의존관계 주입 및 컴파일 과정에서 에러 가 발생한다. (반대로 해도 마찬가지)

 

import org.springframework.context.annotation.Bean;

//@Component(value="Test")
@Bean(name="Test")
public class TestClass {
	
	private String TestName = "Test";
	
	public String getTestName() {
		return TestName;
	}
}

메인 이미지 출처 : Photo by Pawel Czerwinski on Unsplash