강의

멘토링

커뮤니티

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

G General님의 프로필 이미지
G General

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Catalogs Microservice - 기능 구현 ②

@Service 관련 질문 드립니다

작성

·

192

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
import com.example.catalogservice.service.CatalogService;
....
public class
CatalogController {
Environment env;
CatalogService catalogService;
...

CatalogController는 생성자로 의존성을 주입받습니다(단, 여기서 import한 CatalogService는 impl이 아닌 인터페이스 자체입니다). 여기서 CatalogService는 @Component 같이 스프링에 알리는 객체로 설정하지 않은 인터페이스 입니다.

@Service
public class CatalogServiceImpl implements CatalogService{

한편 Impl에 @Service 어노테이션이 붙어있고, 또 implements로 CatalogService를 받아오기 때문에, 스프링에서는 CatalogServiceImpl을 알아서 CatalogService로 인식해서 넣어주는건가요? 

그냥 단순하게 생각하면, 컨트롤러에서 CatalogServiceImpl 객체가 주입되어야 된다고 생각되는데(Service 붙은 Bean이 CatalogServiceImpl이기때문에), 스프링에서 어느정도 선까지 알아서 해주는지 감이 안 잡히네요ㅠ

스프링이 서비스로 인식하는 대상은 반드시 Bean객체 어노테이션(@Service, @Component 등)이 붙은 클래스에 의해 상속되는 인터페이스여야 하는건가요?

기존에 다른 언어로 개발하다가 마땅한 마이크로서비스 강의가 없어서 듣고 있는데 스프링 기반 지식이 조금 딸려서 질문 드립니다ㅠ(앞선 로드맵으로 스프링이 어떻게 돌아가는지 대강만 알고있어요ㅠ)

답변 1

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

자바에서 뿐만 아니라 객체지향 언어에서의 상속은 (interface, class 상속 모두) A is B라고 생각하시면 됩니다. 즉, public class A implements B 라고 가정했을 때, A is B입니다. 위와 같은 경우라면

CatalogServiceImple is Catalog Service

가 됩니다. 따라서 Spring Boot Application 내에서는 CatalogServiceImple이 CatalogService이라고 여겨지고 사용됩니다. 

Spring Boot는 처음 기동 시 선언 된 Bean을 Context에 등록하게 되는 데, 빈을 등록할 때, 고유한 이름을 지정하거나 원하는 타입에 맞는 형식으로 등록시킬 수 있습니다. 그러나, 이러한 것들을 제외하고 등록하게 되면, 같은 type을 가진 빈들끼지 주입을 시켜주게 됩니다. 이때 사용되는 것이 @Autowired 입니다. 따라서 위와 같은 예제에서는 Spring Boot가 기동 시 CatalogServiceImple을 빈으로 등록한 상태이고, Contoller도 역시 빈으로 등록하려고 할 때, 생성자에서 주입하고 있는 CatalogService은 등록된 빈 들중에서 같은 타입을 찾아서 매칭하게 됩니다. 만약 빈을 등록할 때, bean id를 지정했다면, 주입 시 @Qualifier와 같은 주입 방법을 사용할 수도 있습니다. 

감사합니다. 

G General님의 프로필 이미지
G General
질문자

기존에는 @Service나 @Component로 등록된 것들만 사용할 수 있다고 생각했었는데, Init 과정에서 등록되지 않은 UserService라도  일단 등록된 Bean들을 매칭해서 true가 나오기만 하면 쓸 수 있다는 거네요. 감사합니다!

G General님의 프로필 이미지
G General

작성한 질문수

질문하기