핀코인을 지탱하는 기술 스택 (부제: 스타트업 기술 스택)


핀코인 | 2019-01-04 12:01 | 댓글 | 8,997 회


안녕하세요.

핀코인입니다.

핀코인의 서비스는 크게 쇼핑몰, 블로그, 기술문서 사이트로 구성됩니다. 향후 게시판 커뮤니티 확장 계획을 갖고 있습니다.

서비스 범위가 디자인 역량이 전혀 없는 1인 개발자로서는 상당히 넓은 범위입니다.

과거의 오픈카트 쇼핑몰 솔루션을 포기한 이유 중에 하나는 단순히 상품권 쇼핑몰로 끝나는 것이 아니라 좀 더 서비스를 확장하고자 하는 계획 때문이었습니다.

어떻게 서비스를 개선할까 고민을 하던 찰나에 몇 년 전에 스타트업을 위한 기술 스택이라는 블로그 게시물을 읽었습니다. 이 문서가 현재의 핀코인 서비스 구성에 가장 큰 영향을 준 내용 중 하나입니다.

핀코인은 기존 서비스를 운영하던 업체이고 상품권의 특성상 거래액 자체는 크기 때문에 무작정 스타트업으로 보기엔 애매할 수도 있습니다. 그러나 여전히 인력 구성은 소규모이기 때문에 스타트업과 별반 다르지 않다고 판단되었습니다.

1. 서버 프로그래밍 언어와 프로그래밍 언어 = Django/파이썬

개인적으로 가장 많이 고민했던 조합은 "Django/파이썬"과 "스프링/자바" 조합이었습니다. 국내에서 가장 대중적인 조합은 "스프링/자바", "Laravel/PHP" 조합입니다.

근래에 "Django/파이썬" 조합도 많이 각광을 받는다고 하나 시장의 수요와 개발자 인력 풀을 고려하면 여전히 위 조합이 인기가 많습니다.

Django를 선택한 이유 중의 하나가 Admin 관리자 인터페이스의 제공입니다. 서비스에서 최종 사용자가 입력해야 할 인터페이스 폼은 생각보다 많지 않고 서비스 제공자가 백엔드에서 제공해야할 정보가 훨씬 많습니다. 이 때 빠른 데이터 구조 프로토타입을 만드는데 있어 Django ORM과 Admin 관리자 인터페이스는 매우 매력적으로 판단되었습니다.

결국 서비스의 상용화와 실무적 편의성을 고려하면 Admin 인터페이스를 계속 유지할 수는 없습니다. 그러나 1인 개발자로서 "마감을 제때 맞추는 완벽주의자의 웹 프레임워크(The web framework for perfectionists with deadlines)"라는 Django의 슬로건 답게 빠르게 프로토타입을 만들 수 있는 것은 서비스의 예비타당성을 파악하는데 효과적입니다.

2. 데이터베이스 = PostgreSQL

과거 회사에서 일할 때는 오라클을 사용하기도 했지만 스타트업에서 선택지는 사실상 MySQL과 PostgreSQL 밖에 없습니다.

익숙한 것은 MySQL이고 각종 문서와 사례를 찾기 쉬운 것은 MySQL입니다. 그러나 Django와 어울리는 오픈소스 RDBMS로서 몇몇 편리한 타입을 지원한다고 해서 PostgreSQL을 선택했습니다.

하지만 이 부분은 다시 익숙한 MySQL로 돌아갈지 여전히 고민이 많은 부분입니다. 아무리 좋은 연장, 도구도 잘 다룰 수 있을 때 의미가 있는 것이지 제대로 쓰지 못 하면 그림의 떡일 뿐이란 생각이 듭니다. 그래도 현재로서는 툴을 좀 더 학습해보려고 합니다.

3. 프론트엔드 = jQuery 3, Bootstrap 4, FontAwesome 5

저는 디자인 역량이 전혀 없습니다. 포토샵/일러스트레이터 같은 툴은 전혀 다룰 줄 모릅니다. 그래서 핀코인 사이트 개발에서 위시켓 외주를 맡긴 부분이 바로 이미지 디자인 부분입니다.

그러나 웹사이트 레이아웃/디자인까지 외주를 맡기기엔 비용 부담이 크므로 Bootstrap을 선택했습니다. Materialize CSS 프레임워크도 고민을 해봤지만 "전혀" 디자인 역량이 없다는 이유로 Bootstrap을 쓰기로 했습니다. 그리고 django-crispy-forms은 템플릿 팩으로 Bootstrap을 지원하지만 Materialize는 아직 지원하지 않습니다. 폼은 결국 직접 렌더링해야 하는 경우가 많긴 하지만 말입니다.

어쨌거나 Bootstrap 덕택에 색상 변경, 그리드 시스템으로 적당한 배치와 여백(margin, padding) 값 조정만으로도 그럭저럭 나쁘지 않은 디자인의 웹사이트를 제공할 수 있다고 생각합니다.

FontAwesome은 폰트 형식으로 다양한 아이콘을 입력할 수 있고 무료 플랜도 제공하고 있어서 사이트의 깔끔한 버튼을 구성하는데 효과적입니다. 핀코인은 FontAwesome 4.7에서 5.6으로 업데이트 완료했습니다.

Bootstrap은 디자이너 사이에서 호불호가 크고 jQuery는 개발자 사이에서 호불호가 심합니다. 핀코인이 jQuery를 선택한 이유는 편리한 선택자(selector)로 사용자에 반응하는 기능과 ajax 기능이면 충분하기 때문입니다.

4. 서버 환경

4.1. 우분투

국내에서 가장 많이 쓰이는 서버 배포판은 레드햇 계열 CentOS와 데비안 계열 우분투입니다. 20년전부터 데비안 운영체제 환경에 익숙해서 우분투를 선택했습니다. 가장 익숙한 도구가 결국에는 가장 좋은 도구라는 생각이 듭니다.

핀코인은 해외의 IaaS 서비스를 이용합니다.

4.2. Nginx 웹서버

과거 서비스에는 주로 Apache를 많이 사용했습니다. 요즘에는 Nginx도 꽤 많이 써서 사례도 많고 문서를 찾는 게 어렵지 않아서 Nginx를 선택했습니다.

Nginx와 Django를 연결해주는 애플리케이션 서버는 성능이 더 낫다고 하여 uWSGI를 선택했습니다.

4.3. Memcached

서비스의 반응속도를 높이기 위해서는 최대한 캐싱을 이용해야 합니다. 특히, 트리 구조의 메뉴나 블로그의 사이드바의 내용은 운영 중에 변경 사항이 거의 없으면서 매번 출력해야 하므로 해당 쿼리 결과를 캐싱해두고 처리하면 사이트의 속도가 개선됩니다.

Redis는 캐싱 데이터 타입도 많이 지원하고 메모리가 망가져도 캐시 데이터를 복원할 수 있어 인기가 많다고 합니다. 반면에 Memcached는 메모리가 망가지면 캐시 데이터를 복원할 수 없지만 어차피 핀코인의 캐시 데이터는 메뉴, 최신글, 상품 목록 정도이기 때문에 별 상관은 없을 듯 합니다.

4.4. RabbitMQ, Celery

비동기 작업큐로 RabbitMQ 메시지큐와 Celery를 이용합니다. 주로 비동기 작업에는 이메일 발송, 문자 알림 등 여러 가지 알림 작업 처리를 할 때 이용합니다.

예전 오픈카트에서는 이메일 발송을 동기적으로 처리해서 주문이 몰릴 때는 서비스 지연으로 고객이 느끼는 불편이 매우 많았습니다.

4.5. cron

일정 시간마다 주기적인 작업을 처리할 때 crontab을 이용합니다. cron으로 django-admin의 커스텀 명령어를 실행하게 하면 데이터베이스에 접근하여 휴면 계정 처리 일괄 배치 작업을 처리할 수 있습니다. 또한 뉴스를 뿌려줄 때 매번 RSS를 동기적으로 네트워크에서 읽는 것이 아니라 주기적으로 RSS xml 파일을 저장해두고 로컬에서 읽어서 파싱하면 속도를 개선할 수 있습니다.

4.6. Cloudflare

네트워크 방화벽만으로는 실제 운영 서버의 보안을 유지하는 데 어려움이 많습니다. 반드시 웹 방화벽 솔루션을 같이 이용하여 보안 환경을 개선해야 합니다. 웹 방화벽을 써야 하는 이유 게시물에서 Cloudflare를 선택한 이유를 설명하고 있습니다.

5. 기타 서비스

5.1. KCB 오케이네임 휴대폰본인인증

쇼핑몰 서비스 운영을 위해서는 타사의 서비스도 많이 이용해야 합니다. 그 중에 대표적인 것이 휴대폰 본인인증과 PG사 연동일 것입니다. 그러나 국내 휴대폰인증과 PG사는 파이썬 언어는 지원하지 않습니다. 오직 PHP, 자바, ASP만 지원합니다. 그래서 Django/파이썬 조합을 이용하는 서비스의 경우 아임포트를 이용하는 경우가 많습니다.

상품권 쇼핑몰의 특성상 PG사와 계약 승인이 어려우므로 PG 연동은 고려하지 않더라도 휴대폰인증은 꼭 필요합니다. 그래서 어쩔 수 없이 특정 디렉토리에서만 PHP를 허용하는 방식으로 처리했습니다. 보안을 위해서 파일 업로드 금지 및 모든 불필요한 PHP 함수는 disable 처리했습니다. 철저하게 본인인증에 필요한 옵션만 켜둔 상태입니다.

5.2. Mailgun, G-Suite, 알리고, 라인 Notify

과거에는 직접 Postfix, Dovecot, Roundcube 등으로 구성하여 메일 서비스를 이용했습니다.

현재는 대용량 메일 발송에 Mailgun을 이용하고 도메인 이름 부여한 이메일 계정으로 G-Suite 이렇게 유료 서비스를 이용합니다. 약간의 비용이 발생하지만 스팸 메일 분류, 피싱 메일 보안 등을 위해서는 투자라는 생각이 듭니다.

대용량 메일 발송에는 Sendgrid 서비스도 많이 이용하는 것 같습니다. 하지만 Mailgun보다 설정이 다소 복잡하고 가격이 좀 더 비싸서 Mailgun을 선택했습니다.

알리고 서비스는 문자 SMS 발송 처리를 위해 REST API를 깔끔하게 지원하고 있고 라인 Notify는 여러 관리자에게 시스템 알림을 발송 처리하기 위해서 이용합니다. 라인 Notify는 여러 명에게 무료로 알림을 보낼 수 있고 카카오톡보다 설정이 매우 간단합니다.

5.3. disqus 댓글 시스템

블로그 및 쇼핑몰 상품 리뷰 댓글 시스템으로 disqus를 선택했습니다. 댓글 시스템을 직접 구현할 것인가 서드파티 서비스를 이용할 지 고민했습니다. 완전히 커뮤니티로서 기능을 한다면 게시판/댓글 시스템을 직접 구현하는 것이 맞겠지만 다소 일회성으로 댓글을 남기는 부분에 대해서는 서드파티 라이브러리를 쓰는 것이 낫겠다는 판단이 들었습니다.

또한 서드파티 라이브러리를 사용할 경우에는 SNS 계정을 통해 바이럴 광고 효과도 예상할 수 있을 것 같았기 때문입니다. 그러나 사실 이 부분 때문에 많은 분들이 댓글 다는 것을 꺼려하기도 합니다.

disqus와 LiveRE 사이의 선택도 고민이 되었습니다. LiveRE는 국산, 카카오톡/네이버 로그인 지원하고 disqus는 외산으로 카카오톡/네이버 로그인을 지원하지 않습니다. 이게 매우 고민이 된 부분인데 어차피 핀코인 대다수의 고객층은 게임 유저이기 때문에 구글/페이스북 계정을 갖고 있다고 판단하여 disqus를 선택했습니다.

지금까지 핀코인을 지탱하는 기술 스택을 알아봤습니다.

모든 기술의 선택은 철저하게 혼자서 할 수 있을 것이라는 절대 기준을 따릅니다.

그러나 혼자서 다양한 무료/공개 오픈소스를 사용한다는 것이 도구 사용에 비용이 없다는 것이지 함께 엮어서 서비스를 제공하려면 많은 노력이 필요합니다. 핀코인은 이러한 노력의 경험을 여러분과 공유하고 다양한 피드백을 받아 더욱더 성장하고자 합니다.

핀코인은 언제나 구글기프트카드, 문화상품권, 에그머니 등을 온라인 최저가로 판매합니다. 저희 핀코인도 많이 아껴주세요.

대한민국 1등 온라인 상품권 쇼핑몰 핀코인!

감사합니다.


#핀코인 #Django #파이썬


관련 게시물

blog comments powered by Disqus