스프링 빈과 의존관계 - 컴포넌트 스캔과 자동 의존관계 설정

2022. 7. 30. 15:362022/Spring

화면에 붙이기 위해서는 Controller와 View Templates가 필요하다.

그러기 위해 MemberController가 필요한데, 이는 MemberService를 통해 회원가입하고, 데이터를 조회할 수 있어야한다.

이를 MemberController가 MemberService에 의존한다고 한다.

 

MemberController

MemberService는 스프링 컨테이너에 딱 한번 등록하고 공용으로 사용하는 것이 좋다.

new로 생성하는 경우, 다양한 Controller에서도 호출이 가능해진다.

 

private final MemberService memberService;

 

MemberController를 생성하면 그 아래 생성자를 자동으로 호출하게 되는데, @Autowired가 있으면 컨테이너에 등록된 스프링 빈 memberService 객체를 넣어주어 MemberService.java에 연결시켜준다.

 = Dependency Injection(DI)

@Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

 

그런데 이미지와 같이 memberService를 보면 빨간불로 경고가 뜬다. 

MemberController의 스프링이 가지고 있는 어노테이션(@) 아래의 memberService가 연결할 MemberService가 없다는 뜻이다. 이는 MemberService.java는 순수 자바 소스로 스프링이 이를 알 수 있는 방법이 없기 때문이다.

 

MemberController는 스프링이 제공하는 컨트롤러로, 스프링 빈으로 자동 등록

즉, @Service라는 어노테이션으로 스프링이 식별가능하도록 해주어야만 한다.

repository도 마찬가지로 @Repository를 추가해주어서 스프링이 식별 가능하도록 해주어야만 한다.

Controller를 통해 외부 요청을 받고,

Service를 통해 비즈니스 로직을 타고,

Repostiroy를 통해 데이터를 저장하는

정형화된 패턴

 

 

* 참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤(하나만 등록해서 공유)으로 등록한다. 
즉, 같은 스프링 빈이면 모두 같은 인스턴스이다. 

Ex ) orderService가 하나 추가가 되어 @Autowired로 memoryMemberRepository에 memberRepository 요청하면 memberService와 동일한 인스턴스를 제공한다. 

 

 

- 정리 -

스프링 빈을 등록하는 2가지 방법
  1. 컴포넌트 스캔과 자동 의존관계 설정 
    • 컴포넌트 스캔 : @Component가 있으면 스프링 빈으로 자동 등록
      • @Controller, @Service, @Repository가 스프링 빈으로 자동등록 된 이유도 컴포넌트 스캔 때문이다. : 각각@Component를 포함
      • 스프링이 올라올 때 Component 관련 어노테이션이 있으면, 각자 객체를 하나씩 만들어서 컨테이너에 등록하게 된다.
    • 자동 의존관계 설정 : @Autowired
      • 생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 이때 생성자가 1개인 경우에는 @Autowored를 생략할 수 있다.
  2. 자바 코드로 직접 스프링 빈 등록

 

스프링이 식별 가능한 범위

hello.hellospring 패키지 아래에 @SpringBootApplication이 실행되는 클래스 하위 패키지들은 모두 스프링 빈으로 등록 가능한 범위에 속한다.