DRY 원칙이란?
DRY(Don't Repeat Yourself)는 소프트웨어 개발의 핵심 원칙 중 하나로, "코드 중복을 피하라"라는 간단한 개념에서 출발한다.
직역하면 "자신을 반복하지 말라"는 의미로, 동일한 코드, 로직, 또는 지식이 시스템 내에서 반복되지 않도록 하는 원칙.
DRY 원칙의 핵심은 모든 지식과 로직이 시스템 내에서 단 한 번만, 명확하게 표현되어야 한다는 것이다.
중복된 코드가 있으면 유지보수가 어려워지고, 한 부분을 수정할 때 다른 부분도 함께 수정해야 하는 불편함이 생기기 때문.
DRY 원칙이 나온 배경은
DRY 원칙은 코드 중복으로 인한 유지보수 문제와 복잡성 증가를 해결하기 위해,
아래 문제들을 해결하기 위해 1999년 "실용주의 프로그래머"에서 공식화되었다.
- 유지보수의 어려움: 코드 중복은 변경 사항이 발생했을 때 여러 곳을 동시에 수정해야 하는 문제가 있음.
- 버그 발생 위험 증가: 중복된 코드의 일부만 수정하고 다른 부분을 놓치면 일관성이 깨지고 예상치 못한 버그가 발생함.
- 코드 비대화: 불필요한 반복으로 코드의 크기가 커지면 이해하기 어려워지고 개발 및 테스트 비용이 증가함.
- 소프트웨어 복잡성 관리: 소프트웨어 시스템이 점점 복잡해지면서 체계적인 설계 원칙의 필요성이 증가함.
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 |