[Stocker] The Foundation of Stocker 마일스톤 회고

2020년 2월 1일

동기

첫 번째 마일스톤을 회고하는 글이기 때문에 이 프로젝트를 하게된 동기부터 이야기하고자 한다. 이 프로젝트는 예적금 이외에 투자를 시작하고자 하여, 작게나마 주식에 투자를 하며 주식이 형성되는 가격이 어떻게 형성되는지 궁금해 하며 시작하게 되었다. 그 이유를 재무재표와 같은 데이터에서 찾고자 하였고, 개인 프로젝트 거리를 찾으며 이런 데이터들을 직접 모아서 다루며 분석하면 어떨까 싶었다. 때마침 업무에서도 새로운 프로젝트가 진행되고 있었고 이 프로젝트와 병행하며 양쪽에서 여러가지 기술이나 방법론을 적용해가며 확인 해볼 좋은 기회였다.

준비

필자가 고른 주제와 관련된 좋은 R을 이용한 퀀트 투자 포트폴리오 만들기라는 책이 있어 이를 참조해가며 프로젝트를 시작하였다. 이전 soraka와 같은 개인 프로젝트에서 Lerna와 TypeScript를 사용해 Clean Architecture를 적용하고자 시도하였었는데 TypeScript를 설정하는데 미숙해 Lerna를 적용할 때 발생한 이슈들을 해결하지 못하고 적용하고 걷어내기를 반복했다. 다행히도 직전에 업무에서 TypeScript를 하나 하나 설정해가며 관련 이슈들을 해결해보게 되어 그 경험을 바탕으로 다시 도전을 해보았다.

이런 저런 설정을 해보며 가능성을 확인하고는 Clean Architecture에 관련된 자료들을 찾아해보았다. 몇년전에 Clean Architecture를 처음으로 접했던 자료들과 새로운 자료들을 찾아보았다. 뱅크샐러드에서 발표한 좋은 자료들이 많아 큰 도움이 되었다.

이외의 여러 글들을 찾아보았지만 사실 구조를 잡아가는데는 도움이 된 것은 실제 Clean Architecture를 바탕으로 구현한 예제들이었다.

위를 바탕으로 Stocker에 가장 기초적인 동작을 목표로하는 The Foundation of Stocker라는 마일스톤을 생성하였다.

설계

├── packages
│   ├── client
│   ├── core
│   ├── crawler
│   └── server

우선 크게 구조는 Domain 및 공통으로 사용할 유틸들을 담을 core라는 package와 crawling을 담당할 crawler라는 package, 그리고 각각 clientserver를 담당할 package로 총 4개의 package를 생성하였다.

Core

├── src
│   ├── constants
│   ├── data
│   │   ├── errors
│   │   ├── mappers
│   │   ├── models
│   │   └── providers
│   ├── domain
│   │   ├── entities
│   │   ├── repositories
│   │   └── use-cases
│   ├── enums
│   ├── error
│   ├── index.ts
│   ├── interfaces
│   │   └── repository
│   └── utils

앞서 말한대로 core는 Clean Arhictecture의 Entity, Repsotory, UseCase등을 정의하는 것을 주된 목적으로 하고 있고, 그 외에 다른 package에서 사용할 공통된 mapperprovider, error에 대한 정의 및 구현을 하였다.

Crawler

├── src
│   ├── constant.ts
│   ├── data
│   │   ├── mappers
│   │   ├── providers
│   │   └── repositories
│   ├── financial-statement
│   ├── index.ts
│   ├── stock
│   ├── stock-item
│   └── utils.ts

core에서 정의한 것들을 구현하거나 사용해서 크롤링을 진행하는 package이다. 현재는 재무재표 등의 데이터들을 크롤링할 대상들에 대해 크롤링을 하는 부분까지 구현하였다.

Server

├── scripts
├── src
│   ├── AppContext.ts
│   ├── Server.ts
│   ├── constant.ts
│   ├── controllers
│   ├── data
│   │   ├── mappers
│   │   ├── models
│   │   ├── providers
│   │   └── repositories
│   ├── enums
│   ├── handler
│   ├── interfaces
│   ├── libs
│   ├── local.ts
│   ├── middlewares
│   ├── routes
│   └── utils

crawler 와 마찬가지로 core에서 정의한 내용을 바탕으로 crawler를 사용해 크롤링한 데이터를 DB에 저장하거나 client에서 사용할 API들을 제공하였다. server는 다른 프로젝트에서도 사용하였던 Koa를 기반으로 작성되었으며 Sequelize라는 ORM을 사용하였다. 여기에 기존의 다른 프로젝트에서 직접 OAuth를 적용하였다가 FirebaseAuthentication제품을 사용하여 변경해보았는데, 이런 저런 것을 많이 고려해야하는 인증이 정말 쉽게 해결되었다.

Client

├── AppContext.ts
├── Server.ts
├── components
│   ├── molecules
│   ├── organisms
│   ├── pages
│   └── templates
├── config
├── constant
├── constant.ts
├── data
│   ├── mappers
│   ├── providers
│   └── repositories
├── pages
├── public
├── src
├── stores
├── styled
├── utils

server 와 마찬가지로 core에서 정의한 내용을 바탕으로 서버와 통신을 하여 화면에 보여주었는데, NextAnt Design을 사용하여 손쉽게 화면을 구성할 수 있었다. 초기에는 client의 Server 부분을 Koa로 작성하였으나 다국어를 적용하기 위해 next-i18next을 설정하던 도중 Koa에 대한 지원이 거의 되지않아 Express로 변경하였다.

ETC

plop
├── scripts
│   ├── constant.js
│   ├── entity.js
│   ├── helpers.js
│   ├── link-use-case-crud.js
│   ├── link-use-case.js
│   ├── prompts.js
│   ├── repository.js
│   ├── use-case-crud.js
│   ├── use-case.js
│   └── utils
└── templates
    ├── entity
    ├── repository
    └── use-case

Plop을 사용해 반복적으로 작성하는 부분에 대하여 자동 코드 생성해서 생산성을 높일 수 있도록 했다.

회고

당초 12월 31일을 목표로 잡은 마일스톤은 기한인 31일이 훌쩍 넘어 1월 22일이 되어서야 종료가 되었다. 12월 중순 무렵부터 블로그 개편에 홀리어 프로젝트를 잠시 중단하였고, 생각보다 고려해야될 것들이 좀 더 있다보니 20일이 넘도록 지연되어 버렸다.

Clean Architecture를 적용해보니, 단순하게 여기서 이렇게 사용할 것이니 이렇게 작성해야지 보다는 Domain을 먼저 생각해서 작성하는 버릇을 들이는데 큰 도움이 되었다. 여기에 완벽하지는 않지만 기초적인 Unit Test까지 작성을 해두니 프로젝트를 진행하는 동안 크고 작은 리펙토링의 순간에도 큰 어려움 없이 진행할 수 있었다. 물론 Lerna를 적용하였기 때문에 package간 의존성 문제를 쉽게 처리할 수 있었던 것은 두말하면 잔소리다.

하지만 개인적으로 진행하는 프로젝트이다보니, 퇴근 후 한밤 중까지 하지 않으면 진행하기 어려웠기 때문에 Domain을 작성하고, Test를 작성하며, Domain이 변경될 때마다 모든 package내에 변경된 부분을 적용하는 것은 쉬운 일은 아니어서 빠르게 결과물을 뽑아내지는 못했고 이로 인해 프로젝트가 루즈해지는 것은 피할 수 없었다.

이 다음은…

The Foundation of Stocker의 다음 마일스톤으로, 앞선 마일스톤에서 수집한 종목을 바탕으로 재무재표를 수집하는 Crawl financial statements라는 마일스톤을 생성하였다. 이 마일스톤을 생성한지 10일쯤이 되어가는 현 시점에서 보면 당장 재무재표를 수집하는 것보다는 재무재표에 대한 더 깊은 이해가 필요할 것으로 보여 해당 부분에 대한 공부도 함께 진행해야될 것으로 보인다.

Recently posts
© 2016-2023 smilecat.dev