From 614c8c55923a7e5cadef6a5ebd9b2d9cff92228b Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Mon, 7 Jul 2025 22:24:21 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20=EC=A2=85=EC=86=8C=EB=A6=AC=20?= =?UTF-8?q?=EC=BB=A4=EC=8A=A4=ED=85=80=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/customize/response/BellResponse.java | 7 +++ .../response/CustomizeTableResponse.java | 15 +---- .../response/CustomizeTimeBoxResponse.java | 5 +- .../debatetimer/entity/customize/Bell.java | 54 ++++++++++++++++ .../exception/errorcode/ClientErrorCode.java | 3 + .../repository/customize/BellRepository.java | 9 +++ .../service/customize/CustomizeService.java | 62 +++++++++++++++++-- .../db/migration/V9__add_bell_table.sql | 13 ++++ .../customize/CustomizeDocumentTest.java | 45 +++++++++----- .../entity/customize/BellTest.java | 29 +++++++++ 10 files changed, 208 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/debatetimer/dto/customize/response/BellResponse.java create mode 100644 src/main/java/com/debatetimer/entity/customize/Bell.java create mode 100644 src/main/java/com/debatetimer/repository/customize/BellRepository.java create mode 100644 src/main/resources/db/migration/V9__add_bell_table.sql create mode 100644 src/test/java/com/debatetimer/entity/customize/BellTest.java diff --git a/src/main/java/com/debatetimer/dto/customize/response/BellResponse.java b/src/main/java/com/debatetimer/dto/customize/response/BellResponse.java new file mode 100644 index 00000000..ce2dae8c --- /dev/null +++ b/src/main/java/com/debatetimer/dto/customize/response/BellResponse.java @@ -0,0 +1,7 @@ +package com.debatetimer.dto.customize.response; + +public record BellResponse( + int time, + int count +) { +} 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 a890db68..08782746 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java @@ -1,25 +1,14 @@ package com.debatetimer.dto.customize.response; import com.debatetimer.domain.customize.CustomizeTable; -import com.debatetimer.domain.customize.CustomizeTimeBoxes; -import com.debatetimer.entity.customize.CustomizeTimeBox; import java.util.List; public record CustomizeTableResponse(long id, CustomizeTableInfoResponse info, List table) { public CustomizeTableResponse( CustomizeTable customizeTable, - CustomizeTimeBoxes customizeTimeBoxes + List table ) { - this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), - toTimeBoxResponses(customizeTimeBoxes)); - } - - private static List toTimeBoxResponses(CustomizeTimeBoxes timeBoxes) { - List customizeTimeBoxes = timeBoxes.getTimeBoxes(); - return customizeTimeBoxes - .stream() - .map(CustomizeTimeBoxResponse::new) - .toList(); + this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), table); } } diff --git a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java index cca2eff9..8cde396a 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java @@ -3,23 +3,26 @@ import com.debatetimer.domain.customize.CustomizeBoxType; import com.debatetimer.domain.customize.Stance; import com.debatetimer.entity.customize.CustomizeTimeBox; +import java.util.List; public record CustomizeTimeBoxResponse( Stance stance, String speechType, CustomizeBoxType boxType, Integer time, + List bell, Integer timePerTeam, Integer timePerSpeaking, String speaker ) { - public CustomizeTimeBoxResponse(CustomizeTimeBox customizeTimeBox) { + public CustomizeTimeBoxResponse(CustomizeTimeBox customizeTimeBox, List bell) { this( customizeTimeBox.getStance(), customizeTimeBox.getSpeechType(), customizeTimeBox.getBoxType(), convertTime(customizeTimeBox), + bell, customizeTimeBox.getTimePerTeam(), customizeTimeBox.getTimePerSpeaking(), customizeTimeBox.getSpeaker() diff --git a/src/main/java/com/debatetimer/entity/customize/Bell.java b/src/main/java/com/debatetimer/entity/customize/Bell.java new file mode 100644 index 00000000..bfbfa29e --- /dev/null +++ b/src/main/java/com/debatetimer/entity/customize/Bell.java @@ -0,0 +1,54 @@ +package com.debatetimer.entity.customize; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Bell { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "customize_time_box_id") + private CustomizeTimeBox customizeTimeBox; + + private int time; + private int count; + + public Bell(CustomizeTimeBox customizeTimeBox, int time, int count) { + validateTime(time); + validateCount(count); + + this.customizeTimeBox = customizeTimeBox; + this.time = time; + this.count = count; + } + + private void validateTime(int time) { + if (time < 0) { + throw new DTClientErrorException(ClientErrorCode.INVALID_BELL_TIME); + } + } + + private void validateCount(int count) { + if (count <= 0) { + throw new DTClientErrorException(ClientErrorCode.INVALID_BELL_COUNT); + } + } +} diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index 35fee335..ab589f9c 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -65,6 +65,9 @@ public enum ClientErrorCode implements ResponseErrorCode { ALREADY_DISCONNECTED(HttpStatus.BAD_REQUEST, "이미 클라이언트에서 요청이 종료되었습니다."), NO_COOKIE_FOUND(HttpStatus.BAD_REQUEST, "필수 쿠키 값이 존재하지 않습니다."), FILE_UPLOAD_ERROR(HttpStatus.BAD_REQUEST, "파일 업로드에 실패했습니다."), + + INVALID_BELL_TIME(HttpStatus.BAD_REQUEST, "벨 시간은 0 이상의 정수여야 합니다."), + INVALID_BELL_COUNT(HttpStatus.BAD_REQUEST, "벨 카운트는 1 이상의 정수여야 합니다."), ; private final HttpStatus status; diff --git a/src/main/java/com/debatetimer/repository/customize/BellRepository.java b/src/main/java/com/debatetimer/repository/customize/BellRepository.java new file mode 100644 index 00000000..64b401d8 --- /dev/null +++ b/src/main/java/com/debatetimer/repository/customize/BellRepository.java @@ -0,0 +1,9 @@ +package com.debatetimer.repository.customize; + +import com.debatetimer.entity.customize.Bell; +import org.springframework.data.repository.Repository; + +public interface BellRepository extends Repository { + + Bell save(Bell bell); +} diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index 840a60b0..240b43f8 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -4,14 +4,20 @@ import com.debatetimer.domain.customize.CustomizeTimeBoxes; import com.debatetimer.domain.member.Member; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; +import com.debatetimer.dto.customize.response.BellResponse; import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; +import com.debatetimer.entity.customize.Bell; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +27,7 @@ public class CustomizeService { private final CustomizeTableRepository tableRepository; private final CustomizeTimeBoxRepository timeBoxRepository; + private final BellRepository bellRepository; @Transactional public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateRequest, Member member) { @@ -28,7 +35,7 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques CustomizeTableEntity savedTable = tableRepository.save(new CustomizeTableEntity(table)); CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, savedTable.toDomain()); - return new CustomizeTableResponse(savedTable.toDomain(), savedCustomizeTimeBoxes); + return getCustomizeTableResponse(savedTable, savedCustomizeTimeBoxes); } @Transactional(readOnly = true) @@ -36,7 +43,7 @@ public CustomizeTableResponse findTable(long tableId, Member member) { CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); - return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxes); + return getCustomizeTableResponse(tableEntity, timeBoxes); } @Transactional @@ -51,7 +58,7 @@ public CustomizeTableResponse updateTable( timeBoxRepository.deleteAllByTable(existingTable); CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, existingTable.toDomain()); - return new CustomizeTableResponse(existingTable.toDomain(), savedCustomizeTimeBoxes); + return getCustomizeTableResponse(existingTable, savedCustomizeTimeBoxes); } @Transactional @@ -61,7 +68,7 @@ public CustomizeTableResponse updateUsedAt(long tableId, Member member) { CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); tableEntity.updateUsedAt(); - return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxes); + return getCustomizeTableResponse(tableEntity, timeBoxes); } @Transactional @@ -81,4 +88,51 @@ private CustomizeTimeBoxes saveTimeBoxes( customizeTimeBoxes.getTimeBoxes()); return new CustomizeTimeBoxes(savedTimeBoxes); } + + @NotNull + private CustomizeTableResponse getCustomizeTableResponse( + CustomizeTableEntity savedTable, + CustomizeTimeBoxes savedCustomizeTimeBoxes + ) { + if (savedTable.isFinishBell()) { + savedCustomizeTimeBoxes.getTimeBoxes() + .stream() + .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) + .forEach(timeBox -> bellRepository.save(new Bell( + timeBox, + timeBox.getTime(), + 2 + ))); + } + if (savedTable.isWarningBell()) { + savedCustomizeTimeBoxes.getTimeBoxes() + .stream() + .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) + .forEach(timeBox -> bellRepository.save(new Bell( + timeBox, + timeBox.getTime() - 30, + 1 + ))); + } + List customizeTimeBoxResponses = savedCustomizeTimeBoxes.getTimeBoxes() + .stream() + .map(timeBox -> { + List bell = null; + if (timeBox.getBoxType().isNotTimeBased() && (savedTable.isFinishBell() || savedTable.isWarningBell())) { + bell = new ArrayList<>(); + if (savedTable.isWarningBell()) { + bell.add(new BellResponse(timeBox.getTime() - 30, 1)); + } + if (savedTable.isFinishBell()) { + bell.add(new BellResponse(timeBox.getTime(), 2)); + } + } + return new CustomizeTimeBoxResponse( + timeBox, + bell + ); + }) + .toList(); + return new CustomizeTableResponse(savedTable.toDomain(), customizeTimeBoxResponses); + } } diff --git a/src/main/resources/db/migration/V9__add_bell_table.sql b/src/main/resources/db/migration/V9__add_bell_table.sql new file mode 100644 index 00000000..199fb191 --- /dev/null +++ b/src/main/resources/db/migration/V9__add_bell_table.sql @@ -0,0 +1,13 @@ +create table bell +( + id bigint auto_increment, + time bigint not null, + count bigint not null, + customize_time_box_id bigint not null, + primary key (id) +); + +alter table bell + add constraint bell_to_customize_time_box + foreign key (customize_time_box_id) + references customize_time_box(id); diff --git a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java index c14b37fd..bed1d65b 100644 --- a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java @@ -23,6 +23,7 @@ import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; +import com.debatetimer.dto.customize.response.BellResponse; import com.debatetimer.dto.customize.response.CustomizeTableInfoResponse; import com.debatetimer.dto.customize.response.CustomizeTableResponse; import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; @@ -89,6 +90,9 @@ class Save { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -116,13 +120,13 @@ class Save { "찬성", "반대", true, true), List.of( new CustomizeTimeBoxResponse(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellResponse(90, 1)), null, null, "콜리"), new CustomizeTimeBoxResponse(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellResponse(90, 1), new BellResponse(120, 2)), null, null, "비토"), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doReturn(response).when(customizeService).save(eq(request), any()); @@ -221,6 +225,9 @@ class GetTable { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -235,13 +242,13 @@ class GetTable { "찬성", "반대", true, true), List.of( new CustomizeTimeBoxResponse(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellResponse(90, 1)), null, null, "콜리"), new CustomizeTimeBoxResponse(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellResponse(90, 1), new BellResponse(120, 2)), null, null, "비토"), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doReturn(response).when(customizeService).findTable(eq(tableId), any()); @@ -332,6 +339,9 @@ class UpdateTable { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -360,13 +370,13 @@ class UpdateTable { "찬성", "반대", true, true), List.of( new CustomizeTimeBoxResponse(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellResponse(90, 1)), null, null, "콜리"), new CustomizeTimeBoxResponse(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellResponse(90, 1), new BellResponse(120, 2)), null, null, "비토"), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doReturn(response).when(customizeService).updateTable(eq(request), eq(tableId), any()); @@ -470,6 +480,9 @@ class Debate { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -485,13 +498,13 @@ class Debate { "찬성", "반대", true, true), List.of( new CustomizeTimeBoxResponse(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellResponse(90, 1)), null, null, "콜리"), new CustomizeTimeBoxResponse(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellResponse(90, 1), new BellResponse(120, 2)), null, null, "비토"), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxResponse(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doReturn(response).when(customizeService).updateUsedAt(eq(tableId), any()); diff --git a/src/test/java/com/debatetimer/entity/customize/BellTest.java b/src/test/java/com/debatetimer/entity/customize/BellTest.java new file mode 100644 index 00000000..1419f6c4 --- /dev/null +++ b/src/test/java/com/debatetimer/entity/customize/BellTest.java @@ -0,0 +1,29 @@ +package com.debatetimer.entity.customize; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class BellTest { + + @Nested + class Validate { + + @Test + void 벨_시간은_0이상이어야_한다() { + assertThatThrownBy(() -> new Bell(null, -1, 1)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.INVALID_BELL_TIME.getMessage()); + } + + @Test + void 벨_횟수는_1이상이어야_한다() { + assertThatThrownBy(() -> new Bell(null, 1, 0)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.INVALID_BELL_COUNT.getMessage()); + } + } +} From 83fce1c7bbd76aecb5ddbfc13d49f63544826c4a Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Mon, 7 Jul 2025 22:31:04 +0900 Subject: [PATCH 02/15] =?UTF-8?q?style:=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/customize/response/CustomizeTableResponse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 08782746..ff760591 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java @@ -7,8 +7,8 @@ public record CustomizeTableResponse(long id, CustomizeTableInfoResponse info, L public CustomizeTableResponse( CustomizeTable customizeTable, - List table + List timeBoxResponses ) { - this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), table); + this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), timeBoxResponses); } } From 956512893331e58014c6d415ae1207b19cd63f45 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Mon, 7 Jul 2025 22:36:01 +0900 Subject: [PATCH 03/15] =?UTF-8?q?fix:=2030=EC=B4=88=20=EC=9D=B4=EC=83=81?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/debatetimer/service/customize/CustomizeService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index 240b43f8..cf4ec85b 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -108,6 +108,7 @@ private CustomizeTableResponse getCustomizeTableResponse( savedCustomizeTimeBoxes.getTimeBoxes() .stream() .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) + .filter(timeBox -> timeBox.getTime() >= 30) .forEach(timeBox -> bellRepository.save(new Bell( timeBox, timeBox.getTime() - 30, From b623ce85e43187a2948247c85597722e1e35682e Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Tue, 8 Jul 2025 11:14:14 +0900 Subject: [PATCH 04/15] =?UTF-8?q?refactor:=20update,=20save,=20delete=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/customize/BellRepository.java | 6 ++ .../service/customize/CustomizeService.java | 57 ++++++++++++------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/debatetimer/repository/customize/BellRepository.java b/src/main/java/com/debatetimer/repository/customize/BellRepository.java index 64b401d8..9aeac322 100644 --- a/src/main/java/com/debatetimer/repository/customize/BellRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/BellRepository.java @@ -1,9 +1,15 @@ package com.debatetimer.repository.customize; import com.debatetimer.entity.customize.Bell; +import com.debatetimer.entity.customize.CustomizeTimeBox; +import java.util.List; import org.springframework.data.repository.Repository; public interface BellRepository extends Repository { Bell save(Bell bell); + + List findByCustomizeTimeBox(CustomizeTimeBox customizeTimeBox); + + void delete(Bell bell); } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index cf4ec85b..554ceab9 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -35,6 +35,8 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques CustomizeTableEntity savedTable = tableRepository.save(new CustomizeTableEntity(table)); CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, savedTable.toDomain()); + + saveBell(savedTable, savedCustomizeTimeBoxes); return getCustomizeTableResponse(savedTable, savedCustomizeTimeBoxes); } @@ -43,6 +45,7 @@ public CustomizeTableResponse findTable(long tableId, Member member) { CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); + return getCustomizeTableResponse(tableEntity, timeBoxes); } @@ -58,6 +61,9 @@ public CustomizeTableResponse updateTable( timeBoxRepository.deleteAllByTable(existingTable); CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, existingTable.toDomain()); + + deleteBell(savedCustomizeTimeBoxes); + saveBell(existingTable, savedCustomizeTimeBoxes); return getCustomizeTableResponse(existingTable, savedCustomizeTimeBoxes); } @@ -94,6 +100,29 @@ private CustomizeTableResponse getCustomizeTableResponse( CustomizeTableEntity savedTable, CustomizeTimeBoxes savedCustomizeTimeBoxes ) { + List customizeTimeBoxResponses = savedCustomizeTimeBoxes.getTimeBoxes() + .stream() + .map(timeBox -> { + List bell = null; + if (timeBox.getBoxType().isNotTimeBased() && (savedTable.isFinishBell() || savedTable.isWarningBell())) { + bell = new ArrayList<>(); + if (savedTable.isWarningBell()) { + bell.add(new BellResponse(timeBox.getTime() - 30, 1)); + } + if (savedTable.isFinishBell()) { + bell.add(new BellResponse(timeBox.getTime(), 2)); + } + } + return new CustomizeTimeBoxResponse( + timeBox, + bell + ); + }) + .toList(); + return new CustomizeTableResponse(savedTable.toDomain(), customizeTimeBoxResponses); + } + + private void saveBell(CustomizeTableEntity savedTable, CustomizeTimeBoxes savedCustomizeTimeBoxes) { if (savedTable.isFinishBell()) { savedCustomizeTimeBoxes.getTimeBoxes() .stream() @@ -115,25 +144,15 @@ private CustomizeTableResponse getCustomizeTableResponse( 1 ))); } - List customizeTimeBoxResponses = savedCustomizeTimeBoxes.getTimeBoxes() + } + + private void deleteBell(CustomizeTimeBoxes savedCustomizeTimeBoxes) { + savedCustomizeTimeBoxes.getTimeBoxes() .stream() - .map(timeBox -> { - List bell = null; - if (timeBox.getBoxType().isNotTimeBased() && (savedTable.isFinishBell() || savedTable.isWarningBell())) { - bell = new ArrayList<>(); - if (savedTable.isWarningBell()) { - bell.add(new BellResponse(timeBox.getTime() - 30, 1)); - } - if (savedTable.isFinishBell()) { - bell.add(new BellResponse(timeBox.getTime(), 2)); - } - } - return new CustomizeTimeBoxResponse( - timeBox, - bell - ); - }) - .toList(); - return new CustomizeTableResponse(savedTable.toDomain(), customizeTimeBoxResponses); + .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) + .forEach(timeBox -> + bellRepository.findByCustomizeTimeBox(timeBox) + .forEach(bellRepository::delete) + ); } } From d29a7160f16a45900012bfd19a7e9d13e0d6b909 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Tue, 8 Jul 2025 11:16:27 +0900 Subject: [PATCH 05/15] =?UTF-8?q?refactor:=20=EB=B2=A8=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8A=B8=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/debatetimer/entity/customize/Bell.java | 4 +++- .../com/debatetimer/exception/errorcode/ClientErrorCode.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/debatetimer/entity/customize/Bell.java b/src/main/java/com/debatetimer/entity/customize/Bell.java index bfbfa29e..61662e0b 100644 --- a/src/main/java/com/debatetimer/entity/customize/Bell.java +++ b/src/main/java/com/debatetimer/entity/customize/Bell.java @@ -19,6 +19,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Bell { + public static final int MAX_BELL_COUNT = 3; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -47,7 +49,7 @@ private void validateTime(int time) { } private void validateCount(int count) { - if (count <= 0) { + if (count <= 0 || count > MAX_BELL_COUNT) { throw new DTClientErrorException(ClientErrorCode.INVALID_BELL_COUNT); } } diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index ab589f9c..3b92a0a6 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -3,6 +3,7 @@ import com.debatetimer.domain.customize.Agenda; import com.debatetimer.domain.customize.TableName; import com.debatetimer.domain.customize.TeamName; +import com.debatetimer.entity.customize.Bell; import com.debatetimer.entity.customize.CustomizeTimeBox; import lombok.Getter; import org.springframework.http.HttpStatus; @@ -67,7 +68,7 @@ public enum ClientErrorCode implements ResponseErrorCode { FILE_UPLOAD_ERROR(HttpStatus.BAD_REQUEST, "파일 업로드에 실패했습니다."), INVALID_BELL_TIME(HttpStatus.BAD_REQUEST, "벨 시간은 0 이상의 정수여야 합니다."), - INVALID_BELL_COUNT(HttpStatus.BAD_REQUEST, "벨 카운트는 1 이상의 정수여야 합니다."), + INVALID_BELL_COUNT(HttpStatus.BAD_REQUEST, "벨 카운트는 1 이상 %d 이하의 정수여야 합니다.".formatted(Bell.MAX_BELL_COUNT)), ; private final HttpStatus status; From 255ba3345ac4f4a040356d00beec63c76ca8edeb Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Tue, 8 Jul 2025 11:18:56 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor:=20=EB=B2=A8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/service/customize/CustomizeService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index 554ceab9..ccf8661b 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -81,8 +81,12 @@ public CustomizeTableResponse updateUsedAt(long tableId, Member member) { public void deleteTable(long tableId, Member member) { CustomizeTableEntity table = tableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + + deleteBell(timeBoxRepository.findTableTimeBoxes(table)); + timeBoxRepository.deleteAllByTable(table); tableRepository.delete(table); + } private CustomizeTimeBoxes saveTimeBoxes( From e22c63fb23a77fa4a58b7d06864c7a8af410621d Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Tue, 8 Jul 2025 15:43:07 +0900 Subject: [PATCH 07/15] =?UTF-8?q?refactor:=20Request=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/customize/request/BellRequest.java | 7 ++++ .../CustomizeTimeBoxCreateRequest.java | 4 ++ .../service/customize/CustomizeService.java | 3 +- .../customize/CustomizeDocumentTest.java | 39 +++++++++++-------- .../debatetimer/service/BaseServiceTest.java | 4 ++ .../customize/CustomizeServiceTest.java | 35 +++++++++++------ 6 files changed, 63 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/debatetimer/dto/customize/request/BellRequest.java diff --git a/src/main/java/com/debatetimer/dto/customize/request/BellRequest.java b/src/main/java/com/debatetimer/dto/customize/request/BellRequest.java new file mode 100644 index 00000000..0c846580 --- /dev/null +++ b/src/main/java/com/debatetimer/dto/customize/request/BellRequest.java @@ -0,0 +1,7 @@ +package com.debatetimer.dto.customize.request; + +public record BellRequest( + int time, + int count +) { +} diff --git a/src/main/java/com/debatetimer/dto/customize/request/CustomizeTimeBoxCreateRequest.java b/src/main/java/com/debatetimer/dto/customize/request/CustomizeTimeBoxCreateRequest.java index b3c125a1..97397215 100644 --- a/src/main/java/com/debatetimer/dto/customize/request/CustomizeTimeBoxCreateRequest.java +++ b/src/main/java/com/debatetimer/dto/customize/request/CustomizeTimeBoxCreateRequest.java @@ -7,6 +7,7 @@ import com.debatetimer.entity.customize.CustomizeTimeBox; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import java.util.List; import org.springframework.lang.Nullable; public record CustomizeTimeBoxCreateRequest( @@ -22,6 +23,9 @@ public record CustomizeTimeBoxCreateRequest( @Nullable Integer time, + @Nullable + List bell, + @Nullable Integer timePerTeam, diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index ccf8661b..c7592e85 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -9,6 +9,7 @@ import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; import com.debatetimer.entity.customize.Bell; import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.customize.CustomizeTimeBox; import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; import com.debatetimer.repository.customize.BellRepository; @@ -94,7 +95,7 @@ private CustomizeTimeBoxes saveTimeBoxes( CustomizeTable table ) { CustomizeTimeBoxes customizeTimeBoxes = tableCreateRequest.toTimeBoxes(table); - List savedTimeBoxes = timeBoxRepository.saveAll( + List savedTimeBoxes = timeBoxRepository.saveAll( customizeTimeBoxes.getTimeBoxes()); return new CustomizeTimeBoxes(savedTimeBoxes); } diff --git a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java index bed1d65b..e7545638 100644 --- a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java @@ -20,6 +20,7 @@ import com.debatetimer.controller.Tag; import com.debatetimer.domain.customize.CustomizeBoxType; import com.debatetimer.domain.customize.Stance; +import com.debatetimer.dto.customize.request.BellRequest; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; @@ -69,6 +70,9 @@ class Save { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -105,13 +109,13 @@ class Save { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellRequest(90, 1)), null, null, "콜리"), new CustomizeTimeBoxCreateRequest(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), null, null, "비토"), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); CustomizeTableResponse response = new CustomizeTableResponse( @@ -164,13 +168,13 @@ class Save { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellRequest(90, 1)), null, null, "콜리"), new CustomizeTimeBoxCreateRequest(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), null, null, "비토"), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doThrow(new DTClientErrorException(errorCode)).when(customizeService).save(eq(request), any()); @@ -318,6 +322,9 @@ class UpdateTable { fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)").optional(), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수").optional(), fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() @@ -355,13 +362,13 @@ class UpdateTable { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellRequest(90, 1)), null, null, "콜리"), new CustomizeTimeBoxCreateRequest(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), null, null, "비토"), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); CustomizeTableResponse response = new CustomizeTableResponse( @@ -417,13 +424,13 @@ class UpdateTable { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "콜리"), + 120, List.of(new BellRequest(90, 1)), null, null, "콜리"), new CustomizeTimeBoxCreateRequest(Stance.CONS, "입론", CustomizeBoxType.NORMAL, - 120, null, null, "비토"), + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), null, null, "비토"), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, - null, 360, 120, null), + null, null, 360, 120, null), new CustomizeTimeBoxCreateRequest(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, - null, 360, null, null) + null, null, 360, null, null) ) ); doThrow(new DTClientErrorException(errorCode)).when(customizeService) diff --git a/src/test/java/com/debatetimer/service/BaseServiceTest.java b/src/test/java/com/debatetimer/service/BaseServiceTest.java index f512da4e..9b052f10 100644 --- a/src/test/java/com/debatetimer/service/BaseServiceTest.java +++ b/src/test/java/com/debatetimer/service/BaseServiceTest.java @@ -4,6 +4,7 @@ import com.debatetimer.fixture.CustomizeTableGenerator; import com.debatetimer.fixture.CustomizeTimeBoxGenerator; import com.debatetimer.fixture.MemberGenerator; +import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; import com.debatetimer.repository.member.MemberRepository; @@ -35,6 +36,9 @@ public abstract class BaseServiceTest { @Autowired protected CustomizeTimeBoxGenerator customizeTimeBoxGenerator; + @Autowired + protected BellRepository bellRepository; + protected void runAtSameTime(int count, Runnable task) throws InterruptedException { List threads = IntStream.range(0, count) .mapToObj(i -> new Thread(task)) diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index ad4d9e16..ceacdfbd 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -7,6 +7,7 @@ import com.debatetimer.domain.customize.CustomizeBoxType; import com.debatetimer.domain.customize.Stance; import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.request.BellRequest; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; @@ -39,9 +40,9 @@ class Save { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자1"), + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자2") + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") ) ); @@ -52,7 +53,12 @@ class Save { assertAll( () -> assertThat(foundTable.get().getName()).isEqualTo(customizeTableCreateRequest.info().name()), - () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()) + () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()), + () -> { + for (CustomizeTimeBox timeBox : foundTimeBoxes) { + assertThat(bellRepository.findByCustomizeTimeBox(timeBox)).hasSize(2); + } + } ); } } @@ -100,9 +106,9 @@ class UpdateTable { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자1"), + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자2") + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") ) ); @@ -115,7 +121,12 @@ class UpdateTable { assertAll( () -> assertThat(updatedTable.get().getId()).isEqualTo(chanTable.getId()), () -> assertThat(updatedTable.get().getName()).isEqualTo(renewTableRequest.info().name()), - () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()) + () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()), + () -> { + for (CustomizeTimeBox timeBox : updatedTimeBoxes) { + assertThat(bellRepository.findByCustomizeTimeBox(timeBox)).hasSize(2); + } + } ); } @@ -130,9 +141,9 @@ class UpdateTable { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자1"), + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자2") + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") ) ); @@ -150,9 +161,9 @@ class UpdateTable { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자1"), + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자2") + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") ) ); @@ -191,9 +202,9 @@ class UpdateUsedAt { "반대", true, true), List.of( new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자1"), + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, 60, null, "발언자2") + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") ) ); From 8fb7c1534a57a4c87ef0b6a35fe0064b6c298c07 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Thu, 10 Jul 2025 22:07:42 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor:=20bell=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customize/{Bell.java => BellEntity.java} | 6 +- .../exception/errorcode/ClientErrorCode.java | 4 +- .../repository/customize/BellRepository.java | 16 +++-- .../service/customize/CustomizeService.java | 61 ++++++++++++++----- .../controller/BaseControllerTest.java | 8 +++ .../{BellTest.java => BellEntityTest.java} | 13 ++-- .../debatetimer/fixture/BellGenerator.java | 21 +++++++ .../debatetimer/service/BaseServiceTest.java | 6 +- .../customize/CustomizeServiceTest.java | 13 +++- 9 files changed, 114 insertions(+), 34 deletions(-) rename src/main/java/com/debatetimer/entity/customize/{Bell.java => BellEntity.java} (90%) rename src/test/java/com/debatetimer/entity/customize/{BellTest.java => BellEntityTest.java} (62%) create mode 100644 src/test/java/com/debatetimer/fixture/BellGenerator.java diff --git a/src/main/java/com/debatetimer/entity/customize/Bell.java b/src/main/java/com/debatetimer/entity/customize/BellEntity.java similarity index 90% rename from src/main/java/com/debatetimer/entity/customize/Bell.java rename to src/main/java/com/debatetimer/entity/customize/BellEntity.java index 61662e0b..8d496881 100644 --- a/src/main/java/com/debatetimer/entity/customize/Bell.java +++ b/src/main/java/com/debatetimer/entity/customize/BellEntity.java @@ -9,15 +9,17 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +@Table(name = "bell") @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Bell { +public class BellEntity { public static final int MAX_BELL_COUNT = 3; @@ -33,7 +35,7 @@ public class Bell { private int time; private int count; - public Bell(CustomizeTimeBox customizeTimeBox, int time, int count) { + public BellEntity(CustomizeTimeBox customizeTimeBox, int time, int count) { validateTime(time); validateCount(count); diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index 3b92a0a6..e0ac6cf3 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -3,7 +3,7 @@ import com.debatetimer.domain.customize.Agenda; import com.debatetimer.domain.customize.TableName; import com.debatetimer.domain.customize.TeamName; -import com.debatetimer.entity.customize.Bell; +import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; import lombok.Getter; import org.springframework.http.HttpStatus; @@ -68,7 +68,7 @@ public enum ClientErrorCode implements ResponseErrorCode { FILE_UPLOAD_ERROR(HttpStatus.BAD_REQUEST, "파일 업로드에 실패했습니다."), INVALID_BELL_TIME(HttpStatus.BAD_REQUEST, "벨 시간은 0 이상의 정수여야 합니다."), - INVALID_BELL_COUNT(HttpStatus.BAD_REQUEST, "벨 카운트는 1 이상 %d 이하의 정수여야 합니다.".formatted(Bell.MAX_BELL_COUNT)), + INVALID_BELL_COUNT(HttpStatus.BAD_REQUEST, "벨 카운트는 1 이상 %d 이하의 정수여야 합니다.".formatted(BellEntity.MAX_BELL_COUNT)), ; private final HttpStatus status; diff --git a/src/main/java/com/debatetimer/repository/customize/BellRepository.java b/src/main/java/com/debatetimer/repository/customize/BellRepository.java index 9aeac322..52cac86f 100644 --- a/src/main/java/com/debatetimer/repository/customize/BellRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/BellRepository.java @@ -1,15 +1,21 @@ package com.debatetimer.repository.customize; -import com.debatetimer.entity.customize.Bell; +import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; import java.util.List; import org.springframework.data.repository.Repository; -public interface BellRepository extends Repository { +public interface BellRepository extends Repository { - Bell save(Bell bell); + BellEntity save(BellEntity bell); - List findByCustomizeTimeBox(CustomizeTimeBox customizeTimeBox); + List findByCustomizeTimeBox(CustomizeTimeBox customizeTimeBox); - void delete(Bell bell); + void delete(BellEntity bell); + + void deleteAllByCustomizeTimeBoxIn(List customizeTimeBoxes); + + List findAllByCustomizeTimeBoxIn(List timeBoxes); + + List findAll(); } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index c7592e85..fb06e4e7 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -3,11 +3,13 @@ import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBoxes; import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.request.BellRequest; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; +import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; import com.debatetimer.dto.customize.response.BellResponse; import com.debatetimer.dto.customize.response.CustomizeTableResponse; import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; -import com.debatetimer.entity.customize.Bell; +import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; import com.debatetimer.exception.custom.DTClientErrorException; @@ -16,9 +18,10 @@ import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,8 +38,9 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques CustomizeTable table = tableCreateRequest.toTable(member); CustomizeTableEntity savedTable = tableRepository.save(new CustomizeTableEntity(table)); - CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, savedTable.toDomain()); + CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxesAndBells(tableCreateRequest, savedTable.toDomain()); + // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 saveBell(savedTable, savedCustomizeTimeBoxes); return getCustomizeTableResponse(savedTable, savedCustomizeTimeBoxes); } @@ -60,10 +64,10 @@ public CustomizeTableResponse updateTable( CustomizeTable renewedTable = tableCreateRequest.toTable(member); existingTable.updateTable(renewedTable); + deleteBell(timeBoxRepository.findTableTimeBoxes(existingTable)); timeBoxRepository.deleteAllByTable(existingTable); - CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, existingTable.toDomain()); + CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxesAndBells(tableCreateRequest, existingTable.toDomain()); - deleteBell(savedCustomizeTimeBoxes); saveBell(existingTable, savedCustomizeTimeBoxes); return getCustomizeTableResponse(existingTable, savedCustomizeTimeBoxes); } @@ -90,17 +94,47 @@ public void deleteTable(long tableId, Member member) { } - private CustomizeTimeBoxes saveTimeBoxes( + private CustomizeTimeBoxes saveTimeBoxesAndBells( CustomizeTableCreateRequest tableCreateRequest, CustomizeTable table ) { + // TODO : 밑에 부분은 프론트 업데이트 후 주석 풀기 + /* + List timeBoxCreateRequests = tableCreateRequest.table(); + List timeBoxResponses = IntStream.range(0, timeBoxCreateRequests.size()) + .mapToObj(i -> createTimeBoxResponse(timeBoxCreateRequests.get(i), table, i + 1)) + .toList(); + new CustomizeTableResponse(table, timeBoxResponses); + */ + + // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 CustomizeTimeBoxes customizeTimeBoxes = tableCreateRequest.toTimeBoxes(table); List savedTimeBoxes = timeBoxRepository.saveAll( customizeTimeBoxes.getTimeBoxes()); return new CustomizeTimeBoxes(savedTimeBoxes); } - @NotNull + private CustomizeTimeBoxResponse createTimeBoxResponse( + CustomizeTimeBoxCreateRequest request, + CustomizeTable table, + int sequence + ) { + CustomizeTimeBox savedTimeBox = timeBoxRepository.save(request.toTimeBox(table, sequence)); + List bellResponses = createBellResponses(request.bell(), savedTimeBox); + return new CustomizeTimeBoxResponse(savedTimeBox, bellResponses); + } + + private List createBellResponses(List bellRequests, CustomizeTimeBox savedTimeBox) { + return Optional.ofNullable(bellRequests) + .orElse(Collections.emptyList()) + .stream() + .map(bellRequest -> new BellEntity(savedTimeBox, bellRequest.time(), bellRequest.count())) + .map(bellRepository::save) + .map(bell -> new BellResponse(bell.getTime(), bell.getCount())) + .toList(); + } + + // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 private CustomizeTableResponse getCustomizeTableResponse( CustomizeTableEntity savedTable, CustomizeTimeBoxes savedCustomizeTimeBoxes @@ -127,12 +161,13 @@ private CustomizeTableResponse getCustomizeTableResponse( return new CustomizeTableResponse(savedTable.toDomain(), customizeTimeBoxResponses); } + // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 private void saveBell(CustomizeTableEntity savedTable, CustomizeTimeBoxes savedCustomizeTimeBoxes) { if (savedTable.isFinishBell()) { savedCustomizeTimeBoxes.getTimeBoxes() .stream() .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) - .forEach(timeBox -> bellRepository.save(new Bell( + .forEach(timeBox -> bellRepository.save(new BellEntity( timeBox, timeBox.getTime(), 2 @@ -143,7 +178,7 @@ private void saveBell(CustomizeTableEntity savedTable, CustomizeTimeBoxes savedC .stream() .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) .filter(timeBox -> timeBox.getTime() >= 30) - .forEach(timeBox -> bellRepository.save(new Bell( + .forEach(timeBox -> bellRepository.save(new BellEntity( timeBox, timeBox.getTime() - 30, 1 @@ -152,12 +187,6 @@ private void saveBell(CustomizeTableEntity savedTable, CustomizeTimeBoxes savedC } private void deleteBell(CustomizeTimeBoxes savedCustomizeTimeBoxes) { - savedCustomizeTimeBoxes.getTimeBoxes() - .stream() - .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) - .forEach(timeBox -> - bellRepository.findByCustomizeTimeBox(timeBox) - .forEach(bellRepository::delete) - ); + bellRepository.deleteAllByCustomizeTimeBoxIn(savedCustomizeTimeBoxes.getTimeBoxes()); } } diff --git a/src/test/java/com/debatetimer/controller/BaseControllerTest.java b/src/test/java/com/debatetimer/controller/BaseControllerTest.java index 78976392..2ca415ea 100644 --- a/src/test/java/com/debatetimer/controller/BaseControllerTest.java +++ b/src/test/java/com/debatetimer/controller/BaseControllerTest.java @@ -4,6 +4,7 @@ import com.debatetimer.client.oauth.OAuthClient; import com.debatetimer.domain.customize.CustomizeBoxType; import com.debatetimer.domain.customize.Stance; +import com.debatetimer.dto.customize.request.BellRequest; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; @@ -97,8 +98,15 @@ private ArbitraryBuilder getCustomizeTimeBoxCreat .set("speechType", "입론1") .set("boxType", CustomizeBoxType.NORMAL) .set("time", 120) + .set("bell", getBellRequestBuilder().sampleList(2)) .set("timePerTeam", 60) .set("timePerSpeaking", null) .set("speaker", "발언자"); } + + private ArbitraryBuilder getBellRequestBuilder() { + return fixtureMonkey.giveMeBuilder(BellRequest.class) + .set("time", 30) + .set("count", 1); + } } diff --git a/src/test/java/com/debatetimer/entity/customize/BellTest.java b/src/test/java/com/debatetimer/entity/customize/BellEntityTest.java similarity index 62% rename from src/test/java/com/debatetimer/entity/customize/BellTest.java rename to src/test/java/com/debatetimer/entity/customize/BellEntityTest.java index 1419f6c4..73535499 100644 --- a/src/test/java/com/debatetimer/entity/customize/BellTest.java +++ b/src/test/java/com/debatetimer/entity/customize/BellEntityTest.java @@ -6,22 +6,25 @@ import com.debatetimer.exception.errorcode.ClientErrorCode; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; -class BellTest { +class BellEntityTest { @Nested class Validate { @Test void 벨_시간은_0이상이어야_한다() { - assertThatThrownBy(() -> new Bell(null, -1, 1)) + assertThatThrownBy(() -> new BellEntity(null, -1, 1)) .isInstanceOf(DTClientErrorException.class) .hasMessage(ClientErrorCode.INVALID_BELL_TIME.getMessage()); } - @Test - void 벨_횟수는_1이상이어야_한다() { - assertThatThrownBy(() -> new Bell(null, 1, 0)) + @ValueSource(ints = {0, BellEntity.MAX_BELL_COUNT + 1}) + @ParameterizedTest + void 벨_횟수는_정해진_횟수_이내여야_한다(int count) { + assertThatThrownBy(() -> new BellEntity(null, 1, count)) .isInstanceOf(DTClientErrorException.class) .hasMessage(ClientErrorCode.INVALID_BELL_COUNT.getMessage()); } diff --git a/src/test/java/com/debatetimer/fixture/BellGenerator.java b/src/test/java/com/debatetimer/fixture/BellGenerator.java new file mode 100644 index 00000000..b9698fd3 --- /dev/null +++ b/src/test/java/com/debatetimer/fixture/BellGenerator.java @@ -0,0 +1,21 @@ +package com.debatetimer.fixture; + +import com.debatetimer.entity.customize.BellEntity; +import com.debatetimer.entity.customize.CustomizeTimeBox; +import com.debatetimer.repository.customize.BellRepository; +import org.springframework.stereotype.Component; + +@Component +public class BellGenerator { + + private final BellRepository bellRepository; + + public BellGenerator(BellRepository bellRepository) { + this.bellRepository = bellRepository; + } + + public BellEntity generate(CustomizeTimeBox timeBox, int time, int count) { + BellEntity bell = new BellEntity(timeBox, time, count); + return bellRepository.save(bell); + } +} diff --git a/src/test/java/com/debatetimer/service/BaseServiceTest.java b/src/test/java/com/debatetimer/service/BaseServiceTest.java index 9b052f10..6220cc2a 100644 --- a/src/test/java/com/debatetimer/service/BaseServiceTest.java +++ b/src/test/java/com/debatetimer/service/BaseServiceTest.java @@ -1,6 +1,7 @@ package com.debatetimer.service; import com.debatetimer.DataBaseCleaner; +import com.debatetimer.fixture.BellGenerator; import com.debatetimer.fixture.CustomizeTableGenerator; import com.debatetimer.fixture.CustomizeTimeBoxGenerator; import com.debatetimer.fixture.MemberGenerator; @@ -27,6 +28,9 @@ public abstract class BaseServiceTest { @Autowired protected CustomizeTimeBoxRepository customizeTimeBoxRepository; + @Autowired + protected BellRepository bellRepository; + @Autowired protected MemberGenerator memberGenerator; @@ -37,7 +41,7 @@ public abstract class BaseServiceTest { protected CustomizeTimeBoxGenerator customizeTimeBoxGenerator; @Autowired - protected BellRepository bellRepository; + protected BellGenerator bellGenerator; protected void runAtSameTime(int count, Runnable task) throws InterruptedException { List threads = IntStream.range(0, count) diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index ceacdfbd..f7776cb4 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -12,6 +12,7 @@ import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; import com.debatetimer.exception.custom.DTClientErrorException; @@ -221,18 +222,24 @@ class DeleteTable { void 사용자_지정_토론_테이블을_삭제한다() { Member chan = memberGenerator.generate("default@gmail.com"); CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); - customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 1); - customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 2); + CustomizeTimeBox timeBox1 = customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 1); + CustomizeTimeBox timeBox2 = customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, + 2); + bellGenerator.generate(timeBox1, 30, 1); + bellGenerator.generate(timeBox1, 45, 1); + bellGenerator.generate(timeBox2, 60, 2); customizeService.deleteTable(chanTable.getId(), chan); Optional foundTable = customizeTableRepository.findById(chanTable.getId()); List timeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( chanTable); + List bells = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxes); assertAll( () -> assertThat(foundTable).isEmpty(), - () -> assertThat(timeBoxes).isEmpty() + () -> assertThat(timeBoxes).isEmpty(), + () -> assertThat(bells).isEmpty() ); } From 3b0317850710d51f36e22b380bc661065fd92378 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Thu, 10 Jul 2025 22:12:47 +0900 Subject: [PATCH 09/15] =?UTF-8?q?=20=20=20=20refactor:=20Column=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/debatetimer/entity/customize/BellEntity.java | 2 ++ src/main/resources/db/migration/V9__add_bell_table.sql | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/debatetimer/entity/customize/BellEntity.java b/src/main/java/com/debatetimer/entity/customize/BellEntity.java index 8d496881..43d4df71 100644 --- a/src/main/java/com/debatetimer/entity/customize/BellEntity.java +++ b/src/main/java/com/debatetimer/entity/customize/BellEntity.java @@ -2,6 +2,7 @@ import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -32,6 +33,7 @@ public class BellEntity { @JoinColumn(name = "customize_time_box_id") private CustomizeTimeBox customizeTimeBox; + @Column(name = "bell_time") private int time; private int count; diff --git a/src/main/resources/db/migration/V9__add_bell_table.sql b/src/main/resources/db/migration/V9__add_bell_table.sql index 199fb191..b6e4c5cf 100644 --- a/src/main/resources/db/migration/V9__add_bell_table.sql +++ b/src/main/resources/db/migration/V9__add_bell_table.sql @@ -1,7 +1,7 @@ create table bell ( id bigint auto_increment, - time bigint not null, + bell_time bigint not null, count bigint not null, customize_time_box_id bigint not null, primary key (id) From 3c33a875f0516d6adc8dfb33638572eb114a4abf Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Sat, 12 Jul 2025 17:06:57 +0900 Subject: [PATCH 10/15] =?UTF-8?q?=20=20=20=20refactor:=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20V2=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/CustomizeTableResponse.java | 18 +++ .../response/CustomizeTimeBoxResponse.java | 13 ++ .../service/customize/CustomizeService.java | 124 +-------------- .../service/customize/CustomizeServiceV2.java | 141 ++++++++++++++++++ .../customize/CustomizeServiceTest.java | 22 +-- 5 files changed, 184 insertions(+), 134 deletions(-) create mode 100644 src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java 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 ff760591..587e61c5 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java @@ -1,14 +1,32 @@ package com.debatetimer.dto.customize.response; import com.debatetimer.domain.customize.CustomizeTable; +import com.debatetimer.domain.customize.CustomizeTimeBoxes; +import com.debatetimer.entity.customize.CustomizeTimeBox; import java.util.List; public record CustomizeTableResponse(long id, CustomizeTableInfoResponse info, List table) { + public CustomizeTableResponse( + CustomizeTable customizeTable, + CustomizeTimeBoxes customizeTimeBoxes + ) { + this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), + toTimeBoxResponses(customizeTimeBoxes)); + } + public CustomizeTableResponse( CustomizeTable customizeTable, List timeBoxResponses ) { this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), timeBoxResponses); } + + private static List toTimeBoxResponses(CustomizeTimeBoxes timeBoxes) { + List customizeTimeBoxes = timeBoxes.getTimeBoxes(); + return customizeTimeBoxes + .stream() + .map(CustomizeTimeBoxResponse::new) + .toList(); + } } diff --git a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java index 8cde396a..e62f17fb 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTimeBoxResponse.java @@ -16,6 +16,19 @@ public record CustomizeTimeBoxResponse( String speaker ) { + public CustomizeTimeBoxResponse(CustomizeTimeBox customizeTimeBox) { + this( + customizeTimeBox.getStance(), + customizeTimeBox.getSpeechType(), + customizeTimeBox.getBoxType(), + convertTime(customizeTimeBox), + null, + customizeTimeBox.getTimePerTeam(), + customizeTimeBox.getTimePerSpeaking(), + customizeTimeBox.getSpeaker() + ); + } + public CustomizeTimeBoxResponse(CustomizeTimeBox customizeTimeBox, List bell) { this( customizeTimeBox.getStance(), diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index fb06e4e7..840a60b0 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -3,24 +3,14 @@ import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBoxes; import com.debatetimer.domain.member.Member; -import com.debatetimer.dto.customize.request.BellRequest; import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; -import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; -import com.debatetimer.dto.customize.response.BellResponse; import com.debatetimer.dto.customize.response.CustomizeTableResponse; -import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; -import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.entity.customize.CustomizeTimeBox; import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; -import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,18 +21,14 @@ public class CustomizeService { private final CustomizeTableRepository tableRepository; private final CustomizeTimeBoxRepository timeBoxRepository; - private final BellRepository bellRepository; @Transactional public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateRequest, Member member) { CustomizeTable table = tableCreateRequest.toTable(member); CustomizeTableEntity savedTable = tableRepository.save(new CustomizeTableEntity(table)); - CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxesAndBells(tableCreateRequest, savedTable.toDomain()); - - // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 - saveBell(savedTable, savedCustomizeTimeBoxes); - return getCustomizeTableResponse(savedTable, savedCustomizeTimeBoxes); + CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, savedTable.toDomain()); + return new CustomizeTableResponse(savedTable.toDomain(), savedCustomizeTimeBoxes); } @Transactional(readOnly = true) @@ -50,8 +36,7 @@ public CustomizeTableResponse findTable(long tableId, Member member) { CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); - - return getCustomizeTableResponse(tableEntity, timeBoxes); + return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxes); } @Transactional @@ -64,12 +49,9 @@ public CustomizeTableResponse updateTable( CustomizeTable renewedTable = tableCreateRequest.toTable(member); existingTable.updateTable(renewedTable); - deleteBell(timeBoxRepository.findTableTimeBoxes(existingTable)); timeBoxRepository.deleteAllByTable(existingTable); - CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxesAndBells(tableCreateRequest, existingTable.toDomain()); - - saveBell(existingTable, savedCustomizeTimeBoxes); - return getCustomizeTableResponse(existingTable, savedCustomizeTimeBoxes); + CustomizeTimeBoxes savedCustomizeTimeBoxes = saveTimeBoxes(tableCreateRequest, existingTable.toDomain()); + return new CustomizeTableResponse(existingTable.toDomain(), savedCustomizeTimeBoxes); } @Transactional @@ -79,114 +61,24 @@ public CustomizeTableResponse updateUsedAt(long tableId, Member member) { CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); tableEntity.updateUsedAt(); - return getCustomizeTableResponse(tableEntity, timeBoxes); + return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxes); } @Transactional public void deleteTable(long tableId, Member member) { CustomizeTableEntity table = tableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); - - deleteBell(timeBoxRepository.findTableTimeBoxes(table)); - timeBoxRepository.deleteAllByTable(table); tableRepository.delete(table); - } - private CustomizeTimeBoxes saveTimeBoxesAndBells( + private CustomizeTimeBoxes saveTimeBoxes( CustomizeTableCreateRequest tableCreateRequest, CustomizeTable table ) { - // TODO : 밑에 부분은 프론트 업데이트 후 주석 풀기 - /* - List timeBoxCreateRequests = tableCreateRequest.table(); - List timeBoxResponses = IntStream.range(0, timeBoxCreateRequests.size()) - .mapToObj(i -> createTimeBoxResponse(timeBoxCreateRequests.get(i), table, i + 1)) - .toList(); - new CustomizeTableResponse(table, timeBoxResponses); - */ - - // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 CustomizeTimeBoxes customizeTimeBoxes = tableCreateRequest.toTimeBoxes(table); - List savedTimeBoxes = timeBoxRepository.saveAll( + List savedTimeBoxes = timeBoxRepository.saveAll( customizeTimeBoxes.getTimeBoxes()); return new CustomizeTimeBoxes(savedTimeBoxes); } - - private CustomizeTimeBoxResponse createTimeBoxResponse( - CustomizeTimeBoxCreateRequest request, - CustomizeTable table, - int sequence - ) { - CustomizeTimeBox savedTimeBox = timeBoxRepository.save(request.toTimeBox(table, sequence)); - List bellResponses = createBellResponses(request.bell(), savedTimeBox); - return new CustomizeTimeBoxResponse(savedTimeBox, bellResponses); - } - - private List createBellResponses(List bellRequests, CustomizeTimeBox savedTimeBox) { - return Optional.ofNullable(bellRequests) - .orElse(Collections.emptyList()) - .stream() - .map(bellRequest -> new BellEntity(savedTimeBox, bellRequest.time(), bellRequest.count())) - .map(bellRepository::save) - .map(bell -> new BellResponse(bell.getTime(), bell.getCount())) - .toList(); - } - - // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 - private CustomizeTableResponse getCustomizeTableResponse( - CustomizeTableEntity savedTable, - CustomizeTimeBoxes savedCustomizeTimeBoxes - ) { - List customizeTimeBoxResponses = savedCustomizeTimeBoxes.getTimeBoxes() - .stream() - .map(timeBox -> { - List bell = null; - if (timeBox.getBoxType().isNotTimeBased() && (savedTable.isFinishBell() || savedTable.isWarningBell())) { - bell = new ArrayList<>(); - if (savedTable.isWarningBell()) { - bell.add(new BellResponse(timeBox.getTime() - 30, 1)); - } - if (savedTable.isFinishBell()) { - bell.add(new BellResponse(timeBox.getTime(), 2)); - } - } - return new CustomizeTimeBoxResponse( - timeBox, - bell - ); - }) - .toList(); - return new CustomizeTableResponse(savedTable.toDomain(), customizeTimeBoxResponses); - } - - // TODO : 밑에 부분은 프론트 업데이트 후 삭제 예정 - private void saveBell(CustomizeTableEntity savedTable, CustomizeTimeBoxes savedCustomizeTimeBoxes) { - if (savedTable.isFinishBell()) { - savedCustomizeTimeBoxes.getTimeBoxes() - .stream() - .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) - .forEach(timeBox -> bellRepository.save(new BellEntity( - timeBox, - timeBox.getTime(), - 2 - ))); - } - if (savedTable.isWarningBell()) { - savedCustomizeTimeBoxes.getTimeBoxes() - .stream() - .filter(timeBox -> timeBox.getBoxType().isNotTimeBased()) - .filter(timeBox -> timeBox.getTime() >= 30) - .forEach(timeBox -> bellRepository.save(new BellEntity( - timeBox, - timeBox.getTime() - 30, - 1 - ))); - } - } - - private void deleteBell(CustomizeTimeBoxes savedCustomizeTimeBoxes) { - bellRepository.deleteAllByCustomizeTimeBoxIn(savedCustomizeTimeBoxes.getTimeBoxes()); - } } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java new file mode 100644 index 00000000..f2a97006 --- /dev/null +++ b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java @@ -0,0 +1,141 @@ +package com.debatetimer.service.customize; + +import com.debatetimer.domain.customize.CustomizeTable; +import com.debatetimer.domain.customize.CustomizeTimeBoxes; +import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.request.BellRequest; +import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; +import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; +import com.debatetimer.dto.customize.response.BellResponse; +import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; +import com.debatetimer.entity.customize.BellEntity; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.customize.CustomizeTimeBox; +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.repository.customize.BellRepository; +import com.debatetimer.repository.customize.CustomizeTableRepository; +import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; +import java.util.List; +import java.util.stream.IntStream; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CustomizeServiceV2 { + + private final CustomizeTableRepository tableRepository; + private final CustomizeTimeBoxRepository timeBoxRepository; + private final BellRepository bellRepository; + + @Transactional + public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateRequest, Member member) { + CustomizeTable table = tableCreateRequest.toTable(member); + CustomizeTableEntity savedTable = tableRepository.save(new CustomizeTableEntity(table)); + + return saveTimeBoxesAndBells(tableCreateRequest, savedTable.toDomain()); + } + + @Transactional(readOnly = true) + public CustomizeTableResponse findTable(long tableId, Member member) { + CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); + List timeBoxResponses = timeBoxes.getTimeBoxes() + .stream() + .map(this::getTimeBoxResponse) + .toList(); + return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxResponses); + } + + @Transactional + public CustomizeTableResponse updateTable( + CustomizeTableCreateRequest tableCreateRequest, + long tableId, + Member member + ) { + CustomizeTableEntity existingTable = tableRepository.getByIdAndMember(tableId, member); + CustomizeTable renewedTable = tableCreateRequest.toTable(member); + existingTable.updateTable(renewedTable); + + deleteBell(timeBoxRepository.findTableTimeBoxes(existingTable)); + timeBoxRepository.deleteAllByTable(existingTable); + return saveTimeBoxesAndBells(tableCreateRequest, existingTable.toDomain()); + } + + @Transactional + public CustomizeTableResponse updateUsedAt(long tableId, Member member) { + CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); + tableEntity.updateUsedAt(); + List timeBoxResponses = timeBoxes.getTimeBoxes() + .stream() + .map(this::getTimeBoxResponse) + .toList(); + return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxResponses); + } + + @Transactional + public void deleteTable(long tableId, Member member) { + CustomizeTableEntity table = tableRepository.findByIdAndMember(tableId, member) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + + deleteBell(timeBoxRepository.findTableTimeBoxes(table)); + timeBoxRepository.deleteAllByTable(table); + tableRepository.delete(table); + } + + private CustomizeTableResponse saveTimeBoxesAndBells( + CustomizeTableCreateRequest tableCreateRequest, + CustomizeTable table + ) { + List timeBoxCreateRequests = tableCreateRequest.table(); + List timeBoxResponses = IntStream.range(0, timeBoxCreateRequests.size()) + .mapToObj(i -> createTimeBoxResponse(timeBoxCreateRequests.get(i), table, i + 1)) + .toList(); + return new CustomizeTableResponse(table, timeBoxResponses); + } + + private CustomizeTimeBoxResponse createTimeBoxResponse( + CustomizeTimeBoxCreateRequest request, + CustomizeTable table, + int sequence + ) { + CustomizeTimeBox savedTimeBox = timeBoxRepository.save(request.toTimeBox(table, sequence)); + return createTimeBoxResponse(request.bell(), savedTimeBox); + } + + private CustomizeTimeBoxResponse createTimeBoxResponse(List bellRequests, CustomizeTimeBox timeBox) { + if (timeBox.getBoxType().isTimeBased()) { + return new CustomizeTimeBoxResponse(timeBox, null); + } + + List bellResponses = bellRequests + .stream() + .map(bellRequest -> new BellEntity(timeBox, bellRequest.time(), bellRequest.count())) + .map(bellRepository::save) + .map(bell -> new BellResponse(bell.getTime(), bell.getCount())) + .toList(); + return new CustomizeTimeBoxResponse(timeBox, bellResponses); + } + + private CustomizeTimeBoxResponse getTimeBoxResponse(CustomizeTimeBox timeBox) { + if (timeBox.getBoxType().isTimeBased()) { + return new CustomizeTimeBoxResponse(timeBox, null); + } + + List bellResponses = bellRepository.findByCustomizeTimeBox(timeBox) + .stream() + .map(bell -> new BellResponse(bell.getTime(), bell.getCount())) + .toList(); + return new CustomizeTimeBoxResponse(timeBox, bellResponses); + } + + private void deleteBell(CustomizeTimeBoxes savedCustomizeTimeBoxes) { + bellRepository.deleteAllByCustomizeTimeBoxIn(savedCustomizeTimeBoxes.getTimeBoxes()); + } +} diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index f7776cb4..e511dfc9 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -54,12 +54,7 @@ class Save { assertAll( () -> assertThat(foundTable.get().getName()).isEqualTo(customizeTableCreateRequest.info().name()), - () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()), - () -> { - for (CustomizeTimeBox timeBox : foundTimeBoxes) { - assertThat(bellRepository.findByCustomizeTimeBox(timeBox)).hasSize(2); - } - } + () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()) ); } } @@ -122,12 +117,7 @@ class UpdateTable { assertAll( () -> assertThat(updatedTable.get().getId()).isEqualTo(chanTable.getId()), () -> assertThat(updatedTable.get().getName()).isEqualTo(renewTableRequest.info().name()), - () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()), - () -> { - for (CustomizeTimeBox timeBox : updatedTimeBoxes) { - assertThat(bellRepository.findByCustomizeTimeBox(timeBox)).hasSize(2); - } - } + () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()) ); } @@ -222,12 +212,8 @@ class DeleteTable { void 사용자_지정_토론_테이블을_삭제한다() { Member chan = memberGenerator.generate("default@gmail.com"); CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); - CustomizeTimeBox timeBox1 = customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 1); - CustomizeTimeBox timeBox2 = customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, - 2); - bellGenerator.generate(timeBox1, 30, 1); - bellGenerator.generate(timeBox1, 45, 1); - bellGenerator.generate(timeBox2, 60, 2); + customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 1); + customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 2); customizeService.deleteTable(chanTable.getId(), chan); From fc8639adbd5e6d9db94b28164d52c2ed010e78dd Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Sat, 12 Jul 2025 17:25:00 +0900 Subject: [PATCH 11/15] =?UTF-8?q?rename:=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/repository/customize/BellRepository.java | 4 ---- .../{V9__add_bell_table.sql => V10__add_bell_table.sql} | 0 2 files changed, 4 deletions(-) rename src/main/resources/db/migration/{V9__add_bell_table.sql => V10__add_bell_table.sql} (100%) diff --git a/src/main/java/com/debatetimer/repository/customize/BellRepository.java b/src/main/java/com/debatetimer/repository/customize/BellRepository.java index 52cac86f..78569835 100644 --- a/src/main/java/com/debatetimer/repository/customize/BellRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/BellRepository.java @@ -11,11 +11,7 @@ public interface BellRepository extends Repository { List findByCustomizeTimeBox(CustomizeTimeBox customizeTimeBox); - void delete(BellEntity bell); - void deleteAllByCustomizeTimeBoxIn(List customizeTimeBoxes); List findAllByCustomizeTimeBoxIn(List timeBoxes); - - List findAll(); } diff --git a/src/main/resources/db/migration/V9__add_bell_table.sql b/src/main/resources/db/migration/V10__add_bell_table.sql similarity index 100% rename from src/main/resources/db/migration/V9__add_bell_table.sql rename to src/main/resources/db/migration/V10__add_bell_table.sql From e56455e26f4463389bf6db99e3f33da87789ec10 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Sat, 12 Jul 2025 17:34:28 +0900 Subject: [PATCH 12/15] test: CustomizeServiceV2Test --- .../customize/CustomizeServiceTest.java | 5 +- .../customize/CustomizeServiceV2Test.java | 253 ++++++++++++++++++ 2 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index e511dfc9..7ab75fe6 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -12,7 +12,6 @@ import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; import com.debatetimer.dto.customize.response.CustomizeTableResponse; -import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; import com.debatetimer.exception.custom.DTClientErrorException; @@ -220,12 +219,10 @@ class DeleteTable { Optional foundTable = customizeTableRepository.findById(chanTable.getId()); List timeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( chanTable); - List bells = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxes); assertAll( () -> assertThat(foundTable).isEmpty(), - () -> assertThat(timeBoxes).isEmpty(), - () -> assertThat(bells).isEmpty() + () -> assertThat(timeBoxes).isEmpty() ); } diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java new file mode 100644 index 00000000..e685bb9e --- /dev/null +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java @@ -0,0 +1,253 @@ +package com.debatetimer.service.customize; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.domain.customize.CustomizeBoxType; +import com.debatetimer.domain.customize.Stance; +import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.request.BellRequest; +import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; +import com.debatetimer.dto.customize.request.CustomizeTableInfoCreateRequest; +import com.debatetimer.dto.customize.request.CustomizeTimeBoxCreateRequest; +import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.entity.customize.BellEntity; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.customize.CustomizeTimeBox; +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.service.BaseServiceTest; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class CustomizeServiceV2Test extends BaseServiceTest { + + @Autowired + private CustomizeServiceV2 customizeService; + + @Nested + class Save { + + @Test + void 사용자_지정_토론_테이블을_생성한다() { + Member chan = memberGenerator.generate("default@gmail.com"); + CustomizeTableCreateRequest customizeTableCreateRequest = new CustomizeTableCreateRequest( + new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", + "반대", true, true), + List.of( + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") + ) + ); + + CustomizeTableResponse savedTableResponse = customizeService.save(customizeTableCreateRequest, chan); + Optional foundTable = customizeTableRepository.findById(savedTableResponse.id()); + List foundTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( + foundTable.get()); + List foundBells = bellRepository.findAllByCustomizeTimeBoxIn(foundTimeBoxes); + + assertAll( + () -> assertThat(foundTable.get().getName()).isEqualTo(customizeTableCreateRequest.info().name()), + () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()), + () -> assertThat(foundBells).hasSize(3) + ); + } + } + + @Nested + class FindTable { + + @Test + void 사용자_지정_토론_테이블을_조회한다() { + Member chan = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + CustomizeTimeBox customizeTimeBox = customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, + 1); + customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 2); + bellGenerator.generate(customizeTimeBox, 1, 1); + bellGenerator.generate(customizeTimeBox, 1, 2); + + CustomizeTableResponse foundResponse = customizeService.findTable(chanTable.getId(), chan); + + assertAll( + () -> assertThat(foundResponse.id()).isEqualTo(chanTable.getId()), + () -> assertThat(foundResponse.table()).hasSize(2), + () -> assertThat(foundResponse.table().get(0).bell()).hasSize(2), + () -> assertThat(foundResponse.table().get(1).bell()).hasSize(0) + ); + } + + @Test + void 회원_소유가_아닌_테이블_조회_시_예외를_발생시킨다() { + Member chan = memberGenerator.generate("default@gmail.com"); + Member coli = memberGenerator.generate("default2@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + long chanTableId = chanTable.getId(); + + assertThatThrownBy(() -> customizeService.findTable(chanTableId, coli)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); + } + } + + @Nested + class UpdateTable { + + @Test + void 사용자_지정_토론_테이블을_수정한다() { + Member chan = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + CustomizeTableCreateRequest renewTableRequest = new CustomizeTableCreateRequest( + new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", + "반대", true, true), + List.of( + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") + ) + ); + + customizeService.updateTable(renewTableRequest, chanTable.getId(), chan); + + Optional updatedTable = customizeTableRepository.findById(chanTable.getId()); + List updatedTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( + updatedTable.get()); + List bells = bellRepository.findAllByCustomizeTimeBoxIn(updatedTimeBoxes); + + assertAll( + () -> assertThat(updatedTable.get().getId()).isEqualTo(chanTable.getId()), + () -> assertThat(updatedTable.get().getName()).isEqualTo(renewTableRequest.info().name()), + () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()), + () -> assertThat(bells).hasSize(3) + ); + } + + @Test + void 회원_소유가_아닌_테이블_수정_시_예외를_발생시킨다() { + Member chan = memberGenerator.generate("default@gmail.com"); + Member coli = memberGenerator.generate("default2@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + long chanTableId = chanTable.getId(); + CustomizeTableCreateRequest renewTableRequest = new CustomizeTableCreateRequest( + new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", + "반대", true, true), + List.of( + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") + ) + ); + + assertThatThrownBy(() -> customizeService.updateTable(renewTableRequest, chanTableId, coli)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); + } + + @Test + void 테이블_정보_수정을_동시에_요청할_때_동시에_처리하지_않는다() throws InterruptedException { + Member member = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + CustomizeTableCreateRequest request = new CustomizeTableCreateRequest( + new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", + "반대", true, true), + List.of( + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") + ) + ); + + runAtSameTime(2, () -> customizeService.updateTable(request, table.getId(), member)); + + assertThat(customizeTimeBoxRepository.findAllByCustomizeTable(table)).hasSize(2); + } + } + + @Nested + class UpdateUsedAt { + + @Test + void 사용자_지정_토론_테이블의_사용_시각을_최신화한다() { + Member member = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + LocalDateTime beforeUsedAt = table.getUsedAt(); + + customizeService.updateUsedAt(table.getId(), member); + + Optional updatedTable = customizeTableRepository.findById(table.getId()); + assertAll( + () -> assertThat(updatedTable.get().getId()).isEqualTo(table.getId()), + () -> assertThat(updatedTable.get().getUsedAt()).isAfter(beforeUsedAt) + ); + } + + @Test + void 회원_소유가_아닌_테이블_수정_시_예외를_발생시킨다() { + Member chan = memberGenerator.generate("default@gmail.com"); + Member coli = memberGenerator.generate("default2@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + long chanTableId = chanTable.getId(); + CustomizeTableCreateRequest renewTableRequest = new CustomizeTableCreateRequest( + new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", + "반대", true, true), + List.of( + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), + new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, + 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") + ) + ); + + assertThatThrownBy(() -> customizeService.updateTable(renewTableRequest, chanTableId, coli)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); + } + } + + @Nested + class DeleteTable { + + @Test + void 사용자_지정_토론_테이블을_삭제한다() { + Member chan = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 1); + customizeTimeBoxGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 2); + + customizeService.deleteTable(chanTable.getId(), chan); + + Optional foundTable = customizeTableRepository.findById(chanTable.getId()); + List timeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( + chanTable); + List bells = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxes); + + assertAll( + () -> assertThat(foundTable).isEmpty(), + () -> assertThat(timeBoxes).isEmpty(), + () -> assertThat(bells).isEmpty() + ); + } + + @Test + void 회원_소유가_아닌_테이블_삭제_시_예외를_발생시킨다() { + Member chan = memberGenerator.generate("default@gmail.com"); + Member coli = memberGenerator.generate("default2@gmail.com"); + CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); + long chanTableId = chanTable.getId(); + + assertThatThrownBy(() -> customizeService.deleteTable(chanTableId, coli)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); + } + } +} From 0626b310ab9833ebc0e40aeeaa6fb3667ec81d93 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Mon, 14 Jul 2025 19:42:43 +0900 Subject: [PATCH 13/15] =?UTF-8?q?test:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customize/CustomizeServiceTest.java | 34 ++++++------------- .../customize/CustomizeServiceV2Test.java | 34 ++++++------------- 2 files changed, 22 insertions(+), 46 deletions(-) diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index 7ab75fe6..0223170a 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -47,12 +47,11 @@ class Save { ); CustomizeTableResponse savedTableResponse = customizeService.save(customizeTableCreateRequest, chan); - Optional foundTable = customizeTableRepository.findById(savedTableResponse.id()); - List foundTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( - foundTable.get()); + CustomizeTableEntity foundTable = customizeTableRepository.getByIdAndMember(savedTableResponse.id(), chan); + List foundTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable(foundTable); assertAll( - () -> assertThat(foundTable.get().getName()).isEqualTo(customizeTableCreateRequest.info().name()), + () -> assertThat(foundTable.getName()).isEqualTo(customizeTableCreateRequest.info().name()), () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()) ); } @@ -109,13 +108,12 @@ class UpdateTable { customizeService.updateTable(renewTableRequest, chanTable.getId(), chan); - Optional updatedTable = customizeTableRepository.findById(chanTable.getId()); - List updatedTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( - updatedTable.get()); + CustomizeTableEntity updatedTable = customizeTableRepository.getByIdAndMember(chanTable.getId(), chan); + List updatedTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable(updatedTable); assertAll( - () -> assertThat(updatedTable.get().getId()).isEqualTo(chanTable.getId()), - () -> assertThat(updatedTable.get().getName()).isEqualTo(renewTableRequest.info().name()), + () -> assertThat(updatedTable.getId()).isEqualTo(chanTable.getId()), + () -> assertThat(updatedTable.getName()).isEqualTo(renewTableRequest.info().name()), () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()) ); } @@ -174,10 +172,10 @@ class UpdateUsedAt { customizeService.updateUsedAt(table.getId(), member); - Optional updatedTable = customizeTableRepository.findById(table.getId()); + CustomizeTableEntity updatedTable = customizeTableRepository.getByIdAndMember(table.getId(), member); assertAll( - () -> assertThat(updatedTable.get().getId()).isEqualTo(table.getId()), - () -> assertThat(updatedTable.get().getUsedAt()).isAfter(beforeUsedAt) + () -> assertThat(updatedTable.getId()).isEqualTo(table.getId()), + () -> assertThat(updatedTable.getUsedAt()).isAfter(beforeUsedAt) ); } @@ -187,18 +185,8 @@ class UpdateUsedAt { Member coli = memberGenerator.generate("default2@gmail.com"); CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); long chanTableId = chanTable.getId(); - CustomizeTableCreateRequest renewTableRequest = new CustomizeTableCreateRequest( - new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", - "반대", true, true), - List.of( - new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), - new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") - ) - ); - assertThatThrownBy(() -> customizeService.updateTable(renewTableRequest, chanTableId, coli)) + assertThatThrownBy(() -> customizeService.updateUsedAt(chanTableId, coli)) .isInstanceOf(DTClientErrorException.class) .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); } diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java index e685bb9e..50811628 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceV2Test.java @@ -48,13 +48,12 @@ class Save { ); CustomizeTableResponse savedTableResponse = customizeService.save(customizeTableCreateRequest, chan); - Optional foundTable = customizeTableRepository.findById(savedTableResponse.id()); - List foundTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( - foundTable.get()); + CustomizeTableEntity foundTable = customizeTableRepository.getByIdAndMember(savedTableResponse.id(), chan); + List foundTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable(foundTable); List foundBells = bellRepository.findAllByCustomizeTimeBoxIn(foundTimeBoxes); assertAll( - () -> assertThat(foundTable.get().getName()).isEqualTo(customizeTableCreateRequest.info().name()), + () -> assertThat(foundTable.getName()).isEqualTo(customizeTableCreateRequest.info().name()), () -> assertThat(foundTimeBoxes).hasSize(customizeTableCreateRequest.table().size()), () -> assertThat(foundBells).hasSize(3) ); @@ -117,14 +116,13 @@ class UpdateTable { customizeService.updateTable(renewTableRequest, chanTable.getId(), chan); - Optional updatedTable = customizeTableRepository.findById(chanTable.getId()); - List updatedTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable( - updatedTable.get()); + CustomizeTableEntity updatedTable = customizeTableRepository.getByIdAndMember(chanTable.getId(), chan); + List updatedTimeBoxes = customizeTimeBoxRepository.findAllByCustomizeTable(updatedTable); List bells = bellRepository.findAllByCustomizeTimeBoxIn(updatedTimeBoxes); assertAll( - () -> assertThat(updatedTable.get().getId()).isEqualTo(chanTable.getId()), - () -> assertThat(updatedTable.get().getName()).isEqualTo(renewTableRequest.info().name()), + () -> assertThat(updatedTable.getId()).isEqualTo(chanTable.getId()), + () -> assertThat(updatedTable.getName()).isEqualTo(renewTableRequest.info().name()), () -> assertThat(updatedTimeBoxes).hasSize(renewTableRequest.table().size()), () -> assertThat(bells).hasSize(3) ); @@ -184,10 +182,10 @@ class UpdateUsedAt { customizeService.updateUsedAt(table.getId(), member); - Optional updatedTable = customizeTableRepository.findById(table.getId()); + CustomizeTableEntity updatedTable = customizeTableRepository.getByIdAndMember(table.getId(), member); assertAll( - () -> assertThat(updatedTable.get().getId()).isEqualTo(table.getId()), - () -> assertThat(updatedTable.get().getUsedAt()).isAfter(beforeUsedAt) + () -> assertThat(updatedTable.getId()).isEqualTo(table.getId()), + () -> assertThat(updatedTable.getUsedAt()).isAfter(beforeUsedAt) ); } @@ -197,18 +195,8 @@ class UpdateUsedAt { Member coli = memberGenerator.generate("default2@gmail.com"); CustomizeTableEntity chanTable = customizeTableGenerator.generate(chan); long chanTableId = chanTable.getId(); - CustomizeTableCreateRequest renewTableRequest = new CustomizeTableCreateRequest( - new CustomizeTableInfoCreateRequest("자유 테이블", "주제", "찬성", - "반대", true, true), - List.of( - new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론1", CustomizeBoxType.NORMAL, - 120, List.of(new BellRequest(90, 1)), 60, null, "발언자1"), - new CustomizeTimeBoxCreateRequest(Stance.PROS, "입론2", CustomizeBoxType.NORMAL, - 120, List.of(new BellRequest(90, 1), new BellRequest(120, 2)), 60, null, "발언자2") - ) - ); - assertThatThrownBy(() -> customizeService.updateTable(renewTableRequest, chanTableId, coli)) + assertThatThrownBy(() -> customizeService.updateUsedAt(chanTableId, coli)) .isInstanceOf(DTClientErrorException.class) .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); } From 96a2609607cc74b95a82c8a59c9a249e3183309c Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Wed, 16 Jul 2025 10:56:19 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor:=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/service/customize/CustomizeService.java | 3 +-- .../com/debatetimer/service/customize/CustomizeServiceV2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index 840a60b0..b5faa374 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -33,8 +33,7 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques @Transactional(readOnly = true) public CustomizeTableResponse findTable(long tableId, Member member) { - CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); return new CustomizeTableResponse(tableEntity.toDomain(), timeBoxes); } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java index f2a97006..64a6134d 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java @@ -41,8 +41,7 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques @Transactional(readOnly = true) public CustomizeTableResponse findTable(long tableId, Member member) { - CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); List timeBoxResponses = timeBoxes.getTimeBoxes() .stream() From 507e39f94dc1408ba5fed1ed99201c56b5d393a0 Mon Sep 17 00:00:00 2001 From: unifolio0 Date: Wed, 16 Jul 2025 11:01:22 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor:=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../debatetimer/service/customize/CustomizeService.java | 8 ++------ .../debatetimer/service/customize/CustomizeServiceV2.java | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index b5faa374..7281a77a 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -6,8 +6,6 @@ import com.debatetimer.dto.customize.request.CustomizeTableCreateRequest; import com.debatetimer.dto.customize.response.CustomizeTableResponse; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.exception.custom.DTClientErrorException; -import com.debatetimer.exception.errorcode.ClientErrorCode; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; import java.util.List; @@ -55,8 +53,7 @@ public CustomizeTableResponse updateTable( @Transactional public CustomizeTableResponse updateUsedAt(long tableId, Member member) { - CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); tableEntity.updateUsedAt(); @@ -65,8 +62,7 @@ public CustomizeTableResponse updateUsedAt(long tableId, Member member) { @Transactional public void deleteTable(long tableId, Member member) { - CustomizeTableEntity table = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity table = tableRepository.getByIdAndMember(tableId, member); timeBoxRepository.deleteAllByTable(table); tableRepository.delete(table); } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java index 64a6134d..423948a7 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeServiceV2.java @@ -12,8 +12,6 @@ import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.customize.CustomizeTimeBox; -import com.debatetimer.exception.custom.DTClientErrorException; -import com.debatetimer.exception.errorcode.ClientErrorCode; import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; @@ -67,8 +65,7 @@ public CustomizeTableResponse updateTable( @Transactional public CustomizeTableResponse updateUsedAt(long tableId, Member member) { - CustomizeTableEntity tableEntity = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); CustomizeTimeBoxes timeBoxes = timeBoxRepository.findTableTimeBoxes(tableEntity); tableEntity.updateUsedAt(); List timeBoxResponses = timeBoxes.getTimeBoxes() @@ -80,8 +77,7 @@ public CustomizeTableResponse updateUsedAt(long tableId, Member member) { @Transactional public void deleteTable(long tableId, Member member) { - CustomizeTableEntity table = tableRepository.findByIdAndMember(tableId, member) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + CustomizeTableEntity table = tableRepository.getByIdAndMember(tableId, member); deleteBell(timeBoxRepository.findTableTimeBoxes(table)); timeBoxRepository.deleteAllByTable(table);