oh-my-oop 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/MCP_STRUCTURE.md +301 -0
  2. package/README.md +167 -0
  3. package/SCOPE.md +27 -0
  4. package/dist/application/discovery.d.ts +133 -0
  5. package/dist/application/discovery.js +62 -0
  6. package/dist/application/discovery.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +80 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +16 -0
  11. package/dist/config.js +32 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/domain/collaborators.d.ts +2 -0
  14. package/dist/domain/collaborators.js +26 -0
  15. package/dist/domain/collaborators.js.map +1 -0
  16. package/dist/domain/ids.d.ts +4 -0
  17. package/dist/domain/ids.js +23 -0
  18. package/dist/domain/ids.js.map +1 -0
  19. package/dist/domain/model.d.ts +71 -0
  20. package/dist/domain/model.js +2 -0
  21. package/dist/domain/model.js.map +1 -0
  22. package/dist/domain/schemas.d.ts +213 -0
  23. package/dist/domain/schemas.js +79 -0
  24. package/dist/domain/schemas.js.map +1 -0
  25. package/dist/domain/stereotypes.d.ts +7 -0
  26. package/dist/domain/stereotypes.js +65 -0
  27. package/dist/domain/stereotypes.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +21 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/io/classStore.d.ts +9 -0
  32. package/dist/io/classStore.js +39 -0
  33. package/dist/io/classStore.js.map +1 -0
  34. package/dist/io/collaborationStore.d.ts +7 -0
  35. package/dist/io/collaborationStore.js +32 -0
  36. package/dist/io/collaborationStore.js.map +1 -0
  37. package/dist/io/design.d.ts +3 -0
  38. package/dist/io/design.js +22 -0
  39. package/dist/io/design.js.map +1 -0
  40. package/dist/io/designIndex.d.ts +6 -0
  41. package/dist/io/designIndex.js +49 -0
  42. package/dist/io/designIndex.js.map +1 -0
  43. package/dist/io/frontmatter.d.ts +8 -0
  44. package/dist/io/frontmatter.js +31 -0
  45. package/dist/io/frontmatter.js.map +1 -0
  46. package/dist/io/history.d.ts +10 -0
  47. package/dist/io/history.js +38 -0
  48. package/dist/io/history.js.map +1 -0
  49. package/dist/io/useCaseStore.d.ts +8 -0
  50. package/dist/io/useCaseStore.js +36 -0
  51. package/dist/io/useCaseStore.js.map +1 -0
  52. package/dist/io/workspace.d.ts +14 -0
  53. package/dist/io/workspace.js +82 -0
  54. package/dist/io/workspace.js.map +1 -0
  55. package/dist/oop/commands.d.ts +446 -0
  56. package/dist/oop/commands.js +319 -0
  57. package/dist/oop/commands.js.map +1 -0
  58. package/dist/oop/conformance.d.ts +16 -0
  59. package/dist/oop/conformance.js +30 -0
  60. package/dist/oop/conformance.js.map +1 -0
  61. package/dist/prompts/discovery.d.ts +2 -0
  62. package/dist/prompts/discovery.js +41 -0
  63. package/dist/prompts/discovery.js.map +1 -0
  64. package/dist/prompts/imagineWithoutController.d.ts +2 -0
  65. package/dist/prompts/imagineWithoutController.js +75 -0
  66. package/dist/prompts/imagineWithoutController.js.map +1 -0
  67. package/dist/prompts/index.d.ts +2 -0
  68. package/dist/prompts/index.js +17 -0
  69. package/dist/prompts/index.js.map +1 -0
  70. package/dist/prompts/phasePressureTest.d.ts +2 -0
  71. package/dist/prompts/phasePressureTest.js +69 -0
  72. package/dist/prompts/phasePressureTest.js.map +1 -0
  73. package/dist/prompts/rddIntro.d.ts +2 -0
  74. package/dist/prompts/rddIntro.js +53 -0
  75. package/dist/prompts/rddIntro.js.map +1 -0
  76. package/dist/prompts/review.d.ts +2 -0
  77. package/dist/prompts/review.js +45 -0
  78. package/dist/prompts/review.js.map +1 -0
  79. package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
  80. package/dist/prompts/stateMachineIntrospect.js +80 -0
  81. package/dist/prompts/stateMachineIntrospect.js.map +1 -0
  82. package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
  83. package/dist/prompts/tellDontAskRephrase.js +66 -0
  84. package/dist/prompts/tellDontAskRephrase.js.map +1 -0
  85. package/dist/render/diff.d.ts +21 -0
  86. package/dist/render/diff.js +84 -0
  87. package/dist/render/diff.js.map +1 -0
  88. package/dist/render/mermaid.d.ts +24 -0
  89. package/dist/render/mermaid.js +53 -0
  90. package/dist/render/mermaid.js.map +1 -0
  91. package/dist/render/sideBySide.d.ts +14 -0
  92. package/dist/render/sideBySide.js +91 -0
  93. package/dist/render/sideBySide.js.map +1 -0
  94. package/dist/resources/index.d.ts +2 -0
  95. package/dist/resources/index.js +349 -0
  96. package/dist/resources/index.js.map +1 -0
  97. package/dist/server.d.ts +2 -0
  98. package/dist/server.js +22 -0
  99. package/dist/server.js.map +1 -0
  100. package/dist/tools/alternatives.d.ts +2 -0
  101. package/dist/tools/alternatives.js +9 -0
  102. package/dist/tools/alternatives.js.map +1 -0
  103. package/dist/tools/classes.d.ts +2 -0
  104. package/dist/tools/classes.js +13 -0
  105. package/dist/tools/classes.js.map +1 -0
  106. package/dist/tools/collaborations.d.ts +2 -0
  107. package/dist/tools/collaborations.js +8 -0
  108. package/dist/tools/collaborations.js.map +1 -0
  109. package/dist/tools/compare.d.ts +2 -0
  110. package/dist/tools/compare.js +9 -0
  111. package/dist/tools/compare.js.map +1 -0
  112. package/dist/tools/conformance.d.ts +3 -0
  113. package/dist/tools/conformance.js +11 -0
  114. package/dist/tools/conformance.js.map +1 -0
  115. package/dist/tools/diagram.d.ts +2 -0
  116. package/dist/tools/diagram.js +9 -0
  117. package/dist/tools/diagram.js.map +1 -0
  118. package/dist/tools/discovery.d.ts +2 -0
  119. package/dist/tools/discovery.js +23 -0
  120. package/dist/tools/discovery.js.map +1 -0
  121. package/dist/tools/index.d.ts +2 -0
  122. package/dist/tools/index.js +27 -0
  123. package/dist/tools/index.js.map +1 -0
  124. package/dist/tools/init.d.ts +2 -0
  125. package/dist/tools/init.js +9 -0
  126. package/dist/tools/init.js.map +1 -0
  127. package/dist/tools/oop.d.ts +9 -0
  128. package/dist/tools/oop.js +26 -0
  129. package/dist/tools/oop.js.map +1 -0
  130. package/dist/tools/responsibilities.d.ts +2 -0
  131. package/dist/tools/responsibilities.js +13 -0
  132. package/dist/tools/responsibilities.js.map +1 -0
  133. package/dist/tools/state.d.ts +2 -0
  134. package/dist/tools/state.js +8 -0
  135. package/dist/tools/state.js.map +1 -0
  136. package/dist/tools/useCases.d.ts +2 -0
  137. package/dist/tools/useCases.js +18 -0
  138. package/dist/tools/useCases.js.map +1 -0
  139. package/dist/tools/validate.d.ts +2 -0
  140. package/dist/tools/validate.js +9 -0
  141. package/dist/tools/validate.js.map +1 -0
  142. package/dist/tradeoff/engine.d.ts +61 -0
  143. package/dist/tradeoff/engine.js +171 -0
  144. package/dist/tradeoff/engine.js.map +1 -0
  145. package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
  146. package/dist/tradeoff/heuristics/classSplit.js +94 -0
  147. package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
  148. package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
  149. package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
  150. package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
  151. package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
  152. package/dist/tradeoff/heuristics/collectionShape.js +113 -0
  153. package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
  154. package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
  155. package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
  156. package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
  157. package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
  158. package/dist/tradeoff/heuristics/errorHandling.js +110 -0
  159. package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
  160. package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
  161. package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
  162. package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
  163. package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
  164. package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
  165. package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
  166. package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
  167. package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
  168. package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
  169. package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
  170. package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
  171. package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
  172. package/dist/tradeoff/templates.d.ts +2 -0
  173. package/dist/tradeoff/templates.js +33 -0
  174. package/dist/tradeoff/templates.js.map +1 -0
  175. package/dist/util/log.d.ts +1 -0
  176. package/dist/util/log.js +7 -0
  177. package/dist/util/log.js.map +1 -0
  178. package/dist/util/mcp.d.ts +4 -0
  179. package/dist/util/mcp.js +18 -0
  180. package/dist/util/mcp.js.map +1 -0
  181. package/dist/validate/cohesion.d.ts +3 -0
  182. package/dist/validate/cohesion.js +88 -0
  183. package/dist/validate/cohesion.js.map +1 -0
  184. package/dist/validate/collectionWrapper.d.ts +3 -0
  185. package/dist/validate/collectionWrapper.js +131 -0
  186. package/dist/validate/collectionWrapper.js.map +1 -0
  187. package/dist/validate/coupling.d.ts +3 -0
  188. package/dist/validate/coupling.js +47 -0
  189. package/dist/validate/coupling.js.map +1 -0
  190. package/dist/validate/cycle.d.ts +3 -0
  191. package/dist/validate/cycle.js +101 -0
  192. package/dist/validate/cycle.js.map +1 -0
  193. package/dist/validate/dataDuplication.d.ts +3 -0
  194. package/dist/validate/dataDuplication.js +150 -0
  195. package/dist/validate/dataDuplication.js.map +1 -0
  196. package/dist/validate/dependencyDirection.d.ts +3 -0
  197. package/dist/validate/dependencyDirection.js +106 -0
  198. package/dist/validate/dependencyDirection.js.map +1 -0
  199. package/dist/validate/dualUseKnowing.d.ts +3 -0
  200. package/dist/validate/dualUseKnowing.js +137 -0
  201. package/dist/validate/dualUseKnowing.js.map +1 -0
  202. package/dist/validate/emptyObjectFill.d.ts +3 -0
  203. package/dist/validate/emptyObjectFill.js +119 -0
  204. package/dist/validate/emptyObjectFill.js.map +1 -0
  205. package/dist/validate/findings.d.ts +22 -0
  206. package/dist/validate/findings.js +12 -0
  207. package/dist/validate/findings.js.map +1 -0
  208. package/dist/validate/functionDecompositionExcess.d.ts +3 -0
  209. package/dist/validate/functionDecompositionExcess.js +120 -0
  210. package/dist/validate/functionDecompositionExcess.js.map +1 -0
  211. package/dist/validate/functionNotObject.d.ts +3 -0
  212. package/dist/validate/functionNotObject.js +80 -0
  213. package/dist/validate/functionNotObject.js.map +1 -0
  214. package/dist/validate/godObject.d.ts +6 -0
  215. package/dist/validate/godObject.js +76 -0
  216. package/dist/validate/godObject.js.map +1 -0
  217. package/dist/validate/presentationInDomain.d.ts +3 -0
  218. package/dist/validate/presentationInDomain.js +57 -0
  219. package/dist/validate/presentationInDomain.js.map +1 -0
  220. package/dist/validate/primitiveWrapper.d.ts +3 -0
  221. package/dist/validate/primitiveWrapper.js +106 -0
  222. package/dist/validate/primitiveWrapper.js.map +1 -0
  223. package/dist/validate/rules.d.ts +24 -0
  224. package/dist/validate/rules.js +269 -0
  225. package/dist/validate/rules.js.map +1 -0
  226. package/dist/validate/singletonStatefulHolder.d.ts +3 -0
  227. package/dist/validate/singletonStatefulHolder.js +128 -0
  228. package/dist/validate/singletonStatefulHolder.js.map +1 -0
  229. package/dist/validate/strategyAsymmetry.d.ts +3 -0
  230. package/dist/validate/strategyAsymmetry.js +131 -0
  231. package/dist/validate/strategyAsymmetry.js.map +1 -0
  232. package/dist/validate/testability.d.ts +5 -0
  233. package/dist/validate/testability.js +157 -0
  234. package/dist/validate/testability.js.map +1 -0
  235. package/dist/validate/vagueName.d.ts +3 -0
  236. package/dist/validate/vagueName.js +136 -0
  237. package/dist/validate/vagueName.js.map +1 -0
  238. package/dist/validate/validationLocation.d.ts +3 -0
  239. package/dist/validate/validationLocation.js +120 -0
  240. package/dist/validate/validationLocation.js.map +1 -0
  241. package/lessons/STYLE_GUIDE.md +304 -0
  242. package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
  243. package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
  244. package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
  245. package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
  246. package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
  247. package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
  248. package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
  249. package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
  250. package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
  251. package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
  252. package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
  253. package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
  254. package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
  255. package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
  256. package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
  257. package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
  258. package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  259. package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
  260. package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
  261. package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
  262. package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  263. package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
  264. package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
  265. package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  266. package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
  267. package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
  268. package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  269. package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  270. package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
  271. package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
  272. package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
  273. package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
  274. package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
  275. package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
  276. package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
  277. package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
  278. package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
  279. package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
  280. package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
  281. package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
  282. package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
  283. package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
  284. package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
  285. package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
  286. package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
  287. package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
  288. package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
  289. package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
  290. package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
  291. package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
  292. package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
  293. package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
  294. package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
  295. package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
  296. package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
  297. package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
  298. package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
  299. package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
  300. package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
  301. package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  302. package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
  303. package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
  304. package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
  305. package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
  306. package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
  307. package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
  308. package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
  309. package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
  310. package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
  311. package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
  312. package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
  313. package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
  314. package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
  315. package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
  316. package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
  317. package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
  318. package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
  319. package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
  320. package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
  321. package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
  322. package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
  323. package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
  324. package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
  325. package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
  326. package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
  327. package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
  328. package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
  329. package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
  330. package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
  331. package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
  332. package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
  333. package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
  334. package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
  335. package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
  336. package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
  337. package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
  338. package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
  339. package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
  340. package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
  341. package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
  342. package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
  343. package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
  344. package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
  345. package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
  346. package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  347. package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
  348. package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
  349. package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
  350. package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
  351. package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
  352. package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
  353. package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
  354. package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  355. package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
  356. package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  357. package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
  358. package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
  359. package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
  360. package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
  361. package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
  362. package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
  363. package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
  364. package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
  365. package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
  366. package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
  367. package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
  368. package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
  369. package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
  370. package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
  371. package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
  372. package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
  373. package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
  374. package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
  375. package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
  376. package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
  377. package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
  378. package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  379. package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
  380. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
  381. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  382. package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  383. package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
  384. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  385. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
  386. package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
  387. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  388. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
  389. package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  390. package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
  391. package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
  392. package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
  393. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  394. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  395. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  396. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
  397. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
  398. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  399. package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
  400. package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
  401. package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  402. package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  403. package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
  404. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  405. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
  406. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
  407. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
  408. package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
  409. package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  410. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  411. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  412. package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  413. package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
  414. package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  415. package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  416. package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  417. package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  418. package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
  419. package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
  420. package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  421. package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
  422. package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  423. package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  424. package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  425. package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
  426. package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  427. package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  428. package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  429. package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
  430. package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
  431. package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
  432. package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  433. package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  434. package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  435. package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  436. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  437. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
  438. package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  439. package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  440. package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
  441. package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  442. package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  443. package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
  444. package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  445. package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
  446. package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  447. package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  448. package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  449. package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  450. package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  451. package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  452. package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
  453. package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
  454. package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
  455. package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  456. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  457. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
  458. package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  459. package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  460. package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
  461. package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  462. package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  463. package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  464. package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  465. package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  466. package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  467. package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
  468. package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
  469. package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
  470. package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
  471. package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  472. package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  473. package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  474. package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  475. package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
  476. package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
  477. package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  478. package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  479. package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
  480. package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
  481. package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  482. package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  483. package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  484. package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
  485. package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
  486. package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  487. package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  488. package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
  489. package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  490. package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
  491. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  492. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
  493. package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  494. package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  495. package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  496. package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  497. package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  498. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  499. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  500. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  501. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  502. package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  503. package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
  504. package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  505. package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
  506. package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
  507. package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  508. package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
  509. package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
  510. package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
  511. package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  512. package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  513. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  514. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  515. package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  516. package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
  517. package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  518. package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
  519. package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
  520. package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
  521. package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  522. package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
  523. package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  524. package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  525. package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  526. package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  527. package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  528. package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
  529. package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  530. package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  531. package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  532. package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  533. package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
  534. package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  535. package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  536. package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  537. package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
  538. package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  539. package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  540. package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  541. package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  542. package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
  543. package/lessons/woowacourse-racingcar/README.md +69 -0
  544. package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  545. package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  546. package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
  547. package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
  548. package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  549. package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  550. package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  551. package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  552. package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  553. package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
  554. package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  555. package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  556. package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  557. package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  558. package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  559. package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
  560. package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  561. package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  562. package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  563. package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  564. package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
  565. package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  566. package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  567. package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  568. package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  569. package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  570. package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  571. package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  572. package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  573. package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  574. package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  575. package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  576. package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  577. package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  578. package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  579. package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  580. package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  581. package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
  582. package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  583. package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
  584. package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  585. package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  586. package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  587. package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  588. package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  589. package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  590. package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
  591. package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  592. package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  593. package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  594. package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  595. package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  596. package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  597. package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  598. package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
  599. package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
  600. package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  601. package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
  602. package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  603. package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
  604. package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
  605. package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  606. package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  607. package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  608. package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  609. package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  610. package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
  611. package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  612. package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  613. package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  614. package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  615. package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
  616. package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  617. package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
  618. package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  619. package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  620. package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  621. package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  622. package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  623. package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  624. package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  625. package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  626. package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  627. package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  628. package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  629. package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  630. package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  631. package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  632. package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  633. package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  634. package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  635. package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  636. package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
  637. package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  638. package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  639. package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
  640. package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  641. package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  642. package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
  643. package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  644. package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  645. package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  646. package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  647. package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  648. package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  649. package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
  650. package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  651. package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  652. package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  653. package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  654. package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  655. package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  656. package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  657. package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  658. package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  659. package/package.json +46 -0
  660. package/skills/oh-my-oop/SKILL.md +39 -0
@@ -0,0 +1,55 @@
1
+ # PR #57 — [자동차 경주 - 리팩토링] 에밀리 미션 제출합니다
2
+
3
+ - **Reviewee:** [@EmilyCh0](https://github.com/EmilyCh0)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/57
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 13
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Referee` 도메인 분리** — 우승자 판단 책임 분리.
12
+ - **while 재입력을 재귀로 변경** — 가독성 개선.
13
+ - **테스트 시 Car를 생성자 + moveCount 직접 주입** — `tryMove()` 우회.
14
+ - **상수 활용 + 기댓값 분리** — 1단계 피드백 흡수.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Referee`가 상태 없음에도 class** — object 후보.
19
+ - **`Car.moveCount`가 외부 접근 가능** — private 누락.
20
+ - **테스트 함수명이 추상적** — "예외가 발생한다", "우승자를 판단한다" → 동작 예측 불가.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @laco-dev의 핵심 가르침:
25
+
26
+ 1. **테스트 메서드명은 구체적인 *시나리오*** — "예외가 발생한다" → "자동차 이름은 항상 5글자 미만의 길이를 가진다" / "자동차 이름은 비어있을 수 없다". 동작 예측 가능해야.
27
+
28
+ 2. **테스트 setup은 우회 없이** — Car의 현재 위치를 테스트하려고 tryMove()를 N번 호출하지 말 것. 생성자에 moveCount를 직접 받아 *상태를 설정*하는 게 깔끔.
29
+
30
+ 3. **상태 없는 클래스는 object** — Referee가 인스턴스 여러 개 필요 없으면 object.
31
+
32
+ 4. **외부에서 호출되지 않는 속성은 private**.
33
+
34
+ 5. **재귀 vs while** — 재입력 흐름에서 재귀가 가독성 좋음 (조건 검사 한 곳, return 자연스러움).
35
+
36
+ - **대표 인용:**
37
+ > 테스트 코드를 작성할 떄에는 예외가 발생하거나, 정상 동작한다 처럼 추상적인 의미를 가지기보다는, 보다 구체적이고 보는 사람이 이해가 쉽도록 작성 하면 더욱 좋습니다.
38
+ >
39
+ > — @laco-dev on `src/test/kotlin/domain/CarTest.kt`
40
+
41
+ > 비슷하게, 우승자를 판단한다는 내용이 어떻게 동작할 것이라는 예측으로 이어지지 않아요. 위 테스트에 대해서도 아래처럼 작성 해 볼 수 있겠죠? `우승자를 판단한다` --> `자동차들 중에 가장 먼 거리에 있는 자동차가 우승자다`
42
+ >
43
+ > — @laco-dev on `src/test/kotlin/domain/RefereeTest.kt`
44
+
45
+ > 테스트하기 위해 필요한 조건은 자동차의 "현재 위치"입니다. tryMove()를 사용하는 것이 아닌 자동차의 현재 위치를 변경하기 위한 다른 좋은 방법이 있지 않을까요?
46
+ >
47
+ > — @laco-dev on `src/test/kotlin/domain/RefereeTest.kt`
48
+
49
+ ## 얻은 교훈
50
+
51
+ - **테스트 함수명 = "이 시나리오의 *결과*가 무엇인가" 한 문장**. "예외가 발생한다"는 결과만 명시; 시나리오 ("5글자 초과") + 결과 ("예외")가 같이 들어와야.
52
+ - **테스트 setup이 우회 메서드 호출이면 = 도메인이 setup을 안 받는 신호.** Car 생성자에 moveCount를 받게 만들거나 별도 setter 두기. tryMove를 N번 호출해서 위치 만드는 건 테스트도 도메인 룰을 따르게 함 (랜덤 의존, 부정확).
53
+ - **상태 없는 클래스는 object.** 단, 한 줄이라도 상태가 끼면 class로. Referee가 게임 동안 우승자 history 같은 상태를 가지면 class.
54
+ - **재귀 vs while의 trade-off**. 재귀 = 조건 + return 자연스러움, 스택 깊이 위험은 입력 재시도 횟수에 비해 무시. while = 명시적 break 필요, depth 증가.
55
+ - **리뷰어가 같은 학생을 두 번 보면 ↑ 단계의 피드백을 줄 수 있다**. 1단계에서 "테스트 기댓값 하드코딩"이었다면 2단계는 "테스트 함수명도 구체적으로", 3단계는 "테스트 setup 우회 없이". 점진적 깊이.
@@ -0,0 +1,55 @@
1
+ # PR #137 — [자동차 경주 구현] 미플 미션 제출합니다
2
+
3
+ - **Reviewee:** [@HamBeomJoon](https://github.com/HamBeomJoon)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/137
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @krrong
7
+ - **라인 코멘트:** 40
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **require 사용으로 검증 표현 단순화** — 리뷰어가 명시적으로 칭찬.
12
+ - **`@ParameterizedTest` 활용** — 여러 케이스를 한 테스트로.
13
+ - **자기 의문을 PR description에 풍부하게 적시** — 검증 위치, 상수화 기준, MutableList vs List 등 메타 질문 적극.
14
+ - **리뷰 후 책임을 재배치하는 빠른 흡수** — `Cars` 클래스를 추가로 만들어 자동차 이동/우승자 검증을 옮김.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Car.position`이 외부에서 수정 가능** — 캡슐화 누락. private set 필요.
19
+ - **`util.Constants`로 상수 한 곳에 집중** — 1단계의 흔한 패턴. 모든 사용처가 한 파일에 결합.
20
+ - **`util.Validator`에 모든 검증 로직 집중** — 도메인이 자기 invariants를 안 들고, 외부 검증기에 의존.
21
+ - **`RacingController`가 `MutableList`를 반환** — 호출자가 컬렉션을 수정할 수 있는 표면적 노출.
22
+ - **`CarTest`가 사실은 `RacingController`를 테스트** — Car의 동작이 Controller 안에 있어서, Car 단독 테스트가 안 됨 (책임 분배의 신호).
23
+ - **테스트가 Car의 상수(`MOVE_THRESHOLD`)를 직접 참조** — 상수가 6으로 바뀌면 테스트는 통과하면서 의미가 깨짐.
24
+ - **input 검증과 도메인 검증이 한 Validator에 함께** — 두 가지 다른 종류의 invariants가 한 곳에.
25
+ - **예외 메시지가 사용자에게 도움이 안 됨** — "왜 무효인지"가 안 보임.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 리뷰어 @krrong는 일관되게 **"이 책임이 진짜 여기 있어야 하는가"** 를 묻는다. 특히 `CarTest`가 사실은 `RacingController`를 테스트한다는 지적은 강력 — 테스트 분포가 책임 분포의 거울임을 짚는다.
30
+
31
+ 또한 **검증의 자리는 검증 대상이 결정** 한다는 원칙: "입력값 검증은 입력 처리 곳에서, 도메인 검증은 도메인에서". 같은 코멘트로 검증의 종류와 자리를 한 번에 정리.
32
+
33
+ **테스트가 production 상수를 참조하는 안티패턴** 에 대해서도 강한 가이드: 상수가 바뀌면 테스트가 의미 없이 통과한다는 점. private 가시성을 두려면 테스트에서 상수에 의존하지 않는 다른 방법을 써야 함.
34
+
35
+ - **대표 인용:**
36
+ > `CarTest`이지만, 실제로는 `RacingController`를 테스트하고 있는 것처럼 보여요. 어떤 이유 때문일까요? 🤔
37
+ >
38
+ > — @krrong on `src/test/kotlin/CarTest.kt:7`
39
+
40
+ > 검증을 어디서 하느냐는 **어떤 값**을 **왜** 검증하느냐를 고민해보시면 좋을 것 같아요. 입력값이 유효한가? 를 검증하기 위해서는 입력을 처리하는 곳에서 검증하는 것이 맞고, 검증하는 로직이 도메인 로직이라면 도메인 로직을 처리하는 곳에서 검증하는 것이 맞습니다.
41
+ >
42
+ > — @krrong on `src/main/kotlin/util/Validator.kt`
43
+
44
+ > MOVE_THRESHOLD를 그대로 가져다 쓰는 경우 상수의 값을 변경하여 6이 된 경우에도 테스트가 정상적으로 통과가 될거에요. 단순히 Car 클래스에 있는 코드를 붙여넣은 것과 다름이 없는데, 과연 의미가 있는 테스트일까요?
45
+ >
46
+ > — @krrong on `src/test/kotlin/CarTest.kt:21`
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **테스트가 어느 클래스에 살고 있는가 = 책임이 어디에 있는가의 거울.** `CarTest`가 Controller를 테스트한다면, Car의 책임이 Controller에 있다는 신호. 테스트 분포의 어색함이 책임 재배치의 단서.
51
+ - **검증의 두 종류:** (1) 입력 형식이 맞는가 — 입력 경계, (2) 도메인 invariants가 지켜졌는가 — 도메인 객체. 같은 Validator에 섞이면 둘 다 흐려진다.
52
+ - **테스트는 production 상수에 의존하지 않는다.** `Car.MOVE_THRESHOLD`를 그대로 참조하면 그 상수가 바뀌어도 테스트는 통과 — 잘못된 안전 감각. 의도(behavior)에 결합해야 한다.
53
+ - **반환 타입은 호출자에게 주는 약속.** `MutableList`를 반환하면 호출자가 컬렉션을 자유롭게 바꿀 수 있다고 약속한 것. 보통은 `List`로 read-only 약속이 더 안전.
54
+ - **"테스트를 위해 가시성을 풀면" 안티패턴 시작.** private을 열어 테스트하는 대신, 그 책임이 정말 private이어야 하는지 또는 별개 클래스로 추출할 수 있는지 물어볼 것.
55
+ - **자기 의문을 적극적으로 적는 학습 태도** — 미플의 PR description은 토론을 끌어내는 명확한 질문들로 가득. 이런 PR은 리뷰어의 시간을 효율적으로 쓰게 만들고 학습이 빠르게 일어난다.
@@ -0,0 +1,50 @@
1
+ # PR #170 — [자동차 경주 2단계] 미플 미션 제출합니다
2
+
3
+ - **Reviewee:** [@HamBeomJoon](https://github.com/HamBeomJoon)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/170
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @krrong
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **InputView/OutputView를 생성자 주입** — Controller가 View 의존성을 외부에서 받음. 결합도 감소 + 테스트 가능성 향상.
12
+ - **테스트 이름이 명세화** — 1단계의 모호한 이름에서 "무엇을 테스트하는지 명확"하게 개선.
13
+ - **Cars 생성 방식 재설계** — 우승자 테스트에서 위치를 지정하기 어려운 점을 깨닫고, Controller에서 생성한 자동차 리스트를 Cars에 주입하는 방식으로 변경.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Controller` 안에 object `OutputView`와 주입받은 `outputView` 혼용** — 같은 역할의 두 인스턴스가 한 클래스에 공존. 의도를 알 수 없는 일관성 부족.
18
+ - **상수 위치 리뷰가 미반영** — 1단계의 `util.Messages` 같은 상수 컨테이너가 그대로 유지.
19
+ - **`return validateCount(count)` 같은 가독성 트레이드오프** — 한 줄 줄이려다 의도가 흐려짐.
20
+ - **우승자 케이스 다중성 누락** — 우승자가 한 명/여러 명인 두 케이스를 모두 테스트하지 않음.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @krrong는 두 가지 주제를 짚었다.
25
+
26
+ 1. **의존성 주입의 장점** — Reviewee의 답("의존도가 높아지는 걸 해결")이 정확. 추가로 리뷰어가 명시적 확인은 안 하지만 일관성 있는 적용을 기대.
27
+ 2. **혼용 패턴의 위험성** — object `OutputView`와 주입받은 `outputView` 둘이 공존하면 호출자가 어느 쪽이 정답인지 모름. 1단계 학습이 2단계에서 일관되게 적용되지 않은 신호.
28
+
29
+ 또한 **테스트의 케이스 다양성** — 우승자가 한 명/여러 명인 두 시나리오를 모두 다뤄야 도메인 규칙의 명세가 된다.
30
+
31
+ - **대표 인용:**
32
+ > `RacingController`를 만들 때 `InputView`와 `OutputView`를 주입해주고 있어요. 이렇게 했을 때의 장점이 무엇이라고 생각하나요?
33
+ >
34
+ > — @krrong on `src/main/kotlin/racingcar/Racingcar.kt`
35
+
36
+ > `RacingController`에서 object로 선언된 `OutputView`와 인자로 넘겨받은 `outputView`를 혼용하여 사용하고 있네요. 😅
37
+ >
38
+ > — @krrong on `src/main/kotlin/racingcar/RacingController.kt:11`
39
+
40
+ > 우승자를 확인하기 위한 테스트도 추가해볼까요? 도움을 드리자면 우승자는 한명일수도, 여러명일수도 있습니다.
41
+ >
42
+ > — @krrong on `src/main/kotlin/racingcar/model/Cars.kt:17`
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **의존성 주입의 일관성** — 주입의 의도는 "외부에서 의존성을 통제"하는 것. object와 주입받은 동일 타입이 한 클래스에 공존하면 그 의도가 무너진다. 둘 중 하나로 통일.
47
+ - **테스트의 케이스 다양성 = 도메인 규칙의 완전성.** 우승자가 "한 명" 케이스만 테스트하면 "여러 명" 규칙은 정의되지 않은 상태. 도메인 규칙이 둘 다 허용한다면 테스트도 둘을 모두 명세.
48
+ - **테스트 가능성이 설계를 끌어당긴다.** "Cars의 위치를 지정하기 어렵다"는 문제가 "Cars의 생성 방식을 바꾸자"는 설계 결정을 끌어낸 사례. 테스트하기 어려운 곳은 보통 책임 분배의 흔적이다.
49
+ - **가독성 vs 한 줄 줄이기.** 한 줄 줄임은 가독성과 자주 충돌한다. 짧은 코드가 항상 좋은 코드는 아님. 읽는 사람이 "왜 이렇게 했지?"를 잠시라도 멈추게 되면 그 짧음은 비용이 된다.
50
+ - **이전 라운드 학습이 다음 라운드에 일관되게 적용되는지가 진짜 학습.** 상수 위치 가이드를 받고도 다음 PR에 안 반영되면 학습이 일회성에 그친다. 한 라운드의 학습을 다음에 점검하는 자기 검증 루프가 필요.
@@ -0,0 +1,54 @@
1
+ # PR #106 — [자동차 경주 구현] 팡태 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Hevton](https://github.com/Hevton)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/106
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 22 (양은 보통, 1단계임에도 설계 완성도 높음)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Car` 생성 시 init 블록에서 invariants 검증** — 도메인 객체가 자기 무결성을 직접 지킴. 리뷰어 칭찬.
12
+ - **`Cars`, `TryCount` 같은 일급 컬렉션/값 객체로 원시 강박 해소** — 1단계임에도 도메인 어휘 충실.
13
+ - **`NumberGenerator` 인터페이스 + `RandomNumberGenerator` 구현** — 무작위 의존을 추상 뒤로 격리.
14
+ - **companion object로 도메인 상수 묶음** — Car/Cars의 상수가 그 도메인 곁에 위치. `Constants.kt` 같은 안티패턴 회피.
15
+ - **`InputView` / `OutputView` 명확한 분리** — 기능별 함수 분리도 잘됨.
16
+ - **테스트 함수명이 도메인 의도를 명확히 드러냄** — "함수명만 봐도 유추 가능"이라는 리뷰어 칭찬.
17
+
18
+ ## 못한 점 (설계 관점)
19
+
20
+ - **`validateCars` 같은 `Cars` 전용 검증이 외부 확장 함수로 존재** — `Cars` 내부 invariants는 `Cars`가 들고 있어야 한다. 확장 함수로 두면 외부에서 호출/재정의 가능성이 생기고 검증의 자리가 흐려짐.
21
+ - **`TryCount`의 동일 패턴** — 자기 검증이 외부 확장 함수로 빠짐.
22
+ - **`OutputView`가 우승자 계산 로직을 직접 함** — "승자를 구하는 로직이 View에 있는 게 맞는가" — MVC상 도메인 계산은 도메인에.
23
+ - **`InputView`의 상수가 외부 노출** — Input 안에서만 쓰는 상수가 public.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @Gyuil-Hwnag는 전반적으로 **높은 만족도** 를 표시하면서도, 두 가지 중요한 가이드를 일관되게 짚었다.
28
+
29
+ 1. **자기 invariants는 자기가 든다** — `validateCars`, `TryCount` 검증 같은 확장 함수가 외부에 있으면, 그 도메인 객체가 자기 무결성을 잃는다. 객체 내부에 두는 것이 응집의 원칙.
30
+ 2. **계산은 도메인의 일** — View가 승자를 계산하면 MVC가 깨진다. View는 받아서 그리기만.
31
+
32
+ 이 PR은 1단계 PR 중 가장 완성도가 높은 편이라 리뷰가 칭찬 위주이지만, 그 안에서도 짚어내는 두 가지는 OOP의 핵심.
33
+
34
+ - **대표 인용:**
35
+ > MVC로 구현한다고 했을 때 승자를 구하는 로직이 View에 존재하는게 맞는가? 라는 고민이 들긴 해서 Cars 내부에 함수로 기능을 빼두는 것도 좋을 것 같다는 생각이 듭니다!
36
+ >
37
+ > — @Gyuil-Hwnag on `src/main/kotlin/view/OutputView.kt`
38
+
39
+ > fun validateCars() 의 경우 Cars 클래스에서만 사용하는 함수라면 Cars 클래스 내부에 선언해도 좋을 것 같다는 생각이 듭니다!!
40
+ >
41
+ > — @Gyuil-Hwnag on `src/main/kotlin/domain/Cars.kt`
42
+
43
+ ## 얻은 교훈
44
+
45
+ - **확장 함수의 자리는 "도메인 객체가 컨트롤하지 못하는 외부 위치"가 아니라야 한다.** 그 객체의 invariants나 핵심 동작이 확장 함수로 빠지면 외부가 그 무결성을 우회할 수 있다. invariants는 내부에.
46
+ - **MVC에서 View의 책임은 "받아서 그리기"로 좁힌다.** 표시 데이터를 만들어 View에 주는 책임은 도메인의 일이다. View가 계산을 하면 도메인 변경이 View로 새어 들어온다.
47
+ - **1단계에서 객체지향 기초가 잘 잡힌 PR의 특징:**
48
+ 1. 도메인 어휘로 클래스 이름 (`Cars`, `TryCount`)
49
+ 2. 자기 invariants를 init에서 검증
50
+ 3. 추상 인터페이스로 외부 자원 격리
51
+ 4. companion object로 도메인 상수 결합
52
+ 5. 테스트 함수명이 도메인 문장
53
+ 이 다섯 가지가 함께 있으면 "객체지향답다"고 느껴진다.
54
+ - **칭찬 리뷰가 많을 때도 핵심 가이드는 짧고 정확하다.** 좋은 리뷰어는 칭찬 사이에서도 본질적 약점을 짚는다 — "검증의 자리" / "View의 책임".
@@ -0,0 +1,51 @@
1
+ # PR #118 — [자동차 경주 리팩터링] 팡태 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Hevton](https://github.com/Hevton)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/118
5
+ - **단계:** 리팩터링
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 26
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Winners` 일급 객체 도입** — `List<Car>` 그대로 노출하지 않고 도메인 의미가 담긴 클래스로 감쌈. 도메인 어휘 보존.
12
+ - **`Car`의 `private set`으로 외부 변경 차단** — 캡슐화의 기본기.
13
+ - **InputView를 object로 재정의** — "상태 없음 + 의존성 없음 + 생성자 불필요"라는 자기 기준을 명확히 표명하며 변경. 리뷰어가 "정확한 대답"이라고 인정.
14
+ - **`ExplicitNumberGenerator`로 결정적 테스트** — Random 의존을 추상으로 격리한 뒤 테스트용 구현체 제공.
15
+ - **메서드 가시성을 한 번 더 점검** — private 노출 범위에 대해 자기 기준을 갖춤.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **`Winners` 클래스가 사실상 단순 wrapper** — 현재로선 추가 정보나 행위가 없어 단순 List 래핑. reviewee 본인도 "현재는 추가 정보가 없으므로 없어도 될 것 같다"고 인정. 도메인이 진짜로 필요로 할 때 만들 것.
20
+ - **`OutputView`가 `Winners`의 표현을 직접 만듦** — `Winner.toString()` 오버라이딩으로 표현 책임을 도메인 객체로 옮기는 옵션도 있음.
21
+ - **`getWinners()` 테스트 누락** — 리팩터링 라운드인데 핵심 기능의 테스트가 빠짐.
22
+ - **이동 성공/실패 케이스에 매직 넘버(4) 직접 사용** — `MOVE_SUCCESS`/`MOVE_FAIL` 같은 상수로 의도를 드러내는 편이 가독성에 유리.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @Gyuil-Hwnag는 이 라운드에서 **"왜 만들었는가"** 를 명확히 묻는 패턴을 자주 보임 — `Winners` 데이터 클래스가 왜 필요한지, `InputView`가 왜 class인지. 이 질문은 학생이 자기 결정을 회고하게 만드는 좋은 도구.
27
+
28
+ 또한 **toString 오버라이딩으로 표현 책임을 도메인으로** 옮기는 옵션을 힌트로 제시하면서 "반드시 수정이 필요한 내용은 아니다"라고 함께 안내 — 강요하지 않는 학습 가이드.
29
+
30
+ 테스트 측면에서는 **상수로 의도 표현** (MOVE_SUCCESS 등)과 **누락된 케이스 보강** 가이드.
31
+
32
+ - **대표 인용:**
33
+ > Winners 데이터 클래스가 존재하는 이유에 대해서 궁금합니다!
34
+ >
35
+ > — @Gyuil-Hwnag on `src/main/kotlin/domain/Winners.kt`
36
+
37
+ > InputView를 Class로 설정하시는 이유에 대해서 궁금합니다!
38
+ >
39
+ > — @Gyuil-Hwnag on `src/main/kotlin/view/InputView.kt`
40
+
41
+ > Cars 에서 고민해보았던 toString()을 Winner 객체에서도 toString()을 오버라이딩 할 수 있지 않을까요? 반드시 수정이 필요한 내용은 아니고 ...
42
+ >
43
+ > — @Gyuil-Hwnag on `src/main/kotlin/view/OutputView.kt:21`
44
+
45
+ ## 얻은 교훈
46
+
47
+ - **"왜 만들었는가"는 가장 가치 있는 리뷰 질문.** 학생이 자기 결정을 재현/회고하면 그 자체가 학습. `Winners`처럼 "추가 정보 없으면 없어도 된다"는 솔직한 회고가 가능해진다.
48
+ - **클래스 vs object 선택의 기준 = (1) 상태, (2) 의존성, (3) 인스턴스 다수성.** 이 셋 모두 없으면 object가 자연스럽다. 단순히 "InputView니까 class"는 자동 결정이 아님.
49
+ - **도메인 객체로 감싸기는 의미가 있을 때만.** 단순 wrapping은 표면적 추상화. 그 추상이 향후 invariants나 도메인 행위를 들 가능성이 있을 때 만들고, 아니면 미루는 것이 YAGNI에 맞음.
50
+ - **표현 책임의 옵션:** (1) View가 도메인 객체를 받아 표현 만들기, (2) 도메인 객체의 `toString()` 오버라이딩, (3) 별도 formatter. 어떤 게 정답인지는 도메인의 특성에 따라 — 단, View가 도메인 계산을 하는 것은 보통 안티패턴.
51
+ - **테스트 코드의 매직 넘버도 의도를 흐린다.** `4`라는 숫자 대신 `MOVE_SUCCESS_THRESHOLD` 같은 상수로 표현하면 테스트가 시나리오를 더 명확히 전달.
@@ -0,0 +1,56 @@
1
+ # PR #108 — [자동차 경주] 악어 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Hogu59](https://github.com/Hogu59)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/108
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 20
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`require()` 활용**.
12
+ - **상수 활용 (companion object)**.
13
+ - **`runCatching` 활용** — 재입력 흐름에 적용.
14
+ - **PR 질문이 명확** — 검증 위치, depth 줄이는 법, 출력 메서드 분리 등.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Race`(Controller)에서 model + controller 양쪽에 검증 분산** — 학생이 "depth 깊어진다" 자가 인식.
19
+ - **검증 분리를 안 함 → 컨트롤러 비대**.
20
+ - **`Car`가 data class with var** — data class + var의 문제 (equals/hashCode 동작).
21
+ - **상수에 한정자 미적용** — 다른 곳에서 안 쓰여도 public.
22
+ - **assertEquals 사용** — assertThat이 더 가독성.
23
+ - **Car constructor에서 validation 직접 수행** — Validator 분리 후에도 Car 안에서 또 검증.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @KwonDae의 메시지:
28
+
29
+ 1. **Validation 클래스로 분리해서 책임 시작** — "검증을 담당하는 클래스를 두어서 책임을 분리하는 것으로 시작" → model/controller 어디서든 호출 가능.
30
+
31
+ 2. **Depth 줄이는 두 가지 방법**:
32
+ - **함수 분리** — 검증 끝낸 뒤 움직임 명령
33
+ - **객체에 메시지 던지기** — 자동차에게 직접 메시지, 자동차 스스로 판단해 움직임. **이 두 번째가 RDD의 핵심.**
34
+
35
+ 3. **3줄 함수 예시** — `getCars` 안에 출력 가이드 + 검증 + 차량 생성을 3줄로 분리.
36
+
37
+ 4. **검증된 값만 Car constructor로 들어오게** — `Car`와 `Validation` 사이 의존성 제거. 검증은 호출 측에서 끝낸 후 깨끗한 값을 전달.
38
+
39
+ 5. **이름 목록 검증 vs 개별 이름 검증 분리** — 학생이 답: "예외 종류가 다르다" (목록 = 빈/중복/크기, 개별 = 길이/공백).
40
+
41
+ - **대표 인용:**
42
+ > 객체가 자동차를 받아, 자동차에게 단지 메세지만 던져 자동차 스스로 판단해 움직일지 말지 역할을 부여하는것 또한 좋은 방법입니다. 이런식으로 역할을 분리해서 depth를 줄일 수 있습니다.
43
+ >
44
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/Race.kt`
45
+
46
+ > Car 객체를 생성할때는 constructor로 들어오는 값들은 이미 검증이 완료된 상태로 들어오게 하는건 어떨까요? Car 와 Validation 간 의존성은 없어도 됩니다.
47
+ >
48
+ > — @KwonDae on `src/main/kotlin/racingcar/model/Car.kt:9`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **Depth 줄이기의 본질 = 책임 분리.** if-if-if가 늘어나면 그건 "내가 모든 걸 검증 후 판단한다"는 god-object의 신호. 각 객체에 메시지를 던져 스스로 판단하게.
53
+ - **검증 책임의 분리 = 객체 간 의존성 제거.** Car가 검증을 알면 Car ↔ Validation 의존. Car는 "검증된 값을 받기만" 하면 의존성 없음.
54
+ - **검증의 두 층 (목록 vs 개별)**. 컬렉션 수준 (개수, 중복) ≠ 개별 수준 (길이, 형식). 함수도 두 개.
55
+ - **data class + var는 위험.** equals/hashCode는 주 생성자만 보는데 var면 동치성이 깨질 수 있음. data class는 immutable VO가 본업.
56
+ - **3줄짜리 흐름 함수 = 잘 분리된 책임의 신호.** `getCars()`가 "안내 출력 → 검증 → 차량 생성" 3줄이면 각 줄이 명확한 책임을 가진 작은 메서드 호출.
@@ -0,0 +1,59 @@
1
+ # PR #125 — [자동차 경주 - 리팩토링] 악어 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Hogu59](https://github.com/Hogu59)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/125
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Cars, RoundNumber, Winner를 도메인 객체로 분리** — 일급 컬렉션 + 값 객체.
12
+ - **랜덤 생성 로직을 도메인에서 분리** — "랜덤이 도메인에 의존성 가질 이유 없음" 자가 인식.
13
+ - **테스트가 controller가 아닌 model 단위로 재배치**.
14
+ - **모델별 테스트 분리 + `move()` 테스트 작성**.
15
+ - **`init` 블록 검증으로 이동 + 자가 의문** ("이게 맞나요?").
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **`Cars`, `RoundNumber`, `Winner`가 모두 평행하게 존재** — 이들을 묶는 `RacingGame` 같은 도메인 주체 부재.
20
+ - **컨트롤러가 여전히 상태 관리 + 우승자 판단**.
21
+ - **`getRandomNumber`가 `kotlin.random.Random` 직접 의존** → 처음엔 테스트 불가, 학생이 분리.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @KwonDae의 핵심 가르침:
26
+
27
+ 1. **"경주장(RacingGame)을 도메인 주체로"** — Cars, RoundNumber, Winner는 모두 "자동차 경주"라는 토픽에 관심. RacingGame이 이들의 상태 관리 책임을 가져야 함.
28
+
29
+ 2. **Controller의 책임 = 명령 + 외부 통신** — "명령은 Controller 담당. 경주장에 대한 상태 관리와 들어온 명령에 대한 판단은 경주장 몫. 차량은 자신이 얼마나 움직일지에 대한 책임." → 책임의 3층 명확화.
30
+
31
+ 3. **랜덤은 도메인 의존성이 아니다** — Functional Interface + 전략 패턴으로 추상화. 도메인은 인터페이스에만 의존, 테스트에서 override.
32
+
33
+ 4. **`move()` 테스트 부재 = 핵심 비즈니스 로직 미검증** — "가장 핵심적인 비즈니스 로직"을 빠뜨림.
34
+
35
+ 5. **init 검증의 trade-off** — "정답 없음. 개인적으론 모델은 비즈니스 로직 집중, 검증은 모델 밖. 하지만 모델 따라 다를 수 있음." → 학생이 매번 자기 기준을 세우길.
36
+
37
+ - **대표 인용:**
38
+ > 지금은 경주장이 아닌 컨트롤타워에서 경주에 대한 상태, 우승자 판단 같은 것들을 혼자 다 맡아서 하고 있습니다. 때문에 테스트에서도 domain 비즈니스 로직 검증이 아닌 race 의 함수를 호출하고 있죠. 즉, 명령은 Controller 담당입니다. 경주장에 대한 상태 관리와 들어온 명령에 대한 판단은 경주장 몫입니다. 차량은 자신이 얼마나 움직일지, 얼만큼 움직였는지에 대한 책임을 갖습니다.
39
+ >
40
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/Race.kt:1`
41
+
42
+ > 지금 Cars, RoundNumber, Winner 같은 클래스들로 분리가 되었는데 이들의 공통점은 자동차 경주 라는 토픽에 관심사가 있다는 것입니다. 이들이 ex. RacingGame 이라는 도메인 모델안에 들어가 관리가 된다면 어떨까요?
43
+ >
44
+ > — @KwonDae on `src/main/kotlin/racingcar/model/Cars.kt:8`
45
+
46
+ > 만약 정해진 숫자가 나온다면 함수 호출 후의 상태 변화 혹은 결과가 예측되기에 테스트를 쉽게 작성할 수 있는데요, 어떻게 하면 Car 모델에서 getRandomNumber 메소드가 Random 에 의존하지 않고 테스트 가능하게끔 할 수 있을까요?
47
+ >
48
+ > — @KwonDae on `src/main/kotlin/racingcar/model/Car.kt`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **책임의 3층 (Controller / 도메인 주체 / 부분 객체)**:
53
+ - **Controller** = 외부 명령 (사용자 입력 받고 도메인에 전달)
54
+ - **도메인 주체** (RacingGame) = 상태 관리 + 명령 판단 (라운드 진행, 우승자 결정)
55
+ - **부분 객체** (Car) = 자기 행위 (움직임, 자기 위치)
56
+ - **테스트 위치 = 책임 위치의 폭로 (재확인).** Controller에 테스트가 모이면 Controller가 도메인 책임을 가진 신호. 도메인 단위 테스트가 가능해지면 책임이 도메인으로 이동한 것.
57
+ - **랜덤은 도메인 의존성이 아니다.** "랜덤 = 외부 비결정성", 도메인 = "결정적 규칙". 인터페이스로 둘을 분리 → 테스트에서 결정적 fake 주입.
58
+ - **여러 도메인 객체를 *묶는 주체*가 없으면 Controller가 그 역할을 떠안는다.** Cars + RoundNumber + Winner를 묶는 RacingGame이 없으면 Controller가 "이 셋의 협력"을 직접 진행 = 책임 누수.
59
+ - **Functional Interface = SAM (Single Abstract Method) interface** — Kotlin의 `fun interface`로 람다로도 구현 가능. 전략 패턴의 경량 형태.
@@ -0,0 +1,57 @@
1
+ # PR #111 — [자동차 경주 - 리팩토링] 예니 미션 제출합니다
2
+
3
+ - **Reviewee:** [@JoYehyun99](https://github.com/JoYehyun99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/111
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @ghojeong
7
+ - **라인 코멘트:** 14
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **상세한 테스트 함수명** — 1단계 피드백 흡수.
12
+ - **trim 활용**.
13
+ - **에러 메시지 케이스별 구분**.
14
+ - **`Car.init`에 `require` 추가** — 도메인 invariant.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`InputExceptions` 객체명** — 커스텀 예외 클래스로 오해. 실제는 유틸.
19
+ - **List size 비교 + 리스트 비교 중복 테스트** — 군더더기.
20
+ - **`Car.toString()` + `RacingCarGame.race()` public 메서드의 테스트 누락** — 모델 테스트 커버리지 < 100%.
21
+ - **시도 횟수가 Controller에 — RacingCarGame이 자기 라운드 수를 모름**.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @ghojeong (파이로)의 가르침:
26
+
27
+ 1. **유틸 클래스 이름은 *유틸임이 보여야*** — `InputExceptions`는 Exception 클래스 같음. `InputUtils` 또는 `InputValidator`로.
28
+
29
+ 2. **요구사항 변경 시뮬레이션** — "이름 글자수와 시도 횟수는 빈번히 바뀜. 어떻게 유지보수할 것인가?" 학생: `Car.init` + `RacingCarGame` 생성자에 require → 한 곳에서 변경 가능.
30
+
31
+ 3. **시도 횟수의 위치 = "횟수를 관리한다는 로직"의 자리** — "조건문이 곧 로직. 로직은 모델에서 + 테스트." 학생이 한 라운드마다 출력해야 해서 Controller로 빼냈는데, 파이로는 "그럼에도 모델로" 권장.
32
+
33
+ 4. **모델 테스트 커버리지 100% (method 단위)** — 모델로 옮긴 = "모든 public 메서드를 테스트하겠다는 의지의 표명."
34
+
35
+ 5. **`toString` 책임의 회색지대** — 백엔드면 OutputView, 안드로이드면 toString 허용. 둘 다 답이 됨.
36
+
37
+ - **대표 인용:**
38
+ > 자동차 이름의 글자수 제한과, 시도 횟수와 관련된 요구사항이 변경 되었을 때, 에러 메시지, 테스트 코드, 그리고 실제 로직 코드를 어떻게 유지보수를 하실 계획이신가요?
39
+ >
40
+ > — @ghojeong on `src/main/kotlin/racingcar/utils/InputExceptions.kt`
41
+
42
+ > "횟수를 관리" 한다는 말을 코드로 풀어보면, 결국 조건문이 된다고 생각합니다. 그리고 조건문은 튜링 머신에서 데이터가 아닌 머신 자체의 움직임인 로직을 뜻합니다. 로직은 가능한 컨트롤러가 아니라, 모델에서 담당하고 이에 대한 테스트 코드를 함께 작성하는 것을 저는 선호합니다.
43
+ >
44
+ > — @ghojeong on `src/main/kotlin/racingcar/utils/InputExceptions.kt`
45
+
46
+ > 다른 패키지는 몰라도 model 패키지에서 만큼은 Method 의 테스트 커버리지가 100% 가 될 수 있도록 해주세요... model 에서 public 하게 공개된 모든 메서드는 테스트 코드가 작성되어야 합니다.
47
+ >
48
+ > — @ghojeong on `src/main/kotlin/racingcar/model/RacingCarGame.kt`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **조건문 = 로직 = 모델에 있어야 함**. "관리"라는 동사가 들어가면 조건이 끼고, 조건은 모델의 자리. Controller에 조건이 모이면 로직 누수.
53
+ - **클래스명 = *오해의 비용*을 최소화하기**. `Exceptions` 접미사는 Exception 타입 오해. 유틸은 `Utils`, 검증은 `Validator`.
54
+ - **요구사항 변경 시뮬레이션 = 좋은 설계 검증법**. "이름 글자수 1~5 → 3~8 바뀌면?" 한 곳만 바꿔서 끝나면 OK. 여러 곳 손대야 하면 응집도 낮음.
55
+ - **모델 메서드 = 100% 테스트 커버리지**. "이 메서드를 모델로 옮겼다 = 검증 의지." 옮긴 후 테스트 없으면 옮긴 이유 부정.
56
+ - **toString의 회색지대**. 책임 분리 엄격 = OutputView, 안드로이드 UI 모델 = toString. 도메인 어휘로 정해진 답 없음 — 팀 컨벤션.
57
+ - **테스트 코드는 *그 자체로* 요구사항 문서**. TDD에서 테스트가 먼저, 로직이 나중. 가독성 나쁜 테스트는 "그냥 지워버린다"는 현실 경고.
@@ -0,0 +1,45 @@
1
+ # PR #88 — [자동차 경주] 예니 미션 제출합니다
2
+
3
+ - **Reviewee:** [@JoYehyun99](https://github.com/JoYehyun99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/88
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @ghojeong
7
+ - **라인 코멘트:** 10
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`repeat` 등 코틀린 네이티브 문법 활용**.
12
+ - **companion object로 매직넘버 상수화**.
13
+ - **`racingCarGame` 멤버 변수 사용 의도 정당화** — "메서드마다 인자로 넘기는 것보다 간편."
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Exceptions의 에러 메시지가 모두 같은 공통 메시지** — 어느 상황의 오류인지 디버깅 불가.
18
+ - **`split(", ")` (쉼표+공백)** — 요구사항은 쉼표만. trim 안 해서 공백 의존.
19
+ - **EOF 줄바꿈 누락**.
20
+ - **`Car.toString()` 출력 형식 보유** — OutputView 책임 침범 의문.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @ghojeong (파이로)의 가르침:
25
+
26
+ 1. **에러 메시지의 *구분* = 동료 디버깅의 시작점** — 다 같은 메시지면 어느 경로 실패인지 모름.
27
+ 2. **`split` 전 trim 습관** — JSON이 아닌 문자열 파싱에서 공백이 예기치 못한 크래시 원인.
28
+ 3. **테스트 메시지 = "어떻게 성공할 수 있는지" 동료가 즉시 알 수 있도록** — `randomNumber가 4 이상이면, 자동차가 움직인다` 같은 "~하면 ~한다" 형식.
29
+ 4. **함수 파라미터 vs 객체 멤버의 trade-off** — 멤버 = 간편, 파라미터 = 함수 순수성. 학생이 인지하고 있어 칭찬.
30
+
31
+ - **대표 인용:**
32
+ > 에러 메세지가 무엇이 잘못되었는지 모호하고, 다 같은 공통 메시지로 되어있어서, 어떤 이유로 Exception 이 나는지 알기 어려울 것 같아요!
33
+ >
34
+ > — @ghojeong on `src/main/kotlin/racingcar/utils/Exceptions.kt`
35
+
36
+ > 가령 저는 `randomNumber 가 4 이상이면, 자동차가 움직인다.` 처럼 ~하면 ~한다 라는 형식의 테스트명을 좋아합니다. 테스트 코드는 특히나 가독성이 나쁘면, 다른 동료들이 그냥 지워버리는 개인 경험이 있어서 공유해보았습니다.
37
+ >
38
+ > — @ghojeong on `src/test/kotlin/racingcar/model/RacingCarGameTest.kt`
39
+
40
+ ## 얻은 교훈
41
+
42
+ - **에러 메시지의 *구분* = 디버깅의 비용**. 모두 같은 메시지면 운영에서 로그 보고 원인 추정 불가. 케이스마다 다른 메시지 = 비용 거의 없는 정보.
43
+ - **trim 습관 = 예기치 못한 크래시 방지**. 사용자 입력은 항상 trim 후 파싱.
44
+ - **테스트 메시지 = "~하면 ~한다"**. 동료가 테스트 실패 시 *어떻게 성공시킬 수 있는지* 즉시 보임.
45
+ - **함수 파라미터 vs 객체 멤버**. 멤버 = 매번 안 넘겨도 됨 (간편), 파라미터 = 함수 결과 예측 가능 (순수). 작은 클래스/이 함수만 쓰는 데이터 = 파라미터, 클래스 전체가 공유 = 멤버.
@@ -0,0 +1,49 @@
1
+ # PR #127 — [자동차 경주 - 리팩토링] 준영 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Junyoung-WON](https://github.com/Junyoung-WON)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/127
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 6
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RacingGame` 도메인 모델 도입** — 경주장.
12
+ - **`Car.move()`로 자동차 스스로 움직임 결정** — Tell Don't Ask.
13
+ - **kotlin.collections 활용**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Controller가 여전히 랜덤 생성 + 범위까지 정함** — 도메인 정보를 Controller가 결정.
18
+ - **Car의 move()가 Random에 직접 의존** — 테스트 가능성 부재.
19
+
20
+ ## 리뷰어 의견 요지
21
+
22
+ 리뷰어 @KwonDae의 핵심 가르침 (체스 비유):
23
+
24
+ 1. **Controller = 유저, RacingGame = 체스판, Car = 말** — "유저는 단지 체스판에게 어떤 말을 얼마나 움직이라고 명령할 뿐. 체스판이 상태(누가 이기고 있는지, 어떤 말들이 죽고 살았는지)를 가짐." → 책임의 3층 구조.
25
+
26
+ 2. **랜덤은 도메인 의존성이 아니다** — Functional Interface로 추상화. 테스트 가능성.
27
+
28
+ 3. **Domain ↔ Controller의 흐름** — 명령은 Controller → Domain. 상태는 Domain. 결과는 Domain → Controller → View.
29
+
30
+ 4. **자동차 스스로 결정 후 단위 테스트** — `move()`가 Random에 의존하면 테스트 불가. 추상화로 결정적 fake 주입.
31
+
32
+ - **대표 인용:**
33
+ > Controller 는 Domain(model)과 상호작용을 합니다. 그리고 domain에는 여러개의 경주차량을 관리하는 경주장(RacingGame)과 여러개의 차량(car)들로 이루어져 있죠. 그런데 지금은 경주장이 아닌 컨트롤타워에서 경주에 대한 상태, 우승자 판단 같은 것들을 혼자 다 맡아서 하고 있습니다.
34
+ >
35
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/GameController.kt`
36
+
37
+ > 체스판을 예로 들어 볼게요, 체스를 플레이하는 유저는 Controller가 될 수 있을것이고, 체스판은 RacingGame이 될 수 있겠죠. 체스판에는 현재 체스판의 상태(누가 이기고 있는지, 어떤 말들이 죽고 살았는지 등등) 상태를 갖고있습니다. 유저는 단지 체스판에게 어떤 말을 얼마나 움직이라고 명령할 뿐이죠.
38
+ >
39
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/GameController.kt`
40
+
41
+ ## 얻은 교훈
42
+
43
+ - **체스 비유 = 책임의 3층 구조**:
44
+ - **유저 (Controller)** = 명령만 (이 말을 저기로)
45
+ - **체스판 (RacingGame)** = 상태 + 명령 해석 (체스판 위에서 일어나는 모든 일)
46
+ - **말 (Car)** = 자기 위치 + 자기 행위 (앞으로 한 칸)
47
+ - **랜덤은 외부 비결정성. 도메인은 결정적 규칙.** 둘이 합쳐지면 테스트 불가. 인터페이스로 분리하면 도메인은 결정적 → fake 주입으로 검증 가능.
48
+ - **`move()`의 테스트 가능성 = 추상화의 결과**. Random 의존 = 테스트 결과 예측 불가. NumberGenerator 인터페이스 + fake → 결정적.
49
+ - **명령-상태-행위의 흐름**. Controller가 RacingGame에게 "라운드 진행해라", RacingGame이 각 Car에게 "움직임 결정해라", Car가 NumberGenerator에게 "숫자 줘라". 메시지가 한 방향으로.
@@ -0,0 +1,49 @@
1
+ # PR #90 — [자동차 경주 - 1단계] 준영 미션 제출합니다
2
+
3
+ - **Reviewee:** [@Junyoung-WON](https://github.com/Junyoung-WON)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/90
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 14
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **InputView/OutputView 분리, `ValidationUtil`, `WinnerService` 등 책임 단위로 클래스 분리**.
12
+ - **`require` 활용**, `repeat` 활용.
13
+ - **`IllegalArgumentException` 명확히 사용** — 단순 Exception 아님.
14
+ - **EOL 문제 원인을 *근본적으로* 파악** — CR vs LF, POSIX 표준, gcc 컴파일러 행 처리까지.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **GameController가 InputView, OutputView, ValidationUtil, WinnerService를 *인스턴스*로 보유** — 상태 없는 객체들이 인스턴스화 필요?
19
+ - **try-catch로 입력 흐름 처리** — runCatching 미사용.
20
+ - **`WinnerService` 같은 "Service" 접미사** — 객체보다 함수 모음에 가까움.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @KwonDae의 핵심 가르침:
25
+
26
+ 1. **상태 없는 클래스는 object** — InputView, OutputView, ValidationUtil, WinnerService 모두 인스턴스화할 필요 없음 → object.
27
+
28
+ 2. **runCatching 소개** — try-catch 대신 Result 기반.
29
+
30
+ 3. **요구사항과 커밋의 일대일 매핑** — 같은 메시지의 중복 커밋은 의미 단위가 모호한 신호.
31
+
32
+ 4. **IllegalArgumentException vs 단순 Exception** — 의미 있는 예외 타입 선택.
33
+
34
+ - **대표 인용:**
35
+ > InputView, OutputView, ValidationUtil, WinnerService 인스턴스를 GameController가 갖고 있어야 하는지 고민해보시겠어요? GameController에서 인스턴스화 할 필요 없는 클래스라면 object 키워드를 활용해보는건 어떨까요?
36
+ >
37
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/GameController.kt:14`
38
+
39
+ > 어떠한 기능을 제공하는 비즈니스 로직 단위를 관리하는 클래스라면 object 활용도 고민해보시면 좋을것 같습니다.
40
+ >
41
+ > — @KwonDae on `src/main/kotlin/racingcar/service/WinnerService.kt:5`
42
+
43
+ ## 얻은 교훈
44
+
45
+ - **상태 없음 + 함수만 = object**. InputView, ValidationUtil처럼 인스턴스마다 다른 동작을 안 가지면 object가 정답.
46
+ - **EOL 문제는 *근본 이해*가 진짜 학습**. CR vs LF + POSIX + gcc까지 파고들면 "왜 안 되는가"가 명확. 표면 해결 (체크박스만 켜기)은 다음에 또 만남.
47
+ - **try-catch → runCatching 이행**. Kotlin idiom의 흐름. 다음 라운드의 피드백 예고편.
48
+ - **커밋 메시지 중복 = 책임 단위 모호의 신호**. 두 번 같은 메시지가 보이면 "이 두 변경이 *실제로 다른 작업*이었는가" 자문.
49
+ - **`Service` 접미사의 의문**. 백엔드 관습이지만, 상태 없는 함수 모음이면 object 또는 top-level fun으로 충분. 굳이 Service 인스턴스가 필요한가?