
💡의존성 : 한 객체의 코드에서 다른객체를 생성하거나 다른 객체의 메서드를 호출할 때,
의존성이 발생한다고 함
💡의존성의 정도
- 높으면 강한 결합 (Tight) :
new연산자를 사용하여 객체를 생성할 때- 낮으면 느슨한 결합 (Loose) : 인터페이스와 같이 일반화 된 구성 요소에 의존하고 있을 때
👾 강한 결합

👾 느슨한 결합

💡의존성 주입은 자신이 사용할 객체에 대한 선택과 생성 제어권을 외부로 넘기고
자신은 수동적으로 주입받은 객체를 사용한다는 것
➡️ 즉, 스프링 컨테이너의 IoC는 주로 의존성 주입에 초점이 맞춰져 있다.
😁 생성자 주입
생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈을 주입함
@Component
public class AirpodsController {
private final AirpodsService airpodsService;
public AirpodsController(AirpodsService airpodsService) {
this.airpodsService = airpodsService;
}
}
@Autowired를 생략해도 자동 주입 됨final로 선언할 수 있음final로 선언된 레퍼런스 타입의 변수는 반드시 선언과 동시에 초기화가 이뤄져야함final로 선언된 변수는 객체가 불변하도록 할 수 있다는 장점, 코드의 신뢰성, 유지보수성, 가독성 향상 가능😁 수정자(setter) 주입
필드 값을 변경하는 수정자 메서드를 통해 의존 관계를 주입하는 방법
@Component
public class AirpodsController {
private AirpodsService airpodsService;
@Autowired
public void setAirpodsService(AirpodsService airpodsService) {
this.airpodsService = airpodsService;
}
}
@Autowired를 입력하지 않으면 실행 안됨💡Java에서 필드의 값을 직접 변경하지 않고 set, get메서드를 통해
값을 읽어오거나 수정하는 규칙 ➡️ (수정자 메서드 방식을 사용하는 방법)
😁 필드 주입
변수 선언부에 @Autowired를 붙여 주입하는 방법
@Component
public class AirpodsController {
@Autowired
private AirpodsService airpodsService;
}
final 키워드를 통한 선언 불가능, 객체가 변하기 쉬워짐1. 객체 불변성을 확보 할 수 있다. (final 키워드 사용 가능)
2. 애플리케이션 구동 시점에 순환 참조 에러 를 알려줌.
@Autowired는 모든 객체의 생성이 완료된 후에 의존 관계 주입이 처리되기에 호출이 되고 나서야 순환 이슈를 확인할 수 있다.