[13강]
스프링 빈과 의존관계
스프링 빈을 등록하고, 의존관계 설정하기
MemberController를 만들어보자.
이렇게 작성해두면 기능은 없으나 스프링이 처음 실행될 때 스프링 컨테이너라는 통이 생기는데
이 통에 @Controller 어노테이션이 붙으면 MemberController라는 객체를 만들어서
스프링이 컨테이너에 넣어두고 관리한다.
-> 스프링 빈이 관리된다.
이제 이 안에서 service 객체를 만들 것인데
이런 식으로 new로 생성할 수도 있겠지만 스프링이 관리하게 되면
다 스프링 컨테이너에 등록을 하고 스프링 컨테이너에서 받아서 쓰도록한다.
그러면 딱 하나만 등록되어 그걸 사용하면 된다.
MemberController는 스프링 컨테이너가 뜰 때 생성되는데 그 때 생성자를 호출한다.
그런데 생성자에 @Autowired가 붙어있으면 스프링 컨테이너에 있는 memberService를 연결시켜준다.
여기까지하고 실행시켜보면 오류가 발생한다.
memberService를 못 찾아서 생긴 오류이다.
@Autowired라고 하면 스프링 컨테이너에서 memberService를 가져오는데 현재 memberService가 빈으로 등록되어 있지 않다.
현재 서비스는 그저 자바 코드이므로 스프링에서 MemberService 코드를 알 수 없다.
그러면 @Service를 추가하면 된다.
그러면 스프링 컨테이너가 생성될 때 @Service를 읽고 MemberService를 등록한다.
MemoryMemberRepository도 등록해준다.
현재 시도하려는 그림
controller, service, repository를 연결하려면 @Autowired를 쓰면 된다.
생성자에 쓰면 컨트롤러가 생성될 때 스프링 빈에 등록되어 있는 MemberService 객체를 가져다 넣어준다
-> Dependencies Injection
실행시키면 잘 돌아간다.
스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
우리가 사용한 @Controller, @Service, @Repository -> 컴포넌트 스캔
@Autowired -> 자동의존관계
해당 어노테이션을 ctrl로 타고 들어가보면 @Component를 확인할 수 있다.
스프링이 올라올 때 @Component 어노테이션이 있으면 스프링이 객체로 만들어서 스프링 컨테이너에 빈으로 등록해둔다.
그렇다면 어디에 @Component가 있더라도 다 등록되는 것일까?
이 클래스를 실행시키는데 위에 보면 hello.hellospring2라는 패키지 안에 있다.
그러면 스프링이 이 패키지의 하위 패키지들을 자동으로 뒤져서 @Component 어노테이션이 있다면 등록하는 것이고
만약 이와 동급이거나 그 이상의 패키지에 @Component 어노테이션이 있다면 등록하지 않는다.