μννΈμ μ΄λ©΄μ μΈ΅κ° μμμ΄ λ΄ νμΌ μλ μλ€λ μκ°ν΄ λ΄€μ΄?!
μ μ ν¬ | μ΄μμ |
---|---|
funnysunny08 | euije |
κΈ°λ₯λͺ | μλν¬μΈνΈ | λ΄λΉμ |
---|---|---|
λ‘κ·ΈμΈ | [GET] /user | μ μ ν¬ |
μ€λ μ°λ₯΄κΈ° μ‘°ν | [GET] /user/{fromHomeNumber=Long}/complain | μ΄μμ |
μ°λ₯΄κΈ° | [POST] /complain | μ μ ν¬ |
μμ κ³ μ§μ | [GET] /user/{homeNumber=Long}/weekly | μ μ ν¬ |
μμ κ³ μ§μ 리μ€νΈ | [GET] /user/{homeNumber=Long}/weekly | μ΄μμ |
π‘ λλ£λ€κ³Ό λ§ν¬λ₯Ό ν΅μΌνκΈ° μν΄ μ»¨λ²€μ μ μ§μ ν©λλ€. μ€ν©μ§μ‘Έμ μ½λκ° μλ, ν μ¬λμ΄ μ§ κ²κ°μ μ½λλ₯Ό μμ±νλ κ²μ΄ μΆν μ μ§λ³΄μλ νμ μμ λμμ΄ λ©λλ€. λ΄κ° μ½λλ₯Ό μκ°νλ©΄μ 지 μ μλλ‘ ν΄μ£Όλ λ£°μ΄λΌκ³ μκ°ν΄λ μ’μ΅λλ€!
λͺ λͺ κ·μΉ(Naming Conventions)
- μ΄λ¦μΌλ‘λΆν° μλκ° μ½νμ§ μ μκ² μ΄λ€.
-
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( )
- μ½μ΄ μ¬μ©μ μ΅λν μ§μνλ€.
- μ΄λ¦μ λ€ λ¨μ΄ μ΄μμ΄ λ€μ΄κ°λ©΄ νμκ³Ό μμλ₯Ό κ±°μΉ ν μ¬μ©νλ€
λΈλ‘(Blocks)
- 볡μνμ λΈλ‘μλ μ€κ΄νΈ({})λ₯Ό μ¬μ©νλ€.
- 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(); }
μ½λ©νΈ(Comments)
- 볡μνμ μ½λ©νΈλ
/** ... */
λ₯Ό μ¬μ©νλ€.
- 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; }
Git Workflow
main β develop β feature/#issue_num
issue_num : issue λ²νΈμ λ§κ² μμ±
1. issue μμ±
2. local - feature/#issue_num μμ κ°μ κΈ°λ₯ μμ
(issue_num : issue λ²νΈμ λ§κ² μμ±)
3. remote - feature/#issue_num μ Push
4. remote - develop μΌλ‘ PR
5. μ½λ 리뷰 ν Confirm λ°κ³ remote - develop Merge
6. remote - develop μ Merge λ λ λ§λ€ λͺ¨λ νμ local - develop pull λ°μ μ΅μ μν μ μ§
Branch Name | μ€λͺ |
---|---|
main | μ΄κΈ° μΈν μ‘΄μ¬ |
develop | ꡬν μλ£ λΈλμΉ |
feature/#issue_num | μ΄μ λ³ κΈ°λ₯ ꡬν λΈλμΉ |
νκ·Έ μ΄λ¦ | μ€λͺ |
---|---|
[CHORE] | μ½λ μμ , λ΄λΆ νμΌ μμ |
[FEAT] | μλ‘μ΄ κΈ°λ₯ ꡬν |
[ADD] | FEAT μ΄μΈμ λΆμμ μΈ μ½λ μΆκ°, λΌμ΄λΈλ¬λ¦¬ μΆκ°, μλ‘μ΄ νμΌ μμ± |
[HOTFIX] | issueλ QAμμ κΈν λ²κ·Έ μμ μ μ¬μ© |
[FIX] | λ²κ·Έ, μ€λ₯ ν΄κ²° |
[DEL] | μΈλͺ¨ μλ μ½λ μμ |
[DOCS] | READMEλ WIKI λ±μ λ¬Έμ κ°μ |
[CORRECT] | μ£Όλ‘ λ¬Έλ²μ μ€λ₯λ νμ μ λ³κ²½, μ΄λ¦ λ³κ²½μ μ¬μ© |
[MOVE] | νλ‘μ νΈ λ΄ νμΌμ΄λ μ½λμ μ΄λ |
[RENAME] | νμΌ μ΄λ¦ λ³κ²½μ΄ μμ λ μ¬μ© |
[IMPROVE] | ν₯μμ΄ μμ λ μ¬μ© |
[REFACTOR] | μ λ©΄ μμ μ΄ μμ λ μ¬μ© |
π server _
|_ π common _
|_ π controller _
|_ π domain _
|_ π exception _
|_ π infrastructure _
|_ π service _
|_ ServerApplication
π μμ»€ν€ μ°μΉ μ°Έ 13~ π