์ฐ๋ฆฌ์ ์ผ์ ์์์ ํผ์, ๋๋ก๋ ํจ๊ป ์ฑ๊ฒจ์ผ ํ๋ ์ง์ ๋ชฉ๋ก์ ํธ๋ฆฌํ๊ฒ ์์ฑํ๊ณ , ๋์น์ง ์๊ฒ ๋์์ฃผ๊ณ , ์ฑ๊น์ด ์ฌ์ ์ ์ฆ๊ฒ๊ณ ์์ฌ์ด ํ์๊ฐ ๋ ์ ์๋๋ก ๋์์ฃผ๋ ์๋น์ค Packman ์ ๋๋ค.
๐งณ Packman ์๋น์ค ๋ฐ๋ก๊ฐ๊ธฐ
(JavaScript / TypeScript / React.js / Next.js / React Query / MSW)
.
โโโ utils
โโโ mocks ๐ ๋ชฉ ๋ฐ์ดํฐ ์ ์ฅ
โโโ package.json ๐ฆ ์ค์น๋ ํจํค์ง๋ฅผ ๊ด๋ฆฌํ๋ ํ์ผ
โโโ component
โ โ โโโ common ๐ ๊ณตํต์ผ๋ก ์ฐ์ผ ์ปดํฌ๋ํธ ์ ์ฅ
โ โ โ โโโ Footer
โ โ โ โโโ Header
โ โ โ โโโ assets
โ โ โโโ home ๐ main ํ์ด์ง์ ์ฐ์ผ ์ปดํฌ๋ํธ ์ ์ฅ
โ โ โโโ together ๐ together ํ์ด์ง์ ์ฐ์ผ ์ปดํฌ๋ํธ ์ ์ฅ
โโโ pages
โโโ _app.tsx โก๏ธ ์ฑ์ ๋ผ์ฐํ
๊ณผ ๊ธ๋ก๋ฒ ์คํ์ผ ์ง์
โโโ index.tsx
โโโ together.tsx
โโโ together/pack/[id].tsx
- ์์ ๋ก๊ทธ์ธ์ ํตํด ์ ์ ๊ฐ ๋น ๋ฅด๊ฒ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ์ ํ ์ ์๋๋ก ํฉ๋๋ค. ๊ตฌ๊ธ ๋ก๊ทธ์ธ๊ณผ ์นด์นด์ค ๋ก๊ทธ์ธ ๋๊ฐ์ง ์์ ๋ก๊ทธ์ธ์ ์ด์ฉํ ์ ์์ต๋๋ค. (๊ตฌ๊ธ์ ๊ตฌํ ์งํ ์ค)
- ํจํน ๋ฆฌ์คํธ ์์ฑ์ ์ ๋ํ๋ CTA ๋ฒํผ์ด ์๋ ํ๋ฉด์ ๋๋ค.
- ์ฌ์ฉ์๊ฐ ํด๋๋ฅผ 1๊ฐ ์ด์ ์์ฑํ๋ฉด ํด๋น ๋ฒํผ์ด +๋ชจ์์ ํ๋กํ ์ก์ ๋ฒํผ์ผ๋ก ๋ฐ๋๋ฉฐ, ํด๋น ๋ฒํผ์ ํตํด ํผ์ ๋ฐ ํจ๊ป ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐ ๋ฐ ํดํฐ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ํด๋ ์ ํจํน ๋ฆฌ์คํธ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ ํ๋ฉด์ ๋๋ค.
- ํด๋น ํ๋ฉด์ ํจ๊ป, ํผ์์ ๋ฐ๋ผ ๊ตฌ๋ถ๋ ํด๋์ ์๋ง๊ฒ ๋ฆฌ์คํธ๊ฐ ์์๋๊ฒ ํ๋ฉฐ, ํด๋ ์ฐ์ธก ์ด๋ก์ ํ ๊ธ์ ํตํด ํด๋๊ฐ ์ด๋์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ ์ ๋ ๋ฆฌ์คํธ ๋ทฐ์์ ์์ฝ๊ฒ ์นดํ ๊ณ ๋ฆฌ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑ, ์์ ํ ์ ์์ต๋๋ค.
- ํจ๊ป ํจํน ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ฉด, ์ด๋ ๋งํฌ๋ฅผ ๋ณต์ฌํ ์ ์๋ ๋ชจ๋ฌ์ด ๋น๋๋ค.
- ์ด๋ ๋งํฌ๋ฅผ ํตํด ์ผํ์์ ๋ฆฌ์คํธ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋๋ ์ผํ์ด ๋ค์ด์ค๋ฉด, ์ผํ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑ, ์์ ํ ์ ์์ต๋๋ค.
- ํด๋น ๋ทฐ์์ ์ฌ์ฉ์๋ ์๋ก์ด ์ง ์ถ๊ฐ ๋ฐ ์์ , ์นดํ ๊ณ ๋ฆฌ ๋ฐ ๋ฆฌ์คํธ ์์ , ์ง ์ฑ๊ธธ ์ฌ๋(๋ด๋น์) ๋ฐฐ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์์ต๋๋ค.
์ฝ๋ฉ ์ปจ๋ฒค์ : Airbnb React Style guide
- ์ด๋ฆ์ผ๋ก๋ถํฐ ์๋๊ฐ ์ฝํ์ง ์ ์๊ฒ ์ด๋ค.
-
ex)
// bad function q() { // ...stuff... } // good function query() { // ..stuff.. }
- ์ค๋ธ์ ํธ, ํจ์, ๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค์๋
camelCase
๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
// bad const OBJEcttsssss = {}; const this_is_my_object = {}; function c() {} // good const thisIsMyObject = {}; function thisIsMyFunction() {}
- ํด๋์ค๋ constructor์๋
PascalCase
๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
// bad function user(options) { this.name = options.name; } const bad = new user({ name: 'nope', }); // good class User { constructor(options) { this.name = options.name; } } const good = new User({ name: 'yup', });
- ํจ์ ์ด๋ฆ์ ๋์ฌ + ๋ช
์ฌ ํํ๋ก ์์ฑํ๋ค.
ex)
postUserInformation( )
- ์ฝ์ด ์ฌ์ฉ์ ์ต๋ํ ์ง์ํ๋ค.
- ์ด๋ฆ์ ๋ค ๋จ์ด ์ด์์ด ๋ค์ด๊ฐ๋ฉด ํ์๊ณผ ์์๋ฅผ ๊ฑฐ์น ํ ์ฌ์ฉํ๋ค
- ๋ณต์ํ์ ๋ธ๋ก์๋ ์ค๊ดํธ({})๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
// bad if (test) return false; // good if (test) return false; // good if (test) { return false; } // bad function() { return false; } // good function() { return false; }
- ๋ณต์ํ ๋ธ๋ก์
if
์else
๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐelse
๋if
๋ธ๋ก ๋์ ์ค๊ดํธ( } )์ ๊ฐ์ ํ์ ์์น์ํจ๋ค.
-
ex)
// bad if (test) { thing1(); thing2(); } else { thing3(); } // good if (test) { thing1(); thing2(); } else { thing3(); }
- ๋ณต์ํ์ ์ฝ๋ฉํธ๋
/** ... */
๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
// good /** * @param {String} tag * @return {Element} element */ function make(tag) { // ...stuff... return element; }
- ๋จ์ผ ํ์ ์ฝ๋ฉํธ์๋
//
์ ์ฌ์ฉํ๊ณ ์ฝ๋ฉํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ์ฝ๋์ ์๋ถ์ ๋ฐฐ์นํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉํธ์ ์์ ๋น ํ์ ๋ฃ๋๋ค.
-
ex)
// bad const active = true; // is current tab // good // is current tab const active = true; // good function getType() { console.log('fetching type...'); // set the default type to 'no type' const type = this._type || 'no type'; return type; }
- ๋ฌธ์์ด์๋ ์ฑํฌ์ฟผํธ
''
๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
// bad const name = "Capt. Janeway"; // good const name = 'Capt. Janeway';
- ํ๋ก๊ทธ๋จ์์ ๋ฌธ์์ด์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๋ฌธ์์ด ์ฐ๊ฒฐ์ด ์๋
template strings
๋ฅผ ์ด์ฉํ๋ค.
-
ex)
// bad function sayHi(name) { return 'How are you, ' + name + '?'; } // bad function sayHi(name) { return ['How are you, ', name, '?'].join(); } // good function sayHi(name) { return `How are you, ${name}?`; }
- ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
-
ex)
var arr1 = [1, 2, 3]; var pow1 = arr.map(function (x) { // ES5 Not Good return x * x; }); const arr2 = [1, 2, 3]; const pow2 = arr.map(x => x * x); // ES6 Good
==
์ด๋!=
๋ณด๋ค===
์!==
์ ์ฌ์ฉํ๋ค.- ๋จ์ถํ์ ์ฌ์ฉํ๋ค.
-
ex)
// bad if (name !== '') { // ...stuff... } // good if (name) { // ...stuff... }
- ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ ๋
Promise
ํจ์์ ์ฌ์ฉ์ ์ง์ํ๊ณasync
,await
๋ฅผ ์ฐ๋๋ก ํ๋ค
- ๋จ์ : rem, em ์ฌ์ฉ
commit message ์ปจ๋ฒค์ & ๋ธ๋์น ์ ๋ต
- option : [gitmoji](https://gitmoji.dev/) - ์์ฐ๋ฉด ์ปค๋ฐ ์ปจ๋ฒค์ ๋ํ์ ์ธ๊ฑฐ๋ง ์งํค์~## ๋ธ๋์น ์ ๋ต (ex. git flow)
- github flow ์ฌ์ฉ
- ์์
์ ์ jira ์ด์ ์์ฑ
- ์ด์ ๋ฒํธ๋ก ๋ธ๋์น๋ฅผ ํ์ ์์
- ์์
์ด ๋ค ๋๋๋ฉด ํผ์ณ ๋ธ๋์น์์ develop ๋ธ๋์น๋ก Pull Request ์์ฑ
- ๊ฐ์ ํ์ 3์ธ์ Approve๋ฅผ ๋ฐ์์ผ main ๋ธ๋์น์ ๋จธ์ง ๊ฐ๋ฅ