2014년 9월 3일 수요일

코드의 중복제거보다 코드의 기능구분이 우선되야한다.

비교적 최근에 Clean Code를 읽었다. 이 책은 깨끗한 코드를 작성하기 위한 많은 원칙들을 제시하고 있는데, 이 중에 하나가 소프트웨어에서 모든 악의 근원은 코드 중복이라고 말하며 설명하는 DRY원칙(Don’t Repeat Yourself)이다. 코드에서 중복이 존재한다면 이는 한가지 기능단위로 구분할 수 있으니 함수로 추출해서 가독성도 높히고 관리도 쉽게 하라는 요지다. 하지만 저번 주의 경험을 통해 코드 중복을 제거할 시 중복되는 코드를 정말 한 개의 기능단위로 정의하고 함수로 추출할 수 있는지에 대한 판단이 동반되어야 한다고 생각하게되었다.
스터디서치 모바일 웹을 만들 때 이야기다. 모바일웹이라도 같은 서비스이다보니 기존의 데스크탑 웹과 동일한 자원과 유저 플로우를 이용하게 된다. 따라서 우리는 모바일 웹을 개발할 때 빠르게 개발하기 위해서 모바일 웹이 데스크탑웹과 같은 Django View, View 함수를 사용하게하고, 모바일 웹의 HTML페이지 요청은 html경로에 mobile/만 추가되도록 하였다. 이를 통해 우리는 서버단에서 중복되는 코드 없이 모바일웹을 작성할 수 있었다.
하지만 저번 주에 한가지 문제가 발생했다. 데스크탑 웹을 리뉴얼하면서 회원가입 페이지를 모달로 띄워주기로 결정하였고, 따라서 데스크탑 웹에서는 회원가입 페이지를 보여주기 위한 View 함수가 필요 없어지게 되었다. 순간 모바일웹의 존재를 잊어버린 나는 그 View 함수를 지워버렸고, 그 상태에서 릴리즈하여 내가 12시간 뒤 ‘아차’ 할 때까지 같은 View 함수를 사용하던 모바일웹에선 회원가입페이지를 볼 수 없었다.
실제로 모바일 웹을 제공함에 있어 데스크탑 웹에서 사용하던 View를 거의 그대로 이용해도 될만큼 동일한 기능들이 대부분이다. 따라서 회원가입 페이지를 보여주는 함수의 기능단위를 “회원가입에 필요한 페이지를 보여주는 함수"라고 정의해도 큰 문제가 없을 수 있다. 하지만 좀 더 좋은 디자인은 "모바일웹에서 회원가입 페이지를 보여주는” 함수와 “데스크탑웹에서 회원가입 페이지를 보여주는” 함수를 분리하고, 그 함수들의 같은, 혹은 중복된 부분의 코드를 함수로 추출해 두 개의 함수에서 호출하는 디자인일 것이다. 이와 같이 기능단위를 어떻게 구분할 지 결정하는 것은 많은 노련미가 필요할 것 같고, 아마 Clean Code 저자분들은 너무 당연한 이야기라 적어두지 않았나 싶다.

댓글 없음:

댓글 쓰기