✍️ 프로젝트 기록

🌱 2년 전, 왕초보 개발자가 서비스를 출시하기까지의 기록 (#2)

purpplee 2024. 1. 1. 03:32

 

localhost 띄운 걸로도 기뻐하던 학부생 시절, 뭘 모르는 상태에서 개발을 하다 보니 참 많은 일들이 있었다. 그 중에서 기억에 남는 개발 이슈들을 꼽자면 DB에 데이터를 어떻게 그렇게 무식하게 넣었는지와 서버를 호스팅하기 위해 무료 서비스를 찾아 헤맨 일이다.


😱  DB에 데이터 '끔찍하게' 넣기

우리 프로젝트에 필요한 데이터는 OpenAPI로 제공되지 않아서 데이터팀이 직접 수집하고 프로젝트에 적합한지 아닌지 검수하고 그 내용을 정리했다. 개발자인 나는 데이터팀이 그 데이터를 어떻게 정리해줘야 개발을 할 수 있는지, 그러니까 데이터를 DB에 넣기 위해 엑셀에 어떤 양식으로 작성해주어야 하는지 말씀드려야 했다.
 
처음에는 완벽하게 만들고 싶어서 정규화할 수 있는 건 싹 정규화했다. 그러나 최종으로는 싹 갈아엎고 단순히 하나의 테이블에 일대다, 다대다 관계면 문자열 구분자를 넣어서 입력하는 방식으로 역정규화했다. 이유는 프로젝트 기간 내에 개발할 수 없을것 같아서였다. (안 그래도 한달이나 미뤘는데 여기서 더 미룰 수는 없었다...)
 
데이터팀이 만든 raw데이터 엑셀 파일을 csv 확장자로 다운로드 받아 DB에 넣어야 했는데, 만약 싹 정규화했다면 그 만큼의 쿼리를 따로 만들어서 관리해야 했을 것이다. 혹은 이걸 자동화한 프로그램을 만들거나... 하지만 경험이 없다 보니 이 모든 걸 프로젝트 기간 동안 해낼 수 있을지, 만약 기간이 더 필요하다면 얼마나 더 필요할지 예상되지 않았다. PM에게 예상되지 않는 기간을 더 늘려달라고 하는 것보다는 무식한 방법이더라도 한 테이블에 csv파일을 쿼리 하나로 밀어 넣는 방법을 택했다.

LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE data_tb FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\\n' IGNORE 1 ROWS;

그 때 csv 파일을 밀어 넣기 위해 작성한 쿼리…ㅎㅎ 심지어 매번 전체 데이터를 날리고 다시 넣는 끔찍한 일을 했다…

 
개발 기간 문제는 해결됐지만 몇 가지 이슈가 발생했다. 사람이 손수 작업하는 거라 당연하게도 오타가 자주 났고, 그렇게 문자열 구분자 양식에 어긋난 데이터들이 화면에 이상하게 표시됐다. 이런 데이터들을 개발단에서 거를 수 있도록 처리했어야 했는데 화면 개발, 호스팅 등등의 문제가 남아있어 우선 순위에서 밀려났다.
 
별 다른 방법이 없었으므로 이 이슈는 오타가 난 데이터는 발견할 때마다 수동으로 고쳐주는 식으로 처리할 수밖에 없었다.
 

🛸 서버 호스팅을 찾아서

위의 이유로 우리 프로젝트에는 CUD 작업이 없었다. 간단한 스프링부트 프로젝트를 한번 해 봤어서 DB의 데이터를 화면에 뿌려줄 단순 READ 목적의 API를 만드는 건 쉽게 할 수 있을 거라고 생각했다. 그러나 서버 호스팅을 알아보는 과정에서 예상치도 못한 문제에 직면했다. 바로 돈이다.

 
나는 서버 호스팅 비용이 이렇게까지 비싼 지 몰랐다… 대부분의 호스팅 서비스가 DB는 달에 적어도 10달러, 서버 호스팅은 달에 적어도 20달러 정도 했다. 이 프로젝트는 수익을 목적으로 하지 않았기 때문에 매달 20달러를 지불하는 건 부담스러웠다. 그렇게 무료 호스팅 서비스 찾아 삼만리가 시작됐다.
 
AWS 프리티어
첫 선택은 AWS 프리티어였다. 내게 필요한건 API를 올릴 서버와 DB였기 때문에 평생 무료인 EC2의 t2.micro 또는 t3.micro와 12개월 동안 무료로 사용할 수 있는 RDS를 우선 사용하기로 했다. 12개월 뒤에는 다른 무료 DB 를 찾으면 될거란 생각이었다.
 
그런데 다음 달, RDS 의 비용이 20달러 정도 청구되었다. 무료 플랜이 가능한 리전이 있었는데 내가 다른 리전에 인스턴스를 생성한 것과 이전에 실수로 프리티어가 아닌 사양으로 생성한 인스턴스의 스냅샷이 삭제되지 않고 남아있던 것이 원인이었다.

간절한 마음으로 aws 상담사 monse 와 주고받은 채팅... 한국어 가능한 상담사를 요청하면 바꿔준다는 사실을 몰랐다 😂

 
다행히 AWS에서 환불을 해주었지만… AWS를 잘 모르는 채로 사용해서 일어난 일이었으므로 이런 상태에서 AWS를 사용하는 게 맞는지 판단이 서지 않았다. 까딱했다가는 운영 도중 예상치 못한 비용이 청구될 수 있겠다는 걱정도 들었다.
 
Heroku
AWS 다음으로 고려한 건 Heroku 였다. 당시에 사이드 프로젝트 호스팅으로 가장 흔하게 쓰이던 서비스다. 다만 Heroku 는 30분간 트래픽이 없으면 서버를 sleep 모드로 만들어서 다시 wake up 하려면 30초 이상의 대기 시간이 생긴다. 다른 프로젝트에서는 Heroku를 썼는데, 매번 wake up 할 때마다 멍하니 기다렸던 게 떠올랐다...

우리 서비스의 사용 시나리오를 고려했을 때 30분 이내로 트래픽이 발생할 것 같지 않았고, 안 그래도 소규모의 프로젝트인데 30초간의 대기 시간이 생긴다면 사용률이 떨어질 것 같아 다른 호스팅 서비스를 선택하기로 했다.
 
pythonanywhere
그렇게 찾은 곳이 pythonanywhere 다. pythonanywhere 는 mysql DB를 512MB, 서버는 낮은 사양에서 호스팅할 수 있는 무료 플랜을 제공해준다. 트래픽을 얼마나 제한하는 지는 모호하게 나와 있는데, 모호하게 적힌 트래픽 제한 관련 글의 무료 플랜인 beginner account 에 대한 설명은 다음과 같다.

Beginner accounts are for people who just want to try out Python and play with it a bit. We don't offer any guarantees about what bandwidth you'll get, but obviously it'll be enough to be usable.

 
당장 제한을 두지는 않지만, 만약 내부 규정 상 과한 트래픽이 발생하는 beginner account 에게는 제한이 가할 수 있다는 내용으로 추측된다. beginner account 에 아무런 경고 없이 요금이 발생한 사례를 찾지 못해서 지금 상황에는 pythonanywhere 가 가장 적당한 서비스라고 생각됐다.
 
그리고 바랬던대로 2년이 지난 아직까지도 속도나 요금 관련한 이슈가 발생하지 않았다. 대신 최소 3개월에 한번씩은 서버 갱신을 해줘야 하는데 무료로 쓰는 입장이니 이정도 수고는 당연히 할 수 있다.

(고마워요 pythonanywhere!)

 
pythonanywhere 서비스에는 python으로 만든 어플리케이션만 호스팅 가능하다. 내가 다뤄본 건 Springboot 가 다였어서 Django 라는 python 프레임워크를 새로이 공부해야했다. '이것도 다룰 수 있다면 한층 더 레벨업 하겠지?' 라는 생각이 더 커서 익숙한걸 버리고 새로운걸 다시 공부한다는 데에는 거리낌이 없었다.
 
다행히 2021년에는 Django 가 한창 뜨고 있을 때라 튜토리얼이 정말 많았다. 내가 본 튜토리얼은 점프 투 장고와 장고걸스다. Django 를 깊게 이해하지는 못했지만 사용 방법을 익히기에는 충분했다. 또 둘 다 pythonanywhere 에 호스팅을 어떻게 하는 지도 자세히 나와 있다.
 
 
그렇게 나의 첫 서버 호스팅이 마무리됐다 😁

반응형