Clean Code
코드를 클린하게 작성해야 하는 이유는 유지보수성, 확장성, 가독성과 관련이 있다.
클린 코드는 개인 개발자뿐만 아니라 팀 전체의 생산성과 코드 품질에 큰 영향을 미치며 여러 장점이 있다.
코드를 클린하게 작성하면 유지보수성 향상, 가독성 향상, 확장성과 재사용성 증가, 디버깅 및 테스트 용이, 생산성 증가, 코드 품질 및 신뢰성 향상, 기술 부채 감소, 자신의 성장 등의 효과가 있다.
1. 의미 있는 이름 짓기
- 변수, 함수, 클래스 이름은 명확하게
이름만 보고도 그 역할을 쉽게 이해할 수 있어야 한다. 축약어를 피하고 이름이 구체적일수록 좋다. - 불필요한 정보 제거
함수나 클래스 이름에 정보를 과도하게 포함하지 말고 필요 최소한의 정보만 담아야 한다. - 일관성 유지
프로젝트 전체에서 같은 개념에는 같은 단어를 사용해야 한다. 예를 들어 get을 사용했다면 다른 곳에서 fetch나 retrieve를 섞어 쓰지 말아야한다.
// 나쁜 예시
int d; // 날짜를 나타내지만 알 수 없음
// 좋은 예시
int daysSinceModification; // 수정된 이후의 날짜 수
2. 함수는 작고 한 가지 역할만 하게 만들기
- 단일 책임 원칙(Single Responsibility Principle)
함수는 하나의 책임만 가져야 한다.
함수는 한 가지 작업만 수행해야 하고 그 작업을 명확하게 해야 한다. - 작고 간결한 함수
함수의 길이가 짧을수록 가독성이 좋아진다.
10줄을 넘기지 않는 것을 추천하고, 큰 함수는 더 작은 함수로 쪼개는 것이 좋다. - 함수 이름은 동사로 시작
함수는 행동을 나타내므로 함수 이름을 동사로 짓는 것이 좋다.
3. 주석을 피하고 코드를 설명하기
- 코드 자체가 문서처럼
주석을 남발하는 것보다는 코드를 명확하게 작성하여 주석이 필요 없도록 만드는 것이 중요하다. - 주석은 보충 설명용
주석은 코드가 명확하지 않거나 복잡한 부분에 대해서만 사용하고 가능한 한 코드를 명확하게 하여 주석 없이도 이해할 수 있도록 해야 한다.
// 나쁜 예시
// 사용자 정보를 저장합니다.
saveUserInfo();
// 좋은 예시
saveUserInformationToDatabase(); // 코드만으로도 충분히 설명됨
4. 매직 넘버(Magic Number)를 피하고 상수를 사용하기
- 매직 넘버는 상수로 대체
숫자나 문자열을 코드 내에서 직접 사용하는 대신, 의미 있는 상수로 대체해야 한다.
코드의 가독성을 높이고 수정 시에도 여로 군데를 수정할 필요 없이 한 곳에서 변경할 수 있게 한다.
// 나쁜 예시
if (age > 18) {
// 성인 처리 로직
}
// 좋은 예시
private static final int ADULT_AGE = 18;
if (age > ADULT_AGE) {
// 성인 처리 로직
}
5. 오류 처리(예외 처리)를 명확하게
- 오류를 무시하지 않기
예외를 무시하거나 간단히 로그만 찍고 넘어가지 말고 상황에 맞는 처리를 해야 한다.
필요하다면 예외 메시지도 구체적으로 작성해야 한다. - 적절한 예외를 던지기
적절한 상황에 맞는 예외를 던지고 처리할 수 있도록 해야 한다.
// 나쁜 예시
try {
// 작업 수행
} catch (Exception e) {
e.printStackTrace(); // 예외 처리 불충분
}
// 좋은 예시
try {
// 작업 수행
} catch (SQLException e) {
throw new DatabaseException("Failed to save data", e);
}
6. 의존성 최소화
- 의존성 주입
클래스나 함수가 너무 많은 외부 요소에 의존하지 않도록 해야 한다.
특히 상호 의존성(순환 참조)이 발생하지 않도록 주의해야 한다. - 클래스 간 결합도 줄이기
가능하면 클래스 간의 결합도를 낮추어 한 부분의 변경이 다른 부분에 영향을 주지 않도록 해야 한다.
// 나쁜 예시
public class UserService {
private UserRepository userRepository = new UserRepository(); // 직접 생성
}
// 좋은 예시
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository; // 의존성 주입
}
}
A 객체가 B 객체에 의존할 때 A가 B를 직접 생성하는 것이 아니라 외부에서 A에게 B를 제공해주는 것을 의존성 주입이라고 한다.
7. 테스트 코드 작성 (TDD)
- 테스트 코드 작성
테스트 코드를 먼저 작성하고 그에 맞춰 기능을 구현하는 방법이 좋다.
TDD(Test Driven Development) 방식으로 작성하면 자연스럽게 클린 코드 원칙을 따르게 된다. - 단위 테스트(Unit Test)
각 함수와 클래스가 예상대로 동작하는지 확인하는 단위 테스트를 작성해야 한다.
이는 버그를 사전에 방지하는 좋은 방법이다. - Red : 실패하는 테스트 작성
Green : 테스트를 통과할 수 있도록 최소한의 기능 구현
Refactor : 중복 제거, 코드 개선 등 리팩토링
8. 코드 중복 중리기 (DRY 원칙)
- 중복된 코드 제거
같은 기능을 여러 군데서 반복하지 않고 재사용이 가능한 함수를 만들어 코드 중복을 줄이는 게 좋다.
DRY(Don't Repeat Yourself) 원칙을 따르는 것이 중요하다.
// 나쁜 예시
public void createUser() {
// 사용자 생성 로직
}
public void updateUser() {
// 사용자 수정 로직 (유사한 로직 반복)
}
// 좋은 예시
public void saveUser(User user) {
// 사용자 저장 로직
}
9. 객체 지향 원칙 준수 (SOLID 원칙)
- 단일 책임 원칙 : 클래스는 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙 : 코드는 확장에는 열려 있고 수정에는 닫혀 있어야 한다.
- 리스코프 치환 원칙 : 하위 클래스는 상위 클래스를 대체할 수 있어야 한다.
- 인터페이스 분리 원칙 : 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
- 의존 역전 원칙 : 고수준 모듈은 저수준 모듈에 의존하지 말고 추상화에 의존해야 한다.
10. 코딩 스타일 일관성 유지
- 코딩 컨벤션 준수
코드 스타일을 일관되게 유지하는 것이 중요하다. 팀 내에서 합의된 컨벤션을 따르거나 기존의 널리 사용되는 컨벤션을 사용하는 것이 좋다. - 들여쓰기와 공백
들여쓰기를 일관되게 하고 코드를 읽기 쉽게 구성하자.
한 줄에 너무 많은 코드를 넣지 말고 가독성을 위해 적절히 줄바꿈을 해야 한다.
'코딩 규칙과 방법들' 카테고리의 다른 글
[MVC패턴] 역할을 어떻게 나눠야할까? (0) | 2024.10.29 |
---|---|
테스트 주도 개발 TDD는 무엇일까? (1) | 2024.10.22 |
원활한 협업을 위한 '커밋 메시지' 작성 규칙 (0) | 2024.10.22 |
MVC 패턴이 무엇일까? (3) | 2024.10.22 |