들어가며

혹시 개발할 때 test data를 만드시나요?

저는 개발 단계에서 DB 설계 점검, 데이터 정규화, 페이징 및 성능 확인등의 이유로 test data를 많이 생성하며 그럴때 PHP Faker 패키지를 매우 유용하게 썼고 Modern PHP User Group 과 slideshare 에 처음 올린 글도 PHP Faker 에 대한 글이었습니다.


패키징의 달인인 Laravel Framework 에서도 Model Factory 나 Data Seeding PHP Faker 패키지를 래핑해서 기능을 제공하고 있고 사실 저도 라라벨때문에 faker 패키지를 알게됐습니다.


얼마전에  Laravel 프로젝트를 하나 만들고 테스트 데이타를 넣는데 한글 locale 일때 문제가 되는 기능이 있어서 해결 여부를 확인하기 위해 github 에 들어갔다가 PHP Faker 프로젝트가 archived 로 전환된 것을 발견했습니다.


Faker 프로젝트 Founder 는 왜 PHP Faker 프로젝트를 중단했는지 자세하게 설명했고 그것을 보면서 여러 가지 생각이 들었고 저자가 올린 글을 정리해 보았습니다.

중단 사유중에 하나는 PHP Faker 가 탄소를 많이 배출한다는 건데 SW 개발의 탄소 배출에 대해서 그동안 한번도 생각해 보지 못했지만 새로운 시각을 갖게 되었습니다.

laravel 의 코어 개발자인 kampbell 은 faker 를 fork 떠서 FakerPHP 라는 github org 를 만들었고  laravel 8.3.0 부터는 Fakerphp 를 사용하고 있습니다.


PHP Faker 란?

PHP Faker 는 Francois Zaninotto 의 개인 프로젝트에 fake 데이터가 필요해서 2011년 10월에 시작된 프로젝트로 발표하자마자 개발자들의 폭팔적인 호응을 얻었습니다. 

다른 개발자들도 비슷한 요구사항이 있었는지 저자도 놀랄 정도의 호응이었다고 합니다.


특히 Random Text 를 만들기 위한 소스로 루이스 캐롤의 "이상한 나라의 앨리스" 와 플로베르의 "보봐리 부인" 을 사용했고 만족스러운 테스트 데이터로 사실적인 프로토타입을 만들었습니다.

Random Text 를 만드는 알고리즘은 마코프 연쇄 알고리즘(Markov chain algorithm)입니다. 


다른 언어를 쓰는 개발자들도 이에 호응해서 PR을 보냈고 450명 이상의 기여자와 781,313 개의 저장소에서 활용되는 엄청난 오픈소스 프로젝트로 성장했고 저자는 이에 대해 매우 자랑스러워 했지만 다음과 같은 설계 문제가 있었습니다.

우리나라 개발자분이 Faker 용 한국어 로캘을 적용했는데 Random Text 용 소스는 이광수의 "유정" 입니다.


설계 문제

탄소 배출

저는 그동안 전혀 생각하지 못했는데 SW 개발은 많은 전기를 소모하므로 환경 문제를 생각해봐야 하는때인가 봅니다.


PHP Faker 는 테스트 데이터를 생성하는 특성상 locale 에 맞게 수정되어야 하는 프로젝트로 이때문에 70개 이상의 언어를 지원하는 3M 이상 크기의 무거운 라이브러리가 됐습니다.

개발자들은 CI 를 통해 자동화된 테스트를 수행하고 그때마다 CI 서버는 Faker 라이브러리를 다운로드 했고 1억4천백만번 이상 내려받았습니다.


저자는 이 때문에 많은 탄소를 배출했고 기후 변화에 영향을 끼친 것에 대해서 후회하고 있습니다.


대부분의 사람들은 1개의 locale 만 사용하므로 라이브러리의 아주 일부만 필요하지만 다양한 locale 도 라이브러리의 구성 요소이므로 10K 만 필요해도 3M 를 다운로드 해야 합니다.

seeding 문제

또 다른 문제는 데이터 시딩으로 재현 가능한 빌드를 만들기 위해 seed 를 허용하지만 같은 seed 를 사용할 경우 늘 동일한 faker data 가 생성되며 Provider 를 수정하기 어렵게 만든다고 합니다.  (이 부분은 제가 잘 이해를 못했습니다)


저자에게 Faker 프로젝트가 저주(Curse)가 된 이유

무분별한 PR

PHP Faker 의 특성상 각국의 개발자는 언어에 맞게 현지화된 Provider 를 만들거나 개선하는데 이 과정에서 저작권 보호 컨텐츠를 사용한 경우가 있었습니다.

개발자들이 보낸 locale 별 PR 의 컨텐츠를 저자는 알수 없기 때문에 저작권 문제가 있거나 나쁜 데이타도 Merge 를 할 수 밖에 없었고 특정 locale 에만 있는 데이터가 기본 Provider 에 올라오는등 PR 을 처리하느라 큰 고통을 받은 것 같습니다.

고통의 예로 sv_SE 로캘 관련 PR이 있는데 스웨덴은 Ltd, Inc. 같은 Company prefix 외에 Company suffix 란게 있나 봅니다. (sad)


낮은 버스 계수(Bus Factor)

어떤 컴퓨터 과학자가 수천개의 오픈소스 저장소를 분석한 결과 PHP Faker 가 전체 프로젝트중 가장 낮은 버스 지수(Bus Factor) 를 가진 프로젝트라고 알려왔습니다.

즉 전세계에 수많은 contributor 가 있지만 저자는 PR 을 Merge 하는 것 외에는 1년에 작은 변경만 몇 번했다는 의미였습니다.


더는 PHP 사용하지 않음

저자는 5년전부터 PHP 를 한 줄도 작성하지 않았고 오로지 책임감으로 프로젝트를 유지중이었습니다.

더군다나 8년전에 Marmelab라는 회사를 창업하였고 react-admin 이라는 JavaScript 오픈소스의 리드 개발자로 활동했으므로 잘하지도 못하는 PHP 프로젝트를 유지하는데 부담을 느꼈습니다.


이때문에 Faker 프로젝트를 유지보수(저주를 넘겨 받을)할 후임 개발자를 뽑아야 한다고 느꼈습니다.

프로젝트를 중단한 이유

저자는 예전에 PHP 용 오픈 소스 ORM 인 Propel 의 리드 개발자였다가 운영할 시간이 없어서 아는 개발자에게 이를 넘겼고 그 개발자는 훌륭하게 1년을 운영했습니다.

그 개발자도 오픈소스를 유지할 시간이 없어져서 다시 다른 개발자에게 넘겼는데 신규 개발자는 Code base 가 지저분하다고 생각해서 전체 core를 재작성하겠다는 결정을 내렸습니다.


Faker 의 저자는 자주 릴리스하는 코드가 좋은 코드라 주장했지만 이제는 프로젝트의 책임자가 아니었기때문에 별다른 영향을 끼치지 못했습니다.

새로운 개발자는 지저분한 Code base 를 개선하기 위해서 전체를 재작성하기 시작했지만 개선 버전인  2.0 은 6년째 나오지 않았고 Propel 프로젝트는 죽어 버렸습니다.


자기가 열심히 했던 결과물을 타인이 망치는 것을 보는 건 늘 가슴 아픈 일이 됩니다.


PHP Faker 도 code base 를 현대화하기 위해 2명의 새로운 관리자를 초대했지만 저자는 Faker 프로젝트가 재미가 없었고 또 새로운 관리자들과 생각이 달라서 그다지 진전이 없었습니다.


더군다나 PHP 8 지원을 위해 github 에서 논의가 시작됐고 Faker 프로젝트를 새로운 관리자가 있는 조직으로 옮기겠다는 제안을 받았지만 저자에게는 이것이 적대적인 인수처럼 느껴졌고 과거에 크게 기여한 적이 없는 개발자에게 (star) 25,000 짜리 프로젝트를 넘겨주고 싶지는 않았습니다.

프로젝트 이관을 요구한 이는 Laravel 의 코어 멤버이자 싸가지가 없기로 유명한 Campbell 입니다.


저자는 Faker 의 code base 는 PHP 8 에 적합하지 않고 type 시스템을 지원하지 않으므로 프로젝트를 중단하기로 결정했습니다.

단 기존 프로젝트들을 망가트리지 않기 위해 packagist 에서는 계속 사용할 수 있으며 PHP 버전을 업그레이드하지 않는 대신 계속 사용 가능합니다.


저자는 PHP 커뮤니티에서 오픈소스의 장점인 fork 를 떠서 더 새롭고 나은 새로운 Faker 오픈소스를 개발하기를 바라고 있습니다.


PHP Faker 는 Perl 의 Data::Faker, Ruby 의 Faker 에서 영감을 얻어서 시작했지만 지금은 이런 프로젝트보다 훨씬 더 인기가 있으며 Python 의 FakerJS 의 faker.js 같은 유사한 프로젝트를 시작할 수 있도록 도움을 줬다고 합니다.


Ref