From f22e33a7d9d14542338e34343a307f8bc8205ab3 Mon Sep 17 00:00:00 2001 From: NaMinhyeok Date: Sat, 25 Apr 2026 23:11:03 +0900 Subject: [PATCH] =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B5=AC=EC=A1=B0=EC=99=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B3=84=EC=95=BD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoomAuctionIntegrationTest.java | 4 +- .../realtime/RoomRealtimeIntegrationTest.java | 12 +- .../room/web/RoomApiIntegrationTest.java | 10 +- .../web/TemplateApiIntegrationTest.java | 6 - .../naminhyeok/fantazzk/CoreException.java | 11 +- .../fantazzk/InvalidDomainStateException.java | 7 +- .../room/application/SettleAuction.java | 7 +- .../fantazzk/room/domain/AuctionBid.java | 5 +- .../room/domain/AuctionParticipant.java | 5 +- .../room/domain/DraftParticipant.java | 5 +- .../fantazzk/room/domain/GamePlayer.java | 5 +- .../fantazzk/room/domain/RoomPlayer.java | 9 +- .../fantazzk/room/domain/RoomTeamLeader.java | 9 +- .../fantazzk/room/domain/RosterMember.java | 5 +- .../application/ProvideTemplateCatalog.java | 6 +- .../fantazzk/template/domain/Template.java | 16 +- .../domain/TemplateConfiguration.java | 76 +------- .../template/domain/TemplateErrorType.java | 6 - .../template/domain/TemplatePlayer.java | 10 - .../persistence/JpaTemplateListReader.java | 20 -- .../TemplateListJpaRepository.java | 12 -- .../template/query/FindTemplates.java | 10 +- .../template/query/TemplateDetail.java | 8 - .../query/TemplateDetailResponse.java | 7 +- .../template/query/TemplateListReader.java | 7 - .../query/TemplateSummaryResponse.java | 24 --- .../template/repository/Templates.java | 6 + .../naminhyeok/fantazzk/ApiResponseTest.java | 4 +- .../fantazzk/GlobalExceptionHandlerTest.java | 12 +- .../architecture/ModulithStructureTest.java | 15 -- .../PublishedContractStructureTest.java | 141 -------------- .../RoomTestPackageStructureTest.java | 34 ---- .../TemplateInternalPackageIsolationTest.java | 9 - .../TemplateTestPackageStructureTest.java | 30 --- .../RoomRealtimePublishingTest.java | 20 +- .../StartedGameContextLoaderTest.java | 8 +- ...ySeamTest.java => GameCapabilityTest.java} | 10 +- .../RoomRealtimeEventFactoryTest.java | 6 +- .../RoomAuctionDeadlineSchedulerTest.java | 12 +- .../RoomAuctionSchedulingPolicyTest.java | 6 +- .../GameAuctionApiControllerWebMvcTest.java | 12 +- .../web/GameDraftApiControllerWebMvcTest.java | 6 +- .../web/GameQueryApiControllerWebMvcTest.java | 4 +- .../web/RoomDraftApiControllerWebMvcTest.java | 6 +- .../web/RoomQueryApiControllerWebMvcTest.java | 8 +- .../RoomSessionApiControllerWebMvcTest.java | 8 +- .../web/RoomStartApiControllerWebMvcTest.java | 6 +- .../application/CreateTemplateTest.java | 122 ------------ .../domain/TemplateAggregateTest.java | 7 +- .../domain/TemplateConfigurationTest.java | 100 +--------- .../template/query/FindTemplatesTest.java | 176 ------------------ .../template/query/TemplateResponseTest.java | 28 --- .../web/TemplateApiControllerWebMvcTest.java | 11 +- 53 files changed, 136 insertions(+), 973 deletions(-) delete mode 100644 src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/JpaTemplateListReader.java delete mode 100644 src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/TemplateListJpaRepository.java delete mode 100644 src/main/java/com/naminhyeok/fantazzk/template/query/TemplateDetail.java delete mode 100644 src/main/java/com/naminhyeok/fantazzk/template/query/TemplateListReader.java delete mode 100644 src/main/java/com/naminhyeok/fantazzk/template/query/TemplateSummaryResponse.java delete mode 100644 src/test/java/com/naminhyeok/fantazzk/architecture/PublishedContractStructureTest.java delete mode 100644 src/test/java/com/naminhyeok/fantazzk/architecture/RoomTestPackageStructureTest.java delete mode 100644 src/test/java/com/naminhyeok/fantazzk/architecture/TemplateTestPackageStructureTest.java rename src/test/java/com/naminhyeok/fantazzk/room/domain/{GameCapabilitySeamTest.java => GameCapabilityTest.java} (89%) delete mode 100644 src/test/java/com/naminhyeok/fantazzk/template/application/CreateTemplateTest.java delete mode 100644 src/test/java/com/naminhyeok/fantazzk/template/query/FindTemplatesTest.java diff --git a/src/integrationTest/java/com/naminhyeok/fantazzk/room/application/RoomAuctionIntegrationTest.java b/src/integrationTest/java/com/naminhyeok/fantazzk/room/application/RoomAuctionIntegrationTest.java index 0621f2a4..f8e655a1 100644 --- a/src/integrationTest/java/com/naminhyeok/fantazzk/room/application/RoomAuctionIntegrationTest.java +++ b/src/integrationTest/java/com/naminhyeok/fantazzk/room/application/RoomAuctionIntegrationTest.java @@ -183,7 +183,7 @@ void clearScheduledTasks() { } @Test - void catchUpAndReschedule는_due_room을_즉시_정산한다() { + void 재시작_보정은_지난_경매_마감을_즉시_정산한다() { UUID template = templateFixture.createAuctionTemplateId( "경매전", @@ -213,7 +213,7 @@ void clearScheduledTasks() { } @Test - void start_rollback되면_deadline_task는_등록되지_않는다() { + void 방_시작_트랜잭션이_롤백되면_마감_예약도_남지_않는다() { UUID template = templateFixture.createAuctionTemplateId( "경매전", diff --git a/src/integrationTest/java/com/naminhyeok/fantazzk/room/infrastructure/realtime/RoomRealtimeIntegrationTest.java b/src/integrationTest/java/com/naminhyeok/fantazzk/room/infrastructure/realtime/RoomRealtimeIntegrationTest.java index d71fa501..2b725c02 100644 --- a/src/integrationTest/java/com/naminhyeok/fantazzk/room/infrastructure/realtime/RoomRealtimeIntegrationTest.java +++ b/src/integrationTest/java/com/naminhyeok/fantazzk/room/infrastructure/realtime/RoomRealtimeIntegrationTest.java @@ -89,7 +89,7 @@ void clearPublishedEvents() { } @Test - void join이_커밋되면_room_updated를_정확히_하나_publish한다() { + void 방_참가가_커밋되면_로비_스냅샷을_하나만_발행한다() { UUID template = templateFixture.createAuctionTemplateId( "실시간 방", @@ -119,7 +119,7 @@ void clearPublishedEvents() { } @Test - void 바깥_트랜잭션이_롤백되면_room_snapshot을_publish하지_않는다() { + void 바깥_트랜잭션이_롤백되면_로비_스냅샷을_발행하지_않는다() { UUID template = templateFixture.createAuctionTemplateId( "실시간 롤백", @@ -153,7 +153,7 @@ void clearPublishedEvents() { } @Test - void 경매_입찰과_정산_publish는_game_updated를_사용한다() { + void 경매_입찰과_정산은_게임_스냅샷으로_발행된다() { UUID template = templateFixture.createAuctionTemplateId( "실시간 경매", @@ -200,7 +200,7 @@ void clearPublishedEvents() { } @Test - void 드래프트_start_publish는_room_updated와_game_updated를_사용한다() { + void 드래프트_시작은_로비와_게임_스냅샷으로_발행된다() { UUID template = templateFixture.createDraftTemplateId( "실시간 드래프트 시작", @@ -238,7 +238,7 @@ void clearPublishedEvents() { } @Test - void 드래프트_픽_publish는_game_updated를_반영한다() { + void 드래프트_픽은_게임_스냅샷으로_발행된다() { UUID template = templateFixture.createDraftTemplateId( "실시간 드래프트 픽", @@ -275,7 +275,7 @@ void clearPublishedEvents() { } @Test - void 시작_스냅샷_이후_드래프트_live_update의_snapshot_version은_단조증가한다() { + void 시작_스냅샷_이후_드래프트_진행_스냅샷_버전은_단조증가한다() { UUID template = templateFixture.createDraftTemplateId( "실시간 드래프트 버전", diff --git a/src/integrationTest/java/com/naminhyeok/fantazzk/room/web/RoomApiIntegrationTest.java b/src/integrationTest/java/com/naminhyeok/fantazzk/room/web/RoomApiIntegrationTest.java index b8223bbe..82e18edb 100644 --- a/src/integrationTest/java/com/naminhyeok/fantazzk/room/web/RoomApiIntegrationTest.java +++ b/src/integrationTest/java/com/naminhyeok/fantazzk/room/web/RoomApiIntegrationTest.java @@ -68,7 +68,7 @@ class RoomApiIntegrationTest { private final PlatformTransactionManager transactionManager; @Test - void list는_joinable_waiting_room만_응답하고_정렬과_JSON_필드를_보장한다() { + void 방_목록_API는_참여_가능한_대기방만_정렬해_반환한다() { rooms.save(joinableAuctionRoom("ROOM99", Instant.parse("2026-04-09T00:03:00Z"))); rooms.save(fullWaitingAuctionRoom("ROOM08", Instant.parse("2026-04-09T00:02:00Z"))); rooms.save(inProgressAuctionRoom("ROOM07", Instant.parse("2026-04-09T00:01:00Z"))); @@ -86,7 +86,7 @@ class RoomApiIntegrationTest { } @Test - void start는_game_id만_포함한_최소_응답을_반환한다() throws Exception { + void 방_시작_API는_게임_ID만_포함한_최소_응답을_반환한다() throws Exception { rooms.save(fullWaitingAuctionRoom("ROOM10", CREATED_AT)); ResponseEntity response = restTemplate.exchange( @@ -107,7 +107,7 @@ class RoomApiIntegrationTest { } @Test - void get_room은_startedGameId만_반환하고_live_game_progress는_포함하지_않는다() throws Exception { + void 방_조회_API는_시작된_게임_ID만_반환하고_진행_상태는_포함하지_않는다() throws Exception { Room room = startedAuctionRoom("ROOM11", CREATED_AT); ResponseEntity response = restTemplate.getForEntity("/api/v1/rooms/ROOM11", String.class); @@ -125,7 +125,7 @@ class RoomApiIntegrationTest { } @Test - void get_game은_경매의_deadline_projection을_반환한다() throws Exception { + void 게임_조회_API는_경매_마감_진행상태를_반환한다() throws Exception { Room room = startedAuctionRoom("ROOM12", CREATED_AT); restTemplate.exchange( @@ -163,7 +163,7 @@ class RoomApiIntegrationTest { } @Test - void get_game은_시작된_드래프트의_live_progress와_멤버와_선수상태를_반환한다() throws Exception { + void 게임_조회_API는_드래프트_진행상태와_선수상태를_반환한다() throws Exception { Room room = startedDraftRoom("ROOM14", CREATED_AT); restTemplate.exchange( "/api/v1/games/" + room.getStartedGameId().gameId() + "/draft-picks", diff --git a/src/integrationTest/java/com/naminhyeok/fantazzk/template/web/TemplateApiIntegrationTest.java b/src/integrationTest/java/com/naminhyeok/fantazzk/template/web/TemplateApiIntegrationTest.java index 7156857c..a88c5123 100644 --- a/src/integrationTest/java/com/naminhyeok/fantazzk/template/web/TemplateApiIntegrationTest.java +++ b/src/integrationTest/java/com/naminhyeok/fantazzk/template/web/TemplateApiIntegrationTest.java @@ -67,7 +67,6 @@ class TemplateApiIntegrationTest { assertThat(success.get("name")).isEqualTo("경매전"); assertThat(success.get("gameType")).isEqualTo("LEAGUE_OF_LEGENDS"); assertThat(success.get("mode")).isEqualTo("AUCTION"); - assertThat(success.containsKey("positionLimit")).isFalse(); assertThat(((List) success.get("players"))).hasSize(2); } @@ -101,7 +100,6 @@ class TemplateApiIntegrationTest { Map success = (Map) response.getBody().get("success"); String templateId = (String) success.get("id"); assertThat(success.get("gameType")).isEqualTo("custom-fe-game"); - assertThat(success.containsKey("positionLimit")).isFalse(); List> players = (List>) success.get("players"); assertThat(players).hasSize(2); assertThat(players.get(0)).containsEntry("name", "선수1").containsEntry("position", "").containsEntry("displayOrder", 0); @@ -112,7 +110,6 @@ class TemplateApiIntegrationTest { Map detailSuccess = (Map) detailResponse.getBody().get("success"); List> detailPlayers = (List>) detailSuccess.get("players"); assertThat(detailSuccess.get("gameType")).isEqualTo("custom-fe-game"); - assertThat(detailSuccess.containsKey("positionLimit")).isFalse(); assertThat(detailPlayers.get(0).get("position")).isEqualTo(""); assertThat(detailPlayers.get(1).get("position")).isNull(); @@ -123,7 +120,6 @@ class TemplateApiIntegrationTest { return; } assertThat(template.get("gameType")).isEqualTo("custom-fe-game"); - assertThat(template).doesNotContainKey("positionLimit"); List> listPlayers = (List>) template.get("players"); assertThat(listPlayers.get(0).get("position")).isEqualTo(""); assertThat(listPlayers.get(1).get("position")).isNull(); @@ -165,7 +161,6 @@ class TemplateApiIntegrationTest { Map success = (Map) response.getBody().get("success"); assertThat(success.get("id")).isEqualTo(templateId); assertThat(success.get("name")).isEqualTo("상세조회용 경매전"); - assertThat(success.containsKey("positionLimit")).isFalse(); List> players = (List>) success.get("players"); assertThat(players) .containsExactly( @@ -363,7 +358,6 @@ class TemplateApiIntegrationTest { assertThat(template.get("teamCount")).isEqualTo(2); assertThat(template.get("pickBanTime")).isEqualTo(45); assertThat(template.get("minBidUnit")).isEqualTo(10); - assertThat(template).doesNotContainKey("positionLimit"); List> players = (List>) template.get("players"); assertThat(players).hasSize(2); assertThat(players.get(0)).containsEntry("name", "선수1").containsEntry("position", "TOP").containsEntry("displayOrder", 0); diff --git a/src/main/java/com/naminhyeok/fantazzk/CoreException.java b/src/main/java/com/naminhyeok/fantazzk/CoreException.java index e3530b27..cd6cfdb1 100644 --- a/src/main/java/com/naminhyeok/fantazzk/CoreException.java +++ b/src/main/java/com/naminhyeok/fantazzk/CoreException.java @@ -1,5 +1,8 @@ package com.naminhyeok.fantazzk; +import lombok.Getter; + +@Getter public class CoreException extends RuntimeException { private final ErrorDescriptor error; private final Object data; @@ -21,12 +24,4 @@ public CoreException(ErrorDescriptor error, Object data) { this.error = error; this.data = data; } - - public ErrorDescriptor getError() { - return error; - } - - public Object getData() { - return data; - } } diff --git a/src/main/java/com/naminhyeok/fantazzk/InvalidDomainStateException.java b/src/main/java/com/naminhyeok/fantazzk/InvalidDomainStateException.java index 8145991f..fa1e66e0 100644 --- a/src/main/java/com/naminhyeok/fantazzk/InvalidDomainStateException.java +++ b/src/main/java/com/naminhyeok/fantazzk/InvalidDomainStateException.java @@ -1,5 +1,8 @@ package com.naminhyeok.fantazzk; +import lombok.Getter; + +@Getter public abstract class InvalidDomainStateException extends RuntimeException { private final ErrorDescriptor error; @@ -7,8 +10,4 @@ protected InvalidDomainStateException(String message, ErrorDescriptor error) { super(message); this.error = error; } - - public ErrorDescriptor getError() { - return error; - } } diff --git a/src/main/java/com/naminhyeok/fantazzk/room/application/SettleAuction.java b/src/main/java/com/naminhyeok/fantazzk/room/application/SettleAuction.java index c6840e5b..b7ebdff5 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/application/SettleAuction.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/application/SettleAuction.java @@ -4,19 +4,16 @@ import com.naminhyeok.fantazzk.room.domain.Room; import com.naminhyeok.fantazzk.room.domain.RoomErrorType; import com.naminhyeok.fantazzk.room.repository.Rooms; +import lombok.RequiredArgsConstructor; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.stereotype.Service; @Service +@RequiredArgsConstructor public class SettleAuction { private final SettleAuctionAttempt settleAuctionAttempt; private final Rooms rooms; - public SettleAuction(SettleAuctionAttempt settleAuctionAttempt, Rooms rooms) { - this.settleAuctionAttempt = settleAuctionAttempt; - this.rooms = rooms; - } - public Room settleIfDue(String code) { try { return settleAuctionAttempt.settleIfDue(code); diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionBid.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionBid.java index 85908ae4..c0edeee0 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionBid.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionBid.java @@ -6,11 +6,13 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.jmolecules.ddd.types.ValueObject; @Access(AccessType.FIELD) @Embeddable @EqualsAndHashCode +@NoArgsConstructor public class AuctionBid implements ValueObject { @Column(name = "round") private int round; @@ -23,9 +25,6 @@ public class AuctionBid implements ValueObject { @Column(name = "amount") private int amount; - public AuctionBid() { - } - public AuctionBid(int round, BidSequence sequence, TeamLeaderId teamLeaderId, int amount) { this.round = round; this.sequence = sequence; diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionParticipant.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionParticipant.java index 8dcda656..bdf8d6c2 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionParticipant.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/AuctionParticipant.java @@ -6,11 +6,13 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.jmolecules.ddd.types.ValueObject; @Access(AccessType.FIELD) @Embeddable @EqualsAndHashCode +@NoArgsConstructor public final class AuctionParticipant implements GameParticipant, ValueObject { @Column(name = "team_leader_id") @Convert(converter = TeamLeaderId.JpaConverter.class) @@ -20,9 +22,6 @@ public final class AuctionParticipant implements GameParticipant, ValueObject { @Column(name = "remaining_budget") private Integer remainingBudget; - public AuctionParticipant() { - } - public AuctionParticipant(TeamLeaderId teamLeaderId, String nickname, int remainingBudget) { this.teamLeaderId = java.util.Objects.requireNonNull(teamLeaderId, "teamLeaderId must not be null"); this.nickname = java.util.Objects.requireNonNull(nickname, "nickname must not be null"); diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/DraftParticipant.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/DraftParticipant.java index 5f603835..5cdf75e6 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/DraftParticipant.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/DraftParticipant.java @@ -6,11 +6,13 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.jmolecules.ddd.types.ValueObject; @Access(AccessType.FIELD) @Embeddable @EqualsAndHashCode +@NoArgsConstructor public final class DraftParticipant implements GameParticipant, ValueObject { @Column(name = "team_leader_id") @Convert(converter = TeamLeaderId.JpaConverter.class) @@ -20,9 +22,6 @@ public final class DraftParticipant implements GameParticipant, ValueObject { @Column(name = "draft_position") private Integer draftPosition; - public DraftParticipant() { - } - public DraftParticipant(TeamLeaderId teamLeaderId, String nickname, int draftPosition) { this.teamLeaderId = java.util.Objects.requireNonNull(teamLeaderId, "teamLeaderId must not be null"); this.nickname = java.util.Objects.requireNonNull(nickname, "nickname must not be null"); diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/GamePlayer.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/GamePlayer.java index e82f8cf1..f56e555f 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/GamePlayer.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/GamePlayer.java @@ -6,11 +6,13 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.jmolecules.ddd.types.ValueObject; @Access(AccessType.FIELD) @Embeddable @EqualsAndHashCode +@NoArgsConstructor public class GamePlayer implements ValueObject { @Column(name = "player_id") @Convert(converter = RoomPlayerId.JpaConverter.class) @@ -22,9 +24,6 @@ public class GamePlayer implements ValueObject { @Column(name = "display_order") private int displayOrder; - public GamePlayer() { - } - public GamePlayer(RoomPlayerId playerId, String name, String position, int displayOrder) { this.playerId = java.util.Objects.requireNonNull(playerId, "playerId must not be null"); this.name = java.util.Objects.requireNonNull(name, "name must not be null"); diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomPlayer.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomPlayer.java index c4e1a585..4593ba62 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomPlayer.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomPlayer.java @@ -8,8 +8,10 @@ import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor @Access(AccessType.FIELD) @Embeddable public class RoomPlayer { @@ -26,9 +28,6 @@ public class RoomPlayer { @Enumerated(EnumType.STRING) private PlayerStatus status; - public RoomPlayer() { - } - public RoomPlayer(RoomPlayerId id, String name, String position, int displayOrder) { this.id = id; this.name = name; @@ -36,8 +35,4 @@ public RoomPlayer(RoomPlayerId id, String name, String position, int displayOrde this.displayOrder = displayOrder; this.status = PlayerStatus.AVAILABLE; } - - public RoomPlayerId getId() { - return id; - } } diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomTeamLeader.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomTeamLeader.java index 2267d1f8..78137f9b 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomTeamLeader.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/RoomTeamLeader.java @@ -6,8 +6,10 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor @Access(AccessType.FIELD) @Embeddable public class RoomTeamLeader { @@ -23,9 +25,6 @@ public class RoomTeamLeader { @Column(name = "remaining_budget") private Integer remainingBudget; - public RoomTeamLeader() { - } - public RoomTeamLeader(TeamLeaderId id, String nickname, String actionToken, Integer remainingBudget) { this.id = id; this.nickname = nickname; @@ -34,10 +33,6 @@ public RoomTeamLeader(TeamLeaderId id, String nickname, String actionToken, Inte this.remainingBudget = remainingBudget; } - public TeamLeaderId getId() { - return id; - } - public void assignDraftPosition(int draftPosition) { this.draftPosition = draftPosition; } diff --git a/src/main/java/com/naminhyeok/fantazzk/room/domain/RosterMember.java b/src/main/java/com/naminhyeok/fantazzk/room/domain/RosterMember.java index fcc2e044..3b05274a 100644 --- a/src/main/java/com/naminhyeok/fantazzk/room/domain/RosterMember.java +++ b/src/main/java/com/naminhyeok/fantazzk/room/domain/RosterMember.java @@ -6,11 +6,13 @@ import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.jmolecules.ddd.types.ValueObject; @Access(AccessType.FIELD) @Embeddable @EqualsAndHashCode +@NoArgsConstructor public class RosterMember implements ValueObject { @Column(name = "team_leader_id") @Convert(converter = TeamLeaderId.JpaConverter.class) @@ -20,9 +22,6 @@ public class RosterMember implements ValueObject { @Column(name = "assign_order") private int assignOrder; - public RosterMember() { - } - public RosterMember(TeamLeaderId teamLeaderId, String playerName, int assignOrder) { this.teamLeaderId = teamLeaderId; this.playerName = playerName; diff --git a/src/main/java/com/naminhyeok/fantazzk/template/application/ProvideTemplateCatalog.java b/src/main/java/com/naminhyeok/fantazzk/template/application/ProvideTemplateCatalog.java index 2ba7da42..c82b0c2a 100644 --- a/src/main/java/com/naminhyeok/fantazzk/template/application/ProvideTemplateCatalog.java +++ b/src/main/java/com/naminhyeok/fantazzk/template/application/ProvideTemplateCatalog.java @@ -6,7 +6,6 @@ import com.naminhyeok.fantazzk.template.domain.TemplateErrorType; import com.naminhyeok.fantazzk.template.domain.TemplateId; import com.naminhyeok.fantazzk.template.query.FindTemplates; -import com.naminhyeok.fantazzk.template.query.TemplateDetail; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,8 +18,7 @@ public class ProvideTemplateCatalog implements TemplateCatalog { @Override public TemplateBlueprint getTemplate(UUID templateId) { try { - TemplateDetail detail = findTemplates.getDetail(new TemplateId(templateId)); - Template template = detail.template(); + Template template = findTemplates.getDetail(new TemplateId(templateId)); return new TemplateBlueprint( template.getGameType(), template.getMode(), @@ -30,7 +28,7 @@ public TemplateBlueprint getTemplate(UUID templateId) { template.getPickBanTime(), template.getMinBidUnit(), template.getDraftOrderStrategy(), - detail.players().stream() + template.getPlayers().stream() .map(player -> new PlayerBlueprint(player.name(), player.position(), player.displayOrder())) .toList() ); diff --git a/src/main/java/com/naminhyeok/fantazzk/template/domain/Template.java b/src/main/java/com/naminhyeok/fantazzk/template/domain/Template.java index b69eb984..e0b7ef87 100644 --- a/src/main/java/com/naminhyeok/fantazzk/template/domain/Template.java +++ b/src/main/java/com/naminhyeok/fantazzk/template/domain/Template.java @@ -8,15 +8,17 @@ import java.util.Comparator; import java.util.List; import java.util.UUID; +import lombok.AccessLevel; import lombok.Getter; import org.jmolecules.ddd.types.AggregateRoot; @Getter public class Template implements AggregateRoot { private final TemplateId id; - private String name; - private String gameType; - private TemplateConfiguration configuration; + private final String name; + private final String gameType; + @Getter(AccessLevel.NONE) + private final TemplateConfiguration configuration; @ElementCollection @CollectionTable(name = "template_player", joinColumns = @JoinColumn(name = "players_template_id")) private List players; @@ -64,10 +66,6 @@ public TemplateCatalog.Mode getMode() { return configuration.getMode(); } - public String getGameType() { - return gameType; - } - public int getTeamCount() { return configuration.getTeamCount(); } @@ -98,10 +96,6 @@ public List getPlayers() { .toList(); } - public int getPicksPerTeam() { - return configuration.getTeamSize() - 1; - } - private Template registerPlayers(List templatePlayers) { if (templatePlayers.size() != configuration.requiredPlayerCount()) { throw new IllegalArgumentException("선수 수는 정확히 " + configuration.requiredPlayerCount() + "명이어야 합니다"); diff --git a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateConfiguration.java b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateConfiguration.java index d265c145..ef7aa82b 100644 --- a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateConfiguration.java +++ b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateConfiguration.java @@ -39,36 +39,6 @@ private TemplateConfiguration( throw new IllegalArgumentException("픽밴 시간은 0보다 커야 합니다"); } - if (mode == TemplateCatalog.Mode.AUCTION) { - if (budget == null) { - throw new IllegalArgumentException("경매 템플릿에는 예산이 필요합니다"); - } - if (budget <= 0) { - throw new IllegalArgumentException("예산은 0보다 커야 합니다"); - } - if (minBidUnit == null) { - throw new IllegalArgumentException("경매 템플릿에는 최소 입찰 단위가 필요합니다"); - } - if (minBidUnit <= 0) { - throw new IllegalArgumentException("최소 입찰 단위는 0보다 커야 합니다"); - } - if (draftOrderStrategy != null) { - throw new IllegalArgumentException("경매 템플릿에는 드래프트 순서 전략을 지정할 수 없습니다"); - } - } - - if (mode == TemplateCatalog.Mode.DRAFT) { - if (budget != null) { - throw new IllegalArgumentException("드래프트 템플릿에는 예산을 지정할 수 없습니다"); - } - if (minBidUnit != null) { - throw new IllegalArgumentException("드래프트 템플릿에는 최소 입찰 단위를 지정할 수 없습니다"); - } - if (draftOrderStrategy == null) { - throw new IllegalArgumentException("드래프트 템플릿에는 순서 전략이 필요합니다"); - } - } - this.mode = mode; this.teamCount = teamCount; this.teamSize = teamSize; @@ -85,6 +55,12 @@ public static TemplateConfiguration auction( int pickBanTime, int minBidUnit ) { + if (budget <= 0) { + throw new IllegalArgumentException("예산은 0보다 커야 합니다"); + } + if (minBidUnit <= 0) { + throw new IllegalArgumentException("최소 입찰 단위는 0보다 커야 합니다"); + } return new TemplateConfiguration( TemplateCatalog.Mode.AUCTION, teamCount, @@ -102,6 +78,9 @@ public static TemplateConfiguration draft( int pickBanTime, TemplateCatalog.DraftOrderStrategy strategy ) { + if (strategy == null) { + throw new IllegalArgumentException("드래프트 템플릿에는 순서 전략이 필요합니다"); + } return new TemplateConfiguration( TemplateCatalog.Mode.DRAFT, teamCount, @@ -113,43 +92,6 @@ public static TemplateConfiguration draft( ); } - public static TemplateConfiguration from( - TemplateCatalog.Mode mode, - int teamCount, - int teamSize, - Integer budget, - int pickBanTime, - Integer minBidUnit, - TemplateCatalog.DraftOrderStrategy draftOrderStrategy - ) { - return switch (mode) { - case AUCTION -> { - if (draftOrderStrategy != null) { - throw new IllegalArgumentException("경매 템플릿에는 드래프트 순서 전략을 지정할 수 없습니다"); - } - if (budget == null) { - throw new IllegalArgumentException("경매 템플릿에는 예산이 필요합니다"); - } - if (minBidUnit == null) { - throw new IllegalArgumentException("경매 템플릿에는 최소 입찰 단위가 필요합니다"); - } - yield auction(teamCount, teamSize, budget, pickBanTime, minBidUnit); - } - case DRAFT -> { - if (budget != null) { - throw new IllegalArgumentException("드래프트 템플릿에는 예산을 지정할 수 없습니다"); - } - if (minBidUnit != null) { - throw new IllegalArgumentException("드래프트 템플릿에는 최소 입찰 단위를 지정할 수 없습니다"); - } - if (draftOrderStrategy == null) { - throw new IllegalArgumentException("드래프트 템플릿에는 순서 전략이 필요합니다"); - } - yield draft(teamCount, teamSize, pickBanTime, draftOrderStrategy); - } - }; - } - public int requiredPlayerCount() { return teamCount * (teamSize - 1); } diff --git a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateErrorType.java b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateErrorType.java index b1f37525..1c805af1 100644 --- a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateErrorType.java +++ b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplateErrorType.java @@ -38,12 +38,6 @@ public enum TemplateErrorType implements ErrorDescriptor { "드래프트 템플릿에는 최소 입찰 단위를 지정할 수 없습니다", Level.INFO ), - TEMPLATE_DRAFT_POSITION_LIMIT_NOT_ALLOWED( - HttpStatus.BAD_REQUEST, - "TEMPLATE_DRAFT_POSITION_LIMIT_NOT_ALLOWED", - "드래프트 템플릿에는 포지션 제한을 지정할 수 없습니다", - Level.INFO - ), TEMPLATE_DRAFT_ORDER_STRATEGY_REQUIRED( HttpStatus.BAD_REQUEST, "TEMPLATE_DRAFT_ORDER_STRATEGY_REQUIRED", diff --git a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplatePlayer.java b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplatePlayer.java index 2725dfa9..0a1367b4 100644 --- a/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplatePlayer.java +++ b/src/main/java/com/naminhyeok/fantazzk/template/domain/TemplatePlayer.java @@ -23,13 +23,6 @@ public TemplatePlayer(String name, String position, int displayOrder) { this.displayOrder = displayOrder; } - @SuppressWarnings("unused") - private TemplatePlayer() { - this.name = null; - this.position = null; - this.displayOrder = 0; - } - public String name() { return name; } @@ -42,7 +35,4 @@ public int displayOrder() { return displayOrder; } - public String getName() { - return name(); - } } diff --git a/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/JpaTemplateListReader.java b/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/JpaTemplateListReader.java deleted file mode 100644 index d16f2a2e..00000000 --- a/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/JpaTemplateListReader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.naminhyeok.fantazzk.template.infrastructure.persistence; - -import com.naminhyeok.fantazzk.template.query.TemplateDetail; -import com.naminhyeok.fantazzk.template.query.TemplateListReader; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class JpaTemplateListReader implements TemplateListReader { - private final TemplateListJpaRepository repository; - - @Override - public List list() { - return repository.findAll().stream() - .map(template -> new TemplateDetail(template, template.getPlayers())) - .toList(); - } -} diff --git a/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/TemplateListJpaRepository.java b/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/TemplateListJpaRepository.java deleted file mode 100644 index 463207dd..00000000 --- a/src/main/java/com/naminhyeok/fantazzk/template/infrastructure/persistence/TemplateListJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.naminhyeok.fantazzk.template.infrastructure.persistence; - -import com.naminhyeok.fantazzk.template.domain.Template; -import com.naminhyeok.fantazzk.template.domain.TemplateId; -import java.util.List; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.repository.Repository; - -public interface TemplateListJpaRepository extends Repository { - @EntityGraph(attributePaths = "players") - List