작성
·
181
0
안녕하세요
수강중에 놓친 내용이 있는 것 같아서 질문 드립니다
@Configuration
public class DataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
@Bean
public PlatformTransactionManager transactionManager(DataSource emf) {
return new DataSourceTransactionManager(emf);
}
}
componentScan 패키지 영역 내에서는
Bean Context에 등록된 Bean 객체면
Parameter로 전달받아서 사용할 수 있는건가요?
답변 2
1
스프링은 컴포넌트스캔이든 명시적인 빈 팩토리 메소드 선언이든 상관없이 등록 가능한 모든 빈 정보를 먼저 수집하고 이 사이의 의존관계를 확인합니다. 그래서 그에 따라 각 빈의 생성 순서를 조정합니다.
위와 같은 @Bean 팩토리 메소드를 이용하는 경우 아래 transactionManager()를 실행해서 빈을 만들려면 DataSource 타입의 빈이 필요하다는 것을 알 수 있고, 위 dataSource()를 이용해서 빈을 먼저 만든 뒤에 그 오브젝트를 아래 transactionManager()의 파라미터로 넘겨줍니다.
순환참조가 발생하지 않는다면 이와 같이 다른 빈을 파라미터로 주입 받아서 새로운 빈을 생성하는 방식을, 생성자 주입 또는 @Bean 메소드 파라미터 주입 등에 활용할 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김동민님.
여러분의 질문을 이해하기 위해서는 스프링에서의 의존성 주입에 대해 조금 더 알고 가야 할 것 같습니다. 스프링 프레임워크는 의존성 관리에 있어 매우 강력한 기능을 제공하는데, 이는 특히 @Configuration
과 @Bean
어노테이션이 있는 클래스에서 잘 드러납니다.
@Configuration
public class DataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
@Bean
public PlatformTransactionManager transactionManager(DataSource emf) {
return new DataSourceTransactionManager(emf);
}
}
@Configuration
클래스 내부에서 @Bean
어노테이션을 사용하면 해당 메서드의 리턴 객체가 스프링 컨테이너에 빈으로 등록됩니다.DataSource emf
는 dataSource()
메서드에서 정의된 DataSource
빈이 자동으로 주입됩니다. 이는 스프링이 해당 타입의 빈을 컨테이너에서 찾아 파라미터로 주입하는 방식입니다. 스프링은 유사한 타입의 빈을 찾아 자동으로 주입해주기 때문에 코드에서는 필요에 따라 사용할 수 있게 되는 것입니다.@Component
어노테이션이 붙은 클래스가 패키지 범위 내에 있다면 해당 클래스도 자동으로 빈으로 등록됩니다.네, 말씀하신 대로 스프링에서는 @Bean
을 이용해 생성된 객체(빈)는 스프링 컨텍스트에 등록되어 있으며, 해당 객체는 같은 컨텍스트 내에서 다른 빈의 생성자나 메서드의 매개변수로 자동으로 주입될 수 있습니다. 이 기능은 스프링의 핵심 중 하나인 의존성 주입(DI, Dependency Injection)을 통해 가능하게 됩니다.
아래 유사한 질문과 답변 링크를 참고하시어 더욱 자세한 맥락을 이해하실 수 있습니다:
- DataSource 자동 구성 클래스 설정하기
- @JdbcTest와 Bean 등록 이해하기
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.