0. 내게 주어진 숙제
누구나 하루만에 인터넷에서 다수에게 다수의 물건을 팔아 수익을 창출할 수 있게 하자는 것이 이 프로젝트의 목표입니다.
프로젝트의 첫 개발자로서 제가 달성해야 하는 1단계 목표는 이것입니다.
이 웹서비스에서 주요 오픈마켓 7개사(쿠팡, 스마트스토어, 옥션/G마켓, 11번가, 롯온, 인터파크, 위메프)에 한 번에 상품을 등록, 관리할 수 있도록 하라.
특별한 점은 이 서비스는 시장에 내놓을 계획이 있고, 한 명이 아닌 모두를 위한다는 점입니다.
그렇기에 보안과 사용자의 이용 편의성에 대한 고민을 배제할 수 없게 됐습니다.
또한 향후에 다른 개발자가 팀에 합류할 가능성이 결코 낮지 않기에
적당히 돌아가는 비둘기 헬리콥터 같은 코드보다는
데드라인 안에서 최대한 친절하고 단단하며 유지보수에 용이한 코드를 작성해야 하게 됐습니다.
이런 배경에서 저는 아이디어를 현실에 구현할 구체적인 방법을 고민하였습니다.
1. 첫 고민 - 어떻게 만들까?
A. 호스팅은 어디에서 하지?
우리 회사는 현재로서는 자원이 풍부하지 않습니다.
서비스 운영에 드는 유지 비용을 가능한 작게 하여야 합니다.
또한 저희 서비스가 엄청나게 많은 사용자를 끌어들이고 유치할 수 있다면 좋겠지만
현 상황에서 그것이 분명히 가능하다고 단정하기에는 어려운 상황입니다.
이러한 배경에서 고객 수와 트래픽이 일정 수준 이하일 경우 가장 저렴한 cafe24의
호스팅 서비스를 이용하는 것을 제안드렸고, 이것으로 결정이 되었습니다.
기본적으로 cafe24의 서버 자원을 한동안 이용하기로 하였습니다.
B. 프로젝트 아키텍처는 어떻게?
솔직하게 프로젝트 아키텍처를 잘 짜본 적이 없습니다.
지금은 형편없습니다. 앞으로 공부를 해서 보완할 계획입니다.
그럼에도 설계도 없이 작업할 수 없기에 설계를 합니다.
지금의 설계는 분명히 임시적인 설계입니다.
프로젝트가 점점 커지고 공부를 축적하면서 분명히 바뀌어야 할 것입니다.
일단은 큰 틀은 이렇게 고민을 해보았습니다.

1) 프론트엔드와 백엔드를 한 서버에서 운영하는 결정
프론트엔드와 백엔드 서버를 분리하고,
쇼핑과 연관 있는 서비스 특성상 이미지 서버를 별도로 운영하는 것도 검토 대상이었습니다.
하지만 cafe24에서 반 년간 작은 프로젝트를 서비스하며 획득한 경험을 고려하여
이를 초기 단계부터 계획 및 개발하는 것은
불필요하게 시간과 자원을 과대 투입하는 것이라고 판단하였습니다.
해서 일단은 프론트엔드와 백엔드 서버 (그리고 이미지 호스팅 서버)를 한 서버에서 운영하기로 결정했습니다.
2) 고려 대상이었던 Next.js를 사용하지 않고, CSR 방식으로 개발하는 결정
한편 Next.js를 이용해 SSR 방식으로 서비스를 개발하는 것을 검토해 보았는데,
Next.js는 속도 측면에서의 우수성과 서비스 초기 개발 속도에 힘을 실을 수 있다는 장점을 갖고 있었습니다.
하지만 첫 번째 장점은 저희 상황에서는 단점이기도 했습니다. 그만큼 서버 부담이 가중될 것이고,
많은 트래픽에 대응해본 경험이 적은 제 특성상 이에 대응하는 것이 더욱 어려워질 것이며,
또한 많은 서버 부담은 곧 많은 서버 비용을 의미할 것이기 때문입니다.
두 번째 장점 또한 다소 의문이었습니다. 전에 Next.js를 이용해 프로젝트를 개발해본 경험이 있는데
초기에는 개발이 정말 빨랐습니다. 하지만 개발이 점차 진행될수록 Next.js의 편의 기능은 오히려 불편과 프로젝트 관리의 어려움으로 다가왔습니다.
물론 이는 몇 년 전의 이야기고 몇 번의 진화를 거듭해 Next.js가 기존의 문제점을 개선하여 훨씬 나은 프레임워크가 되었다는 소식을 최근 접해 들었습니다.
하지만, 현재로선 팀이 없고 제한된 시간 안에 목표를 달성해야 하는데, 익숙하지 않은 프레임워크를 사용하면서 어떤 예상치 못한 문제를 맞닥뜨릴 지 알 수 없다는 점이 많은 부담으로 느껴졌습니다.
이런 이유에서 Next.js를 사용하지 않기로, 또한 CSR 방식으로 개발하기로 결정했습니다.
3) Redis 대신 Mysql을 이용하는 결정
다른 한 편으로 mysql을 선택했습니다.
최근 redis가 ram에서 데이터를 처리하여 속도 면에서 mysql보다 훨씬 우수하다는 것을 블로그에서 읽은 적이 있습니다.
그래서 자연스럽게 redis를 데이터베이스로 채택하는 것을 고려해보게 되었는데,
메모리 관리의 어려움이 더욱 심화된다는 점과 높은 비용 문제로 이 대신 mysql로 우선 개발을 진행하기로 결정했습니다.
* 속도에 아쉬움이 많아지면 redis 도입을 검토해볼 의향이 크게 있습니다.
4) Typescript를 이용한 프로젝트 구성
typescript를 이용해 프로젝트를 개발하기로 했습니다.
최근 대형 라이브러리에서 typescript를 퇴출시키는 일이 다소 있어
이를 사용하지 않는 것이 검토 대상이었습니다.
하지만 협업 면에서 javascript의 자유분방함을 typescript로 억제하는 것이
미래를 고려했을 때 현재로서는 더 나은 판단이라고 사료되어서
typescript를 프론트엔드와 백엔드 모두 도입하여 개발하기로 결정했습니다.
그 외에 프론트엔드에서 react, redux, styled-components를 사용하기로,
백엔드에서 koa를 사용하기로 결정했습니다.
이는 다년의 개발 경험이 있어 친숙한 프레임워크/라이브러리여서 자연스럽게 선택하게 됐습니다.
* 이후의 프로젝트에서는 다른 기술을 사용해보는 것을 고려하여 보고 있습니다.
2. 마치며
오늘은 제게 주어진 목표를 달성하기 위해 기본이 되는 첫 번째 고민에 매진했습니다.
지금 내린 결정들이 객관적으로 보았을 때 최선일 것이라고 생각하지 않습니다.
앞으로 제가 더욱 성장할수록 분명 바꿔야 할 부분들이 많이 보일 것입니다.
하지만 현 시점으로 좁힌다면, 이것들은 제가 할 수 있는 최선의 결정이었습니다.
먼 훗날의 저는 이것들이 마냥 귀엽게 보일 정도로 성장해 있기를 바 봅니다.
다음에는 보다 구체적인 개발에 착수할 계획입니다.