인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김동민님의 프로필 이미지

작성한 질문수

토비의 스프링 6 - 이해와 원리

스프링을 어떻게 공부할 것인가?

생성자 파라미터성자 파라미터

작성

·

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 인턴님의 프로필 이미지

안녕하세요, 인프런 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);
    }
}

핵심 설명:

  • Bean 등록: @Configuration 클래스 내부에서 @Bean 어노테이션을 사용하면 해당 메서드의 리턴 객체가 스프링 컨테이너에 빈으로 등록됩니다.
  • 생성자/메서드 파라미터 주입: 메서드의 파라미터로 선언된 DataSource emfdataSource() 메서드에서 정의된 DataSource 빈이 자동으로 주입됩니다. 이는 스프링이 해당 타입의 빈을 컨테이너에서 찾아 파라미터로 주입하는 방식입니다. 스프링은 유사한 타입의 빈을 찾아 자동으로 주입해주기 때문에 코드에서는 필요에 따라 사용할 수 있게 되는 것입니다.
  • Component Scan: 만약 @Component 어노테이션이 붙은 클래스가 패키지 범위 내에 있다면 해당 클래스도 자동으로 빈으로 등록됩니다.

결론:

네, 말씀하신 대로 스프링에서는 @Bean을 이용해 생성된 객체(빈)는 스프링 컨텍스트에 등록되어 있으며, 해당 객체는 같은 컨텍스트 내에서 다른 빈의 생성자나 메서드의 매개변수로 자동으로 주입될 수 있습니다. 이 기능은 스프링의 핵심 중 하나인 의존성 주입(DI, Dependency Injection)을 통해 가능하게 됩니다.

아래 유사한 질문과 답변 링크를 참고하시어 더욱 자세한 맥락을 이해하실 수 있습니다:
- DataSource 자동 구성 클래스 설정하기
- @JdbcTest와 Bean 등록 이해하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.