topic난이도 · 약 20

SOLID · DRY · YAGNI · KISS — 코드 품질 체크리스트

AI 코드 리뷰 시 들이댈 5가지 렌즈 — 추상화의 적정선이 보이기 시작한다.

#SOLID#DRY#YAGNI#KISS#SRP#DIP
왜 배우는가

Claude 코드는 "동작하긴 하는데 좀 이상한" 경우가 많다. 이 5개 원칙이 있으면 "무엇이 이상한지" 설명할 수 있다.

SOLID는 OOP 5원칙. 모두 외우기보다 S와 D만 기억해도 80% 효과. 나머지는 결국 같은 주제의 변주.

글자원칙한마디
SSingle Responsibility한 모듈은 한 가지 변경 이유
OOpen/Closed확장엔 열려, 수정엔 닫혀
LLiskov Substitution자식은 부모를 완전히 대체 가능
IInterface Segregation뚱뚱한 인터페이스 금지, 쪼갠다
DDependency Inversion구체가 아닌 추상에 의존
typescript
// ❌ SRP 위반 — 한 클래스가 너무 많은 일
class UserService {
  create(data) { /* 검증 + DB 저장 + 이메일 발송 + 로깅 */ }
}

// ✅ 책임 분리
class UserValidator   { validate(d) {...} }
class UserRepository  { save(u) {...} }
class EmailNotifier   { welcome(u) {...} }
class UserRegistrationUseCase {
  constructor(private v, private r, private n) {}
  async register(d) {
    this.v.validate(d);
    const u = await this.r.save(d);
    await this.n.welcome(u);
    return u;
  }
}

// ❌ DIP 위반 — 구체(SMTP)에 직접 의존
class UserService {
  constructor(private smtp: NodeMailer) {}   // 테스트 어려움
}

// ✅ 추상(인터페이스)에 의존
interface Notifier { welcome(u: User): Promise<void> }
class UserService {
  constructor(private n: Notifier) {}        // 테스트는 MockNotifier 주입
}

AI 코드 리뷰 시 "이 클래스가 변경 이유가 2개 이상인가?" 물어보면 SRP 위반이 보인다.

"DRY도 독이 될 수 있다" — Don't Repeat Yourself. 같은 코드 3번 이상 복붙 = 추상화 고려. 단 같아 보이는데 실은 다른 맥락이면 오히려 분리가 낫다. 이를 AHA(Avoid Hasty Abstraction)·WET라고 부르기도.

원칙실천
DRYDon't Repeat Yourself같은 코드 3번 이상 = 함수로
YAGNIYou Aren't Gonna Need It"나중에 쓸지도" 코드 금지
KISSKeep It Simple, Stupid똑똑한 한 줄 < 명확한 5줄
Boy Scout Rule온 것보다 깨끗하게 두기지나가다 작은 개선

바이브코더를 위한 AI 코드 리뷰 5문항. ① 이 함수는 한 가지만 하나? (SRP) ② DB·프레임워크에 직접 의존하나? (DIP) ③ 지금 안 쓰는 설정·옵션이 들어갔나? (YAGNI) ④ 같은 로직 3번째 복붙인가? (DRY) ⑤ 읽는 사람이 3초 안에 이해하나? (KISS). 이 5개면 거의 커버.

Claude가 과잉 설계할 때 — 싱글톤·팩토리·추상클래스 남발. "YAGNI 기준으로 불필요한 추상화 걷어내줘"라고 지시. 종종 절반 이하로 줄어든다.

실기 드릴 2문항
edit실기 드릴 · 단답형

SOLID의 "S"가 의미하는 것은?

edit실기 드릴 · 단답형

"지금 쓰지 않을 기능은 미리 만들지 말라"는 원칙의 약어는?