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

김동민님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

스프링 빈 조회 - 동일한 타입이 둘 이상

간단한 질문 하나 드립니다. (빈 타입에 대하여)

작성

·

286

·

수정됨

0

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

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

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

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

 

안녕하세요. 강의를 듣다가 약간 헷갈리는 부분이 있어 간단한 질문드립니다.

getBean() 메소드의 매개변수로, '빈 이름'과 '타입'이 있다고 이해했습니다. 여기서 '타입'이 정확히 무엇을 의미하는지 헷갈립니다.

@Bean 애노테이션이 붙은 메소드의 리턴 타입을 의미하는 것일까요?

@Bean
public MemberRepository memberRepository1() {
    return new MemoryMemberRepository();
}

@Bean
public MemberRepository memberRepository2() {
    return new MemoryMemberRepository();
}

예를 들어 위 코드의 경우, 둘 다 MemberRepository 타입을 반환하기 때문에 빈 타입으로 MemberRepository이 저장되는 것인가요?

그리고 동일한 타입 둘 이상인 경우 발생하는 NoUniqueBeanDefinitionException도 @Bean에 등록된 반환타입이 동일하기 때문에 발생하는 것인지도 궁금합니다.

추가적으로 앞 강의에서 getBean()을 사용할 때 구체 타입(예: MemoryMemberRepository.class)을 사용할 수도 있다고 했는데, 이건 MemoryMemberRepository의 부모가 MemberRepository이기 때문인가요?

답변 2

0

안녕하세요. 김동민님, 공식 서포터즈 David입니다.

  1. getBean에서 사용되는 타입은 해당 타입으로 가져올 수 있는 모든 빈을 빈 조회 대상으로 두는 것입니다. 만약 Foo 인터페이스가 있고, Foo 인터페이스를 구현한 FooImpl 객체가 빈으로 등록되어 있다면, getBean에서 Foo 인터페이스(타입)를 넘길 시, FooImpl 타입을 가지는 빈도 빈 조회 대상이 됩니다.

  2. 동일한 타입을 가지는 빈이 등록되어 있어도, 빈 이름이 다르면 동일한 빈으로 인식하지 않습니다. 따라서, 빈 생성 메서드의 반환타입과 해당 예외는 무관합니다.

  3. 1번에서 설명드린 내용 참고 부탁드립니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

타입은 객체의 자료형을 말합니다. @Bean 애노테이션이 붙은 메소드의 리턴 타입은 해당 빈의 타입이 됩니다.

예를 들어, 위 코드에서 memberRepository1() 메소드의 리턴 타입은 MemberRepository입니다. 따라서 이 메소드가 호출되면 MemoryMemberRepository 객체가 생성되어 리턴됩니다.

getBean() 메소드의 매개변수로 타입을 지정하면, 해당 타입과 일치하는 빈을 가져옵니다.

만약 getBean(MemberRepository.class)와 같이 MemberRepository 타입을 지정한다면, MemberRepository 타입의 빈을 찾아서 리턴하게 됩니다.

즉, getBean(“memberRepository1”, MemberRepository.class)와 같이 사용한다면 memberRepository1() 메소드에서 생성한 빈을 찾아서 리턴하게 됩니다.

이렇게 타입을 지정하여 빈을 가져올 수 있는 장점은, 런타임 시에 타입의 호환성을 검증할 수 있다는 것입니다.