2025. 2. 26. 23:28ㆍ프론트엔드/Next JS
useLocation 상세 설명
✅ 1. useLocation이란?
useLocation은 React Router에서 제공하는 훅(Hook)으로, 현재 URL의 정보를 가져올 때 사용됩니다.
이를 통해 현재 경로(pathname), URL 상태(state), 검색어(query string), 해시(hash) 등의 정보를 확인할 수 있습니다.
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
console.log(location);
return <div>현재 경로: {location.pathname}</div>;
}
✅ console.log(location);을 출력하면 다음과 같은 객체를 확인할 수 있습니다:
{
pathname: "/mainpage",
search: "?id=123&name=John", // URL의 쿼리 문자열
hash: "#section2", // URL의 해시 값
state: { key: "value" }, // navigate()로 전달된 state 값
key: "abcd1234" // React Router의 내부 키 값 (페이지 이동 시 갱신됨)
}
✅ 2. useLocation이 반환하는 속성
속성 설명 예제 값
| pathname | 현재 경로(페이지) | "/mainpage" |
| search | URL의 쿼리 문자열 | "?id=123&name=John" |
| hash | 해시(스크롤 위치 이동에 사용됨) | "#section2" |
| state | navigate()로 전달된 상태 값 | { facility: "회의실 B208" } |
| key | React Router에서 내부적으로 사용하는 키 값 | "abcd1234" |
✅ 3. useLocation의 주요 사용법
🔹 (1) 현재 경로(pathname) 확인
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
return <p>현재 경로: {location.pathname}</p>;
}
➡️ 예제 결과: /mainpage 가 출력됨
🔹 (2) URL의 Query String(쿼리 문자열) 읽기
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
const queryParams = new URLSearchParams(location.search);
const id = queryParams.get("id");
const name = queryParams.get("name");
return (
<div>
<p>ID: {id}</p>
<p>Name: {name}</p>
</div>
);
}
예제 URL: http://localhost:3000/mainpage?id=123&name=John
➡️ 결과:
ID: 123
Name: John
📌 URLSearchParams를 사용하여 쉽게 쿼리 문자열을 파싱 가능!
🔹 (3) navigate()로 전달된 state 읽기
다른 페이지에서 state 값을 전달하고 이를 useLocation으로 받을 수 있습니다.
✅ (1) navigate()로 state 값 전달하기
import { useNavigate } from 'react-router-dom';
function SendPage() {
const navigate = useNavigate();
const handleNavigate = () => {
navigate('/mainpage', {
state: { facility: '회의실 B208', date: '2025-03-01' }
});
};
return <button onClick={handleNavigate}>예약 정보 보내기</button>;
}
✅ (2) useLocation()으로 state 값 받기
import { useLocation } from 'react-router-dom';
function ReceivePage() {
const location = useLocation();
const { facility, date } = location.state || {}; // state가 없으면 빈 객체 반환
return (
<div>
<p>예약 시설: {facility}</p>
<p>예약 날짜: {date}</p>
</div>
);
}
➡️ 결과:
예약 시설: 회의실 B208
예약 날짜: 2025-03-01
📌 useLocation().state를 통해 navigate()에서 전달한 데이터를 받아올 수 있음!
🔹 (4) 특정 해시(hash) 값 확인
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
return <p>해시 값: {location.hash}</p>;
}
✅ 예제 URL: http://localhost:3000/mainpage#section2
➡️ 출력:
해시 값: #section2
📌 location.hash를 사용하면 특정 섹션(예: #section2)을 쉽게 감지 가능!
✅ 4. useLocation을 언제 사용해야 할까?
- 현재 경로(pathname)를 기반으로 UI 변경이 필요할 때
- 예: 특정 경로에서는 버튼을 숨기거나 스타일을 변경할 때
- URL의 Query String을 읽어서 데이터를 가져와야 할 때
- 예: ?id=123과 같은 쿼리 매개변수를 파싱할 때
- 페이지 이동 시 navigate()로 전달한 state 값을 받아야 할 때
- 예: 예약 페이지에서 입력한 정보를 다음 페이지로 전달할 때
- 특정 해시(#hash) 값을 감지해서 UI를 변경할 때
- 예: 해시 기반으로 특정 섹션으로 스크롤할 때
✅ 5. useLocation과 useEffect를 함께 사용하기
페이지가 변경될 때마다 특정 작업을 실행하고 싶다면 useEffect와 함께 사용하면 됩니다.
import { useLocation } from 'react-router-dom';
import { useEffect } from 'react';
function MyComponent() {
const location = useLocation();
useEffect(() => {
console.log("페이지가 변경됨:", location.pathname);
}, [location]); // location이 변경될 때 실행
return <p>현재 경로: {location.pathname}</p>;
}
➡️ 페이지 이동 시 console.log()로 현재 경로 출력됨!
🎯 정리
기능 코드 예제 설명
| pathname 확인 | location.pathname | 현재 경로 가져오기 |
| 쿼리 문자열(?id=123) 읽기 | new URLSearchParams(location.search).get("id") | Query String 값 가져오기 |
| navigate()로 전달된 state 값 읽기 | location.state | 페이지 이동 시 데이터 전달받기 |
| 특정 해시(#section) 확인 | location.hash | 해시 값 가져오기 |
| 페이지 변경 감지 | useEffect(() => {}, [location]) | 페이지가 변경될 때 실행 |
🚀 결론
- useLocation은 현재 URL 정보(경로, 쿼리, 해시, state 등)를 가져오는 훅이다.
- navigate()로 데이터를 전달할 수 있고, 이를 useLocation().state로 받아올 수 있다.
- useEffect와 함께 사용하면 페이지 변경 감지가 가능하다.
이제 useLocation을 자유롭게 활용할 수 있을 거예요! 😊
더 궁금한 점 있으면 언제든지 질문해주세요! 🚀
✅ useLocation().state 값은 어디에 저장되는가?
useLocation().state로 전달되는 데이터는 React Router 내부의 메모리(history stack) 에 저장됩니다.
즉, 캐시나 로컬 스토리지, 세션 스토리지 등에 저장되지 않으며, 브라우저의 새로고침(F5)이나 직접 URL 입력 시 사라집니다.
📌 1. state 값은 navigate()를 통해 전달됨
React Router에서 state는 navigate()를 사용하여 다른 페이지로 이동할 때 함께 전달하는 데이터입니다.
import { useNavigate } from 'react-router-dom';
function SendPage() {
const navigate = useNavigate();
const handleNavigate = () => {
navigate('/mainpage', {
state: { facility: '회의실 B208', date: '2025-03-01' }
});
};
return <button onClick={handleNavigate}>예약 정보 보내기</button>;
}
위 코드를 실행하면 React Router의 history stack에 state 값이 함께 저장됩니다.
📌 2. state 값은 useLocation()을 통해 받을 수 있음
import { useLocation } from 'react-router-dom';
function ReceivePage() {
const location = useLocation();
console.log(location.state);
return (
<div>
<p>예약 시설: {location.state?.facility}</p>
<p>예약 날짜: {location.state?.date}</p>
</div>
);
}
✅ console.log(location.state);
{ facility: "회의실 B208", date: "2025-03-01" }
📌 3. state 값은 새로고침(F5) 시 사라짐
React Router의 state는 브라우저의 메모리에만 저장되므로,
✔ 새로고침(F5) 또는 직접 URL 입력 시 state 값은 유지되지 않습니다.
console.log(location.state); // 새로고침 후에는 null 또는 undefined
✅ 새로고침해도 유지하려면?
- localStorage 또는 sessionStorage에 저장해야 함.
// 새로고침해도 유지되도록 sessionStorage에 저장
useEffect(() => {
if (location.state) {
sessionStorage.setItem("reservationData", JSON.stringify(location.state));
}
}, [location.state]);
// sessionStorage에서 불러오기
const savedState = JSON.parse(sessionStorage.getItem("reservationData"));
📌 4. state는 어디에 저장되나?
React Router는 내부적으로 history stack (브라우저 메모리) 을 사용하여 state 값을 저장합니다.
이는 브라우저 세션이 지속되는 동안만 유지되며, 새로고침하면 사라집니다.
🔹 비교: 다른 저장 방식과 차이
저장 방식 저장 위치 새로고침 영향 브라우저 종료 후 유지
| useLocation().state | 브라우저 메모리 (history stack) | ❌ (사라짐) | ❌ (사라짐) |
| sessionStorage | 브라우저 세션 | ✅ (유지됨) | ❌ (닫으면 사라짐) |
| localStorage | 로컬 저장소 | ✅ (유지됨) | ✅ (브라우저 닫아도 유지됨) |
✅ 결론
- useLocation().state 값은 React Router의 history stack(메모리)에 저장됨.
- 새로고침(F5) 또는 브라우저 종료 시 사라짐.
- 영구적으로 유지하려면 localStorage 또는 sessionStorage에 저장해야 함.
🔍 2. Vite, Next.js 등 일부 개발 환경에서 자동 sessionStorage 백업
- 일부 프레임워크(Vite, Next.js 등)에서는 새로고침 시 자동으로 state를 sessionStorage에 저장하고 복원하는 기능이 있음.
- 개발 환경(Vite Hot Module Replacement 등)에 따라 동작이 다를 수 있음.
🔍 3. 브라우저가 state를 내부적으로 캐싱하는 경우
- 크롬, 파이어폭스 등의 일부 브라우저에서는 이전 페이지 데이터를 보존하는 방식이 다름.
- 특히 **bfcache (Back-Forward Cache)**가 활성화된 경우, 이전 페이지 상태를 유지할 수 있음.
✅ 확인 방법
- 크롬 개발자 도구 → Application → Back/Forward Cache에서 확인 가능.
🔍 4. state가 sessionStorage 등에 저장된 경우
- sessionStorage에 state 값을 저장하고 새로고침 후 가져오는 로직이 포함되어 있으면 state가 유지됨.
✅ 이전 페이지에서 자동 저장하는 코드 예제
useEffect(() => {
if (location.state) {
sessionStorage.setItem("lastState", JSON.stringify(location.state));
}
}, [location.state]);
const savedState = JSON.parse(sessionStorage.getItem("lastState"));
- 이렇게 하면 navigate()로 이동한 state가 sessionStorage에 저장되므로 새로고침해도 유지됨.
🎯 결론
원칙적으로 useLocation().state는 새로고침 시 사라지는 것이 정상이다.
하지만 아래의 이유로 유지될 수도 있다:
- 뒤로 가기 / 앞으로 가기 (history stack 유지)
- Vite 등 일부 개발 환경이 sessionStorage를 자동 백업하는 경우
- 브라우저의 bfcache(Back-Forward Cache) 기능이 활성화된 경우
- 수동으로 sessionStorage에 저장하여 복원하는 코드가 있는 경우
'프론트엔드 > Next JS' 카테고리의 다른 글
| cacheTime VS staleTime (2) | 2025.02.27 |
|---|---|
| 🚀 React Query를 활용한 API 요청 최적화 (2) | 2025.02.27 |
| React에서 시간 슬롯 선택 시 자동 스크롤 기능 추가하기 (3) | 2025.02.26 |
| 📌 React Calendar 설정 및 커스텀 정리 (4) | 2025.02.24 |
| 🔍 투 포인터(Two-Pointer) 알고리즘 정리 및 팁 (1) | 2025.02.24 |