Categories
미분류

2022년 회고

다사다난했던 2022년이 지나고 2023년 새해가 밝았습니다.

작년 한 해 동안 엑스플랜트에는 어떤 변화가 있었을까요?

서비스 고도화

2022년에도 엑스플랜트의 많은 부분 개선이 있었습니다.

기존 영카트로 운영되고 있던 낡은 상품관리자를 라라벨로 완전히 교체하였습니다.

가장 눈에 띄는 부분은 서비스에 ‘큐(Queue)‘ 시스템을 도입했다는 것인데요,

큐란, 특정 작업을 원하는 타이밍에 백그라운드로 처리할 수 있는 기능입니다.

기존 레거시 시스템에서는 비동기 작업을 처리할 때 크론탭이라는 원시적인 방법을 사용하여 대기열에 작업이 쌓이면 처리 속도가 늦어지거나, 작업이 끝날 때 까지 애플리케이션 작동이 멈추는 치명적인 단점이 있었는데요, 

이번 큐 도입으로 인해 사용자에게 보다 빠른 서비스를 제공할 수 있게 되었습니다.

특히, 상품등록 시 업로드한 이미지와 동영상을 처리하는 부분에 큐를 적용함으로서 입점사 사장님들께서 보다 빠르게 상품을 등록하고 본연의 업무에 집중할 수 있게 되었습니다.

이외에도 해외수출을 위한 해외배송비 정책 설정기능과 본인인증시스템을 라라벨로 개발하였고, Event & Listener도 도입하여 기능간의 결합도를 낮추는 작업도 함께 진행하였습니다.
(보안상 밝히기는 어렵지만, 그 외에도 많은 부분이 모던하게 바뀌었습니다.)

이렇게 환경을 갖추어 둔 덕분인지 작년 말에 팀에 새로 합류한 주니어분도 자연스럽게 라라벨 기반에서 기능개발을 진행하고 계시답니다. (뿌듯)

배포자동화 시스템 도입

기존에는 작업한 코드를 실 서비스에 배포할 때 FTP 업로드 방식을 사용하였습니다. (매우 낡은 방식)

이렇게 배포하다보니 배포 도중 실수가 발생하기도 하고, 배포가 제대로 되었는지도 확실하지 않고, 불필요한 파일들이 정리되지 않는 등 여러가지 이슈가 발생하였습니다.

개발자가 배포하는데 귀한 시간을 낭비하여 (개발자 시급이 얼만데!) 기능 개발에 집중하지 못해 업무 효율성이 떨어지는 문제도 발생했습니다.

이를 개선하고자 코드 배포시 Jenkins라는 CI/CD 툴을 도입하였고, Git에 merge만 되면 이를 Jenkins가 감지하여 자동으로 변경된 부분만을 서버에 반영하도록 구성하였습니다.

이제 엑스플랜트 개발팀 구성원은 더 이상 코드 배포에 스트레스 받지 않고 온전히 본연의 기능 구현에만 집중할 수 있게 되었습니다.

간편결제시스템 도입

드디어 엑스플랜트에도 카카오페이, 네이버페이, 페이팔 결제를 지원하게 되었습니다.

간편결제가 시장에 활성화된지 꽤 오랜시간이 지났지만 뒤늦게나마 간편결제를 지원하게 되어 다행이라고 생각합니다.

또한, 해외 고객에게도 기존의 불편한 신용카드 결제 방식이 아닌 페이팔 결제를 지원하게 됨으로서, 해외 매출 향상에도 큰 기여를 할 수 있게 되었습니다. (페이팔 결제연동은 저희팀 주니어분이 고생해주셨습니다)

뿐만 아니라, 타사에서 지원하는 ‘브랜드페이’를 지원하게 되었다는 점인데요,

쿠팡이나 배달의민족 앱에서 카드를 등록하기만 하면 클릭 한번에 자동결제가 이루어지는 것처럼, 엑스플랜트에도 자체 페이인 ‘엑스페이’를 지원하게 되었습니다.
(이 부분도 저희팀 에이스인 주니어님이 멋지게 연동해주셨습니다)

이외에도 많은 기능을 개발하고, 개선하였습니다.

2023년 올해에도 파이팅 넘치는 한해가 되기를 소망합니다.

.

.

엑스플랜트 개발팀은 상시 채용을 진행중이니 관심이 있으신 분들은 부담없이 지원을 부탁드립니다!

채용공고 바로가기

감사합니다.

Categories
미분류

엑스플랜트가 최신 프로토콜인 HTTP/3을 도입합니다.

엑스플랜트를 이용해주시는 고객 여러분께 좀 더 나은 서비스 경험을 제공하기 위해 엑스플랜트는 최신 웹 프로토콜인 HTTP/3를 도입하였습니다. (모바일 엑스플랜트부터)

이를 통해 서비스 성능 향상, 트래픽 절감 등을 기대할 것으로 전망합니다.

HTTP/3는 HTTP 프로토콜의 3번째 major update 버전입니다.

2019년에 발표된 HTTP/3는 기존의 HTTP/1과 HTTP/2가 TCP 프로토콜을 통해 통신하던 것과는 달리 UDP 기반의 QUIC 프로토을 사용하여 통신합니다.

HTTP/3가 기존 버전 대비 가지는 장점은 아래와 같습니다.

  • Zero RTT(Round Trip Time)
  • 패킷 손실에 대한 빠른 대응
  • 클라이언트 IP 변경에도 연결 유지

2022년 12월 14일 현재 HTTP/3를 도입한 국내 웹서비스 플랫폼은 네이버, 토스페이먼츠 정도가 있으며, 해외의 경우 구글, 인스타그램 등이 있습니다.

Categories
미분류

스토리지 마이그레이션 후기

엑스플랜트 서비스에 많은 기능들이 추가되고 이용 고객들이 날로 늘어나다 보니 서버 업그레이드에 대한 소요가 지속적으로 제기되었습니다.

기존에 운영하고 있던 스토리지 서버도 훌륭한 스펙을 갖추고 있었지만 하드웨어의 한계로 원활한 서비스가 어려워지는 문제가 생기게 되었습니다.

그래서 몇 달 전쯤 새로운 스토리지 서버를 추가적으로 도입하였고, 이전까지 성공적으로 마무리하였습니다.

보안상 자세하게 밝힐 수는 없지만 대략적인 과정을 블로그를 통해 공유하고자 합니다.

먼저 기존에 운영하고 있던 스토리지 서버는 다음과 같은 문제를 내포하고 있었습니다.

  • 디스크 I/O 과부하
  • 디스크 공간 부족
  • 비SSD (하드디스크 드라이브)
  • OS 지원 중단

회사가 운영중인 서비스에는 상품 판매를 위한 이미지, 사이즈별 썸네일, 첨부파일 등 자잘한 파일이 수십TB를 이루고 있었습니다.

그리고 모든 서버가 해당 스토리지에 연결되어 하루에도 수십GB 분량의 파일의 입출력이 발생하고 있는 상황이었습니다.

그 상황에서 대용량 SSD가 탑재된 신규 스토리지로 이전 작업을 해야 하는데, 요구조건은 아래와 같습니다.

  • 서버 이전 도중 서비스 부하를 최소한으로 한다.
  • 서버 이전 도중 서비스 중단이 없도록 한다.

서버 이전을 위해 실제로 서비스 중인 서버를 종료하고 수 시간에 걸쳐 데이터를 신규 서버로 복사하고 서버를 재기동하는 방식으로 작업을 진행한다면, 이는 서비스의 중단으로 이어지고 곧 매출에 부정적인 영향을 미칠 수밖에 없습니다.

따라서, 대규모 서비스에서 서버를 업그레이드하거나 이전하는 작업은 무중단 작업이 필수불가결한 부분일 수밖에 없습니다.

절차는 아래와 같습니다.

1. 먼저, 기존 서버에 동작하고 있던 Batch Job이 있다면 먼저 내리도록 합니다.

기존 스토리지 서버에는 더 이상 필요가 없어진 파일을 자동으로 삭제하거나, 자동으로 백업하는 batch job이 있었습니다. 이러한 부분이 있다면 사전에 중단하여 신규 서버 이전 도중 데이터 불일치가 발생할 여지를 최소화 하도록 합니다.

2. 신규 서버로 전체 복제를 1회 실시합니다.

1차적으로 기존 스토리지에 있던 파일을 신규 스토리지 서버로 복사합니다. 복사는 리눅스의 rsync를 사용하였습니다.

$ rsync -aPvz --delete --bwlimit=4096 /복제할소스 사용자명@신규서버주소:/복제할목적지

bwlimit 옵션을 주면 일정 대역폭 이내에서 파일을 전송하게 됩니다. 기존 스토리지가 하드디스크 드라이브였기 때문에 부하를 최소화하기 위함입니다.

만약 rsync 복제가 실패한다면 873번 포트가 허용되어 있는지 확인하고, 차단되어 있다면 이를 허용해주도록 합니다.

$ firewall-cmd --permanent --zone=dmz --add-port 873/tcp
$ firewall-cmd --reload

3. 신규 서버로 증분 / 실시간 동기화를 실시합니다.

rsync로 파일 전체 복제를 1차적으로 마무리 하였더라도 기존 스토리지에는 지속적으로 파일 쓰기/삭제가 발생하고 있기 때문에 결과적으로 기존 스토리지와 신규 스토리지의 데이터는 달라질 수밖에 없습니다.

불일치한 데이터를 맞추기 위해 lsyncd를 활용할 것입니다.

lsyncd는 우리가 흔히 사용하는 원드라이브, 구글드라이브 등의 동기화 프로그램을 PC에 설치하면 PC의 내용을 클라우드 서버로 자동을 전송하는 것처럼 양 서버간의 불일치한 데이터를 동기화 시켜주는 강력한 도구입니다.

lsyncd는 양방향/단방향 동기화가 가능하며, 여기서는 단방향 동기화 설정을 하여 서버 이전작업을 진행할 것입니다.

먼저 기존 스토리지 서버에 lsyncd가 설치되어 있지 않다면 면저 설치해 주도록 합니다. (기존 스토리지 서버가 동기화 서버가 될 것입니다)

$ yum install lsyncd

그리고 /etc/lsyncd.conf 설정파일을 편집하여 아래와 같이 설정해줍니다.

...
sync {
   default.rsync,
   delete=true,     # 원본(소스) 파일이 삭제될 경우 목적지 서버의 파일도 함께 삭제됩니다.
   source="복제할소스디렉토리",
   target="복제할타겟디렉토리::타겟서버rsync공유이름",
   exclude={"제외할디렉토리"},
   rsync = {
    archive = true,
    compress = false,
    whole_file = false
   },
   delay=0
}

 그리고 lsyncd 서비스를 시작해 줍니다.

$ systemctl start lsyncd

동기화 서버 설정이 끝났다면 동기화 클라이언트 (복제 대상 목적지) 설정을 할 차례입니다.

신규 스토리지 서버에서  /etc/rsyncd.conf 를 아래와 같이 설정합니다.

...
[rsync공유이름]
# destination directory
path = /공유할디렉토리
# Hosts you allow to copy (specify source Host)
hosts allow = 허용할IP
use chroot = yes
uid = root
gid = root
read only = false

설정이 완료 되었다면 서비스를 기동합니다.

$ systemctl start rsyncd

이제 lsyncd는 기존 스토리지 서버의 파일과 신규 스토리지 서버의 파일을 서로 비교하여 불일치한 부분만 자동으로 동기화 할 것입니다.

동기화 진행 상황은 로그파일 /var/log/lsyncd.log 에서 확인할 수 있습니다.

(최초에는 양 서버간 불일치 파일을 확인하기 때문에 시간이 오래 걸립니다)

4. 동기화가 맞추어지면, 신규 스토리지 서버로 최종 변경합니다.

3번까지 진행했다면 대부분의 이전 작업은 마무리 된 것입니다.

이제 가장 서비스 이용량이 적은 시간대 (주로 새벽)에 서비스를 잠시 내리고 (1분 이내) mount point 등 기존 서버에 연결되어 있던 경로를 신규 서버로 맞추어주면 되겠습니다.

이 때, 각 서버들의 서비스 설정파일, 서비스 코드 내 경로를 콘솔이나 에디터로 미리 변경해놓고 동시다발적으로 배포 및 서비스 재기동을 실시하여 다운타임을 최소화 할 수 있도록 합니다.

그리고 기존 서버에 동작하고 있던 Batch job도 신규 서버에 맞게 수정하여 다시 등록하면 되겠습니다.

이상으로 대용량 스토리지 서버 이전 작업에 필요한 사항을 간략하게나마 적어 보았습니다.

대부분 위와 같은 시나리오대로 진행하면 되지만, 실무에서는 예기치 못한 상황이 언제든지 발생할 수 있습니다.

예를 들면 이전한 서버가 예상대로 동작하지 않는 경우가 있을 수 있는데, 이를 대비해서 언제든지 이전을 중단하고 기존 서버로 복구할 수 있는 절차도 마련해 두시는 것을 권장합니다.

물론 작업에 필요한 사항은 보고서, 계획서로 정리하여 사전에 충분한 검토를 거친 후 시행하는 것이 좋겠습니다.

감사합니다.

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라는 전략을 도입하여 브랜치를 관리하고 있습니다.

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

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

Categories
미분류

엑스플랜트를 소개합니다

안녕하세요. 엑스플랜트입니다.

엑스플랜트는 다육식물, 꽃, 관엽식물, 화분 등 다양한 식물, 원예상품을 판매하고 있는 국내 최대의 식물 플랫폼입니다.

엑스플랜트는 국내 뿐만 아니라 미국, 일본, 캐나나 등 해외에서도 높은 인지도를 자랑하고 있습니다.

월 방문자 150만명 이상, 누적상품 900만개 이상의 대규모 시스템에서 발생하는 대량의 요청과 트래픽을 안전하고 빠르게 처리하기 위한 시스템과 서비스의 설계, 개발, 구조개선에 이르기까지 엑스플랜트 개발팀은 오늘도 고군분투하고 있습니다.

엑스플랜트의 성장 이야기를 앞으로 개발 블로그를 통해 알려드리고자 하니 많은 관심 부탁드리겠습니다.