도메인, 리포지토리, 서비스는 개발을 완료했고 이제 view와 연결을 위한 컨트롤러가 필요하다.
컨트롤러에서는 서비스의 기능이 필요하게 되는데 이 관계를 의존관계라고 한다.
회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비한다.
package hello.hellospring.controller;
import hello.hellospring.sevice.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
memberSerivce 생성 → 스프링 컨테이너에서 @Controller 확인 후 스프링 컨테이너에 등록하면서 생성자 호출 → 이 때 @Autowired 확인해서 memberController가 memberService를 필요로 한다는 사실을 확인한다. → 컨테이너에 있는 memberService를 넣어준다.
여기서 service와 repository 간에도 같은 과정 반복.
단지 memberRepository 가 아니라 구현체인 memoryMemberRepository가 대상이다.
위와 같은 코드를 실행하면 다음과 같은 에러를 확인할 수 있다.
Parameter 0 of constructor in hello.hellospring.controller.MemberController required a bean of type 'hello.hellospring.service.MemberService' that could not be found
…
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
이유는 memberService가 스프링 빈으로 등록되어 있지 않아 에러가 나오고 있는 것이다.
→ @Controller 어노테이션에 들어가보면 @Component를 확인할 수 있다.
하지만 아무 패키지의 파일에서 등록한다고 스프링 컨테이너에서 스캔 가능한 것은 아니다.
기본적으로 Application이 속한 패키지 하위 경로에서만 가능하다.
📌 참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다.(유일하게 하나만 등록해서 공유한다.) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.