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

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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

스프링 핵심 원리 - 기본편

스프링 빈 조회 - 기본

getBean의 타입에 대해 질문드립니다.

작성

·

722

2


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

[질문 내용]
스프링 컨테이너에있는 스프링 빈을 찾아올때, getBean() 메서드를 통해 찾을수있다고 이해했는데요.

메서드를 호출할때 getBean(이름, 타입) 의 형식으로 사용한다고 되어있는데

1. 여기서 타입은 어떤 타입을 파라미터로 넣어줘야하는건가요? 예를들면 MemberService memberService = applicationContext.getBean("memberService", MemberService.class); 로 사용할수도있고, MemberServiceImpl memberService = applicationContext.getBean("memberService", MemberServiceImpl.class); 로 사용할수도있는데,

어떤 타입을 파라미터로 넣어줘야하는건지 궁금합니다. 스프링빈의 타입인 객체타입(MemberServiceImpl)을 넣어줄수도있고, AppConfig 클래스에있는 memberService메서드의 리턴타입(MemberService) 을 넣어줄수도있는건가요? 일반메소드의 리턴타입처럼 getBean()을 통해서 얻은 객체를 어떤타입으로 받고자한다를 클래스타입으로 적어줘야하는건가요?

 

2. 그리고 타입을 파라미터로 넣어줄때 .class를 쓰는 이유가 궁급합니다. 예를들면 MemberService의 경우에는 인터페이스라서 MemberService.interface형식으로 넣어줘야할거같은데 .class를 붙여서 넣어주는 이유가 궁급합니다.

 

3. 1,2번의 질문들을 생각하면서 정리해봤는데, 타입부분에서 파라미터로 넘겨준 MemberService.class는 클래스타입=메서드의 리턴타입 = 역할타입 = 인터페이스타입 이고,

MemberServiceImpl.class는 구체타입=객체타입=스프링빈타입이다. 이렇게 정리해봤는데 맞는건가요?

 

구글링도해보고, 게시판에 비슷한 글이 있나 찾아보기도 했는데 원하는 답변이 없어서 질문드립니다..

 

답변 1

1

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

안녕하세요. gomdole03님

  1. 이것은 선택인데요. 부모인 인터페이스(MemberService)를 넣어주어도 되고, 구현체(MemberServiceImpl)을 넣어주어도 됩니다. 그런데 다형성을 잘 활용하려면 부모인 인터페이스를 넣어주는 것이 더 좋겠지요?

  2. 자바 언어에서는 인터페이스도 빌드가 되면 .class가 됩니다. 따라서 둘을 구분하지는 않습니다. .class로 쓰시면 됩니다.

  3. 생각하신 내용으로 이해해도 크게 문제 없다 생각합니다.

감사합니다.

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기