자주 사용하는 핵심 훅은 다음과 같다.
useNavigate: 페이지를 강제로 이동시켜야 할 때 사용한다. (예: 버튼 클릭 시 이동)
useLocation: 현재 머물고 있는 페이지의 URL 정보와 전달받은 상태(State)를 가져올 때 사용한다.
useParams: URL 경로에 포함된 파라미터(예: /cafe/:id에서 id 값)를 읽어올 때 사용한다.
/cafe/123, /profile/gemini<Route path="/cafe/:id" />처럼 :을 붙여 변수명을 정한다.// 주소가 /cafe/123 일 때
const { id } = useParams();
console.log(id); // "123"
useSearchParams: URL 뒤의 쿼리 스트링(예: ?search=cafe)을 다룰 때 사용한다.
const handleApply = () => {
// 1. /cafelist 페이지로 이동하면서
// 2. state라는 객체 안에 우리가 선택한 값들을 실어 보낸다.
navigate("/cafelist", {
state: {
region: regionId,
door: selectedDoor,
tags: selectedTags,
},
});
};
export default function CafeListPage () {
const location = useLocation();
// 1. 전달받은 state가 있으면 사용하고, 없으면(직접 접속 등) 기본값을 설정한다.
const state = (location.state as LocationState) || {
region: null,
door: null,
tags: []
};
// 2. 구조 분해 할당을 통해 각 필터 값을 변수로 꺼낸다.
const { region, door, tags } = state;
return (
<div>
{/* 3. 꺼낸 데이터를 화면에 보여준다. */}
<p>지역: {region}</p>
<p>문: {door}</p>
<p>태그: {tags.join(", ")}</p>
</div>
);
}
웹 서비스를 만들다 보면 “데이터를 넘긴다”는 말이 두 가지 의미로 쓰인다.
1. 프론트엔드 내부에서 데이터를 넘기는 것
2. 백엔드 서버와 통신해서 데이터를 받아오는 것
예를 들어
1. 사용자가 지역: 서강대 / 출입문: 정문 / 태그: 콘센트 있음 을 선택하고 “검색”을 누르면, 우리는 useNavigate() 를 이용해서 페이지를 이동시키면서, 이 검색 조건 데이터(state) 를 함께 넘긴다.
navigate("/cafes", {
state: { region, door, tags }
});
useLocation() 으로 그 데이터를 받는다.const location = useLocation();
const { region, door, tags } = location.state;
즉, useNavigate → useLocation은 “검색 조건을 옆 페이지로 전달하는 내부 메신저” 역할이다.
이 과정에서부터 진짜 데이터 요청을 한다.
useLocation으로 받은 region, door, tags는 아직 카페 데이터가 아니고, 검색 조건일 뿐이기 때문에 이 조건을 가지고 서버에 요청을 해야한다.
① 필터 데이터 준비 (CafeListPage)
const location = useLocation();
const { region, door, tags } = location.state;
② 서버에 요청 보내기 (Request)
🔹 GET 방식 - 주소창에 조건을 붙여서 보내는 방식
/api/cafes?region=sogang&door=정문
React 코드 예시:
fetch(`/api/cafes?region=${region}&door=${door}`)
✔️ 특징:
🔹 POST 방식 - 데이터를 body에 담아서 보낸다.
fetch("/api/cafes", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ region, door, tags })
});
✔️ 특징:
③ 서버의 역할 (Response)
서버는 요청을 받으면 1) DB에서 조건에 맞는 카페를 찾고, 2) 그 결과를 JSON 형태로 만들어 프론트엔드에 응답한다.
예:
[
{
"id": 1,
"name": "카페 A",
"region": "서강대"
},
{
"id": 2,
"name": "카페 B",
"region": "서강대"
}
]
④ 화면에 그리기 (Rendering)
const [cafes, setCafes] = useState([]);
useEffect(() => {
fetch(...)
.then(res => res.json())
.then(data => setCafes(data));
}, []);