Architecture

One platform.
Distinct backend responsibilities.

songjaehyun.com is built as a single frontend experience backed by two separate API tracks. The frontend stays consistent, while each backend is designed around a different kind of engineering problem: Java for stateful systems and algorithm execution, and Node.js for product-style APIs, validation, and contract-driven workflows.

Frontend

React + TypeScript interface

The frontend is the unified surface of the platform. It handles navigation, demo views, controls, technical explanations, and data visualization while routing requests to the appropriate backend service behind the scenes.

Java backend

Systems demo engine

The Java service runs real backend logic for interactive systems demos. It is built for stateful execution, per-session isolation, in-memory behavior, and educational transparency through structured method logging.

Node backend

Product API service

The Node.js service supports demos centered on API design. It focuses on request validation, response contracts, filtering, pagination, and OpenAPI-style patterns that reflect practical product engineering.

Visual overview

How the platform is organized

The platform is built as a unified frontend that communicates with two independent backend services. Each service focuses on a different category of engineering problems while remaining accessible through a single user interface.

songjaehyun.com platform architecture diagram

The React frontend routes demo interactions to two backend services deployed independently on AWS.

Request lifecycle

1. Explore

A visitor opens a demo, reads the context, and interacts with the UI through forms, controls, or preset scenarios.

2. Route

The frontend sends the request to the correct backend based on the type of demo being exercised.

3. Execute

The backend runs the demo logic, applies validation or state changes, and returns structured output for the UI.

4. Explain

The frontend renders the result as data, logs, state snapshots, or technical commentary so the system behavior is visible.

Separation of concerns

Each service is scoped intentionally. The frontend provides one coherent product surface, while the backends stay specialized. That separation keeps the platform easier to reason about, extend, and deploy without blending unrelated responsibilities together.

Why two backend tracks

Not every backend problem wants the same tools. Java is a better fit for demos centered on state, execution flow, and systems behavior. Node.js is a natural fit for product-facing APIs, schema validation, and fast iteration around contracts and endpoints.

Project structure

songjaehyun.com
│
├─ Frontend (Next.js + React + TypeScript)
│  ├─ Home
│  ├─ About
│  ├─ Architecture
│  └─ Demos
│     ├─ Java demos
│     │  ├─ Expiring Key Value Store
│     │  └─ Rate Limiter
│     └─ Node demos
│        ├─ Product Catalog API
│        └─ OpenAPI Playground
│
├─ api.songjaehyun.com
│  └─ Java backend for systems-oriented demos
│
└─ node-api.songjaehyun.com
   └─ Node backend for product-style API demos

Infrastructure

AWS deployment architecture

The platform is deployed using AWS infrastructure that separates the frontend from the backend services while keeping the system simple and modular. Each API runs in its own containerized service while the frontend is delivered globally through a CDN.

Frontend delivery

S3 + CloudFront

The React frontend is built as a static site and hosted in Amazon S3. CloudFront distributes the site globally through a CDN, providing low latency and clean separation between the user interface and backend services.

Java service

ECS + Fargate

The Java backend runs in Docker containers deployed on Amazon ECS using Fargate. This service powers the systems-oriented demos that require stateful execution and backend processing.

Node API

ECS + Fargate

The Node.js API runs as a separate containerized service on ECS Fargate. It powers the product-style API demos focused on validation, request handling, and OpenAPI-driven workflows.

Networking

Both backend services run behind an AWS Application Load Balancer and are exposed through separate subdomains. This keeps the services isolated while allowing the frontend to route requests to the appropriate API.

songjaehyun.com          → React frontend (S3 + CloudFront)
api.songjaehyun.com      → Java backend (ECS / Fargate)
node-api.songjaehyun.com → Node API backend (ECS / Fargate)

Connect

If you'd like to see more of my work or connect professionally, you can find me through the following channels.