Query Param 대신 State 활용하기
Query Param의 장단점
// 예: Angular
this.router.navigate(["/work/detail"], {
queryParams: { backDts: "home" }
});
- 이 경우 URL은 다음과 같이 노출됩니다.
/work/detail?backDts=home
장점
- 새로고침해도 값 유지
- 북마크나 공유 가능한 URL 생성 용이
- SEO(검색 엔진 최적화)에 긍정적인 영향
단점
- 주소창에서 값이 그대로 노출됨
- 유저가 임의로 수정 가능 → 예상치 못한 동작
- 민감한 값이나 내부 상태를 담기엔 보안상 취약
즉, 공유해야 하는 값에는 적합하지만, 임시 상태나 보안이 필요한 값에는 적합하지 않습니다.
State
라우팅 시 state 옵션을 사용하면, 데이터를 URL에 보이지 않게 전달할 수 있습니다.
브라우저의 history 객체에만 저장되기 때문에 주소창에는 드러나지 않습니다.
Angular 예시
// A 컴포넌트 → 값 전달
this.router.navigate(["/work/detail"], {
state: { backDts: "home" }
});
// B 컴포넌트 → 값 수신
const nav = this.router.getCurrentNavigation();
console.log(nav?.extras.state?.["backDts"]); // "home"
React 예시
// A 컴포넌트 → 값 전달
navigate("/work/detail", { state: { backDts: "home" } });
// B 컴포넌트 → 값 수신
const location = useLocation();
console.log(location.state?.backDts); // "home"
두 프레임워크 모두 개념은 동일합니다.
URL에는 /work/detail만 보이고, 내부적으로만 backDts: "home" 값이 전달됩니다.
State의 특성
- URL 비노출: 주소창에 값이 보이지 않아 UX와 보안 측면에서 깔끔함
- 새로고침 시 사라짐: history에만 저장되므로 페이지 리로드 시 유지되지 않음
- 일시적 데이터에 적합: 모달 여부, 이전 페이지 컨텍스트 등 일회성 데이터
즉, state는 “한 번 전달하고 끝나는 데이터”에 최적화되어 있습니다.
예시 시나리오
- 뒤로 가기 컨텍스트 관리
- 예를 들어 /work/list에서 /work/detail로 들어갔다가, 다시 돌아갈 때 어떤 탭으로 돌아갈지(home, myWorks 등)를 알려주는 값.
- URL에 굳이 노출할 필요가 없고 내부적으로만 쓰면 충분합니다.
- 임시 UI 상태 전달
- 특정 버튼을 눌러 모달을 연 상태에서 라우팅했을 때, 도착 페이지에서도 모달을 띄워야 하는 경우
- 스크롤 위치 같은 값 (새로고침 시 초기화돼도 무방)
- 보안/프라이버시 강화
- 내부 식별자, 권한 관련 플래그 등 유저가 알 필요 없는 데이터
- 특히 관리자 페이지나 내부용 툴에서 민감한 데이터를 다룰 때 유용
Query Param vs State
| 항목 | Query Param | State |
| URL 노출 | 보임 | 안 보임 |
| 새로고침 유지 | 유지됨 | 사라짐 |
| 북마크/공유 | 가능 | 불가 |
| SEO 영향 | 있음 | 없음 |
| 보안/프라이버시 | 약함 | 강함 |
- 공유가 필요한 값은 Query Param, 임시적이거나 숨겨야 하는 값은 State
- 기본적으로 state로 전달: 임시 상태 값은 무조건 state 활용
- 필요 시 sessionStorage/localStorage 보완: 새로고침에도 유지해야 한다면 보조 저장소와 병행
- 중요한 값은 반드시 서버 검증: 프론트 단에서만 신뢰하지 말 것
'개발 공부' 카테고리의 다른 글
| Getter, Setter (0) | 2025.09.30 |
|---|---|
| onAnimationStart, onShow (0) | 2025.09.28 |
| bind (0) | 2025.09.24 |
| Hoisting(호이스팅) (0) | 2025.09.21 |
| 웹 서버(Web Server), 웹 애플리케이션 서버(WAS) (0) | 2025.09.20 |