"좋은 코드"와 "나쁜 코드"의 차이는 어디에 있을까요?
이 질문에 답해주는 것이 바로 **설계 원칙(Design Principles)**입니다. 특정 프로그래밍 언어나 프레임워크에 의존하지 않는, 보편적인 설계 지침을 배워봅시다.
같은 로직을 여러 곳에 작성하지 않는다.
# ❌ DRY 위반: 같은 계산이 2곳에 있음
def calculate_order_price_v1(items):
subtotal = sum(item["price"] * item["qty"] for item in items)
...
복잡한 해결책보다 단순한 것을 선택한다.
# ❌ KISS 위반: 이해하기 어려운 복잡한 코드
def process(x):
return list(filter(lambda y: y > 0, map(lambda y: y * 2, x)))
...
지금 필요하지 않은 기능은 미리 만들지 않는다.
# ❌ YAGNI 위반: 나중에 필요할지도 모르는 기능을 먼저 만듦
class User:
name: str
...
관심사를 분리한다 (Separation of Concerns, SoC).
# ❌ SoC 위반: 하나의 함수에 여러 관심사가 존재함
def process_order(order):
total = calculate_total(order["items"]) # 계산
...
하나의 클래스/함수는 하나의 책임만 가진다 (Single Responsibility Principle, SRP).
# ❌ SRP 위반: 사용자 관리와 비즈니스 로직이 혼재됨
class UserManager:
def create_user(self, name, email):
...
상위 모듈(비즈니스 로직)은 하위 모듈(외부 API 등)에 의존하지 않는다. 인터페이스를 사이에 둔다 (Dependency Inversion Principle, DIP).
# ❌ DIP 위반: 비즈니스 로직이 외부 서비스에 직접 의존함
class OrderService:
def confirm(self, order):
...
| 원칙 | 활용해야 할 경우 |
|---|
| DRY | 같은 코드를 2회 이상 작성하고 싶을 때 |
| ... | |
중요한 것은 기계적으로 적용하는 것이 아니라, 이해한 위에서 활용하는 것입니다. 경험이 쌓임에 따라 자연스럽게 이러한 원칙들이 의식하게 될 것입니다.
본 기사는 개인 Zenn에서도 공개하고 있습니다.