애자일 스쿨 — Legacy Code Refactoring 수련 워크샵
레거시 코드 리팩토링 워크샵 (이력)
- Java개발자를 위한 ‘레거시 코드 리팩토링 수련’ 워크샵2018/02/22~23(목,금) 09:30~18:00
- C#개발자를 위한 ‘레거시 코드 리팩토링 수련’ 워크샵2018/02/08~09(목,금) 09:30~18:00
리팩토링 이야기
소프트웨어 장인에게 필요한 두번째와 세번째 엔지니어링 프랙티스는 레거시 코드 리팩토링과 단순한 설계(Simple Design)입니다.
어떤 코드가 레거시 코드인가요? 모든 프로그래머는 자신만의 레거시 코드에 대한 정의를 가지고 있습니다. 워크샵을 진행하면서 동일한 질문을 했을 때 가장 많이 나온 대답은 다음과 같습니다.
오래된 코드
- 읽기 어려운 코드
- 손대기 싫은 코드
- 남이 짠 코드 (내가 짠 코드는 레거시 코드가 아니예요. )
- …
네, 모두 맞는 이야기입니다.
저는 마이클 페더스의 정의를 좋아하고 즐겨 사용합니다. 마이클 페더스는 “테스트 코드가 없는 코드는 모두 레거시 코드다.” 라고 정의했습니다. 다시 말하면, 테스트 코드를 작성하지 않았다면 오늘 작성한 코드도 레거시 코드라는 것입니다.
하지만, 아이러니하게도 레거시 코드는 여러분의 회사에 돈을 벌어주는 코드이기도 합니다. 매출을 올리지 못하는 코드였다면 아마도 살아남지 못하고 삭제되었을 가능성이 높기 때문입니다. 레거시 코드는 여러분을 괴롭히기도 하지만 그 고통만큼이나 소중한 코드이기도 한 것이죠.
요구사항이 변경되었거나 신규 요구사항을 반영하기 위해서 레거시 코드를 건드려야 할 때 여러분의 마음속에는 어떤 감정이 일어나나요? 레거시 코드를 수정했을 때 상황을 떠올려 보세요. 아마도 두려움, 불안, 걱정 이런 감정들이 떠오를 겁니다.
레거시 코드 리팩토링 워크샵에서는 테스트가 없는 상태에서 안전하게 코드를 리팩토링하기 위한 다양한 방법과 기법들을 실습을 통해 경험하게 됩니다.
1. 코드 품질과 기능 추가 속도
- 코드 품질과 기능 추가 속도와의 관계
- 이상적인 기능추가 속도
- 가독성이 코드 품질에 미치는 영향
- 가독성이 중요한 이유
2. 코드 스멜
- 코드 스멜 정의 및 목록 익히기
- 코드 스멜 찾기 훈련
- 코드 스멜 제거를 위한 리팩토링
3. Characterization Test
- 테스트 코드의 구조
- 효과적인 테스트
- 레거시 코드 테스트 코드 작성 방법
4. 레거시 코드 리팩토링
- 레거시 코드에 기능을 추가하는 방법들
- Baby Step 을 이용한 레거시 코드 리팩토링
5. 의존성 제거하기
- Glue Code, 의존성
- 의존성 깨기(Breaking Dependency)
- 의존성 주입하기(Dependency Injection)
- Mocking
6. 객체지향 설계 원칙
- SOLID : SRP, OCP, LSP, ISP, DIP
7. 설계 리팩토링 : 패턴 적용하기
a. Design Spectrum
- No Design — Simple Design — Over Engineering
- Up Front Design vs Emergent Design
b. 패턴
- Builder Pattern
- Template Method Pattern
- Strategy Pattern
- Factory Method Pattern
- Observer