객체지향 설계의 핵심 원칙인 SOLID를 자바 코드로 구현하며, 변화에 유연하게 대응할 수 있는 아키텍처 설계 방법을 분석한다.
DIP(의존 역전 원칙)와 OCP(개방-폐쇄 원칙)
구체적인 클래스가 아닌 인터페이스에 의존하게 함으로써, 기존 코드를 수정하지 않고도 기능을 확장할 수 있는 구조를 설계한다.
// 1. 추상화된 인터페이스 정의
interface PaymentProcessor {
void process(int amount);
}
// 2. 구체적인 구현체들
class CreditCardProcessor implements PaymentProcessor {
public void process(int amount) {
System.out.println("Processing credit card payment: " + amount);
}
}
class KakaoPayProcessor implements PaymentProcessor {
public void process(int amount) {
System.out.println("Processing KakaoPay payment: " + amount);
}
}
// 3. 인터페이스에 의존하는 서비스 클래스 (DIP 준수)
class OrderService {
private final PaymentProcessor paymentProcessor;
// 생성자를 통한 의존성 주입 (DI)
public OrderService(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
public void completeOrder(int amount) {
paymentProcessor.process(amount);
}
}
SOLID 원칙 요약
| 원칙 | 설명 | 적용 효과 |
| :— | :— | :— |
| SRP | 단일 책임 원칙 | 클래스 변경 이유를 하나로 제한하여 응집도 향상 |
| OCP | 개방-폐쇄 원칙 | 확장은 열려 있고 수정은 닫힌 구조로 유지보수성 확보 |
| LSP | 리스코프 치환 원칙 | 자식 클래스는 언제나 부모 클래스를 대체 가능해야 함 |
| ISP | 인터페이스 분리 원칙 | 클라이언트는 사용하지 않는 메서드에 의존하지 않아야 함 |
| DIP | 의존 역전 원칙 | 상위 모듈은 하위 모듈의 구현이 아닌 추상화에 의존 |
설계의 실제 적용
좋은 설계는 초기 비용이 발생하지만, 요구사항이 변경될 때 그 진가를 발휘한다.
예를 들어 새로운 결제 수단이 추가되어도 OrderService의 코드는 단 한 줄도 수정할 필요가 없다.
P.S
객체지향 설계는 객체 간의 결합도를 낮추고 응집도를 높이는 과정이다.
SOLID 원칙을 기반으로 인터페이스를 적극 활용하면, 거대한 시스템에서도 변경의 파급 효과를 최소화할 수 있는 것 같다.