
지금까지 MemberService와 MemberRepository를 만들었다. MemberService를 통해 회원가입을 할 수 있고 회원 조회를 할 수 있었다. 이제 이 동작을 화면으로 보여 주고 싶은데 그러려면 먼저 view와 MemberController가 있어야 할 것이다.
MemberConroller는 MemberService를 통해 회원가입을 하고, 데이터를 조회한다. 이를 서로 의존관계에 있다고 한다. 스프링에서 이 의존관계를 어떻게 설정해주는지 알아보도록 하자.
먼저 MemberController를 다음과 같이 작성하자.
@Controller
public class MemberController {}
이렇게 작성하면 스프링 컨테이너가 @Controller애노테이션을 보고 MemberController 객체를 만들어 스프링이 관리하는 대상에 추가해준다.
스프링 컨테이너에서 스프링 빈이 관리된다!
MemberController는 MemberService객체를 사용해야 하는데 매번 new를 통해 사용하는 것보다는, 이미 컨테이너에 등록되어 있는 것을 가져다 쓰는 것이 더 좋다. 따라서
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
생성자를 통해 의존성을 주입해주는 방식으로 작성한다. @Autowired애노테이션은 컨테이너에 등록 돼 있는 memberService를 매개변수와 연결해주는 역할을 한다.
실행시
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.와 같은 오류가 뜬다면 MemberService 클래스에@Service애노테이션을 추가해준다.
@Service애노테이션이 있어야MemberService도 스프링 빈으로 인정받을 수 있다
Repository도 같은 이유로 @Repository애노테이션을 추가해준다.
그러면 이제 MemberService, MemberController, MemberRepository가 모두 스프링 빈으로 등록이 되었다.
이 스프링 빈끼리 연결을 해주려면 아까 언급한 @Autowired애노테이션을 사용해야 한다. MemberService에도 추가해주자. 완료되면 스프링 빈들의 관계가 다음 사진처럼 된다. (출처- 김영한님 강의자료)

방금한 방법처럼 애노테이션을 이용해 스프링 빈과 그 관계를 설정해주는 것이 컴포넌트 스캔과 자동 의존관계 설정 방법이다.
@Service, @Repository, @Controller는 내부에 모두 @Component를 포함하고 있는데 컴포넌트 스캔은 @Component가 있는 클래스를 스프링 빈으로 자동 등록하는 원리이기 때문에 @Service, @Repository, @Controller를 가지는 클래스도 스프링 빈으로 등록된다.
컨테이너에 스프링 빈이 등록될 때에는 하나의 인스턴스만 등록이 된다. (싱글톤)
스프링 빈을 등록하는 방법은 한 가지가 더 있는데, 자바 코드로 직접 스프링 빈을 등록하는 방법으로 다음 게시물에서 알아보도록 하겠다