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

shlovejo2님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

중복 등록과 충돌

AutoAppConfig의 memberRepository() 반환 유형에 따른 충돌 여부

작성

·

85

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

AutoAppConfig의 memberRepository() 반환 타입을

아래와 같이 인터페이스로 했을때는 충돌이 발생했습니다.

그런데

@Configuration
@ComponentScan(
           basePackages = "hello.core",
            excludeFilters=@ComponentScan.Filter(type= FilterType.ANNOTATION,classes=Configuration.class)
)
public class AutoAppConfig {

    @Bean(name="memoryMemberRepository")
    MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

}

해당 함수의 반환 타입을 아래와 같이 실제 구현체 클래스인 MemoryMemberRepository로 하니까 test 시 충돌이 발생하지 않습니다.

빈이름이 같으면 반환타입을 인터페이스로 하든, 그 구현체로 하든 충돌이 발생해야된다고 생각했는데 왜 실제 구현체로 하면 충돌이 발생하지 않나요?

@Configuration
@ComponentScan(
           basePackages = "hello.core",
            excludeFilters=@ComponentScan.Filter(type= FilterType.ANNOTATION,classes=Configuration.class)
)
public class AutoAppConfig {

    @Bean(name="memoryMemberRepository")
    MemoryMemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

}

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. shlovejo2님

다음 질문을 참고해주세요.

https://www.inflearn.com/community/questions/1189653

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

shlovejo2님의 질문과 관련하여, 이전에 비슷한 상황에 대해 질문하신 분들과 그에 대한 답변이 있었습니다. 질문자분께서는 AutoAppConfig에서 MemberRepository의 반환 타입을 변경했을 때 충돌 발생 여부에 대해 궁금해 하셨습니다.

이 관련하여, 다음의 질문과 답변이 도움이 될 수 있습니다:

  1. 컴포넌트 스캔에서 @Bean이 붙은 메서드에 관한 질문 - 이 질문에서는 @Bean 어노테이션이 붙은 메서드의 반환 타입이 클래스 또는 인터페이스에 따라 어떻게 다르게 동작하는지에 대한 상황이 설명되어 있습니다.

질문의 핵심은 스프링의 @Bean 어노테이션을 사용해서 스프링 컨텍스트에 빈을 등록할 때, 해당 빈의 등록 방식(인터페이스 반환 타입 vs. 구현체 반환 타입)이 어떻게 작동하는지에 대한 이해를 필요로 합니다. 반환 타입이 인터페이스인 경우와 구현 클래스인 경우 스프링의 동작 방식에 있어서 차이점이 발생할 수 있으며, 이는 스프링이 빈을 검색하고 주입하는 방식에 영향을 줍니다.

추가적으로, @ComponentScan@Bean 어노테이션을 동시에 사용할 때 주의해야 할 점과, 스프링이 빈을 찾아 주입하는 과정에서 발생할 수 있는 다양한 상황들에 대해서도 강의에서 다루고 있으니, 관련 내용을 복습하시면 더욱 도움이 될 겁니다.

이 문제의 경우, 스프링은 빈 이름으로 빈을 구분하며, 동일한 이름이면서 반환 타입이 다를 때 내부적으로 어떻게 처리되는지에 대한 정확한 설명이 필요합니다.

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