@Component 붙은것들 쫘아아악 빈으로 스프링 컨테이너에 등록하고? 그다음 빈들의 의존관계를 자동으로 주입해주는
@AutoWired를 써먹는 방법!!에 대하여..!!
- 생성자 주입
- 수정자(setter)없이 생성자 호출 시점에 딱 1번만 호출 되는 것이 보장.
- 그래서 “불변, 필수” 의존관계에 사용.
- 그래서 변경을 막고 필수를 생성자 주입으로 표시하자!
- 근데!? 생성자가 딱 한개만 있으면 @Autowired 안붙혀도 스프링이 이 생성자를 컴포넌트에 주입시켜야 겠다고 알아먹음.
- 스프링이 생성자가 여러 개 있으면, 어떤 생성자를 써야 하는지 선택 기준이 필요하다.
- @Autowired를 붙이면 → “이 생성자를 의존성 주입용으로 써라”라고 명시. 안 붙이면 → 어떤 생성자를 쓸지 모호해져서 에러가 날 수 있음.
 
- 수정자 주입(setter 주입)
- “선택, 변경” 가능성이 있는 의존관계에 사용.
- 기본 생성자만 있고 @Autowired가 setter에 붙어있으면 스프링은 의존관계 주입을 위해 setter를 자동 실행함! ( 둘 다 붙어있으면 생성자 주입 먼저 실행되고 setter로 덮어씌어짐)
- 그래서 setter 의존관계 주입을 선택적으로 하려면 @Autowired(required = false) 로 설정하자!
 
- 필드 주입
- @Autowired private MemberRepository memberRepository; 처럼 필드에서 주입..
- 코드도 간결해서 유혹적이지만~ 외부에서 변경이 불가능해서 굉장히 불편함! 다른 객체로 실험해보고 싶거나 외부에서 다른 객체 넣어보며 유연하게 테스트 하고 싶어도 불가능함!
- 테스트 클래스내에서 급하게 의존성 주입해서 테스트 해보고싶을때나 써라잉
 
- 일반 메서드 주입
- Component 붙혀진 빈 클래스에서 @Autowired붙힌 inIt()같은 매서드
- 일반적으로 사용 X
 
옵션처리
주입할 스프링 빈이 없어도 동작해야 할 때가 있다.
@Autowired 만 사용하면 ‘requiered’의 기본옵션이 ‘true’라
오류가 발생한다.
그래서 옵션으로 처리하는 방법 3가지 존재
- @Autowired(requiered = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 X
- ‘org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
- ‘Optional<>’ :  자동 주입할 대상이 없으면 ‘Optional.empty’ 가 입력된다.