회사에서 진행 중인 프로젝트에 대해 설명을 들으면서, 해당 프로젝트가 Legacy 시스템이라 기존 버전에서 새로운 버전으로 마이그레이션 작업을 진행 중이라는 내용을 알게 되었다. 그때 "Legacy"가 정확히 어떤 의미일까?라는 궁금증이 생겨 이번 기회에 제대로 알아보게 되면서 아래 블로그에 정리된 내용을 읽게 되었는 데
레거시 코드(Legacy Code)에 대해 다룬 글을 살펴보면, 레거시 코드는 아래 4가지 경우 중 하나라도 포함되는 경우 레거시 코드로 분류될 수 있다고 한다.
- 다른 사람으로부터 상속된 소스 코드
- 이전 버전의 소프트웨어에서 상속된 소스 코드
- 개발자가 변경하기를 두려워하는 코드
- 테스트 없는 코드
나의 경험을 빗대어 생각해 보니 코드는 짜면 짤수록 더러워질 수밖에 없고, 남의 코드일수록 파악하는 데 시간이 오래 걸릴 수밖에 없다는 점을 느꼈다. 그렇기 때문에 코드를 작성하는 개발자가 애초부터 가독성과 유지보수성을 고려하여 코드를 작성해야 한다는 생각이 더욱 깊게 드는 것 같다.
레거시 코드를 해결하기 위해서는 어떤 방식이 있을까?
레거시 코드를 예방하는 방법은 아래와 같이 여러 가지가 있지만,
핵심은 처음부터 가독성과 유지보수성, 확장성을 고려하여 설계하고 지속적으로 개선하는 습관을 들이는 것입니다.
1. 클린 코드(Clean Code) 작성 (⭐)
- 가독성 높은 코드 작성
: 변수명, 함수명, 클래스명 등을 직관적으로 작성하면 코드가 직관적이고 명확하여 다른 개발자들이 쉽게 코드를 파악할 수 있다. - 간결한 코드 유지
: 복잡하고 긴 코드보다 간결하고 명확한 코드가 유지보수에 유리하다. - 적절한 주석 작성
: 코드의 목적이나 복잡한 부분에 대해 설명하는 주석을 추가하여 코드의 이해를 돕는다. 주의할 점은 주석이 그 코드를 이해하기 어렵게 만드는 경우도 있고, 코드가 수정되는 경우 주석도 함께 갱신해야 하기 때문에 되도록 주석에 의존하지 않고 코드 자체가 이해되기 쉽도록 작성하는 것이 좋다.
2. 테스트 주도 개발(TDD, Test-Driven Development) (⭐)
- 단위 테스트 개발
: 기능 개발 시 단위 테스트를 먼저 작성하고, 이후 테스트를 통해 코드가 의도대로 동작하는지 확인하면서 개발하면 코드 품질을 높이는 데 도움을 주고, 추후 리팩토링을 진행하는 경우에도 안전성을 보장해 준다. - 자동화된 테스트 도입
: 테스트 코드를 자동화하여 반복적인 테스트를 쉽게 하고, 코드 변경 시 발생할 수 있는 문제를 빠르게 파악할 수 있다.
3. 유지보수 가능한 설계 (Maintainable Design) (⭐)
- SOLID 원칙 준수
: 코드의 확장성과 유지보수성을 높여주는 객체 지향 설계의 기본 원칙인 SOLID를 따르는 것이 중요하다. - 단일 책임 원칙(Single Responsibility Principle)
: 각 코드의 변경이 최소화되고, 테스트와 유지보수가 쉬워지도록 하나의 클래스나 함수는 하나의 책임만 가지도록 설계한다. - 의존성 주입(Dependency Injection)
: 의존성을 외부에서 주입하는 방식으로 코드의 결합도를 낮추어 테스트 가능하고 변경에 유연한 시스템을 만든다.
4. 버전 관리와 코드 리뷰 (⭐)
- 버전 관리 시스템 활용
: Git과 같은 버전 관리 시스템을 통해 코드 변경 이력을 관리하고, 이전 버전으로 쉽게 롤백할 수 있도록 한다. - 코드 리뷰
: 팀원 간 코드 리뷰를 통해 코드 품질을 높이고, 개선점을 찾을 수 있고, 서로 다른 관점에서 코드의 문제점을 발견하고 수정할 수 있다.
5. 기술적 부채 관리
- 기술적 부채 관리 계획
: 처음에는 빠르게 개발할 수 있지만, 나중에 기술적 부채가 쌓이지 않도록 계획적으로 기술 부채를 관리하고 일정 주기로 해결해 나가도록 한다. - 정기적인 리팩토링
: 일정한 주기로 코드 품질을 점검하고, 리팩토링을 통해 개선할 부분을 지속적으로 해결한다.
6. 표준화된 코드 스타일
- 코딩 규칙 및 스타일 가이드 설정
: 팀 내에서 코딩 스타일을 표준화하여 일관된 코드를 작성하도록 하여 코드의 가독성을 높이고, 새로운 팀원이 쉽게 적응할 수 있도록 한다. - 자동화된 코드 포맷팅 도구 사용
: Prettier나 ESLint와 같은 도구를 사용하여 코드 스타일을 자동으로 유지할 수 있도록 한다.
7. 모듈화와 재사용
- 모듈화
: 코드의 확장성과 유지보수성을 갖추기 위하여 코드를 작은 단위로 나누어 재사용 가능하고 독립적인 모듈로 만든다. - 중복 코드 제거
: 중복된 코드를 최소화하여, 변경 시 한 곳에서만 수정할 수 있도록 설계한다.
8. 기술 스택과 도구의 최신화
- 최신 기술 사용
: 기술 스택이 최신 상태를 유지하도록 하고, 오래된 라이브러리나 프레임워크를 계속 사용하지 않도록 주의한다. - 업데이트 주기 설정
: 사용하는 라이브러리나 도구가 구버전일 경우, 이를 주기적으로 업데이트하여 최신 상태를 유지할 수 있도록 한다.
그중에서도 특히 중요하다고 생각했던 부분을 ⭐로 표시했는 데 한 번 더 정리를 해보자면
- 클린 코드 작성 (Clean Code)
: 가독성 높은 코드를 작성하면 다른 개발자들이 쉽게 이해하고 수정할 수 있기 때문에, 직관적인 변수명, 함수명, 클래스명 등을 사용하고, 간결한 코드를 유지하는 것이 중요하다. - 테스트 주도 개발 (TDD)
: 단위 테스트를 먼저 작성하고 이를 통해 코드가 의도대로 동작하는지 확인하는 방식은 코드 품질을 높이고, 리팩토링 시 기존 기능의 안정성을 보장하는 데 도움이 된다. - 유지보수 가능한 설계
: 코드의 확장성과 유지보수성을 고려한 설계가 필요하다. SOLID 원칙을 따르고, 의존성 주입을 활용하여 코드의 결합도를 낮추면 변경이 용이해진다. - 코드 리뷰
: 팀원 간의 코드 리뷰는 코드 품질을 높이고, 서로 다른 관점에서 코드 문제를 발견하고 해결하는 데 중요한 역할을 하여, 지속적인 코드 품질 향상에 도움이 된다.
댓글