eternity
@eternity
Students
2,548
Reviews
174
Course Rating
5.0
๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋๋ฉ์ธ-์ฃผ๋ ์ค๊ณ์ ๊ด์ฌ์ด ๋ง์ผ๋ฉฐ ํ๋ณตํ ํ๊ณผ ๊น๋ํ ์ฝ๋, ์กด์ค๊ณผ ํ๋ ฅ์ด ํ๋ฅญํ ์ํํธ์จ์ด๋ฅผ ๋ณ๋๋ค๋ ๋ฏฟ์์ ๊ฐ์ง๊ณ ์๋ ํ๋ฒํ ๊ฐ๋ฐ์์ ๋๋ค. ๊ฐ๋ฐ์, ๊ต์ก์, ๊ด๋ฆฌ์๋ฅผ ์ค๊ฐ๋ฉฐ ์ตํ ๋ค์ํ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ข์ ์ฝ๋์ ํจ๊ป ์ข์ ํ๋ก๋ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ ์๋ก๋ ใ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํดใ์ ใ์ค๋ธ์ ํธใ๊ฐ ์๊ณ ๋ฒ์ญ์๋ก๋ ใ์๋ ๊ฐํธ ์ค๋ธ์ ํธใ๊ฐ ์์ผ๋ฉฐ ใ๋ง๋ค๋ฉด์ ๋ฐฐ์ฐ๋ ํด๋ฆฐ ์ํคํ
์ฒใ์ ๊ฐ์์๋ก ์ฐธ์ฌํ์ต๋๋ค.
๐ก๋ฉํ ๋ง ์ ์ฒญ : https://inf.run/YvAd2
๐ก๊ฐ์ธ๋ธ๋ก๊ทธ : https://eternity-object.tistory.com/
Courses
Reviews
- Object - Design Principles
- Objects - Basics
- Object - Design Principles
Posts
Q&A
5-4 Sealed Interface๋ ์ฃผ๋ก ๋ชจ๋ ์ผ์ด์ค ๊ฒ์ฆ์ด ํ์ํ ๋ ์ฌ์ฉํ๋์?
๋ฐ๋๋๋ ์๋ ํ์ธ์. ์ข์ ์ง๋ฌธ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๐ ์ง๋ฌธ์์ ๋ง์ํ์ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ sealed interface๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ ์ข ๋ฅ๋ฅผ ์ ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.๊ฐ์์์ ๋ง๋ ํ ์คํธ ์ด๋๋ฒค์ฒ ์์ ์์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ์๋ ๋ช ๋ น์ด์ ์ข ๋ฅ๋ฅผ ์ ํํ๊ธฐ ์ํด sealed interface๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์์ ์ฝ๋๋ฅผ ๋ณด์๋ฉด Command ํ์ ์ ์ข ๋ฅ๋ก Move, Unknown, Look, Help, Quit, Inventory, Take, Drop, Destroy, Throw๋ก๋ง ์ ํํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.public sealed interface Command { record Move(Direction direction) implements Command {} record Unknown() implements Command {} record Look() implements Command {} record Help() implements Command {} record Quit() implements Command {} record Inventory() implements Command {} record Take(String item) implements Command {} record Drop(String item) implements Command {} record Destroy(String item) implements Command {} record Throw(String item) implements Command {} }ํ์ฌ๋ ์ธํฐํ์ด์ค ์์ record ๋ค์ ์ ์ํ๊ณ ์์ง๋ง ์๋ ์ฝ๋์ฒ๋ผ permits๋ฅผ ์ฌ์ฉํ ์ ์ธ๋ฌธ์ ํํ๋ก ๋ณ๊ฒฝํ๋ฉด ์ข ๋ฅ๋ฅผ ์ ํํ๋ sealed interface์ ์ฉ๋๋ฅผ ์ข ๋ ๋ช ํํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.public sealed interface Command permits Move, Unknown, Look, Help, Quit, Inventory, Take, Drop, Destroy, Throw {} record Move(Direction direction) implements Command {} record Unknown() implements Command {} record Look() implements Command {} record Help() implements Command {} record Quit() implements Command {} record Inventory() implements Command {} record Take(String item) implements Command {} record Drop(String item) implements Command {} record Destroy(String item) implements Command {} record Throw(String item) implements Command {} sealed interface๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ ๋ชจ๋ ํ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ์ ์ ์๊ธฐ ๋๋ฌธ์ ํน์ ์ผ์ด์ค์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋๋ฝํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.Game ํด๋์ค์ executeCommand() ๋ฉ์๋๋ฅผ ๋ณด์๋ฉด switch ๋ฌธ์์ ํจํด ๋งค์นญ(pattern matching)์ ํตํด Command์ ์ข ๋ฅ๋ฅผ ๋๋ฝํ์ง ์๊ณ ์ ์ ํ ์ฒ๋ฆฌํ๊ณ ์๋๋ฐ ์ด ๊ฒฝ์ฐ์ ํ๋์ case๋ฌธ์ด๋ผ๋ ๋๋ฝ๋๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.์ฐธ๊ณ ๋ก default ์ผ์ด์ค ์์ด ๋ชจ๋ ๊ตฌ๋ฌธ์ ๋ช ์์ ์ผ๋ก ์ฒดํฌํ ์ ์๋ switch ๋ฌธ์ ์ค๋งํธ ์ค์์น ํํ์(smart switch expression)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.private void executeCommand(Command command) { switch(command) { case Command.Move move -> world.tryMove(move.direction()); case Command.Look() -> world.showRoom(); case Command.Help() -> showHelp(); case Command.Quit() -> quit(); case Command.Unknown() -> showUnknownCommand(); case Command.Inventory() -> world.showInventory(); case Command.Take take -> world.takeItem(take.item()); case Command.Drop drop -> world.dropItem(drop.item()); case Command.Destroy destroy -> world.destroyItem(destroy.item()); case Command.Throw aThrow -> world.throwItem(aThrow.item()); } }์ ์ฝ๋๋ฅผ ์๋์ Move, Take, Drop, Destory, Throw์์ ์ ์ ์๋ ๊ฒ์ฒ๋ผ Command.Move(Direction direction)์ ํํ๋ก ๋ด๋ถ ์์๋ฅผ ๋ถํดํด์ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค.private void executeCommand(Command command) { switch(command) { case Command.Move(Direction direction) -> world.tryMove(direction); case Command.Look() -> world.showRoom(); case Command.Help() -> showHelp(); case Command.Quit() -> quit(); case Command.Unknown() -> showUnknownCommand(); case Command.Inventory() -> world.showInventory(); case Command.Take(String item) -> world.takeItem(item); case Command.Drop(String item) -> world.dropItem(item); case Command.Destroy(String item) -> world.destroyItem(item); case Command.Throw(String item)-> world.throwItem(item); } } ์ฐธ๊ณ ๋ก sealed interface์ record๋ Java์์ ๋์์ ์๋ฃํ(Algebraric Data Type)์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.๋์์ ์๋ฃํ์ ํฉ ํ์ ๊ณผ ๊ณฑ ํ์ ์ ์กฐํฉํด์ ๊ตฌํํ๋ฉฐ ์๋ฐ์ ๊ฒฝ์ฐ sealed interface๋ OR๋ก ์กฐํฉํ ์ ์๋ ํฉ ํ์ (Sum Type)์, record๋ฅผ ์ด์ฉํด์ ๋ค์ํ ์ํ๋ฅผ ์กฐํฉํ ์ ์๋ ๊ณฑ ํ์ (Product Type)์ ์ฌ์ฉํด์ ๊ตฌํํฉ๋๋ค. ๊ฐ์์์๋ ํน๋ณํ ์ธ๊ธํ์ง ์์์ง๋ง ๋ฐ์ดํฐ์ ๋ก์ง์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฐ์ฒด์งํฅ๊ณผ ๋ฌ๋ฆฌ, Command์ ๊ฒฝ์ฐ์ฒ๋ผ ํน์ ํ ๊ท์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ์ ๋ก์ง์ ๋๋๋ ํจ๋ฌ๋ค์์ ๋ฐ์ดํฐ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(DOP, Data-Oriented Programming)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.์๋ฐ์์ ๋ฐ์ดํฐ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ sealed interface์ ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ record, ๋ณ๋์ ๋ชจ๋์์ ํ๋์ ๊ตฌํํ๊ธฐ ์ํ ํจํด ๋งค์นญ์ ์กฐํฉํด์ ๊ตฌํํฉ๋๋ค.๋ฐ์ดํฐ๋ sealed interface์ record๋ฅผ ์ด์ฉํด์ ๋ถ๋ณ ๋ฐ์ดํฐ๋ก ๊ตฌํํ๋ฉฐ, ์ด ๋ก์ง์ ์ฌ์ฉํ๋ ๋ก์ง์ executeCommand() ๋ฉ์๋์ ๊ฐ์ด ํจํด ๋งค์นญ์ ์ด์ฉํด์ ํ์ ์ ๋ฐ๋ผ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.๊ฐ์ฒด์งํฅ์ด ๊ฐ์ฒด์ ํ๋์ ์ด์ ์ ๋ง์ถ๊ณ ์ํํ ํ๋์ ํจ๊ป ๋ฌถ์ด ํ๋์ ํตํด ์ํ ๋ณ๊ฒฝ์ ์บก์ํํ๋ ๋ฐฉ์์ด๋ผ๋ฉด, ๋ฐ์ดํฐ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ์ดํฐ์ ์ด์ ์ ๋ง์ถ๋ ๋์ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ถ์ํจ๊ณผ๋ฅผ ์ต์ ํ๊ธฐ ์ํด ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ํจํด ๋งค์นญ์ ํตํด ๋ณ๋์ ๋ชจ๋์์ ํ๋์ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์์. ์ ๋ฆฌํ๋ฉด ์์ ์ฝ๋๋ ๋ณต์กํ ๊ฒ์ ํ๋ ์ด ๋ก์ง์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ , ๋ช ๋ น ์ฒ๋ฆฌ ๋ก์ง์ ๋ฐ์ดํฐ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.๊ฐ์์ ์์ ์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋๋ ํ๋์ ํจ๋ฌ๋ค์๋ง ์ ์ฉํ๋๊ฒ ์๋๋ผ ์ฌ๋ฌ ์ข ๋ฅ์ ํจ๋ฌ๋ค์์ ์กฐํฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ ๋๋ค(๋ฐ๋ผ์ ์๋ฐ๋ ๋ฉํฐํจ๋ฌ๋ค์ ์ธ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค). ๋ต๋ณ์ด ๋์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์. ๐ํ๋ณตํ ์ฑํ์ ๋ณด๋ด์๊ณ ์ถ๊ฐ๋ก ๊ถ๊ธํ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์.
- 1
- 1
- 395
Q&A
์ด ๊ฐ์๋ง ์๋ฃ๊ฐ ppt๋ค์.
ansxjrdptj94๋ ์๋ ํ์ธ์.์บก์ํ์ ppt ํ์ผ์ด ์ฌ๋ผ๊ฐ ์์๋ค์.ํ์ผ์ ์์ ํด์ ์ฌ๋ฆด ๋ ์๋ชป ์ฌ๋ฆฐ๊ฒ ๊ฐ์์.ํ์ธํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐ํ๋ณตํ ํ๋ฃจ ๋ณด๋ด์ธ์.
- 1
- 1
- 67
Q&A
Game, Player, Room๊ฐ์ ๊ด๊ณ์ ๋ํ ์ง๋ฌธ์ ๋๋ ค์
ํ ๋๋ฒ ์ด๋ ์๋ ํ์ธ์.์ค๊ณ์์นํธ์์ ๋ค์ ๋ง๋๋ต๋ ๋ฐ๊ฐ๋ค์. ๐ ํ ๋๋ฒ ์ด๋์ด ์ฃผ์ ์ง๋ฌธ์ ํต์ฌ์ ํ๋ฉด์ ์ถ๋ ฅํ ๋ฌธ๊ตฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ฑ ์์ Player๋ก ์ฎ๊ธฐ๋๊ฒ ๋ง๋๊ฐ๋ก ์์ฝํ ์ ์์ต๋๋ค.์์ ์ฝ๋์์๋ Game์ด ๋ค์๊ณผ ๊ฐ์ด Player๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์ป์ ํ ๋ฌธ๊ตฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ต๋๋ค.public class Game { private Player player; private CommandParser commandParser; private boolean running; private void showGreetings() { System.out.println("ํ์ํฉ๋๋ค!"); } private void showHelp() { System.out.println("๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค."); System.out.println("go {north|east|south|west} - ์ด๋, look - ๋ณด๊ธฐ, help - ๋์๋ง, quit - ๊ฒ์ ์ข ๋ฃ"); } private void farewell() { System.out.println("\\n๊ฒ์์ ์ข ๋ฃํฉ๋๋ค."); } public void showRoom() { System.out.println("๋น์ ์ [" + player.currentRoom().name() + "]์ ์์ต๋๋ค."); System.out.println(player.currentRoom().description()); } ... } ์ฝ๋๋ฅผ ๋ณด์๋ฉด ํ๋ฉด์ ์ถ๋ ฅํ ๋ฌธ๊ตฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ฑ ์์ Game ํด๋์ค๊ฐ ๋ด๋นํ๊ณ ์๋ค๋ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.๋๋จธ์ง ํด๋์ค๋ค์ ํ๋ฉด์ ์ถ๋ ฅํ ๋ฌธ๊ตฌ๋ฅผ ์กฐํฉํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ์ฑ ์์ ๋ด๋นํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ง ์ฑ ์์ ๋ถ๋ฆฌํ ์ด์ ๋ ํ๋ฉด์ ์ถ๋ ฅํ ๋ฌธ๊ตฌ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ Player๊ฐ ๋ด๋นํ๋ ๋ก์ง๊ณผ ์๊ด์์ด ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.์ฆ, ๋ณ๊ฒฝ์ ์ด์ ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฅด๋๋ฐ ํ๋ฉด์ ์ถ๋ ฅํ ๋ฌธ๊ตฌ๋ UI์ ๊ด๋ จ๋ ๊ด์ฌ์ฌ์ ํด๋นํ๊ณ , Player์ ๋ก์ง์ ๊ฒ์๊ณผ ๊ด๋ จ๋ ๋๋ฉ์ธ ๊ด์ฌ์ฌ์ ํด๋นํ๊ธฐ ๋๋ฌธ์ ๋๋ค.๋ฐ๋ผ์ UI์ ๋ณ๊ฒฝ์ผ๋ก ํ๋ฉด์ ์ถ๋ ฅ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ Player๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์์ ํ์ง ์๊ณ Game ํด๋์ค๋ง ์์ ํ ์ ์๋๋ก ๋ณ๊ฒฝ์ ๋ฒ์๋ฅผ ์ ํํ ๊ฒ์ผ๋ก ์๊ฐํด ์ฃผ์๋ฉด ๋ฉ๋๋ค. ์ค๋ฌด์์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ ๋ก์ง์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๋ณ๋์ Repository๋ DAO์ ๊ตฌํํ๋ ๊ฒฝ์ฐ์ ์ ์ฌํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ ๊ฒ ๊ฐ์์.์๋ฅผ ๋ค์ด Customer๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋ Customer์ ํ๋๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์ง๋ง ๊ด์ฌ์ฌ ์ธก๋ฉด์์๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋ ์ฌ๋ฆฌ์๋ฉด ์ดํด๊ฐ ๋์ค๊ฑฐ์์.์ด๋ ๊ฒ ๊ฐ์ฒด ๋จ์์ ์์ง๋๋ฅผ ๋ฎ์ถ๊ณ ์บก์ํ๋ฅผ ์ฝํ์ํค๋ ๋์ ์์คํ ์ ์ฒด ๊ด์ ์์ ์์ง๋๋ฅผ ๋์ด๋ ๊ธฐ๋ฒ์ด ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๋ต๋ณ์ด ๋์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์.๊ฐ์ฌํฉ๋๋ค. ๐
- 1
- 2
- 76
Q&A
DiscountPolicy์ ๊ตฌํ์ฒด์ ๊ด๋ จ ์ง๋ฌธ ๋๋ ค์!
ํ ๋๋ฒ ์ด๋ ์๋ ํ์ธ์์ข์ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๐Movie์ calculateFee ๋ฉ์๋์ DiscountPolicy์ getDiscountAmount ๋ฉ์๋๋ ์๋ก ๋ค๋ฅธ ์ด์ ๋ก Screening ๊ฐ์ฒด์ ์์กดํ๊ณ ์์ต๋๋ค. 1. Movie ํด๋์ค๊ฐ Screening์ ์์กดํ๋ ์ด์ ๋ง์ํ์ ๊ฒ์ฒ๋ผ ์ด ๊ฒฝ์ฐ๋ DiscountPolicy๊ฐ ๊ธ์ก์ ๊ณ์ฐํ๊ธฐ ์ํด Screening์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์์กด์ฑ์ด ํ์ํฉ๋๋ค.๋ง์ฝ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.์๋ ์ฝ๋๋ฅผ ๋ณด์๋ฉด DiscountPolicy์ Movie์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํด์DiscountPolicy๊ฐ ์ง์ Movie๋ฅผ ํตํด Screening์ ์ ๊ทผํ๊ณ ์์ต๋๋ค.public class Screening { private Movie movie; } public class Movie { private Money fee; private DiscountPolicy discountPolicy; **private Screening screening; public void calculateDiscount() { fee.minus(discountPolicy.calculateDiscount()); }** } public class DiscountPolicy { private DiscountPolicy policy; **private Movie movie; // Movie ์ฐธ์กฐ ์ถ๊ฐ** public Money calculateDiscount() { for (DiscountCondition each : conditions) { if (each.isSatisfiedBy(**movie.getScreening()**)) { return getDiscountAmount(**movie.getScreening()**); } } return Money.ZERO; } abstract protected Money getDiscountAmount(Screening screening); } ์ด๋ ๊ฒ ํ๋ฉด Screening์ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ํ์๊ฐ ์์ด์ง์ง๋ง ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๋ฐฉํฅ ์์กด์ฑ์ด ์ถ๊ฐ๋์ด ๊ฒฐํฉ๋๊ฐ ๋์์ง๋๋ค. (์ฌ์ง) ์ด๋ ๊ฒ ๋ฐ๊พธ๋๋ผ๋ ์ฌ์ ํ Movie๋ ์ธ์คํด์ค ๋ณ์๋ก Screening์ ํฌํจํ๊ธฐ ๋๋ฌธ์ Movie์์ Screening์ ๋ํ ์์กด์ฑ์ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.์ฌ๊ธฐ์์๋ DiscountPolicy๋ก Screening์ ์ ๋ฌํด์ผํ๊ธฐ ๋๋ฌธ์ Movie์์ Screening์ผ๋ก์ ์์กด์ฑ์ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.๋์ ๊ฐ์ฅ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ๋ฐฉ์์ธ ๋ฉ์๋ ํ๋ฆฌ๋ฏธํฐ๋ก Screening์ ์ ๋ฌํ๋ ๋ฐฉ์์ ์ ํํ ๊ฒ์ ๋๋ค.Screening ๋์ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ Screening์ ๋ํ ์์กด์ฑ์ ์์ ํ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํ์๋ฉด ์๋ ์ง๋ฌธ์ ์ฐธ์กฐํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๐https://inf.run/kqT92 2. DiscountPolicy์ getDiscountAmount ๋ฉ์๋๊ฐ Screening์ ์์กดํ๋ ์ด์ getDiscountAmount ๋ฉ์๋๋ ์์ ํด๋์ค๋ค์ด ๊ฐ๊ฒฉ์ ๊ณ์ฐํ๊ธฐ ์ํด ๊ณตํต์ผ๋ก ์์กดํ๊ฒ ๋๋ ๋ฉ์๋์ ์๊ทธ๋์ฒ๋ฅผ ์ ์ํฉ๋๋ค.์ด ๊ฒฝ์ฐ์๋ ์์ ๊ณ์ธต์ ์ํ ๋ชจ๋ ์์ ํด๋์ค๋ค์ด ๋์ผํ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์์ ํด๋์ค์์ ํ์ํ์ง ์๋๋ผ๋ ํน์ ํ ์์ ํด๋์ค๊ฐ ํ์๋ก ํ๋ค๋ฉด ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ๋ฐ์ ์์ต๋๋ค.์ด๋ฐ ์ด์ ๋ก Screening์ ์ ๋ฌํ ๊ฒ์ด์ฃ .์์์ ๋งํฌ๋ก ๋ฌ์๋์ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ์์ ์ ๊ฒฝ์ฐ์๋ getDiscountAmount ๋ฉ์๋์ Screening ๋์ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๊ฑฐ์์.๊ทธ๋ฐ๋ฐ ์ง๋ฌธ์ ๋ฐ๊ณ ์ฝ๋๋ฅผ ๋ณด๋ Screening๋์ Movie๋ฅผ ์ ๋ฌํ๋๊ฒ ๊ฒฐํฉ๋ ์ธก๋ฉด์์ ๋ ์ข์์ ๊ฒ ๊ฐ๋ค์. ๐ ๋ต๋ณ์ด ๋์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์.๋ ๊ถ๊ธํ ๋ถ๋ถ ์์ผ๋ฉด ์ถ๊ฐ๋ก ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์๋ฉด ๋ต๋ณ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- 1
- 2
- 47
Q&A
๊ฐ์ ์๋ฃ ๊ด๋ จ ์ง๋ฌธ์ ๋๋ค! (2-4. ์ ์ฐจ์์ ๊ฐ์ฒด๋ก)
ํ ๋๋ฒ ์ด๋ ์๋ ํ์ธ์.๊ฐ์ ์๋ฃ๋ฅผ ๋ณด๋ ๋ง์ํ์ ๊ฒ์ฒ๋ผ findDiscountCondition ๋ฉ์๋์ ๊ฐ์์ฑ์ public์ผ๋ก ์์ ํ๋๊ฒ ๋ง์ต๋๋ค.์ฅํ๋ฅผ ๋ง๋ค๋ฉด์ ์ค์๋ก ๊ทธ ๋ถ๋ถ๊น์ง๋ ํ์ธ์ ๋ชปํ๊ณ ๋์ด๊ฐ ๊ฒ ๊ฐ๋ค์.ํน์ ์ฝ๋๊ฐ ์ด์ํ๋ค๋ฉด github์ ์ฌ๋ผ๊ฐ ์๋ ์ฝ๋์ ๋น๊ตํด ๋ณด์๋ฉด ์ข์์. ๐https://github.com/eternity-oop/object-basic-02-04/blob/main/src/main/java/org/eternity/reservation/domain/DiscountPolicy.java๋์์ ๋ถ๋ถ์ด ์์ ํ๊ธฐ ์ด๋ ค์์ ๊ณ ๋ฏผ์ธ๋ฐ ์ด๋ ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์๋ฉด ๋์ค์๋ผ๋ ํ๋ฒ ๋ชจ์์ ์ค๋ฅ ์๋ ๋ถ๋ถ์ ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ผผ๊ผผํ๊ฒ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
- 1
- 2
- 67
Q&A
๋๋ฉ์ธ ๊ด๋ จ ์ง๋ฌธ์ด ์์ต๋๋ค!
ํ ๋๋ฒ ์ด๋ ์๋ ํ์ธ์.์ฃ์กํ์ง๋ง ์ง๋ฌธ ๋ด์ฉ์ ์ ๊ฐ ์ ํํ๊ฒ ์ดํดํ ์ ์์ด์ ์ ํํ ๋ต๋ณ์ ๋๋ฆฌ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋๋ ค์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. Q1. "์ํ ๊ด๋๋ฃ"๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ ์์ ๊ฐ์ฒด๊ฐ ์์กดํ๋ค๊ณ ํ์ จ๋๋ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ํ ๊ด๋๋ฃ๊ฐ ๋งก์ ์ฑ ์์ ๋ฌด์์ด๊ณ , ์์์ด ์ํ ๊ด๋๋ฃ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์์กด(๋๋ ํ๋ ฅ)ํ๋ ๊ฒ์ผ๊น์? ์ด ๋ถ๋ถ์ ์ดํดํด์ผ๋ง ๋ต๋ณ์ ๋๋ฆด ์ ์๋๋ฐ ์์ฌ ์ฝ๋ ์์ค์ผ๋ก๋ผ๋ ์ ์ด์ฃผ์๋ฉด ์ดํดํ๋๋ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์์. Q2. "์ํ ๊ด๋๋ฃ"๋ฅผ ์ถ๊ฐํด์ ์์์ด ํ ์ธ ์ ์ฑ ๊ณผ ํ๋ ฅํ๋ฉด ์ง๊ธ ๋ฐฉ์๋ณด๋ค ์ด๋ค ์ ์ด ๊ฐ์ ๋๋ค๊ณ ์๊ฐํ์๋์? ์ด ๋ฐฉ์์ด ํ์ค๊ณผ ๋ ๋ฐ์ ํ๋ค๊ณ ํ์ จ๋๋ฐ ์ด๋ค ์ ์์ ๊ทธ๋ฐ์ง๋ ์ ์ด ์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค. ์ ๋ด์ฉ์ ์ ์ด์ฃผ์๋ฉด ์ ์ด์ฃผ์ ๋ด์ฉ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ ๋ต๋ณ์ ๋๋ฆด ์ ์์๊ฒ ๊ฐ์์! ๐
- 1
- 2
- 88
Q&A
6-2 ๋ณดํธ ๋ก์ง ์ค๋ณต ์ด์
mint.inhrdev๋ ์๋ ํ์ธ์. ๋ค์ ์ง๋ฌธ๊ณผ ์ค๋ณต๋์ด ๋ต๋ณ ๋์ ๋งํฌ๋ก ๋์ ํฉ๋๋ค.https://inf.run/41yfx ๋ต๋ณ ๋ด์ฉ์ ๋ณด์๋ฉด ๊ถ๊ธํ์ ๋ถ๋ถ์ ๋ํด ๋ช ํํ๊ฒ ์ดํดํ์ค ์ ์์ผ์ค๊ฑฐ์์. ๐ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์ ์ ๊ฐ์ฌํ๊ณ ํด๋น ๋ต๋ณ์ ์ฝ์ผ์ ํ์๋ ๊ถ๊ธํ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ถ๊ฐ๋ก ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค!
- 1
- 2
- 68
Q&A
3-2 ๋ฉ์๋๋ฅผ ์ผ๋ง๋ ์๊ฒ ๋๋๋๊ฒ ์ ์ ํ๊ฐ์?
mint.inhrdev๋ ์๋ ํ์ธ์.์ข์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋จผ์ SRP๋ผ๋ ์ฉ์ด๋ ๋ฉ์๋๊ฐ ์๋๋ผ ํด๋์ค ๋๋ ๋ชจ๋ ๋จ์์์ ์ฌ์ฉํ๋ ์ฉ์ด์ ๋๋ค.๋ฉ์๋ ์์ค์์๋ ๋จ์ํ ์์ง๋๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๊ณ SRP๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.๊ธฐ๋ณธ์ ์ผ๋ก SRP์์ ๋งํ๋ ๊ฐ๋ ๊ณผ๋ ์๊ด์ด ์๊ณ ๊ฐ์์์๋ ์กฐํฉ ๋ฉ์๋ ํจํด์ด๋ผ๊ณ ํํํ๊ณ SRP๋ผ๋ ์ฉ์ด๋ ์ฌ์ฉํ์ง ์๊ณ ์์ต๋๋ค. ์กฐํฉ ๋ฉ์๋๋ก ๋ฆฌํฉํฐ๋งํ ๋ ๋ณ๊ฒฝ์ ๊ณ ๋ฏผํ๊ธฐ๋ ํ์ง๋ง ๋ณ๊ฒฝ๋ง์ด ๋ฉ์๋๋ฅผ ๋๋๋ ์ ๋์ ์ธ ๊ธฐ์ค์ ์๋๋๋ค.๊ฐ์์์๋ ์ค๋ช ๋๋ ธ๋ ๊ฒ์ฒ๋ผ ์กฐํฉ ๋ฉ์๋์ ๋ชฉ์ ์ ์ถ์ํ๋ฅผ ๋์ผํ ์์ค์ผ๋ก ๋ง์ถฐ์ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๋๋ก ๋ง๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฃผ๋ ๋ชฉ์ ์ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๋ ๊ฒ์ ๋๋ค.๋ฐ๋ผ์ ์ง๋ฌธ์ SRP vs ๊ฐ๋ ์ฑ์ด๋ผ๋ ํํ ๋์ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ๋ฉ์๋๋ฅผ ์ผ๋ง๋ ์๊ฒ ๋๋๋๊ฒ ์ ์ ํ๊ฐ๋ก ๋ฐ๊ฟ์ ํํํ๋๊ฒ ์ข๊ฒ ์ต๋๋ค. ๋จผ์ ์ง๋ฌธ์์ ๋ง์ํ์ ์๋ ์ฝ๋๋ โ์ ๋ ฅ ํ์ฑโ์ด ์๋๋ผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก โํ ํฐ์ ๋ถ๋ฆฌโํ๋ ์์ ์ด๋ผ๋ ์ ์ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๊ฒ ๊ฐ์์.input().toLowerCase().trim().split("\\\\s+"); ์ค์ ๋ก ์ ๋ ฅ์ ํ์ฑํ๋ ๋ก์ง์ parseCommand() ๋ฉ์๋์์ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.private void parseCommand(String input) { String[] commands = input.toLowerCase().trim().split("\\\\s+"); switch (commands[0]) { case "go" -> { switch (commands[1]) { case "north" -> moveNorth(); case "south" -> moveSouth(); case "east" -> moveEast(); case "west" -> moveWest(); default -> showUnknownCommand(); } } case "look" -> showRoom(); case "help" -> showHelp(); case "quit" -> stop(); default -> showUnknownCommand(); } } ์ด์ ์ง๋ฌธ์ ์ ์ฝ๋๋ฅผ ์๋์ฒ๋ผ ๋ณ๊ฒฝํ๋๊ฒ parseCommand() ๋ฉ์๋ ๋ด๋ถ์ ์ถ์ํ ์์ค์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋๋๋ฐ ๋์์ด ๋๋๋๊ฐ ๋ ๊ฒ๋๋ค.private void parseCommand(String input) { String[] commands = tokenize(input); switch (commands[0]) { case "go" -> { switch (commands[1]) { case "north" -> moveNorth(); case "south" -> moveSouth(); case "east" -> moveEast(); case "west" -> moveWest(); default -> showUnknownCommand(); } } case "look" -> showRoom(); case "help" -> showHelp(); case "quit" -> stop(); default -> showUnknownCommand(); } } private String[] tokenize(String input) { return input.toLowerCase().trim().split("\\\\s+"); } ์๋ ๋ฉ์๋๊ฐ ์ ์ฒด์ ์ธ ์ถ์ํ ์์ค์์ ์ผ๊ด์ฑ์ด ์์ด์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค๊ณ ํ๋จ๋๋ค๋ฉด ๋๋ฒ์งธ ์ฝ๋์ฒ๋ผ ๋ถ๋ฆฌํ๊ณ , ํด๋น ๋ก์ง์ด ๋ถ๋ฆฌํ ์ ๋๋ก ๋ณต์กํ์ง ์๊ฑฐ๋ ๋ถ๋ฆฌํ ์ ๋๋ก ์ค์ํ ๋ถ๋ถ์ด ์๋๋ผ๋ฉด ๊ทธ๋๋ก ๋๋ฉด ๋ฉ๋๋ค.์ ๊ฐ์ธ์ ์ผ๋ก๋ ๋ฐฐ์ด์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌํ๋ ์์ ์ด ๋ณ๋์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ ์ ๋๋ก ์ค์ํ์ง ์๊ณ parseCommand ์์ฒด๊ฐ switch ๋ฌธ์ ์ด์ฉํด์ ๋ฐฐ์ด์ ํ์ฑํ๋ ์ ์ฒด์ ์ผ๋ก ์ถ์ํ ์์ค์ด ๋ฎ์ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ์ ์ฒด์ ์ถ์ํ ์์ค์์๋ ์ด ์ํ๋ก ๋ฌ๋ ๊ด์ฐฎ๋ค๊ณ ํ๋จํ์ต๋๋ค.๋ง์ฝ ์ด ๋ฉ์๋๋ฅผ ๋์ผํ ์ถ์ํ ์์ค์ผ๋ก ๋ง์ถ๋ค๋ฉด ์๋ ์ฝ๋์ฒ๋ผ ๋ณ๊ฒฝํ๋๊ฒ ์ข์๊ฒ๋๋ค.private void parseCommand(String input) { parseTokens(tokenize(input)); } private String[] tokenize(String input) { return input.toLowerCase().trim().split("\\\\s+"); } private void parseTokens(String[] command) { switch (commands[0]) { case "go" -> { switch (commands[1]) { case "north" -> moveNorth(); case "south" -> moveSouth(); case "east" -> moveEast(); case "west" -> moveWest(); default -> showUnknownCommand(); } } case "look" -> showRoom(); case "help" -> showHelp(); case "quit" -> stop(); default -> showUnknownCommand(); } } ๊ฒฐ๊ณผ์ ์ผ๋ก paerseCommand() ๋ฉ์๋๋ฅผ ๋ ๊ฐ์ ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฉ์๋๋ก ๋๋ ๊ฒ์ธ๊ฐ, ์๋๋ฉด ํ์ฌ์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ ๊ฒ์ธ๊ฐ์ ๊ฒฐ์ ์ธ๋ฐ, ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ ์ฝ๋๊ฐ ์ด์ ์ฝ๋๋ณด๋ค ๊ทธ๋ ๊ฒ ๊ฐ์ ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง ์๊ณ ์คํ๋ ค ๋๋ฌด ์ธ๋ถํ๋ผ ๋ณด์ฌ์ ํ์ฑ ํ๋ฆ์ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.๋ง์ฝ ์์น์ ๋ฐ๋ผ ๋ ๊ฐ์ ์์ ๋ฉ์๋๋ก ๋๋๋๊ฒ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ์ ๋ ์ข๋ค๊ณ ํ๋จ๋๋ค๋ฉด ๋๋์ ๋ ์ข์ต๋๋ค. ๋๋ฒ์งธ๋ก ์ธ๊ธํ์ isRunning ๋ฉ์๋๋ ์ฅํ์ ์ค๋ฅ๊ฐ ์๊ณ ์ฝ๋์์๋ ๋๋ฝ๋์๋ค์.์๋์ ๊ฐ์ด isRunning() ๋ฉ์๋๋ก ์ถ์ถํ๋๊ฒ ๋ง์ต๋๋ค. private boolean isRunning() { return running == true; } ๋๋ฌด ๋ง์ ์ฅํ๋ฅผ ๋ง๋ค๋ค๋ณด๋ ํ์ธํ์ง ๋ชปํ ๋ถ๋ถ์ด ๋ง์๋ฐ ํ์ธํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์ด ๋ถ๋ถ์ ์์ ํด์ ์ปค๋ฐํด ๋์๊ฒ์. ๐
- 1
- 3
- 82
Q&A
์ํ, ์์, ์๋งค ๋๋ฉ์ธ ๊ด๊ณ์ ๋ํ ์ง๋ฌธ
๋๊ด๋ ์๋ ํ์ธ์.์ข์ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๐๋จผ์ ์ํ์ ์๋งค๋ N:M ๊ด๊ณ๊ฐ ์๋๋ผ 1:N ๊ด๊ณ์ ๋๋ค.์ด๋ค ๊ด๊ณ์์ ๋ค์ค์ฑ(multiplicity)์ ํ๋์ ๊ฐ์ฒด์ ๋ํด ์ฐ๊ฒฐ๋ ์ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ฐ์๋ฅผ ๋ํ๋ ๋๋ค.ํ๋์ ์ํ์๋ ์ฌ๋ฌ ๊ฐ์ ์๋งค๊ฐ ๋ง๋์ด์ง ์ ์๋๋ฐ ๋ฐํด ์๋งค๋ ํ๋์ ์ํ์ ๋ํด์๋ง ์์ฑ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ:์๋งค๋ 1:N ๊ด๊ณ์ ํด๋น๋ฉ๋๋ค.์์์ ๊ทธ ์์ฒด๋ก ๋๋ฉ์ธ์ ์กด์ฌํ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค.์๋ ๊ทธ๋ฆผ์์ ์ํ๋ "์ด์ฉ์๊ฐ์๋ค"์ด๊ณ ์๋์ ์๋งค ๊ฐ๋ฅํ 4๊ฐ์ ๋ฐ์ค๊ฐ ์์์ ํด๋น๋ฉ๋๋ค.(์ฌ์ง) ์ฐธ๊ณ ๋ก ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํด์ํ๊ธฐ ์ํด ์ค๊ฐ ํ ์ด๋ธ์ ์ถ๊ฐํ๋ ๊ฐ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง์ ์์ญ์ ํ์ ๋๋ ๊ธฐ๋ฒ์ ๋๋ค.๊ฐ์ฒด ๊ด๊ณ์์๋ ๋ค๋๋ค ๊ด๊ณ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํด์ํ๊ธฐ ์ํด ์ค๊ฐ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๊ณ ํ๋ ฅ ๊ด์ ์์ ํน์ ํ ๋์์ ์ํํ ๊ฐ์ฒด๊ฐ ํ์ํ๊ฑฐ๋ ๋๋ฉ์ธ ๊ด์ ์์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋ด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค. ๋ต๋ณ์ด ๋์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์. ๐๊ฐ์ฌํฉ๋๋ค.
- 1
- 2
- 64
Q&A
์ฑ ์์ฃผ๋ ์ค๊ณ ์ ์ฉ์ ๋ํ ๊ฐ๋จํ ์ง๋ฌธ ๋จ๊ฒจ๋๋ฆฝ๋๋ค.
Chanuk๋ ์๋ ํ์ธ์. ๐์ข์ ์ง๋ฌธ ๋จ๊ฒจ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์ ๊ฐ ์์นจ๋ถํฐ ๊ณ์ ๊ฐ์๋ฅผ ํ๋๋ผ ์ด์ ์์ผ ๋ต๊ธ์ ๋จ๊ธฐ๋ค์.๋ต๋ณ์ด ๋ฆ์ด์ ธ์ ์ฃ์กํฉ๋๋ค. ํ์ค์ ์ผ๋ก DB ์คํค๋ง๊ฐ ์ด๋ฏธ ์ ํด์ ธ ์๊ฑฐ๋, ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํด์ ์๋กญ๊ฒ ์ค๊ณํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ, ๋๋ DBA๊ฐ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ ํ๊ฒฝ์์๋ ์ฑ ์์ฃผ๋ ์ค๊ณ๋ฅผ ์ ์ฉํ๊ธฐ๊ฐ ์ฝ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฐ ์ํฉ์์๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ๋ฅผ ํ์ค์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์? (DAO๋ฅผ ์ค๊ฐ ๊ณ์ธต์ผ๋ก ๋๋ฉด ์ด๋ ์ ๋ ํด๊ฒฐ๋ ๊น์? ์๋๋ฉด ๋๋ฉ์ธ ๋ ์ด์ด์ ํผ์์คํด์ค ๋ ์ด์ด๋ ๋ถ๋ฆฌ๋ ์์ญ์ด๋ ํฌ๊ฒ ์๊ด์์๊น์? ๋ฐ๋๋ก, ๋ ๋ ์ด์ด๊ฐ ์ง๋์น๊ฒ ๋ฌ๋ผ์ง๋ฉด ์คํ๋ ค ์ ์ง๋ณด์๊ฐ ๋ ์ด๋ ค์์ง์ง๋ ์์๊น ํ๋ ๊ฑฑ์ ๋ ๋ญ๋๋ค.)๊ทผ๋ณธ์ ์ผ๋ก DB ์ค๊ณ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ์ ๊ทผ๋ฐฉ์๊ณผ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๊ท ํ๋ก์ ํธ๋ผ๊ณ ํ๋๋ผ๋ ๋ ๊ตฌ์กฐ ์ฌ์ด์ ์ฐจ์ด๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์ต๋๋ค.์ด๋ฐ ์ฐจ์ด๋ฅผ ์ํผ๋์ค ๋ถ์ผ์น(impedance mismatch) ๋ฌธ์ ๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ DB๋ ๋ฐ์ดํฐ ๊ด์ ์์ ์ค๋ณต์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณํด์ผ ํ๊ณ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ๊ฐ์์์ ์ค๋ช ๋๋ ธ๋ ๊ฒ์ฒ๋ผ ํ๋ ๊ด์ ์์ ์์ ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ํผ๋์ค ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ๋๊ตฌ๋ฅผ ORM(Object Relational Mapping)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. Java ์ง์์ JPA ํ์ค๊ณผ Hibernate ๊ตฌํ์ฒด๊ฐ ORM์ ๋ํ์ ์ธ ์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ORM์ ์ฌ์ฉํ๋ฉด ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ํ์ ์์ด ์ด๋ ์ ๋ DB์ ํด๋์ค ์ฌ์ด์ ์ฐจ์ด์ ์ ์์์ํฌ ์ ์์ต๋๋ค. ๋ฌผ๋ก ORM์ ๋ง๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ด์๋ฅผ ๋ค ํด๊ฒฐํด ์ฃผ์ง๋ ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ฉ์ ์ธ ๊ด์ ์์ ์์ ํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ํ๋ ค๊ณ ํ์๊ธฐ ๋ณด๋ค๋ ์ง๋ฌธ์์ ์ธ๊ธํ์ ๊ฒ์ฒ๋ผ ๋งคํ์ด ์ข ๋ ์์ํ ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ ํํ์ค ํ์๊ฐ ์์ต๋๋ค.ORM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ๊ธฐ๊ฐ ์์ํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ๋ง์ํ์ ๊ฒ์ฒ๋ผ ๋ ๊ฑฐ์ ํ ์ด๋ธ์ด ์ ๊ทํ๊ฐ ์๋ ์ํ๋ก ์ฅ๊ธฐ๊ฐ ์ ์ง๋ ๊ฒฝ์ฐ๊ฐ ์ฌ๊ธฐ์ ํด๋นํฉ๋๋ค. ์ด๋ ๊ฒ ๊ทน๋จ์ ์ผ๋ก ๋งคํ์ด ์ด๋ ต์ง๋ง ๊ฐ์ฒด์งํฅ ์ค๊ณ ๋ฐฉ์์ ์ ํํ์๋๊ฒ ์ฅ์ ์ด ํฌ๋ค๊ณ ํ๋จ๋์๋ฉด ํ ์ด๋ธ๊ณผ 1:1๋ก ๋งคํ๋๋ ๋ฐ์ดํฐ ์ฉ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ด ๋ฐ์ดํฐ์ฉ ํด๋์ค๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ ํ ๊ฐ์ฒด ๊ตฌ์กฐ๋ก ๋ค์ ๋งคํํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์ด ๋ฐฉ์์ ํ ์ด๋ธ ์คํค๋ง์ ์ฝ๋งค์ด์ง ์๊ณ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ์์ ๋กญ๊ฒ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง ๋ฐ์ดํฐ์ฉ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ํ ํด๋์ค๋ฅผ ํจ๊ป ์ ์งํด์ผ ํ๋ค๋ ๋จ์ ๋ ์กด์ฌํฉ๋๋ค. ๋ฌธ์ ์ ๋ณต์ก๋์ ์ ์ง๋ณด์ ๊ด์ ์์์ ์ฅ๋จ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํฉํ ๋ฐฉ๋ฒ์ ์ ํํ์๋ฉด ๋ ๊ฒ ๊ฐ์์. ๊ทธ๋ฆฌ๊ณ , ์ฑ ์์ฃผ๋ ์ค๊ณ๊ฐ ์ด๋ก ์ ์ผ๋ก๋ ์ ์ง๋ณด์์ ๊ฐํ๋ค๊ณ ํ์ง๋ง, ์ค์ ๋ก๋ ์์ง ๊ตฌ์กฐ๊ฐ ๋ค์ ๋ณต์กํ๊ฒ ๋๊ปด์ ธ์ ์คํ๋ ค ์ ์ง๋ณด์์ฑ์ ํด์น ์๋ ์์ง ์์๊น ํฉ๋๋ค. ์ด๋ฐ ๋ณต์กํจ์ ์ค๊ณ ํจํด์ ์ต์ํด์ง๋ฉด ์์ฐ์ค๋ฝ๊ฒ ํด์๋ ๊น์? ๋ง์ํ์ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋ํด ์์ง ์ต์ํ์ง ์๋ค๋ณด๋ ๋ณต์กํ๊ณ ์ด๋ ต๊ฒ ๋๋ผ์๋๊ฒ ์๋๊น ์ถ์ด์. ์ ์ฐจ์ ์ธ ์ค๊ณ์์ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ก ์ด๋ํ๋ ์ํฉ์ ํจ๋ฌ๋ค์ ์ ํ(paradigm shift)๋ผ๊ณ ๋ถ๋ฅผ ์ ๋๋ก ์ ์ฐจ์ ์ธ ์ฌ๊ณ ๋ฐฉ์์ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฌ๊ณ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ ์ผ์ ๋งค์ฐ ์ด๋ ต๊ณ ํ๋ ์ผ์ด๊ธฐ๋ ํฉ๋๋ค(์ ๋ ๊ฒช์๋ ๋ฌธ์ ๊ตฌ์). ์ ์ฐจ์ ์ธ ๋ฐฉ์์ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์ฝ์ ๋๋ ๊ฐ์ฒด์งํฅ๋ณด๋ค ์ฝ๊ฒ ๋๊ปด์ง๋๋ค. ๋ฐ๋ฉด์ ๊ฐ์ฒด์งํฅ์ ๊ธฐ์กด ์ฝ๋์์ ์์ ํ ๋ถ๋ถ์ ์ฐพ๊ฑฐ๋ ์ฝ๋๋ฅผ ์์ ํ ๋ ์ ์ฐจ์ ์ธ ๋ฐฉ์๋ณด๋ค ๋ ์ฝ๊ฒ ๋๊ปด์ง๋๋ค. ๋ค์ ๋งํด์ ์ ์ฐจ์ ์ธ ๋ฐฉ์์ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ์ ๋ฆฌํ์ง๋ง ์ ์ง๋ณด์์ ์ธก๋ฉด์์๋ ์ข์ง ์๊ณ , ๊ฐ์ฒด์งํฅ์ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ๋ถ๋ฆฌํ์ง๋ง ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ์ ๋ฆฌํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ ์๊ฐ์ ๊ฐ์ฒด์งํฅ์ด ๋ณต์กํ๋ค๊ณ ๋๋ผ์๋ ์ด์ ๋ ์ฒ์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ค์ด๊ฐ๋ ๋ ธ๋ ฅ์ด ์ ์ฐจ์ ์ธ ๋ฐฉ์๋ณด๋ค ๋ ํฌ๊ธฐ ๋๋ฌธ์ด ์๋๊น ์ถ์ด์. ์ ์ง๋ณด์ ๋จ๊ณ์์์ ์ฅ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ค์ ๋ก ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ์ฝ๋๋ฅผ ์์ ํด๋ณธ ๊ฒฝํ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ์ ์ต์ํด์ง์๊ณ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ํฉ์์ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒฝํ์ด ์์ด๋ฉด ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๊ฐ์ฒด์งํฅ์ด ์ ๋ฆฌํ ์ด์ ๋ฅผ ์ดํดํ์๊ฒ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.๋ต๋ณ์ด ๋์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์. ๐ํ๋ณตํ ์ฃผ๋ง ๋ณด๋ด์ธ์!
- 1
- 2
- 88




