From 2f994f270951dba6bf8ac61e0ab2b845b7250a9c Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:45:27 +0900 Subject: [PATCH 01/21] =?UTF-8?q?docs:=20readme=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..1f24b5ee 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +헥사고날 아키텍처 연습\ +DDD 연습\ +일반적인 RESTful api 서버가 M, C를 담당하고 브라우저가 V를 담당하니 비슷하게 구성\ +Proxy를 통해 스프링의 @RequestBody처럼 컨트롤러에 들어온 데이터를 알맞게 변환하면 좋겠지만 V에서 바로 변환 + +1. domain entity 작성 +2. port, dto 작성 +3. service 작성 +4. adaptor 작성 +5. view 작성 +6. application 작성 \ No newline at end of file From 7b22603bdb7a3bc5ce2e208fc66085a28cfcc80b Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:46:20 +0900 Subject: [PATCH 02/21] feat: domain --- .../java/katecam/racingcar/domain/Car.java | 23 +++++++++ .../java/katecam/racingcar/domain/Game.java | 50 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/main/java/katecam/racingcar/domain/Car.java create mode 100644 src/main/java/katecam/racingcar/domain/Game.java diff --git a/src/main/java/katecam/racingcar/domain/Car.java b/src/main/java/katecam/racingcar/domain/Car.java new file mode 100644 index 00000000..c757e958 --- /dev/null +++ b/src/main/java/katecam/racingcar/domain/Car.java @@ -0,0 +1,23 @@ +package katecam.racingcar.domain; + + +public class Car { + private final String name; + private int position; + + public Car(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void move(){ + position++; + } + + public int getPosition() { + return position; + } +} diff --git a/src/main/java/katecam/racingcar/domain/Game.java b/src/main/java/katecam/racingcar/domain/Game.java new file mode 100644 index 00000000..29e70189 --- /dev/null +++ b/src/main/java/katecam/racingcar/domain/Game.java @@ -0,0 +1,50 @@ +package katecam.racingcar.domain; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.stream.Collectors; + +public class Game { + private final List cars; + private final int numberToAttempt; + private int attemptedNumber; + private final Random random; + + public Game(List carNames, int carNumber) { + this.cars = carNames.stream() + .map(Car::new) + .toList(); + this.numberToAttempt = carNumber; + this.random = new Random(); + } + + //UnmodifiableList + public List getCars(){ + return this.cars; + } + + public List getWinners(){ + if (!isEnded()) throw new IllegalStateException("게임 종료 안됨"); + return this.cars.stream() + .collect(Collectors.groupingBy(Car::getPosition)) + .entrySet().stream() + .max(Map.Entry.comparingByKey()) + .map(Entry::getValue) + .orElseGet(List::of); + } + + public void playTurn() { + if (isEnded()) throw new IllegalStateException("게임이 이미 종료됨"); + cars.forEach(car->{ + if (random.nextInt(10) >= 4) + car.move(); + }); + attemptedNumber++; + } + + public boolean isEnded(){ + return this.attemptedNumber == this.numberToAttempt; + } +} From 5ac84148a96f76dd7080f3516938b1ead4cbae6d Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:47:17 +0900 Subject: [PATCH 03/21] =?UTF-8?q?feat:=20=ED=8F=AC=ED=8A=B8=EC=99=80=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=AA=A8=EB=8D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/command/GameInitializationReq.java | 22 +++++++++++++++++++ .../application/dto/query/CarPositionRes.java | 5 +++++ .../dto/query/GameTotalResultRes.java | 11 ++++++++++ .../dto/query/GameTurnResultRes.java | 17 ++++++++++++++ .../in/command/GameInitializationUseCase.java | 7 ++++++ .../port/in/command/GameTurnPlayUseCase.java | 5 +++++ .../port/in/query/GameStatusQuery.java | 10 +++++++++ 7 files changed, 77 insertions(+) create mode 100644 src/main/java/katecam/racingcar/application/dto/command/GameInitializationReq.java create mode 100644 src/main/java/katecam/racingcar/application/dto/query/CarPositionRes.java create mode 100644 src/main/java/katecam/racingcar/application/dto/query/GameTotalResultRes.java create mode 100644 src/main/java/katecam/racingcar/application/dto/query/GameTurnResultRes.java create mode 100644 src/main/java/katecam/racingcar/application/port/in/command/GameInitializationUseCase.java create mode 100644 src/main/java/katecam/racingcar/application/port/in/command/GameTurnPlayUseCase.java create mode 100644 src/main/java/katecam/racingcar/application/port/in/query/GameStatusQuery.java diff --git a/src/main/java/katecam/racingcar/application/dto/command/GameInitializationReq.java b/src/main/java/katecam/racingcar/application/dto/command/GameInitializationReq.java new file mode 100644 index 00000000..800a4a27 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/dto/command/GameInitializationReq.java @@ -0,0 +1,22 @@ +package katecam.racingcar.application.dto.command; + +import java.util.List; + +public record GameInitializationReq( + List carNames, + int numberToAttempt +) { + + public GameInitializationReq{ + if (carNames == null || carNames.isEmpty()) + throw new IllegalArgumentException("리스트 비었음"); + + carNames.forEach(name-> { + if (name == null || name.length() < 5) + throw new IllegalArgumentException("5자리 이상 입력"); + }); + + if (numberToAttempt <= 0) + throw new IllegalArgumentException("올바른 시도 횟수 입력"); + } +} diff --git a/src/main/java/katecam/racingcar/application/dto/query/CarPositionRes.java b/src/main/java/katecam/racingcar/application/dto/query/CarPositionRes.java new file mode 100644 index 00000000..e0dd4259 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/dto/query/CarPositionRes.java @@ -0,0 +1,5 @@ +package katecam.racingcar.application.dto.query; + +public record CarPositionRes(String carName, int position) { + +} diff --git a/src/main/java/katecam/racingcar/application/dto/query/GameTotalResultRes.java b/src/main/java/katecam/racingcar/application/dto/query/GameTotalResultRes.java new file mode 100644 index 00000000..6596daeb --- /dev/null +++ b/src/main/java/katecam/racingcar/application/dto/query/GameTotalResultRes.java @@ -0,0 +1,11 @@ +package katecam.racingcar.application.dto.query; + +import java.util.List; + +public record GameTotalResultRes(List winners) { + + @Override + public String toString() { + return "최종 우승자 : " + String.join(", ", winners); + } +} diff --git a/src/main/java/katecam/racingcar/application/dto/query/GameTurnResultRes.java b/src/main/java/katecam/racingcar/application/dto/query/GameTurnResultRes.java new file mode 100644 index 00000000..609f48dd --- /dev/null +++ b/src/main/java/katecam/racingcar/application/dto/query/GameTurnResultRes.java @@ -0,0 +1,17 @@ +package katecam.racingcar.application.dto.query; + +import java.util.List; + +public record GameTurnResultRes(List carPositions) { + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + this.carPositions.forEach(carPosition -> + sb.append(carPosition.carName()) + .append(" : ") + .append("-".repeat(carPosition.position())) + .append("\n") + ); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/katecam/racingcar/application/port/in/command/GameInitializationUseCase.java b/src/main/java/katecam/racingcar/application/port/in/command/GameInitializationUseCase.java new file mode 100644 index 00000000..14da3b9d --- /dev/null +++ b/src/main/java/katecam/racingcar/application/port/in/command/GameInitializationUseCase.java @@ -0,0 +1,7 @@ +package katecam.racingcar.application.port.in.command; + +import katecam.racingcar.application.dto.command.GameInitializationReq; + +public interface GameInitializationUseCase { + void initialize(GameInitializationReq req); +} diff --git a/src/main/java/katecam/racingcar/application/port/in/command/GameTurnPlayUseCase.java b/src/main/java/katecam/racingcar/application/port/in/command/GameTurnPlayUseCase.java new file mode 100644 index 00000000..1b90ea8f --- /dev/null +++ b/src/main/java/katecam/racingcar/application/port/in/command/GameTurnPlayUseCase.java @@ -0,0 +1,5 @@ +package katecam.racingcar.application.port.in.command; + +public interface GameTurnPlayUseCase { + void playTurn(); +} diff --git a/src/main/java/katecam/racingcar/application/port/in/query/GameStatusQuery.java b/src/main/java/katecam/racingcar/application/port/in/query/GameStatusQuery.java new file mode 100644 index 00000000..d6938719 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/port/in/query/GameStatusQuery.java @@ -0,0 +1,10 @@ +package katecam.racingcar.application.port.in.query; + +import katecam.racingcar.application.dto.query.GameTotalResultRes; +import katecam.racingcar.application.dto.query.GameTurnResultRes; + +public interface GameStatusQuery { + boolean isEnded(); + GameTurnResultRes getTurnResult(); + GameTotalResultRes getTotalResult(); +} From a0b1b15e41affaff40aad8a80fcc280f209eeb8f Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:47:40 +0900 Subject: [PATCH 04/21] =?UTF-8?q?feat:=20=EC=84=9C=EB=B9=84=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/GameInitializationService.java | 20 +++++++++ .../service/command/GameTurnPlayService.java | 18 ++++++++ .../service/query/GameStatusQueryService.java | 44 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java create mode 100644 src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java create mode 100644 src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java diff --git a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java new file mode 100644 index 00000000..4ac23a61 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java @@ -0,0 +1,20 @@ +package katecam.racingcar.application.service.command; + +import katecam.racingcar.application.dto.command.GameInitializationReq; +import katecam.racingcar.application.port.in.command.GameInitializationUseCase; +import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.domain.Game; + +public class GameInitializationService implements GameInitializationUseCase { + private final GameRepository gameRepository; + + public GameInitializationService(GameRepository gameRepository) { + this.gameRepository = gameRepository; + } + + @Override + public void initialize(GameInitializationReq req) { + Game game = new Game(req.carNames(), req.numberToAttempt()); + gameRepository.save(game); + } +} diff --git a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java new file mode 100644 index 00000000..306f9e64 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java @@ -0,0 +1,18 @@ +package katecam.racingcar.application.service.command; + +import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; +import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.domain.Game; + +public class GameTurnPlayService implements GameTurnPlayUseCase { + private final GameRepository gameRepository; + + public GameTurnPlayService(GameRepository gameRepository) { + this.gameRepository = gameRepository; + } + @Override + public void playTurn() { + Game game = gameRepository.getOrThrow(); + game.playTurn(); + } +} diff --git a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java new file mode 100644 index 00000000..b354a960 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java @@ -0,0 +1,44 @@ +package katecam.racingcar.application.service.query; + + +import java.util.List; +import katecam.racingcar.application.dto.query.CarPositionRes; +import katecam.racingcar.application.dto.query.GameTotalResultRes; +import katecam.racingcar.application.dto.query.GameTurnResultRes; +import katecam.racingcar.application.port.in.query.GameStatusQuery; +import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.domain.Car; +import katecam.racingcar.domain.Game; + +//TODO: 매번 게임 가져오는거 좀 그런데 +public class GameStatusQueryService implements GameStatusQuery { + private final GameRepository gameRepository; + + public GameStatusQueryService(GameRepository gameRepository) { + this.gameRepository = gameRepository; + } + + @Override + public boolean isEnded() { + Game game = gameRepository.getOrThrow(); + return game.isEnded(); + } + + @Override + public GameTurnResultRes getTurnResult() { + Game game = gameRepository.getOrThrow(); + List carPositions= game.getCars().stream() + .map(car->new CarPositionRes(car.getName(), car.getPosition())) + .toList(); + return new GameTurnResultRes(carPositions); + } + + @Override + public GameTotalResultRes getTotalResult() { + Game game = gameRepository.getOrThrow(); + List winnerNames = game.getWinners().stream() + .map(Car::getName) + .toList(); + return new GameTotalResultRes(winnerNames); + } +} From 76efbcee63e253e8fdcdbea7aad3314b63fc1a9e Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:47:58 +0900 Subject: [PATCH 05/21] feat: adaptor --- .../adaptor/in/RacingCarController.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java diff --git a/src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java b/src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java new file mode 100644 index 00000000..9bc9e580 --- /dev/null +++ b/src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java @@ -0,0 +1,36 @@ +package katecam.racingcar.adaptor.in; + +import java.util.List; +import katecam.racingcar.application.dto.command.GameInitializationReq; +import katecam.racingcar.application.port.in.command.GameInitializationUseCase; +import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; +import katecam.racingcar.application.port.in.query.GameStatusQuery; + +public class RacingCarController { + private final GameInitializationUseCase gameInitializationUseCase; + private final GameTurnPlayUseCase gameTurnPlayUseCase; + private final GameStatusQuery gameStatusQuery; + + public RacingCarController(GameInitializationUseCase gameInitializationUseCase, + GameTurnPlayUseCase gameTurnPlayUseCase, GameStatusQuery gameStatusQuery) { + this.gameInitializationUseCase = gameInitializationUseCase; + this.gameTurnPlayUseCase = gameTurnPlayUseCase; + this.gameStatusQuery = gameStatusQuery; + } + + public void initGame(List carNames, int numberToAttempt){ + gameInitializationUseCase.initialize(new GameInitializationReq(carNames, numberToAttempt)); + } + public void playTurn(){ + gameTurnPlayUseCase.playTurn(); + } + public boolean isEnded(){ + return gameStatusQuery.isEnded(); + } + public String getTurnResult(){ + return gameStatusQuery.getTurnResult().toString(); + } + public String getTotalResult(){ + return gameStatusQuery.getTotalResult().toString(); + } +} \ No newline at end of file From dbc0f5145c09899cb7905fc0e338bf1d1ef2d6f9 Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:49:36 +0900 Subject: [PATCH 06/21] feat: view --- src/main/java/katecam/RacingCarView.java | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/katecam/RacingCarView.java diff --git a/src/main/java/katecam/RacingCarView.java b/src/main/java/katecam/RacingCarView.java new file mode 100644 index 00000000..87e6ea2e --- /dev/null +++ b/src/main/java/katecam/RacingCarView.java @@ -0,0 +1,37 @@ +package katecam; + +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.List; +import java.util.Scanner; + +public class RacingCarView { + private final Scanner scanner; + public RacingCarView() { + this.scanner = new Scanner(System.in); + } + + public List getCarNames(){ + display("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + return Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .toList(); + } + + public int getNumberToAttempt(){ + display("시도할 회수는 몇회인가요?"); + int numberToAttempt; + try{ + numberToAttempt = scanner.nextInt(); + }catch (InputMismatchException e){ + throw new IllegalArgumentException("숫자를 입력하세요"); + }finally { + scanner.nextLine(); + } + return numberToAttempt; + } + + public void display(String string){ + System.out.println(string); + } +} From 753239fbe130b6ad6fc44b263b6ac56d67b62f8f Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:50:23 +0900 Subject: [PATCH 07/21] =?UTF-8?q?docs:=20readme=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f24b5ee..da4a1fe0 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,5 @@ Proxy를 통해 스프링의 @RequestBody처럼 컨트롤러에 들어온 데이 3. service 작성 4. adaptor 작성 5. view 작성 -6. application 작성 \ No newline at end of file +6. config 작성 +7. application 작성 \ No newline at end of file From b61908e8ce329c9ab32fe26f7d75faa3a935fbc4 Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:51:12 +0900 Subject: [PATCH 08/21] feat: config --- .../katecam/racingcar/config/AppConfig.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/katecam/racingcar/config/AppConfig.java diff --git a/src/main/java/katecam/racingcar/config/AppConfig.java b/src/main/java/katecam/racingcar/config/AppConfig.java new file mode 100644 index 00000000..3dca313c --- /dev/null +++ b/src/main/java/katecam/racingcar/config/AppConfig.java @@ -0,0 +1,42 @@ +package katecam.racingcar.config; + +import katecam.RacingCarView; +import katecam.racingcar.adaptor.in.RacingCarController; +import katecam.racingcar.adaptor.out.InMemoryGameRepository; +import katecam.racingcar.application.port.in.command.GameInitializationUseCase; +import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; +import katecam.racingcar.application.port.in.query.GameStatusQuery; +import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.service.command.GameInitializationService; +import katecam.racingcar.application.service.command.GameTurnPlayService; +import katecam.racingcar.application.service.query.GameStatusQueryService; + +public class AppConfig { + private static GameRepository gameRepository; + private static GameInitializationUseCase gameInitializationUseCase; + private static GameTurnPlayUseCase gameTurnPlayUseCase; + private static GameStatusQuery gameStatusQuery; + private static RacingCarController racingCarController; + private static RacingCarView racingCarView; + + static { + gameRepository = new InMemoryGameRepository(); + gameInitializationUseCase = new GameInitializationService(gameRepository); + gameTurnPlayUseCase = new GameTurnPlayService(gameRepository); + gameStatusQuery = new GameStatusQueryService(gameRepository); + racingCarController = new RacingCarController( + gameInitializationUseCase, + gameTurnPlayUseCase, + gameStatusQuery + ); + racingCarView = new RacingCarView(); + } + + public static RacingCarController getRacingCarController() { + return racingCarController; + } + + public static RacingCarView getRacingCarView() { + return racingCarView; + } +} \ No newline at end of file From c6a01523d6d67d90492d8e5de0bb3e80e9c0ee6d Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:51:26 +0900 Subject: [PATCH 09/21] feat: Application --- src/main/java/katecam/Application.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/katecam/Application.java diff --git a/src/main/java/katecam/Application.java b/src/main/java/katecam/Application.java new file mode 100644 index 00000000..4a34837e --- /dev/null +++ b/src/main/java/katecam/Application.java @@ -0,0 +1,26 @@ +package katecam; + +import katecam.racingcar.adaptor.in.RacingCarController; +import katecam.racingcar.config.AppConfig; + +public class Application { + private static final RacingCarController racingCarController = AppConfig.getRacingCarController(); + private static final RacingCarView racingCarView = AppConfig.getRacingCarView(); + + public static void main(String[] args) { + boolean valid = false; + while (!valid) + try{ + racingCarController.initGame(racingCarView.getCarNames(), racingCarView.getNumberToAttempt()); + racingCarView.display("\n실행 결과"); + valid = true; + }catch (IllegalArgumentException e){ + racingCarView.display(e.getMessage()); + } + do{ + racingCarController.playTurn(); + racingCarView.display(racingCarController.getTurnResult()); + }while(!racingCarController.isEnded()); + racingCarView.display(racingCarController.getTotalResult()); + } +} From a99f212b91e8a110f29d9a969164262ea35d900e Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 30 May 2024 08:57:11 +0900 Subject: [PATCH 10/21] feat: adaptor/out --- .../adaptor/out/InMemoryGameRepository.java | 26 +++++++++++++++++++ .../application/port/out/GameRepository.java | 9 +++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java create mode 100644 src/main/java/katecam/racingcar/application/port/out/GameRepository.java diff --git a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java new file mode 100644 index 00000000..c808ae39 --- /dev/null +++ b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java @@ -0,0 +1,26 @@ +package katecam.racingcar.adaptor.out; + +import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.domain.Game; + +public class InMemoryGameRepository implements GameRepository { + private Game game; + @Override + public void save(Game game) { + if (this.game != null) + throw new IllegalStateException("저장된 게임 있음"); + this.game = game; + } + + @Override + public Game getOrThrow() { + if (this.game == null) + throw new IllegalStateException("저장된 게임 없음"); + return this.game; + } + + @Override + public void delete(){ + this.game = null; + } +} diff --git a/src/main/java/katecam/racingcar/application/port/out/GameRepository.java b/src/main/java/katecam/racingcar/application/port/out/GameRepository.java new file mode 100644 index 00000000..efe3ae9d --- /dev/null +++ b/src/main/java/katecam/racingcar/application/port/out/GameRepository.java @@ -0,0 +1,9 @@ +package katecam.racingcar.application.port.out; + +import katecam.racingcar.domain.Game; + +public interface GameRepository { + void save(Game game); + Game getOrThrow(); + void delete(); +} From fd1265710615c215162a18a0e829a34ee64a060e Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 3 Jun 2024 15:23:44 +0900 Subject: [PATCH 11/21] =?UTF-8?q?fix:=20port=20=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...epository.java => InMemoryGameAdaptor.java} | 5 +++-- .../{GameRepository.java => GameLoadPort.java} | 3 +-- .../application/port/out/GameRecordPort.java | 7 +++++++ .../command/GameInitializationService.java | 10 +++++----- .../service/command/GameTurnPlayService.java | 12 +++++++----- .../service/query/GameStatusQueryService.java | 16 ++++++++-------- .../katecam/racingcar/config/AppConfig.java | 18 +++++++++++------- 7 files changed, 42 insertions(+), 29 deletions(-) rename src/main/java/katecam/racingcar/adaptor/out/{InMemoryGameRepository.java => InMemoryGameAdaptor.java} (73%) rename src/main/java/katecam/racingcar/application/port/out/{GameRepository.java => GameLoadPort.java} (70%) create mode 100644 src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java diff --git a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java similarity index 73% rename from src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java rename to src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java index c808ae39..9ff6b942 100644 --- a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameRepository.java +++ b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java @@ -1,9 +1,10 @@ package katecam.racingcar.adaptor.out; -import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.port.out.GameLoadPort; +import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Game; -public class InMemoryGameRepository implements GameRepository { +public class InMemoryGameAdaptor implements GameLoadPort, GameRecordPort { private Game game; @Override public void save(Game game) { diff --git a/src/main/java/katecam/racingcar/application/port/out/GameRepository.java b/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java similarity index 70% rename from src/main/java/katecam/racingcar/application/port/out/GameRepository.java rename to src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java index efe3ae9d..aa67dc5e 100644 --- a/src/main/java/katecam/racingcar/application/port/out/GameRepository.java +++ b/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java @@ -2,8 +2,7 @@ import katecam.racingcar.domain.Game; -public interface GameRepository { +public interface GameLoadPort { void save(Game game); - Game getOrThrow(); void delete(); } diff --git a/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java b/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java new file mode 100644 index 00000000..ba700215 --- /dev/null +++ b/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java @@ -0,0 +1,7 @@ +package katecam.racingcar.application.port.out; + +import katecam.racingcar.domain.Game; + +public interface GameRecordPort { + Game getOrThrow(); +} diff --git a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java index 4ac23a61..d05689f9 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java +++ b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java @@ -2,19 +2,19 @@ import katecam.racingcar.application.dto.command.GameInitializationReq; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; -import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.domain.Game; public class GameInitializationService implements GameInitializationUseCase { - private final GameRepository gameRepository; + private final GameLoadPort gameLoadPort; - public GameInitializationService(GameRepository gameRepository) { - this.gameRepository = gameRepository; + public GameInitializationService(GameLoadPort gameLoadPort) { + this.gameLoadPort = gameLoadPort; } @Override public void initialize(GameInitializationReq req) { Game game = new Game(req.carNames(), req.numberToAttempt()); - gameRepository.save(game); + gameLoadPort.save(game); } } diff --git a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java index 306f9e64..e1d321cd 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java +++ b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java @@ -1,18 +1,20 @@ package katecam.racingcar.application.service.command; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; -import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.port.out.GameLoadPort; +import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Game; public class GameTurnPlayService implements GameTurnPlayUseCase { - private final GameRepository gameRepository; + private final GameRecordPort gameRecordPort; - public GameTurnPlayService(GameRepository gameRepository) { - this.gameRepository = gameRepository; + public GameTurnPlayService(GameRecordPort gameRecordPort) { + this.gameRecordPort = gameRecordPort; } + @Override public void playTurn() { - Game game = gameRepository.getOrThrow(); + Game game = gameRecordPort.getOrThrow(); game.playTurn(); } } diff --git a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java index b354a960..aea966fb 100644 --- a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java +++ b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java @@ -6,27 +6,27 @@ import katecam.racingcar.application.dto.query.GameTotalResultRes; import katecam.racingcar.application.dto.query.GameTurnResultRes; import katecam.racingcar.application.port.in.query.GameStatusQuery; -import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.port.out.GameLoadPort; +import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Car; import katecam.racingcar.domain.Game; -//TODO: 매번 게임 가져오는거 좀 그런데 public class GameStatusQueryService implements GameStatusQuery { - private final GameRepository gameRepository; + private final GameRecordPort gameRecordPort; - public GameStatusQueryService(GameRepository gameRepository) { - this.gameRepository = gameRepository; + public GameStatusQueryService(GameRecordPort gameRecordPort) { + this.gameRecordPort = gameRecordPort; } @Override public boolean isEnded() { - Game game = gameRepository.getOrThrow(); + Game game = gameRecordPort.getOrThrow(); return game.isEnded(); } @Override public GameTurnResultRes getTurnResult() { - Game game = gameRepository.getOrThrow(); + Game game = gameRecordPort.getOrThrow(); List carPositions= game.getCars().stream() .map(car->new CarPositionRes(car.getName(), car.getPosition())) .toList(); @@ -35,7 +35,7 @@ public GameTurnResultRes getTurnResult() { @Override public GameTotalResultRes getTotalResult() { - Game game = gameRepository.getOrThrow(); + Game game = gameRecordPort.getOrThrow(); List winnerNames = game.getWinners().stream() .map(Car::getName) .toList(); diff --git a/src/main/java/katecam/racingcar/config/AppConfig.java b/src/main/java/katecam/racingcar/config/AppConfig.java index 3dca313c..7bf87303 100644 --- a/src/main/java/katecam/racingcar/config/AppConfig.java +++ b/src/main/java/katecam/racingcar/config/AppConfig.java @@ -2,17 +2,19 @@ import katecam.RacingCarView; import katecam.racingcar.adaptor.in.RacingCarController; -import katecam.racingcar.adaptor.out.InMemoryGameRepository; +import katecam.racingcar.adaptor.out.InMemoryGameAdaptor; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; import katecam.racingcar.application.port.in.query.GameStatusQuery; -import katecam.racingcar.application.port.out.GameRepository; +import katecam.racingcar.application.port.out.GameLoadPort; +import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.application.service.command.GameInitializationService; import katecam.racingcar.application.service.command.GameTurnPlayService; import katecam.racingcar.application.service.query.GameStatusQueryService; public class AppConfig { - private static GameRepository gameRepository; + private static GameRecordPort gameRecordPort; + private static GameLoadPort gameLoadPort; private static GameInitializationUseCase gameInitializationUseCase; private static GameTurnPlayUseCase gameTurnPlayUseCase; private static GameStatusQuery gameStatusQuery; @@ -20,10 +22,12 @@ public class AppConfig { private static RacingCarView racingCarView; static { - gameRepository = new InMemoryGameRepository(); - gameInitializationUseCase = new GameInitializationService(gameRepository); - gameTurnPlayUseCase = new GameTurnPlayService(gameRepository); - gameStatusQuery = new GameStatusQueryService(gameRepository); + InMemoryGameAdaptor inMemoryGameAdaptor = new InMemoryGameAdaptor(); + gameLoadPort = inMemoryGameAdaptor; + gameRecordPort = inMemoryGameAdaptor; + gameInitializationUseCase = new GameInitializationService(gameLoadPort); + gameTurnPlayUseCase = new GameTurnPlayService(gameRecordPort); + gameStatusQuery = new GameStatusQueryService(gameRecordPort); racingCarController = new RacingCarController( gameInitializationUseCase, gameTurnPlayUseCase, From 9fe1496ebc075cae19a63956a3ebe2dbec122067 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 3 Jun 2024 21:43:05 +0900 Subject: [PATCH 12/21] =?UTF-8?q?docs:=20readme=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index da4a1fe0..d7175610 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # java-racingcar-precourse 헥사고날 아키텍처 연습\ -DDD 연습\ 일반적인 RESTful api 서버가 M, C를 담당하고 브라우저가 V를 담당하니 비슷하게 구성\ Proxy를 통해 스프링의 @RequestBody처럼 컨트롤러에 들어온 데이터를 알맞게 변환하면 좋겠지만 V에서 바로 변환 From ba6011ad36c74859ef4a1ebdd3db3dfdf7fe5250 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 3 Jun 2024 23:16:15 +0900 Subject: [PATCH 13/21] =?UTF-8?q?fix:=20=EC=84=A4=EC=A0=95=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/katecam/Application.java | 2 +- src/main/java/katecam/racingcar/config/AppConfig.java | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/katecam/Application.java b/src/main/java/katecam/Application.java index 4a34837e..fb2b817e 100644 --- a/src/main/java/katecam/Application.java +++ b/src/main/java/katecam/Application.java @@ -5,7 +5,7 @@ public class Application { private static final RacingCarController racingCarController = AppConfig.getRacingCarController(); - private static final RacingCarView racingCarView = AppConfig.getRacingCarView(); + private static final RacingCarView racingCarView = new RacingCarView(); public static void main(String[] args) { boolean valid = false; diff --git a/src/main/java/katecam/racingcar/config/AppConfig.java b/src/main/java/katecam/racingcar/config/AppConfig.java index 7bf87303..1281ca4f 100644 --- a/src/main/java/katecam/racingcar/config/AppConfig.java +++ b/src/main/java/katecam/racingcar/config/AppConfig.java @@ -1,6 +1,5 @@ package katecam.racingcar.config; -import katecam.RacingCarView; import katecam.racingcar.adaptor.in.RacingCarController; import katecam.racingcar.adaptor.out.InMemoryGameAdaptor; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; @@ -19,7 +18,6 @@ public class AppConfig { private static GameTurnPlayUseCase gameTurnPlayUseCase; private static GameStatusQuery gameStatusQuery; private static RacingCarController racingCarController; - private static RacingCarView racingCarView; static { InMemoryGameAdaptor inMemoryGameAdaptor = new InMemoryGameAdaptor(); @@ -33,14 +31,9 @@ public class AppConfig { gameTurnPlayUseCase, gameStatusQuery ); - racingCarView = new RacingCarView(); } public static RacingCarController getRacingCarController() { return racingCarController; } - - public static RacingCarView getRacingCarView() { - return racingCarView; - } } \ No newline at end of file From 9195ba0e0fae18f2f9d140cad85a5de28ab72af4 Mon Sep 17 00:00:00 2001 From: coco3x Date: Wed, 5 Jun 2024 23:43:05 +0900 Subject: [PATCH 14/21] =?UTF-8?q?fix:=20=EB=B0=B8=EB=A5=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/katecam/racingcar/domain/Car.java | 19 ++++++++-- .../java/katecam/racingcar/domain/Cars.java | 38 +++++++++++++++++++ .../java/katecam/racingcar/domain/Game.java | 27 +++---------- 3 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 src/main/java/katecam/racingcar/domain/Cars.java diff --git a/src/main/java/katecam/racingcar/domain/Car.java b/src/main/java/katecam/racingcar/domain/Car.java index c757e958..6c591cac 100644 --- a/src/main/java/katecam/racingcar/domain/Car.java +++ b/src/main/java/katecam/racingcar/domain/Car.java @@ -1,20 +1,31 @@ package katecam.racingcar.domain; -public class Car { +import java.util.Random; + +public final class Car { private final String name; - private int position; + private final int position; + private static final Random random; + static { + random = new Random(); + } public Car(String name) { + this(name, 0); + } + + public Car(String name, int position) { this.name = name; + this.position = position; } public String getName() { return name; } - public void move(){ - position++; + public Car move(){ + return (random.nextInt(10) >= 4) ? new Car(this.name, this.position + 1) : this; } public int getPosition() { diff --git a/src/main/java/katecam/racingcar/domain/Cars.java b/src/main/java/katecam/racingcar/domain/Cars.java new file mode 100644 index 00000000..82a4195a --- /dev/null +++ b/src/main/java/katecam/racingcar/domain/Cars.java @@ -0,0 +1,38 @@ +package katecam.racingcar.domain; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public final class Cars { + private final List cars; + + private Cars(List cars) { + this.cars = cars; + } + + public static Cars of(List carNames){ + return new Cars(carNames.stream() + .map(Car::new) + .collect(Collectors.toList())); //Cars를 불변 객체로 만들지 않았으므로 수정될 수 있는 List를 만들어야 함 + } + + public void moveAll(){ + IntStream.range(0, cars.size()) + .forEach(i-> cars.set(i, cars.get(i).move())); + } + public List getWinners(){ + return this.cars.stream() + .collect(Collectors.groupingBy(Car::getPosition)) + .entrySet().stream() + .max(Map.Entry.comparingByKey()) + .map(Entry::getValue) + .orElseGet(List::of); + } + public List getCars(){ + return Collections.unmodifiableList(cars); + } +} diff --git a/src/main/java/katecam/racingcar/domain/Game.java b/src/main/java/katecam/racingcar/domain/Game.java index 29e70189..48188619 100644 --- a/src/main/java/katecam/racingcar/domain/Game.java +++ b/src/main/java/katecam/racingcar/domain/Game.java @@ -1,46 +1,29 @@ package katecam.racingcar.domain; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; -import java.util.stream.Collectors; public class Game { - private final List cars; + private final Cars cars; private final int numberToAttempt; private int attemptedNumber; - private final Random random; public Game(List carNames, int carNumber) { - this.cars = carNames.stream() - .map(Car::new) - .toList(); + this.cars = Cars.of(carNames); this.numberToAttempt = carNumber; - this.random = new Random(); } - //UnmodifiableList public List getCars(){ - return this.cars; + return this.cars.getCars(); } public List getWinners(){ if (!isEnded()) throw new IllegalStateException("게임 종료 안됨"); - return this.cars.stream() - .collect(Collectors.groupingBy(Car::getPosition)) - .entrySet().stream() - .max(Map.Entry.comparingByKey()) - .map(Entry::getValue) - .orElseGet(List::of); + return cars.getWinners(); } public void playTurn() { if (isEnded()) throw new IllegalStateException("게임이 이미 종료됨"); - cars.forEach(car->{ - if (random.nextInt(10) >= 4) - car.move(); - }); + cars.moveAll(); attemptedNumber++; } From d46d0a354cee9eabe8035d527d11b921d0cf29f5 Mon Sep 17 00:00:00 2001 From: coco3x Date: Wed, 5 Jun 2024 23:45:56 +0900 Subject: [PATCH 15/21] =?UTF-8?q?chore:=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/command/GameTurnPlayService.java | 1 - .../application/service/query/GameStatusQueryService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java index e1d321cd..95cdb157 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java +++ b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java @@ -1,7 +1,6 @@ package katecam.racingcar.application.service.command; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; -import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Game; diff --git a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java index aea966fb..d2f0d1e3 100644 --- a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java +++ b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java @@ -6,7 +6,6 @@ import katecam.racingcar.application.dto.query.GameTotalResultRes; import katecam.racingcar.application.dto.query.GameTurnResultRes; import katecam.racingcar.application.port.in.query.GameStatusQuery; -import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Car; import katecam.racingcar.domain.Game; From f729e348e66846aa11d18226d2d86cdd75921d71 Mon Sep 17 00:00:00 2001 From: coco3x Date: Wed, 5 Jun 2024 23:51:42 +0900 Subject: [PATCH 16/21] =?UTF-8?q?chore:=20=EC=84=A4=EC=A0=95=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/katecam/Application.java | 2 +- src/main/java/katecam/{racingcar => }/config/AppConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/katecam/{racingcar => }/config/AppConfig.java (98%) diff --git a/src/main/java/katecam/Application.java b/src/main/java/katecam/Application.java index fb2b817e..2a1f6a2e 100644 --- a/src/main/java/katecam/Application.java +++ b/src/main/java/katecam/Application.java @@ -1,7 +1,7 @@ package katecam; import katecam.racingcar.adaptor.in.RacingCarController; -import katecam.racingcar.config.AppConfig; +import katecam.config.AppConfig; public class Application { private static final RacingCarController racingCarController = AppConfig.getRacingCarController(); diff --git a/src/main/java/katecam/racingcar/config/AppConfig.java b/src/main/java/katecam/config/AppConfig.java similarity index 98% rename from src/main/java/katecam/racingcar/config/AppConfig.java rename to src/main/java/katecam/config/AppConfig.java index 1281ca4f..6e16eec4 100644 --- a/src/main/java/katecam/racingcar/config/AppConfig.java +++ b/src/main/java/katecam/config/AppConfig.java @@ -1,4 +1,4 @@ -package katecam.racingcar.config; +package katecam.config; import katecam.racingcar.adaptor.in.RacingCarController; import katecam.racingcar.adaptor.out.InMemoryGameAdaptor; From bff1f36a31c1dab3d68b23b4979a3259fede0bc5 Mon Sep 17 00:00:00 2001 From: coco3x Date: Thu, 6 Jun 2024 01:18:46 +0900 Subject: [PATCH 17/21] =?UTF-8?q?fix:=20=ED=8F=AC=ED=8A=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/katecam/config/AppConfig.java | 12 ++++++------ .../racingcar/adaptor/out/InMemoryGameAdaptor.java | 4 ++-- .../application/port/out/GameLoadPort.java | 3 +-- .../application/port/out/GameRecordPort.java | 3 ++- .../service/command/GameInitializationService.java | 10 +++++----- .../service/command/GameTurnPlayService.java | 10 +++++----- .../service/query/GameStatusQueryService.java | 14 +++++++------- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/katecam/config/AppConfig.java b/src/main/java/katecam/config/AppConfig.java index 6e16eec4..93bb6c1d 100644 --- a/src/main/java/katecam/config/AppConfig.java +++ b/src/main/java/katecam/config/AppConfig.java @@ -5,15 +5,15 @@ import katecam.racingcar.application.port.in.command.GameInitializationUseCase; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; import katecam.racingcar.application.port.in.query.GameStatusQuery; -import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.application.port.out.GameRecordPort; +import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.application.service.command.GameInitializationService; import katecam.racingcar.application.service.command.GameTurnPlayService; import katecam.racingcar.application.service.query.GameStatusQueryService; public class AppConfig { - private static GameRecordPort gameRecordPort; private static GameLoadPort gameLoadPort; + private static GameRecordPort gameRecordPort; private static GameInitializationUseCase gameInitializationUseCase; private static GameTurnPlayUseCase gameTurnPlayUseCase; private static GameStatusQuery gameStatusQuery; @@ -21,11 +21,11 @@ public class AppConfig { static { InMemoryGameAdaptor inMemoryGameAdaptor = new InMemoryGameAdaptor(); - gameLoadPort = inMemoryGameAdaptor; gameRecordPort = inMemoryGameAdaptor; - gameInitializationUseCase = new GameInitializationService(gameLoadPort); - gameTurnPlayUseCase = new GameTurnPlayService(gameRecordPort); - gameStatusQuery = new GameStatusQueryService(gameRecordPort); + gameLoadPort = inMemoryGameAdaptor; + gameInitializationUseCase = new GameInitializationService(gameRecordPort); + gameTurnPlayUseCase = new GameTurnPlayService(gameLoadPort); + gameStatusQuery = new GameStatusQueryService(gameLoadPort); racingCarController = new RacingCarController( gameInitializationUseCase, gameTurnPlayUseCase, diff --git a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java index 9ff6b942..6549ed74 100644 --- a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java +++ b/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java @@ -1,10 +1,10 @@ package katecam.racingcar.adaptor.out; -import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.application.port.out.GameRecordPort; +import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.domain.Game; -public class InMemoryGameAdaptor implements GameLoadPort, GameRecordPort { +public class InMemoryGameAdaptor implements GameRecordPort, GameLoadPort { private Game game; @Override public void save(Game game) { diff --git a/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java b/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java index aa67dc5e..e88d82eb 100644 --- a/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java +++ b/src/main/java/katecam/racingcar/application/port/out/GameLoadPort.java @@ -3,6 +3,5 @@ import katecam.racingcar.domain.Game; public interface GameLoadPort { - void save(Game game); - void delete(); + Game getOrThrow(); } diff --git a/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java b/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java index ba700215..6bd4fc31 100644 --- a/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java +++ b/src/main/java/katecam/racingcar/application/port/out/GameRecordPort.java @@ -3,5 +3,6 @@ import katecam.racingcar.domain.Game; public interface GameRecordPort { - Game getOrThrow(); + void save(Game game); + void delete(); } diff --git a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java index d05689f9..6402f3a1 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java +++ b/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java @@ -2,19 +2,19 @@ import katecam.racingcar.application.dto.command.GameInitializationReq; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; -import katecam.racingcar.application.port.out.GameLoadPort; +import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.domain.Game; public class GameInitializationService implements GameInitializationUseCase { - private final GameLoadPort gameLoadPort; + private final GameRecordPort gameRecordPort; - public GameInitializationService(GameLoadPort gameLoadPort) { - this.gameLoadPort = gameLoadPort; + public GameInitializationService(GameRecordPort gameRecordPort) { + this.gameRecordPort = gameRecordPort; } @Override public void initialize(GameInitializationReq req) { Game game = new Game(req.carNames(), req.numberToAttempt()); - gameLoadPort.save(game); + gameRecordPort.save(game); } } diff --git a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java index 95cdb157..fca9b6a3 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java +++ b/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java @@ -1,19 +1,19 @@ package katecam.racingcar.application.service.command; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; -import katecam.racingcar.application.port.out.GameRecordPort; +import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.domain.Game; public class GameTurnPlayService implements GameTurnPlayUseCase { - private final GameRecordPort gameRecordPort; + private final GameLoadPort gameLoadPort; - public GameTurnPlayService(GameRecordPort gameRecordPort) { - this.gameRecordPort = gameRecordPort; + public GameTurnPlayService(GameLoadPort gameLoadPort) { + this.gameLoadPort = gameLoadPort; } @Override public void playTurn() { - Game game = gameRecordPort.getOrThrow(); + Game game = gameLoadPort.getOrThrow(); game.playTurn(); } } diff --git a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java index d2f0d1e3..38c91b2b 100644 --- a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java +++ b/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java @@ -6,26 +6,26 @@ import katecam.racingcar.application.dto.query.GameTotalResultRes; import katecam.racingcar.application.dto.query.GameTurnResultRes; import katecam.racingcar.application.port.in.query.GameStatusQuery; -import katecam.racingcar.application.port.out.GameRecordPort; +import katecam.racingcar.application.port.out.GameLoadPort; import katecam.racingcar.domain.Car; import katecam.racingcar.domain.Game; public class GameStatusQueryService implements GameStatusQuery { - private final GameRecordPort gameRecordPort; + private final GameLoadPort gameLoadPort; - public GameStatusQueryService(GameRecordPort gameRecordPort) { - this.gameRecordPort = gameRecordPort; + public GameStatusQueryService(GameLoadPort gameLoadPort) { + this.gameLoadPort = gameLoadPort; } @Override public boolean isEnded() { - Game game = gameRecordPort.getOrThrow(); + Game game = gameLoadPort.getOrThrow(); return game.isEnded(); } @Override public GameTurnResultRes getTurnResult() { - Game game = gameRecordPort.getOrThrow(); + Game game = gameLoadPort.getOrThrow(); List carPositions= game.getCars().stream() .map(car->new CarPositionRes(car.getName(), car.getPosition())) .toList(); @@ -34,7 +34,7 @@ public GameTurnResultRes getTurnResult() { @Override public GameTotalResultRes getTotalResult() { - Game game = gameRecordPort.getOrThrow(); + Game game = gameLoadPort.getOrThrow(); List winnerNames = game.getWinners().stream() .map(Car::getName) .toList(); From 68a1c991dbdf28b3f2333e979f4325da08196e9a Mon Sep 17 00:00:00 2001 From: coco3x Date: Fri, 7 Jun 2024 01:05:40 +0900 Subject: [PATCH 18/21] =?UTF-8?q?rename:=20adapter=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/katecam/Application.java | 2 +- src/main/java/katecam/config/AppConfig.java | 4 ++-- .../{adaptor => adapter}/in/RacingCarController.java | 2 +- .../{adaptor => adapter}/out/InMemoryGameAdaptor.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/katecam/racingcar/{adaptor => adapter}/in/RacingCarController.java (97%) rename src/main/java/katecam/racingcar/{adaptor => adapter}/out/InMemoryGameAdaptor.java (94%) diff --git a/src/main/java/katecam/Application.java b/src/main/java/katecam/Application.java index 2a1f6a2e..b53d7a33 100644 --- a/src/main/java/katecam/Application.java +++ b/src/main/java/katecam/Application.java @@ -1,6 +1,6 @@ package katecam; -import katecam.racingcar.adaptor.in.RacingCarController; +import katecam.racingcar.adapter.in.RacingCarController; import katecam.config.AppConfig; public class Application { diff --git a/src/main/java/katecam/config/AppConfig.java b/src/main/java/katecam/config/AppConfig.java index 93bb6c1d..497b7663 100644 --- a/src/main/java/katecam/config/AppConfig.java +++ b/src/main/java/katecam/config/AppConfig.java @@ -1,7 +1,7 @@ package katecam.config; -import katecam.racingcar.adaptor.in.RacingCarController; -import katecam.racingcar.adaptor.out.InMemoryGameAdaptor; +import katecam.racingcar.adapter.in.RacingCarController; +import katecam.racingcar.adapter.out.InMemoryGameAdaptor; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; import katecam.racingcar.application.port.in.query.GameStatusQuery; diff --git a/src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java b/src/main/java/katecam/racingcar/adapter/in/RacingCarController.java similarity index 97% rename from src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java rename to src/main/java/katecam/racingcar/adapter/in/RacingCarController.java index 9bc9e580..6aab182a 100644 --- a/src/main/java/katecam/racingcar/adaptor/in/RacingCarController.java +++ b/src/main/java/katecam/racingcar/adapter/in/RacingCarController.java @@ -1,4 +1,4 @@ -package katecam.racingcar.adaptor.in; +package katecam.racingcar.adapter.in; import java.util.List; import katecam.racingcar.application.dto.command.GameInitializationReq; diff --git a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java b/src/main/java/katecam/racingcar/adapter/out/InMemoryGameAdaptor.java similarity index 94% rename from src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java rename to src/main/java/katecam/racingcar/adapter/out/InMemoryGameAdaptor.java index 6549ed74..3c6b5f38 100644 --- a/src/main/java/katecam/racingcar/adaptor/out/InMemoryGameAdaptor.java +++ b/src/main/java/katecam/racingcar/adapter/out/InMemoryGameAdaptor.java @@ -1,4 +1,4 @@ -package katecam.racingcar.adaptor.out; +package katecam.racingcar.adapter.out; import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.application.port.out.GameLoadPort; From ca9beffa9151a76c0ca6d1a150c8d7702b33f8d0 Mon Sep 17 00:00:00 2001 From: coco3x Date: Sun, 9 Jun 2024 22:16:17 +0900 Subject: [PATCH 19/21] =?UTF-8?q?chore:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/katecam/config/AppConfig.java | 6 +++--- .../service/{command => }/GameInitializationService.java | 2 +- .../service/{query => }/GameStatusQueryService.java | 2 +- .../service/{command => }/GameTurnPlayService.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/katecam/racingcar/application/service/{command => }/GameInitializationService.java (92%) rename src/main/java/katecam/racingcar/application/service/{query => }/GameStatusQueryService.java (96%) rename src/main/java/katecam/racingcar/application/service/{command => }/GameTurnPlayService.java (90%) diff --git a/src/main/java/katecam/config/AppConfig.java b/src/main/java/katecam/config/AppConfig.java index 497b7663..b1025e4b 100644 --- a/src/main/java/katecam/config/AppConfig.java +++ b/src/main/java/katecam/config/AppConfig.java @@ -7,9 +7,9 @@ import katecam.racingcar.application.port.in.query.GameStatusQuery; import katecam.racingcar.application.port.out.GameRecordPort; import katecam.racingcar.application.port.out.GameLoadPort; -import katecam.racingcar.application.service.command.GameInitializationService; -import katecam.racingcar.application.service.command.GameTurnPlayService; -import katecam.racingcar.application.service.query.GameStatusQueryService; +import katecam.racingcar.application.service.GameInitializationService; +import katecam.racingcar.application.service.GameTurnPlayService; +import katecam.racingcar.application.service.GameStatusQueryService; public class AppConfig { private static GameLoadPort gameLoadPort; diff --git a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java b/src/main/java/katecam/racingcar/application/service/GameInitializationService.java similarity index 92% rename from src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java rename to src/main/java/katecam/racingcar/application/service/GameInitializationService.java index 6402f3a1..ad09193e 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameInitializationService.java +++ b/src/main/java/katecam/racingcar/application/service/GameInitializationService.java @@ -1,4 +1,4 @@ -package katecam.racingcar.application.service.command; +package katecam.racingcar.application.service; import katecam.racingcar.application.dto.command.GameInitializationReq; import katecam.racingcar.application.port.in.command.GameInitializationUseCase; diff --git a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java b/src/main/java/katecam/racingcar/application/service/GameStatusQueryService.java similarity index 96% rename from src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java rename to src/main/java/katecam/racingcar/application/service/GameStatusQueryService.java index 38c91b2b..7094aea8 100644 --- a/src/main/java/katecam/racingcar/application/service/query/GameStatusQueryService.java +++ b/src/main/java/katecam/racingcar/application/service/GameStatusQueryService.java @@ -1,4 +1,4 @@ -package katecam.racingcar.application.service.query; +package katecam.racingcar.application.service; import java.util.List; diff --git a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java b/src/main/java/katecam/racingcar/application/service/GameTurnPlayService.java similarity index 90% rename from src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java rename to src/main/java/katecam/racingcar/application/service/GameTurnPlayService.java index fca9b6a3..0d25df58 100644 --- a/src/main/java/katecam/racingcar/application/service/command/GameTurnPlayService.java +++ b/src/main/java/katecam/racingcar/application/service/GameTurnPlayService.java @@ -1,4 +1,4 @@ -package katecam.racingcar.application.service.command; +package katecam.racingcar.application.service; import katecam.racingcar.application.port.in.command.GameTurnPlayUseCase; import katecam.racingcar.application.port.out.GameLoadPort; From 74e90654d84051ab0cf9fa2b6ec28785f7f214ba Mon Sep 17 00:00:00 2001 From: coco3x Date: Sun, 9 Jun 2024 22:17:56 +0900 Subject: [PATCH 20/21] add: getter --- src/main/java/katecam/racingcar/domain/Game.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/katecam/racingcar/domain/Game.java b/src/main/java/katecam/racingcar/domain/Game.java index 48188619..fdc94d69 100644 --- a/src/main/java/katecam/racingcar/domain/Game.java +++ b/src/main/java/katecam/racingcar/domain/Game.java @@ -30,4 +30,12 @@ public void playTurn() { public boolean isEnded(){ return this.attemptedNumber == this.numberToAttempt; } + + public int getNumberToAttempt() { + return numberToAttempt; + } + + public int getAttemptedNumber() { + return attemptedNumber; + } } From 34b0300e370b2865dbb275ce7241ae3215cd5203 Mon Sep 17 00:00:00 2001 From: coco3x Date: Sun, 9 Jun 2024 22:18:31 +0900 Subject: [PATCH 21/21] =?UTF-8?q?test:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameInitializationServiceTest.java | 35 ++++++++++++++ .../application/GameTurnPlayServiceTest.java | 48 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/test/java/katecam/racingcar/application/GameInitializationServiceTest.java create mode 100644 src/test/java/katecam/racingcar/application/GameTurnPlayServiceTest.java diff --git a/src/test/java/katecam/racingcar/application/GameInitializationServiceTest.java b/src/test/java/katecam/racingcar/application/GameInitializationServiceTest.java new file mode 100644 index 00000000..47f1ad2d --- /dev/null +++ b/src/test/java/katecam/racingcar/application/GameInitializationServiceTest.java @@ -0,0 +1,35 @@ +package katecam.racingcar.application; + +import java.util.List; +import katecam.racingcar.adapter.out.InMemoryGameAdaptor; +import katecam.racingcar.application.dto.command.GameInitializationReq; +import katecam.racingcar.application.service.GameInitializationService; +import katecam.racingcar.domain.Car; +import katecam.racingcar.domain.Game; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class GameInitializationServiceTest { + private InMemoryGameAdaptor inMemoryGameAdaptor; + private GameInitializationService service; + + @BeforeEach + void setUp() { + inMemoryGameAdaptor = new InMemoryGameAdaptor(); + service = new GameInitializationService(inMemoryGameAdaptor); + } + + @Test + void 초기화_테스트() { + List carNames = List.of("sdfasdf","asdfasfd","xcvsdqeg"); + GameInitializationReq req = new GameInitializationReq(carNames, 5); + service.initialize(req); + + Game game = inMemoryGameAdaptor.getOrThrow(); + List cars = game.getCars(); + + Assertions.assertEquals(cars.size(), carNames.size()); + } + +} diff --git a/src/test/java/katecam/racingcar/application/GameTurnPlayServiceTest.java b/src/test/java/katecam/racingcar/application/GameTurnPlayServiceTest.java new file mode 100644 index 00000000..f5281b88 --- /dev/null +++ b/src/test/java/katecam/racingcar/application/GameTurnPlayServiceTest.java @@ -0,0 +1,48 @@ +package katecam.racingcar.application; + +import java.util.List; +import katecam.racingcar.adapter.out.InMemoryGameAdaptor; +import katecam.racingcar.application.dto.command.GameInitializationReq; +import katecam.racingcar.application.service.GameInitializationService; +import katecam.racingcar.application.service.GameTurnPlayService; +import katecam.racingcar.domain.Game; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class GameTurnPlayServiceTest { + private final int NUMBER_TO_ATTEMPT = 5; + private GameTurnPlayService service; + private Game game; + + @BeforeEach + void setUp() { + InMemoryGameAdaptor inMemoryGameAdaptor = new InMemoryGameAdaptor(); + service = new GameTurnPlayService(inMemoryGameAdaptor); + + List carNames = List.of("sdfasdf","asdfasfd","xcvsdqeg"); + GameInitializationReq req = new GameInitializationReq(carNames, NUMBER_TO_ATTEMPT); + GameInitializationService initializationService = new GameInitializationService( + inMemoryGameAdaptor); + initializationService.initialize(req); + + game = inMemoryGameAdaptor.getOrThrow(); + } + + @Test + void 플레이턴_테스트() { + service.playTurn(); + + Assertions.assertEquals(1, game.getAttemptedNumber()); + } + + @Test + void 게임끝날때까지돌리기(){ + for (int i = 0; i < NUMBER_TO_ATTEMPT; i++) { + service.playTurn(); + } + + Assertions.assertTrue(game.isEnded()); + + } +}