스프링 빈을 등록하고 의존관계 설정하기
- 이제 화면을 붙이려고 한다...!!!!!
- 그러려면 컨트롤러를 만들어서 템플릿을 붙여줘야겠죠
- 멤버 컨트롤러가 멤버 서비스를 통해서 회원가입하고 회원을 조회할 수 있어야 함.
=> 이것을 멤버 컨트롤러가 멤버 서비스를 의존한다고 표현한다.

(Controller 클래스가 텅 비어 있지만...) 일단 이렇게 만들어 두면 실행할 때 MemberController 객체를 만들고 그걸 스프링이 관리하게 된다.
-
컨테이너라는 큰 통에 객체가 들어간다!
-
들어가는 객체 (MemberController)를 bean이라고 한다.
-
스프링이 컨테이너에 등록한 것은 여러 개 만들 필요가 없다. 들고 있으면서 계속 쓸 수 있음.
-
Controller - Service - Repository: 되게 정형화된 패턴이에요
-
컨테이너에 등록된 객체를 통해서 뭔가 꺼내올 때 스프링에 등록되어 있지 않은 것은 건드릴 수 없음 (annotation이 없는 순수 자바 클래스 같은 것)

-
@AutoWired의 역할: 이걸 딱 쓰면 이 생성자의 parameter로 넣을 memberService를 새로 생성하는 게 아니라 스프링 컨테이너에 등록돼 있는 memberService를 들고 와서 넣어줌: 이것이 바로 Dependency injection


스프링 빈을 등록하는 2가지 방법
(1) 컴포넌트 스캔과 자동 의존관계 설정
- @Controller, @Repository 같은 annotation을 직접 작성하는 것 (지금까지 한 것)
- 왜 컴포넌트냐면... @Controller 같은 애들 까보면 안에 @Component가 들어 있음
- 실행할 때 컴포넌트 어노테이션이 있으면 스프링이 그런 어노테이션이 달린 애들을 다 객체화 해서 컨테이너에 넣어서 들고 있음
- @AutoWired로, 생성자의 parameter로 컨테이너에 등록돼 있는 빈을 자동으로 집어넣는 것

- 파일을 바꿔 끼거나 하고 싶을 때에는 파일들을 돌아다니면서 직접 수정해 줘야 한다.
(2) 자바 코드로 직접 스프링 빈 등록하기
- Config 파일을 만들고, @Configuration 어노테이션을 달아서 쓰는 방법.
@Configuration도 @Component annotation에 속한다.
- 구현 클래스를 변경할 때 Config 파일만 살짝 고쳐주면 되므로 추후 바꿔 끼워야 할 필요가 있을 때 주로 사용한다!
- 코드로 하지 않고 옛날엔 xml로도 했음
참고: 스프링은 스프링 컨테이너에 빈을 등록할 때 싱글톤 (유일하게 하나만 등록하고 공유하는 것!) 으로 등록한다. -> 같은 스프링 빈이면 같은 인스턴스다. 설정으로 바꿀 수 있지만 굳이 그렇게 잘 안 함!
참고2: @AutoWired는 스프링 빈으로 등록되어 있는 것들만 쓸 수 있다. (스프링이 관리하는 객체에서만 동작한다.) 스프링 빈으로 등록하지 않은 객체에서는 동작하지 않는다.
DI (Dependency Injection, 의존성 주입)
(1) 필드 주입

- 클래스의 필드에 직접 주입하는 방법.
- 스프링을 실행할 때만 주입할 수 있고 중간에 변경하거나... 할 수 있는 방법이 없음.
- 별로 권장되지 않는다. (고 하셨는데 제일 쉽고 간단해서 변경될 일이 아예 없는 것들은 이렇게도 쓴다고 하 네요 ...)
(2) setter 주입

- 단점: set method가 public이어야 함 (외부에서 집어넣어야 하니까)
- 근데 set은 한 번 하고 나면 수정할 일이 잘 없다. 그럼에도 불구하고 public으로 선언했기 때문에 외부에서 호출될 가능성이 있는 코드가 됨. 중간에 잘못 호출에서 바꾸면 문제가 생기겠죵
(3) 생성자 주입
- 의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으니 보통 생성자 주입을 권장함.

- 생성자를 통해서 memberService가 MemberController의 memberService가 됨.
- 가장 권장됨