📌 Spring 위주로 작성됨
[!note]
객체가 필요로 하는 의존성을 외부에서 직접 주입받는 것을 DI 라고 한다프로그래밍에서 구성 요소간의 의존관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 패턴 중의 하나
[!note] 의존성이란?
의존성이라는 아주 멋들어지는 말을 써서 약간 헷갈릴 수 있는데,
A를 실행하기 위해 B를 호출하거나 기능을 빌려써야 한다. == A가 B에 의존한다.
그냥 필요하다는 말임
[!note]
DIP: 의존성 역전 원칙의 핵심
1. 전통적인 의존 관계의 문제점
- 상위 모듈이 하위 모듈의 구체적인 구현에 직접 의존함. [cite: 2026-01-20]
- 하위 모듈 변경 시 상위 모듈까지 수정해야 하는 강한 결합이 발생함. [cite: 2026-01-20]
2. 역전(Inversion)의 메커니즘
- 상위 모듈과 하위 모듈 사이에 추상화(인터페이스)를 둠. [cite: 2026-01-20]
- 하위 모듈이 상위 모듈이 정의한 인터페이스에 의존하게 함으로써 의존 방향을 역전시킴. [cite: 2026-01-20]
3. 설계의 이점
- 상위 모듈은 상세 구현의 변화로부터 독립됨. [cite: 2026-01-20]
- 코드의 재사용성이 높아지고, 테스트 시 가짜 객체(Mock)를 주입하기 쉬워짐. [cite: 2026-01-20]
4. 요약
DIP는 상위 모듈이 하위 모듈을 무시하는 것이 아니라, 둘 다 추상화에 의존하게 하여 변화에 유연하게 대처하는 원칙임. [cite: 2026-01-20]
📌 @Autowired : 이 어노테이션을 달고 있다는 말은 "나 객체 필요해요" 하고 손들고 있는거랑 똑같음
@Component
public class AppStartupRunner implements ApplicationRunner {
private Greeting greeting;
@Autowired
public ApplicationRunner(Greeting greeting) {
this.greeting = greeting;
}
@Override
public void run(ApplicationArguments args) {
greeting.sayHello();
}
}
lombok이랑 연계해서 많이 사용됨@Autowired가 있다고 간주함@Component
public class AppStartupRunner implements ApplicationRunner {
private Greeting greeting;
@Autowired
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
@Override
public void run(ApplicationArguments args) {
greeting.sayHello();
}
}
@Component
public class AppStartupRunner implements ApplicationRunner {
@Autowired
private Greeting greeting;
@Override
public void run(ApplicationArguments args) {
greeting.sayHello();
}
}
@Configuration
public class GreetingConfig {
@Bean
American innerGreeting() {
return new American();
}
// bean 으로 등록된 American 을 파라미터로 넣어준다
@Bean
Greeting englishGreeting(American american) {
return new EnglishGreeting(american);
}
}
@Primary, @Qualifier| 구분 | @Primary | @Qualifier |
|---|---|---|
| 성격 | 기본값 설정 (우선순위) | 특정 빈 지목 (정밀 타격) |
| 장점 | 코드가 간결함 (주입 시 추가 어노테이션 불필요) | 의도가 명확함 (어떤 빈이 주입되는지 바로 알 수 있음) |
| 우선순위 | 낮음 | 높음 (@Qualifier가 이김) |
구현체에다가 이거 붙여주면 된다!
다형성을 활용한 설계에서 발생하는 주입 모호성을 해결하는 도구이며, 유지보수 편의를 위해 @Primary를 기본으로 하되 특수한 상황에 @Qualifier를 병용함.
생성자 주입은 객체의 안전성과 테스트 효율성을 극대화하며, 롬복(@RequiredArgsConstructor)과 결합 시 코드 가독성까지 챙길 수 있는 표준 방식임.