Post

React 앱이 서비스가 되기까지

라우팅, 데이터 패칭, 인증, Next.js로 SPA 한계를 넘는 서비스화 로드맵

React 앱이 서비스가 되기까지

React 앱이 “서비스”가 되기까지: 라우팅 · 데이터 · 인증 · Next.js

React로 화면을 그릴 수 있게 되는 순간과,
그 React 앱이 실제 서비스로 운영 가능한 상태가 되는 순간 사이에는 큰 간극이 있다.

그 간극을 메우는 핵심 요소는 네 가지다.

  • 라우팅: 화면 전환과 사용자 흐름
  • 데이터 패칭: 서버와의 연결 방식
  • 인증: 사용자 상태와 접근 제어
  • Next.js: SPA 한계를 넘어서는 프레임워크적 해결

이 글은 기술 나열이 아니라,
왜 이 요소들이 반드시 필요해졌는지를 연결해서 설명한다.


1️⃣ 라우팅의 역할: “화면 전환”이 아니라 “상태 전환”

개념

라우팅은 단순히 URL에 따라 다른 컴포넌트를 보여주는 기능이 아니다.
라우팅은 사용자 여정(user journey)을 상태로 모델링하는 도구다.

URL = 현재 사용자가 서비스에서 어디에 있는가

왜 중요한가

라우팅이 생기면서 React 앱은 다음을 얻게 된다.

  • 브라우저 히스토리와 상태 동기화
  • 직접 접근 가능한 URL
  • 새로고침/뒤로가기/북마크 가능
  • 화면 전환을 “상태 변화”로 취급

즉, 라우팅은 UI 문제가 아니라 서비스 구조 문제다.

언제 문제가 되는가

  • 라우팅 없이 조건부 렌더링만으로 화면을 전환
  • URL과 실제 화면 상태가 불일치
  • 새로고침 시 앱 상태 소실

→ 이 시점부터 React 앱은 “페이지 없는 SPA”라는 한계에 갇힌다.


2️⃣ 데이터 패칭 전략: “언제, 어디서, 누가 가져오는가”

개념

데이터 패칭은 단순히 fetch를 호출하는 문제가 아니다. 핵심 질문은 다음이다.

  • 언제 데이터를 가져오는가? (초기 / 상호작용 후)
  • 어디서 가져오는가? (컴포넌트 / 라우트 / 서버)
  • 데이터의 생명주기는? (캐시 / 재검증)

왜 중요한가

서비스 단계에서는 데이터가 곧 UX와 성능을 결정한다.

  • 로딩 타이밍
  • 중복 요청
  • 에러 처리
  • 캐싱 전략

이걸 컴포넌트마다 제각각 처리하면:

  • 코드 중복
  • 비일관 UX
  • 상태 관리 폭증

언제 문제가 되는가

  • useEffect 안에 fetch가 난무
  • 로딩/에러 처리 방식이 화면마다 다름
  • 동일 데이터가 여러 번 요청됨

→ 데이터 패칭은 “컴포넌트 로직”이 아니라 애플리케이션 레벨 관심사다.


3️⃣ 인증의 본질: “로그인 기능”이 아니라 “신뢰 경계”

개념

인증은 단순히 “로그인/로그아웃” 버튼 문제가 아니다.

인증은 다음을 정의한다.

  • 이 사용자는 누구인가
  • 무엇에 접근 가능한가
  • 언제 접근 권한이 만료되는가

즉, 인증은 서비스의 신뢰 경계(trust boundary) 다.

왜 중요한가

인증이 도입되면 React 앱의 모든 레이어가 영향을 받는다.

  • 라우팅: 보호된 페이지
  • 데이터 패칭: 토큰 포함 요청
  • UI: 로그인 상태에 따른 분기
  • 상태 관리: 사용자 세션 유지

언제 문제가 되는가

  • 인증 상태를 단순 boolean state로 관리
  • 새로고침 시 로그인 풀림
  • 토큰 만료/갱신 로직 부재
  • 클라이언트만 믿는 접근 제어

→ 이 시점부터 “데모 앱”을 벗어나지 못한다.


4️⃣ SPA의 구조적 한계

React SPA는 강력하지만, 구조적 한계를 가진다.

SPA의 본질적 한계

1) 초기 로딩 비용

  • JS 번들 다운로드 후 실행
  • 첫 화면이 늦다

2) SEO 취약

  • HTML은 거의 비어 있음
  • 검색 엔진이 콘텐츠를 보기 어렵다

3) 데이터/라우팅/렌더링 분리 어려움

  • 라우트 진입 시 데이터 패칭
  • 로딩 상태 관리 복잡
  • 화면 전환 UX 제어 난이도 증가

4) 서버와의 역할 분리가 애매

  • 모든 로직이 클라이언트로 쏠림
  • 보안/성능/캐싱에 불리

이 한계가 누적되면 이런 질문이 나온다.

“왜 모든 걸 클라이언트에서만 해야 하지?”


5️⃣ Next.js의 등장 배경: SPA를 부정하지 않는 해법

개념

Next.js는 React를 버리지 않는다. React의 선언적 모델을 유지하면서, 서버라는 축을 다시 도입한다.

왜 필요한가

Next.js는 SPA의 한계를 다음 방식으로 풀어낸다.

SPA 한계Next.js의 해결
초기 로딩 느림서버 렌더링 / 스트리밍
SEO 취약사전 렌더링 HTML 제공
데이터 패칭 혼재라우트 단위 데이터 로딩
서버 역할 부재서버 컴포넌트 / 서버 액션

핵심은 이것이다.

Next.js는 “React + 서버”를 하나의 일관된 모델로 묶는다.


6️⃣ Next.js가 바꾼 사고방식

1) 라우팅이 구조의 중심이 된다

  • 파일 기반 라우팅
  • URL = 데이터 + UI 경계

2) 데이터 패칭 위치가 명확해진다

  • 서버에서 가져올 데이터
  • 클라이언트에서 필요한 상호작용

3) 인증/권한을 서버에서 다룰 수 있다

  • 토큰 노출 최소화
  • 보호된 라우트 구현 용이

4) “서비스” 관점 설계가 쉬워진다

  • 성능
  • SEO
  • 보안
  • 확장성

언제 Next.js가 과한 선택인가

문제가 되는 경우

  • 단순 내부 도구
  • SEO 불필요
  • 정적 대시보드
  • 서버 인프라 고려 불가

이 경우:

  • 순수 SPA + React Router
  • React Query / TanStack Query

로도 충분하다.


정리: React 앱이 서비스가 되기 위한 연결 고리

  • 라우팅은 화면 전환이 아니라 사용자 상태 모델
  • 데이터 패칭은 fetch가 아니라 UX 전략
  • 인증은 기능이 아니라 신뢰 경계
  • SPA는 강력하지만 한계가 있다
  • Next.js는 그 한계를 React 철학을 유지한 채 해결한다

한 문장으로 요약하면:

서비스가 된다는 건 “컴포넌트를 잘 짜는 것”을 넘어 사용자·데이터·서버를 하나의 흐름으로 묶는 일이다.


This post is licensed under CC BY 4.0 by the author.