TOSS SLASH 24
박진수 토스뱅크 Node.js Platform Team Leader
https://static.toss.im/slash24/QR/slash24-17.pdf
대출에 필요한 서류를 자동으로 제출하는 스크래핑 시스템에 활용되었다.
문제 인식:
기존 웹뷰 기반 스크래핑 시스템은 메시지 기반 통신으로 인해 개발 생산성이 낮고 디버깅이 어려웠다. 서비스 시작과 끝이 명확하지 않아 관리가 어려웠다.
기존 해결 방안의 한계:
메시지 기반 방식은 사전 협의가 필요하고 서비스 개발 비용이 크다.
서비스 유지보수가 난해하고 어렵다.
Nest.js 프레임워크 소개:
확장 가능한 Node.js 서버 애플리케이션 프레임워크이다.
컴포넌트 개념 개발 지향한다. (모듈, 프로바이더, 컨트롤러, 서비스)
미들웨어, 가드, 인터셉터 등 다양한 기능 제공한다.
NestCA 프로토콜 활용:
API 방식으로 서비스 요청을 처리하여 표준화된 스펙으로 통신한다.
유사 HTTP Request/Response 구조를 사용하여 일관된 에러 처리 가능하다.
{
code: ""
clientMessage: "불편을 드려 죄송합니다.",
systemMessage: "[Error] ...",
data: {
"발급번호": ""
// ...
}
}
동시성 제어 구현:
@Sequential
, @Parallel
데코레이터를 사용하여 효과적인 동시성 제어했다.
Redis, DB와 같은 방법으로 Lock을 설정하여 Race Condition 방지할 수 있다.
WebView Server 구축:
브라우저에서 Nest.js 인스턴스를 실행하여 네트워크 부하 감소한다.
폴리필 작성 및 Node.js 내부 클래스 재정의를 통해 브라우저 환경 대응한다.
구현 시 난관과 해결책:
a. 브라우저 런타임 제약:
Node.js와 브라우저의 런타임 차이를 극복하기 위해 최대한 Polyfill 적용했다.
Async Context 등 일부 기능 사용 불가하다.
b. 빌드 과정 복잡성:
번들링 타임 디펜던시 설정 및 ServerFactory Override를 통해 해결했다.
마무리:
- 메시지 기반에서 API 기반 시스템으로 전환하여 개발 생산성 향상
- Nest.js 프레임워크를 활용한 컴포넌트 기반 개발로 유지보수성 개선
- WebView Server를 통한 클라이언트 측 서비스 처리로 효율성 증대
나의 한줄평:
브라우저에 노드 서버를 띄우는 방식은 신선하다.
Nest.js는 Express와 Fastify를 래핑할 수 있다는 것을 처음 알게 되었다.