구현하기

개발 및 배포하기

주요 화면

통계 데이터 화면
통계 데이터 화면
실시간 데이터 화면
실시간 데이터 화면
태블릿 화면
태블릿 화면
모바일 화면
모바일 화면

주요 기술 및 기능

v5.3.3
v13.5.4
v18.2.0
v4.36.1
v3.3.3
v2.38.1

공통

  • 경로 파라미터와 Format.js을 이용한 다국어(영어/한국어) 지원

서버측

DB 데이터 패칭 및 페이지 렌더링

  • Supabase 서버를 통한 PostgreSQL 데이터베이스

  • Next.js 및 Supabase 클라이언트를 사용한 URL 기반 데이터 요청

  • 사전 설정 데이터 요청에 대한 페이지 사전 렌더링

  • 사용자 지정 데이터 요청에 대한 동적 페이지 렌더링

  • Next.js 서버 라우트를 경유한 공공 API 실시간 데이터 요청

[참고] 서버측 데이터 패칭을 진행하는 이유

클라이언트측

Hydration 및 데이터 출력, 서버로 데이터 요청

  • React Query 클라이언트로 Hydration 진행하여 서버-클라이언트간 데이터 싱크 및 클라이언트측 데이터 요청 발생 대비

  • React Hook Form 기반 데이터 요청 폼

  • CSS 필터를 사용한 데이터 시각화

  • Tone.js를 사용한 데이터 청각화

  • CSV 다운로드

  • 다크모드

  • 반응형 디자인

주요 동작 원리

페이지별 데이터 유형과 렌더링 방식

URL이 곧 페이지별 데이터 요청에 필요한 인풋이 된다. 그러므로 한 번 발생한 URL 요청에 대해선 캐싱 된 응답을 전송하여 성능을 최적화한다. 단, 실시간 데이터 요청(Realtime)은 URL이 동일하더라도 캐싱을 진행하지 않는다. 사전 설정 데이터(Preset)에 해당하는 라우트에 대해선 쿼리 파라미터를 생략하고, 필요한 인풋을 상숫값으로 지정해두어 빌드 타임에 데이터를 불러와 페이지를 생성해둔다.

Route
URL example
Data type
Rendering type
Caching

/[collection]

Preset

(Database)

SSG

Yes (Automatic)

/today

Realtime

(Open API)

SSR

No (Manual)

클라이언트, 서버, 데이터베이스간 생명 주기

URL 입력부터 클라이언트로의 최종 데이터 응답까지 요청-응답 생명 주기를 데이터 처리 주체에 따라 구분하고, 시간의 흐름에 따라 정리했다.

Dynamic Route Lifecycle
동적 라우트 요청-응답 생명 주기
Static Route Lifecycle
정적 라우트 요청-응답 생명 주기
Role
Name
Powered by

Client

Browser

OS

Server

Next.js

Vercel

Database

Supabase Server & PostgreSQL Database

Supabase

CDN

Supabase CDN

Supabase

컴포넌트 구조

Component type
Role

Server Component

Data Fetcher(Provider)

Client Component

Data Consumer, Data Updater

아래 그림은 서버 to 클라이언트, 컴포넌트 to 컴포넌트 간 데이터 흐름을 나타낸다. 서버 컴포넌트는 데이터베이스 서버에 데이터를 요청하고 이를 클라이언트 컴포넌트로 전달하는 역할을 담당한다. 클라이언트 컴포넌트는 전달받은 데이터를 출력하는 역할을 담당하며, 출력 양식에 맞게 데이터셋(Dataset), 시퀀스(Sequence), 씬(Scene), 비트(Bit) 순으로 변환하는 과정을 거친다.

컴포넌트 간 데이터 흐름

의존성 구조

애플리케이션 동작을 이루는 의존성들은 5개의 계층으로 구성되어있다. 각 계층은 안쪽으로부터 바깥쪽으로 의존성 규칙을 가지며, 안쪽 계층은 바깥쪽 계층에 대해 알지 못한다. 이로 인해, 각 계층은 독립적으로 변경하거나 업데이트할 수 있다.

디렉토리 역할로 본 의존 관계도
리소스 관리 역할로 본 의존 관계도
  • lib 그룹은 외부 node_modules 의존성을 캡슐화하여 domains, components, app 그룹에 의존성으로 주입된다. 단, Next.js 프레임워크 특성상 Next.js 내장 모듈은 appcomponents 그룹에서 직접 호출할 수 있도록 허락한다.

  • domains 그룹은 lib/model의 데이터베이스 스키마와 타입을 바탕으로 유니버셜 환경에서 사용할 수 있는 데이터 조회 및 업데이트 함수를 정의한다. 또한 이를 바탕으로 클라이언트측 데이터 Hydration을 위한 리액트 쿼리 함수도 정의한다.

  • appcomponents 그룹은 유스케이스, 즉 domains내 정의된 데이터 조회 및 변경 함수를 호출해 실행하는 페이지(라우트) 혹은 컴포넌트를 포함하며, 서버 데이터 유틸 클래스를 포함한 기타 유틸 함수들을 호출하여 UI 데이터로 매핑한다.

  • 레이아웃, 테마 등의 전역 UI 상태는 components 그룹에서 관리한다.

성능

업데이트 예정

Last updated