diff --git a/.gitignore b/.gitignore index 0d49887..62c25aa 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,5 @@ out/ ### VS Code ### .vscode/ -secret \ No newline at end of file +secret +.obsidian \ No newline at end of file diff --git a/docs/footprint/week2/README.md b/docs/footprint/week2/README.md index 077c23c..0dfab51 100644 --- a/docs/footprint/week2/README.md +++ b/docs/footprint/week2/README.md @@ -1,170 +1,472 @@ # ๋ฐœ์ž๊ตญ - Week2 -## ๐Ÿ’ก ์ž๊ธฐ๋งŒ์˜ ์–ธ์–ด๋กœ ํ‚ค์›Œ๋“œ ์ •๋ฆฌํ•˜๊ธฐ +## ๐Ÿ™Š ์‹œ์ž‘์ด ๋ฐ˜์ด๋‹ค... ๋ฒŒ์จ ์ค‘๊ฐ„์ ๊ฒ€ ? + +์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ์ด ์‹œ์ž‘ํ•œ์ง€ 2์ฃผ๊ฐ€ ์ง€๋‚ฌ๋‹ค.. ์•ž์œผ๋กœ ๋‚จ์€ ๋ฐœ์ž๊ตญ์ด 2๊ฐœ ๋ฟ์ด๋‹ค.. ๐Ÿ‘ฃ + +์ด๋ฒˆ์ฃผ์—๋Š” ์ค‘๊ฐ„์ ๊ฒ€์œผ๋กœ ์˜จ๋ผ์ธ ๋ผ์ด๋ธŒ๊ฐ€ ์ง„ํ–‰ ๋˜์—ˆ๋‹ค. +์˜จ๋ผ์ธ ๋ผ์ด๋ธŒ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + +- [๋ฏธ์…˜ Day 4](https://github.com/discphy/warm-up-backend-code/pull/2 ) ์— ๋Œ€ํ•œ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ +- Q&A์— ๋Œ€ํ•œ ๋‹ต๋ณ€ +- [๋ฏธ์…˜ Day 7](https://github.com/discphy/warm-up-backend-code/pull/4) ์ฝ”๋“œ๋ฆฌ๋ทฐ ์ง„ํ–‰ + +๊ฐ ์„ธ์…˜์€ ๋†€๋ผ์šธ ์ •๋„์˜ **์„ธ์‹ฌํ•œ** ์šฐ๋นˆ๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ ๋•๋ถ„์— ๋งŽ์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๊ฒŒ ๋˜์–ด ์ข‹์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. +๋‚˜๋„ **์ฒซ๋ฒˆ์งธ**๋กœ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์‹ ์ฒญํ•˜๊ณ  ๋ผ์ด๋ธŒ **๋งˆ์ง€๋ง‰**์— ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋Š”๋ฐ ๋„ˆ๋ฌด ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค. ๐Ÿ’ช + +(์ปคํ”ผ๋ฅผ ์ข‹์•„ํ•˜์‹œ๊ธฐ๋กœ ์œ ๋ช…ํ•œ ์šฐ๋นˆ๋‹˜๊ป˜ Q&A ์„ธ์…˜ ๋„์ค‘ ์ €๊ฐ€ ์ปคํ”ผ ๋ธŒ๋žœ๋“œ ์ค‘ ์–ด๋”” ๋ธŒ๋žœ๋“œ๊ฐ€ ์ œ์ผ ๋ง›์žˆ๋ƒ๋Š” ์งˆ๋ฌธ์ด ๋‚˜์™”๋Š”๋ฐ.. ๋“œ์…” ๋ณด์‹  ์ ์ด ์—†๋‹ค๊ณ  ๋‹ต๋ณ€ํ•ด ์ฃผ์‹  ๋ถ€๋ถ„์ด ์ธ์ƒ์ ์ด์—ˆ๋‹ค.. ใ…‹ใ…‹ ๐Ÿ˜) + +![img_7.png](img_7.png) + +## โœจ ์šฐ๋นˆ๋‹˜์˜ ์„ธ์‹ฌํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ + +์œ„์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ์ด ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ฒซ๋ฒˆ์งธ๋กœ ์‹ ์ฒญํ•ด์„œ ์šฐ๋นˆ๋‹˜๊ป˜ ์˜จ๋ผ์ธ ๋ผ์ด๋ธŒ ์‹œ๊ฐ„์— ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค. + +ํ•ด๋‹น ๋ฏธ์…˜์€ **"์Šคํ„ฐ๋”” ์นดํŽ˜"** ํ”„๋กœ๊ทธ๋žจ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฏธ์…˜์ด์˜€๋Š”๋ฐ.. +์ž‘๋…„ 4๋ถ„๊ธฐ์— ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ–ˆ์„ ๋‹น์‹œ์— **3๋ฒˆ**์ด๋‚˜ ์ง„ํ–‰ํ•˜์˜€๋‹ค. + +- ์ฒซ ๋ฒˆ์งธ ๋ฆฌํŒฉํ† ๋ง, ๊ฐ•์˜๋ฅผ ๋“ฃ๊ธฐ ์ „์— ๋ฆฌํŒฉํ† ๋ง +- ๋‘ ๋ฒˆ์งธ ๋ฆฌํŒฉํ† ๋ง, ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ ๋ฆฌํŒฉํ† ๋ง +- ์„ธ ๋ฒˆ์งธ ๋ฆฌํŒฉํ† ๋ง, ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ• ํ›„ ์ •๋ฆฌํ•˜๋ฉฐ ๋‹ค์‹œ ๋ฆฌํŒฉํ† ๋ง + +์ด๋ฒˆ์ด **๋„ค ๋ฒˆ์งธ ๋ฆฌํŒฉํ† ๋ง**์ด์˜€๋Š”๋ฐ ํ•  ๋•Œ๋งˆ๋‹ค ์™œ ์ƒˆ๋กœ์šด ๊ฒƒ์ธ์ง€.. ๐Ÿฅฒ + +๊ทธ๋ž˜๋„ ์†์ด ๊ธฐ์–ต์ด๋ผ๋„ ํ•œ ๋“ฏ ๋‚˜๋ฆ„ ~~์ˆœ์กฐ๋กญ๊ฒŒ(?)~~ ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•˜์˜€๊ณ  ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์–ด ์‹ ์ฒญํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. + +(์šฐ๋นˆ๋‹˜๊ป˜์„œ 4๋ฒˆ์ด๋ผ๋Š” ๋ถ€๋ถ„์— ๋†€๋ผ์…จ๋Š”์ง€(?).. ๋””์Šค์ฝ”๋“œ ์Šค๋ ˆ๋“œ์— ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์…จ๋‹ค! ๐Ÿคฃ) + +![img_8.png](img_8.png) + +๋‹ค์‹œ ๋Œ์•„์™€์„œ.. ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ›์€ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. + +### 1๏ธโƒฃ ์ค‘์š” ๋„๋ฉ”์ธ StudyCafePassType์˜ ๊ตฌ์กฐํ™” + +**๐Ÿ”— Github PR ๋งํฌ** +[StudyCafePassType ๊ตฌ์กฐํ™” ๋ฆฌํŒฉํ† ๋ง](https://github.com/discphy/warm-up-backend-code/pull/4/files/212a43697bba43f87fe5c261d5fdc45bac93820b#diff-0441ab7ce9642ae6396303d893115c8cd948578e5b0ca8dcbeaaf5b3994849ad) + +**โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ** +```java +public enum StudyCafePassType implements PassTypeSelectable, PassTypeFormatter { // ๐Ÿ“ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์กฐํ™” + + HOURLY("์‹œ๊ฐ„ ๋‹จ์œ„ ์ด์šฉ๊ถŒ") { + // ๐Ÿ“ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๊ตฌ์กฐํ™” + @Override + public boolean selected(String userInput) { + return "1".equals(userInput); + } + + // ๐Ÿ“ ์‚ฌ์šฉ์ž ์ถœ๋ ฅ ํฌ๋งท์— ๋Œ€ํ•œ ๊ตฌ์กฐํ™” + @Override + public String format(StudyCafePass pass) { + return String.format("%s์‹œ๊ฐ„๊ถŒ - %d์›", pass.getDuration(), pass.getPrice()); + } + } +} +``` + +**โœ ์šฐ๋นˆ๋‹˜ ๋ฆฌ๋ทฐ** +``` +Q. ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ์žย ์ž…๋ ฅ๊ฐ’ย ๋ฐย ์ถœ๋ ฅ๊ฐ’์— ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์ด ๋œ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“œ๋„ค์š”.. ๐Ÿคฆโ€โ™‚๏ธ + +A. ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด์š”.. ใ…‹ใ…‹ใ…‹ใ…‹ + +์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์ด๊ธฐ๋ณด๋‹ค PassType์€ ์ค‘์š”ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ธ๋ฐ, Input์—์„œ๋งŒ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์‚ฌ์šฉ์ž ์„ ํƒ์ง€๊ฐ€ ์นจํˆฌํ•˜๊ณ  ์žˆ๋‹ค. + +์‚ฌ์šฉ์ž ์„ ํƒ ๋ฐฉ๋ฒ•์ด "a", "b", "c"๋กœ ๋ฐ”๋€๋‹ค๋ฉด? ๋‹จ์ˆœํžˆ ์ž…๋ ฅ ๋ฐฉ์‹์„ ๋ฐ”๊ฟจ์„ ๋ฟ์ธ๋ฐ ๋ฌด๋ฃŒ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ์—„์ฒญ๋‚œ ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + +ํ•ญ์ƒ ๊ตฌ์กฐํ™”๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ •๋‹ต์€ ์•„๋‹ˆ๋‹ค. +Output format๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. + +์ฑ…์ž„์ด ์šฐ์„ ์ด๋‹ค. ์ ์ ˆํ•œ ์ฑ…์ž„์˜ ๋ถ„๋ฐฐ๊ฐ€ ๊ฐ์ฒด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์ด๋‹ค. +``` + +**๐Ÿค” ๋Œ์•„๋ณด๊ธฐ** + +๋‹จ์ˆœํžˆ, OCP๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง ํ–ˆ์—ˆ๋Š”๋ฐ.. + +์ ์ ˆํ•œ ๊ฐ์ฒด ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ํ•˜์ง€ ๋ชปํ–ˆ์œผ๋ฉฐ, +์ค‘์š”ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜๋Š” ์—„์ฒญ ํฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ„๊ณผ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. + +๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ตฌ์กฐํ™”๋ฅผ ๋‚จ๋ฐœํ•˜์ง€ ์•Š๊ณ  ์ฑ…์ž„์— ์ง‘์ค‘ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ๊ฒ ๋‹ค.. + +### 2๏ธโƒฃ ์ด์šฉ๊ถŒ์„ ์ฝ๋Š” ๋ถ€๋ถ„๊ณผ ์ฝ์€ ๋ถ€๋ถ„์˜ ๊ฐœ๋…์„ ์ถ”์ถœํ•˜์—ฌ ๊ฐ์ฒด ๋ถ„๋ฆฌ + +**๐Ÿ”— Github PR ๋งํฌ** +[ReadLockerPasses ๊ฐ์ฒด ๋ถ„๋ฆฌ](https://github.com/discphy/warm-up-backend-code/pull/4/files/212a43697bba43f87fe5c261d5fdc45bac93820b#diff-12130d87be6cae7cda34dcc1413657f39dceb5be55609d767ef700037058c346) + +**โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ** +```java +public class ReadLockerPasses { // ๐Ÿ“ LockerPasses๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ฐ์ฒด ๋ถ„๋ฆฌ + + private final List passes; + + private ReadLockerPasses(List passes) { + this.passes = passes; + } + + // ๐Ÿ“ lines์„ ํ•ด์„ํ•˜์—ฌ List ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. + public static ReadLockerPasses ofLines(List lines) { + List passes = lines.stream() + .map(ReadLockerPasses::ofLine) + .toList(); + + return new ReadLockerPasses(passes); + } + + private static StudyCafeLockerPass ofLine(String line) { + String[] values = line.split(CSV_SPLITTER); // โญ๏ธ CSV๋ผ๋Š” ๋ฐฉ์‹์— ์ข…์†์  + + StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); + int duration = Integer.parseInt(values[1]); + int price = Integer.parseInt(values[2]); + + return StudyCafeLockerPass.of(studyCafePassType, duration, price); + } + + // ๐Ÿ“ StudyCafeLockerPasses๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. + public StudyCafeLockerPasses toPasses() { + return StudyCafeLockerPasses.of(passes); + } +} +``` + +**โœ ์šฐ๋นˆ๋‹˜ ๋ฆฌ๋ทฐ** +``` +Q. ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด toPasses() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ +Read~๋ผ๋Š” ๋„ค์ด๋ฐ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์— ๋งŽ์€ ์ฑ…์ž„์ด ๋ถ€์—ฌ๋œ ๊ฒƒ ๊ฐ™์•„ ๋„ค์ด๋ฐ์ด ๋ชจํ˜ธํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. + +์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”..? ๐Ÿง + +A. ๋งŽ์€ ์ฑ…์ž„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”? + +"ReadLockerPasses๋Š” ์–ด๋””์„ ๊ฐ€ ์ฝ์€ lines๋ฅผ ๊ฐ€์ง€๊ณ  StudyCafeLockerPasses๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค"์˜ ์ฑ…์ž„์œผ๋กœ ๋ณด์—ฌ์„œ, ์–ด์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. + +๊ทธ์™€ ๋ณ„๊ฐœ๋กœ CSV๋ผ๋Š” ๋ฐฉ์‹์— ์ข…์†๋˜์–ด์žˆ๋‹ค. CSVํ˜•์‹์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๊ฐ™์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด CSV_SPLITTER ๋ถ€๋ถ„์ด๋‹ค. ์˜๋„ํ•œ ๊ฒƒ ์ด๋ผ๋ฉด ์ƒ๊ด€์—†๋‹ค. +``` + +**๐Ÿค” ๋Œ์•„๋ณด๊ธฐ** + +`Read`๋ผ๋Š” ํด๋ž˜์Šค๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด `StudyCafeLockerPasses`๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ด ๋งŽ์€ ์ฑ…์ž„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ.. +์šฐ๋นˆ๋‹˜ ๋ฆฌ๋ทฐ ์ดํ›„์— ๋‹ค์‹œ ๋ณด๋‹ˆ.. ๊ทธ๋ ‡๊ฒŒ ์–ด์ƒ‰ํ•œ๊ฐ€ ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค.. ใ…Žใ…Ž + +ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ž‘์„ฑ ๋‹น์‹œ CSV ๋ฐฉ์‹์„ ์˜์กดํ•˜๋ ค๋Š” ์˜๋„๋Š” ์—†์—ˆ๋‹ค. +๋‹จ์ˆœํžˆ **์ฝ์€** ๋ถ€๋ถ„์˜ ๊ฐœ๋…์„ ์ถ”์ถœํ•œ ๊ฒƒ์ธ๋ฐ.. ์œ„์˜ ํด๋ž˜์Šค๋Š” `CSV_SPLITTER`์ƒ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์–ด ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ CSV๋ผ๋Š” ๋ฐฉ์‹์— ์ข…์†์ ์ด๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. + +CSV๋ผ๋Š” ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ์ฒด ๋กœ์ง์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค. + +๊ฐ์ฒด ๊ตฌํ˜„ ์‹œ, ์ข…์†์„ฑ์— ๋Œ€ํ•ด์„œ ๋ฐฉ์–ด์ ์œผ๋กœ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ธ๋‹ค. + +### 3๏ธโƒฃ ProvideException ์ปค์Šคํ…€ ์˜ˆ์™ธ + +**๐Ÿ”— Github PR ๋งํฌ** +[ProvideException ์ปค์Šคํ…€ ์˜ˆ์™ธ](https://github.com/discphy/warm-up-backend-code/pull/4/files/212a43697bba43f87fe5c261d5fdc45bac93820b#diff-7e98a3b1f2509ce92ca9f34063ed3c36466059f00fdba491e144e7509e5d3f8c) + +**โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ** +```java +// ๐Ÿ“ ์ด์šฉ๊ถŒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ์ƒ๊ธด ์—๋Ÿฌ์˜ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค ์ƒ์„ฑ +public class ProvideException extends RuntimeException { + + public ProvideException(String message) { + super(message); + } +} + +public class StudyCafePassMachine { + + public void run() { + try { + outputHandler.showPassOrderSummary(order); + } catch (AppException e) { + outputHandler.showSimpleMessage(e.getMessage()); + } catch (ProvideException e) { + // ๐Ÿ“ ์ปค์Šคํ…€ ์˜ˆ์™ธ catch + outputHandler.showSimpleMessage("์ด์šฉ๊ถŒ์„ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } catch (Exception e) { + outputHandler.showSimpleMessage("์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."); + } + } +} +``` + +**โœ ์šฐ๋นˆ๋‹˜ ๋ฆฌ๋ทฐ** +``` +Q. AppException ์„ฑ๊ฒฉ์ด๋ž‘ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด Provider ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค ProvideException๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. + +A. ํ˜น์‹œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐ์…จ๋‚˜์š”?? + +AppException์˜ ์˜๋„๋Š”, ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํ™ฉ์„ ์ •์˜ํ•˜๋Š” ์ตœ์ƒ์œ„ ์˜ˆ์™ธ ํด๋ž˜์Šค์ด๋‹ค. + +๋งŒ์•ฝ ProvideException์„ ๋ณ„๋„๋กœ ํ‘œ๊ธฐํ•˜์—ฌ ๋” ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์œผ๋ฉด, AppException์„ ์ƒ์†๋ฐ›์•„์„œ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค. + +๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ catch์ ˆ๋„ ๊ฐ™์ด ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค. + +์ถ”๊ฐ€์ ์œผ๋กœ, "์ด์šฉ๊ถŒ์„ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด์ง€ ์•Š๋‹ค. +``` + +**๐Ÿค” ๋Œ์•„๋ณด๊ธฐ** + +๋ฆฌํŒฉํ† ๋ง ๋‹น์‹œ, ์ดˆ๊ธฐ ์ด์šฉ๊ถŒ์„ ๊ฐ€์ ธ์™€์•ผ๋งŒ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ด€์ ์—์„œ `ProvideException`์˜ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. + +ํ•˜์ง€๋งŒ ์ด์šฉ๊ถŒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ํ•„์š”ํ•œ ์‹œ์ ๋งˆ๋‹ค ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์–ด +์šฐ๋นˆ๋‹˜ ๋ฆฌ๋ทฐ๋Œ€๋กœ `AppException` ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์„ค๊ณ„ ๊ฐ™๋‹ค. + +์˜ˆ์™ธ ๋ฉ”์„ธ์ง€๋„ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ๋Š” ์นœํ™”์ ์ด์ง€ ์•Š์€ ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋‹ค. +๋‚ด๊ฐ€ ํ‚ค์˜ค์Šคํฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ €๋Ÿฐ ๋ฉ”์„ธ์ง€๋ฅผ ๋งˆ์ฃผํ•œ๋‹ค๋ฉด... ํ™”๊ฐ€ ๋‚  ๊ฒƒ ์ด๋‹ค... ๐Ÿ˜ก + +ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋„๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ธ๋‹ค. ๋˜ํ•œ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€๋„ ๋ˆ„๊ฐ€ ๋ณด๋Š”์ง€์— ๋”ฐ๋ผ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ์•ผ๊ฒ ๋‹ค. + +--- + +์ด๋ ‡๊ฒŒ, ์š”์ฒญํ•œ 3๊ฐœ์˜ ๋ฆฌ๋ทฐ์™€ 2๊ฐœ์˜ ์ถ”๊ฐ€ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„ ๋ณด์•˜๋‹ค.. +๊ณ ์ž‘ 3์ผ ๋งŒ์— 7๋ช…์ด๋‚˜ ๋ฆฌ๋ทฐ๋ฅผ ํ•ด์ฃผ์…จ๋Š”๋ฐ ์„ธ์‹ฌํ•˜๊ณ  ๋˜ ์„ธ์‹ฌํ–ˆ๋‹ค... ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์ƒ๋‹นํ–ˆ๋‹ค.. โœจ + +์ด๋ฒˆ ์˜จ๋ผ์ธ ๋ผ์ด๋ธŒ๋ฅผ ํ†ตํ•ด ์šฐ๋นˆ๋‹˜์— ๋Œ€ํ•œ ํŒฌ์‹ฌ๊ณผ ์กด๊ฒฝ์‹ฌ์ด ๋”์šฑ ์ปค์กŒ๋‹ค....! ๐Ÿ“ˆ +๋ฆฌ๋ทฐํ•ด์ฃผ์‹  ๋‚ด์šฉ์œผ๋กœ ๋‹ค์‹œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•จ์œผ๋กœ์จ ํ•œ์ธต ๋” Readable Code์— ๋Œ€ํ•œ ์„ฑ์žฅ์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๐Ÿš€ + +![img_11.png](img_11.png) + +## ๐Ÿ’ก ์ž๊ธฐ๋งŒ์˜ ์–ธ์–ด๋กœ ๊ฐ•์˜ ํ‚ค์›Œ๋“œ ์ •๋ฆฌํ•˜๊ธฐ ### ์„น์…˜ 6. ์ฝ”๋“œ ๋‹ค๋“ฌ๊ธฐ -+ ์ข‹์€ ์ฃผ์„ - ์ฃผ์„์˜ ์–‘๋ฉด์„ฑ - + ์ฃผ์„์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ : ์ถ”์ƒํ™”๊ฐ€ ๋œ ๋˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š์€ ์ฝ”๋“œ (์ฝ”๋“œ ํ’ˆ์งˆ ์ €ํ•˜ ๐Ÿ“‰) - + ์ฃผ์„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ : ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ, ์ฃผ์„์œผ๋กœ ์ƒ์„ธํžˆ ์„ค๋ช… +**์ข‹์€ ์ฃผ์„ - ์ฃผ์„์˜ ์–‘๋ฉด์„ฑ** ++ ์ฃผ์„์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ : ์ถ”์ƒํ™”๊ฐ€ ๋œ ๋˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š์€ ์ฝ”๋“œ (์ฝ”๋“œ ํ’ˆ์งˆ ์ €ํ•˜ ๐Ÿ“‰) ++ ์ฃผ์„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ : ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ, ์ฃผ์„์œผ๋กœ ์ƒ์„ธํžˆ ์„ค๋ช… -+ ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ ๋‚˜์—ด ์ˆœ์„œ - + ๋ณ€์ˆ˜ : ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์œ„์น˜ํ•œ๋‹ค. (์ธ์ง€์  ๊ฒฝ์ œ์„ฑ / ๋‡Œ ๋ฉ”๋ชจ๋ฆฌ ์ค„์ด๊ธฐ) - + ๊ฐ์ฒด์˜ ๊ณต๊ฐœ/๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ณ , ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ ํ•˜๋‹จ์— ์œ„์น˜ํ•œ๋‹ค. ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ ์ค‘์—์„œ๋„ ์ค‘์š”๋„์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐฐ์น˜ํ•œ๋‹ค. - + ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋„๋ก - ์ƒํƒœ ๋ณ€๊ฒฝ >>> ํŒ๋ณ„ >= ์กฐํšŒ - + ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ์ถœํ˜„ํ•œ ์ˆœ์„œ๋Œ€๋กœ +**๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ ๋‚˜์—ด ์ˆœ์„œ** ++ ๋ณ€์ˆ˜ : ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์œ„์น˜ํ•œ๋‹ค. (์ธ์ง€์  ๊ฒฝ์ œ์„ฑ / ๋‡Œ ๋ฉ”๋ชจ๋ฆฌ ์ค„์ด๊ธฐ) ++ ๊ฐ์ฒด์˜ ๊ณต๊ฐœ/๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ณ , ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ ํ•˜๋‹จ์— ์œ„์น˜ํ•œ๋‹ค. ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ ์ค‘์—์„œ๋„ ์ค‘์š”๋„์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐฐ์น˜ํ•œ๋‹ค. + + ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋„๋ก - ์ƒํƒœ ๋ณ€๊ฒฝ >>> ํŒ๋ณ„ >= ์กฐํšŒ + + ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ : ์ถœํ˜„ํ•œ ์ˆœ์„œ๋Œ€๋กœ -+ ํŒจํ‚ค์ง€ ๋‚˜๋ˆ„๊ธฐ : ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ์ˆ˜์ค€์œผ๋กœ ์ž˜ ๋‚˜๋ˆ„์–ด์•ผ ํ•œ๋‹ค. - + ๋Œ€๊ทœ๋ชจ ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ์€ ํŒ€์›๊ณผ์˜ ํ•ฉ์˜ ํ•„์š” : ์ถ”ํ›„ conflict๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. +**ํŒจํ‚ค์ง€ ๋‚˜๋ˆ„๊ธฐ** ++ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ์ˆ˜์ค€์œผ๋กœ ์ž˜ ๋‚˜๋ˆ„์–ด์•ผ ํ•œ๋‹ค. ++ ๋Œ€๊ทœ๋ชจ ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ์€ ํŒ€์›๊ณผ์˜ ํ•ฉ์˜ ํ•„์š” -> ์ถ”ํ›„ conflict๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. -+ ๊ธฐ๋Šฅ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ +**๊ธฐ๋Šฅ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ** -+ ์ •๋ ฌ ๋‹จ์ถ•ํ‚ค, linting, style - sonarlint, editorconfig +**์ •๋ ฌ ๋‹จ์ถ•ํ‚ค, linting, style - sonarlint, editorconfig** ![img.png](img.png) ### ์„น์…˜ 7. ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šต -+ ๋ฉ”์„œ๋“œ ์ถ”์ถœ๋กœ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ ๋งž์ถ”๊ธฐ +**๋ฉ”์„œ๋“œ ์ถ”์ถœ๋กœ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ ๋งž์ถ”๊ธฐ** -+ Optional - + return null / Optional ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ์€ ์•ˆํ‹ฐํŒจํ„ด์ด๋‹ค. +**Optional** ++ return null / Optional ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ์€ ์•ˆํ‹ฐํŒจํ„ด์ด๋‹ค. -+ ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ - + ๊ฐ์ฒด๋ฅผ ์กด์ค‘ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ž. +**๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ** ++ ๊ฐ์ฒด๋ฅผ ์กด์ค‘ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ž. -+ ๊ฐ์ฒด์˜ ์ฑ…์ž„๊ณผ ์‘์ง‘๋„ - IO ํ†ตํ•ฉ, ์ผ๊ธ‰์ปฌ๋ ‰์…˜, display(), Order ์ถ”์ถœ +**๊ฐ์ฒด์˜ ์ฑ…์ž„๊ณผ ์‘์ง‘๋„** -+ โญ๏ธ ์ถ”์ƒํ™” ๊ด€์ ์˜ ์ฐจ์ด - FileHandler - + ๊ตฌํ˜„์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ถ”์ƒํ™” VS ๋„๋ฉ”์ธ ๊ฐœ๋…์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ถ”์ƒํ™” - + File์„ read ํ•˜๋Š” ๋ถ€๋ถ„์˜ ๋กœ์ง๋“ค์€ ์ „๋ถ€ FileHandler์— ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค. ์ž˜๋ชป๋œ ๊ฐ์ฒด ์‘์ง‘์ผ ์ˆ˜๋„ ์žˆ๋‹ค.. - + ๋ฐฉ๋ฒ•์— ์ดˆ์ ์„ ๋งž์ถ˜ ์„ค๊ณ„ ๋ฐฉ์‹์ด ์•„๋‹Œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ€์— ๋Œ€ํ•œ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. +**โญ๏ธ ์ถ”์ƒํ™” ๊ด€์ ์˜ ์ฐจ์ด - FileHandler** ++ ๊ตฌํ˜„์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ถ”์ƒํ™” VS ๋„๋ฉ”์ธ ๊ฐœ๋…์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ถ”์ƒํ™” ++ File์„ readํ•˜๋Š” ๋ถ€๋ถ„์˜ ๋กœ์ง๋“ค์€ ์ „๋ถ€ FileHandler์— ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค. ์ž˜๋ชป๋œ ๊ฐ์ฒด ์‘์ง‘์ผ ์ˆ˜๋„ ์žˆ๋‹ค.. ++ ๋ฐฉ๋ฒ•์— ์ดˆ์ ์„ ๋งž์ถ˜ ์„ค๊ณ„ ๋ฐฉ์‹์ด ์•„๋‹Œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ€์— ๋Œ€ํ•œ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ![img_1.png](img_1.png) ### ์„น์…˜ 8. ๊ธฐ์–ตํ•˜๋ฉด ์ข‹์€ ์กฐ์–ธ๋“ค -+ ๋Šฅ๋™์  ์ฝ๊ธฐ - + ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•๋“ค์„ ์ด๋™์›ํ•ด์„œ ์ฝ์ž. -> ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด์„œ ์ฝ๊ธฐ - + ๋ˆˆ์œผ๋กœ๋งŒ ๋ณด๋Š” ์ˆ˜๋™์  ์ฝ๊ธฐ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. - + ๋„๋ฉ”์ธ ์ง€์‹์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ๋Šฅ๋™์  ์ฝ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (์ž‘์„ฑ์ž์˜ ์˜๋„ ํŒŒ์•…) - -+ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง - + ํ•„์š”ํ•œ ์ ์ • ์ˆ˜์ค€๋ณด๋‹ค ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์—”์ง€๋‹ˆ์–ด๋ง - + ์˜ˆ์‹œ 1. ๊ตฌํ˜„์ฒด๊ฐ€ ํ•˜๋‚˜์ธ ์ธํ„ฐํŽ˜์ด์Šค - + ๊ตฌํ˜„์ฒด๊ฐ€ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ - + ์ฝ”๋“œ ํƒ์ƒ‰์˜ ์–ด๋ ค์›€ - + ์˜ˆ์‹œ 2. ๋„ˆ๋ฌด ์ด๋ฅธ ์ถ”์ƒํ™” - + ์ •๋ณด๊ฐ€ ์ˆจ๊ฒจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง„๋‹ค. - + ํ›„๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์„ ๋Œ€์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. - -+ ์€ํƒ„ํ™˜์€ ์—†๋‹ค - + ํด๋ฆฐ ์ฝ”๋“œ๋„ ์€ํƒ„ํ™˜์ด ์•„๋‹ˆ๋‹ค. - + ์‹ค๋ฌด์—์„œ์˜ ์ค„๋‹ค๋ฆฌ๊ธฐ - + ์ง€์† ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ VS ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์•ˆ๊ณ  ๊ฐ€๋Š” ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฌผ -> ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ๋Œ€๋น„ํ•œ ์ฝ”๋“œ ์„ผ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. - + ๋ชจ๋“  ๊ธฐ์ˆ ๊ณผ ๋ฐฉ๋ฒ•๋ก ์€ ์ ์ • ๊ธฐ์ˆ ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. - + ํ•ญ์ƒ ์ •๋‹ต์ธ ๊ธฐ์ˆ ์€ ์—†๋‹ค. - + ํ•œ๊ณ„๊นŒ์ง€ ์—ฐ์Šตํ•ด๋ณด๊ณ , ์ ์ • ์ˆ˜์ค€, ์ ์ • ์‹œ์ ์„ ๊นจ๋‹ซ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. +**๋Šฅ๋™์  ์ฝ๊ธฐ** ++ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•๋“ค์„ ์ด๋™์›ํ•ด์„œ ์ฝ์ž. -> ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด์„œ ์ฝ๊ธฐ ++ ๋ˆˆ์œผ๋กœ๋งŒ ๋ณด๋Š” ์ˆ˜๋™์  ์ฝ๊ธฐ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ++ ๋„๋ฉ”์ธ ์ง€์‹์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ๋Šฅ๋™์  ์ฝ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (์ž‘์„ฑ์ž์˜ ์˜๋„ ํŒŒ์•…) + +**์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง** ++ ํ•„์š”ํ•œ ์ ์ • ์ˆ˜์ค€๋ณด๋‹ค ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์—”์ง€๋‹ˆ์–ด๋ง ++ ์˜ˆ์‹œ 1. ๊ตฌํ˜„์ฒด๊ฐ€ ํ•˜๋‚˜์ธ ์ธํ„ฐํŽ˜์ด์Šค + + ๊ตฌํ˜„์ฒด๊ฐ€ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ + + ์ฝ”๋“œ ํƒ์ƒ‰์˜ ์–ด๋ ค์›€ ++ ์˜ˆ์‹œ 2. ๋„ˆ๋ฌด ์ด๋ฅธ ์ถ”์ƒํ™” + + ์ •๋ณด๊ฐ€ ์ˆจ๊ฒจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง„๋‹ค. + + ํ›„๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์„ ๋Œ€์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. + +**์€ํƒ„ํ™˜์€ ์—†๋‹ค** ++ ํด๋ฆฐ ์ฝ”๋“œ๋„ ์€ํƒ„ํ™˜์ด ์•„๋‹ˆ๋‹ค. ++ ์‹ค๋ฌด์—์„œ์˜ ์ค„๋‹ค๋ฆฌ๊ธฐ + + ์ง€์† ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ VS ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์•ˆ๊ณ  ๊ฐ€๋Š” ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฌผ -> ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ๋Œ€๋น„ํ•œ ์ฝ”๋“œ ์„ผ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ++ ๋ชจ๋“  ๊ธฐ์ˆ ๊ณผ ๋ฐฉ๋ฒ•๋ก ์€ ์ ์ • ๊ธฐ์ˆ ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. ++ ํ•ญ์ƒ ์ •๋‹ต์ธ ๊ธฐ์ˆ ์€ ์—†๋‹ค. ++ ํ•œ๊ณ„๊นŒ์ง€ ์—ฐ์Šตํ•ด๋ณด๊ณ , ์ ์ • ์ˆ˜์ค€, ์ ์ • ์‹œ์ ์„ ๊นจ๋‹ซ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ![img_2.png](img_2.png) ### ์„น์…˜ 3. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ -+ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ - + **์ž‘์€** ์ฝ”๋“œ(ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ) ๋‹จ์œ„๋ฅผ **๋…๋ฆฝ์ **์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ -> ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ…Œ์ŠคํŠธ - + ๊ฒ€์ฆ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์•ˆ์ •์  +**๋‹จ์œ„ ํ…Œ์ŠคํŠธ** ++ **์ž‘์€** ์ฝ”๋“œ(ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ) ๋‹จ์œ„๋ฅผ **๋…๋ฆฝ์ **์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ -> ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ…Œ์ŠคํŠธ ++ ๊ฒ€์ฆ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์•ˆ์ •์  -+ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ, ์ž๋™ํ™” ํ…Œ์ŠคํŠธ -> ์ธ์ง€ ํ•„์š” - + ์‚ฌ๋žŒ์ด ๊ฒ€์ฆํ•˜๋Š” ์ˆ˜๋™ ํ…Œ์ŠคํŠธ - + ๊ธฐ๊ณ„๊ฐ€ ๊ฒ€์ฆํ•˜๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ +**์ˆ˜๋™ ํ…Œ์ŠคํŠธ, ์ž๋™ํ™” ํ…Œ์ŠคํŠธ -> ์ธ์ง€ ํ•„์š”** ++ ์‚ฌ๋žŒ์ด ๊ฒ€์ฆํ•˜๋Š” ์ˆ˜๋™ ํ…Œ์ŠคํŠธ -> `sout`์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ๋ˆˆ์œผ๋กœ ์ง์ ‘ ํ™•์ธ ++ ๊ธฐ๊ณ„๊ฐ€ ๊ฒ€์ฆํ•˜๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ -+ Junit5, AssertJ - + Junit5 : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ - + AssertJ : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์›ํ• ํ•˜๊ฒŒ ๋•๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ํ’๋ถ€ํ•œ API ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ์ง€์› +**Junit5, AssertJ** ++ Junit5 : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ++ AssertJ : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์›ํ• ํ•˜๊ฒŒ ๋•๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ํ’๋ถ€ํ•œ API ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ์ง€์› -+ ํ•ดํ”ผ ์ผ€์ด์Šค, ์˜ˆ์™ธ ์ผ€์ด์Šค -> ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์„ธ๋ถ„ํ™” - + ์˜ˆ์™ธ ์ผ€์ด์Šค : ์•”๋ฌต์  ํ˜น์€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์€ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ ๋ฐœ๊ฒฌ +**ํ•ดํ”ผ ์ผ€์ด์Šค, ์˜ˆ์™ธ ์ผ€์ด์Šค -> ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์„ธ๋ถ„ํ™”** ++ ์˜ˆ์™ธ ์ผ€์ด์Šค : ์•”๋ฌต์  ํ˜น์€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์€ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ ๋ฐœ๊ฒฌ -+ ๊ฒฝ๊ณ„๊ฐ’ ํ…Œ์ŠคํŠธ - + ๋ฒ”์œ„, ๊ตฌ๊ฐ„, ๋‚ ์งœ ๊ฒฝ๊ณ„๊ฐ’๋“ค๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. +**๊ฒฝ๊ณ„๊ฐ’ ํ…Œ์ŠคํŠธ** ++ ๋ฒ”์œ„, ๊ตฌ๊ฐ„, ๋‚ ์งœ ๊ฒฝ๊ณ„๊ฐ’๋“ค๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. -+ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด/์–ด๋ ค์šด ์˜์—ญ (์ˆœ์ˆ˜ํ•จ์ˆ˜) - + ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๊ธฐ - + ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ• ์ˆ˜๋ก ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ๋งŽ์•„์ง„๋‹ค. - + ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ - + ๊ด€์ธกํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ : ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„, ๋žœ๋ค ๊ฐ’, ์ „์—ญ ๋ณ€์ˆ˜/ํ•จ์ˆ˜, ์‚ฌ์šฉ์ž ์ž…๋ ฅ - + ์™ธ๋ถ€ ์…ฐ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ : ํ‘œ์ค€ ์ถœ๋ ฅ, ๋ฉ”์‹œ์ง€ ๋ฐœ์†ก, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•˜๊ธฐ - + ์ˆœ์ˆ˜ ํ•จ์ˆ˜ - ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์˜์—ญ - + ๊ฐ™์€ ์ž…๋ ฅ์—๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ - + ์™ธ๋ถ€ ์„ธ์ƒ๊ณผ ๋‹จ์ ˆ๋œ ํ˜•ํƒœ +**ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด/์–ด๋ ค์šด ์˜์—ญ (์ˆœ์ˆ˜ํ•จ์ˆ˜)** ++ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๊ธฐ ++ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ• ์ˆ˜๋ก ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ๋งŽ์•„์ง„๋‹ค. ++ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ + + ๊ด€์ธกํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ : ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„, ๋žœ๋ค ๊ฐ’, ์ „์—ญ ๋ณ€์ˆ˜/ํ•จ์ˆ˜, ์‚ฌ์šฉ์ž ์ž…๋ ฅ + + ์™ธ๋ถ€ ์…ฐ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ : ํ‘œ์ค€ ์ถœ๋ ฅ, ๋ฉ”์‹œ์ง€ ๋ฐœ์†ก, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•˜๊ธฐ ++ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ - ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์˜์—ญ + + ๊ฐ™์€ ์ž…๋ ฅ์—๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ + + ์™ธ๋ถ€ ์„ธ์ƒ๊ณผ ๋‹จ์ ˆ๋œ ํ˜•ํƒœ -+ lombok - + @Data, @Setter, @AllArgsConstructor ์ง€์–‘ - + ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ ์‹œ @ToString ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ +**lombok** ++ @Data, @Setter, @AllArgsConstructor ์ง€์–‘ ++ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ ์‹œ @ToString ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ ![img_3.png](img_3.png) ### ์„น์…˜ 4. TDD: Test Driven Development -+ TDD - + ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ (Test Driven Development)๋กœ, ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„ ๊ณผ์ •์„ ์ฃผ๋„ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  - + ์„  ๊ธฐ๋Šฅ ๊ตฌํ˜„, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ๋ฌธ์ œ์  (์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ) - ๊ตฌํ˜„์ˆœ์„œ : ๊ธฐ๋Šฅ -> ํ…Œ์ŠคํŠธ - - ํ…Œ์ŠคํŠธ ์ž์ฒด์˜ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ์„ฑ - - ํ•ดํ”ผ ์ผ€์ด์Šค๋งŒ ๊ฒ€์ฆํ•  ๊ฐ€๋Šฅ์„ฑ - - ์ž˜๋ชป๋œ ๊ตฌํ˜„์„ ๋‹ค์†Œ ๋Šฆ๊ฒŒ ๋ฐœ๊ฒฌํ•  ๊ฐ€๋Šฅ์„ฑ - + ์„  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, ๊ธฐ๋Šฅ ๊ตฌํ˜„ (TDD) - ๊ตฌํ˜„์ˆœ์„œ : ํ…Œ์ŠคํŠธ -> ๊ธฐ๋Šฅ - - ๋ณต์žก๋„(์œ ์—ฐํ•˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด)๊ฐ€ ๋‚ฎ์€ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. - - ํ…Œ์ŠคํŠธ๊ฐ€ ํž˜๋“  ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ - - ์˜ˆ๋ฅผ ๋“ค๋ฉด LocalDateTime.now()์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€์„ธ๊ณ„๋กœ ๋ถ„๋ฆฌํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ํŽธํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. - - ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๊ท€์ฐฎ์„์ˆ˜๋„.. - - ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์šด ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋†“์น˜์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค. - - ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. - - ๊ณผ๊ฐํ•œ ๋ฆฌํŒฉํ† ๋ง์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. - - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ณด์žฅ - + TDD์˜ ๊ด€์  - + ์ด์ „์˜ ๊ด€์  : ํ…Œ์ŠคํŠธ๋Š” ๊ตฌํ˜„๋ถ€ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋ณด์กฐ ์ˆ˜๋‹จ - + ๋ณ€ํ™”๋œ ๊ด€์  : ํ…Œ์ŠคํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ๋ฐœ์ „ํ•˜๋Š” ๊ตฌํ˜„๋ถ€ - -+ ๋ ˆ๋“œ - ๊ทธ๋ฆฐ - ๋ฆฌํŒฉํ† ๋ง - 1. Red : ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ - 2. Green : ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋”ฉ - 3. Refactor : ๊ตฌํ˜„ ์ฝ”๋“œ ๊ฐœ์„  ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์œ ์ง€ - -![img_5.png](img_5.png) - -+ ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  vs ํญํฌ์ˆ˜ ๋ฐฉ๋ฒ•๋ก  - + ํญํฌ์ˆ˜ ๋ฐฉ๋ฒ•๋ก  - + ๋‹จ๊ณ„์  ๊ฐœ๋ฐœ: ์š”๊ตฌ ๋ถ„์„ โ†’ ์„ค๊ณ„ โ†’ ๊ตฌํ˜„ โ†’ ํ…Œ์ŠคํŠธ โ†’ ๋ฐฐํฌ โ†’ ์œ ์ง€๋ณด์ˆ˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋จ. - + ๋ฌธ์„œ ์ค‘์‹ฌ: ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฌธ์„œํ™”๊ฐ€ ์ฒ ์ €ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง. - + ์„ ํ˜• ๊ตฌ์กฐ: ์ด์ „ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ. - + ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›€: ์ดˆ๊ธฐ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ํ™•์ •ํ•˜๋ฉด ์ดํ›„ ๋ณ€๊ฒฝ์ด ์–ด๋ ต๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ฆ. - + ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  https://agilemanifesto.org/iso/ko/manifesto.html - + ๋ฐ˜๋ณต์  ๊ฐœ๋ฐœ(Iterative Development): ์งง์€ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ(์Šคํ”„๋ฆฐํŠธ)๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ . - + ์œ ์—ฐ์„ฑ: ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋™์ ์œผ๋กœ ์ง„ํ–‰. - + ๊ณ ๊ฐ ์ฐธ์—ฌ: ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ. - + ์ž์œจ์ ์ธ ํŒ€ ๊ตฌ์„ฑ: ๊ฐœ๋ฐœํŒ€์ด ์ž์ฒด์ ์œผ๋กœ ์˜์‚ฌ ๊ฒฐ์ •์„ ํ•˜๋ฉฐ, ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ. - -+ ์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - + XP(Extreme Programming, ์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋Š” ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜๋กœ, ๋น ๋ฅธ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์™€ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. - ๊ณ ๊ฐ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€ํ™”์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์งง์€ ๊ฐœ๋ฐœ ๋ฐ˜๋ณต ์ฃผ๊ธฐ(Iteration)์™€ ๊ฐ•ํ•œ ํ˜‘์—… ๋ฌธํ™”๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค. - -+ ์Šคํฌ๋Ÿผ, ์นธ๋ฐ˜ - + ์Šคํฌ๋Ÿผ - ์• ์ž์ผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ผ์ •ํ•œ ์Šคํ”„๋ฆฐํŠธ ๋™์•ˆ ์ž‘์—…์„ ๊ณ„ํšํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋Š” ๋ฐ˜๋ณต์ ์ด๊ณ  ์ ์ง„์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด๋‹ค. - ์งง์€ ๊ฐœ๋ฐœ ์Šคํ”„๋ฆฐํŠธ๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค๊ณ  ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. - 1๏ธโƒฃ ๋ฐฑ๋กœ๊ทธ ์ž‘์„ฑ โ€“ ์ œํ’ˆ ๋ฐฑ๋กœ๊ทธ์— ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •๋ฆฌ +**TDD** +ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ (Test Driven Development)๋กœ, ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„ ๊ณผ์ •์„ ์ฃผ๋„ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  + +์„  ๊ธฐ๋Šฅ ๊ตฌํ˜„, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ๋ฌธ์ œ์  (์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ) - ๊ตฌํ˜„์ˆœ์„œ : ๊ธฐ๋Šฅ -> ํ…Œ์ŠคํŠธ +- ํ…Œ์ŠคํŠธ ์ž์ฒด์˜ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ์„ฑ +- ํ•ดํ”ผ ์ผ€์ด์Šค๋งŒ ๊ฒ€์ฆํ•  ๊ฐ€๋Šฅ์„ฑ +- ์ž˜๋ชป๋œ ๊ตฌํ˜„์„ ๋‹ค์†Œ ๋Šฆ๊ฒŒ ๋ฐœ๊ฒฌํ•  ๊ฐ€๋Šฅ์„ฑ + +์„  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, ๊ธฐ๋Šฅ ๊ตฌํ˜„ (TDD) - ๊ตฌํ˜„์ˆœ์„œ : ํ…Œ์ŠคํŠธ -> ๊ธฐ๋Šฅ +- ๋ณต์žก๋„(์œ ์—ฐํ•˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด)๊ฐ€ ๋‚ฎ์€ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. + - ํ…Œ์ŠคํŠธ๊ฐ€ ํž˜๋“  ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ + - ์˜ˆ๋ฅผ ๋“ค๋ฉด LocalDateTime.now()์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€์„ธ๊ณ„๋กœ ๋ถ„๋ฆฌํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ํŽธํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. + - ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๊ท€์ฐฎ์„์ˆ˜๋„.. +- ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์šด ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋†“์น˜์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค. +- ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. +- ๊ณผ๊ฐํ•œ ๋ฆฌํŒฉํ† ๋ง์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. + - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ณด์žฅ + +TDD์˜ ๊ด€์  ++ ์ด์ „์˜ ๊ด€์  : ํ…Œ์ŠคํŠธ๋Š” ๊ตฌํ˜„๋ถ€ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋ณด์กฐ ์ˆ˜๋‹จ ++ ๋ณ€ํ™”๋œ ๊ด€์  : ํ…Œ์ŠคํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ๋ฐœ์ „ํ•˜๋Š” ๊ตฌํ˜„๋ถ€ + +**๋ ˆ๋“œ - ๊ทธ๋ฆฐ - ๋ฆฌํŒฉํ† ๋ง** +1. Red : ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ +2. Green : ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋”ฉ +3. Refactor : ๊ตฌํ˜„ ์ฝ”๋“œ ๊ฐœ์„  ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์œ ์ง€ + +**์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  vs ํญํฌ์ˆ˜ ๋ฐฉ๋ฒ•๋ก ** + +์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  https://agilemanifesto.org/iso/ko/manifesto.html ++ ๋ฐ˜๋ณต์  ๊ฐœ๋ฐœ(Iterative Development): ์งง์€ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ(์Šคํ”„๋ฆฐํŠธ)๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ . ++ ์œ ์—ฐ์„ฑ: ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋™์ ์œผ๋กœ ์ง„ํ–‰. ++ ๊ณ ๊ฐ ์ฐธ์—ฌ: ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ. ++ ์ž์œจ์ ์ธ ํŒ€ ๊ตฌ์„ฑ: ๊ฐœ๋ฐœํŒ€์ด ์ž์ฒด์ ์œผ๋กœ ์˜์‚ฌ ๊ฒฐ์ •์„ ํ•˜๋ฉฐ, ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ. + +ํญํฌ์ˆ˜ ๋ฐฉ๋ฒ•๋ก  ++ ๋‹จ๊ณ„์  ๊ฐœ๋ฐœ: ์š”๊ตฌ ๋ถ„์„ โ†’ ์„ค๊ณ„ โ†’ ๊ตฌํ˜„ โ†’ ํ…Œ์ŠคํŠธ โ†’ ๋ฐฐํฌ โ†’ ์œ ์ง€๋ณด์ˆ˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋จ. ++ ๋ฌธ์„œ ์ค‘์‹ฌ: ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฌธ์„œํ™”๊ฐ€ ์ฒ ์ €ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง. ++ ์„ ํ˜• ๊ตฌ์กฐ: ์ด์ „ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ. ++ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›€: ์ดˆ๊ธฐ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ํ™•์ •ํ•˜๋ฉด ์ดํ›„ ๋ณ€๊ฒฝ์ด ์–ด๋ ต๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ฆ. + +**์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ** ++ XP(Extreme Programming, ์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋Š” ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜๋กœ, ๋น ๋ฅธ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์™€ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ๊ณ ๊ฐ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€ํ™”์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์งง์€ ๊ฐœ๋ฐœ ๋ฐ˜๋ณต ์ฃผ๊ธฐ(Iteration)์™€ ๊ฐ•ํ•œ ํ˜‘์—… ๋ฌธํ™”๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค. + +**์Šคํฌ๋Ÿผ, ์นธ๋ฐ˜** ++ ์Šคํฌ๋Ÿผ + ์• ์ž์ผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ผ์ •ํ•œ ์Šคํ”„๋ฆฐํŠธ ๋™์•ˆ ์ž‘์—…์„ ๊ณ„ํšํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋Š” ๋ฐ˜๋ณต์ ์ด๊ณ  ์ ์ง„์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด๋‹ค. ์งง์€ ๊ฐœ๋ฐœ ์Šคํ”„๋ฆฐํŠธ๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค๊ณ  ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. + + 1๏ธโƒฃ ๋ฐฑ๋กœ๊ทธ ์ž‘์„ฑ โ€“ ์ œํ’ˆ ๋ฐฑ๋กœ๊ทธ์— ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •๋ฆฌ 2๏ธโƒฃ ์Šคํ”„๋ฆฐํŠธ ๊ณ„ํš โ€“ ์Šคํ”„๋ฆฐํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์„ ์ • 3๏ธโƒฃ ์Šคํ”„๋ฆฐํŠธ ์ง„ํ–‰ โ€“ ๊ฐœ๋ฐœ ์ง„ํ–‰ ๋ฐ ๋งค์ผ ์Šคํƒ ๋“œ์—… ๋ฏธํŒ… 4๏ธโƒฃ ์Šคํ”„๋ฆฐํŠธ ๋ฆฌ๋ทฐ โ€“ ๊ฐœ๋ฐœ ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ์„ ๊ฒ€ํ†  5๏ธโƒฃ ํšŒ๊ณ (Retrospective) โ€“ ๊ฐœ์„ ์ ์„ ์ฐพ๊ณ  ๋‹ค์Œ ์Šคํ”„๋ฆฐํŠธ์— ๋ฐ˜์˜ - + ์นธ๋ฐ˜ - Workflow์™€ ๊ฐ€์‹œ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ์• ์ž์ผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ง€์†์ ์ธ ๊ฐœ์„ ๊ณผ ์ž‘์—…๋Ÿ‰ ๊ด€๋ฆฌ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. - ์ž‘์—…์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. - 1๏ธโƒฃ Backlog: ํ•ด์•ผ ํ•  ์ž‘์—…์„ ๋ชจ์•„๋‘  - 2๏ธโƒฃ To Do: ํ˜„์žฌ ์ง„ํ–‰ํ•  ์ž‘์—… - 3๏ธโƒฃ In Progress: ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… - 4๏ธโƒฃ Review/Test: ๋ฆฌ๋ทฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—… - 5๏ธโƒฃ Done: ์™„๋ฃŒ๋œ ์ž‘์—… - -![img_4.png](img_4.png) \ No newline at end of file + ++ ์นธ๋ฐ˜ + Workflow์™€ ๊ฐ€์‹œ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ์• ์ž์ผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ง€์†์ ์ธ ๊ฐœ์„ ๊ณผ ์ž‘์—…๋Ÿ‰ ๊ด€๋ฆฌ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. ์ž‘์—…์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + + 1๏ธโƒฃ Backlog: ํ•ด์•ผ ํ•  ์ž‘์—…์„ ๋ชจ์•„๋‘  + 2๏ธโƒฃ To Do: ํ˜„์žฌ ์ง„ํ–‰ํ•  ์ž‘์—… + 3๏ธโƒฃ In Progress: ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… + 4๏ธโƒฃ Review/Test: ๋ฆฌ๋ทฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—… + 5๏ธโƒฃ Done: ์™„๋ฃŒ๋œ ์ž‘์—… + +![img_4.png](img_4.png) + +### ์„น์…˜ 5. ํ…Œ์ŠคํŠธ๋Š” []๋‹ค. + +**ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฌธ์„œ๋‹ค.** ++ ํ”„๋กœ๋•์…˜ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฌธ์„œ๋‹ค. ++ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ์‹œ๊ฐ๊ณผ ๊ด€์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค. ++ ๊ณ ๋ฏผํ–ˆ๋˜ ๋‚ด์šฉ(ํ…Œ์ŠคํŠธ ์ฝ”๋“œ)์„ ํŒ€ ์ž์‚ฐ(์†Œ์Šค ์ฝ”๋“œ)์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +**@DisplayName - ๋„๋ฉ”์ธ ์ •์ฑ…, ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ๋ช…ํ™•ํ•œ ๋ฌธ์žฅ** ++ ๋ฉ”์„œ๋“œ๋ช…๋งŒ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์„ ๊ฒ€์ฆํ•˜๊ณ ์ž ํ•˜๋Š” ์˜๋„ ํŒŒ์•…์ด ์–ด๋ ค์›€ ++ Junit5์— ์ถ”๊ฐ€ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ++ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์„ฌ์„ธํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์–ด๋…ธํ…Œ์ด์…˜์•ˆ์— ์ž‘์„ฑํ•œ๋‹ค. ++ ์„ฌ์„ธํ•œ DisplayName + + ํŠน์ • ์‹œ๊ฐ„ ์ด์ „์— ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•˜๋ฉด ์‹คํŒจํ•œ๋‹ค. โŒ + + ์˜์—… ์‹œ์ž‘ ์‹œ๊ฐ„ ์ด์ „์—๋Š” ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. โœ… + + ๋„๋ฉ”์ธ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒํ™”๋œ ๋‚ด์šฉ์„ ๋‹ด๊ธฐ -> ๋ฉ”์„œ๋“œ ์ž์ฒด์˜ ๊ด€์  ๋ณด๋‹ค ๋„๋ฉ”์ธ ์ •์ฑ… ๊ด€์  (ํŠน์ • ์‹œ๊ฐ„ -> ์˜์—… ์‹œ์ž‘ ์‹œ๊ฐ„ โœ…) + + ํ…Œ์ŠคํŠธ์˜ ํ˜„์ƒ์„ ์ค‘์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜์ง€ ๋ง ๊ฒƒ (~์‹คํŒจํ•œ๋‹ค โŒ) + +**Given / When / Then - ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ, ํ–‰๋™, ์ƒํƒœ ๋ณ€ํ™”** ++ Given : ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ค€๋น„ ๊ณผ์ • ++ When : ์‹œ๋‚˜๋ฆฌ์˜ค ํ–‰๋™ ์ง„ํ–‰ ++ Then : ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ช…์‹œ, ๊ฒ€์ฆ + +**TDD vs BDD** ++ BDD + + TDD์—์„œ ํŒŒ์ƒ๋œ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ• + + ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž์ฒด์— ์ง‘์ค‘ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•œ๋‹ค. + +**Junit vs Spock** ++ Spock์€ Groovy์–ธ์–ด๋กœ BDD ํŒจํ„ด์„ ์ ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. + +**์–ธ์–ด๊ฐ€ ์‚ฌ๊ณ ๋ฅผ ์ œํ•œํ•œ๋‹ค.** ++ ๋ช…ํ™•ํ•˜์ง€ ๋ชปํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์‚ฌ๊ณ ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ++ ๋ฌธ์„œ๋กœ์„œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. + +![img_6.png](img_6.png) + +## ๐Ÿƒ ๋Œ์•„๋ณด๋ฉฐ.. + +๋ฏธ์…˜๊ณผ ๋ฐœ์ž๊ตญ์„ ์ •์‹ ์—†์ด ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฒŒ์จ ๋‚จ์€ ์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ๋„ 2์ฃผ๋ฐ–์— ๋‚จ์ง€ ์•Š์•˜๋‹ค. + +์ฒ˜์Œ์— OT ๋ผ์ด๋ธŒ ๋‹น์‹œ ๋Ÿฌ๋„ˆ๊ฐ€ 120๋ช… ์ •๋„์˜€๋Š”๋ฐ, ์ด๋ฒˆ ์ค‘๊ฐ„ ์ ๊ฒ€ ๋ผ์ด๋ธŒ ๋•Œ๋Š” 60๋ช… ์ •๋„๋กœ ์ค„์–ด๋“ค์—ˆ๋‹ค. +๊ฐ•์˜ ๋‚ด์šฉ ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ.. 2๊ฐœ์˜ ๊ฐ•์˜(14์‹œ๊ฐ„ + 12์‹œ๊ฐ„)๋ฅผ ํ•œ ๋‹ฌ๋งŒ์— ๋“ค์œผ๋ฉด์„œ ๋ฏธ์…˜๊ณผ ๋ฐœ์ž๊ตญ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฑด ์‰ฝ์ง€ ์•Š์•„ ๋ณด์ธ๋‹ค.. + +~~๋‚˜๋Š” ๋ฏธ๋ฆฌ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•ด์„œ ๋‹คํ–‰์ด๋‹ค๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.. ๐Ÿ˜…~~ + +ํ•˜์ง€๋งŒ, ์‰ฝ์ง€ ์•Š์€ ๋งŒํผ ์„ฑ์‹คํžˆ ์ฐธ์—ฌํ•œ๋‹ค๋ฉด ๋‹จ๊ธฐ๊ฐ„ ๋‚ด ์„ฑ์žฅํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค. + +![img_10.png](img_10.png) + +๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ์ฃผ์— ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์‹ ์ฒญํ•˜๊ธฐ ์ž˜ํ–ˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๐Ÿ€ + +์œ„์—์„œ๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์šฐ๋นˆ๋‹˜์˜ ์„ธ์‹ฌํ•œ ๋ฆฌ๋ทฐ ํƒ“(?)์— +๋‚ด๊ฐ€ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์šฐ๋นˆ๋‹˜๋ณด๋‹ค ์„ธ์‹ฌํ•˜๊ฒŒ ์ง‘์ฐฉ ํ–ˆ์—ˆ๋‚˜..? ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋œ๋‹ค... ๐Ÿ˜ญ + +๋งˆ์ง€๋ง‰ ์ฃผ์ฐจ ์˜จ๋ผ์ธ ๋ผ์ด๋ธŒ์—์„œ๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฆฌ๋ทฐ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค๊ณ  ํ•œ๋‹ค. +๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ๋˜ ํ•œ ๋ฒˆ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„ ๋‹จ๊ณจ ์†๋‹˜์ด ๋˜๊ณ  ์‹ถ๋‹ค. ๐Ÿ˜‚ + +![img_9.png](img_9.png) + +2์ฃผ๋ฅผ ๊ฑธ์ณ, ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ์˜ ์Šคํ„ฐ๋”” ๊ณผ์ •์€ ์ด๋ฒˆ์ฃผ๋กœ ๋ง‰์„ ๋‚ด๋ ธ๋‹ค. +๋‹ค์Œ ์ฃผ์ฐจ๋ถ€ํ„ฐ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ„ฐ๋””ํ•˜๋Š” ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค. +๋‚จ์€ 2์ฃผ๋„ ํ™”์ดํŒ…ํ•˜๋ฉฐ ์ข‹์€ ์„ฑ์žฅ์„ ์ด๋ฃจ๊ธธ ๊ธฐ๋Œ€ํ•ด ๋ณธ๋‹ค. ๐Ÿ”ฅ + +๋์œผ๋กœ, +3์›” ์ค‘์ˆœ์ด ๋˜๋‹ˆ ์ด์ œ ์Šฌ์Šฌ ๋ด„ ๋‚ด์Œ์ด ๋‚˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.. ๐ŸŒธ +์–ผ์–ด๋ถ™์€ ๊ฐœ๋ฐœ ์‹œ์žฅ์—๋„ ๋ด„์ด ์ฐพ์•„์™”์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.. ๐ŸงŠ + +๋ฐœ์ž๊ตญ 2์ฃผ์ฐจ ๋„์• ! + +[์ถœ์ฒ˜] ++ ์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ : https://www.inflearn.com/course/offline/warmup-club-3-be-code ++ ๊ฐ•์˜ : https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard diff --git a/docs/footprint/week2/img_10.png b/docs/footprint/week2/img_10.png new file mode 100644 index 0000000..b26ce7b Binary files /dev/null and b/docs/footprint/week2/img_10.png differ diff --git a/docs/footprint/week2/img_11.png b/docs/footprint/week2/img_11.png new file mode 100644 index 0000000..1e371fe Binary files /dev/null and b/docs/footprint/week2/img_11.png differ diff --git a/docs/footprint/week2/img_6.png b/docs/footprint/week2/img_6.png new file mode 100644 index 0000000..fcc1118 Binary files /dev/null and b/docs/footprint/week2/img_6.png differ diff --git a/docs/footprint/week2/img_7.png b/docs/footprint/week2/img_7.png new file mode 100644 index 0000000..0907098 Binary files /dev/null and b/docs/footprint/week2/img_7.png differ diff --git a/docs/footprint/week2/img_8.png b/docs/footprint/week2/img_8.png new file mode 100644 index 0000000..907e9ad Binary files /dev/null and b/docs/footprint/week2/img_8.png differ diff --git a/docs/footprint/week2/img_9.png b/docs/footprint/week2/img_9.png new file mode 100644 index 0000000..c9694a3 Binary files /dev/null and b/docs/footprint/week2/img_9.png differ diff --git a/docs/footprint/week3/README.md b/docs/footprint/week3/README.md new file mode 100644 index 0000000..8bd72c9 --- /dev/null +++ b/docs/footprint/week3/README.md @@ -0,0 +1,175 @@ +# ๋ฐœ์ž๊ตญ - Week3 + +## ๐ŸŽผ ์•Œ๋ ˆ๊ทธ๋ ˆํ†  : ์กฐ๊ธˆ ๋น ๋ฅด๊ฒŒ + +3์ฃผ ์ฐจ๋ถ€ํ„ฐ๋Š” ๋ฏธ์…˜๊ณผ ๋ฐœ์ž๊ตญ์„ ์กฐ๊ธˆ ์„œ๋‘˜๋Ÿฌ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด๋‹ค. +์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์ด๋ฒˆ ์ฃผ๋ถ€ํ„ฐ ํ•ญํ•ด ํ”Œ๋Ÿฌ์Šค๊ฐ€ ์‹œ์ž‘๋˜์–ด ์ตœ๋Œ€ํ•œ ์ง„๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋นผ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. + +ํ˜„์žฌ ๋‚ ์งœ(3์›” 17์ผ) ๊ธฐ์ค€์œผ๋กœ **Day 16 ๋ฏธ์…˜๊ณผ 3์ฃผ ์ฐจ ๋ฐœ์ž๊ตญ**์„ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ, +์ด๋ฒˆ ์ฃผ ์•ˆ์— **Day 18 ๋ฏธ์…˜๊ณผ 4์ฃผ ์ฐจ ๋ฐœ์ž๊ตญ**๋„ ์ž‘์„ฑ์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค. +(~~๊ฐ€๋Šฅํ• ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ใ…Žใ…Ž~~) + +์กฐ๊ธˆ ๊ธ‰ํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜๋Š” ๊ฐ์ด ์žˆ์–ด ๊ฐœ์ธ์ ์œผ๋กœ ๋งŽ์ด ์•„์‰ฝ๋‹ค. +์›Œ๋ฐ์—… ํด๋Ÿฝ์—๋งŒ ์˜จ์ „ํžˆ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ๋” ๋งŽ์€ ์„ฑ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ํ…๋ฐ ๋ง์ด๋‹ค... + +ํ•˜์ง€๋งŒ, ํ›„ํšŒ๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค. +๋‹ค์Œ ๊ธฐ์ˆ˜์˜ ์กด์žฌ๋Š” ์šฐ๋นˆ๋‹˜๋งŒ ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋‹ค์Œ์— ๋˜ ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ๋†“์น˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๐Ÿ‘ + +![img_6.png](img_6.png) + +๋‚˜๋Š” ์œ„์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ [Trello](https://trello.com/)๋ฅผ ํ™œ์šฉํ•ด ์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค. +๋ฏธ์…˜ ์ œ์ถœ ๋‚ ์งœ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค ๋ณด๋‹ˆ, ์ œ์ถœ ํ•˜๋ฃจ ์ „์— ๋…ธํ‹ฐ๋ฅผ ๋ฐ›๋„๋ก ์„ค์ •ํ•ด ๋‘๊ณ  ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ์ค‘์ด๋‹ค. ๐Ÿ™ƒ + +## ๐Ÿ’ก ์ž๊ธฐ๋งŒ์˜ ์–ธ์–ด๋กœ ํ‚ค์›Œ๋“œ ์ •๋ฆฌํ•˜๊ธฐ + +### ์„น์…˜ 6. Spring & JPA ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ + +**Layered Architecture** ++ ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์˜ ๋‹จ์  : ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๊ฐ•๊ฒฐํ•ฉ์ด ์‹ฌํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌ + +**Hexagonal Architecture** ++ ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ์™ธ๋ถ€์˜ ๊ฒƒ๋“ค์„ ์•„์˜ˆ ๋ชจ๋ฅธ๋‹ค. ++ ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ค‘์‹ฌ (๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ๋ฐ ์‹œ์Šคํ…œ์ด ์ปค์ง„๋‹ค๋ฉด..) + +**๋‹จ์œ„ํ…Œ์ŠคํŠธ vs. ํ†ตํ•ฉํ…Œ์ŠคํŠธ** ++ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ๋งŒ์œผ๋กœ๋Š” ์ปค๋ฒ„ํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ์ด ์กด์žฌ (์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ๋ฐ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ํ˜‘๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ++ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ž€? + + ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ํ˜‘๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ + + ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๊ธฐ๋Šฅ ์ „์ฒด์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. + +**IoC, DI, AOP** + +**ORM, ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜, Hibernate** + +**Spring Data JPA** + +**QueryDSL** + +**@SpringBootTest vs @DataJpaTest** ++ @DataJpaTest๋Š” @SpringBootTest๋ณด๋‹ค ๊ฐ€๋ณ๋‹ค. ++ @DataJpaTest๋ณด๋‹ค๋Š” @SpringBootTest๋ฅผ ๋” ์„ ํ˜ธ ++ @DataJpaTest๋Š” @Transactional์ด ์žˆ์–ด ๋กค๋ฐฑ์ด ๋œ๋‹ค. ++ @SpringBootTest๋Š” ํด๋ Œ์ง•์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. + +![img_7.png](img_7.png) + +**@SpringBootTest vs @WebMvcTest** ++ @SpringBootTest๋Š” E2E ํ…Œ์ŠคํŠธ, ์ฆ‰ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ++ @WebMvcTest๋Š” Presentation Layer์— ๋Œ€ํ•œ ๋‹จ๋… ํ…Œ์ŠคํŠธ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. + + ๋‹ค๋ฅธ ๋ ˆ์ด์–ด๋“ค์€ mocking์„ ํ†ตํ•ด ๋™์ž‘์„ ์ œ์–ดํ•œ๋‹ค. + +**@Transactional(readOnly = true)** ++ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ์‹œ, ๋กค๋ฐฑ ๋˜๋Š” ๊ฒƒ์— ์œ ์˜ ํ•ด์•ผ ํ•œ๋‹ค. ++ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค. ++ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž˜ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. + +**Optimistic Lock, Pessimistic Lock** ++ ๋‚™๊ด€์  ๋ฝ : ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ๋‚™๊ด€์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹ + + ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๋Š” ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ ๋ฒ„์ „ ๋น„๊ตํ•˜์—ฌ ์ถฉ๋Œ ์—ฌ๋ถ€ ํŒ๋‹จ + + ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”, ๋™์‹œ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์œ ๋ฆฌ ++ ๋น„๊ด€์  ๋ฝ : ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ์ž์ฃผ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ ๋น„๊ด€์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ž ๊ธˆ์„ ๊ฑฐ๋Š” ๋ฐฉ์‹ + + ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ดˆ์  + + ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Œ + + ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ + +**CQRS** ++ ๋ช…๋ น ์กฐํšŒ ์ฑ…์ž„ ๋ถ„๋ฆฌ : Command Query Responsibility Segregation ++ ์ฝ๊ธฐ(์กฐํšŒ)์™€ ์“ฐ๊ธฐ(๋ช…๋ น)์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ++ ์žฅ์  + + ์„ฑ๋Šฅ ์ตœ์ ํ™” + + ํ™•์žฅ์„ฑ ์ฆ๊ฐ€ + + ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ตœ์ ํ™” + + ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ ++ ๋‹จ์  + + ๋ณต์žก์„ฑ ์ฆ๊ฐ€ + + ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฌธ์ œ + + ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์–ด๋ ค์›€ + +**@RestControllerAdvice, @ExceptionHandler** ++ @RestControllerAdvice : ControllerAdvice์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”๋ฐ JSON์œผ๋กœ ์‘๋‹ต์„ ํ•ด์ฃผ๋Š” Advice ++ ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ  @RestControllerAdvice์˜ @ExceptionHandler์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. + +**Spring bean validation** ++ @NotNull, @NotEmpty, @NotBlank ++ ๋„๋ฉ”์ธ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ ๋‚˜์˜ค๋Š” validation๊ณผ ์ฑ…์ž„ ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค. ++ Controller ๋‹จ์—์„œ๋Š” ์ตœ์†Œํ•œ์˜ validation์„ ํ†ตํ•œ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. + +**@WebMvcTest** + +**ObjectMapper** ++ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ, Java ๊ฐ์ฒด์™€ JSON ๊ฐ„์˜ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ์—ญํ•  ++ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ + +**Mock, Mockito, @MockBean** ++ Mock : ์‹ค์ œ ๊ฐ์ฒด ์—†์ด ๋™์ž‘์„ ๋ชจ๋ฐฉํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์งœ ๊ฐ์ฒด ++ Mockito : Java์—์„œ Mock ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ++ @MockBean : Spring ์ปจํ…์ŠคํŠธ์— Mock ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‹ค์ œ ๋นˆ์„ ๋Œ€์ฒด + + @Mock : ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”์—์„œ Spring ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ + + @MockBean : Spring ์ปจํ…์ŠคํŠธ์—์„œ ํŠน์ • ๋นˆ์„ Mocking ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ + +![img.png](img.png) + +![img_1.png](img_1.png) + +![img_2.png](img_2.png) + +## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ๋ฏธ์…˜ ํšŒ๊ณ  + +### [๋ฏธ์…˜ Day 11] + +**[๋ฏธ์…˜ PR]** +https://github.com/discphy/warm-up-backend-code/pull/6 + +**์Šคํ„ฐ๋”” ์นดํŽ˜ ์ด์šฉ๊ถŒ ์„ ํƒ ์‹œ์Šคํ…œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ** + +๋ฏธ์…˜ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + +โœ”๏ธ๊ฐ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘ ๊ฐ•์˜ ์ค‘์— ์ž‘์„ฑํ•œ tobe ํŒจํ‚ค์ง€ ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ (lesson 6-4 ๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „) +โœ”๏ธ3๊ฐœ ์ด์ƒ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค & ์ด 7๊ฐœ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โžก๏ธ ๋‹จ, ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ๊ตฌํ˜„์ฒด๋“ค์€ 1๊ฐœ ํด๋ž˜์Šค๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. +โœ”๏ธ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ–ˆ๋Š”์ง€๋ฅผ ์ž˜ ๋‚˜ํƒ€๋‚ธ @DisplayName ์ž‘์„ฑํ•˜๊ธฐ +โœ”๏ธBDD(given/when/then) ์Šคํƒ€์ผ ๋”ฐ๋ฅด๊ธฐ (์ฃผ์„์œผ๋กœ ํ‘œ๊ธฐ) + +๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ๋ฉ”์„œ๋“œ ๋ถ€ํ„ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ, +ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด, ๋ชจ๋“  ์ฃผ์š” ๋กœ์ง์— ๋Œ€ํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ์ž ํ–ˆ๋‹ค. + +๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐ•์˜์—์„œ๋„ ๊ฐ•์กฐํ•œ ๋‚ด์šฉ ์ค‘์— ํ•˜๋‚˜์ธ @DisplayName์„ ์ž˜ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋‹ค. + ++ '**๊ถŒ**'์ด๋ผ๋Š” Pass์˜ ์˜๋ฏธ๋ฅผ '**ํŒจ์Šค**'๋กœ ํ†ต์ผํ•˜์—ฌ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜์˜€๋‹ค. ++ ์ฝ๋Š” ์‚ฌ๋žŒ์œผ๋กœ ํ•˜์—ฌ๊ธˆ ๋‡Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์“ฐ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด `@DisplayName`๋„ ์ตœ๋Œ€ํ•œ **์ถ”์ƒํ™”**ํ•ด์„œ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค. ++ ํ…Œ์ŠคํŠธ์˜ **ํ˜„์ƒ**์„ ์ค‘์ ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•˜์˜€๋‹ค. + +ํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›๋Š” ํด๋ž˜์Šค์ธ InputHandler์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. +InputHandler ๋‚ด๋ถ€์—์„œ static์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด mocking๋„ ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. + +```java +public class InputHandler { + + private static final Scanner SCANNER = new Scanner(System.in); + +} +``` + +ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ์ง€ํ‚ค๋ฉด์„œ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์› ๋‹ค. +๋งŒ์•ฝ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒƒ์ด๋‹ค. + ++ โ˜๏ธ Scanner๋ฅผ ์™ธ๋ถ€์„ธ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค. ++ โœŒ๏ธ InputHandler ์ƒ์œ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑ ํ›„, ํ…Œ์ŠคํŠธ ์ „์šฉ support ์„ฑ๊ฒฉ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค. + +๋ฏธ์…˜ ์ œ์ถœ ํ›„, ์ฐจํ›„์— ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค. + +## ๐Ÿƒ ๋Œ์•„๋ณด๋ฉฐ.. + +Day 11 ๋ฏธ์…˜์€ ์ œ์ถœ์ด ๋์ด ์•„๋‹ˆ๋ผ, ์ค‘๊ฐ„์ ๊ฒ€ ๋ผ์ด๋ธŒ์— ์ด์–ด ๋งˆ์ง€๋ง‰ ๋ผ์ด๋ธŒ์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋‹จ๊ณ„๊ฐ€ ๋‚จ์•„์žˆ๋‹ค. +์ค‘๊ฐ„ ์ ๊ฒ€ ๋•Œ ์„ธ์‹ฌํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ์ˆ˜์ •ํ•˜๋ฉด์„œ ๋งŽ์€ ์„ฑ์žฅ์„ ํ–ˆ๊ธฐ์— ์ด๋ฒˆ์—๋„ ์‹ ์ฒญํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์—ˆ๋‹ค. + +๋‹ค๋ฅธ ๋Ÿฌ๋„ˆ ๋ถ„๋“ค๋„ ๊ผญ ๋ฐ›์•„๋ดค์œผ๋ฉด ํ•œ๋‹ค. ๐Ÿ˜Š +์•„์ง๊นŒ์ง€ ํ˜ผ์ž ์‹ ์ฒญํ•ด์„œ ๋ป˜์คŒํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ... ์ง„์งœ ์ข‹์€ ๊ธฐํšŒ์ด์ž ๊ฒฝํ—˜์ด๋‹ค... ๐Ÿคฃ + +![img_5.png](img_5.png) + +์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ์ž๋กœ ๋ฝ‘ํžˆ๊ธธ ๊ธฐ๋Œ€ํ•˜๋ฉฐ.. ๋งˆ์ง€๋ง‰ 4์ฃผ์ฐจ๋„ ํ™”์ดํŒ… ๐Ÿ’ช + +[์ถœ์ฒ˜] ++ ์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ : https://www.inflearn.com/course/offline/warmup-club-3-be-code ++ ๊ฐ•์˜ : https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard + diff --git a/docs/footprint/week3/img.png b/docs/footprint/week3/img.png new file mode 100644 index 0000000..548224f Binary files /dev/null and b/docs/footprint/week3/img.png differ diff --git a/docs/footprint/week3/img_1.png b/docs/footprint/week3/img_1.png new file mode 100644 index 0000000..d6271d7 Binary files /dev/null and b/docs/footprint/week3/img_1.png differ diff --git a/docs/footprint/week3/img_2.png b/docs/footprint/week3/img_2.png new file mode 100644 index 0000000..d62b0de Binary files /dev/null and b/docs/footprint/week3/img_2.png differ diff --git a/docs/footprint/week3/img_4.png b/docs/footprint/week3/img_4.png new file mode 100644 index 0000000..e69de29 diff --git a/docs/footprint/week3/img_5.png b/docs/footprint/week3/img_5.png new file mode 100644 index 0000000..f0eba49 Binary files /dev/null and b/docs/footprint/week3/img_5.png differ diff --git a/docs/footprint/week3/img_6.png b/docs/footprint/week3/img_6.png new file mode 100644 index 0000000..be9c0ac Binary files /dev/null and b/docs/footprint/week3/img_6.png differ diff --git a/docs/footprint/week3/img_7.png b/docs/footprint/week3/img_7.png new file mode 100644 index 0000000..68e590a Binary files /dev/null and b/docs/footprint/week3/img_7.png differ