ํ›„๊ธฐ๐Ÿ”ฅ/ํšŒ๊ณ ๋ก

NextStep TDD, Clean Code with Java ์ˆ˜๋ฃŒ ํ›„๊ธฐ

dkswnkk 2023. 6. 5. 00:23

์„œ๋ก 

4.3~6.1 ์•ฝ 8.5์ฃผ๊ฐ„ NextStep์—์„œ ์ง„ํ–‰ํ•˜๋Š” TDD, Clean Code With Java 16๊ธฐ ๊ณผ์ •์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค. ์ฐธ๊ฐ€ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” ๋งŽ์€๋ฐ, ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ์œผ๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‹ค์ œ ์นดxx, 11xx๋“ฑ์˜ ๊ธฐ์—…์—์„œ ๋„ฅ์ŠคํŠธ์Šคํƒญ์˜ ๊ต์œก ๊ณผ์ •์„ ํ†ตํ•ด ์‹ ์ž… ์˜จ๋ณด๋”ฉ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ณ , ์šฐํ…Œ์ฝ”๋‚˜ ์šฐํ…Œ์บ ์˜ ์ผ๋ถ€ ๊ณผ์ •์ด๋ž‘๋„ ๋น„์Šทํ•ด ๊ฒ€์ฆ๋œ ๊ฐ•์˜ ํ€„๋ฆฌํ‹ฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”, ํด๋ฆฐ์ฝ”๋“œ, TDD์™€ ๊ฐ™์ด ์ฑ…์„ ํ†ตํ•ด ํ˜ผ์ž ์ด๋ก ๋งŒ ์ตํ˜”๋˜ ์ง€์‹๋“ค์„ ์‹ค์Šต์„ ํ†ตํ•ด ํ™œ์šฉ์„ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด๊ฐ€ ์•„๋Š” ์ฃผ๋ณ€์— ๋›ฐ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์€ ๊ณตํ†ต์ ์œผ๋กœ ๋„ฅ์ŠคํŠธ์Šคํƒญ์˜ ๊ฐ•์˜๋ฅผ ํ•˜๋‚˜ ์ด์ƒ์€ ์ˆ˜๋ฃŒํ–ˆ๋‹ค.

๊ณผ์ • ์ž์ฒด๋Š” ์•ฝ ๋‘ ๋‹ฌ๊ฐ„ ์ง„ํ–‰๋˜๋ฉฐ ํฌ๊ฒŒ๋Š” 4๊ฐœ, ์„ธ๋ถ€์ ์œผ๋กœ๋Š” 17๊ฐœ์˜ ์ž๋ฐ” ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉด PR์„ ์˜ฌ๋ฆฌ๊ณ , ๋ฉ˜ํ† ๋“ค์˜ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด merge๊ฐ€ ๋˜๋Š” ์‹์œผ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”๋ฐ, 80๋งŒ ์›์ด๋ผ๋Š” ์ž‘์ง€ ์•Š์€ ๊ธˆ์•ก์˜ ๊ณผ์ •์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ „ ๊ณผ์ •์„ ์ˆ˜๋ฃŒํ•˜๋Š” ์ˆ˜๋ฃŒ์œจ์€ ์ „์ฒด ์ธ์›์˜ 10~20%๊ฐ€ ์ฑ„ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ฒˆ ๊ธฐ์ˆ˜์—์„œ๋„ 120~130๋ช… ์ •๋„๊ฐ€ ์ฐธ๊ฐ€ํ–ˆ์ง€๋งŒ, 6/1์ผ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ์ˆ˜๋ฃŒํ•œ ์ธ์›์€ 10๋ช… ๋‚จ์ง“์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
 

๋ฏธ์…˜

๋‚ด๊ฐ€ ์ง„ํ–‰ํ•œ ๋ชจ๋“  ๋ฏธ์…˜์˜ PR๊ณผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ๋ฐฐ์› ๋˜ ์ ์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ž๋™์ฐจ ๊ฒฝ์ฃผ - ๋‹จ์œ„ํ…Œ์ŠคํŠธ

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

  1. ํ•œ ๋ฉ”์„œ๋“œ์— ์˜ค์ง ํ•œ ๋‹จ๊ณ„์˜ ๋“ค์—ฌ ์“ฐ๊ธฐ๋งŒ ํ•œ๋‹ค.
  2. else ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ๋ฉ”์„œ๋“œ์˜ ๋ผ์ธ ์ˆ˜๊ฐ€ 15๋ผ์ธ์„ ๋„˜์–ด๊ฐ€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์„ ํ†ตํ•ด ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๊ธ‰์ปฌ๋ ‰์…˜๊ณผ ์ „๋žตํŒจํ„ด์˜ ํ™œ์šฉ์— ๋Œ€ํ•ด์„œ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋กœ๋˜ - TDD

๋กœ๋˜๋ฏธ์…˜์˜ 2,3,4๋‹จ๊ณ„๋Š” ์ด์ „์˜ ์ž๋™์ฐจ ๊ฒฝ์ฃผ์™€ ๋น„์Šทํ•˜๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๊ณ , ์ƒˆ๋กœ์šด ๊ฑธ ์ตํžˆ๊ธฐ๋ณด๋‹ค๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ํ•™์Šตํ•œ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ์™€ ์ผ๊ธ‰์ปฌ๋ ‰์…˜, ์ „๋žตํŒจํ„ด, ๋‹จ์œ„ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ•œ๋ฒˆ ๋” ์‹ค์Šต์„ ํ•ด๋ด„์œผ๋กœ์จ  ์ž˜ ๊ฐˆ๋ฌด๋ฆฌ์‹œํ‚ค๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ํ–ˆ๋‹ค.

๋กœ๋˜ ๋ฏธ์…˜์—์„œ ๊ฐ€์žฅ ๊ธฐ์–ต์— ๋‚จ๋Š” ๋ฏธ์…˜์€ "1๋‹จ๊ณ„ - ๋ฌธ์ž์—ด ๊ณ„์‚ฐ๊ธฐ"๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์€ ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด ๊ฐ’์— ๋”ฐ๋ผ ์‚ฌ์น™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๊ฒŒ ๋“ค์—ฌ ์“ฐ๊ธฐ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ•ด์•ผ ํ•˜๊ณ , else๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์—(๋‹น์—ฐํžˆ switch๋„ ์•ˆ๋˜๊ณ , ๊ทธ๋ ‡๋‹ค๊ณ  if ๋–ก์น ๋„ ์•ˆ๋œ๋‹ค.) ์กฐ๊ธˆ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

package domain;

import java.util.Arrays;
import java.util.function.BiFunction;

public enum Operator {
    PLUS("+", (num1, num2) -> Integer.valueOf(num1 + num2)),
    MINUS("-", (num1, num2) -> Integer.valueOf(num1 - num2)),
    MULTIPLY("*", (num1, num2) -> Integer.valueOf(num1 * num2)),
    DIVIDE("/", (num1, num2) -> Integer.valueOf(num1 / num2));

    private final String operator;
    private final BiFunction<Integer, Integer, Integer> calculator;

    Operator(String symbol, BiFunction<Integer, Integer, Integer> calculator) {
        this.operator = symbol;
        this.calculator = calculator;
    }

    public String getOperator() {
        return operator;
    }

    public static Integer calculator(String operator, Integer num1, Integer num2) {
        return getOperator(operator).calculator.apply(num1, num2);
    }

    private static Operator getOperator(String operator) {
        return Arrays.stream(values())
                .filter(o -> o.operator.equals(operator))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("์‚ฌ์น™ ์—ฐ์‚ฐ ๊ธฐํ˜ธ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."));
    }
}

์ด๊ฑด ์‚ฌ์น™์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•œ ๋‚ด ์ฝ”๋“œ์ด๊ณ , Enum๊ณผ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.  BiFunction์€ ์‚ฌ๋‚ด์—์„œ๋„ ์ž์ฃผ ๋ณด์ด๋Š” ์ฝ”๋“œ๋“ค์ด๋ผ ์ต์ˆ™ํ–ˆ๋Š”๋ฐ, Enum์€ ์Šค์Šค๋กœ๋„ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ์ค„์€ ๋ชฐ๋ž๋‹ค. ๊ตฌํ˜„ํ•˜๋ฉด์„œ๋„ ๋†€๋ž๊ณ , ์•ž์œผ๋กœ๋„ ๊พธ์ค€ํžˆ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๊ณ„์†ํ•ด์„œ ํ•™์Šตํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ๋‹ค๋ฆฌํƒ€๊ธฐ - FP, OOP

์‚ฌ๋‹ค๋ฆฌํƒ€๊ธฐ์˜ ๋ฏธ์…˜์„ ํ†ตํ•ด์„œ๋Š” ํฌ๊ฒŒ ์•„๋ž˜์˜ ์„ธ ๊ฐ€์ง€๋ฅผ ํ•™์Šต์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

  1. ํฌ๊ฒŒ ์ŠคํŠธ๋ฆผ, ๋žŒ๋‹ค๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒฝํ—˜
  2. In -> Out, Out -> In ๋ฐฉ์‹์œผ๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒฝํ—˜
  3. ์ฑ…์ž„์ฃผ๋„์„ค๊ณ„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ์—ฐ์Šต

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๋ฏธ์…˜์— ์ถ”๊ฐ€๋กœ ์ง€์ผœ์•ผ ํ•  ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ ์›์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์ง€ํ‚จ๋‹ค.
  • ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
  • 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฒŒํ„ฐ/์„ธํ„ฐ/ํ”„๋กœํผํ‹ฐ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

๋‚˜๋Š” ์ด ์ค‘์—์„œ ์„ธ ๋ฒˆ์งธ "3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค." ์ด๊ฒŒ ๊ต‰์žฅํžˆ ์–ด๋ ค์› ๋‹ค. 3๊ฐœ ์ด์ƒ์ด๋ž€ ๋ง์€ ๋‘ ๊ฐœ๊นŒ์ง€๋งŒ ์จ์•ผ ํ•œ๋‹ค๋Š” ๋ง์ด์—ˆ๊ณ , ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ๋”ฑ ์„ธ ๊ฐœ๊นŒ์ง€๋งŒ ์“ฐ๋ฉด ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ ๋‘ ๊ฐœ๊นŒ์ง€๋งŒ ์จ์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๊ตฌํ˜„ํ•˜๊ธฐ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค.

public class LadderResults {
    private final Map<Participant, LadderResult> ladderResults;

    public LadderResults(Map<Participant, LadderResult> ladderResults) {
        this.ladderResults = ladderResults;
    }

    public LadderResult getResultForParticipant(Participant participant) {
        return Optional.ofNullable(ladderResults.get(participant))
                .orElseThrow(() -> new IllegalArgumentException(participant.getName() + " ์ฐธ๊ฐ€์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."));
    }

    public Map<Participant, LadderResult> getAllResults() {
        return ladderResults;
    }

}

๋‹น์žฅ์— ์ฝ”๋“œ๋งŒ ๋ด์„œ๋Š” ๋‚ด๊ฐ€ ๋งํ•œ ๋‚ด์šฉ์ด ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๊ฒ ์ง€๋งŒ, ์ตœ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ , ์ผ๊ธ‰์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฌถ๊ณ , ๊ทธ๊ฑธ ๋˜ Map์œผ๋กœ ๋ฌถ๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค.
 

์ˆ˜๊ฐ•์‹ ์ฒญ - ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง

์ˆ˜๊ฐ•์‹ ์ฒญ ๋ฏธ์…˜์€ ์ด๋ฒˆ 16๊ธฐ์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ฏธ์…˜์ด์—ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ํ˜„์—…์—์„œ ๋งˆ์ฃผ์น  ๋ฒ•ํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์กŒ๊ณ , ์ด๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ํ•™์Šตํ•œ TDD, OOP, ํด๋ฆฐ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ์…˜์˜ ๋ชฉํ‘œ์˜€๋‹ค.

์ฒซ ๋ฏธ์…˜์ด๋‹ค ๋ณด๋‹ˆ, ์ฐธ๊ณ ํ•  ๋ ˆํผ๋„ ์—†์—ˆ๊ณ  ๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ ๋‚œ์ด๋„๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋†’์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ํŠนํžˆ๋‚˜ ๋ฏธ์…˜์˜ ์ฝ”๋“œ๋Š” jdbcTemplate์˜€๊ธฐ ๋•Œ๋ฌธ์— JPA๊ธฐ๋ฐ˜์˜ ๋„๋ฉ”์ธ ์„ค๊ณ„์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•ด ์˜ค๋Š”๋ฐ ์ต์ˆ™ํ–ˆ๋˜ ๋‚˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ๋„ ์ฝ”๋“œ์— ์ •๋‹ต์€ ์—†๋‹ค์ง€๋งŒ ์ด๊ฒŒ ๊ณผ์—ฐ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์ผ๊นŒ?๋ผ๋Š” ์˜๋ฌธ์ ์ด ๊ณ„์† ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋„ ๊ฐ€์žฅ ๋งŽ์€ ๋ฆฌ๋ทฐ ํ•‘ํ์ด ์˜ค๊ฐ”๋˜ ๋ฏธ์…˜์ด์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋ฏธ์…˜์„ ํ†ตํ•ด์„œ ๊ทธ๋™์•ˆ ์ตํ˜”๋˜ TDD, OOP, ํด๋ฆฐ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ŠคํŠธ๋žญ๊ธ€๋Ÿฌ ํŒจํ„ด์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

์ •๋ฆฌ

ํšŒ์‚ฌ ์—…๋ฌด์™€ ํ˜„์žฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๋™์•„๋ฆฌ์ธ ๋””ํ”„๋งŒ๊นŒ์ง€ ๊ฐ™์ด ๋ณ‘ํ–‰ํ•ด์•ผ ํ–ˆ๊ธฐ์— ๋ฏธ์…˜ ๊ธฐ๊ฐ„์ธ ๋‘ ๋‹ฌ ๋™์•ˆ ๋งค์šฐ ๋ฐ”์˜๊ฒŒ ์‚ด์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฉ˜ํ† ๋“ค๋„ ํ˜„์ง์ž์ด๊ธฐ์— ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ PR ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ์—ˆ๊ณ , ๊ทธ๋ ‡๊ธฐ์— ํ•˜๋‚˜์˜ PR์— 2~3๋ฒˆ์˜ ๋ฆฌ๋ทฐ๊ฐ€ ์˜ค๊ฐ„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ์‰ฌ๋Š” ๋‚  ์—†์ด PR์„ ์˜ฌ๋ฆฌ๊ณ , ์ˆ˜์ •ํ•˜๊ณ  ์žฌ PR ํ•˜๊ณ  ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ์ˆ˜๋ฃŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌํ•˜ํŠผ ๋ญ ๋ฐค์ž ์„ ์ค„์—ฌ ๋‘ ๋‹ฌ ๋™์•ˆ ๋งค์ผ 6์‹œ๊ฐ„ ๋ฏธ๋งŒ์œผ๋กœ ์ž ์„ ์ž๋ฉฐ ์—ฌ์ž์ €์ฐจ ๊ณผ์ •์„ ์ˆ˜๋ฃŒํ–ˆ๋‹ค.

TDD, Clean Code with Java ๊ณผ์ •์„ ํ†ตํ•ด ๋‚˜์˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์ด ์ด์ „๊ณผ๋Š” ํ™•์—ฐํ•˜๊ฒŒ ๋‹ฌ๋ผ์กŒ๊ณ , ๋งค์šฐ ๊ฐœ์„ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์šด ์ ์„ ํ† ๋Œ€๋กœ ์ฝ”๋“œ์ž‘์„ฑ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋”์šฑ๋” ์ž์‹ ๊ฐ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ํ˜น์‹œ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜์—๊ฒŒ ์ด ๊ฐ•์˜๊ฐ€ ์–ด๋–ป๋ƒ๊ณ  ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด 1~3๋…„ ์ฐจ์˜ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ๊ผญ ์ˆ˜๊ฐ•ํ•ด ๋ณด๋ผ๊ณ  ๊ถŒํ•˜๊ณ  ์‹ถ๋‹ค.