정적 라우팅의 한계
static 라우팅을 사용하면 매번 새로운 페이지로 이동할 때 마다 폴더를 생성해 주어야 한다.
게시판에 수천, 수만개의 게시글이 있다고 한다면, 이렇게 폴더를 만들어 운영하기는 불가능 할것이다.
Next 의 동적 라우팅
동적으로 받을 주소를 [] 안에 담으면 된다. 아래의 예시는 qqq라는 변수에 동적 라우팅의 정보를 담는다.
router 변수를 만들어 주고 router.query 로 정적 주소의 값을 받아온다
const router = useRouter();
console.log(router.query.qqq);
전체 예시코드
import { useQuery, gql } from "@apollo/client";
import { useRouter } from "next/router";
const FETCH_BOARD = gql`
query fetchBoard($number: Int) {
fetchBoard(number: $number) {
number
writer
title
contents
}
}
`;
export default function StaticRoutingMovedPage() {
const router = useRouter();
console.log(router);
const { data } = useQuery(FETCH_BOARD, {
variables: {
number: Number(router.query.qqq),
},
});
console.log(data);
return (
<div>
<div>{router.query.qqq}번 페이지 이동이 완료되었습니다.</div>
<div>작성자 : {data?.fetchBoard?.writer}</div>
<div>제목 : {data?.fetchBoard?.title}</div>
<div>내용 : {data?.fetchBoard?.contents}</div>
</div>
);
}
게시글을 등록하면 바로 등록한 게시글로 동적 라우팅 하기
상태변수를 사용해서 사용자의 input을 mutation에 넣으면 되지만, 실습에서는 하드코딩으로 내용을 넣었다.
게시글 등록 페이지
import { useMutation, gql } from "@apollo/client";
import { useRouter } from "next/router";
const 나의그래프큐엘세팅 = gql`
mutation createBoard($writer: String, $title: String, $contents: String) {
createBoard(writer: $writer, title: $title, contents: $contents) {
_id
number
message
}
}
`;
export default function GraphqlMutationPage() {
const router = useRouter();
const [나의함수] = useMutation(나의그래프큐엘세팅);
const onClickSubmit = async () => {
try {
// try에 있는 내용을 시도하다가 실패하면 , 다음에 있는 모든 줄들을 무시하고, catch 에 있는 내용이 실행됨.
const result = await 나의함수({
variables: {
// variables === $ 의 역할
writer: "훈이",
title: "안녕하세요",
contents: "반갑습니다",
},
});
console.log(result);
router.push(
"/section05/05-05-dynamic-routing-board-mutation-moved/" +
result.data.createBoard.number
);
} catch (error) {
alert(error.message);
}
};
return <button onClick={onClickSubmit}>GraphQL-API 요청하기</button>;
}
등록된 게시글 상세 조회 페이지
import { useQuery, gql } from "@apollo/client";
import { useRouter } from "next/router";
const FETCH_BOARD = gql`
query fetchBoard($number: Int) {
fetchBoard(number: $number) {
number
writer
title
contents
}
}
`;
export default function StaticRoutingMovedPage() {
const router = useRouter();
console.log(router);
const { data } = useQuery(FETCH_BOARD, {
variables: {
number: Number(router.query.number),
},
});
console.log(data);
return (
<div>
<div>{router.query.number}번 페이지 이동이 완료되었습니다.</div>
{/* <div>작성자 : {data ?? data.fetchBoard.writer}</div> */}
<div>작성자 : {data?.fetchBoard?.writer}</div>
<div>제목 : {data?.fetchBoard?.title}</div>
<div>내용 : {data?.fetchBoard?.contents}</div>
</div>
);
}
728x90
'Frontend 프론트엔드' 카테고리의 다른 글
[ 20 ] 상태변경 (setState) 의 원리 , 활성화 버튼 실습 (0) | 2024.06.17 |
---|---|
[ 19 ] 폴더구조 나누기 실습 : container-presenter 패턴 (1) | 2024.06.14 |
[ 17 ] Next.js static 라우팅 실습하기 (0) | 2024.06.12 |
[ 16 ] graphql 데이터 전달 실습 (0) | 2024.06.12 |
[ 15 ] graphql 실습 , 개발자 도구 활용방법 (0) | 2024.06.12 |