본문 바로가기

Learn/Next.js

Next.js 프로젝트 (2)

 

 

오늘은 글 조회 및 상세 페이지를 만들어 봤다.

 

 항상 가장 개발의 기초는 CRUD부터 시작되는 것 같다.

 

이번시간에는 CRUD 중 R을 배웠다.

그리고 가장 크게 와닿은 부분은 프로그램을 처음 사용하거나 어려운 부분이 발생 했을 땐

 

글로 먼저 적어놓고 그걸 해석하는 것

 

"배운적 없는데 어떻게 만들어요" 가 나오는게 아닌 

 

배우지 않았고 해보지 않았더라도 그걸 해나아가는게 개발자

해본것만 할 줄 알면 그건 기술자라는 데

 

반박불가!

 

 게시글 조회

 

 DB에 있는 저장된 글들을 보여주려면

1. DB에서 가져온 걸 보여주려는 html 페이지가 필요

2. 페이지에 들어가면 DB에서 가져온 데이터를 꺼내서

3. html 페이지에 넣어서

4. 넣은 데이터를 보여준다.

이렇게 말로 적고

코드로 해석하면 끝~

 

일단 Routing 할 폴더를 먼저 만들고 그 안에 page.js를 만들어 새로운 url을 만들어서 html 페이지를 만들어줬다.

export default async function List() {
<div></div>
}

이 후 간단한 css로 데이터가 어떻게 보여지는지 표시해주고 

.list-bg {
    background: rgb(249, 250, 255);
    padding: 10px;
  }
  .list-item {
    background: white;
    border-radius: 10px;
    padding: 20px;
    margin-bottom: 5px;
    box-shadow: rgb(224, 224, 224) 0px 2px 4px 0px;
  }
  .list-item h4 {
    font-size: 20px;
    font-weight: 800;
    margin: 0;
  }
  .list-item p {
    color: grey;
    margin : 5px 0px;
  }

저번처럼 데이터를 가져온다.

  let db = (await connectDB).db('forum');
  let result = await db.collection('post').find().toArray();

 

result에 가져온 data를 저장했으니 저장한 걸 map을 통해 보여준다.

return (
    <div className="list-bg">
        {result.map((el,idx)=>{
            return(
                <div className="list-item" key={idx}>
                        <h4>{el.title}</h4>
                    <p>{el.content}</p>
                </div>
                )
        })}
    </div>

 

 상세페이지 만들기

 

 이번에도 글로 먼저 어떻게 할지 정하고 그걸 해석하면

 1. 글 제목을 누르면

 2. 상세페이지로 이동하게 한다.

 3. 그 페이지는 DB에서 그 게시물을 가져와 보여준다.

 

 그런데 URL을 어떻게 할 지 모르겠으니 다른 곳에서 하고 있는 걸 참고하면 보통 글의 ID 값을 많이 가져와 사용한다.

이때 React에선 useParams를 사용하여 랜덤으로 아이디를 부여하고 그걸 사용해서 라우팅을 했는데

 

Next.js에선 /detal/{id} 하기 위해서 dynamic Route를 사용한다.

 

이런식으로 만들면 뒤에오는 id값은 아무 문자나 와도 상관이 없이 잘 들어가진다.

 

이후 한가지 자료만 보여주기 위해서 DB에서 글에 맞는 내용을 불러오기 위해 findOne()이라는 메소드를 사용해준다.

 

let result = await db.collection('post').findOne({ _id: new ObjectId(props.params.id)})

그리고 DB에서 불러온 걸 리턴해주면 끝

 

 return(
    <div>
        <h4>상세페이지임</h4>
        <h4>{result.title}</h4>
        <p>{result.content}</p>
    </div>
    )

 

이 때 글 제목을 클릭해서 상세페이지로 넘어가야 하므로 list.js에서 LInk를 써준다.

<Link  href={`/detail/${el._id}`}>
           <h4>{el.title}</h4>
 </Link>

 

이렇게 서버컴포넌트로 만드는 방법이 있고

 

클라이언트컴포넌트는 방법이 따로 있다.

Link를 쓰는게 더 편하지만 알고 있어야 할 것 같다.

 

'use client'

import { useParams, usePathname, useRouter } from "next/navigation"

export default function DetailLink(){
    let router = useRouter()
    return (
        <button onClick={()=>{ router.push('/list')}}>버튼</button>
    )
}

function ex(){
return(
    <>
<button onClick={()=>{ router.back() }}>버튼</button>
// router.back() 실행하면 뒤로가기

<button onClick={()=>{ router.forward() }}>버튼</button>
// router.forward() 실행하면 앞으로가기

<button onClick={()=>{ router.refresh() }}>버튼</button>
router.refresh() 실행하면 새로고침


prefetch 기능


<button onClick={()=>{ router.prefetch('/어쩌구') }}>버튼</button>
router.prefetch('/어쩌구') 실행하면 '/어쩌구'의 내용을 미리 로드해줍니다.

그럼 그 페이지 방문할 때 매우 빠르게 방문할 수 있습니다.

빠른 사이트를 만들고 싶을 때 쓸 수 있는 유용한 기능

<Link href={'/어쩌구'} prefetch={false}>링크</Link>
자동으로 미리 로드하는게 싫으면 prefetch 속성을 false로 바꿔줍시다.

링크가 많은 게시판의 경우 모든 링크를 다 읽을게 아닌데 굳이 모든걸 미리 로드하는건 자원낭비

let a = usePathname()
let b = useSearchParams()
let c = useParams()

usePathname() 쓰면 현재 URL 출력

useSearchParams() 쓰면 search parameter (query string) 출력

useParams() 쓰면 [dynamic route]에 입력한내용 (URL 파라미터) 을 출력

    </>
)

}

 

'Learn > Next.js' 카테고리의 다른 글

Next.js (6) static/dynamic rendering/캐싱  (0) 2023.07.08
Next.js (5)  (0) 2023.07.07
Next.js 프로젝트(4)  (0) 2023.07.05
Next.js 프로젝트 (3)  (0) 2023.07.04
Next.js 프로젝트 (1)  (0) 2023.07.01