LawDocOffice Server 개발기(토이, ts)
LawDocOffice Server 개발기(토이, ts)
개발기간 LawDocOffice 2020.10.27 ~ 2020.11.16 LawSubAgent 2020.12.16 ~ 2020.12.30
과거 아는분과 기회가 되서, 간단한 토이를 진행했었는데, 작업을 했었던 것에 대한 기록이다.
사용햤던 기술
언어 : TypeScript
- 기존에 NodeJS를 간단하게 쓰고 있었는데, 타입이 추가되고 여러가지 부분에서 편해진 TypeScript가 요즘 괜찮다는 지인의 추천이 떠올라 해당 언어를 사용하도록 선택하였다.
프레임워크 : Express
- 기존에 AWS SAM을 적용하면서 예제에서 Express를 가지고 예제를 올려놨어서, 생소하지만, 다른 것들에 비해 그나마 제일 익숙해서 선택하였다.
Node 프로세스 관리자 : PM2
- 로컬에서 개발할때 매일 npm run ~~~ 을 치는것이 귀찮아서 백그라운드에 올려놓는 방법을 찾다가 채택하였다. 추가로 nodemon을 이용하여, 코드가 바뀌면 자동으로 재실행하게 구성하였다.
DB : MariaDB
- 가장 익숙한 DB여서 채택하였다. 굳이 새로운 것을 쓴다면, Postgresql라는 선택지가 있기 했었겠지만, 해당 DB의 특별한 기능같은 것을 사용하지는 않을것 같아서, 쓰던 것을 채택하였다.
ORM(Object Relational Mapping) : typeORM
- 이전부터 사용하면, 생산성이 좋아진다는 지인의 이야기에 ORM을 사용하여 프로젝트를 해보고 싶었다. 찾다보니, SequalizeORM을 처음에 사용하려 했는데, 같이 프로젝트 하던 분이 typeORM이라고 ts로 만들어진게 하나 있다고 하길래 하당 lib를 채택하였다.
DOC : apiDoc
- API가 나왔을 때 문서를 일일히 새로 작성하는것은 너무 불편한 작업이며, 쉽게 빼먹을 수 있는 작업이라 생각한다. 가장 좋은 것은 코드단에서 주석에 API정보를 나열해 놓으면, 빌드단에서 해당 apiDOC을 알아서 뽑아주는 것이 베스트라 생각했기에, apiDoc을 채택하였다.
2. 개발기
시작
당시에 뭔가 정확한 기획 없이 즉석으로 시작했었던 프로젝트라, 최소한의 간단한 기능들에 대해서만 DB를 설계하고 시작하였다.
해당 DB 테이블 구조는 깃허브의 schema.png파일을 보면 된다. 기억상으론 초창기에 몇번 수정하고, 이후에는 수정하지 않았던걸로 기억한다.
DB Schema들을 모두 짠 후, 같이 진행하던 팀원들의 피드백을 받은 이후에 바로 개발에 들어갔다. 당시 기획1, 백1, 프론트2 형태로 팀을 구성했어서, 최대한 빠르게 기능을 뽑아내야 프론트 개발자들이 개발을 할 수 있기 때문이다.
ORM 사용 및 개발
최초로 작업한 것은 DB Schema Table들을 class 형태로 만드는 것이었다. 해당 작업은 크게 어렵지 않았다. Hook은 매우 유용한 기능이라 생각이 들었었다. 프로젝트 내에서 사용 사례는 비밀번호를 설정할때, Hook에서 해당 비밀번호의 유효성을 검증하는데 사용했었다. 하지만, 해당 부분은 로직이니, Model단과 분리되는게 맞지않을까? 라는 생각이들긴 했었으나, 처음 ORM을 써보는 만큼여러가지 시도를 해보겠다는 생각과 ORM이니 해당 위치에 넣는게 맞지않을까라는 생각에 검증의 위치를 옮기지는 않았다. 패스워드의 유효성을 검증하는 것은 유저 객체가 해야되는 일중 하나라고 생각이 든다.
자동배포
여러가지 기능을 구현하다가, 같이 프로젝트 하는 분들과 회의에서 소스코드 커밋시, 자동 업데이트 기능이 있으면 괜찮을것 같다는 이야기에 해당 기능도 간단하게나마 구현하였다. 커밋을 할 떄마다 id/password로 ssh에 접근하여, 미리 작성해둔 스크립트를 실행하도록 하였고, 해당 스크립트에는 github 소스코드를 pull하도록 구현하였다. 그 뒤 nodemon에서 소스코드 변화를 감지하고, 서버를 재컴파일 & 실행하였고, doc에도 변경사항이 정상적으로 적용되었다. 비록 CI/CD 툴을 사용해서 적용한 것은 아니지만, 만들어놓고나니, 아주 편리한 기능이라는 것을 깨닫게 되었다.
테스트
테스트를 작성하며 작업한다라는 것은 실패하였다. 일단, 테스트를 할 때, DB에 의존적이지 않게 테스트를 진행해야 된다는 생각을 가지고 있기 때문에, 해당 방법을 찾아보며 적용하다가 결국 실패하여, 적용을 아에 못했기 때문이다. 그냥, 테스트용 DB를 도커로 띄운 후에 기본 데이터를 넣고 테스트하도록 하였다. 해당 테스트도 개발도중, API호출을 하지 않고 편하게 개발하기 위함인거지, 테스트목적은 아니었다.
결국 프로젝트는 서로 바빠지면서 접게 되었지만, 다음에 토이를 하게 되면, 꼭 테스트코드를 작성하며 작업해야겠다.