1. AutoWired
1-1) AutoWired
필요한 의존 객체의 '타입'에 해당하는 빈을 찾아 주입함.
Required : 기본값은 true(따라서 못 찾으면 애플리케이션 구동 실패)
1-2) 사용할 수 있는 위치
1-3) 경우의 수
1-4) 같은 타입의 빈이 여러 개일 때
2. AutoWired를 생성자 위치에서
2-1) 해당 빈이 없는 경우
2-1)-1. BookService
2-1)-2. BookRepository
→ Bean 주입을 위해 어노테이션을 추가하지 않은 경우
2-1)-3. Console
2-2) 해당 빈이 있는 경우
2-2)-1. BookRepository
→ @Repository 에노테이션을 해서 Bean을 추가한 경우
→ 위의 경우와 다른 것은 해당 타입의 Bean을 추가하지 않아 오류가 난 거임.
2-2)-2. Console
3. AutoWired를 Setter 위치에서
3-1) 빈 주입에 실패한 이유
3-1)-1. BookService
→ Setter 주입이지만 실패했음. BookSevice라는 인터페이스 자체를 만들 수 있는데,
→ @AutoWired라는 어노테이션이 있기 때문에 이 의존성을 주입하려고 시도함.
→ AutoWired를 하라고 했기 때문에 그 과정을 실패하는 거임.
3-1)-2. Console
3-2) @Autowired를 Optional로 할 경우
3-2)-1. BookService
→ 의존성 주입이 안 된 상태에서 빈으로만 등록된 상태임.
3-2)-2. Console
4. AutoWired를 필드 위치에서
4-1) BookService
→ 의존성 주입이 안 된 상태에서 빈으로만 등록된 상태임.
4-2) 해당 빈의 타입이 여러 개인 경우
4-2)-1. interface로 설정한 BookRepository
BookRepository
MyBookRepository
SuhwanRepository
4-2)-2. Console
→ 여기 둘 중에 무엇을 원하는지 Spring은 알 수가 없기 때문에 주입을 할 수 없음.
4-2)-3. 둘 중 주로 사용하고 싶은 Repository에 @Primary 붙여주기
SuhwanBookRepository
Runner를 만들어서 어떤 Repository가 빈 주입 됐는지
BookService
4-2)-4. @PostConstruct
@PostConstruct
→ Runner 대신 PostConstruct를 쓸 경우
Console
4-3) 해당 타입의 빈 모두 주입 받기
5. 예외적인 코드로 구성하는 경우