SOLID에서 OCP, 즉 개방-폐쇄 원칙은 처음 보면 꽤 추상적으로 느껴집니다. “확장에는 열려 있고 수정에는 닫혀 있어야 한다”는 문장이 멋있어 보이지만, 실제 코드에서 이게 무슨 뜻인지 감이 잘 안 올 수 있습니다.
이 글에서는 아래 내용을 정리합니다.
- OCP가 무엇인지
- 왜 중요한지
- 실무에서는 어떤 식으로 이해하면 좋은지
핵심은 OCP는 기존 코드를 절대 건드리지 말라는 뜻이 아니라, 반복되는 요구사항 변화에 더 안정적으로 대응할 수 있는 확장 구조를 고민하자는 원칙이라는 점입니다.
OCP란 무엇인가
OCP는 보통:
- 확장에는 열려 있고
- 수정에는 닫혀 있어야 한다
고 설명됩니다.
즉, 새로운 요구가 생겼을 때 기존 핵심 코드를 계속 뜯어고치기보다, 새로운 구현을 추가하는 쪽으로 대응할 수 있으면 좋다는 의미입니다.
왜 중요한가
기존 코드의 중심부를 자꾸 수정하면:
- 기존 기능이 깨질 위험이 커지고
- 테스트 범위가 넓어지며
- 변경 비용이 누적됩니다
반대로 확장 포인트가 잘 잡혀 있으면 새로운 기능을 넣어도 기존 코드를 덜 흔들 수 있습니다.
입문자는 어떻게 이해하면 좋을까
너무 거창하게 보기보다:
- 매번 if/else를 늘려야 하는가
- 새로운 종류가 추가될 때 기존 코드 중심부를 계속 수정하는가
같은 질문으로 보면 훨씬 이해가 쉽습니다.
예를 들어 결제 방식이 늘어날 때마다 하나의 거대한 조건문만 계속 커진다면, OCP 관점에서 개선 여지가 있을 수 있습니다.
OCP는 “수정 금지”가 아니다
이 원칙을 오해하면 “기존 코드는 절대 건드리면 안 된다”처럼 들릴 수 있습니다. 하지만 실제로는 리팩터링도 하고 수정도 해야 합니다.
중요한 것은:
- 변화가 자주 생기는 부분에는 확장 가능한 구조를 두고
- 안정적인 핵심 코드는 덜 흔들리게 하자
는 방향입니다.
자주 하는 오해
1. 추상화만 많이 넣으면 OCP다
불필요한 추상화는 오히려 복잡도만 늘릴 수 있습니다.
2. 모든 코드를 확장 가능하게 만들어야 한다
변화 가능성이 낮은 코드까지 과하게 일반화할 필요는 없습니다.
3. OCP는 패턴을 많이 쓰라는 뜻이다
패턴 자체보다 변화 포인트를 어디에 둘지가 더 중요합니다.
FAQ
Q. OCP를 처음 적용할 때 무엇을 보면 좋을까
새 요구사항이 들어올 때마다 계속 수정되는 조건문이나 분기 구조를 먼저 보는 것이 좋습니다.
Q. 작은 프로젝트에도 필요할까
항상 거대한 추상화가 필요한 것은 아니지만, 반복되는 변경 지점은 미리 구조를 생각해볼 가치가 있습니다.
Q. OCP와 DIP는 같이 가는가
자주 같이 갑니다. 확장 포인트를 만들 때 추상화와 의존성 분리가 함께 필요해지는 경우가 많기 때문입니다.
Read Next
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.