Categories
미분류

엑스플랜트 기술 스택을 소개합니다

엑스플랜트에서는 어떤 기술을 사용하여 대량의 상품 등록과 고객들의 주문을 처리하고 있을까요?

엑스플랜트는 다육식물, 관엽식물 등 다양한 식물을 판매하는 플랫폼으로 2022년 2월 현재 누적 상품 900만 건, 월 평균 방문자 수 150만 명의 대량 트래픽이 발생하고 있습니다. 대량의 트래픽이 몰리는 만큼 고가용성을 유지하고 서비스를 효율적으로 운영하기 위해 수 년에 걸쳐 많은 기술들이 시스템에 적용되어 있습니다.

엑스플랜트에서는 이러한 기술이 실제로 어떻게 사용되고 있는지 간략하게 소개해드리고자 합니다.

프로그래밍 언어 / 프레임워크

백엔드는 대부분 PHP라라벨 프레임워크(Laravel Framework)로 작성되어 있습니다. PHP는 꽤 오랜 기간 동안 웹 사이트에서 널리 이용되는 인기 있는 언어이고, 2022년 W3테크(W3techs)의 조사에 따르면, PHP는 전 세계 모든 웹사이트의 77%에서 사용되고 있다고 합니다.

W3tech ‘202년 가장 인기 있는 서버사이드 프로그래밍 언어’

엑스플랜트의 초기 서비스는 레거시 PHP로 개발이 되었는데요, 기능 개발이 필요할 때 마다 모든 부분을 개발자가 일일이 코드를 작성해야 해서 효율적이지 못하다는 단점이 있었습니다. 최근에는 서비스의 고도화를 위해 라라벨 프레임워크를 도입하였고 앞으로 엑스플랜트에 추가되는 대부분의 기능은 라라벨 프레임워크 기반의 백엔드 API로 개발되고 있습니다.

post-thumbnail

라라벨 프레임워크는 Eloquent ORM이라는 훌륭한 ORM을 제공하며, 모델을 중심으로 다양한 비즈니스 로직 작성이 용이합니다. 다른 개발자가 만든 패키지를 설치하여 기능을 빠르게 구현할 수도 있습니다.

스토리지

판매자가 업로드한 상품 이미지와 컨텐츠를 안전하고 빠르게 처리하기 위해 엑스플랜트는 대용량의 스토리지도 갖추고 있습니다. 스토리지는 장애와 데이터 유실에 대비하여 이중화되어 있으며, 중요 데이터는 실시간으로 백업되고 있습니다.

엑스플랜트의 스토리지 서버는 자동 썸네일 생성 기능도 갖추고 있는데요, 상품 리스트를 조회하는 경우 리스트에 원본 이미지를 그대로 사용한다면 로딩 속도에 영향을 미칠 뿐만 아니라, 트래픽 비용도 증가하게 됩니다.

상품 등록 시 썸네일을 미리 만들어두어도 되겠지만, 그렇게 하면 UI에서 요구하는 이미지 사이즈와 일치하지 않는 경우 이미지가 흐리게 나오거나 깨져 나올 수 있겠죠? 이처럼 서비스를 만들다 보면 이미지를 UI에 맞는 다양한 형태로 변환할 필요가 있습니다.

이러한 문제를 해결하기 위해 엑스플랜트에서는 이미지로 트래픽이 유입되는 경우 지정한 크기에 맞게 모든 썸네일이 자동 생성되는 온디맨드 이미지 리사이징 기능을 갖추고 있습니다. 많은 기업에서 온디맨드 썸네일 기능을 AWS의 Lambda로 제공하고 있는데요, 엑스플랜트에서는 외부 클라우드 서비스의 도움 없이 이 부분을 자체 개발하여 트래픽 비용은 낮추면서도 서버 비용도 낮춘, 두 마리 토끼를 모두 잡을 수 있었습니다.

데이터베이스

MySQL - 나무위키
Redis의 개념 - 박성진 기술 블로그

데이터베이스로 MySQL, SphinxSearch, Redis 등을 주로 활용하고 있습니다. 기능 구현 시 특별한 요구사항이 없다면 관계형 데이터베이스인 MySQL을 주로 사용하고 있는데요, 캐싱이나 실시간 통계 기능 등 DB 부하가 많이 걸리는 부분에는 Redis를 활용하고 있습니다.

또한 수 많은 상품의 검색결과를 빠르고 정확하게 제공하기 위해 검색엔진으로 Sphinx Search를 이용하고 있습니다. 수백만 건의 데이터를 MySQL Like 절을 이용하여 검색하게 되면 당연히 매우 긴 시간이 소요되기 때문에 상품 검색에는 적합하지 않습니다. Sphinx Search는 형태소 분석기, 색인(Index), 검색 기능을 제공하고 있는데요, MySQL과 유사한 SQL 질의로 인덱싱된 데이터를 빠르게 검색할 수 있습니다.

또한, DB는 별도의 replicate 서버를 여러 대 두고 있습니다. 부하가 많이 발생되는 SQL 질의는 Slave 서버에서 처리하고, 주문, 결제 등 정합성이 요구되는 기능은 Master 서버에서 처리합니다. 이렇게 하면 DBMS의 부하를 분산할 수 있기 때문에 트래픽이 몰리는 시간대에도 안정적인 서비스를 제공할 수 있습니다.

장애 모니터링

서비스에는 장애가 언제든지 발생할 수 있습니다. 물론 기능 개발 시 장애가 발생하지 않도록 개발자가 신경쓰는 것도 중요하지만, 현재 발생하고 있는 장애 요인들을 사전에 파악하여 예방하는 것도 중요합니다.

엑스플랜트에서는 장애 모니터링을 위해 애플리케이션 로그와 인프라 로그를 활용하고 있는데요 애플리케이션에서 Exception이 발생하거나 DBMS에서 슬로우 쿼리 등 장애 이상징후 관련 로그가 발생하면 실시간으로 메신저 알림을 받을 수 있는 기능을 개발하였습니다. 개발자는 실시간 알림을 통해 서비스 이상징후를 사전에 파악하여 조치할 수 있습니다.

또한, 주문 발생 시 고객의 주문이 실패하는 경우도 전부 모니터링하고 있습니다. 엑스플랜트는 신용카드, 무통장 결제 뿐만 아니라 네이버페이, 카카오페이 등 다양한 간편결제 수단도 제공하는데요, 간편결제 서비스 장애 등 외부적인 요인으로 서비스 장애가 발생하는 경우도 파악하기 위함입니다.

개발 인프라

옛 말에 ‘장인은 도구를 가리지 않는다’라는 이야기가 있습니다. 물론 메모장이나 Vim 에디터로도 개발을 못하는 것은 아닙니다. 한 땀 한 땀 장인정신으로 코드를 작성하는 개발자가 실력 있는 개발자로 추앙받았던 시절이 있었습니다. 코드 한 줄을 작성할 때 ‘어떻게 하면 시스템 리소스를 덜 소모할까?’라는 고민을 하며 최적화에 힘썼습니다.

하지만 과거와는 달리 현재의 웹 서비스는 많은 부분이 고도화되고 개발자 인건비의 상승으로 이전보다 빠른 생산성이 요구되고 있습니다. 따라서 개발 인프라에도 통합개발환경, 버전관리 등 강력한 도구를 갖출 필요성이 제기되었습니다.

PHPSTORM에서 단축키로 phpunit 실행하기

엑스플랜트에서는 통합개발환경(IDE)로 PHPStorm을 사용하고 있으며, Git으로 버전관리를 하고 있습니다. 그리고 모든 업무내용은 노션(Notion)을 이용하여 공유하고 있습니다.

PHPStorm은 JetBrains사에서 개발한 PHP용 통합개발환경으로 이클립스(Eclipse)나 넷빈즈(Netbeans)보다 여러 면에서 뛰어나다고 평가되고 있습니다. 강력한 메서드, 클래스 추적 및 자동완성 기능과 강력한 플러그인들은 개발자가 코드 작성시 받는 스트레스를 줄여주고 비즈니스 로직 구현에 좀 더 집중할 수 있게 도와줍니다.

git-flow_overall_graph

또한, 서비스 코드는 모두 Git으로 관리되고 있습니다. 서비스 개발을 위해 치열하게 고민한 흔적은 다음 기능을 개발할 좋은 참고자료가 됩니다. 엑스플랜트에서는 GitFlow라는 전략을 도입하여 브랜치를 관리하고 있습니다.

이상 개발자 분들을 위한 엑스플랜트 기술스택에 대한 설명을 마치도록 하겠습니다.

엑스플랜트 개발팀에 관심이 있는 개발자분들은 채용정보를 클릭해주세요. 🙂