๐Ÿ“– Books Read ์ฝ์€ ์ฑ…

(์ž‘์„ฑ์ค‘) Clean Code ํด๋ฆฐ์ฝ”๋“œ

MayKim51 2020. 6. 24. 11:31

Title: Clean Code ํด๋ฆฐ ์ฝ”๋“œ : ์• ์ž์ผ ์†Œํ”„ํŠธ์›จ์–ด ์žฅ์ธ ์ •์‹ 
Author: Robert C. Martin

ํ›„์†์ฑ… PPP Principles, Patterns, Practices


1. ๊นจ๋—ํ•œ ์ฝ”๋“œ

๊นจ๋—ํ•œ ์ฝ”๋“œ๋ž€

  • ์ค‘๋ณต์ด ์—†๋‹ค
  • ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค
  • ๋…ผ๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ , ์›์น™์—†๋Š” ์ตœ์ ํ™”๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค
  • ํ…Œ์ŠคํŠธ (Unit Test, Indext Test)๊ฐ€ ์žˆ๋‹ค
  • ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ, ํ•จ์†Œ ๋“ฑ์„ ์ตœ๋Œ€ํ•œ ์ค„์ธ๋‹ค. ์ž‘๊ฒŒ ์ถ”์ƒํ™” ํ•œ๋‹ค(?)
  • Leblanc์˜ ๋ฒ•์น™ -> ์ ˆ๋Œ€ ๋‚ด๊ฐ€ ๋Œ์•„๊ฐ€์„œ ์ตœ์ ํ™”๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ž‘์„ฑํ•  ๋•Œ๋ถ€ํ„ฐ ์ข‹์€ ์ฝ”๋“œ๋กœ ๋งŒ๋“ ๋‹ค.

 

[์ฐธ๊ณ ] OOP 5๋Œ€ ์›๋ฆฌ

SRP,  Single Responsible Principle ๋‹จ์ผ์ฑ…์ž„์›์น™

  • A class should have only one reason to change. # ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜, ์˜ค์ง ํ•˜๋‚˜์˜ ์•กํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฑ…์ž„์ ธ์•ผ ํ•œ๋‹ค

OCP, Open Closed Principle ๊ฐœ๋ฐฉํ์‡„๋ฒ•์น™ https://nesoy.github.io/articles/2018-01/OCP

  • ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฌด์—‡์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์ธ์ง€. ๋ฌด์—‡์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ธ์ง€ ๊ตฌ๋ณ„ํ•˜์ž.

LSP, Liskov Substitution Principle ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ๋ฒ•์น™ https://nesoy.github.io/articles/2018-03/LSP

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

ISP, Interface Segregation Principle ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ๋ฒ•์น™

  • ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์ž๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค

DIP, Dependency Inversion Principle ์˜์กด์„ฑ ์—ญ์ „ ๋ฒ•์น™  

  • ๊ณ ์ˆ˜์ค€ ์ •์ฑ…์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ €์ˆ˜์ค€ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์— ์ ˆ๋Œ€๋กœ ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋Œ€์‹  ์„ธ๋ถ€์‚ฌํ•ญ์ด ์ •์ฑ…์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

 

2. ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„

  1. (๋ญ˜ ํ•˜๋Š” ๋ณ€์ˆ˜์ธ์ง€) ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€๋ผ
    1. ์กด์žฌ ์ด์œ ? ์ˆ˜ํ–‰ ๊ธฐ๋Šฅ? ์‚ฌ์šฉ ๋ฐฉ๋ฒ•?
    2. If๋ฌธ์˜ ํ”Œ๋ž˜๊ทธ์— ์กฐ๊ฑด์œผ๋กœ Boolean ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด๋„ ๋œ๋‹ค = ์ธ์ž๋กœ boolean๊ฐ’์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ.
  2. ์˜คํ•ด๋ฅผ ์ผ์œผํ‚ค๋Š” ํ‘œํ˜„์„ ์ด๋ฆ„์œผ๋กœ ์“ฐ์ง€ ๋งˆ๋ผ
    1. ์›๋ž˜ ์žˆ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„, O๋‚˜ l ๋“ฑ..
  3. ์˜๋ฏธ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ผ
    1. source, destination ์ฒ˜๋Ÿผ
  4. ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์–ด๋ฅผ ์จ๋ผ (์—†๋Š” ๋‹จ์–ด๋ฅผ ์ง€์–ด๋‚ด์ง€ ๋งˆ๋ผ)
  5. ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์จ๋ผ -> ์ด๋ฆ„์˜ ๊ธธ์ด๋Š” ์ ์šฉ ๋ฒ”์œ„ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด์•ผ ํ•œ๋‹ค
    1. i,j ๋“ฑ์€ ์ž‘์€ ๋ฉ”์†Œ๋“œ์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ๋งŒ ์ ๋‹นํ•จ
    2. ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ํ•ด์„œ ์‚ฌ์šฉ MAX_INT ๊ฐ™์€.
  6. ์ธ์ฝ”๋”ฉ์„ ์ตœ์†Œํ™” ํ•˜๊ณ (ํ”ผํ•œ๋‹ค)
  7. ํด๋ž˜์Šค ์ด๋ฆ„, ๊ฐ์ฒด ์ด๋ฆ„: ๋ช…์‚ฌ๋‚˜ ๋ช…์‚ฌ๊ตฌ. ๋™์‚ฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    1. Customer, WikiPage, Account, AddressParser
    2. ํ”ผํ• ๊ฒƒ : Manager, Processor, Data, Info ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹จ์–ด
  8. ๋ฉ”์„œ๋“œ ์ด๋ฆ„: ๋™์‚ฌ, ๋™์‚ฌ๊ตฌ
    1. postPayment, deletePage, save ๋“ฑ
    2. get, set, is ๋“ฑ๋„ ์ข‹์Œ (Java)
  9. ์ถ”์ƒ์ ์ธ ๊ฐœ๋… ํ•˜๋‚˜์— ๋‹จ์–ด ํ•˜๋‚˜ ์‚ฌ์šฉ
    1. Fetch, retrieve, get ์ค‘ ํ•˜๋‚˜ / controller, manager, driver ์ค‘ ํ•˜๋‚˜
    2. Add์™€ ๊ฐœ๋…์ด ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋Š” insert ๋˜๋Š” append๊ฐ€ ์ ๋‹น

์ด๋ฆ„ ์ง“๋Š” ์š”๋ น

  1. ํ•ด๋ฒ• ์˜์—ญ ์ด๋ฆ„ : queue, visitor ๋“ฑ
  2. ํ•ด๋ฒ• ์˜์—ญ ์ ๋‹นํ•œ ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๋ฌธ์ œ์—์„œ ๋‚˜์˜จ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค
  3. ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•œ๋‹ค (๋˜๋Š” ์ ‘๋‘์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. firstName -> addFirstName)

 

3. ํ•จ์ˆ˜

ํ•จ์ˆ˜: ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋‹จ์œ„

ํ•จ์ˆ˜๋ฅผ ์งœ๋Š” ์ˆœ์„œ - ์›๋ž˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ํƒ! ์งœ๋‚ด์ง€ ๋ชปํ•œ๋‹ค.

  1. ์ผ๋‹จ ๋งŒ๋“ ๋‹ค (์ดˆ์•ˆ)
  2. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค
  3. ์ฝ”๋“œ๋ฅผ ๋‹ค๋“ฌ๊ณ , ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ , ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.
  4. ๋ฉ”์†Œ๋“œ ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์ˆœ์„œ๋ฅผ ์ค„์ธ๋‹ค. ๊ณ„์† ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ทœ์น™

  1. ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ
    1. if, else ๋“ฑ์˜ ๋ฌธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋‚ด์šฉ์€ ํ•œ ์ค„์ด์–ด์•ผ ํ•œ๋‹ค (ํ— ์ถฉ๊ฒฉ;;)
  1. ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ
    1. ABC -> doA(), doB(), doC()  ๊ทธ ์•ˆ์—์„œ ๋˜ doBasicA() doAnotherA()์‹..
    1. "ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ํ•œ ๊ฐ€์ง€๋ฅผ ์ž˜ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ํ•œ ๊ฐ€์ง€๋งŒ์„ ํ•ด์•ผ ํ•œ๋‹ค."
    2. ํ•œ๊ฐ€์ง€๋ž€? ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•˜๋‚˜์ธ ๋‹จ๊ณ„๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•˜๋Š” ๊ฒƒ. ์—ฌ๋Ÿฌ ์„น์…˜์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์–ด๋ ต๋‹ค
  2. ํ•จ์ˆ˜๋‚ด ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์€ ๋ชจ๋‘ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค!
    1. ์˜ˆ: getHtml()์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋†’๊ณ  .append("\n")์€ ๋‚ฎ์€ ๊ฒƒ
    1. ์ฝ”๋“œ์˜ ๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™: ํ•œ ํ•จ์ˆ˜ ๋‹ค์Œ์—๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์€ ํ•จ์ˆ˜๊ฐ€ ์˜จ๋‹ค.
  3. ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์“ธ ๊ฒƒ (๋™์‚ฌ + ๋ช…์‚ฌ ์ฒ˜๋Ÿผ) ์ง์ž‘๊ฐ€๋Š” ์ด๋ฆ„๋“ค์„ ์ผ๊ด€๋˜๊ฒŒ ์ง€์–ด๋ผ
  1. ์ธ์ˆ˜ - ์ธ์ˆ˜ ๊ฐฏ์ˆ˜๋Š” ์ ์„ ์ˆ˜๋ก ์ข‹๋‹ค! (0์ด ์ตœ๊ณ !) 3๊ฐœ ์ด์ƒ์€ ๊ฐ€๋Šฅํ•œ ํ”ผํ•œ๋‹ค.
    1. ํ•จ์ˆ˜์— ์งˆ๋ฌธ์„ ๋˜์ง„๋‹ค. fileExists("My File")
    2. ์ธ์ˆ˜๋ฅผ ๋ญ”๊ฐ€๋กœ ๋ณ€ํ™˜ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค fileOpen("MyFile")
    3. ์ด๋ฒคํŠธ ๊ฐฏ์ˆ˜(????) passwordAttemptsFailedNtimes(int attempts)
    1. ์œ ์ผํ•˜๊ฒŒ 1๊ฐœ ์ •๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ ์…‹. ์ธ์ˆ˜๊ฐ€ ์„ธ๊ฐœ ์ •๋„ ๋˜๋ฉด ์ธ์ˆ˜๋ฅผ ํด๋ž˜์Šค ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ฃผ๋Š” ๊ฒƒ์ด ๋‚ซ์ง€ ์•Š์€์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค (์˜ˆ: int x, int y -> Point center)
    2. ์ ˆ๋Œ€๋กœ ์ธ์ˆ˜์— bool ๊ฐ’์„ ๋„˜๊ธฐ์ง€ ๋งˆ๋ผ ใ… ใ… 
    3. ๋‹จ์ผํ•ญ: ๋™์‚ฌ/๋ช…์‚ฌ write(name) writeField(name)
      ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ๋„ฃ๋Š”๋‹ค assertExpectedEqualsActual(expected, actual)
  2. ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋Š”ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค
    1. appendFooter(report) ๋ณด๋‹ค report.appendFooter()์ด ๋‚ซ๋‹ค๋Š” ๊ฒƒ.
  1. ํ•จ์ˆ˜๋Š” ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๋ฐ˜ํ™˜์„ ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋‹ค! (๋‘˜๋‹ค ํ•˜๋ฉด ์•ˆ๋จ)
  2. ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” try catch ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋‚ซ๋‹ค
  1. Try catch ์•ˆ์—๋Š” ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ณ„๋„ ๋ธ”๋ก์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค

 

4. ์ฃผ์„

  • ์ฃผ์„์€ ์—†์„ ์ˆ˜๋ก ์ข‹๋‹ค. ์ฃผ์„์ด ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์ƒ๊ฐํ•œ๋‹ค -> ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

์ข‹์€ ์ฃผ์„

  1. ๋ฒ•์ ์ธ ์ฃผ์„ Copyright, ๋ผ์ด์„ ์Šค ๋“ฑ
  2. ์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„ (์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€)
  3. ๊ฒฝ๊ณ  ์ฃผ์„ (์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค...๋“ฑ)
  4. TODO ์ฃผ์„
  5. ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๋Š” ์ฃผ์„

๋‚˜์œ ์ฃผ์„

  1. ๊ฐ™์€ ์ด์•ผ๊ธฐ๋ฅผ ์ค‘๋ณตํ•˜๋Š” ์ฃผ์„
  2. ๋‹ซ๋Š” ๊ด„ํ˜ธ์— ๋‹ค๋Š” ์ฃผ์„
  3. ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ -> ์ฐจ๋ผ๋ฆฌ ์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ์†์— ์ตํ˜€๋ผ ใ…œใ…œ

 

5. ํ˜•์‹ ๋งž์ถ”๊ธฐ

      • ํŒ€์›๋ผ๋ฆฌ๋Š” ์ฝ”๋“œ ํ˜•์‹์„ ๋งž์ถ˜๋‹ค
      • ๊ฐœ๋…์€ ๋นˆ ํ–‰์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค
      • ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…์€ ์„ธ๋กœ๋กœ ๊ฐ€๊นŒ์ด ๋‘ฌ์•ผ ํ•œ๋‹ค (๋˜๋„๋ก ํ•œ ํŒŒ์ผ์— ๋‘”๋‹ค)
        • ์—ฐ๊ด€์„ฑ = ํ•œ ๊ฐœ๋…์„ ์ดํ•ด๋‚˜๋Š”๋ฐ ๋‹ค๋ฅธ ๊ฐœ๋…์ด ์ค‘์š”ํ•œ ์ •๋„
      • Dependency(์ข…์†ํ•จ์ˆ˜, ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜) ๊ฐ€๊นŒ์ด ๋‘๊ณ , ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ์•„๋ž˜์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‘”๋‹ค
        • ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๊ณ ์ฐจ์›์—์„œ ์ €์ฐจ์›์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฝํžŒ๋‹ค
        • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์„ ๋งจ ์œ„์—, ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ๋‹ค. ์„ธ์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์— ๋‘”๋‹ค.

 

6. ๊ฐ์ฒด์™€ ์ž๋ฃŒ๊ตฌ์กฐ

      • ํด๋ž˜์Šค: ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„์„ ๋ชจ๋ฅธ ์ฑ„ ์ž๋ฃŒ์˜ ํ•ต์‹ฌ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ํด๋ž˜์Šค๋‹ค
      • ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ(์ž๋ฃŒ๊ตฌ์กฐ) vs. ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ
        • ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ˆ์ฐจ์  ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค.
        • = ์ ˆ์ž์ฒ™ ์ฝ”๋“œ๋Š” ์ƒˆ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”๊ฐ€๊ฐ€ ์–ด๋ ต๊ณ (๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๊ณ ์ณ์•ผ ํ•˜๊ณ ), ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋Š” ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค(๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค).  ใ…กใ…ก?
        • = ์ƒˆ๋กœ์šด ์ž๋ฃŒํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ, ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๋ฉด ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • ๋””๋ฏธํ„ฐ ๋ฒ•์น™ : ๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค๋Š” ๋ฒ•์น™ (๊ฐ์ฒด๋Š” ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ•จ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•œ๋‹ค = ๊ฐ์ฒด๋Š” ๋™์ž‘์„ ๊ณต๊ฐœํ•˜๊ณ  ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธด๋‹ค. )
        • ๊ฐ์ฒด๋Š” "๋ฌด์—‡์„ ํ•œ๋‹ค"๋ฅผ ํ‘œ๊ธฐํ•ด์•ผํ•˜๋ฉฐ, ์†๋‚ด๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋ฉด ์•ˆ๋œ๋‹ค.
          ์˜ˆ์‹œ: obj.createScratchFileStream

 

7. ์˜ค๋ฅ˜์ฒ˜๋ฆฌ

  • TDD + ์˜ˆ์™ธ์ฒ˜๋ฆฌ(try except)๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค
  • ํ™•์ธ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜(Unchecked error)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค - ?
  • ์˜ˆ์™ธ์— ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค (์•ž ๋’ค context) - ์‹คํŒจ ์—ฐ์‚ฐ ์ด๋ฆ„, ์‹คํŒจ ์œ ํ˜•. ํ•„์š”ํ•˜๋‹ค๋ฉด ๋กœ๊น…๋„.
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ์šฉ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๊ฐ์‹ธ๊ธฐ ๊ธฐ๋ฒ• (์™ธ๋ถ€ API๋ฅผ ํ™œ์šฉํ• ๋•Œ ์œ ์šฉํ•˜๋‹ค). ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค!
    : error
    ๋ฅผ ๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ local ํด๋ž˜์Šค ๊ฐ์ฒด ํ•˜๋‚˜๋กœ ๊ฐ์‹ธ์„œ, ๋‚ด๋ถ€์—์„œ ํ•œ๋ฒˆ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , ๋‚จ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์œ ํ˜•๋“ค๋งŒ ๋ฐ–์—์„œ ํ•ด์ฃผ๋Š” ์‹ -> ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ ํ˜•๋ณ„๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค!

8. Boundaries ์™ธ๋ถ€์ฝ”๋“œ ํ†ตํ•ฉํ• ๋•Œ

์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉ์‹œํ‚ฌ๋•Œ ๊ฒฝ๊ณ„๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ๊ธฐ๊ต๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” Chapter

 

  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ค„์ด๊ณ , ์™ธ๋ถ€ ์ฝ”๋“œ์— dependency๋ฅผ ๋‚ฎ์ถ˜๋‹ค. ๋ฐฉ๋ฒ•์€ ์บก์Šํ™”, ๋˜๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ๊ฐ์‹ธ๊ธฐ๋‹ค.
    • ์ƒˆํด๋ž˜์Šค: ์™ธ๋ถ€ API์˜ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์™ธ๋ถ€๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค (์ฒ˜์Œ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค ์•ˆ์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค)
    • ADAPTER ํŒจํ„ด* - ?? ์บก์Šํ™” ๋ฐฉ๋ฒ• - ์„ค๊ณ„ ํŒจํ„ด ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜.
  • ์™ธ๋ถ€ ํŒจํ‚ค์ง€ ์ฝ”๋“œ๋Š” ํ•™์Šตํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ณ  (Learning Tests) ์ตํžŒ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ๋„๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ.
    • ์ถ”๊ฐ€ ๋ฒ„์ „์ด ๋‚˜์™”์„๋•Œ๋„ ๋‚˜์˜ ์ฝ”๋“œ์™€ ํ•ฉ์น˜๊ธฐ ์ „์— ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์•„์ง ๋ถ™์ด์ง€ ์•Š์€ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๋•Œ๋Š” fake ํด๋ž˜์Šค๋‚˜ ๊ตฌํ˜„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค

 

*ADAPTER ํŒจํ„ด - https://jusungpark.tistory.com/22

 

 

 

9. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ Unit Tests

TDD ๋ฒ•์น™ ์„ธ ๊ฐ€์ง€

  1. ์‹คํŒจํ•˜๋Š” ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ• ๋•Œ๊นŒ์ง€ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค
  2. ์ปดํŒŒ์ผ์€ ์ž˜๋˜์ง€๋งŒ ์‹คํ–‰์ด ์‹คํŒจํ•˜๋Š” ์ •๋„๋กœ๋งŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค

ํ˜„์žฌ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ •๋„๋กœ๋งŒ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค

 

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—๋Š” ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค. ๊ฐ€๋…์„ฑ. ๊ฐ€๋…์„ฑ. ๊ฐ€๋…์„ฑ.
  • ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ
    • BUILD-OPERATE-CHECK