From 21ab38ed0f7cbdbe045afd08c3988f5a7ed3f20c Mon Sep 17 00:00:00 2001 From: leegwichan Date: Tue, 5 Aug 2025 15:00:19 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/CustomizeTableResponse.java | 18 ------------------ .../customize/CustomizeTimeBoxEntities.java | 8 -------- 2 files changed, 26 deletions(-) diff --git a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java index 2309b490..366939d6 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java @@ -2,28 +2,10 @@ import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBox; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import java.util.List; public record CustomizeTableResponse(long id, CustomizeTableInfoResponse info, List table) { - public CustomizeTableResponse( - CustomizeTable customizeTable, - CustomizeTimeBoxEntities customizeTimeBoxes - ) { - this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), - toTimeBoxResponses(customizeTimeBoxes)); - } - - private static List toTimeBoxResponses(CustomizeTimeBoxEntities timeBoxes) { - List customizeTimeBoxes = timeBoxes.getTimeBoxes(); - return customizeTimeBoxes - .stream() - .map(CustomizeTimeBoxResponse::new) - .toList(); - } - public CustomizeTableResponse(CustomizeTable customizeTable, List customizeTimeBoxes) { this(customizeTable.getId(), diff --git a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java b/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java index 32f5c383..d63bc0a6 100644 --- a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java +++ b/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java @@ -2,7 +2,6 @@ import com.debatetimer.domain.customize.Bell; import com.debatetimer.domain.customize.CustomizeTimeBox; -import java.util.Collections; import java.util.Comparator; import java.util.List; import lombok.Getter; @@ -17,13 +16,6 @@ public class CustomizeTimeBoxEntities { private final List bells; - public CustomizeTimeBoxEntities(List timeBoxes) { - this.timeBoxes = timeBoxes.stream() - .sorted(TIME_BOX_COMPARATOR) - .toList(); - this.bells = Collections.emptyList(); - } - public CustomizeTimeBoxEntities(List timeBoxes, List bells) { this.timeBoxes = timeBoxes.stream() .sorted(TIME_BOX_COMPARATOR) From 814822e5fe0ae8eaea6cf8b6d8fe336cd68845b2 Mon Sep 17 00:00:00 2001 From: leegwichan Date: Tue, 5 Aug 2025 15:02:19 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20TimeBox=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0,=20Bell=20=EC=97=94=ED=8B=B0=ED=8B=B0=20->=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EB=B0=94?= =?UTF-8?q?=EA=BE=B8=EB=8A=94=20=EC=9E=91=EC=97=85=EC=9D=84=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomizeTableDomainRepository.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java index de3705b8..4a1142f6 100644 --- a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java @@ -1,11 +1,11 @@ package com.debatetimer.domainrepository.customize; +import com.debatetimer.domain.customize.Bell; import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBox; import com.debatetimer.domain.member.Member; import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; @@ -55,8 +55,21 @@ public List getCustomizeTimeBoxes(long tableId, Member member) CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); List timeBoxEntityList = timeBoxRepository.findAllByCustomizeTable(tableEntity); List bellEntityList = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxEntityList); - CustomizeTimeBoxEntities timeBoxEntities = new CustomizeTimeBoxEntities(timeBoxEntityList, bellEntityList); - return timeBoxEntities.toDomain(); + return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList); + } + + private List toCustomizeTimeBoxes(List timeBoxEntities, + List bellEntities) { + return timeBoxEntities.stream() + .map(timebox -> timebox.toDomain(getBells(timebox, bellEntities))) + .toList(); + } + + private List getBells(CustomizeTimeBoxEntity timeBox, List bells) { + return bells.stream() + .filter(bell -> bell.isContained(timeBox)) + .map(BellEntity::toDomain) + .toList(); } @Transactional From 5f917eb03386505ad866ef1615f9fc8361d0a3be Mon Sep 17 00:00:00 2001 From: leegwichan Date: Tue, 5 Aug 2025 15:03:43 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20CustomizeTimeBoxEntities=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customize/CustomizeTimeBoxEntities.java | 38 ------------------- .../customize/CustomizeTimeBoxRepository.java | 14 ------- .../CustomizeTimeBoxEntitiesTest.java | 38 ------------------- 3 files changed, 90 deletions(-) delete mode 100644 src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java delete mode 100644 src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java diff --git a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java b/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java deleted file mode 100644 index d63bc0a6..00000000 --- a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.debatetimer.entity.customize; - -import com.debatetimer.domain.customize.Bell; -import com.debatetimer.domain.customize.CustomizeTimeBox; -import java.util.Comparator; -import java.util.List; -import lombok.Getter; - -public class CustomizeTimeBoxEntities { - - private static final Comparator TIME_BOX_COMPARATOR = Comparator - .comparing(CustomizeTimeBoxEntity::getSequence); - - @Getter - private final List timeBoxes; - - private final List bells; - - public CustomizeTimeBoxEntities(List timeBoxes, List bells) { - this.timeBoxes = timeBoxes.stream() - .sorted(TIME_BOX_COMPARATOR) - .toList(); - this.bells = bells; - } - - public List toDomain() { - return timeBoxes.stream() - .map(timebox -> timebox.toDomain(getBells(timebox))) - .toList(); - } - - private List getBells(CustomizeTimeBoxEntity timeBox) { - return bells.stream() - .filter(bell -> bell.isContained(timeBox)) - .map(BellEntity::toDomain) - .toList(); - } -} diff --git a/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java b/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java index 680391f6..1a0e524d 100644 --- a/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java @@ -1,32 +1,18 @@ package com.debatetimer.repository.customize; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import java.util.List; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; -import org.springframework.transaction.annotation.Transactional; public interface CustomizeTimeBoxRepository extends Repository { CustomizeTimeBoxEntity save(CustomizeTimeBoxEntity timeBox); - @Transactional - default List saveAll(List timeBoxes) { - return timeBoxes.stream() - .map(this::save) - .toList(); - } - List findAllByCustomizeTable(CustomizeTableEntity table); - default CustomizeTimeBoxEntities findTableTimeBoxes(CustomizeTableEntity table) { - List timeBoxes = findAllByCustomizeTable(table); - return new CustomizeTimeBoxEntities(timeBoxes); - } - @Query("DELETE FROM CustomizeTimeBoxEntity ctb WHERE ctb.customizeTable.id = :tableId") @Modifying(clearAutomatically = true, flushAutomatically = true) void deleteAllByTable(long tableId); diff --git a/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java b/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java deleted file mode 100644 index 48d0fb16..00000000 --- a/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.debatetimer.entity.customize; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.debatetimer.domain.customize.CustomizeBoxType; -import com.debatetimer.domain.customize.CustomizeTable; -import com.debatetimer.domain.customize.Stance; -import com.debatetimer.domain.member.Member; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -class CustomizeTimeBoxEntitiesTest { - - @Nested - class SortedBySequence { - - @Test - void 타임박스의_순서에_따라_정렬된다() { - Member member = new Member("default@gmail.com"); - CustomizeTable table = new CustomizeTable(member, "토론 테이블", "주제", "찬성", - "반대", true, true, LocalDateTime.now()); - CustomizeTableEntity testTable = new CustomizeTableEntity(table); - CustomizeTimeBoxEntity firstBox = new CustomizeTimeBoxEntity(testTable, 1, Stance.PROS, "입론", - CustomizeBoxType.NORMAL, 300, "콜리"); - CustomizeTimeBoxEntity secondBox = new CustomizeTimeBoxEntity(testTable, 2, Stance.PROS, "입론", - CustomizeBoxType.NORMAL, 300, "콜리2"); - List timeBoxes = new ArrayList<>(Arrays.asList(secondBox, firstBox)); - - CustomizeTimeBoxEntities actual = new CustomizeTimeBoxEntities(timeBoxes); - - assertThat(actual.getTimeBoxes()).containsExactly(firstBox, secondBox); - } - } -} From 49b38fccbce99387f95d187a9d5f4b47554473a2 Mon Sep 17 00:00:00 2001 From: leegwichan Date: Sun, 10 Aug 2025 15:36:22 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20`getCustomizeTimeBoxes()`=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomizeTableDomainRepository.java | 27 ++++++++++----- .../CustomizeTableDomainRepositoryTest.java | 33 ++++++++++++++++--- .../CustomizeTimeBoxEntityGenerator.java | 16 +++++++++ 3 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java index 4a1142f6..2c2e96e7 100644 --- a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java @@ -1,6 +1,5 @@ package com.debatetimer.domainrepository.customize; -import com.debatetimer.domain.customize.Bell; import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBox; import com.debatetimer.domain.member.Member; @@ -10,7 +9,11 @@ import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; +import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -58,18 +61,24 @@ public List getCustomizeTimeBoxes(long tableId, Member member) return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList); } - private List toCustomizeTimeBoxes(List timeBoxEntities, - List bellEntities) { + private List toCustomizeTimeBoxes( + List timeBoxEntities, + List bellEntities + ) { + Map> timeBoxIdToBellEntities = bellEntities.stream() + .collect(Collectors.groupingBy(bellEntity -> bellEntity.getCustomizeTimeBox().getId())); return timeBoxEntities.stream() - .map(timebox -> timebox.toDomain(getBells(timebox, bellEntities))) - .toList(); + .sorted(Comparator.comparing(CustomizeTimeBoxEntity::getSequence)) + .map(timeBoxEntity -> toTimeBox( + timeBoxEntity, + timeBoxIdToBellEntities.getOrDefault(timeBoxEntity.getId(), Collections.emptyList())) + ).toList(); } - private List getBells(CustomizeTimeBoxEntity timeBox, List bells) { - return bells.stream() - .filter(bell -> bell.isContained(timeBox)) + private CustomizeTimeBox toTimeBox(CustomizeTimeBoxEntity timeBoxEntity, List bellEntities) { + return bellEntities.stream() .map(BellEntity::toDomain) - .toList(); + .collect(Collectors.collectingAndThen(Collectors.toList(), timeBoxEntity::toDomain)); } @Transactional diff --git a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java index e9108935..44dfd654 100644 --- a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java @@ -68,16 +68,41 @@ class GetByIdAndMember { class GetCustomizeTimeBoxes { @Test - void 테이블의_시간박스를_가져온다() { + void 테이블의_시간박스는_순서대로_가져온다() { Member member = memberGenerator.generate("email@email.com"); CustomizeTableEntity tableEntity = tableEntityGenerator.generate(member); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 1); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 1, 60); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2, 120); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 3, 180); List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( tableEntity.getId(), member); - assertThat(timeBoxes).hasSize(2); + assertThat(timeBoxes).hasSize(3) + .extracting(CustomizeTimeBox::getTime) + .containsExactly(60, 120, 180); + } + + @Test + void 테이블의_시간박스와_벨을_가져온다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity tableEntity = tableEntityGenerator.generate(member); + CustomizeTimeBoxEntity timeBoxEntity1 = timeBoxEntityGenerator.generate(tableEntity, + CustomizeBoxType.NORMAL, 1); + CustomizeTimeBoxEntity timeBoxEntity2 = timeBoxEntityGenerator.generate(tableEntity, + CustomizeBoxType.NORMAL, 2); + bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 30, 1); + bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 20, 1); + bellEntityGenerator.generate(timeBoxEntity2, BellType.BEFORE_END, 10, 1); + + List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( + tableEntity.getId(), member); + + assertAll( + () -> assertThat(timeBoxes).hasSize(2), + () -> assertThat(timeBoxes.get(0).getBells()).hasSize(2), + () -> assertThat(timeBoxes.get(1).getBells()).hasSize(1) + ); } } diff --git a/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java b/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java index 7b2ca578..fd0d8bf6 100644 --- a/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java +++ b/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java @@ -29,6 +29,22 @@ public CustomizeTimeBoxEntity generate(CustomizeTableEntity testTable, Customize return customizeTimeBoxRepository.save(timeBox); } + public CustomizeTimeBoxEntity generate(CustomizeTableEntity testTable, + CustomizeBoxType boxType, + int sequence, + int time) { + CustomizeTimeBoxEntity timeBox = new CustomizeTimeBoxEntity( + testTable, + sequence, + Stance.PROS, + "입론", + boxType, + time, + "콜리" + ); + return customizeTimeBoxRepository.save(timeBox); + } + public CustomizeTimeBoxEntity generateNotExistSpeaker(CustomizeTableEntity testTable, CustomizeBoxType boxType, int sequence) { CustomizeTimeBoxEntity timeBox = new CustomizeTimeBoxEntity( From 8581c4d7be102e3a4a35a7239d65acedf276aae2 Mon Sep 17 00:00:00 2001 From: leegwichan Date: Mon, 11 Aug 2025 00:37:51 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=ED=83=80=EC=9E=84=EB=B0=95?= =?UTF-8?q?=EC=8A=A4/=EB=B2=A8=20=EC=88=9C=EC=84=9C=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EB=B3=B4=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomizeTableDomainRepositoryTest.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java index 44dfd654..e1dbbf53 100644 --- a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java @@ -72,15 +72,15 @@ class GetCustomizeTimeBoxes { Member member = memberGenerator.generate("email@email.com"); CustomizeTableEntity tableEntity = tableEntityGenerator.generate(member); timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 1, 60); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2, 120); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 3, 180); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2, 180); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 3, 120); List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( tableEntity.getId(), member); assertThat(timeBoxes).hasSize(3) .extracting(CustomizeTimeBox::getTime) - .containsExactly(60, 120, 180); + .containsExactly(60, 180, 120); } @Test @@ -91,8 +91,8 @@ class GetCustomizeTimeBoxes { CustomizeBoxType.NORMAL, 1); CustomizeTimeBoxEntity timeBoxEntity2 = timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2); - bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 30, 1); bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 20, 1); + bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 30, 1); bellEntityGenerator.generate(timeBoxEntity2, BellType.BEFORE_END, 10, 1); List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( @@ -100,8 +100,12 @@ class GetCustomizeTimeBoxes { assertAll( () -> assertThat(timeBoxes).hasSize(2), - () -> assertThat(timeBoxes.get(0).getBells()).hasSize(2), + () -> assertThat(timeBoxes.get(0).getBells()).hasSize(2) + .extracting(Bell::getTime) + .containsExactly(20, 30), () -> assertThat(timeBoxes.get(1).getBells()).hasSize(1) + .extracting(Bell::getTime) + .containsExactlyInAnyOrder(10) ); } }