DRY, KISS, YAGNI — 3가지 주요 원칙을 생각하며 코드를 작성하자

kimyuchan·2025년 6월 18일
0
post-thumbnail

🧺 DRY — Don't Repeat Yourself

코드를 반복적으로 작성하지 말자는 원칙입니다.
시스템 내에서 특정 지식과 로직은 단 한 곳에만 존재해야 한다는 의미입니다.

동일한 코드가 여러 곳에 존재한다면, 변경사항이 생겼을 때 그 모든 곳을 수정해야 합니다.
이런 구조는 유지보수 측면에서 매우 비효율적이며, 오류 발생 가능성도 높아집니다.

적용 전 -> 코드의 중복 사용

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);
    }
}

💋 KISS — Keep It Simple, Stupid

시스템은 복잡하게 설계했을 때보다, 단순하게 만들었을 때 가장 잘 동작합니다.
불필요하게 화려한 테크닉을 사용하거나, 하나의 로직에 여러 기능을 섞는 것은 가독성을 떨어뜨립니다.

한 가지 로직에는 한 가지 기능만 담고, 전체 아키텍처도 단순하게 유지하는 것이 중요합니다.

즉, 여러 측면에서 소프트웨어의 복잡성(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"));
    }
}

적용 후 -> 한 함수 = 한가지 기능 담당 (SOLID 의 "S")

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));
    }
}

🌃 YAGNI — You Ain’t Gonna Need It

“지금 필요하지 않은 기능은 만들지 말라”는 원칙입니다.

예를 들어, 당장 soft delete가 필요 없는 기능에 이를 미리 적용한다고 해봅시다.
이 경우, DB 조회 시마다 deleted 여부를 필터링해야 하고, 모든 접근 로직에 영향을 줍니다.

이러한 미래지향적 설계는 때로는 유용할 수 있지만
현재 필요하지 않은 기능을 구현함으로써 시스템 복잡도와 개발 비용을 증가시킨다면 오히려 해가 됩니다.

협업 개발 관점에서도 복잡한 기능은 팀원 간 커뮤니케이션과 유지보수에 부담이 됩니다.


✅ 결론

DRY, KISS, YAGNI 이 세 가지 원칙을 항상 염두에 두고 코드를 작성해봅시다.
심플하게 중복 없이 지금 필요한 기능만 구현하는 것이 장기적으로 유지보수에 유리하며 시스템의 안정성과 확장성에도 큰 도움이 됩니다.

profile
Learn from yesterday, live for today, hope for tomorrow

0개의 댓글