Skip to content

기술 선정 근거

edder773 edited this page Dec 3, 2024 · 8 revisions

프론트엔드

React

  • 컴포넌트 기반 구조: 재사용성과 유지보수성
    • Angular는 규약 기반으로 개발을 강제
  • 가상 DOM: 변경된 부분만 업데이트하여 성능 최적화
    • Angular는 양방향 데이터 바인딩으로 인해 큰 애플리케이션에서 성능 저하를 겪을 수 있음
  • 광범위한 생태계: 리액트 라우터, 상태 관리 라이브러리, UI 라이브러리 등 풍부한 툴과 라이브러리 지원
    • Angular는 풀 프레임워크로 많은 기능을 내장
    • 그에 비해 필요한 라이브러리를 선택할 수 있어 유연성이 크고 개발자 경험이 우수함.
  • JSX: JavaScript와 HTML을 혼합한 JSX 문법을 통해 선언적이고 직관적인 UI 작성 가능
  • 핫 리로딩: 상태 변경 시 브라우저에서 즉시 반영되어 개발 속도를 빠르게 유지

TypeScript

  • 정적 타입 검사
  • 코드 가독성 및 유지보수성
  • 개발자 경험 개선
  • 동적 타입의 단점 해결
  • 초기 학습이 필요하지만, 장기적으로 안정성과 효율성을 높이기 위해 프로젝트에서 사용하기로 선정.

VITE

  • 빠른 빌드 속도
  • 빠른 개발 환경 구성
  • 코드 변경시, 즉각적인 반영
  • 간단한 설정

Context API

  • 별도의 라이브러리 없이 React에서 기본 제공
  • 상태가 자주 업데이트 되지 않고, 다른 컴포넌트에 간단히 전달할 때 적합.
  • 프로젝트에서 전역 상태 관리가 필요한 곳이 많지 않으며 자주 업데이트 되지 않기 때문에 사용하기로 선정.
  • → 상단 바 - 금액, 로그인

TailwindCSS

  • 일관된 디자인
  • 빠른 스타일링
  • 유연한 커스터마이징
  • 사용자 정의 클래스 (네이밍) 필요없음
  • css 중복 코드 감소
  • 반응형 디자인 지원
  • 초기 학습이 필요하지만 빠른 작업 속도와, 중복 코드를 줄이기 위해서 사용하기로 선정.

백엔드

Nest

  • Express와 달리 미리 정의된 아키텍처와 구조가 강제됨
    • 여러 사람이 공동으로 작업하는 프로젝트에서는 컨벤션을 유지하여 일관성 증가에 유리
    • 서로의 코드를 쉽게 이해할 수 있고 유지 보수성 증가
  • Express와 달리 타입스크립트에 초점을 두어 유연하게 사용할 수 있음
    • 정적 타입 검사, 타입 안정성 증가 등의 이점
    • 로깅, 테스팅, Swagger 사용에 강점
  • 데코레이터 기반 코드 작성으로 코드 가독성 및 유지보수성 확보 가능
  • 추가적인 라이브러리 없이 WebSocket, REST API 등 다양한 전송 프로토콜 기본 지원

WebSocket

  • 실시간 양방향 통신
    • 서버와 클라이언트가 동시에 데이터를 주고받을 수 있는 양방향 연결을 지원
    • 클라이언트의 요청 없이도 서버가 주도적으로 데이터 푸시 가능
  • 연결 지속성
    • 한 번 연결된 이후 매번 새로운 연결을 할 필요가 없다.
    • 오버헤드를 줄일 수 있다.
  • 더 나은 성능
    • 실시간으로 변하는 호가창, 주식 가격 등의 정보를 주고받는 데 효율적이다.
    • 주기적으로 서버에 상태 확인 요청 없이 즉각적으로 응답을 제공할 수 있다.
    • WebSocket은 API의 요청-응답 대비 시간 지연 없이 데이터 전송 가능

SSE

  • 일방향 데이터 전송
    • 서버가 클라이언트로 일방향 데이터 스트리밍 가능
    • 알림과 같이 서버가 일방적으로 클라이언트에게 데이터 전송하는 경우
  • 장점
    • 주요 브라우저에서 기본적으로 SSE를 지원하여, 간편하게 구현 가능
    • 지속 연결로 인해 API 대비 자원 소모 없음

Swagger

  • api 설계 및 문서화 도구로 항상 최신 상태를 유지할 수 있는 문서
  • 프론트엔드 백엔드 간 원활한 소통 도구로 사용 가능
  • Swagger UI를 사용하여 API를 웹에서 직접 테스트 가능
  • API 설계를 표준화하고 일관성을 유지하는 데에 도움

PostgreSQL

  • Timescale DB 통합 지원
    • Timescale DB는 PostgreSQL 위에서 작동하며 시계열 데이터 관리에 최적화.
    • 주식 가격, 체결 데이터와 같은 시계열 데이터 저장 및 처리 효율성 향상.
  • 시계열 데이터 관리 최적화
    • Hypertable 구조로 데이터 분할 및 관리 자동화.
    • 대용량 시계열 데이터 처리 성능 우수.
    • 시계열 데이터 압축 및 보존 정책 설정 가능.
  • 관계형 데이터베이스의 유연성
    • PostgreSQL의 강력한 관계형 데이터 모델 활용.
    • 주문 데이터, 사용자 데이터 등 정형 데이터와 시계열 데이터를 하나의 서버에서 관리.

Redis

  • 초고속 데이터 처리
    • 메모리 기반으로 빠른 오더북 조회 및 현재 가격 응답 가능.
  • Sorted Set 활용
    • 오더북 관리에 최적화된 자료구조 제공.
    • 가격 우선 매칭 알고리즘 구현 용이.
  • 실시간 데이터 캐싱
    • 현재 가격과 오더북을 캐싱하여 DB 부하 감소.
    • 빈번한 데이터 조회 시 성능 보장.
  • Pub/Sub 기능
    • 체결 알림, 가격 변동 이벤트를 실시간으로 전파.
    • 사용자 알림 및 UI 업데이트에 활용 가능.

Docker

  • VM과 대비하여 자원 소비가 가벼움
    • VM은 하드웨어 자원을 별도로 할당해야 하는 특징
    • Docker는 애플리케이션과 라이브러리만 포함되어 있어 효율적인 자원 관리 가능
  • 배포 과정에서 Docker 이미지로 관리하기 때문에 더욱 가벼움
  • 테스트 환경에서 즉시 시작이 가능하므로 시작 시간이 빠름
  • 이미지를 통해 관리하는 개발 환경으로 일관된 개발 환경 제공
  • 이미지를 기반으로 플랫폼 간 이식성 제공
  • 매우 활발한 커뮤니티 생태계를 보유하여 참고 자료가 많음

Github action

  • 통합된 환경
    • GitHub Actions는 GitHub와 완벽하게 통합되어 별도의 도구 설치 없이 리포지토리에서 바로 CI/CD 설정 가능.
    • Jenkins는 외부 도구를 설치하고 설정해야 하며, GitHub와의 통합을 위해 추가 플러그인과 설정이 필요.
  • 설정 용이성
    • GitHub Actions는 yaml 파일로 설정을 관리하여 코드와 CI/CD 설정을 같은 리포지토리에서 관리.
    • Jenkins는 UI나 XML 기반 설정을 사용해야 하며, 복잡한 설정은 관리가 어려울 수 있음.
  • 유연성
    • GitHub Actions는 GitHub 이벤트에 따라 자동 트리거가 가능하고, 다양한 액션을 쉽게 사용할 수 있어 유연함.
    • Jenkins는 플러그인 기반으로 다양한 기능을 지원하지만, 설정과 커스터마이징이 복잡할 수 있음.
  • 빠른 실행 속도
    • GitHub Actions는 GitHub 인프라에서 실행되어 빠르고 효율적.
    • Jenkins는 서버 성능에 따라 실행 속도가 달라질 수 있음.