본문 바로가기
개발/게임) 개발관련

게임개발) 레거시 코드(Legacy Code)

by 테샤르 2019. 10. 14.

레거시코드(Legacy Code)

 

 

개발자라면 누구나 필연적으로 다른 사람의 코드를 접하게 된다.

1인 개발자의 특수한 경우를 제외하고는 협업을 하게 된다.

협업을 하는 과정에서 종종 난감한 상황이 벌어진다. 이는 흔히 전문 용어로 '똥 싸놨다.'라고 표현한다. 코드의 가독성이 떨어지거나, 코드의 규약이 없는 경우, 코드의 결합도가 높은 경우, 시간이 없어서 땜빵 코드를 작성한 경우, 이런 여러 가지 원인들로 인해서 화석처럼 굳어진 코드를 흔히 '레거시 코드'라고 표현한다.

 

반응형

레거시 코드는 마이클 패더스의 Working Effectively with legacy code라는 글에 이렇게 정의되어있다.

"The main thing that distinguishes legacy code from non-legacy code is test, or rather a lack of tests, "

 

즉 레거시 코드란 테스트가 불가능하거나 기능이 정상적이지 않거나, 난해한(가독성이 떨어지는) 코드를 의미한다.

 

 

1. 코드의 수정이 어렵다.

 -> 단위 테스트가 되어 있지 않기 때문에 한 기능을 수정하면 이 영향이 어디까지의 미칠지(Side Effect)를 예상하기 어렵다. -> 프로그램을 추가할 때 예외적인 상황이 많이 발생하거나, 단순 수정으로 인해 시스템이 문제가 될 수 있다.

 

2. 코드를 이해하기 어렵다.

 -> 코드의 리팩터링이 되어 있지 않다. 기능에 추가 개발이 되어야 하는 상황인데 땜빵 코드(임시)로 스파게티 코드로 짜는 경우가 대다수이고, 그 외 불필요한 기능이나 추가로 예외상황이 생기는 경우, 사용만 안 하고 남기는 경우.

 -> 코드의 흐름이 파악하기 어려운 형태로 작업되어있는 경우 -> 코드의 결합도가 너무 높고 종속적인 경우

 

 

★ 레거시 코드를 좋은 코드로 변경하는 방법은 다음과 같다.

 

 

변경 지점 식별 -> 테스트 지점 찾기 ->의존관계 깨기 -> 테스트 루틴 작성 -> 변경 후 리팩터링

 

반응형

 

1. 변경 지점 식별

변경시킬 지점을 알기 위해서는 대상 프로그램의 전체적인 아키텍처를 보아야 한다. 노트/스케치나 스크래치 리팩터링 기법과 같은 방법을 통해 변경해야 할 지점을 식별하자.

 

2. 테스트 지점 찾기

리팩터링이 필요한 부분을 찾았다면 이제 어느 부분에 테스트 루틴을 작성할 것인지 결정해야 한다이를 위한 가장 간단한 판단 기준은 모든 메서드에 대해 테스트를 수행하는 것이다또한각 메서드들이 의존관계를 이루는 묶음끼리도 테스트가 필요한데이를 위해 의존관계를 최소화시키는 것이 중요하다.

 

3. 의존관계 깨기

코드에서의 의존관계는 다른 클래스나 인터페이스에 방향성을 가지고 의지하는 코드를 의미한다예를 들어 클래스에서 클래스에 있는 메서드를 호출하는 상황을 가정해 보자이때 클래스가 변경되었다고 해서 클래스까지 변경될 필요는 없다이를 클래스가 클래스에 의존하고 있다고 말한다.

 

이러한 의존관계는 상황별 & 종류별로 매우 다양하며 이를 해소하기 위한 방법도 각양각색이다기본적으로 의존관계란 코드의 유지 보수성을 떨어트리기 때문에의존관계를 최소화시키는 것이 중요하다각 상황별 의존관계 해소 방법을 알고 싶다면, 책으로 출간된 마이클 패더스의 Working Effectively with Legacy Code를 읽어보기 바란다.

 

Working Effectively With Legacy Code작가 Michael작가Michael Feathers출판 PrenticeHall발매 2004.09.16.

 

 

4. 테스트 루틴 작성

테스트 루틴을 작성할 때에는 코드의 동작을 이해하는 데 필요하다고 느끼는 만큼의 사례를 작성해야 한다기능을 추출하거나 이동시키려 한다면 사례별로 동작들의 존재 여부와 연결을 검증할 수 있는 테스트 루틴을 작성한다이동시키고자 하는 코드를 수행하는지와 그 코드가 적절히 연결되었는지를 검증한 후에 변환을 수행하도록 한다.

 

5. 변경 후 리팩 토링

전체적으로 볼 때 리팩터링은 덩치가 큰 메서드를 작은 단위로 쪼개는 것이다이렇게 된다면 코드를 좀 더 이해하기 쉽게 작성할 수 있다또한재사용성을 높일 수 있으며 시스템 안의 다른 영역들에 있는 로직과의 중복을 제거할 수 있다.

 

 

개인적인 견해로는 레거시 코드를 발견하거나 리팩터링을 할 때 한 번에 같이 함께 변경시켜주는 것이 가장 좋고, 시간이 날 때마다 많이 고민하고 좋은 방향으로 수정을 습관화하는 것이 가장 좋다. 언젠간.이라는 생각이 들게 되면 안 할 가능성이 생기기 때문이다.

 

반응형

댓글