전에 만든 서비스, 리포지토리, 도메인 등을 화면에 붙이고 싶다!
=> 컨트롤러, View 등 필요
=> 그러기 위해서는 멤버 컨트롤러가 필요한데, 멤버 컨트롤러는 멤버 서비스와 멤버 리포지토리를 사용할 수 있어야 한다. = 의존 관계
controller 하위에 MemberController 클래스를 생성한다.
스프링 컨테이너가 스프링 빈을 관리하기 때문에 컨트롤러의 기능이 동작하는 것!
new 해서 쓰지 말고, 스프링으로부터 받아서 써야 한다!
@Autowired annotation을 넣고, 생성자를 만들어준다.
=> 스프링이 멤버 서비스를 스프링 컨테이너에 있는 멤버 서비스와 연결해 준다.
@Service annotation을 넣으면 스프링이 MemberService를 컨테이너에 등록해준다.
구현체에도 @Repository annotation을 달아 준다.
=> Controller, Service, Repository의 정형화된 패턴을 만든다.
=> 이렇게 해 놓으면 스프링이 뜰 때 Controller, Service, Repository를 다 가지고 올라온다.
Controller, Service, Repository 연결하기 위해서는 @Autowired를 쓰면 된다.
이를 사용하면 멤버 컨트롤러가 생성될 때, 스프링 빈에 등록되어 있는 멤버 서비스 객체를 넣어준다.
=> Dependency Injection
싱글톤: 같은 스프링 빈이면 같은 인스턴스를 넣어준다 -> 메모리 절약
MemberService에도 @Autowired 적어주면 스프링 컨테이너가 뜰 때 멤버 서비스를 컨테이너에 등록하고, 생성자를 호출한다.
이때 @Autowired를 보고 스프링 컨테이너에 있는 멤버 리포지토리를 넣어준다.
지금은 MemoryMemberRepository가 구현체로 있기 때문에 이를 서비스에 주입해준다.
=> Controller, Service, Repository가 연결된다.
=> 컴포넌트 스캔과 자동 의존 관계
** hello.hellospring 패키지를 포함한 하위 패키지들만을 대상으로 annotation을 보고 스프링이 가져 온다.