반응형

SW 개발 일반/레거시코드와 놀기 12

소프트웨어 엔트로피 (Software Entropy)

1. 소프트웨어 엔트로피란?소프트웨어 엔트로피(Software Entropy)는 시간이 지남에 따라 소프트웨어 시스템이 점점 더 복잡해지고 유지보수가 어려워지는 현상을 의미합니다. 이는 소프트웨어가 방치될 경우 무질서해지고 붕괴할 가능성이 높아진다는 점을 강조합니다. 《실용주의 프로그래머(The Pragmatic Programmer)》에서 소개된 깨진 창(Broken Windows) 이론과 밀접한 관련이 있습니다. 즉, 하나의 작은 문제가 해결되지 않고 방치되면 점점 더 많은 문제가 발생하고, 결국 시스템 전체가 무너질 수 있습니다. 2. 소프트웨어 엔트로피의 원인1) 일관성 없는 코드와 나쁜 설계프로젝트가 진행될수록 코드의 일관성이 깨지고 유지보수가 어려워질 수 있습니다.빠른 기능 추가에 집중하면서 설..

레거시 코드와 놀기: 인스턴스 위임 도입 (Introduce Instance Delegate)

소프트웨어 유지보수와 테스트 자동화를 어렵게 만드는 주요 요인 중 하나는 의존성(Dependency)입니다. 레거시 코드에서는 특히 static 메서드가 이러한 문제를 심화시키는 경우가 많습니다. static 메서드는 특정한 상태를 가지지 않고 클래스 레벨에서 호출되기 때문에, 객체를 주입하여 대체하기 어렵습니다. 이러한 문제를 해결하는 방법 중 하나가 Introduce Instance Delegator 기법입니다. 이 기법은 기존 static 메서드를 인스턴스 메서드로 감싸서 객체를 통해 호출할 수 있도록 만드는 방식입니다. 이를 활용하면 기존 코드를 크게 변경하지 않으면서도 의존성을 줄이고, 테스트 가능성을 높일 수 있습니다. Introduce Instance Delegator 기법 적용Introdu..

레거시 코드와 놀기: 인터페이스 추출 (Extract Interface)

소프트웨어 유지보수와 테스트 자동화를 어렵게 만드는 주요 요인 중 하나는 의존성(Dependency)입니다. Working Effectively with Legacy Code에서 소개된 "인터페이스 추출(Extract Interface)" 기법은 이러한 의존성을 줄이고, 테스트 가능성을 높이는 데 중요한 역할을 합니다. 이번 글에서는 인터페이스 추출 기법의 개념과 이를 활용하여 코드의 테스트 가능성을 높이는 방법을 살펴보겠습니다.1. 인터페이스 추출이란?인터페이스 추출(Extract Interface)은 기존 클래스에서 특정한 역할을 수행하는 메서드들을 추출하여 새로운 인터페이스를 정의하는 기법입니다. 이를 통해 기존 코드의 직접적인 의존성을 줄이고, 테스트를 위한 대체 구현(Fake, Mock 등)을 ..

레거시 코드와 놀기: Getter 메소드 추출과 재정의 (Extract and Override Getter)

코드의 테스트 가능성과 유지보수성을 높이기 위해 의존성 관리가 핵심 과제가 됩니다. 오늘은 "Extract and Override Getter" 기법을 살펴보며, 클래스 내부의 복잡한 의존성을 어떻게 효과적으로 분리하고 테스트 가능한 구조로 바꿀 수 있는지에 대해 이야기하겠습니다.문제 정의: 내부 의존성의 문제점클래스 내부에서 객체를 직접 생성하거나 관리하면, 그 클래스는 해당 의존성에 강하게 결합됩니다. 이로 인해 다양한 문제가 발생합니다. 첫 번째로, 테스트 작성이 복잡해집니다. 외부에서 의존성을 대체하거나 모의(Mock) 객체를 주입하기 어려운 구조 때문에 코드 테스트가 제한적이 됩니다. 두 번째로, 요구사항 변화에 따른 코드 변경이 어렵습니다. 의존성이 코드에 하드코딩되어 있으면 수정 범위가 넓어..

레거시 코드와 놀기 백서: Working Effectively with Legacy Code

Working Effectively with Legacy Code는 레거시 코드와 마주했을 때 작업을 안전하고 점진적으로 진행할 수 있는 구체적인 전략과 마음가짐을 제시하는 책입니다. 레거시 코드 속에서 오랜 시간 고통받아 왔던 제게, 이 책은 큰 깨달음을 주었습니다. 테스트는 이제 선택이 아니라 필수라는 마음가짐을 갖게 되었습니다. 비록 주변에서는 여전히 테스트에 대한 관심이 크지 않아, 개발자 수준의 테스트가 필수적인 활동으로 여겨지지 않더라도, 저는 꾸준히 테스트를 놓지 않고 이어나갈 결심을 하게 되었습니다. 퇴사하기 전까지, 적어도 제가 있는 동안만이라도 계속 노력할 생각입니다. 어떤 책에서는 더 나은 환경의 회사로 이직하는 것도 방법이라고 조언하지만, 오랜 시간을 버텨온 이곳을 떠나는 게 참 어..

레거시 코드와 놀기: 호출 추출과 재정의 (Extract and Override Call)

소프트웨어 개발자는 종종 기존 코드(레거시 코드)를 다룰 때 어려움을 겪습니다. 이러한 코드는 종종 유지보수하기 어렵고, 테스트 가능성이 낮으며, 새로운 요구 사항에 맞게 변경하기도 까다롭습니다. "호출 추출과 재정의(Extract and Override Call)"는 이러한 문제를 해결하기 위한 의존성 제거 기법입니다. 이 글에서는 호출 추출과 재정의의 개념, 적용 방법, 코드 예제, 그리고 테스트 작성법을 살펴보겠습니다.호출 추출과 재정의란 무엇인가요?호출 추출과 재정의는 클래스 내에서 특정 호출을 별도의 보호(protected) 메서드로 분리하고, 이 메서드를 서브클래스에서 재정의할 수 있게 만드는 기법입니다. 이 리팩토링 방법은 테스트 가능성을 크게 높이고, 외부 의존성을 관리하며, 코드의 유연성..

레거시 코드와 놀기: 정적 메소드 드러내기 (Expose Static Method)

소프트웨어 개발에서 복잡한 클래스의 초기화는 테스트 작성과 유지보수성을 어렵게 만드는 주요 요인 중 하나입니다. "정적 메소드 드러내기(Expose Static Method)" 기법은 이러한 문제를 해결하기 위한 효과적인 리팩토링 방법으로, 특정 메소드를 정적(static) 메소드로 변환하여 클래스 초기화 없이 직접 호출할 수 있도록 만듭니다. 이 글에서는 해당 기법의 개념, 예제 코드, 그리고 테스트 코드 작성 방법을 설명합니다. 1. 정적 메소드 드러내기란?정적 메소드 드러내기는 다음과 같은 상황에서 유용합니다:클래스 초기화 문제: 테스트 또는 사용 중 클래스 생성이 어렵거나 불필요하게 복잡한 경우.독립적 로직: 메소드가 클래스의 멤버 변수에 의존하지 않고 독립적으로 동작하는 경우.유틸리티화: 메소드..

느리지만 그나마 쉬운 테스트 개발하기

임베디드 시스템을 개발하는 환경에서 테스트는 종종 골칫거리로 여겨집니다. 특히 레거시 코드가 많이 쌓여 있는 경우에는 더욱 그렇습니다. 하지만 이런 상황에서도 기능 수준에서 동작을 확인할 수 있는 방법이 있습니다. 이번 글에서는 임베디드 시스템의 C++ 코드를 직접 다루지 않고도 외부에서 Python을 사용해 기능 테스트를 수행하는 방식을 소개하겠습니다. 또한 이 과정에서 Cucumber를 활용해 쉽고 읽기 좋은 테스트 코드를 작성하는 방법도 다룹니다.왜 Python을 사용하는가?Python은 단순함과 강력한 라이브러리 생태계 덕분에 테스트 자동화에 매우 적합한 언어입니다. C++로 작성된 임베디드 시스템의 테스트 코드를 직접 작성하려면 복잡한 빌드 환경과 코드 수정이 필요할 수 있지만, Python을 ..

레거시 코드와 놀기: 전역 참조 캡슐화 (Encapsulate Global Reference)

소프트웨어 개발에서 전역 변수는 편리하지만, 유지보수성과 테스트 가능성을 크게 저하시킬 수 있습니다. 전역 참조 캡슐화(Encapsulate Global Reference)는 이러한 문제를 해결하기 위해 전역 변수를 추상화 계층 뒤로 숨기고, 코드의 결합도를 줄이며, 테스트 가능성을 높이는 의존성 제거 기법입니다. 이 글에서는 해당 기법의 개념, 적용 방법 및 테스트 코드 작성 예제를 살펴봅니다. 1. 전역 참조 캡슐화란?전역 참조 캡슐화는 전역 변수나 전역 함수와 같은 전역 상태를 직접 참조하지 않도록 하여 코드의 결합도를 줄이는 기법입니다. 이를 위해 전역 참조를 캡슐화한 클래스나 인터페이스를 생성하고, 해당 인터페이스를 통해 전역 상태를 간접적으로 관리합니다.이 기법은 다음과 같은 이점을 제공합니다..

레거시 코드와 놀기: 메소드 객체 추출 (Breaking Out Method Object)

소프트웨어 개발에서 의존성을 제거하거나 줄이는 작업은 유지보수성과 테스트 가능성을 크게 향상시킵니다. 특히, "메소드 객체 추출(Break Out Method Object)" 기법은 기존의 복잡한 메서드를 분리하여 단일 책임 원칙(Single Responsibility Principle)을 따르는 독립된 클래스로 재구성하는 유용한 방법입니다. 이 글에서는 메소드 객체 추출의 개념, 이점, 적용 방법 및 이를 활용한 테스트 코드 작성법을 살펴봅니다. 메소드 객체 추출(Break Out Method Object)란?기존의 클래스가 지나치게 복잡한 메서드를 포함하고 있을 때, 해당 메서드를 별도의 클래스로 추출하여 책임을 분리하고 코드를 단순화하는 기법입니다. 이를 통해 다음과 같은 효과를 얻을 수 있습니다:..

반응형