
플루타르코스가 전하는 테세우스의 배 이야기가 있다. 아테네인들은 테세우스가 타고 돌아온 배를 수백 년간 보존했다. 낡은 판자가 썩으면 새 판자로 바꾸고, 또 바꿨다.
원래 판자가 하나도 남지 않았을 때 철학자들은 물었다. 이게 여전히 테세우스의 배인가?
소프트웨어 엔지니어링에도 이 역설과 같은 패턴이 있다. 교살무화과(Strangler Fig) 패턴이라 불린다.
교살무화과는 숙주 나무를 감싸며 자라다 끝내 그 나무를 대체하는 열대 식물이다. 레거시를 조금씩 바꿔 나가는 전략이 그와 닮아서 마틴 파울러가 2004년에 이 이름을 붙였다. 나는 이 패턴을 볼 때마다 테세우스의 배가 먼저 떠오른다.
내가 있는 스타트업에도 이 배가 한 척 있다. 처음에는 Django 모놀리스였고, 모든 기능이 하나의 코드베이스에 들어 있었다.
MSA로 전환하면서 기능을 하나씩 떼어냈고, Django는 요청을 각 서비스로 보내 주는 프록시가 됐다. 판자를 하나씩 바꾼 셈이다. 그리고 지금, 그 프록시마저 Spring WebFlux로 바꾸는 작업이 시작됐다. 마지막 남은 판자다.
이 교체가 끝나면 Django 코드는 한 줄도 남지 않는다. 같은 이름이고 같은 사용자가 같은 요청을 보내지만 처음의 코드는 한 줄도 없다. 그러면 테세우스의 배와 같은 질문을 하게 된다. 이건 같은 서비스인가?
나는 같은 배라고 생각한다. 판자가 하나씩 나무에서 철로 바뀌어 가더라도, 같은 바다를 건너 같은 항구에 같은 사람들을 내려 주고 있다면 그 배는 처음 떠난 배와 다르지 않다.
소프트웨어에서 정체성은 코드가 아니라 계약에 있다. 같은 사용자가 같은 요청을 보내고 같은 응답을 받는 한 같은 서비스다. 코드는 그 계약을 잠시 떠받치는 판자다.
판자를 바꾸는 일은 같은 계약을 더 빠르게, 또는 더 먼 바다까지 데려가는 일이기도 하다. 낡은 판자로는 거기까지 못 간다.
다만 스타트업에서는 배만 바뀌는 게 아니다. 배를 젓는 우리도 계속 바뀐다. 맡은 역할이 바뀌고, 쓰는 언어가 바뀌고, 일하는 방식이 바뀐다.
바뀌지 않는 것은 같은 사용자에게 같은 것을 약속한다는 목적 하나다. 그 목적을 지키려고 우리는 판자를 바꾸듯 스스로를 바꾸는 쪽을 고른다. 그게 우리가 계속 판자를 바꾸고 같은 질문을 하는 이유다.