PHP는 안녕. typescript로의 언어 전환
2020년 06월 02일

PHP

그동안 제가 회사를 다니며 사용했던 언어는 PHP였습니다. 물론 첫 회사에서 쓸 때보다는 더 고도화된 코드 베이스에서 개발하긴 했지만 어쨋든 PHP는 PHP입니다.

아시다시피 PHP라는 언어가 좋은 언어라고는 할 수 없습니다. 하지만 그러한 이유 때문에 다른 언어로 바꾸기에는 몇년 동안 따라오던 기존 레거시 코드와 컨벤션이 너무 많아 굳이 바꿀 엄두를 내지 못했습니다.

그러던 와중 더 큰 바꿀 이유를 느끼게된 계기는 생태계입니다. 현재 기준으로 라이브러리 생태계가 가장 활발한 곳은 node.js 진영의 npm인데 그에 비해 PHP 진영은 composer가 있긴 하지만 npm에 비해 부실하고 사내 베이스에서는 사용하지 않고 있었습니다. 또한 phpexcel, mongodb등 직접 구현하긴 사이즈가 크고 충분히 있을 법한 라이브러리의 상태가 좋지 않고 업데이트도 잘 안되는 등 불편 사항이 많았습니다.

또한 언어, 프레임워크 자체의 한계도 있었습니다. PHP는 DB 커넥션풀이 지원되지 않고. foreach 관련 버그도 고쳐지지 않았습니다.

PHP :: Bug #29992 :: foreach by reference corrupts the array

<?php // foreach를 "&" 레퍼런스를 통회 조회 후 어레이 값이 변하는 이슈 $array = array(1,2,3); foreach( $array as &$item ) { } print_r( $array ); foreach( $array as $item ) { } print_r( $array ); /* Expected result: ---------------- Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 1 [1] => 2 [2] => 3 ) Actual result: -------------- Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 1 [1] => 2 [2] => 2 ) */ ?>

나름 rails의 스캐폴딩, 단위테스트를 도입하는 등 기존의 컨벤션을 유지하며 코드 베이스의 퀄리티를 고도화 시키려 했으나 한계점에 도달한 것 같다고 느꼈습니다. 위 케이스 등 그냥 넘어갔었던 점들을 다시 곱씹어서 생각해보니 불편했던 점들이 은근히 많았습니다.

Static Langauge

더 큰 관점으로 보자면 dynamic langauge에서 static language로 시선이 변하기 시작했는데, 팀 인원이 소수 일때는 dynamic language의 편리함 + 잘 지켜지는 컨벤션으로 큰 생산성을 얻을 수 있었지만, 인원이 증가할 수록 이 컨벤션을 관리하는 것이 점점 힘들어집니다. 기존의 컨벤션을 수정하면 그것을 전파하는 것도 힘이 들고, 새로운 인원이 합류할 시 그 컨벤션을 교육시키는 것도 일입니다. 그래서 이러한 것을 문서화하려는 시도도 해보았지만, 그렇게 되면 문서화하는 인력에 또한 로드가 걸리게 됩니다. 결국 코드에 금이 가기 시작할 수 밖에 없고(깨진 유리창 이론) 코드의 퀄리티를 다시 높이기 위한 고민을 항상 하고는 있었습니다.

그러던 와중 Flutter를 도입하기 위해 dart language 스터디를 하면서 타입 언어의 장점을 알게 되었습니다. 언급했던 컨벤션 등을 따로 관리할 필요 없이 코드 내에 정의해서 녹여낼 수 있기 때문입니다.

Node.js 플랫폼 전환

이러한 점들을 기존의 시스템 코드에 도입할 수 없을까 고민하고 리서치한 결과, 19년 7월부터 약 3개월간 기존의 PHP 베이스 코드를 node.js/typescript 마이그레이션하는 계획을 수립하게 되었습니다. 그러나 이 때 무렵 레드데이즈 프로젝트의 프리오더 시스템 도입으로 업무량이 많아 결국 전면 도입은 하지 못하고 일부 서비스만 분리하여 express 기반으로 구축하였습니다.