코드를 반복적으로 작성하지 말자는 원칙입니다.
시스템 내에서 특정 지식과 로직은 단 한 곳에만 존재해야 한다는 의미입니다.
동일한 코드가 여러 곳에 존재한다면, 변경사항이 생겼을 때 그 모든 곳을 수정해야 합니다.
이런 구조는 유지보수 측면에서 매우 비효율적이며, 오류 발생 가능성도 높아집니다.
public class DRYBefore {
public void printUserInfo(String name, int age) {
System.out.println("=== User Info ===");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("=================");
}
public void printAdminInfo(String name, int level) {
System.out.println("=== User Info ===");
System.out.println("Name: " + name);
System.out.println("Level: " + level);
System.out.println("=================");
}
public static void main(String[] args) {
DRYBefore example = new DRYBefore();
example.printUserInfo("철수", 30);
example.printAdminInfo("관리자", 5);
}
}
public class DRYAfter {
private void printHeader() {
System.out.println("=== User Info ===");
}
private void printFooter() {
System.out.println("=================");
}
public void printUserInfo(String name, int age) {
printHeader();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
printFooter();
}
public void printAdminInfo(String name, int level) {
printHeader();
System.out.println("Name: " + name);
System.out.println("Level: " + level);
printFooter();
}
public static void main(String[] args) {
DRYAfter example = new DRYAfter();
example.printUserInfo("철수", 30);
example.printAdminInfo("관리자", 5);
}
}
시스템은 복잡하게 설계했을 때보다, 단순하게 만들었을 때 가장 잘 동작합니다.
불필요하게 화려한 테크닉을 사용하거나, 하나의 로직에 여러 기능을 섞는 것은 가독성을 떨어뜨립니다.
한 가지 로직에는 한 가지 기능만 담고, 전체 아키텍처도 단순하게 유지하는 것이 중요합니다.
즉, 여러 측면에서 소프트웨어의 복잡성(complexity)을 높이는 요소는 배제하고, 가능한 간결성(simplicity)을 추구해야 합니다.
public class KISSBefore {
public int calculate(int a, int b, String operator) {
if (operator.equals("plus")) {
return a + b;
} else if (operator.equals("minus")) {
return a - b;
} else {
throw new IllegalArgumentException("지원하지 않는 연산자입니다.");
}
}
public static void main(String[] args) {
KISSBefore calc = new KISSBefore();
System.out.println(calc.calculate(3, 2, "plus"));
System.out.println(calc.calculate(5, 1, "minus"));
}
}
public class KISSAfter {
public int plus(int a, int b) {
return a + b;
}
public int minus(int a, int b) {
return a - b;
}
public static void main(String[] args) {
KISSAfter calc = new KISSAfter();
System.out.println(calc.plus(3, 2));
System.out.println(calc.minus(5, 1));
}
}
“지금 필요하지 않은 기능은 만들지 말라”는 원칙입니다.
예를 들어, 당장 soft delete가 필요 없는 기능에 이를 미리 적용한다고 해봅시다.
이 경우, DB 조회 시마다 deleted
여부를 필터링해야 하고, 모든 접근 로직에 영향을 줍니다.
이러한 미래지향적 설계는 때로는 유용할 수 있지만
현재 필요하지 않은 기능을 구현함으로써 시스템 복잡도와 개발 비용을 증가시킨다면 오히려 해가 됩니다.
협업 개발 관점에서도 복잡한 기능은 팀원 간 커뮤니케이션과 유지보수에 부담이 됩니다.
DRY, KISS, YAGNI 이 세 가지 원칙을 항상 염두에 두고 코드를 작성해봅시다.
심플하게 중복 없이 지금 필요한 기능만 구현하는 것이 장기적으로 유지보수에 유리하며 시스템의 안정성과 확장성에도 큰 도움이 됩니다.