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

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

Jin님의 프로필 이미지
Jin

작성한 질문수

스프링 핵심 원리 - 기본편

컴포넌트 스캔과 의존관계 자동 주입 시작하기

ac.getBean 관련 질문 있습니다.

해결된 질문

작성

·

193

0

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

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

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

[질문 내용]
여기에 질문 내용을 남겨주세요.MemberService memberService = ac.getBean("memberService", MemberService.class);MemberService memberService = ac.getBean(MemberService.class);이 두 코드엔 무슨 차이가 있는 건가요?위의 코드로 AutoAppConfigTest를 실행하면 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'memberService' available 오류가 뜨고, 아래의 코드로 같은 테스트를 실행하면 통과합니다.

답변 2

0

안녕하세요. Jin님, 공식 서포터즈 OMG입니다.

다음과 같이 스프링 빈을 자동 등록 어노테이션을 사용하였다면 해당 빈의 이름은 클래스 이름의 첫글자는 소문자를 따라갑니다.(memberServiceImpl)

@Component
// 혹은 @Service
public class MemberServiceImpl implements MemberService

image

 

따라서 다음과 같이 스프링 빈의 이름으로 조회하면서 타입까지 일치해야 하는 아래의 DL에서는 빈을 찾을 수 없다는 오류가 발생합니다.

ac.getBean("memberService", MemberService.class);

반면, 다음과 같이 타입으로 조회하는 경우에는 이름이 일치하지 않더라도 타입으로 조회했기 때문에 테스트가 성공합니다.

MemberService memberService = ac.getBean(MemberService.class);
 
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. Jin님의 질문에 대해 도움이 될 만한 정보를 찾았습니다.

ac.getBean("memberService", MemberService.class)ac.getBean(MemberService.class) 사이의 주요 차이는 Bean을 찾는 방식입니다. 첫 번째 방식은 특정 이름(“memberService”)을 가진 MemberService 타입의 Bean을 찾으며, 두 번째 방식은 MemberService 타입의 Bean을 찾습니다. 이름과 타입 모두를 지정해주는 경우와 달리, 타입만으로 Bean을 조회하는 경우는 다양한 설정이나 상황에서 더 유연하게 활용될 수 있습니다.

이러한 차이 때문에, 특정 Bean 이름으로 조회할 때 Bean을 찾을 수 없는 오류가 발생했을 수 있습니다. 이와 관련하여, getBean()의 파라미터 에 대해 자세히 설명한 게시물이 있습니다. 이 링크에서는 getBean() 함수 사용 방식의 차이점과 각 방식의 사용 사례에 대해 설명하고 있습니다.

또한, 이러한 문제가 발생하는 상황은 보통 Bean의 이름이 예상과 다르게 설정되었거나, AutoAppConfig 설정에서 Bean 이름을 따로 지정하지 않았을 때 벌어질 수 있습니다. 빈 이름을 명시하거나 명시하지 않고 타입만으로 조회하는 방식의 선택은 상황에 따라 달라질 수 있으며, 각 방식의 이해는 스프링 프레임워크 사용에 있어 중요한 부분입니다.

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

Jin님의 프로필 이미지
Jin

작성한 질문수

질문하기