2024-04-03.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 5์ฃผ์ฐจ-3
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week5-3_2024-04-03
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ---- | -------------------------------------------------- | ----------- | | 5์ฃผ์ฐจ | 9์ฅ | ๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ๋ก ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ | 541p~556p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ: Next.js
styled components
- getInitialProps์ async ํจ์๋ก Document context ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์. new ServerStyleSheet()๋ก sheet ์์ฑ. document์ renderPage ๋ฉ์๋ ์ฌ์ฉ. enhanceApp,
sheet.collectStyles(<App {}>)
MyDocument.getInitialProps = async (
ctx: DocumentContext
): Promise<DocumentInitialProps> => {
const sheet = new ServerStyleSheet(); // ์ธ์คํด์ค ์์ฑ
const originalRenderPage = ctx.renderPage; // render ํจ์๋ฅผ ๋ณ์์ ์ ์ฅ
try {
ctx.renderPage = () =>
originalRenderPage({
// ctx.renderPage ์ฌ์ ์ (์๋ฒ์ธก ๋๋๋ง์ ์ฌ์ฉ๋ ํ์ด์ง)
enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />), // ์คํ์ผ ์ํธ๋ฅผ ์์งํ๋ค
});
const initialProps = await Document.getInitialProps(ctx); // ์ด๊ธฐ ์์ฑ์ ๊ฐ์ ธ์จ๋ค
return {
...initialProps,
styles: (
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>
), // ํ์ฌ ํ์ด์ง์ ์ฌ์ฉ๋ ์คํ์ผ์ํธ ์ถ๊ฐ
};
} finally {
sheet.seal(); // ๋ง์ง๋ง์ผ๋ก seal(): ์คํ์ผ ์ํธ ์์ง์ ์ข
๋ฃํ๊ธฐ ์ํด ํธ์ถ
}
};
์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์์ฑ
- ์์ : getServerSideProps๋ก todo API๋ฅผ ๋ถ๋ฌ์ ๋๋๋งํ๋ ์ฝ๋
- pages: Next.js ์์ฝ์ด | ํด๋ | ๋ด์ฉ | | --- | --- | | pages | ์์ฝ์ด๋ก ์ง์ ๋ ํด๋, ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ | | components | ํ์ด์ง ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ์๋ | | hooks | ํ๋ํ๋ ํ | | types | ์๋ฒ ์๋ต ํ์ ๋ฑ, ๊ณตํต ํ์ | | utils | ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๋ ์ ํธ์ฑ ํ์ผ |
- ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ๋นผ๊ณ ๋ ์ ํด์ง ์ปจ๋ฒค์ ์ ์๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ง ๋ช ํํ ๋์ด ์๋ค๋ฉด? ๊ตฌ์กฐ๋ ํ์ ๋ ผ์์ฌํญ
๊ฒฐ๋ก
- ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ผ์
- ๋๋ค์์ ์๋น์ค๊ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ์งํฅํ๊ธฐ ๋๋ฌธ์ ๊ตฌ์ถํ๋ ์ผ์ด ์ฆ๋ค
- Template repository๋ฅผ ๋ง๋ค ์ ์๋ค๐
- setting์์
- [x] template repository
์ฒดํฌ - Create a new repository ์, ํ ํ๋ฆฟ ์ ํ
- setting์์
create-***-app
CLI ํจํค์ง๋ฅผ ๋ง๋ค์ด๋ณผ ์ ์๋ค (๋ง์ดํฌ๋ก์๋น์ค ์งํฅ)
๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ: ๊นํ๋ธ 100% ํ์ฉํ๊ธฐ
| ์๋น์ค | ๋ด์ฉ | | --------- | -------------------------------------------- | | Package | ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ex) ์ฌ๋ด ๋น๊ณต๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | | Project | ํ๋ก์ ํธ ๊ด๋ฆฌ like Jira | | Pages | ๊ฐ๋จ ์น ์ฌ์ดํธ | | Codespace | ์ธ๊ณต์ง๋ฅ ์ฝ๋ฉ ์ด์์คํด์ค ์๋น์ค |
Github Action์ผ๋ก Continuous Integration ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ
- Continuous Intergration์ด๋?
- ์ฝ๋๋ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ํต์ฌ ์์
- ์ฌ๋ฌ ๊ฐ๋ฐ์๋ค์ด ์ง์์ ์ผ๋ก ์ฝ๋์ ๊ธฐ์ฌ
- ์ฝ๋ ์ค์ ์ ์ฅ์์์ ์ฌ๋ฌ ๊ธฐ์ฌ์๊ฐ ๊ธฐ์ฌํ ์ฝ๋๋ฅผ
์ง์์ ์ผ๋ก ๋น๋ํ๊ณ ํ ์คํธ
ํด์ฝ๋์ ์ ํฉ์ฑ
์ ํ์ธํ๋ ๊ณผ์
- ์ ํฉ์ฑ ํ์ธ์? ์๋์ผ๋ก ์คํํด์ผ ํ๋ค
- ํ ์คํธ, ๋น๋, ์ ์ ๋ถ์, ๋ณด์ ์ทจ์ฝ์ ๋ถ์
์ ํจ์ค Jenkins
- ๊ณผ๊ฑฐ CI ํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์์ฃผ ์ฐ์ธ ๋ฌด๋ฃ ์๋ฃจ์
- ๋ฒ๊ฑฐ๋กญ๋ค
- ์ค์นํ, ์๋ฒ ๊ตฌ์ถ, ์๋ฒ์ ์ ํจ์ค ์ค์น, ์ ํจ์ค ์ ์ฅ์์ ์ฐ๊ฒฐ
- ์ ์ง๋ณด์๊ฐ ํ์ํด
- ํธ๋ฆฌํ๋ค
- ํ๋ฌ๊ทธ์ธ์ ํตํด ๊ธฐ๋ฅ ํตํฉ
๊นํ๋ธ ์ก์
- ๊นํ๋ธ SaaS, ๊นํ๋ธ ์ ์ฅ์์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ
- ๋ณธ๋ ๋ชฉ์ ์ ๊นํ๋ธ ์ด๋ฒคํธ(push, PR etc)๋ฅผ ํธ๋ฆฌ๊ฑฐ๋ก ๋ค์ํ ์์ ์ ๋๋ ๋๊ตฌ์๋ค
- ์ ์ฉ~ ๊ฒฝ์ ์ ~(์ ํ์ ๋ฌด๋ฃ) ๋น ๋ฆ~
๊ธฐ๋ณธ ๊ฐ๋
| ๊ฐ๋ | ๋ด์ฉ | ํน์ง | | ------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------- | | runner | ํ์ผ๋ก ์์ฑ๋ ๊นํ๋ธ ์ก์ ์ด ์คํ๋๋ ์๋ฒ | ํน๋ณํ ์ง์ ํ์ง ์์ผ๋ฉด ๊ณต์ฉ ๊นํ ์ก์ ์๋ฒ๋ฅผ ์ด์ฉํ๊ณ , ๋ณ๋์ ๋ฌ๋๋ฅผ ๊ตฌ์ถํด ์์ฒด์ ์ผ๋ก ์ด์ํ ์๋ ์๋ค | | action | ๋ฌ๋์์ ์คํ๋๋ ํ๋์ ์์ ๋จ์ | yaml ํ์ผ ์์ฑ๋ด์ฉ์ ํ๋์ ์ก์ ์ผ๋ก ๋ณผ ์ ์์ | | event | ๊นํ ์ก์ ์คํ์ ์ผ์ผํค๋ ์ด๋ฒคํธ | ํ ๊ฐ ์ด์์ ์ด๋ฒคํธ ์ง์ , ๋ธ๋์น ์ง์ , PR, ์ด์, push, schedule(cron ๋ฐฐ์น) | | jobs | ํ๋์ ๋ฌ๋์์ ์คํ๋๋ ์ฌ๋ฌ ์คํ ์ ๋ชจ์ | ํ๋์ ์ก์ ์์ ์ฌ๋ฌ ์ก์ ์์ฑํ ์ ์๊ณ , (๊ธฐ๋ณธ)๋ด๋ถ ๊ฐ์๋จธ์ ์์ ๋ณ๋ ฌ ์คํ | | steps | ์ก ๋ด๋ถ์์ ์ผ์ด๋๋ ํ๋ํ๋์ ์์ | ์ ธ ๋ช ๋ น์ด๋, ๋ค๋ฅธ ์ก์ ์ ์คํํ ์๋ ์๋ค. ๋ณ๋ ฌx |
- ์คํ ์ ์ฎ์ด์ ์ก์ ๋ง๋ค๊ณ , ์ฌ๋ฌ ๊ฐ์ ์ก์ ๋ณ๋ ฌ๋ก ์คํ๋๊ณ , ์ก์ ํ๋ ์ด์ ๋ชจ์๋ ๊ฒ์ ์ก์ ์ด๋ผ ํ๋ฉฐ, ์ก์ ์ ์คํํ๋ ๊ฒ์ด ๋ฌ๋๋ค.
์์ฑํ๊ธฐ
- prettier์ yaml๋ includeํ์
- details ํ์ธ
- ์ก์ ์ ์คํ ๊ฒฐ๊ณผ <= ๊ณต๊ฐ ์ ์ฅ์๋ 90์ผ, ๋น๊ณต๊ฐ ์ ์ฅ์๋ 400์ผ ์ดํ ๋ก๊ทธ ์ญ์
.github/workflow
- yml, yaml
name: some build
# ์ก์
์ ์ด๋ฆ, ํ์ ์๋
run-name: ${{ github. actor }} has been added new commit.
# ์ก์
์ด ์คํ๋ ๋ ๊ตฌ๋ณํ ์ ์๋ ํ์ดํ๋ช
, ํ์ ์๋
# github.actor๋ฅผ ํ์ฉํด ๋๊ฐ ํธ๋ฆฌ๊ฑฐํ๋ ์ง ๊ตฌ๋ณ ๊ฐ๋ฅ
# ์์ผ๋ฉด? ํ๋ฆฌํ ์ด๋ฆ or ๋ง์ง๋ง ์ปค๋ฐ ๋ฉ์์ง
on: # ์ธ์ ์ด ์ก์
์ ์คํํ ์ง ์ ์
push: # ์ด๋ฒคํธ
branches-ignore: # ๋ธ๋์น ์ค์
- "main"
# ์ ignore?
# - main ๋ธ๋์น์ push๋? PR ๋จธ์ง ์ ๋ฐ์ํ๋ค.
# - PR merge ๋จ๊ณ์์ ์ด๋ฏธ CI ํต๊ณผ๋์์ ๊ฒ์ด๋ฏ๋ก ์ค๋ณต ์คํ
jobs: # ์ก์
์์ ์ํํ ์ก(1๊ฐ ์ด์, ๋ณ๋ ฌ), ํ์
build: # ์์ ์ง์ ์ด๋ฆ, name๊ณผ ๊ฐ์ ์ญํ , ๋ค์ฌ์ฐ๊ธฐ ์งํค๊ธฐ
runs-on: ubuntu-latest
# ์ด๋ ํ๊ฒฝ์์ ํด๋น ์์
์ด ์คํ๋ ์ง ๊ฒฐ์ : runner
# ๊นํ๋ธ ์ ๊ณต ์๋ฒ: ubuntu-latest
# ์ปค์คํ
๋ฌ๋๋ฅผ ์ด๋ค๋ฉด? ํด๋น ๋ฌ๋๋ช
์ง์
# ์ปค์คํ
๋ฌ๋ ์ค์ ์? ์ ์ฅ์ Setting > Actions > Runners์์ ์ถ๊ฐ
steps: # ์ก์์ ์์ฐจ์ ์ผ๋ก ์ํํ ์์
์ ์ ์
- uses: actions/checkout@v3
# ์คํ
์์ ์์
์ actions/checkout@v3๋ฅผ ์ฌ์ฉํด์ ์์
ํ๊ฒ ๋ค.
# ๊นํ๋ธ ๊ธฐ๋ณธ ์ก์
, ํด๋น ๋ธ๋์น์ ๋ง์ง๋ง ์ปค๋ฐ์ ๊ธฐ์ค์ผ๋ก ์ฒดํฌ์์ = ์ต์ ์ฝ๋
- uses: actions/setup-node@v3
# ์คํ
์์ ์์
์ actions/setup-node@v3๋ฅผ ์ฌ์ฉํด์ ์์
ํ๊ฒ ๋ค.
# ๋ฌ๋์ Node.js๋ฅผ ์ค์นํ๋ค.
with:
node-version: 16 # ์ค์น๊ฐ๋ฅํ ๋ฒ์ => ๊นํ ์ก์
docs ๋ณด์
- name: "install dependencies"
working-directory: ./my-dir/my-app
# cd ๊ฐ์ ์ญํ , ์ํํ ์์
์ ํด๋น ๋๋ ํ ๋ฆฌ์์ ์ํํ๊ฒ ๋ค
run: npm ci # ์์กด์ฑ ์ค์น
- name: "build"
working-directory: ./my-dir/my-app
run: npm run build # CI๋ฅผ ์ํ ์์
. ๋น๋ ์ํ
- ์ก์
์์ฑ
- pnpm/action-setup: PNPM ์ฌ์ฉ ์
- borales/action-yarn: yarn ์ฌ์ฉ ์
- actions/github-script: ๊นํ๋ธ API๋ฅผ ํธ์ถํด ํ๋ฆฌํ์ ๋๊ธ ๋ฌ๊ธฐ
- ์ด๋ฏธ์ง ์ต์ ํ, ์๋ ๋ฐฐํฌ ๋ฑ ๋ค์ํ ์์ ๊ฐ๋ฅ
- ๋ธ๋์น ๋ณดํธ ๊ท์น
- ๋ธ๋์น ๋ณดํธ ๊ท์น์ ์ถ๊ฐํ์ฌ, ์ฝ๋์ ์ ํฉ์ฑ์ ํ๋ณดํ๋ค.
- CI๊ฐ ์ฑ๊ณตํ ์ฝ๋๋ง ํธ์