From 3e2c5b07a54a6efe24081e0d20fb6e93656f0981 Mon Sep 17 00:00:00 2001 From: kunsanglee <85242378+kunsanglee@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:30:29 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=96=89=EC=82=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20API=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B0=8F=20DTO=20=EA=B2=80=EC=A6=9D=20=EC=95=A0?= =?UTF-8?q?=EB=84=88=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80=20(#1?= =?UTF-8?q?03)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 행사 생성 API 예외 메세지 추가 및 DTO 검증 애너테이션 추가 * refactor: 행사 생성 API EventSaveRequest name을 eventName으로 변경 * refactor: 행사 생성 요청 객체 검증 애너테이션 @Size 제거 * refactor: 연속된 공백 검증 및 예외 메세지 상수 사용하도록 리팩터링 --- .../server/haengdong/domain/event/Event.java | 26 +++++++++++++ .../presentation/EventController.java | 3 +- .../request/EventSaveRequest.java | 9 ++++- .../haengdong/domain/event/EventTest.java | 37 +++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 server/src/test/java/server/haengdong/domain/event/EventTest.java diff --git a/server/src/main/java/server/haengdong/domain/event/Event.java b/server/src/main/java/server/haengdong/domain/event/Event.java index c6877e1a6..24369a184 100644 --- a/server/src/main/java/server/haengdong/domain/event/Event.java +++ b/server/src/main/java/server/haengdong/domain/event/Event.java @@ -7,12 +7,18 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import server.haengdong.exception.HaengdongErrorCode; +import server.haengdong.exception.HaengdongException; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Event { + private static final int MIN_NAME_LENGTH = 2; + private static final int MAX_NAME_LENGTH = 20; + private static final String SPACES = " "; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -22,7 +28,27 @@ public class Event { private String token; public Event(String name, String token) { + validateName(name); this.name = name; this.token = token; } + + private void validateName(String name) { + int nameLength = name.length(); + if (nameLength < MIN_NAME_LENGTH || MAX_NAME_LENGTH < nameLength) { + throw new HaengdongException(HaengdongErrorCode.BAD_REQUEST, + String.format("행사 이름은 %d자 이상 %d자 이하만 입력 가능합니다. 입력한 이름 길이 : %d", + MIN_NAME_LENGTH, + MAX_NAME_LENGTH, + name.length())); + } + if (isBlankContinuous(name)) { + throw new HaengdongException(HaengdongErrorCode.BAD_REQUEST, + String.format("행사 이름에는 공백 문자가 연속될 수 없습니다. 입력한 이름 : %s", name)); + } + } + + private boolean isBlankContinuous(String name) { + return name.contains(SPACES); + } } diff --git a/server/src/main/java/server/haengdong/presentation/EventController.java b/server/src/main/java/server/haengdong/presentation/EventController.java index 263bc35aa..260253e8b 100644 --- a/server/src/main/java/server/haengdong/presentation/EventController.java +++ b/server/src/main/java/server/haengdong/presentation/EventController.java @@ -1,5 +1,6 @@ package server.haengdong.presentation; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -19,7 +20,7 @@ public class EventController { private final EventService eventService; @PostMapping("/api/events") - public ResponseEntity saveEvent(@RequestBody EventSaveRequest request) { + public ResponseEntity saveEvent(@Valid @RequestBody EventSaveRequest request) { EventResponse eventResponse = EventResponse.of(eventService.saveEvent(request.toAppRequest())); return ResponseEntity.ok(eventResponse); diff --git a/server/src/main/java/server/haengdong/presentation/request/EventSaveRequest.java b/server/src/main/java/server/haengdong/presentation/request/EventSaveRequest.java index 8bd4cfda8..b28572332 100644 --- a/server/src/main/java/server/haengdong/presentation/request/EventSaveRequest.java +++ b/server/src/main/java/server/haengdong/presentation/request/EventSaveRequest.java @@ -1,10 +1,15 @@ package server.haengdong.presentation.request; +import jakarta.validation.constraints.NotBlank; import server.haengdong.application.request.EventAppRequest; -public record EventSaveRequest(String name) { +public record EventSaveRequest( + + @NotBlank + String eventName +) { public EventAppRequest toAppRequest() { - return new EventAppRequest(name); + return new EventAppRequest(eventName); } } diff --git a/server/src/test/java/server/haengdong/domain/event/EventTest.java b/server/src/test/java/server/haengdong/domain/event/EventTest.java new file mode 100644 index 000000000..98f6c7050 --- /dev/null +++ b/server/src/test/java/server/haengdong/domain/event/EventTest.java @@ -0,0 +1,37 @@ +package server.haengdong.domain.event; + +import static org.assertj.core.api.Assertions.assertThatCode; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import server.haengdong.exception.HaengdongException; + +class EventTest { + + @DisplayName("공백 문자가 연속되지 않고, 이름이 2자 이상 20자 이하인 행사를 생성하면 예외가 발생하지 않는다.") + @ParameterizedTest + @ValueSource(strings = {"12", "12345678901234567890", "공 백", " 공백", "공백 ", " 공 백 "}) + void createSuccessTest(String eventName) { + assertThatCode(() -> new Event(eventName, "TEST_TOKEN")) + .doesNotThrowAnyException(); + } + + @DisplayName("공백 문자가 연속되면 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {" 공백", "공백 ", "공백 연속", "공 백"}) + void createFailTest1(String eventName) { + assertThatCode(() -> new Event(eventName, "TEST_TOKEN")) + .isInstanceOf(HaengdongException.class) + .hasMessage(String.format("행사 이름에는 공백 문자가 연속될 수 없습니다. 입력한 이름 : %s", eventName)); + } + + @DisplayName("이름이 2자 미만이거나 20자 초과인 경우 예외가 발생한다.") + @ParameterizedTest + @ValueSource(strings = {"", " ", "123456789012345678901"}) + void createFilTest2(String eventName) { + assertThatCode(() -> new Event(eventName, "TEST_TOKEN")) + .isInstanceOf(HaengdongException.class) + .hasMessage(String.format("행사 이름은 2자 이상 20자 이하만 입력 가능합니다. 입력한 이름 길이 : %d", eventName.length())); + } +}