피플펀드와 함께하기 시작한 이후 항상 마음속에 품고 있었지만, 매일같이 발생하는 특급 이슈들을 처리하며 후순위로 밀려나기만 했던 목표가 하나 있었다. 그것은 다름아닌 기술블로그. ‘발전’과 ‘공유’라는 단어들을 좋아하지만, 이를 실천하는 것은 쉽지 않았다. 아무튼 2017년이 되었으니, 일단 하나라도 해보자는 마음가짐으로 글을 준비하기 시작했다. 가볍게 시작해보면 좋을 것 같아 준비한 소재는 Python 라이브러리인 FreezeGun이다.

처음 회사에 출근한 이후 항상 마음 한 켠에 자리잡고 있는 불편함이 있었다. 테스트 코드가 단 한 줄도 없었다는 점이다. 테스트 코드라는 것이 프로젝트를 시작할 때부터 만들지 않으면 나중에 추가하기가 정말 힘든 법이다. 특히나 서비스를 오픈하고 성장하기 위해 앞만보고 달려가는 스타트업에서는 더욱 힘들다. 그러나 점차 커져가는 시스템을 바라보며 아쉬움만 가지고 있다가는 언젠가 문제가 터질 것만 같았다. 어떻게든 시작해보자는 마음가짐으로 없는 시간을 쪼개어 조그마한 유틸리티들부터 테스트 코드를 하나씩 추가하기 시작했다. 그러던 중에 담보채권이라는 카테고리의 상품을 내놓게 되었다. 이 상품은 비즈니스적인 이슈로 인해 기존의 시스템과 분리되어 운영될 필요성이 있었고, 개발팀 내에서 의논한 결과 기존의 개인신용대출채권 상품에서 제공하는 것과 거의 유사한 형태를 가진 별도의 모듈을 개발하기로 했다. 그리고 이 때다 싶어 얼른 테스트코드부터 만들기 시작했다.

피플펀드 서비스의 백엔드 시스템을 개발하는데 사용된 DjangoPython의 unittest 모듈을 감싸둔 Django 내부의 test 모듈을 제공한다. 매뉴얼을 한 번만 따라해보면 금세 테스트 코드를 만들어볼 수 있다. 그러나 문제는 우리의 비즈니스 로직이었다. 피플펀드에서 취급하는 상품은 ‘채권’인데, 이는 일정 기간동안 내가 투자한 돈을 매월 투자한 금액의 일부와 함께 이자를 받아가는 식으로 수익을 볼 수 있는 상품이다. 상품의 종류에 따라 구조의 차이가 있지만, 여기서 중요한 점은 1개월 후 혹은 1년 후, 심지어 4년 후에 완료될 수도 있는 정말 긴 프로세스라는 점이다. 더군다나 어떤 날짜에 발행된 채권인지에 따라 이자와 세금 계산이 달라지기 때문에 투자자는 동일한 금액을 투자했어도 각기 조금씩 다른 수익을 볼 수도 있다. 채권의 발행까지는 테스트 코드를 만들 수 있었지만, 다음 달에 상환되는 금액과 정산처리를 테스트해보는 것이 막막했다. 이래저래 고민하다가 검색을 해보기 시작했고, 그렇게 찾아낸 라이브러리가 서두에서 언급했던 FreezeGun이라는 라이브러리였다.

FreezeGun은 사용법이 매우 간단하다. FreezeGun의 Github 저장소를 방문해서 README 파일을 읽는데 5분만 투자하면 사용하는데 전혀 무리가 없다는 사실을 알 수 있다. 한 줄 설명으로 “시간을 여행하며 Python 테스트를 해보세요!”라고 적혀있는데, 정확히 말 그대로 시간을 여행할 수 있도록 만들어준다. 특정 날짜를 지정해주면 Python의 datetime 모듈을 사용했을 때 지정한 날짜가 반환되도록 만들어주는 기능을 제공함으로써 테스트 코드가 진행되는 도중 시간여행을 할 수 있도록 도와주는 것이다.

freezegun.freeze_time 함수를 호출하면 내부적으로 Python의 datetime 모듈을 override해둠으로써, datetime.datetime.now와 같은 함수를 호출했을 때 내가 지정한 날짜를 돌려주도록 만드는 간단한 아이디어로 구현되어 있다.

이 라이브러리 덕분에 시간이 지남에 따라 채권에 투자한 금액을 상환받는 특수한 로직을 수월하게 검증해볼 수 있었다. 테스트 커버리지를 더 높이기 위해 아직 고군분투하고 있지만, 하루에도 수 차례에 걸쳐 몇 년씩 미래로 갔다가 돌아오는 테스트 코드를 볼 때면 내가 타임머신을 탄 마냥 신기하기만 하다.