pile·
백엔드·마켓컬리마켓컬리 Hello World·

컬리의 PHP 개발 이야기

PHP가 나쁜 코드와 함께 평가절하된 배경을 돌아보고, 컬리가 레거시 PHP를 현대적인 개발·운영 방식으로 전환하려던 기술 방향을 설명한다. Laravel, 테스트, CI/CD, Docker를 기본 축으로 삼고 Spring Cloud Netflix 기반 MSA에 비 Java 서비스가 참여하도록 Sidecar와 보완 라이브러리를 검토했다. PHP를 버리는 대신 오픈소스 생태계의 변화와 함께 품질 기준을 높이려는 계획이다.

핵심 포인트
  • PHP는 진입 장벽이 낮고 오래된 저품질 예제가 많이 퍼져 언어 자체가 나쁘다는 인상을 얻었지만, 생태계는 PSR·Composer·PHP 7로 변화했다.
  • 신규 서비스는 Laravel을 기본으로 삼고 기존 레거시는 단순 복제가 아니라 테스트 가능한 클린 코드로 교체하려 했다.
  • 개발·배포 기반으로 Testing, CI, CD를 구축하고 Docker 활용을 높였으며 Kubernetes도 기술 검토했다.
  • Java 중심 Spring Cloud Netflix에 PHP를 연결하기 위해 Spring Cloud Sidecar를 사용해 MSA 참여 경로를 만들었다.
  • 회로 차단, 분산 추적, 인증 기능의 빈틈을 phystrix, Zipkin PHP, Kafka, OAuth2 호환 라이브러리로 채우려 했다.
상세 정리
  • 문제 인식: 채용 시장에서는 개발 역량보다 언어가 먼저 평가되는 경우가 있고, PHP 개발자와 코드에 대한 부정적 인식도 강했다.
  • 생태계 배경: PHP는 시작하기 쉬워 사용자가 빠르게 늘었다. 20년 넘게 축적된 튜토리얼과 답변에는 좋은 코드뿐 아니라 빠르고 지저분한 예제도 대량으로 남았다.
  • 품질 전환: PHP 커뮤니티는 이 상태에 머물지 않았다. 코딩 규약인 PSR, 의존성 관리 도구 Composer, PHP 7 등의 등장으로 현대적 개발 방식이 자리 잡기 시작했다.
  • 레거시 정책: 컬리의 초기 성장에는 PHP 쇼핑몰 솔루션이 크게 기여했다. 다만 기존 코드를 그대로 연장하지 않고 필요한 영역을 새 코드로 점진 교체하는 방향을 택했다.
  • 프레임워크 선택: 새 서비스는 Full Stack Framework인 Laravel을 기본으로 한다. 목표는 프레임워크 도입 자체가 아니라 개발과 유지보수가 쉬운 코드 구조다.
  • 품질 자동화: 사내에서 테스트 체계와 CI, CD를 만들고 있었다. 개발 환경과 배포 과정에는 Docker를 적극 사용해 실행 환경 차이를 줄이려 했다.
  • 인프라 확장: 컨테이너 운영의 다음 단계로 Kubernetes를 검토했다. 글 시점에는 완성 사례가 아니라 기술 방향과 진행 중인 준비를 공개한 상태다.
  • MSA 참여: 사내 MSA가 Spring Cloud Netflix 중심이라 PHP 같은 비 Java 서비스가 직접 결합하기 어렵다는 제약이 있었다.
  • Sidecar 전략: Spring Cloud Sidecar를 통해 PHP 서비스도 서비스 디스커버리와 클라우드 구성에 참여하도록 설계했다. 관련 사례가 적지만 시도할 가치가 있다고 판단했다.
  • 회로 차단: PHP에는 Spring Cloud의 Circuit Breaker와 같은 기능이 없어 Hystrix 개념을 구현한 phystrix를 적용할 계획이었다.
  • 추적·모니터링: openzipkin의 zipkin-php와 Kafka를 이용해 트랜잭션 데이터를 수집하고 서비스 간 흐름을 관찰하려 했다.
  • 인증 통합: Spring Cloud Security의 OAuth2 규격과 맞는 PHP 라이브러리도 제작 중이었다.
  • 오픈소스 환류: 내부 구현이 완성되고 외부에서도 의미 있다고 판단되면 Spring Cloud Netflix와 PHP를 연결한 결과물을 공개할 계획을 세웠다.
  • 결론: 언어를 교체하는 것만으로 품질 문제가 해결되지는 않는다. 표준·테스트·배포 자동화·관측·분산 시스템 통합을 함께 개선해야 레거시가 현대화된다.
왜 읽나PHP 레거시를 유지하면서도 프레임워크·배포·MSA·관측 체계를 현대화하려는 백엔드 팀이 전환 범위를 잡는 데 참고할 만하다.
마켓컬리
마켓컬리 Hello World 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·github-engGitHub Engineering·

    조기 종료를 없애야 벡터화된다 — 메모리 속도 소스 코드 케이스 폴딩

    GitHub의 코드 검색 엔진 Blackbird는 480TB 이상의 소스 코드를 인덱싱하기 전 모든 바이트에 case folding을 적용한다. 이 글은 Rust로 구현한 case folding을 메모리 대역폭 한계(45+ GiB/s)까지 끌어올린 두 가지 반직관적 최적화를 상세히 다룬다. 핵심은 루프 조기 종료(break) 제거로 LLVM 벡터화를 유도하고, UTF-8을 디코딩하지 않고 바이트 공간 산술만으로 fold를 수행하는 것이다.

    #rust#unicode#simd+2
  2. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    트랜잭션 스크립트에서 숙소 메타 + 가격 계산 모듈로 — 전시 아키텍처 개선기 (2/3)

    여기어때 전시개발팀이 숙소 상세(PDP) API를 해부한 결과, 코드상으로는 DB 호출 3번처럼 보이던 요청이 실제로는 MongoDB $lookup 체인으로 컬렉션을 19회 접근하는 구조였다. 이 트랜잭션 스크립트 방식의 핵심 문제는 "aggregation이 I/O를 가린다"는 점으로, 독립적인 쿼리 10개가 단일 파이프라인에 직렬화되어 병렬화 기회를 잃고, 가격 때문에 거의 안 바뀌는 이미지까지 매 요청마다 읽어야 하는 읽기 증폭이 발생했다. V3에서는 "조회 시점 조립"을 "쓰기 시점 사전 조립"으로 전환하고, 화면별로 복제되던 가격 계산 로직을 goodsprice 단일 모듈로 수렴했다. 4개 API(PLP/PDP/RDP/ILP)의 반복 마이그레이션은 Claude Code skill로 절차를 고정하고 쉐도잉 + 동일성 검증으로 안전망을 마련하는 방식으로 진행됐다.

    #architecture#migration#caching+2