URL은 단순한 리소스 주소가 아니라 애플리케이션 상태(State)를 담는 1급 객체다.
좋은 URL은:
많은 프론트엔드 개발자가 Redux·Context·전역 스토어에만 집중하지만,
URL은 1991년부터 동작해온 원조 상태 관리 시스템이다.
URL을 설계하는 순간, “어떤 상태를 공유·저장·복원 가능한가?”를 결정하는 것과 같다.
사례: PrismJS 설정 URL, GitHub 라인 하이라이트, Google Maps 좌표, Figma 링크 등
→ 모두 URL을 state container로 활용.
URL을 상태로 저장하면 아래가 자동으로 따라온다.
→ URL은 자연스럽고 예측 가능한 상태 저장소다.
URL은 여러 부분으로 상태를 담을 수 있다.
계층 구조·리소스 위치 표현
/users/123/posts
/docs/api/authentication
/dashboard/analytics
구체적 상태(필터·옵션·모드 등)를 저장하는 데 가장 적합
?theme=dark&lang=en
?page=2&limit=20
?status=active&sort=date
?from=2025-01-01&to=2025-12-31
문서 내 특정 위치/선택 상태를 표현
#L20-L35 (GitHub 코드 하이라이트)
#features
페이지 내부 텍스트로 직접 링크
→ URL이 “문서 내 컨텍스트”까지 저장 가능해짐
?languages=javascript+typescript+python
?filters=status:active,owner:me
?config=eyJyaWNrIjoicm9sbCJ9==
?debug=true
?mobile
?tags[]=react&tags[]=hooks
→ 중요한 건 일관성.
https://prismjs.com/download.html#themes=prism&languages=markup+css+scss+sql&plugins=line-numbers
→ UI 전체 설정을 URL 하나에 담아 공유·복원 가능.
...#L108-L136
좌표, 줌 레벨, 지도 모드까지 모두 URL에 포함.
캔버스 위치, 확대 비율, 선택 노드 등 전체 컨텍스트를 URL로 저장.
?brand=dell+hp&price=500-1500&sort=price-asc
→ 필터링 상태를 공유·저장·복원하기 쉬움.
판단 기준:
“이 URL을 누군가에게 보내면 동일한 상태를 보여야 하는가?”
Yes → URL
No → 메모리/스토어
URLSearchParamsconst params = new URLSearchParams(window.location.search);
const view = params.get('view') || 'grid';
window.history.pushState({}, '', `?${params.toString()}`);
window.addEventListener('popstate', () => {
// URL → UI 복원
});
const [searchParams, setSearchParams] = useSearchParams();
const sort = searchParams.get('sort') || 'price';
setSearchParams(prev => {
const params = new URLSearchParams(prev);
params.set('sort', newSort);
return params;
});
?theme=dark // OK
?theme=light // light가 기본이면 불필요
실시간 검색에서 URL 남용 방지:
history.replaceState({}, '', `?q=${value}`);
좋은 URL은 UI·백엔드·사용자·검색엔진이 모두 이해할 수 있는 규약이 된다.
/products/laptop?color=silver&sort=price
→ URL만 읽어도 상태가 드러난다.
URL = 캐시 키
?v=2
?beta=true
?experiment=new-ui
새로고침 → 상태 초기화 → UX 파괴
절대 금지.
?foo=true&x=1 → No
?theme=dark&page=2 → Yes
URL은 구성 옵션 쓰레기통이 아니다.
replaceState 남용 → 사용자 분노
프런트엔드 상태 관리 전에 항상 물어봐야 한다.
“이 상태, URL에 담으면 훨씬 낫지 않을까?”