본문 바로가기
React ( + Next.js )

[Next.js] /pages - 라우팅

by doozzuri 2022. 4. 21.
반응형

1. 라우팅

- 라우팅 설정  : /pages 폴더에 파일을 만들면 파일의 경로에 따라 경로가 설정됨.

 

1-1. 정적 페이지 라우팅

- 폴더에 파일을 만드는 것만으로 경로가 자동 설정됨.

pages/index.jsx
import Link from "next/link";

const App = () => {
	return(
        <div>
            <h2>Link to 'sample' Page</h2>
            <Link href="/sample">
            	<a>Move to '/sample'</a>
            </Link>
        </div>
    );
}

export default App;
/pages/sample.jsx
import Link from "next/link";

const Sample = () => {
    return (
        <div>
            <h2>Link to 'main' Page</h2>
            <Link href="/">
                <a>Move to '/'</a>
            </Link>
        </div>
    )
}

export default Sample;

 

1-2. Link 컴포넌트

- 넥스트에서 주소 이동을 할때는 주로 Link 컴포넌트를 사용하게됨.

- Link 컴포넌트는 DOM을 가지진 않지만 자식인 <a>태그를 클릭하면 클라이언트 측 내비게이션을 실행하여 페이지 전체를 새로 불러오지 않고 주소를 이동할 수 있음.

- Link 컴포넌트를 사용하여 주소 이동을 하면 브라우저의 History API를 지원함으로써 뒤로가기 시 새로운 컴파일 시간을 갖지 않고 이전에 렌더링된 페이지를 가져옴.

* Link 컴포넌트를 사용하지 않고 <a> 태그만으로 주소이동을 하면? 
- 페이지 전체를 새로 받아오게되어 속도가 느려지고, 깜박임도 발생
- 뒤로가기를 하여도 페이지를 새로 받아옴.

* Link컴포넌트만 사용하고 <a>태그를 사용하지 않는다면?
- Link 컴포넌트로 감싼 기본적인 html 태그는 라우팅 기능을 수행하지만 웹접근성과 SEO에 좋지 않음.

* Link 컴포넌트에 리액트 컴포넌트를 사용하면 ?
//* 리액트 컴포넌트
const Child = () => {
    return <p>Move to '/sample'</p>
};

<Link href="sample">
    <Child />
</Link>​

- 리액트 컴포넌트를 클릭해도 라우팅되지 않음.
- 리액트 컴포넌트에 라우팅 기능을 주려면 <a> 태그로 감싸야함.

 

1-3. 동적 페이지 라우팅

- 파일이름을 대괄호로 감싸서 만들면, 동적 페이지임을 의미함.

- 대괄호에 감싼 이름은 임의의 값이 될수 있음.

 

- /pages/test/[name].jsx 생성

/pages/test/[name].jsx

import Link from "next/link";

const name = () => (
    <div>
        <h2>Hello!!</h2>
        <Link href="/"> Move to '/' </Link>
    </div>
)
/pages/index.jsx
import Link from "next/link";

const App = () => {
    return (
        <div>
            <h2>Link to 'hello' Page</h2>
            
            <Link href="/test/hello">
                <a>Move to '/test/hello'</a>
            </Link>
            
            <!-- next 9.5.3 이전 버전 -->
            <Link href="/test/[name]" as="/test/hello">
                <a>Move to '/test/hello'</a>
            </Link>
        </div>
    );
};

export default App;

 

- 파일 이름에서 대괄호에 있는 값은 라우터 객체(router)의 query 속성으로 들어가게됨.

- next/router의 useRouter(라우트 객체를 리턴함)를 훅스를 사용해 확인할 수있음.

/pages/test/[name].jsx

import Link from "next/link";
import { useRouter } from "next/router";

const name = () => {
    const router = useRouter();
    console.log(router);
    //query 속성안에 {name: "hello"}값이 들어있음.
    
    return (
        ...
    );
}

export default name;

 

 

1-4. 라우터 객체를 이용한 라우팅

- 주소 이동을 항상 Link 컴포넌트를 사용하지 않음.

- 함수 내에서 라우트 이동을 하게되는 경우도 있음*

- 라우터 객체는 다양한 함수를 제공하고, 주소 이동을 위한 함수도 제공.

- 라우터 객체 안에는 push, replace, back 등의 함수를 이용해 주소를 이동할 수 있음.

 

 (1)  router.push

  - 자주사용.

  - 첫번째 인자에 pathname

  - 두번째 인자에 asPath : (next 9.5.3 버전 이하) 동적 주소 이동시 asPath를 전달해야 클라이언트 네비게이션이 작동함.

  - 세번째 인자에 options 전달.

 

/pages/index.jsx
import { useState } from "react";
import { useRouter } from "next/router";

const App = () => {
    const [name, setName] = useState("");
    const router = useRouter();
    
    return (
        <div>
            <!-- /sample 페이지로 이동(정적이동) -->
            <button type="button" onClick={ () => router.push("/sample")}>
                sample로 가기
            </button>
            
            <!-- input 으로 입력받은 텟트르 주소로 이동(동적이동) -->
            <p>이름</p>
            <input
              value={name}
              onChange={(e) => setName(e.target.value)}
              style={{ marginRight: "12px" }}
            />
            <button type="button" onClick={ () => router.push(`/test/${name}`) }>
                {name}으로 가기
            </button>
        </div>
    );
}

export default App;
/pages/test/[name].jsx
import Link from "next/link";
import { useRouter } from "next/router";

const name = () => {
    const { query } = useRouter();
    
    return(
        <div>
            <h2>hello!! {query.name}</h2>
            <Link href="/">Move to '/'</Link>
        </div>
    );
}
* useState Hooks
- 함수형 리액트 컴포넌트에서 리액트의 state 상태를 관리하기 위해 사용하는 Hooks
- 반환값인 배열의 첫번째 값에 상태값, 두번째 값에 상태값을 바꿀 수 있는 함수를 리턴.
- input value={name} 에 텍스트를 입력하면 nam의 상태 값은 setName 함수로 인해 값이 변경되고 컴포넌트는 리렌더링함.
import { useState } from "react";

const [name, setName] = useState();​


반응형

'React ( + Next.js )' 카테고리의 다른 글

[PM2] PM2 사용하기  (0) 2022.05.19
[Next.js] SSR(Server-Side-Rendering) vs SSG(Static-Site-Generation)  (0) 2022.04.27
[Next.js] /public - 정적 파일  (0) 2022.04.21
[Next.js] 넥스트  (0) 2022.04.21
[React] React란  (0) 2022.02.15