해커톤 앱 API 서버 구축 회고 (Node.js + AWS)

대학생 창업 동아리 해커톤에서 헤어 디자이너와 실습 모델을 연결하는 매칭 앱을 만들었다. 이 중 서버 개발을 맡았다.
- 개발 기간: 2017-06-24 ~ 2017-07-08
- 목표: 클라이언트 개발자에게 RESTful한 API를 제공한다.
- 스택: Node.js(ES2016), Express, MySQL, AWS EC2·RDS·S3
- 도구: Atom, MySQL Workbench, FileZilla, Git Bash, Postman
ERD
섹션 제목: “ERD”
인프라
섹션 제목: “인프라”- EC2: 해커톤용이라 프리 티어로 만들었다. 키 파일(
.pem)은 PuTTYgen으로.ppk를 만들어 팀원과 나눴다. - 프로세스 관리: Node.js용 프로세스 매니저 pm2로 배포하고,
status와log로 장애에 대응했다. - IAM Role: EC2에 역할을 붙여 RDS와 S3에 접근 권한을 줬다. 코드에 access key와 secret key를 두지 않아도 된다.
- 설정: DB 커넥션 풀과 AWS 설정은
config폴더에서 한꺼번에 관리했다.
EC2 타임존
섹션 제목: “EC2 타임존”리전을 서울로 설정했는데도 moment(), Date()가 UTC로 출력됐다. 리전과 인스턴스 OS의 시간대는 별개라서, 인스턴스의 시간대를 직접 바꿔 해결했다.
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime데이터베이스
섹션 제목: “데이터베이스”RDS로 MySQL 인스턴스를 만들고 MySQL Workbench로 스키마와 데이터를 넣었다. ORM을 구성할 시간은 없었고, 복잡한 조인 쿼리를 API마다 쓰는 것도 번거로웠다. 그래서 자주 쓰는 조인을 데이터베이스 뷰로 만들어 쿼리를 단순하게 했다.
트랜잭션(커밋·롤백)은 따로 구현하지 않았고, 비동기 콜백에서 에러를 반환하게 했다.
API 구현
섹션 제목: “API 구현”- Express로 라우팅과 요청 파싱을 처리했다. 라우터 파일 하나가 요청 하나를 맡는다.
- 요청 처리 순서는 커넥션 풀에서 커넥션 받기 → 쿼리 실행 → 커넥션 반환 → HTTP 상태 코드와 JSON 응답이다.
- 콜백이 깊어지는 문제는 Promise도 검토했지만,
async모듈의series,waterfall,parallel로 줄였다. - 로그인은
login라우터 안에서login/sns와login/email로 나눴다. - 비밀번호는
bcrypt-nodejs로 해시해 저장했다. body-parser는multipart/form-data를 처리하지 못한다. 이미지 업로드는multer로 받아 S3 버킷에 올렸다.- 검색 필터는 클라이언트가 고른 조건만 적용해야 했다. 요청을
JSON.stringify와 replacer로 직렬화한 뒤switch로 조건마다 쿼리 조각을 붙여 동적 쿼리를 만들었다.
JWT로 토큰 기반 인증을 구현했다. 세션이나 DB에 인증 상태를 두지 않아 서버는 토큰 검증만 하면 된다.
CORS
섹션 제목: “CORS”쿠키를 쓰지 않고 HTTP만 제공해서 CORS 문제가 생기지 않았다. 다른 도메인에서 API를 호출하게 하려면 응답 헤더에 Access-Control-Allow-Origin을 추가해야 한다.
해커톤에서 12팀 중 2등과 인기상을 받았다. 짧은 시간에 동작하는 결과물을 냈고, 아쉬운 점은 다음과 같다.
- 쪽지 기능을 socket.io가 아니라 Realm으로 구현했다.
- HTTPS를 지원하지 않았다.
- API 문서를 Swagger가 아니라 구글 시트로 관리했다.
- 팀원이 셋이었지만 각자 맡은 기능만 구현해서 코드 리뷰와 브랜치 전략을 쓰지 않았다.
- nginx를 앞에 두지 않았고, 로드 밸런싱이나 샤딩 같은 대량 요청 처리를 고려하지 않았다.
- 쿼리를 줄이려고 뷰를 만들었지만, 테이블 구조가 바뀌면 뷰도 함께 고쳐야 한다.