서버와 클라이언트 를 함께 구현할 수 있는 올인원 솔루션
npx create-next-app@latest
npm install styled-components@5.3.5
npm install axios
npm install mongoose
{
"name": "projectname",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --port 3005",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"axios": "^1.7.2",
"cookies-next": "^4.2.1",
"jsonwebtoken": "^9.0.2",
"mongodb": "^6.6.1",
"next": "^14.2.3",
"react": "^18",
"react-dom": "^18",
"styled-components": "^5.3.5"
}
}
변수의 경우 ServerComponent -> ClientComponent 가 가능하지만, 함수의 경우 ServerComponent -> ClientComponent 가 불가능하다
const ClientComponent = (props)=>{
return(
<>
<div className="BodyT1">
{props.params.Index}
</div>
</>
)
}
export default Home;
클라이언트 컴포넌트에서만 사용 가능
'use client'
import {useEffect, useState} from "react";
잘 안되긴 하지만...
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button type="button" onClick={() => router.reload()}>
새로고침
</button>
)
}
'use server'
import {redirect} from "next/navigation"
async function ServerComponent (){
redirect('/')
}
'use client'
import {useRouter} from "next/navigation";
function ClientComponent (){
let router = useRouter();
router.push('/')
}
const CompName = ({children})=>{
return(
<>
{children} // 이게 태그 안의 내용이다. innerHTML 같은거
</>
)
}
export default CompName
import Image from "next/image";
import styles from "./page.module.css";
export default function Home() {
return (
<div className={styles.page}>
<main className={styles.main}>
<Image
className={styles.logo}
src="/next.svg"
alt="Next.js logo"
width={180}
height={38}
priority
/>
<ol>
<li>
Get started by editing <code>src/app/page.js</code>.
</li>
<li>Save and see your changes instantly.</li>
</ol>
<div className={styles.ctas}>
<a
className={styles.primary}
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className={styles.logo}
src="/vercel.svg"
alt="Vercel logomark"
width={20}
height={20}
/>
Deploy now
</a>
<a
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
className={styles.secondary}
>
Read our docs
</a>
</div>
</main>
<footer className={styles.footer}>
<a
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/file.svg"
alt="File icon"
width={16}
height={16}
/>
Learn
</a>
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/window.svg"
alt="Window icon"
width={16}
height={16}
/>
Examples
</a>
<a
href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/globe.svg"
alt="Globe icon"
width={16}
height={16}
/>
Go to nextjs.org →
</a>
</footer>
</div>
);
}