@Component 붙은것들 쫘아아악 빈으로 스프링 컨테이너에 등록하고? 그다음 빈들의 의존관계를 자동으로 주입해주는

@AutoWired를 써먹는 방법!!에 대하여..!!

  1. 생성자 주입
    1. 수정자(setter)없이 생성자 호출 시점에 딱 1번만 호출 되는 것이 보장.
    2. 그래서 “불변, 필수” 의존관계에 사용.
    3. 그래서 변경을 막고 필수를 생성자 주입으로 표시하자!
    4. 근데!? 생성자가 딱 한개만 있으면 @Autowired 안붙혀도 스프링이 이 생성자를 컴포넌트에 주입시켜야 겠다고 알아먹음.
    5. 스프링이 생성자가 여러 개 있으면, 어떤 생성자를 써야 하는지 선택 기준이 필요하다.
    6. @Autowired를 붙이면 → “이 생성자를 의존성 주입용으로 써라”라고 명시. 안 붙이면 → 어떤 생성자를 쓸지 모호해져서 에러가 날 수 있음.
  2. 수정자 주입(setter 주입)
    1. “선택, 변경” 가능성이 있는 의존관계에 사용.
    2. 기본 생성자만 있고 @Autowired가 setter에 붙어있으면 스프링은 의존관계 주입을 위해 setter를 자동 실행함! ( 둘 다 붙어있으면 생성자 주입 먼저 실행되고 setter로 덮어씌어짐)
    3. 그래서 setter 의존관계 주입을 선택적으로 하려면 @Autowired(required = false) 로 설정하자!
  3. 필드 주입
    1. @Autowired private MemberRepository memberRepository; 처럼 필드에서 주입..
    2. 코드도 간결해서 유혹적이지만~ 외부에서 변경이 불가능해서 굉장히 불편함! 다른 객체로 실험해보고 싶거나 외부에서 다른 객체 넣어보며 유연하게 테스트 하고 싶어도 불가능함!
    3. 테스트 클래스내에서 급하게 의존성 주입해서 테스트 해보고싶을때나 써라잉
  4. 일반 메서드 주입
    1. Component 붙혀진 빈 클래스에서 @Autowired붙힌 inIt()같은 매서드
    2. 일반적으로 사용 X

옵션처리

주입할 스프링 빈이 없어도 동작해야 할 때가 있다.

@Autowired 만 사용하면 ‘requiered’의 기본옵션이 ‘true’라

오류가 발생한다.

그래서 옵션으로 처리하는 방법 3가지 존재

  1. @Autowired(requiered = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 X
  2. ‘org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
  3. ‘Optional<>’ : 자동 주입할 대상이 없으면 ‘Optional.empty’ 가 입력된다.