회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비
지금까지 멤버 서비스랑 리포지토리를 만들었음. 맴버 객체도 만들고, 서비스를 통해서 멤버를 가입할 수 있고, 리포지토리에 저장이 되고, 리포지토리에서 꺼내올 수 있고. 이러한 로직들을 만들었음. 테스트도 만들고,,,
이번엔 화면에 뜨게 할거임. 회원가입하고 html로 붙여주고 뭐 그런것들
그러기 위해서는, 멤버 컨트롤러를 만들어야함. 컨트롤러가 멤버 서비스를 통해서 회원가입하고 조회할 수 있어야함. 이런 것들을 서로 의존관계가 있다고 함 (컨트롤러가 멤버서비스를 의존한다고 표현)
package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired // 멤버 컨트롤러가 생성이 될 때, 스프링 빈에 등록되어 있는 멤버 서비스 객체를 가져다가 넣어줌 --> DI
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
위의 코드처럼, @Controller 하면 스프링이 객체를 생성을 해서 스프링이 등록을 해줌. 스프링 컨테이너에서 스프링 빈이 관리가 된다고 표현함.
또한, 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.(스프링이 스프링 컨테이너에 있는 멤버 서비스를 가져다가 연결을 시켜줌. 멤버 리포지토리의 경우도 마찬가지임) 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다. 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다. 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다. DI(의존성 주입)
하지만 위의 코드를 실행하면 에러가 발생함.
에러 발생
Consider defining a bean of type 'hello.hellospring.service.MemberService' in
your configuration.
MemberService가 스프링 빈으로 등록되어 있지 않기 때문이다. MemberController는 스프링이 제공하는 컨트롤러여서 스프링 빈으로 자동 등록된다. (@Controller 가 있으면 자동 등록됨)