Frontend Wiki - 100-hours-a-week/KTB4-3rd-wiki GitHub Wiki
src/
โโโ _app/
โ โโโ providers/
โ โโโ config/
โ โโโ styles/
โ
โโโ _pages/
โ โโโ home/
โ โโโ auth/
โ โ โโโ login/
โ โ โโโ sign-up/
โ โโโ post/
โ โ โโโ list/
โ โ โโโ detail/
โ โ โโโ write/
โ โโโ chat/
โ โ โโโ list/
โ โ โโโ room/
โ โโโ taxi-matching/
โโ
โโโ features/
โ โโโ auth/
โ โ โโโ login/
โ โ โโโ sign-up/
โ โโโ post-create/
โ โโโ post-comment/
โ โโโ location-detect/
โ โโโ taxi-match/
โ
โโโ entities/
โ โโโ user/
โ โโโ post/
โ โโโ chat-room/
โ โโโ taxi-match/
โ โโโ location/
โ
โโโ shared/
โโโ analytics/
โโโ api/
โโโ lib/
โโโ model/
โโโ types/
โโโ ui/
Slice group์ ํ์ฉํด ํ์ผ ๊ฐ์๊ฐ ๋์ด๋๋ ํ์ผ ํ์์ ๋ณด๋ค ์ฝ๊ฒ ํ๋๋ก ํ๋ค.
mvp ๊ฐ๋ฐ ๊ธฐ๊ฐ์์๋ widgets ๋ ์ด์ด๊ฐ ํ์ํ์ง ์๋ค๊ณ ํ๋จํด ์ฌ์ฉํ์ง ์๊ณ , ์ถํ ํ์ํ ์ํฉ์ด ์ฌ๋ ์ถ๊ฐ ํ ์์ ์ด๋ค.
์๋ก์ด ์ปดํฌ๋ํธ๋ ๋ก์ง์ ์ถ๊ฐํ ๋ ๋ค์ ์์๋ก ํ๋จํ๋ค.
ํน์ ํ์ด์ง์์๋ง ์ฌ์ฉํ๋๊ฐ?
-> pages
ํน์ ๋๋ฉ์ธ์ ๋ฐ์ดํฐ๋ฅผ ํํํ๋๊ฐ?
-> entities
์ฌ์ฉ์์ ํ๋์ด๋ ๊ธฐ๋ฅ์ ์ํํ๋๊ฐ?
-> features
๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๊ณ์๋ ๋ฒ์ฉ ์ฝ๋์ธ๊ฐ?
-> shared
๋ค์ด๋ฐ ๊ท์น
| ํญ๋ชฉ | ์ผ์ด์ค ๊ท์น |
|---|---|
| ํด๋๋ช , ํ์ผ๋ช , ๋ณ์ ๋ฐ ํจ์๋ช , ์๋ฒ ์๋ต ๋ฐ์ดํฐ | camelCase |
| ์ปดํฌ๋ํธ๋ช | PascalCase |
Oxfmt
| ์ต์ | ๊ฐ | ์ค๋ช |
|---|---|---|
| trailingComma | all | ์ฌ๋ฌ ์ค๋ก ์์ฑ๋๋ ๋ฐฐ์ด, ๊ฐ์ฒด, ํจ์ ๋งค๊ฐ๋ณ์ ๋ฑ์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํํ ์ผํ๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
| tabWidth | 2 | ๋ค์ฌ์ฐ๊ธฐ ํ ๋จ๊ณ๋น ์ฌ์ฉํ ๊ณต๋ฐฑ ์๋ฅผ 2์นธ์ผ๋ก ์ง์ ํฉ๋๋ค. |
| semi | true | ๋ฌธ์ฅ ๋์ ์ธ๋ฏธ์ฝ๋ก ์ ์ถ๊ฐํฉ๋๋ค. |
| singleQuote | true | JavaScript, TypeScript ๋ฌธ์์ด์ ์์๋ฐ์ดํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
| jsxSingleQuote | false | JSX ์์ฑ์๋ ํฐ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
| bracketSpacing | true | ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ค๊ดํธ ์์ชฝ์ ๊ณต๋ฐฑ์ ์ถ๊ฐํฉ๋๋ค. ์: { name: 'ํ๊ธธ๋' } |
| bracketSameLine | false | ์ฌ๋ฌ ์ค JSX/HTML ํ๊ทธ์ ๋ซ๋ >๋ฅผ ๋ง์ง๋ง ์์ฑ ์ค์ ๋ถ์ด์ง ์๊ณ ๋ค์ ์ค์ ํ์ํฉ๋๋ค. |
| printWidth | 100 | ํ ์ค์ ๊ถ์ฅ ์ต๋ ๊ธธ์ด๋ฅผ 100์๋ก ์ง์ ํฉ๋๋ค. |
| arrowParens | always | ํ์ดํ ํจ์ ๋งค๊ฐ๋ณ์๊ฐ ํ๋์ฌ๋ ๊ดํธ๋ก ๊ฐ์๋๋ค. ์: (value) => value |
| useTabs | false | ํญ ๋์ ๊ณต๋ฐฑ์ผ๋ก ๋ค์ฌ์๋๋ค. tabWidth: 2์ด๋ฏ๋ก 2์นธ ๊ณต๋ฐฑ์ ์ฌ์ฉํฉ๋๋ค. |
| sortTailwindcss | true | Tailwind CSS ํด๋์ค๋ฅผ ๊ถ์ฅ ์์์ ๋ฐ๋ผ ์๋ ์ ๋ ฌํฉ๋๋ค. |
| sortPackageJson | true | package.json์ ํ๋๋ฅผ Oxfmt์ ์ ํด์ง ์์์ ๋ฐ๋ผ ์ ๋ ฌํฉ๋๋ค. |
| singleAttributePerLine | false | JSX/HTML ํ๊ทธ์ ์์ฑ์ ํ ์ค์ ํ๋์ฉ ๊ฐ์ ํ์ง ์์ต๋๋ค. |
Oxlint
- ๊ธฐ๋ณธ ์ค์
| ์ต์ | ๊ฐ | ์ค๋ช |
|---|---|---|
| $schema | ./node_modules/oxlint/configuration_schema.json | Oxlint ์ค์ ํ์ผ์ ์คํค๋ง๋ฅผ ์ง์ ํฉ๋๋ค. |
| categories.correctness | error | ์ฝ๋์ ์ ํ์ฑ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ณธ ๊ท์น ์๋ฐ์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํฉ๋๋ค. |
- ํ๋ฌ๊ทธ์ธ
| ์ต์ | ๊ฐ | ์ค๋ช |
|---|---|---|
| plugins | eslint | ESLint ๊ธฐ๋ณธ ์ฝ๋ ํ์ง ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | typescript | TypeScript ํ์ ์์ ์ฑ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | oxc | Oxc ์์ฒด ์ต์ ํ ๋ฐ ์ฝ๋ ํ์ง ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | react | React ๋ฐ JSX ๊ด๋ จ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | vitest | Vitest ํ ์คํธ ์ฝ๋ ๊ด๋ จ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | import | import ๊ตฌ์กฐ ๋ฐ ๋ชจ๋ ์์กด์ฑ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
| plugins | promise | Promise ์ฌ์ฉ ๋ฐฉ์์ ๊ฒ์ฌํฉ๋๋ค. |
| plugins | nextjs | Next.js ํ์ผ ๋ฐ ์ฝ๋ฉ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
- esLint ๊ท์น
| ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|
| eslint/eqeqeq | error | == ๋์ === ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. ๋จ, null ๋น๊ต๋ ํ์ฉํฉ๋๋ค. |
| eslint/no-var | error | var ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| eslint/prefer-const | error | ์ฌํ ๋นํ์ง ์๋ ๋ณ์๋ const ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| eslint/curly | error | if, for ๋ฑ์ ์ ์ด๋ฌธ์ ์ค๊ดํธ ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| eslint/no-console | warn | console ์ฌ์ฉ ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| eslint/no-alert | error | alert, confirm, prompt ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| eslint/no-duplicate-imports | error | ๋์ผ ๋ชจ๋์ ์ค๋ณต import๋ฅผ ๊ธ์งํฉ๋๋ค. |
| eslint/object-shorthand | error | ๊ฐ์ฒด ์์ฑ ์ถ์ฝ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| eslint/prefer-template | warn | ๋ฌธ์์ด ์ฐ๊ฒฐ ๋์ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| eslint/no-param-reassign | error | ํจ์ ๋งค๊ฐ๋ณ์ ์ฌํ ๋น์ ๊ธ์งํฉ๋๋ค. |
| eslint/no-bitwise | error | ๋นํธ ์ฐ์ฐ์ ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| eslint/no-unused-expressions | error | ์คํ ํจ๊ณผ๊ฐ ์๋ ํํ์์ ๊ธ์งํฉ๋๋ค. ๋จ์ถ ํ๊ฐ ํธ์ถ์ ํ์ฉํฉ๋๋ค. |
| eslint/guard-for-in | error | for...in ์ฌ์ฉ ์ ์์ ์์ฑ ๊ฒ์ฌ๋ฅผ ๊ฐ์ ํฉ๋๋ค. |
| eslint/array-callback-return | error | map, filter ๋ฑ์ ์ฝ๋ฐฑ์์ ๋ฐํ๊ฐ์ ๋ช ์ํ๋๋ก ํฉ๋๋ค. |
| eslint/no-negated-condition | error | ๋ถ์ ์กฐ๊ฑด์ ์ฌ์ฉํ if...else ๋ถ๊ธฐ๋ฅผ ๊ธ์งํฉ๋๋ค. |
| eslint/no-nested-ternary | error | ์ค์ฒฉ ์ผํญ ์ฐ์ฐ์๋ฅผ ๊ธ์งํฉ๋๋ค. |
| eslint/no-template-curly-in-string | error | ์ผ๋ฐ ๋ฌธ์์ด ๋ด๋ถ์ ์๋ชป๋ ${} ํํ์์ ๊ฐ์งํฉ๋๋ค. |
| eslint/radix | error | parseInt ์ฌ์ฉ ์ ์ง๋ฒ์ ๋ช ์ํ๋๋ก ํฉ๋๋ค. |
| eslint/no-case-declarations | error | switch case ๋ด๋ถ์ ์ ์ธ๋ฌธ ์ฌ์ฉ์ ์ ํํฉ๋๋ค. |
| eslint/no-empty | error | ๋น ๋ธ๋ก๋ฌธ์ ๊ธ์งํฉ๋๋ค. |
| eslint/no-fallthrough | error | switch์์ break ๋๋ฝ์ ๊ฒ์ฌํฉ๋๋ค. |
| eslint/no-prototype-builtins | error | hasOwnProperty ์ง์ ํธ์ถ์ ๊ธ์งํฉ๋๋ค. |
| eslint/no-regex-spaces | error | ์ ๊ท์ ๋ด๋ถ์ ์ฐ์ ๊ณต๋ฐฑ ์ฌ์ฉ์ ๊ฒ์ฌํฉ๋๋ค. |
| eslint/prefer-rest-params | error | arguments ๋์ rest parameter ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| eslint/prefer-spread | error | apply ๋์ spread ๋ฌธ๋ฒ ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| eslint/prefer-arrow-callback | error | ์ฝ๋ฐฑ ํจ์์ ํ์ดํ ํจ์ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| eslint/no-array-constructor | error | new Array() ์ฌ์ฉ์ ๊ธ์งํ๊ณ ๋ฐฐ์ด ๋ฆฌํฐ๋ด ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| eslint/no-restricted-imports | error | ๊ธ์ง๋ import ๊ฒฝ๋ก ์ฌ์ฉ์ ๊ฒ์ฌํฉ๋๋ค. |
| eslint/no-unused-vars | warn | ์ฌ์ฉํ์ง ์๋ ๋ณ์์ import๋ฅผ ๊ฒฝ๊ณ ํฉ๋๋ค. _ ์ ๋์ฌ๊ฐ ๋ถ์ ๋ณ์๋ ํ์ฉํฉ๋๋ค. |
- promise ๊ท์น
| ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|
| promise/no-new-statics | error | Promise ์ ์ ๋ฉ์๋์ new ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| promise/valid-params | warn | Promise ๋ฉ์๋์ ์ ๋ฌํ๋ ์ธ์ ๊ฐ์๋ฅผ ๊ฒ์ฌํฉ๋๋ค. |
- TypeScript ๊ท์น
| ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|
| typescript/consistent-type-imports | error | ํ์ ์ ์ฉ import์ import type ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| typescript/no-non-null-assertion | warn | non-null assertion ์ฐ์ฐ์ ! ์ฌ์ฉ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| typescript/no-explicit-any | warn | ๋ช ์์ ์ธ any ์ฌ์ฉ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| typescript/no-empty-object-type | error | ์๋ฏธ ์๋ ๋น ๊ฐ์ฒด ํ์ ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. ๋จ์ผ interface ์์์ ํ์ฉํฉ๋๋ค. |
| typescript/prefer-as-const | error | ๋ฆฌํฐ๋ด ํ์ ๊ณ ์ ์ as const ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/prefer-for-of | warn | ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐ๋ณต๋ฌธ์ for...of ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/no-floating-promises | error | ์ฒ๋ฆฌ๋์ง ์์ Promise๋ฅผ ๊ธ์งํฉ๋๋ค. void๋ก ๋ช ์ํ ๊ฒฝ์ฐ๋ ํ์ฉํฉ๋๋ค. |
| typescript/no-misused-promises | off | Promise๋ฅผ ์๋ชป ์ฌ์ฉํ๋ ์ํฉ์ ๋ํ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํฉ๋๋ค. |
| typescript/no-unnecessary-type-assertion | warn | ๋ถํ์ํ ํ์ ๋จ์ธ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| typescript/restrict-template-expressions | error | ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํ์ฉ๋์ง ์์ ํ์ ์ ์ฝ์ ํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. ์ซ์์ ๋ถ๋ฆฌ์ธ์ ํ์ฉํฉ๋๋ค. |
| typescript/switch-exhaustiveness-check | warn | Union ๋๋ enum์ ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๊ถ์ฅํฉ๋๋ค. |
| typescript/ban-ts-comment | error | @ts-ignore, @ts-nocheck ๋ฑ์ ์ฃผ์์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-dynamic-delete | error | ๋์ ํค๋ฅผ ์ด์ฉํ delete ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-unsafe-member-access | error | ํ์ ์ด ์์ ํ์ง ์์ ๊ฐ์ฒด ๋ฉค๋ฒ ์ ๊ทผ์ ๊ธ์งํฉ๋๋ค. |
| typescript/prefer-optional-chain | error | a && a.b ๋์ a?.b ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/await-thenable | error | Promise๊ฐ ์๋ ๊ฐ์ await ์ฌ์ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-misused-spread | error | ์ ๊ฐํ ์ ์๋ ๊ฐ์ spread ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-unsafe-enum-comparison | error | enum์ ์์๊ฐ๊ณผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-unsafe-unary-minus | error | ์ซ์ ๋๋ BigInt๊ฐ ์๋ ๊ฐ์ ๋จํญ ๋ง์ด๋์ค๋ฅผ ์ ์ฉํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. |
| typescript/no-duplicate-type-constituents | error | Union ํ์ ๋ด๋ถ์ ์ค๋ณต ๊ตฌ์ฑ์์๋ฅผ ๊ธ์งํฉ๋๋ค. |
| typescript/no-redundant-type-constituents | error | ์๋ฏธ๊ฐ ์ค๋ณต๋๊ฑฐ๋ ๋ถํ์ํ ํ์ ๊ตฌ์ฑ์์๋ฅผ ๊ธ์งํฉ๋๋ค. |
| typescript/prefer-promise-reject-errors | error | Promise reject ์ Error ๊ฐ์ฒด ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| typescript/no-array-delete | error | ๋ฐฐ์ด ์์ ์ญ์ ์ delete ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-base-to-string | error | ๊ฐ์ฒด๊ฐ [object Object]๋ก ๋ฌธ์์ด ๋ณํ๋๋ ์ํฉ์ ๊ฒ์ฌํฉ๋๋ค. |
| typescript/no-for-in-array | error | ๋ฐฐ์ด์ for...in ์ฌ์ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-implied-eval | error | ๋ฌธ์์ด ๊ธฐ๋ฐ์ ์์์ eval ์คํ์ ๊ธ์งํฉ๋๋ค. |
| typescript/only-throw-error | error | throw ๋์์ Error ๊ฐ์ฒด๋ง ํ์ฉํฉ๋๋ค. |
| typescript/restrict-plus-operands | error | + ์ฐ์ฐ ์ ์๋ก ๋ค๋ฅธ ํ์ ์ ๊ฒฐํฉ์ ์ ํํฉ๋๋ค. |
| typescript/require-await | error | await๊ฐ ์๋ async ํจ์๋ฅผ ๊ธ์งํฉ๋๋ค. |
| typescript/return-await | error | ๋น๋๊ธฐ ํจ์์ return await ์ฌ์ฉ์ ๊ฒ์ฌํฉ๋๋ค. |
| typescript/dot-notation | error | ๊ฐ๋ฅํ ๊ฒฝ์ฐ obj['key'] ๋์ obj.key๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| typescript/non-nullable-type-assertion-style | error | ๋จ์ null ์ ๊ฑฐ์๋ as ๋์ non-null assertion ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/prefer-find | error | filter()[0] ๋์ find() ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/prefer-includes | error | indexOf() !== -1 ๋์ includes() ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/prefer-nullish-coalescing | error | |
| typescript/prefer-regexp-exec | error | String.match ๋์ RegExp.exec ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/prefer-string-starts-ends-with | error | ๋ฌธ์์ด ๊ฒ์ ๋์ startsWith, endsWith ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/array-type | error | ๋ฐฐ์ด ํ์ ์ T[] ํ์์ผ๋ก ํต์ผํฉ๋๋ค. |
| typescript/ban-tslint-comment | error | ๊ธฐ์กด TSLint ๋นํ์ฑํ ์ฃผ์์ ๊ธ์งํฉ๋๋ค. |
| typescript/class-literal-property-style | error | ํด๋์ค ๋ด๋ถ ๋ฆฌํฐ๋ด ํ๋กํผํฐ ์์ฑ ๋ฐฉ์์ ํต์ผํฉ๋๋ค. |
| typescript/consistent-generic-constructors | error | ์ ๋ค๋ฆญ ์์ฑ์ ํ๊ธฐ ์์น๋ฅผ ํต์ผํฉ๋๋ค. |
| typescript/consistent-indexed-object-style | error | ์ธ๋ฑ์ค ์๊ทธ๋์ฒ ๋์ Record ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/consistent-type-assertions | error | ํ์ ๋จ์ธ์ as ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| typescript/consistent-type-definitions | error | ํ์ ์ ์ธ์ type์ผ๋ก ํต์ผํฉ๋๋ค. |
| typescript/no-inferrable-types | error | ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ ๋ถํ์ํ ํ์ ์ ์ธ์ ๊ธ์งํฉ๋๋ค. |
| typescript/prefer-function-type | error | ํจ์ ํ์ ์ interface ๋์ type alias ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/no-confusing-non-null-assertion | error | ํผ๋์ ์ผ์ผํฌ ์ ์๋ non-null assertion ํํ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-require-imports | error | CommonJS์ require ๋์ ES Module import๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| typescript/no-unnecessary-type-constraint | error | ๋ถํ์ํ ์ ๋ค๋ฆญ ํ์ ์ ์ฝ์ ๊ธ์งํฉ๋๋ค. |
| typescript/no-namespace | error | namespace ๋์ ES Module ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| typescript/no-unsafe-function-type | error | ๊ด๋ฒ์ํ Function ํ์ ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| typescript/unbound-method | error | ๊ฐ์ฒด ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉ ์์ด ์ ๋ฌํ๋ ๊ฒ์ ๊ฒ์ฌํฉ๋๋ค. ์ ์ ๋ฉ์๋๋ ํ์ฉํฉ๋๋ค. |
| typescript/no-useless-default-assignment | off | ๋ถํ์ํ ๊ธฐ๋ณธ๊ฐ ํ ๋น ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํฉ๋๋ค. |
| typescript/adjacent-overload-signatures | error | ๊ด๋ จ๋ ํจ์ ์ค๋ฒ๋ก๋ ์๊ทธ๋์ฒ๋ฅผ ์ธ์ ํ๊ฒ ์ ์ธํ๋๋ก ํฉ๋๋ค. |
- React ๊ท์น
| ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|
| react/jsx-key | error | ๋ฐฐ์ด ๋ ๋๋ง ์ JSX ์์์ key๋ฅผ ์ง์ ํ๋๋ก ํฉ๋๋ค. |
| react/jsx-no-duplicate-props | error | JSX์์ ์ค๋ณต prop ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค. |
| react/jsx-boolean-value | error | Boolean prop ํ๊ธฐ ๋ฐฉ์์ ํต์ผํฉ๋๋ค. |
| react/jsx-curly-brace-presence | error | JSX์์ ๋ถํ์ํ ์ค๊ดํธ ์ฌ์ฉ์ ์ ๊ฑฐํ๋๋ก ํฉ๋๋ค. |
| react/jsx-fragments | error | Fragment์ <>...</> ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| react/jsx-pascal-case | error | React ์ปดํฌ๋ํธ ์ด๋ฆ์ PascalCase ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค. |
| react/self-closing-comp | error | ์์์ด ์๋ ์ปดํฌ๋ํธ๋ self-closing ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
| react/exhaustive-deps | warn | Hook dependency ๋ฐฐ์ด ๋๋ฝ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| react/rules-of-hooks | error | React Hook ํธ์ถ ๊ท์น์ ๊ฐ์ ํฉ๋๋ค. |
- import ๊ท์น
| ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|
| import/no-cycle | warn | ๋ชจ๋ ๊ฐ ์ํ ์ฐธ์กฐ๋ฅผ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| import/no-default-export | warn | default export ๋์ named export ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. |
| import/no-duplicates | error | ๋์ผ ๋ชจ๋์ ์ค๋ณต import๋ฅผ ๊ธ์งํฉ๋๋ค. |
| import/no-self-import | error | ๋ชจ๋์ด ์๊ธฐ ์์ ์ importํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. |
| import/no-relative-parent-imports | warn | ../๋ฅผ ํตํ ์์ ๋๋ ํฐ๋ฆฌ import ์ฌ์ฉ์ ๊ฒฝ๊ณ ํฉ๋๋ค. |
| import/first | error | import ๋ฌธ์ ํ์ผ ์ต์๋จ์ ๋ฐฐ์นํ๋๋ก ํฉ๋๋ค. |
| import/newline-after-import | error | import ๋ธ๋ก ๋ค์์ ๋น ์ค์ ๊ฐ์ ํฉ๋๋ค. |
| import/namespace | off | namespace ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ๊ณ TypeScript์ ์์ํฉ๋๋ค. |
- ๋ฌด์ ํด๋
| ์ต์ | ๊ฐ | ์ค๋ช |
|---|---|---|
| ignorePatterns | pnpm-lock.yaml | pnpm lock ํ์ผ์ ๊ฒ์ฌ์์ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | package-lock.json | npm lock ํ์ผ์ ๊ฒ์ฌ์์ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | yarn.lock | Yarn lock ํ์ผ์ ๊ฒ์ฌ์์ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | public/mockServiceWorker.js | Mock Service Worker ์๋ ์์ฑ ํ์ผ์ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | src/styles/tokens/** | ์คํ์ผ ํ ํฐ ํด๋๋ฅผ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | .agents/, .claude/ | ์์ด์ ํธ ๋ฐ Claude ์ค์ ํด๋๋ฅผ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | shared/skills/, shared/rules/ | ๊ณต์ฉ ์คํฌ ๋ฐ ๊ท์น ํ์ผ์ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | AGENTS.md, CLAUDE.md | ์์ด์ ํธ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | docs/** | ๋ฌธ์ ํด๋๋ฅผ ์ ์ธํฉ๋๋ค. |
| ignorePatterns | .github/** | GitHub ์ค์ ํ์ผ์ ์ ์ธํฉ๋๋ค. |
- React ๋ฐ Next.js ์์ธ ์ค์
| ๋์ | ๊ท์น | ๊ฐ | ์ค๋ช |
|---|---|---|---|
| scripts/sync-rules.mjs | typescript/no-unsafe-member-access | off | ๊ท์น ๋๊ธฐํ ์คํฌ๋ฆฝํธ์์๋ ํ์ ์ด ๋ถ์์ ํ ๋ฉค๋ฒ ์ ๊ทผ์ ํ์ฉํฉ๋๋ค. |
| scripts/sync-rules.mjs | eslint/no-console | off | ๊ท์น ๋๊ธฐํ ์คํฌ๋ฆฝํธ์์๋ console ์ฌ์ฉ์ ํ์ฉํฉ๋๋ค. |
| app/, src/app/ | import/no-default-export | off | Next.js์ page, layout, route ํ์ผ์ default export๋ฅผ ํ์ฉํฉ๋๋ค. |
| **/*.stories.{ts,tsx} | import/no-default-export | off | Storybook story ํ์ผ์ default export๋ฅผ ํ์ฉํฉ๋๋ค. |
| .storybook/** | import/no-default-export | off | Storybook ์ค์ ํ์ผ์ default export๋ฅผ ํ์ฉํฉ๋๋ค. |
| *.config.{ts,js,mjs} | import/no-default-export | off | ํ๋ก์ ํธ ์ค์ ํ์ผ์ default export๋ฅผ ํ์ฉํฉ๋๋ค. |
๊ธฐ๋ณธ ๋ธ๋์น
| ๋ธ๋์น | ์ค๋ช |
|---|---|
| main | ๋ฐฐํฌ ๋ธ๋์น |
| dev | ๊ฐ๋ฐ ํ๊ฒฝ ๋ธ๋์น |
์์ ๋ธ๋์น ๋ค์ด๋ฐ ๊ท์น
| ๋ธ๋์น ํ์ | ๋ค์ด๋ฐ ํจํด |
|---|---|
| ๊ธฐ๋ฅ ์ถ๊ฐ | feature/#์ด์๋ฒํธ |
| ๋ฒ๊ทธ ์์ | bug/#์ด์๋ฒํธ |
| ๋ฆฌํฉํ ๋ง | refactor/#์ด์๋ฒํธ |
| ์ปค๋ฐ ์ ํ | ์ค๋ช |
|---|---|
| feat | ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ |
| fix | ๋ฒ๊ทธ๋ ์๋ชป๋ ๋์์ ์์ ํ ๊ฒฝ์ฐ |
| docs | README, API ๋ฌธ์ ๋ฑ ๋ฌธ์๋ฅผ ์ถ๊ฐยท์์ ํ ๊ฒฝ์ฐ |
| style | ์ฝ๋ ํฌ๋งท, ๋ค์ฌ์ฐ๊ธฐ, ์ธ๋ฏธ์ฝ๋ก ๋ฑ ๋์์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ณ๊ฒฝ |
| refactor | ๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์ด ์ฝ๋ ๊ตฌ์กฐ๋ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ ๊ฒฝ์ฐ |
| test | ํ ์คํธ ์ฝ๋๋ฅผ ์ถ๊ฐยท์์ ํ ๊ฒฝ์ฐ |
| chore | ํจํค์ง, ๋น๋ ์ค์ , ํ๊ฒฝ ์ค์ ๋ฑ ๊ธฐํ ์์ |
| design | UI/UX, ๋ ์ด์์, ์์, ์คํ์ผ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ |
| comment | ์ฝ๋ ์ฃผ์์ ์ถ๊ฐยท์์ ยท์ญ์ ํ ๊ฒฝ์ฐ |
| rename | ํ์ผ, ํด๋, ๋ณ์, ํจ์ ๋ฑ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ |
| remove | ์ฌ์ฉํ์ง ์๋ ์ฝ๋, ํ์ผ, ๊ธฐ๋ฅ์ ์ ๊ฑฐํ ๊ฒฝ์ฐ |
| BREAKING CHANGE | ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์์ด๋ API๋ฅผ ๊นจ๋จ๋ฆฌ๋ ํธํ์ฑ ์๋ ๋ณ๊ฒฝ |
| HOTFIX | ์ด์ ์ค์ธ ์๋น์ค์ ๊ธด๊ธํ ๋ฌธ์ ๋ฅผ ์ฆ์ ์์ ํ ๊ฒฝ์ฐ |
์์: Feature - ๋ฉ์ธ ํ์ด์ง UI ๊ตฌํ
| ํ๊ทธ | ์๋ฏธ | ์ค๋ช |
|---|---|---|
| Refactor | ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์ | ๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์ด ์ฝ๋ ๊ตฌ์กฐ, ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ์ ๊ฐ์ ํ ๊ฒฝ์ฐ |
| Perf | ์ฑ๋ฅ ๊ฐ์ | ๋ ๋๋ง, ๋ก๋ฉ ์๋, ๋คํธ์ํฌ ์์ฒญ ๋ฑ ์ฑ๋ฅ์ ๊ฐ์ ํ ๊ฒฝ์ฐ |
| Remove | ์ฝ๋/ํ์ผ ์ ๊ฑฐ | ์ฌ์ฉํ์ง ์๋ ์ฝ๋, ์ปดํฌ๋ํธ, ํ์ผ, ์์กด์ฑ์ ์ ๊ฑฐํ ๊ฒฝ์ฐ |
| Fix | ๋ฒ๊ทธ ์์ | ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ ์๋ชป๋ ๋์์ ์์ ํ ๊ฒฝ์ฐ |
| Hotfix | ๊ธด๊ธ ์์ | ์ด์ ์ค์ธ ์๋น์ค์ ์น๋ช ์ ์ธ ๋ฌธ์ ๋ฅผ ๊ธด๊ธํ๊ฒ ์์ ํ ๊ฒฝ์ฐ |
| Feat | ๊ธฐ๋ฅ ์ถ๊ฐ | ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ |
| Style | UI/์คํ์ผ ์์ | ๋ ์ด์์, ์์, ํฐํธ, ๋ฐ์ํ ๋ฑ UI๋ฅผ ์์ ํ ๊ฒฝ์ฐ |
| Revert | ๋ณ๊ฒฝ ์ฌํญ ๋๋๋ฆฌ๊ธฐ | ๊ธฐ์กด ์ปค๋ฐ์ด๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๋ ๊ฒฝ์ฐ |
| Merge | ๋ธ๋์น ๋ณํฉ | ๋ค๋ฅธ ๋ธ๋์น์ ์์ ๋ด์ฉ์ ๋ณํฉํ ๊ฒฝ์ฐ |
| Comment | ์ฃผ์ ์ถ๊ฐ/์์ | ์ฝ๋ ์ฃผ์์ด๋ ๋ฌธ์์ฑ ์ค๋ช ์ ์ถ๊ฐยท์์ ํ ๊ฒฝ์ฐ |
| DB | DB ๊ด๋ จ ๋ณ๊ฒฝ | ์คํค๋ง, ํ ์ด๋ธ, ์ปฌ๋ผ, ์ธ๋ฑ์ค, ๋ง์ด๊ทธ๋ ์ด์ ๋ฑ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ญํ / ์ค๋ช |
|---|---|
| React | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ํ๋ฉด์ ์ํ์ ๋ ๋๋ง์ ๊ด๋ฆฌํ๋ค. |
| Tailwind CSS | ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ํ์ฉํด ๋ ์ด์์, ์์, ๊ฐ๊ฒฉ, ๋ฐ์ํ ์คํ์ผ์ ์์ฑํ๋ค. |
| Base UI | ์ ๊ทผ์ฑ๊ณผ ์ํธ์์ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Headless UI ์ปดํฌ๋ํธ๋ก ๊ณตํต ์ปดํฌ๋ํธ์ ๋์์ ๊ตฌํํ๋ค. |
| Lucide React | ์ผ๊ด๋ ์คํ์ผ์ SVG ์์ด์ฝ์ ์ ๊ณตํ๋ค. |
| Zustand | ๋ชจ๋ฌ, ๋ฐํ ์ํธ, ์์น ์ ๋ณด, ์์ฑ ์ค์ธ ๋ฐ์ดํฐ ๋ฑ ์ ์ญ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. |
| TanStack Query | ์๋ฒ ์ํ๋ฅผ ์กฐํํ๊ณ , ์บ์ฑยท๋๊ธฐํยท๋ก๋ฉยท์๋ฌยท๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ์ ๊ด๋ฆฌํ๋ค. |
| React Hook Form | ํผ ์ ๋ ฅ๊ฐ, ์ ์ถ ์ด๋ฒคํธ, ํ๋ ์ํ ๋ฐ ์๋ฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค. |
| Zod | ํผ ์ ๋ ฅ๊ฐ๊ณผ API ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ์ ์ํ๊ณ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ค. |
| Storybook | ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐยท๋ฌธ์ํํ๊ณ ๋ค์ํ ์ํ๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ฒ์ฆํ๋ค. |
| ๋๊ตฌ | ์ญํ | ๋ชฉ์ |
|---|---|---|
| OxLint | JavaScript ๋ฐ TypeScript ์ฝ๋ ์ ์ ๋ถ์ | ์ฝ๋ ์ค๋ฅ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ๊ณ ์ผ๊ด๋ ์ฝ๋ฉ ๊ท์น์ ์ ์งํ๋ค. |
| Oxfmt | ์ฝ๋ ์๋ ํฌ๋งทํ | ํ ์ ์ฒด์ ์ฝ๋ ์คํ์ผ์ ํต์ผํ๊ณ ๊ฐ๋ ์ฑ์ ๋์ธ๋ค. |
| TypeScript | ์ ์ ํ์ ๊ฒ์ฌ | ํ์ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ๋ฐ๊ฒฌํด ์ฝ๋์ ์์ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ธ๋ค. |
| ๋๊ตฌ | ์ญํ | ๋ชฉ์ |
|---|---|---|
| Vitest | ๋จ์ ํ ์คํธ ์คํ ๋ฐ ๊ฒ์ฆ | ํจ์, ์ ํธ๋ฆฌํฐ, ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์ฆํ๋ค. |
| MSW | ๋คํธ์ํฌ ์์ฒญ ๋ชจํน | ์ค์ ์๋ฒ ์์ด API ์์ฒญ๊ณผ ์๋ต ์ํฉ์ ์ฌํํ๋ค. |
| React Testing Library | ์ปดํฌ๋ํธ ๋ ๋๋ง ๋ฐ ์ฌ์ฉ์ ์ํธ์์ฉ ํ ์คํธ | ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ํจ๊ป ๋์ํ๋ ํตํฉ ํ๋ฆ๊ณผ ์ฌ์ฉ์ ๊ด์ ์ UI ๋์์ ๊ฒ์ฆํ๋ค. |
| Playwright | ๋ธ๋ผ์ฐ์ ์๋ํ ๋ฐ E2E ํ ์คํธ | ์ค์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฃผ์ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ ์๋น์ค ์ ์ฒด ํ๋ฆ์ ๊ฒ์ฆํ๋ค. |
MVP์์๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ธฐ๋ณด๋ค, ์ค์ ์ฌ์ฉ์๊ฐ ๋ง์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฐ์ ์ง์ํ๊ธฐ๋ก ํ์ต๋๋ค.
| ํ๊ฒฝ | ์ง์ ๋ฒ์ |
|---|---|
| Desktop Chrome | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| Desktop Edge | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| Desktop Safari | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| Desktop Firefox | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| iOS Safari | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| Android Chrome | ์ต์ 2๊ฐ ๋ฉ์ด์ ๋ฒ์ |
| Internet Explorer | ์ง์ํ์ง ์์ |
๋ชจ๋ฐ์ผ ์ฌ์ฉ ๋น์ค์ด ๋๊ธฐ ๋๋ฌธ์ iOS Safari์ Android Chrome์์ ์ง๋, ์์น ๊ถํ, ๋ฐํ ์ํธ, ์ฑํ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ์ฐ์ ์ ์ผ๋ก ๊ฒ์ฆํฉ๋๋ค. ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์๋น์ค๊ฐ ์์ ํ ๋์ํ์ง ์์ ์ ์์ผ๋ฏ๋ก, ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํธ ์๋ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ Playwright๋ฅผ ํ์ฉํด Chromium, WebKit, Firefox ํ๊ฒฝ์์ ์งํํ๊ณ , ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ์ค์ iOS์ Android ๊ธฐ๊ธฐ์์๋ ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- Microsoft์ ๊ณต์ ์ง์์ด ์ข ๋ฃ๋จ
- ์ต์ JavaScriptยทCSS ๊ธฐ๋ฅ ์ง์์ด ๋ถ์กฑํจ
- fetch, ES Module, Optional Chaining, Geolocation ๋ฑ์์ ์ ์ฝ์ด ๋ง์
- Polyfill๊ณผ ๋ณ๋ ๋น๋ ์ค์ ์ด ๋ง์ด ํ์ํจ
๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋ ๋๊ตฌ์ TypeScript ์ค์ ์ ํตํด ๋ฌธ๋ฒ ๋ณํ์ ์ฒ๋ฆฌํ๊ณ , ์ค์ ์ง์ ๋ฒ์์์ ํ์ํ ๊ธฐ๋ฅ๋ง ์ ๋ณ์ ์ผ๋ก Polyfill์ ์ ์ฉํฉ๋๋ค.
Polyfill์ ์ ์ฉํ ๋๋ ๋ค์ ์์น์ ๋ฐ๋ฆ ๋๋ค.
- ์ง์ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ ๋ณ๋๋ก ์ถ๊ฐํ์ง ์๋๋ค.
- ํน์ ๋ธ๋ผ์ฐ์ ์์๋ง ํ์ํ ๊ธฐ๋ฅ์ ํด๋น ๊ธฐ๋ฅ์ ํํด์ Polyfill์ ์ถ๊ฐํ๋ค.
- ๋ธ๋ผ์ฐ์ ์ API ์ง์ ์ฌ๋ถ๊ฐ ์ค์ํ ๊ธฐ๋ฅ์ Feature Detection์ ์ฌ์ฉํ๋ค.
- Polyfill์ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์๋ฅผ ์กฐ์ ํ ์ ์๋์ง ๋จผ์ ๊ฒํ ํ๋ค.
- ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์๋ด ํ๋ฉด์ด๋ ๋์ฒด ๋์์ ์ ๊ณตํ๋ค.
- ์๋ฅผ ๋ค์ด ํ์ฌ ์์น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ Geolocation API๋ฅผ ์ง์ํ๋์ง ํ์ธํ ๋ค ์์ฒญํฉ๋๋ค.
- ํด๋น ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๋๋ค๋ฉด, ์์น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ด ๋ชจ๋ฌ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.
์๋น์ค์ ๋ชจ๋ ํ์ด์ง๊ฐ ๊ฒ์ ์์ง์ ๋ ธ์ถ๋ ํ์๋ ์๊ธฐ ๋๋ฌธ์, ๊ณต๊ฐ ํ์ด์ง์ ์ฌ์ฉ์ ์ ์ฉ ํ์ด์ง๋ฅผ ๊ตฌ๋ถํด์ SEO๋ฅผ ์ ์ฉํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ณต๊ฐ ํ์ด์ง๋ ๊ฒ์ ์์ง ๋ ธ์ถ์ ๊ณ ๋ คํฉ๋๋ค.
- ํ
- ๊ธ ๋ชฉ๋ก
- ๊ธ ์์ธ
๊ธ ๋ชฉ๋ก์ ์ฌ์ฉ์์ ์๋์ ๊ฒฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๊น์ด ๊ฒ์๊ธ์ ์กฐํํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์์น ๊ถํ์ ๊ฒ์ ์์ง์ด ์์ ์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ํ์ฌ ์์น ๊ธฐ๋ฐ ๋ชฉ๋ก์ ๊ทธ๋๋ก SEO ๋์์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ ์ด๋ ต๋ค๊ณ ํ๋จํ์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์์ฉ ๊ธ ๋ชฉ๋ก๊ณผ ๊ฒ์ ๋ ธ์ถ์ฉ ๊ธ ๋ชฉ๋ก์ ๋ถ๋ฆฌํ๊ธฐ๋ก ํ์ต๋๋ค.
์ฌ์ฉ์์ฉ ๊ธ ๋ชฉ๋ก์ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์๊ธ์ ์กฐํํ๊ณ , ๊ฒ์ ๋ ธ์ถ์ฉ ๊ธ ๋ชฉ๋ก์ ์ง์ญ์ URL์ ํฌํจํด ์๋ฒ์์ ํด๋น ์ง์ญ์ ๊ฒ์๊ธ์ ์กฐํํฉ๋๋ค.
/post-list
โ ์ฌ์ฉ์ ํ์ฌ ์์น ๊ธฐ๋ฐ ๋ชฉ๋ก
/post-list/seoul
โ ์์ธ ์ง์ญ ๊ฒ์๊ธ ๋ชฉ๋ก
- ๊ฒ์ ๋ ธ์ถ์ฉ ํ์ด์ง๋ SSR ๋๋ ์ฌ์ ๋ ๋๋ง์ ์ ์ฉํด ์ด๊ธฐ HTML์ ๊ฒ์๊ธ ๋ชฉ๋ก์ด ํฌํจ๋๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ๋ํ ์ง์ญ๋ณ ๋ํ URL์ ๊ธฐ์ค์ผ๋ก canonical URL์ ์ค์ ํ๊ณ , ๊ฐ์ธํ๋ ์์น ๋ชฉ๋ก์ด๋ ๋ค์ํ ํํฐ ์กฐํฉ์ ๊ฒ์ ์์ง์ ๋ ธ์ถํ์ง ์์ต๋๋ค.
- MVP์์๋ ์ฐ์ ๊ฒ์๊ธ ์์ธ ํ์ด์ง๋ฅผ SEO ๋์์ผ๋ก ์ผ๊ณ , ๊ธ ๋ชฉ๋ก์ ๋์ค์ ์ง์ญ๋ณ ๊ณต๊ฐ ํ์ด์ง๊ฐ ํ์ํด์ก์ ๋ ํ์ฅํ๋ ๋ฐฉ์์ ๊ณ ๋ ค ์ค์ ๋๋ค.
๊ฐ ํ์ด์ง์๋ ํ์ด์ง์ ๋ด์ฉ์ ๋ง๋ ๋ฉํ ์ ๋ณด๋ฅผ ์ค์ ํฉ๋๋ค.
- ํ์ด์ง๋ณ title
- ํ์ด์ง๋ณ description
- Open Graph ๋ฉํ ํ๊ทธ
- ๋ํ ์ด๋ฏธ์ง
- canonical URL
- ์๋ฏธ ์๋ h1 ์ ๋ชฉ
- ์ด๋ฏธ์ง alt ์์ฑ
- ๊ฒ์๊ธ๊ณผ ์ด๋ ๊ฒฝ๋ก๋ฅผ ํํํ๋ ๊ตฌ์กฐํ ๋ฐ์ดํฐ
- ๊ฒ์๊ธ ์์ธ ํ์ด์ง๋ ๊ฒ์๊ธ ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ด ๊ฒ์ ์์ง์ ์ ์ ๋ฌ๋ ์ ์๋๋ก ์๋งจํฑ HTML์ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ์ ๊ฐ์ธ ์ ๋ณด๋ ์๋น์ค ๋ด๋ถ ๋์๊ณผ ๊ด๋ จ๋ ํ์ด์ง๋ ๊ฒ์ ์์ง์ ๋ ธ์ถํ์ง ์์ต๋๋ค.
- ๊ธ ์์ฑ
- ์ฑํ ๋ชฉ๋ก
- ์ฑํ ๋ฐฉ
- ํ์ ๋งค์นญ
- ์ฌ์ฉ์ ์ ์ฉ ์ค์ ํ์ด์ง