본문 바로가기
정리

클린 코드를 위한 소프트웨어 설계 원칙: DRY 원칙

by dyddyd0 2025. 5. 3.

DRY 원칙이란?

DRY(Don't Repeat Yourself)는 소프트웨어 개발의 핵심 원칙 중 하나로, "코드 중복을 피하라"라는 간단한 개념에서 출발한다.

직역하면 "자신을 반복하지 말라"는 의미로, 동일한 코드, 로직, 또는 지식이 시스템 내에서 반복되지 않도록 하는 원칙.

DRY 원칙의 핵심은 모든 지식과 로직이 시스템 내에서 단 한 번만, 명확하게 표현되어야 한다는 것이다.

중복된 코드가 있으면 유지보수가 어려워지고, 한 부분을 수정할 때 다른 부분도 함께 수정해야 하는 불편함이 생기기 때문.

 

 

DRY 원칙이 나온 배경은

DRY 원칙은 코드 중복으로 인한 유지보수 문제와 복잡성 증가를 해결하기 위해,

아래 문제들을 해결하기 위해 1999년 "실용주의 프로그래머"에서 공식화되었다.

 

  1. 유지보수의 어려움: 코드 중복은 변경 사항이 발생했을 때 여러 곳을 동시에 수정해야 하는 문제가 있음.
  2. 버그 발생 위험 증가: 중복된 코드의 일부만 수정하고 다른 부분을 놓치면 일관성이 깨지고 예상치 못한 버그가 발생함.
  3. 코드 비대화: 불필요한 반복으로 코드의 크기가 커지면 이해하기 어려워지고 개발 및 테스트 비용이 증가함.
  4. 소프트웨어 복잡성 관리: 소프트웨어 시스템이 점점 복잡해지면서 체계적인 설계 원칙의 필요성이 증가함.

 

DRY 원칙의 핵심 키워드

1. 단일 지식 원천(Single Source of Truth)

모든 지식과 비즈니스 로직은 시스템 내에서 단 한 곳에만 존재해야 한다.

이것은 코드뿐만 아니라 문서, 데이터베이스 스키마 등 모든 형태의 시스템 지식에 해당.

2. 추상화(Abstraction)

공통된 로직을 함수, 클래스, 모듈 등으로 추상화하여 재사용 가능한 컴포넌트로 만드는 것이 DRY 원칙을 따르는 핵심 방법.

3. 모듈화(Modularity)

코드를 논리적 단위로 분리하고 각 모듈이 명확한 책임을 갖도록 설계하면 중복을 최소화할 수 있다.

4. 유지보수성(Maintainability)

DRY 원칙을 따르면 코드 변경이 필요할 때 단 한 곳만 수정하면 되므로 유지보수가 쉬워진다.

5. 일관성(Consistency)

시스템 전체에 걸쳐 일관된 방식으로 문제를 해결하고 코드를 구성하는 것이 중요하다.

6. 코드 재사용(Code Reusability)

한 번 작성한 코드를 여러 곳에서 재사용함으로써 개발 시간을 단축하고 오류 가능성을 줄일 수 있다.

7. 자동화(Automation)

반복적인 작업을 자동화하는 것도 DRY 원칙의 확장된 개념임.

코드 생성 도구, 스크립트 등을 활용하여 반복 작업을 줄이는 것도 포함됨.

 

 

DRY 원칙의 적용 예시

나쁜 예시 (WET - Write Everything Twice):

// 사용자 정보 검증 함수 1
public boolean validateUserInfo(User user) {
    if (user.getName() == null || user.getName().isEmpty()) {
        return false;
    }
    if (user.getEmail() == null || !user.getEmail().contains("@")) {
        return false;
    }
    if (user.getAge() < 18) {
        return false;
    }
    return true;
}

// 다른 곳에서 비슷한 검증 로직을 중복해서 구현
public boolean checkUserValidity(UserDTO userDto) {
    if (userDto.getName() == null || userDto.getName().isEmpty()) {
        return false;
    }
    if (userDto.getEmail() == null || !userDto.getEmail().contains("@")) {
        return false;
    }
    if (userDto.getAge() < 18) {
        return false;
    }
    return true;
}

좋은 예시 (DRY):

// 공통 검증 로직을 한 곳에 모음
public boolean isValidName(String name) {
    return name != null && !name.isEmpty();
}

public boolean isValidEmail(String email) {
    return email != null && email.contains("@");
}

public boolean isAdult(int age) {
    return age >= 18;
}

// 여러 곳에서 재사용 가능
public boolean validateUserInfo(User user) {
    return isValidName(user.getName()) &&
           isValidEmail(user.getEmail()) &&
           isAdult(user.getAge());
}

public boolean checkUserValidity(UserDTO userDto) {
    return isValidName(userDto.getName()) &&
           isValidEmail(userDto.getEmail()) &&
           isAdult(userDto.getAge());
}

 

 

DRY 원칙 주의점

DRY 원칙을 과도하게 적용하면 불필요한 추상화로 코드가 복잡해질 수 있다.

때로는 약간의 중복을 허용하는 것이 코드의 가독성과 유지보수성을 높이는 방법이다.

따라서 "실용적인 DRY"를 적용하는 것이 중요함.

또한 물리적 중복(syntactic duplication)의미적 중복(semantic duplication)구분할 수 있어야 된다.

코드가 비슷해 보여도 서로 다른 개념을 표현한다면 함께 추상화하지 않는 것이 좋다.

 

 

정리하면,

DRY 원칙은 코드 중복을 최소화하여 유지보수성과 확장성을 높이는 핵심 소프트웨어 설계 원칙이다.

DRY를 통해 더 깨끗하고, 효율적이며, 버그가 적은 코드를 작성할 수 있지만,

맹목적으로 DRY를 적용하기보다는 상황에 맞게 판단하여 사용하자.

 

DRY는 단순히 코드 중복을 피하라는 것을 넘어,

"모든 지식은 시스템 내에서 단 한 번, 명확하게 표현되어야 한다"는 더 깊은 의미를 가진다.

 

https://en.wikipedia.org/wiki/Don%27t_repeat_yourself

 

Don't repeat yourself - Wikipedia

From Wikipedia, the free encyclopedia Principle of software development "Don't repeat yourself" (DRY), is a principle of software development aimed at reducing repetition of information which is likely to change, replacing it with abstractions that are les

en.wikipedia.org

 

반응형

'정리' 카테고리의 다른 글

람다식과 스트림  (0) 2025.05.07
소프트웨어 개발 방법론 애자일  (0) 2025.05.06
스프링의 @Transactional  (0) 2025.05.02
스프링 Bean의 scope  (0) 2025.04.30
싱글톤패턴  (0) 2025.04.29