Frontend Wiki - 100-hours-a-week/KTB4-3rd-wiki GitHub Wiki

๋ชจ์—ฌํƒ€ Frontend Wiki

Frontend Repository


๋ชฉ์ฐจ


ํด๋” ๊ตฌ์กฐ


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 groups

Slice group์„ ํ—ˆ์šฉํ•ด ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ํŒŒ์ผ ํƒ์ƒ‰์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

widgets ๋ ˆ์ด์–ด๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

mvp ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์—์„œ๋Š” widgets ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ถ”ํ›„ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์˜ฌ๋•Œ ์ถ”๊ฐ€ ํ•  ์˜ˆ์ •์ด๋‹ค.

์ƒˆ ์ฝ”๋“œ ๋ฐฐ์น˜ ๊ธฐ์ค€

์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋‹ค์Œ ์ˆœ์„œ๋กœ ํŒ๋‹จํ•œ๋‹ค.

ํŠน์ • ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
-> pages

ํŠน์ • ๋„๋ฉ”์ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๊ฐ€?
-> entities

์‚ฌ์šฉ์ž์˜ ํ–‰๋™์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฐ€?
-> features

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๊ณ„์—†๋Š” ๋ฒ”์šฉ ์ฝ”๋“œ์ธ๊ฐ€?
-> shared


์ปจ๋ฒค์…˜ ๋ฃฐ

์ฝ”๋“œ ์ปจ๋ฒค์…˜ ( Oxfmt & Oxlint)

๋„ค์ด๋ฐ ๊ทœ์น™

ํ•ญ๋ชฉ ์ผ€์ด์Šค ๊ทœ์น™
ํด๋”๋ช…, ํŒŒ์ผ๋ช…, ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ช…, ์„œ๋ฒ„ ์‘๋‹ต ๋ฐ์ดํ„ฐ 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 ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค์˜ ๊ธด๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ์ฆ‰์‹œ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ

PR ์ปจ๋ฒค์…˜

์˜ˆ์‹œ: 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 ๊ธฐ๊ธฐ์—์„œ๋„ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Internet Explorer๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

  • Microsoft์˜ ๊ณต์‹ ์ง€์›์ด ์ข…๋ฃŒ๋จ
  • ์ตœ์‹  JavaScriptยทCSS ๊ธฐ๋Šฅ ์ง€์›์ด ๋ถ€์กฑํ•จ
  • fetch, ES Module, Optional Chaining, Geolocation ๋“ฑ์—์„œ ์ œ์•ฝ์ด ๋งŽ์Œ
  • Polyfill๊ณผ ๋ณ„๋„ ๋นŒ๋“œ ์„ค์ •์ด ๋งŽ์ด ํ•„์š”ํ•จ

Polyfill ์ „๋žต

๊ธฐ๋ณธ์ ์œผ๋กœ ๋นŒ๋“œ ๋„๊ตฌ์™€ TypeScript ์„ค์ •์„ ํ†ตํ•ด ๋ฌธ๋ฒ• ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹ค์ œ ์ง€์› ๋ฒ”์œ„์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์„ ๋ณ„์ ์œผ๋กœ Polyfill์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Polyfill์„ ์ ์šฉํ•  ๋•Œ๋Š” ๋‹ค์Œ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  • ์ง€์› ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์€ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์— ํ•œํ•ด์„œ Polyfill์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์˜ API ์ง€์› ์—ฌ๋ถ€๊ฐ€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ Feature Detection์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • Polyfill์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฒ”์œ„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ๊ฒ€ํ† ํ•œ๋‹ค.
  • ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์•ˆ๋‚ด ํ™”๋ฉด์ด๋‚˜ ๋Œ€์ฒด ๋™์ž‘์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Geolocation API๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์œ„์น˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์•ˆ๋‚ด ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SEO

์„œ๋น„์Šค์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœ๋  ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต๊ฐœ ํŽ˜์ด์ง€์™€ ์‚ฌ์šฉ์ž ์ „์šฉ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ SEO๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœํ•  ํŽ˜์ด์ง€

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณต๊ฐœ ํŽ˜์ด์ง€๋Š” ๊ฒ€์ƒ‰ ์—”์ง„ ๋…ธ์ถœ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

  • ํ™ˆ
  • ๊ธ€ ๋ชฉ๋ก
  • ๊ธ€ ์ƒ์„ธ

์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ธ€ ๋ชฉ๋ก์˜ SEO

๊ธ€ ๋ชฉ๋ก์€ ์‚ฌ์šฉ์ž์˜ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€๊นŒ์šด ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ์œ„์น˜ ๊ถŒํ•œ์€ ๊ฒ€์ƒ‰ ์—”์ง„์ด ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ชฉ๋ก์„ ๊ทธ๋Œ€๋กœ SEO ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์šฉ ๊ธ€ ๋ชฉ๋ก๊ณผ ๊ฒ€์ƒ‰ ๋…ธ์ถœ์šฉ ๊ธ€ ๋ชฉ๋ก์„ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์šฉ ๊ธ€ ๋ชฉ๋ก์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ณ , ๊ฒ€์ƒ‰ ๋…ธ์ถœ์šฉ ๊ธ€ ๋ชฉ๋ก์€ ์ง€์—ญ์„ URL์— ํฌํ•จํ•ด ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ์ง€์—ญ์˜ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

/post-list
โ†’ ์‚ฌ์šฉ์ž ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ชฉ๋ก

/post-list/seoul
โ†’ ์„œ์šธ ์ง€์—ญ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก
  • ๊ฒ€์ƒ‰ ๋…ธ์ถœ์šฉ ํŽ˜์ด์ง€๋Š” SSR ๋˜๋Š” ์‚ฌ์ „ ๋ Œ๋”๋ง์„ ์ ์šฉํ•ด ์ดˆ๊ธฐ HTML์— ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ด ํฌํ•จ๋˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ง€์—ญ๋ณ„ ๋Œ€ํ‘œ URL์„ ๊ธฐ์ค€์œผ๋กœ canonical URL์„ ์„ค์ •ํ•˜๊ณ , ๊ฐœ์ธํ™”๋œ ์œ„์น˜ ๋ชฉ๋ก์ด๋‚˜ ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ ์กฐํ•ฉ์€ ๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • MVP์—์„œ๋Š” ์šฐ์„  ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ SEO ๋Œ€์ƒ์œผ๋กœ ์‚ผ๊ณ , ๊ธ€ ๋ชฉ๋ก์€ ๋‚˜์ค‘์— ์ง€์—ญ๋ณ„ ๊ณต๊ฐœ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•ด์กŒ์„ ๋•Œ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค.

๊ฐ ํŽ˜์ด์ง€์—๋Š” ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์— ๋งž๋Š” ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ํŽ˜์ด์ง€๋ณ„ title
  • ํŽ˜์ด์ง€๋ณ„ description
  • Open Graph ๋ฉ”ํƒ€ ํƒœ๊ทธ
  • ๋Œ€ํ‘œ ์ด๋ฏธ์ง€
  • canonical URL
  • ์˜๋ฏธ ์žˆ๋Š” h1 ์ œ๋ชฉ
  • ์ด๋ฏธ์ง€ alt ์†์„ฑ
  • ๊ฒŒ์‹œ๊ธ€๊ณผ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ
  • ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€๋Š” ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ด ๊ฒ€์ƒ‰ ์—”์ง„์— ์ž˜ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๋งจํ‹ฑ HTML์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœํ•˜์ง€ ์•Š์„ ํŽ˜์ด์ง€

์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด๋‚˜ ์„œ๋น„์Šค ๋‚ด๋ถ€ ๋™์ž‘๊ณผ ๊ด€๋ จ๋œ ํŽ˜์ด์ง€๋Š” ๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ธ€ ์ž‘์„ฑ
  • ์ฑ„ํŒ… ๋ชฉ๋ก
  • ์ฑ„ํŒ…๋ฐฉ
  • ํƒ์‹œ ๋งค์นญ
  • ์‚ฌ์šฉ์ž ์ „์šฉ ์„ค์ • ํŽ˜์ด์ง€
โš ๏ธ **GitHub.com Fallback** โš ๏ธ