반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 데이터분석
- 데이터구조
- 파이썬
- Yes
- 네트워크보안
- 디자인패턴
- 프로그래밍언어
- 알고리즘
- 웹개발
- 자료구조
- 컴퓨터과학
- 인공지능
- 네트워크
- 컴퓨터공학
- 데이터베이스
- 사이버보안
- 컴퓨터비전
- 자바스크립트
- I'm Sorry
- springboot
- 빅데이터
- 데이터과학
- 머신러닝
- 소프트웨어
- 소프트웨어공학
- 프로그래밍
- 딥러닝
- 클라우드컴퓨팅
- 버전관리
- 보안
Archives
- Today
- Total
스택큐힙리스트
DIP: 추상화로 의존을 뒤집자! 본문
반응형
“고수준 모듈이 저수준 모듈에 끌려다니지 않게 해라.”
― 의존 역전 원칙(Dependency Inversion Principle)
SOLID의 마지막 퍼즐, DIP는 “설계 방향을 아래에서 위로 뒤집는” 순간 코드를 한층 유연하게 만듭니다. 국내 인기 블로그에서도 스프링·안드로이드 예제로 꾸준히 조회 수를 올리는 이유가 바로 여기에 있죠.
1. DIP란 무엇인가?
- 정의:
- 고수준 모듈(비즈니스 규칙)은 저수준 모듈(구현 세부)과 직접 의존하지 않는다.
- 양쪽 모두 추상화(인터페이스·추상 클래스) 에 의존해야 한다.
- 추상화는 구체화에 의존해서는 안 된다.
- 한마디 요약: “구체가 아니라 계약에 기대라.”
2. DIP가 깨질 때 벌어지는 일
- 비즈니스 로직 락인: 구현 세부 변경이 배포 리스크로 직격탄.
- 테스트 지옥: 실 컨크리트 객체에 의존 → Mock 주입 불가.
- 레이어 꼬임: 서비스 계층이 DB·네트워크 코드와 얽히며 스파게티화.
3. Kotlin 예제로 보는 Before ↔ After
❌ Before — 구체 클래스 직접 의존
class EmailSender {
fun send(msg: String) = println("Email: $msg")
}
class AlarmService {
private val sender = EmailSender() // 저수준 구현에 직접 의존
fun alert() = sender.send("Warning!")
}
Email 대신 SMS가 필요해지면 AlarmService를 수정해야 합니다.
✅ After — 추상화로 뒤집기
interface MessageSender { fun send(msg: String) }
class EmailSender : MessageSender {
override fun send(msg: String) = println("Email: $msg")
}
class SmsSender : MessageSender {
override fun send(msg: String) = println("SMS: $msg")
}
class AlarmService(private val sender: MessageSender) { // 추상화에 의존
fun alert() = sender.send("Warning!")
}
이제 새 채널 = 새 클래스 추가로 끝! AlarmService 코드는 손대지 않습니다. blog.ramoo.net
4. 실무 적용 4-Step
- 변화 축 파악: 로그, 알림, 결제처럼 자주 바뀌는 기능을 표시.
- 역방향 의존성 주입: 스프링 @Configuration·Koin 모듈로 인터페이스 구현체를 주입.
- 계약 테스트: 상위 모듈용 Contract Test로 추상화 규약을 고정.
- 정적 분석 설정: SonarQube “High Coupling” 룰과 DI 컨테이너 의존성 그래프를 주기적으로 확인.
5. 오늘 바로 실행해 볼 것
- 서비스 클래스에서 new 키워드로 직접 생성하는 부분 찾기 → 인터페이스로 추상화.
- DI 설정 파일에 새 구현체를 등록해 주입 교체가 정말 되는지 테스트.
- PR 리뷰 체크리스트에 “추상화에 의존하는가?” 항목 추가.
반응형
'개발' 카테고리의 다른 글
친구 추천 서비스, 왜 무너졌을까? SRP 위반 리팩터링 실전 해부 (0) | 2025.07.13 |
---|---|
SRP 리팩터링 체크리스트: 코드 냄새 없애는 7단계 (0) | 2025.07.13 |
인터페이스는 “딱 쓰는 만큼만!” ― ISP(인터페이스 분리 원칙) 완벽 가이드 (0) | 2025.07.13 |
“바꿔 끼워도 그대로 동작” ― LSP(리스코프 치환 원칙) 핵심 가이드 (0) | 2025.07.13 |
확장에 강한 코드: OCP(개방·폐쇄 원칙) 한눈에 마스터 (0) | 2025.07.13 |
Comments