DEVLOG
Next.js ํ๋ก์ ํธ :: ์ธํ ๋ณธ๋ฌธ
๐ ๋ชฉ์ฐจ
๊ธฐ์กด์ ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ๋ฅผ Next.js๋ฅผ ์ฌ์ฉํ์ฌ ์งํํ๋๋ฐ api ๋ถ์ผ๊ฒ๋ ์๊ณ ,, ์์ ๋ด์ฉ๋ ๋๋ฌด ๋จ์กฐ๋ก์์ Next.js ๊ธฐ์ ์ ์กฐ๊ธ ๋ ์ตํ๊ธฐ ์ํด ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด๊ธฐ๋ก ํ๋ค!
๐ ์ฃผ์ ์ ํ๊ธฐ
api๋ฅผ ๋ถ์ผ๋งํ ํ๋ก์ ํธ๋ก ๊ณ ๋ฏผํ๋ค๊ฐ ์ด์ ์ ์ ๊น ์ฌ์ฉํด๋ณด์๋ TMDB API์ tving์ฌ์ดํธ ๋์์ธ์ ๋ํด ์ํ ์ถ์ฒ ์ฌ์ดํธ๋ฅผ ์ ์ํด๋ณด๋ ค๊ณ ํ๋ค!
๐ ์ฌ์ฉ๊ธฐ์
next.js + typescript ๊ธฐ๋ฐ์ผ๋ก ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์คํ์ผ ์์ ์ styled-components๋ฅผ ์ด์ฉํด๋ณด๋ ค๊ณ ํ๋ค.
"next": "13.0.7",
"react": "18.2.0",
"react-dom": "18.2.0",
"styled-components": "^5.3.6"
๐ ๊ธฐ๋ณธ์ธํ ํ๊ธฐ
_app / _document
_app
์ ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ ์ปดํฌ๋ํธ๋ก ํ์ด์ง์ ์ ์ฉํ ๊ณตํต ๋ ์ด์์์ ์ญํ ์ ํ๋ค. ์ฃผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ์ ๊ณตํต์ผ๋ก ์ ์ฉํ ์์ฑ์ ๊ด๋ฆฌํ๋ค.
_app.tsx
import type { AppProps } from "next/app";
import Head from "next/head";
import "../styles/globals.css";
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
<Head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>meroriiving</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<Component {...pageProps} />
</>
);
}
export default MyApp;
_document
๋ _app
๋ค์์ ์คํ๋๋ฉฐ, ๊ณตํต์ผ๋ก ํ์ฉํ <head>
๋ <body>
ํ๊ทธ ์์ ๋ค์ด๊ฐ ๋ด์ฉ์ ์ปค์คํ
ํ ๋ ํ์ฉํ๋ค.styled-components
๋ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ HTML๋ง ๊ฐ์ ธ์ค๊ณ , ์คํ์ผ์ด ์ ์ฉ๋์ด ์์ง ์์ ์๋ฒ์์ ๋ฏธ๋ฆฌ HTML์ ๋งํฌ์
ํ ๋ ์คํ์ผ๊น์ง ์
ํ๋ ค๋ฉด _document
์ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค.
_document.tsx
import Document, {DocumentContext} from 'next/document'
import {ServerStyleSheet} from 'styled-components'
class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const sheet = new ServerStyleSheet()
const originalRenderPage = ctx.renderPage
try {
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />)
})
const initialProps = await Document.getInitialProps(ctx)
return {
...initialProps,
styles: [
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>
]
}
} catch (error) {
throw error
} finally {
sheet.seal()
}
}
}
export default MyDocument
next.config.js
์ต์ด ์๋ฒ ์ฌ์ด๋์์ ๋ ๋๋ง ์ดํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ผ๋ก ๋ผ์ฐํ ์ ํ๊ฒ ๋๋ค. ์ด ๋ ์๋ฒ์์ ์์ฑํ๋ ํด์๊ฐ๊ณผ ๋ธ๋ผ์ฐ์ ์์ ์์ฑํ๋ ํด์๊ฐ์ด ์๋ก ๋ฌ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. (Prop className did not match) ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด์ ์๋ styled-components ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผํ๋ค.
๊ทธ๋ฌ๋ nextjs 12.1๋ฒ์ ์ด์๋ถํฐ๋ babel-plugin-styled-components๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๊ณ , next.config.js
์ ํด๋น ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
compiler: {
styledComponents: true
},
๐ ๊ตฌ์กฐ
โโโpublic
โโโsrc
โ โโโ common
โ โ โโโ api.ts
โ โ โโโ util.ts
โ โโโ components
โ โโโ pages
โ โโโ detail
โ โ โโโ [id].tsx
โ โโโ _app.tsx
โ โโโ _document.tsx
โ โโโ index.tsx
โโโstyles
๋ฉ์ธํ์ด์ง์ ์์ธํ์ด์ง, ๋ ์ด์์์ ์ ์ฉํด์ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ฅผ ์ธํ ํ๋ค.
๐ Next?
์ดํ์๋ TMDB๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์์ ์ด๋ค!
'frontend > next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Next.js ํ๋ก์ ํธ :: infinite scroll ๊ตฌํํ๊ธฐ (0) | 2023.07.12 |
---|---|
Next.js ํ๋ก์ ํธ :: carousel ๊ตฌํํ๊ธฐ (0) | 2023.06.22 |
Next.js ํ๋ก์ ํธ :: getServersideProps (0) | 2023.06.22 |
Next.js ํ๋ก์ ํธ :: Open API (TMDB), React-Query (0) | 2023.06.22 |
Next.js ์์ํ๊ธฐ (0) | 2023.06.19 |