맨 처음에 스프링이 뜰 때 스프링컨테이너가 뜨는데 @Controller 가 있으면 스프링컨테이너에 객체를 생성해서 넣어둔다.
= "스프링 컨테이너에서 스프링 빈이 관리된다" 고 표현
# 잘못쓴 경우 : 매번 객체 생성

MemberService 객체 하나만 만들어놓고 공용으로 쓰자!

이렇게 바꾸자! -> MemberController는 IoC 했고 @Autowired를 통해 memberService에 DI 하였다.
그런데 왜 빨간불????
MemberService 클래스는 스프링에서 관리하지 않는 순수 자바클래스이기 때문이다. MemberService 도 IoC 해줘야 스프링에서 인식할 수 있다. -> @Service, 같은 이유로 MemoryMemberRepository 는 @Repository 붙혀주기.
-> 3클래스 모두 스프링에 의해 관리되고 있다. (IoC 된 상태이다.)
생성자에 @Autowired 하면 멤버컨트롤러가 생성이 될 때 스프링 빈에 등록되어있는 멤버서비스 객체를 가져다가 넣어줌
-> DI
= 생성자에 @Autowired 를 사용하면 객체 생성시점에 스프링컨테이너에서 해당스프링 빈을 찾아서
주입한다. 생성자가 1개만있으면 @Autowired 는 생략할수 있다.
( 아 너는 인자에 있는 객체가 필요하구나~ -> 멤버 서비스 객체 가져와서 넣어줌 )

스프링은스프링 컨테이너에스프링 빈을등록할때, 기본으로싱글톤으로 등록한다(유일하게하나만
등록해서 공유한다) 따라서 같은 스프링빈이면 모두 같은 인스턴스다.
# 스프링빈을 등록하는 2가지 방법
1) 컴포넌트 스캔과자동의존관계설정 -> @Component
@Component 를포함하는다음 애노테이션도스프링 빈으로 자동등록된다.
@Controller
@Service
@Repository
- 스캔 범위

실행되는 애플리케이션 의 패키지 범위 내 모든 파일을 컴포넌트스캔 ( @Component있으면 등록 )

2) 자바코드로직접 스프링빈등록하기

1. 스프링이 올라올 때 @Bean을 보고 멤버 서비스 멤버 리포지토리를 스프링 컨테이너에 올려준다. -> 멤버 서비스생성자에 멤버리포지토리(스프링컨테이너에등록된) 를 넣어준다.
2. Controller에서는 @Controller로 스프링컨테이너에 등록 후 @Autowired로 DI 해준다. 이때 DI되는 멤버서비스는 SpringConfig에서 @Bean으로 등록된 memberService이다.

이로인해

이 그림이 완성된다.
- 두 방법 모두 사용한다.
2번방법의 장점 : 나중에 new MemoryMemberRepository를 new DbMemberRepository로만 바꾸면 됨.
-> 설정파일 직접 작성했을 때의 장점
# DI 하는 3가지 방법
1. 생성자 주입
2. 필드주입
3. setter 주입
1. 생성자 주입
- 생성자에 @Autowired 또는 @Bean을 이용한 아래와 같은 방법

2. 필드 주입

memberService에 바로 주입
( 안좋은 방법 인텔리제이도 생성자주입으로 바꾸라고 바로 추천해준다. )

3. setter 주입

- setter는 public 이므로 중간에 바뀌면 문제가 생긴다.
최고는 생성자 주입!!!!!!!!!! ( 조립시점에 한 번 생성 해두고 끝을 내야함 ) setter처럼 매번 바꿀 수 있으면 안좋음)
# 참고
- DI에는필드 주입, setter 주입, 생성자 주입이렇게 3가지방법이 있다. 의존관계가실행중에
동적으로 변하는경우는거의 없으므로생성자 주입을권장한다.
출처 : 인프런 김영한님의 강의를 수강 후 정리한 내용입니다.
꾸준히 다시보자.
1. 220712
2. 220731
'Java, Spring > 스프링 입문' 카테고리의 다른 글
통합테스트 (0) | 2022.07.10 |
---|---|
회원 웹 기능 - 홈 화면 추가, 등록 (0) | 2022.07.10 |
회원 서비스 테스트 (0) | 2022.07.10 |
회원 서비스개발 (0) | 2022.07.05 |
회원 리포지토리 테스트 케이스 작성 (0) | 2022.07.04 |