[Book] ํด๋ฆฐ์ฝ”๋“œ - 12์žฅ ์ฐฝ๋ฐœ์„ฑ

2021. 2. 12. 14:16ยท๐Ÿ“ Book/โœ Clean Code

12์žฅ ์ฐฝ๋ฐœ์„ฑ

์ฐฝ๋ฐœ์„ฑ์ด๋ž€?
ํ•˜์œ„ ์ฒด๊ณ„๋กœ๋ถ€ํ„ฐ ์ƒ๊ฒจ๋‚˜์ง€๋งŒ, ๊ทธ ํ•˜์œ„ ์ฒด๊ณ„๋กœ ํ™˜์›๋˜์ง€ ์•Š๋Š” ์†์„ฑ

 

1. ์ฐฝ๋ฐœ์  ์„ค๊ณ„๋กœ ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž

  • ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ค‘๋ณต์„ ์—†์•ค๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์ธ๋‹ค.

 

์œ„ ๋„ค ๊ฐ€์ง€ ๊ทœ์น™์„ ์ฐฉ์‹คํ•˜๊ฒŒ ๋”ฐ๋ฅด๊ธฐ๋งŒ ํ•˜๋ฉด

  • ์šฐ์ˆ˜ํ•œ ์„ค๊ณ„๊ฐ€ ๋‚˜์˜ค๊ณ 
  • ์ฝ”๋“œ ๊ตฌ์กฐ์™€ ์„ค๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ณ 
  • SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™)๋‚˜ DIP(์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ์›์น™)์™€ ๊ฐ™์€ ์›์น™์„ ์ ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ 
  • ์ฐฝ๋ฐœ์„ฑ์„ ์ด‰์ง„ํ•œ๋‹ค.

 

2. ๋‹จ์ˆœํ•œ ์„ค๊ณ„ ๊ทœ์น™ 1 : ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ผ

๋ฌด์—‡๋ณด๋‹ค ๋จผ์ €, ์„ค๊ณ„๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋Š” ์‹œ์Šคํ…œ์„ ๋‚ด๋†“์•„์•ผ ํ•œ๋‹ค.

๋ฌธ์„œ๋กœ๋Š” ์‹œ์Šคํ…œ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ์ง€๋งŒ ์‹œ์Šคํ…œ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ๊ฒ€์ฆํ•  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด

๋ฌธ์„œ ์ž‘์„ฑ์„ ์œ„ํ•ด ํˆฌ์žํ•œ ๋…ธ๋ ฅ์— ๋Œ€ํ•œ ๊ฐ€์น˜๋Š” ์ธ์ •๋ฐ›๊ธฐ ํž˜๋“ค๋‹ค.

 

ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ ค๊ณ  ์• ์“ฐ๋ฉด ์„ค๊ณ„ ํ’ˆ์งˆ์ด ๋”๋ถˆ์–ด ๋†’์•„์ง„๋‹ค.

  • ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๋ชฉ์  ํ•˜๋‚˜๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค. (SRP)
  • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์œผ๋ฉด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ ์ฃผ์ž…, ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™” ๋“ฑ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

 

๋†€๋ž๊ฒŒ๋„ "ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณ„์† ๋Œ๋ ค๋ผ"๋ผ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด

์‹œ์Šคํ…œ์€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๋†’์€ ์‘์ง‘๋ ฅ์ด๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ๋ฒ•๋ก ์ด ์ง€ํ–ฅํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ์ €์ ˆ๋กœ ๋‹ฌ์„ฑํ•œ๋‹ค.

 

3. ๋‹จ์ˆœํ•œ ์„ค๊ณ„ ๊ทœ์น™ 2~4 : ๋ฆฌํŒฉํ„ฐ๋ง

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์ด์ œ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ํ•ด๋‚˜๊ฐ„๋‹ค.

์ฝ”๋“œ ๋ช‡ ์ค„์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  ์„ค๊ณ„๋ฅผ ์กฐ๊ฐํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ์ด ๊นจ์งˆ๊นŒ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

 

๋ฆฌํŒฉํ„ฐ๋ง ๋‹จ๊ณ„์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๊ธฐ๋ฒ•์ด๋ผ๋ฉด ๋ฌด์—‡์ด๋“  ์ ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค.

์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ , ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ์‹œ์Šคํ…œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„๊ณ ,

ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ , ๋” ๋‚˜์€ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์„ ๋™์›ํ•œ๋‹ค.

 

4. ์ค‘๋ณต์„ ์—†์• ๋ผ

์ค‘๋ณต์€ ์ถ”๊ฐ€ ์ž‘์—…, ์ถ”๊ฐ€ ์œ„ํ—˜, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก๋„๋ฅผ ๋œปํ•œ๋‹ค.

 

๊ตฌํ˜„ ์ค‘๋ณต๋„ ์ค‘๋ณต์˜ ํ•œ ํ˜•ํƒœ์ด๋‹ค.

int size() {}
boolean isEmpty() {}

// size() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ค‘๋ณตํ•ด ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
boolean isEmpty(){
    return 0 == size();
}

 

๊น”๋”ํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹จ ๋ช‡ ์ค„์ด๋ผ๋„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ฒ ๋‹ค๋Š” ์˜์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์†Œ๊ทœ๋ชจ ์žฌ์‚ฌ์šฉ์€ ์‹œ์Šคํ…œ ๋ณต์žก๋„๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๊ณ  ์†Œ๊ทœ๋ชจ ์žฌ์‚ฌ์šฉ์„ ์ œ๋Œ€๋กœ ์ตํ˜€์•ผ ๋Œ€๊ทœ๋ชจ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

1) Template Method ํŒจํ„ด

๊ณ ์ฐจ์› ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ๋ชฉ์ ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

public class VacationPolicy {
  public void accrueUSDDivisionVacation() {
    // ์ง€๊ธˆ๊นŒ์ง€ ๊ทผ๋ฌดํ•œ ์‹œ๊ฐ„์„ ๋ฐ”ํƒ•์œผ๋กœ ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ
    // ...
    // ํœด๊ฐ€ ์ผ์ˆ˜๊ฐ€ ๋ฏธ๊ตญ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ
    // ...
    // ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ธ‰์—ฌ ๋Œ€์žฅ์— ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ
    // ...
  }
  
  public void accrueEUDivisionVacation() {
    // ์ง€๊ธˆ๊นŒ์ง€ ๊ทผ๋ฌดํ•œ ์‹œ๊ฐ„์„ ๋ฐ”ํƒ•์œผ๋กœ ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ
    // ...
    // ํœด๊ฐ€ ์ผ์ˆ˜๊ฐ€ ์œ ๋Ÿฝ์—ฐํ•ฉ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ
    // ...
    // ํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ธ‰์—ฌ ๋Œ€์žฅ์— ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ
    // ...
  }
}

// ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ๋งŒ ์ œ์™ธํ•˜๋ฉด ๋‘ ๋ฉ”์„œ๋“œ๋Š” ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค.
// template method ํŒจํ„ด์„ ์ ์šฉํ•ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์ž

abstract public class VacationPolicy {
  public void accrueVacation() {
    caculateBseVacationHours();
    alterForLegalMinimums();
    applyToPayroll();
  }
  
  private void calculateBaseVacationHours() { /* ... */ };
  abstract protected void alterForLegalMinimums();
  private void applyToPayroll() { /* ... */ };
}

public class USVacationPolicy extends VacationPolicy {
  @Override protected void alterForLegalMinimums() {
    // ๋ฏธ๊ตญ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  }
}

public class EUVacationPolicy extends VacationPolicy {
  @Override protected void alterForLegalMinimums() {
    // ์œ ๋Ÿฝ์—ฐํ•ฉ ์ตœ์†Œ ๋ฒ•์ • ์ผ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  }
}

 

5. ํ‘œํ˜„ํ•˜๋ผ

์ž์‹ ์ด ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ๋Š” ์‰ฝ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์œ ์ง€ ๋ณด์ˆ˜ํ•  ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ์‚ฌ๋žŒ๋งŒํผ์ด๋‚˜ ๋ฌธ์ œ๋ฅผ ๊นŠ์ด ์ดํ•ดํ•  ๊ฐ€๋Šฅ์„ฑ์€ ํฌ๋ฐ•ํ•˜๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ช…๋ฐฑํ•˜๊ฒŒ ์งค์ˆ˜๋ก ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ทธ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๊ทธ๋ž˜์•ผ ๊ฒฐํ•จ์ด ์ค„์–ด๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“ ๋‹ค.

 

  • ์ข‹์€ ์ด๋ฆ„: ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ๊ธฐ๋Šฅ๊ณผ ์™„์ „ ๋”ดํŒ์ด๋ฉด ์•ˆ ๋œ๋‹ค.
  • ์ž‘์€ ํฌ๊ธฐ์˜ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜: ์ž‘์€ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋Š” ์ด๋ฆ„ ์ง“๊ธฐ๋„ ์‰ฝ๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ๋„ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค.
  • ํ‘œ์ค€ ๋ช…์นญ ์‚ฌ์šฉ: ๋””์ž์ธ ํŒจํ„ด์€ ์˜์‚ฌ์†Œํ†ต๊ณผ ํ‘œํ˜„๋ ฅ ๊ฐ•ํ™”๊ฐ€ ๋ชฉ์ ์ด๋‹ค. ํด๋ž˜์Šค๊ฐ€ Command๋‚˜ Visitor์™€ ๊ฐ™์€ ํ‘œ์ค€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋œ๋‹ค๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„์— ํŒจํ„ด ์ด๋ฆ„์„ ๋„ฃ์–ด์ค€๋‹ค.
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์˜ˆ์ œ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฌธ์„œ์ด๋‹ค. ์ž˜ ๋งŒ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฝ์–ด๋ณด๋ฉด ํด๋ž˜์Šค ๊ธฐ๋Šฅ์ด ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.

 

6. ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์—ฌ๋ผ

ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ํฌ๊ธฐ๋ฅผ ์ค„์ด์ž๊ณ  ์กฐ๊ทธ๋งŒ ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์—†์ด ๋งŒ๋“œ๋Š” ์‚ฌ๋ก€๋„ ์—†์ง€ ์•Š๋‹ค.

 

๋•Œ๋กœ๋Š” ๋ฌด์˜๋ฏธํ•˜๊ณ  ๋…๋‹จ์ ์ธ ์ •์ฑ… ํƒ“์— ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ํด๋ž˜์Šค๋งˆ๋‹ค ๋ฌด์กฐ๊ฑด ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ
  • ์ž๋ฃŒ ํด๋ž˜์Šค์™€ ๋™์ž‘ ํด๋ž˜์Šค๋Š” ๋ฌด์กฐ๊ฑด ๋ถ„๋ฆฌ

๊ฐ€๋Šฅํ•œ ๋…๋‹จ์ ์ธ ๊ฒฌํ•ด๋Š” ๋ฉ€๋ฆฌํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค.

 

์ด ๊ทœ์น™์€ ๊ฐ„๋‹จํ•œ ์„ค๊ณ„ ๊ทœ์น™ ๋„ค ๊ฐœ ์ค‘ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ์ž‘์—…๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ž‘์—…์ด ๋” ์ค‘์š”ํ•˜๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Clean Code' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 14์žฅ ์ ์ง„์ ์ธ ๊ฐœ์„ 
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 13์žฅ ๋™์‹œ์„ฑ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 11์žฅ ์‹œ์Šคํ…œ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 10์žฅ ํด๋ž˜์Šค
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Book] ํด๋ฆฐ์ฝ”๋“œ - 12์žฅ ์ฐฝ๋ฐœ์„ฑ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”