DIP(Dependency Inversion Principle, 의존성 역전 원칙)은 SOLID 원칙의 다섯 번째 원칙으로,
“상위 모듈이 하위 모듈에 의존하지 않고, 둘 다 추상화(인터페이스)에 의존해야 한다”는 개념을 말한다.
즉, 의존 방향을 구체적인 클래스에서 추상적인 인터페이스로 ‘역전’시키는 것이 핵심이다.
class MySQLRepository {
public void save(String data) {
System.out.println("Save to MySQL: " + data);
}
}
class UserService {
private final MySQLRepository repository = new MySQLRepository(); // 직접 의존 ❌
public void register(String user) {
repository.save(user);
}
}
UserService(상위 모듈)가 MySQLRepository(하위 모듈)에 직접 의존.PostgreSQLRepository로 바꾸면 UserService 코드도 수정해야 함 → OCP, DIP 모두 위반.interface UserRepository {
void save(String data);
}
class MySQLRepository implements UserRepository {
public void save(String data) {
System.out.println("Save to MySQL: " + data);
}
}
class PostgreSQLRepository implements UserRepository {
public void save(String data) {
System.out.println("Save to PostgreSQL: " + data);
}
}
class UserService {
private final UserRepository repository; // 인터페이스에 의존 ✅
public UserService(UserRepository repository) {
this.repository = repository;
}
public void register(String user) {
repository.save(user);
}
}
UserService는 더 이상 구체적인 DB에 관심이 없고,UserRepository라는 추상화(인터페이스)에만 의존한다.| 구분 | DIP 미적용 | DIP 적용 |
|---|---|---|
| 의존 관계 | 구체 클래스에 의존 | 추상 인터페이스에 의존 |
| 변경 시 영향 | 상위 모듈 수정 필요 | 하위 모듈만 수정 |
| 확장성 | 낮음 | 높음 |
| 테스트 용이성 | 어려움 (실 DB 필요) | 쉬움 (Mock 구현 주입 가능) |
Spring Framework는 DIP를 실현하기 위한 대표적인 프레임워크다.
그 핵심이 바로 DI(Dependency Injection, 의존성 주입)이다.
@Service
public class UserService {
private final UserRepository userRepository;
// 생성자 주입으로 인터페이스를 받음
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
UserService는 UserRepository 인터페이스만 알고 있고,JpaRepository는 인터페이스(추상화)SimpleJpaRepository는 구현체(세부사항)JpaRepository에 의존 → DIP 준수public interface UserRepository extends JpaRepository<User, UUID> {
}
실제 구현체는 Spring Data JPA가 런타임에 주입
→ 개발자는 DB 구현체를 몰라도 비즈니스 로직 개발 가능.
| 항목 | 설명 |
|---|---|
| 이름 | DIP (Dependency Inversion Principle) |
| 핵심 문장 | “상위 모듈은 하위 모듈에 의존하지 않는다. 둘 다 추상화에 의존한다.” |
| 목적 | 유연하고 확장 가능한 구조, 테스트 용이성 |
| 실현 방법 | 인터페이스 사용 + DI(의존성 주입) |
| 관련 원칙 | OCP(개방-폐쇄 원칙)과 밀접하게 연관됨 |