From f2d9a90c4cfeb36bd0f583e5c7addf4617a7749a Mon Sep 17 00:00:00 2001 From: alschlee <1daysixmeal@gmail.com> Date: Fri, 1 Aug 2025 19:08:41 +0900 Subject: [PATCH] =?UTF-8?q?[REFACTOR]=20=EC=BA=98=EB=A6=B0=EB=8D=94,=20?= =?UTF-8?q?=EC=9D=BC=EC=A0=95=20=EA=B4=80=EB=A0=A8=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95:=20color=20code=20#83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/GetDayEventResponseDto.java | 4 +- .../GetMonthlyCalendarResponseDto.java | 6 +- .../service/CalendarQueryServiceImpl.java | 9 ++- .../event/converter/EventConverter.java | 67 +++++++------------ .../dto/request/CreateEventRequestDto.java | 7 +- .../dto/request/UpdateEventRequestDto.java | 7 +- .../dto/response/UpdateEventResponseDto.java | 6 +- .../server/domain/event/entity/Event.java | 8 +-- .../global/api/code/status/ErrorStatus.java | 1 - 9 files changed, 49 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetDayEventResponseDto.java b/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetDayEventResponseDto.java index 72535df..e3eb531 100644 --- a/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetDayEventResponseDto.java +++ b/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetDayEventResponseDto.java @@ -21,5 +21,5 @@ public class GetDayEventResponseDto { private String endTime; - private Long colorId; -} + private String color; +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetMonthlyCalendarResponseDto.java b/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetMonthlyCalendarResponseDto.java index ceaa9e2..7823f98 100644 --- a/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetMonthlyCalendarResponseDto.java +++ b/src/main/java/com/indayvidual/server/domain/calendar/dto/response/GetMonthlyCalendarResponseDto.java @@ -20,6 +20,6 @@ public class GetMonthlyCalendarResponseDto { @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate date; - @Schema(description = "해당 날짜에 포함된 일정의 색상 ID 리스트", example = "[1, 2]") - private List colorIds; -} + @Schema(description = "해당 날짜에 포함된 일정의 색상 코드 리스트", example = "[\"#FF0000\", \"#00FF00\"]") + private List colors; +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/calendar/service/CalendarQueryServiceImpl.java b/src/main/java/com/indayvidual/server/domain/calendar/service/CalendarQueryServiceImpl.java index 0ff93b6..d56b6df 100644 --- a/src/main/java/com/indayvidual/server/domain/calendar/service/CalendarQueryServiceImpl.java +++ b/src/main/java/com/indayvidual/server/domain/calendar/service/CalendarQueryServiceImpl.java @@ -39,22 +39,21 @@ public List getMonthlyCalendar(int year, int mont List events = eventRepository.findByUserIdAndEventDateBetween(userId, startDate, endDate); - Map> dateColorIdsMap = events.stream() + Map> dateColorsMap = events.stream() .collect(Collectors.groupingBy( Event::getEventDate, - Collectors.mapping(event -> event.getColor().getId(), Collectors.toList()) + Collectors.mapping(Event::getColorCode, Collectors.toList()) )); return Stream.iterate(startDate, date -> date.plusDays(1)) .limit(yearMonth.lengthOfMonth()) .map(date -> { - List colorIds = dateColorIdsMap.getOrDefault(date, Collections.emptyList()); + List colors = dateColorsMap.getOrDefault(date, Collections.emptyList()); return GetMonthlyCalendarResponseDto.builder() .date(date) - .colorIds(colorIds) + .colors(colors) .build(); }) .collect(Collectors.toList()); } } - diff --git a/src/main/java/com/indayvidual/server/domain/event/converter/EventConverter.java b/src/main/java/com/indayvidual/server/domain/event/converter/EventConverter.java index 5535c06..0c56234 100644 --- a/src/main/java/com/indayvidual/server/domain/event/converter/EventConverter.java +++ b/src/main/java/com/indayvidual/server/domain/event/converter/EventConverter.java @@ -3,13 +3,9 @@ import com.indayvidual.server.domain.event.dto.request.CreateEventRequestDto; import com.indayvidual.server.domain.event.dto.request.UpdateEventRequestDto; import com.indayvidual.server.domain.event.dto.response.CreateEventResponseDto; -import com.indayvidual.server.domain.event.dto.response.UpdateEventResponseDto; import com.indayvidual.server.domain.calendar.dto.response.GetDayEventResponseDto; +import com.indayvidual.server.domain.event.dto.response.UpdateEventResponseDto; import com.indayvidual.server.domain.event.entity.Event; -import com.indayvidual.server.domain.event.exception.EventException; -import com.indayvidual.server.domain.todo.entity.Color; -import com.indayvidual.server.domain.todo.repository.ColorRepository; -import com.indayvidual.server.global.api.code.status.ErrorStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -20,16 +16,10 @@ public class EventConverter { private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); - private static final Long DEFAULT_COLOR_ID = 1L; + private static final String DEFAULT_COLOR = "#CD7AFB"; private static final LocalTime ALL_DAY_START_TIME = LocalTime.of(0, 0); private static final LocalTime ALL_DAY_END_TIME = LocalTime.of(23, 59); - private final ColorRepository colorRepository; - - public EventConverter(ColorRepository colorRepository) { - this.colorRepository = colorRepository; - } - public Event toEntity(CreateEventRequestDto request, Long userId) { LocalTime startTime; LocalTime endTime; @@ -42,22 +32,36 @@ public Event toEntity(CreateEventRequestDto request, Long userId) { endTime = request.getEndTime(); } - Long colorId = request.getColorId() != null ? request.getColorId() : DEFAULT_COLOR_ID; - Color color = colorRepository.findById(colorId) - .orElseThrow(() -> new EventException(ErrorStatus.EVENT_INVALID_COLOR_ID)); - return Event.builder() .userId(userId) .title(request.getTitle().trim()) .eventDate(request.getDate()) .startTime(startTime) .endTime(endTime) - .color(color) + .colorCode(StringUtils.hasText(request.getColor()) ? request.getColor() : DEFAULT_COLOR) .userEndTime(endTime != null) .isAllDay(Boolean.TRUE.equals(request.getIsAllDay())) .build(); } + public CreateEventResponseDto toCreateResponse(Event entity) { + return CreateEventResponseDto.builder() + .eventId(entity.getId()) + .build(); + } + + public UpdateEventResponseDto toUpdateResponse(Event entity) { + return UpdateEventResponseDto.builder() + .eventId(entity.getId()) + .date(entity.getEventDate()) + .title(entity.getTitle()) + .startTime(entity.getStartTime()) + .endTime(entity.getEndTime()) + .color(entity.getColorCode()) + .isAllDay(entity.getIsAllDay()) + .build(); + } + public void updateEntityFromRequest(Event entity, UpdateEventRequestDto request) { if (request.getDate() != null) { entity.setEventDate(request.getDate()); @@ -93,31 +97,11 @@ public void updateEntityFromRequest(Event entity, UpdateEventRequestDto request) } } - if (request.getColorId() != null) { - Color color = colorRepository.findById(request.getColorId()) - .orElseThrow(() -> new EventException(ErrorStatus.EVENT_INVALID_COLOR_ID)); - entity.setColor(color); + if (StringUtils.hasText(request.getColor())) { + entity.setColorCode(request.getColor()); } } - public CreateEventResponseDto toCreateResponse(Event entity) { - return CreateEventResponseDto.builder() - .eventId(entity.getId()) - .build(); - } - - public UpdateEventResponseDto toUpdateResponse(Event entity) { - return UpdateEventResponseDto.builder() - .eventId(entity.getId()) - .date(entity.getEventDate()) - .title(entity.getTitle()) - .startTime(entity.getStartTime()) - .endTime(entity.getEndTime()) - .colorId(entity.getColor().getId()) - .isAllDay(entity.getIsAllDay()) - .build(); - } - public GetDayEventResponseDto toGetDayEventResponse(Event event) { return GetDayEventResponseDto.builder() .eventId(event.getId()) @@ -125,7 +109,8 @@ public GetDayEventResponseDto toGetDayEventResponse(Event event) { .title(event.getTitle()) .startTime(event.getStartTime().format(TIME_FORMATTER)) .endTime(event.getEndTime() != null ? event.getEndTime().format(TIME_FORMATTER) : null) - .colorId(event.getColor().getId()) + .color(event.getColorCode()) .build(); } -} + +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/event/dto/request/CreateEventRequestDto.java b/src/main/java/com/indayvidual/server/domain/event/dto/request/CreateEventRequestDto.java index 9e3d0e8..757870f 100644 --- a/src/main/java/com/indayvidual/server/domain/event/dto/request/CreateEventRequestDto.java +++ b/src/main/java/com/indayvidual/server/domain/event/dto/request/CreateEventRequestDto.java @@ -37,10 +37,11 @@ public class CreateEventRequestDto { @JsonFormat(pattern = "HH:mm") private LocalTime endTime; - @Schema(description = "색상 ID", example = "1") - private Long colorId; + @Schema(description = "색상 코드", example = "#CD7AFB") + @Pattern(regexp = "^#[0-9A-F]{6}$", message = "색상은 #RRGGBB 형식이어야 합니다.") + private String color; @Schema(description = "하루종일 여부", example = "false") @Builder.Default private Boolean isAllDay = false; -} +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/event/dto/request/UpdateEventRequestDto.java b/src/main/java/com/indayvidual/server/domain/event/dto/request/UpdateEventRequestDto.java index 5c330f0..7b113f7 100644 --- a/src/main/java/com/indayvidual/server/domain/event/dto/request/UpdateEventRequestDto.java +++ b/src/main/java/com/indayvidual/server/domain/event/dto/request/UpdateEventRequestDto.java @@ -34,9 +34,10 @@ public class UpdateEventRequestDto { @JsonFormat(pattern = "HH:mm") private LocalTime endTime; - @Schema(description = "색상 ID", example = "1") - private Long colorId; + @Schema(description = "색상 코드", example = "#CD7AFB") + @Pattern(regexp = "^#[0-9A-F]{6}$", message = "색상은 #RRGGBB 형식이어야 합니다.") + private String color; @Schema(description = "하루종일 여부", example = "false") private Boolean isAllDay; -} +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/event/dto/response/UpdateEventResponseDto.java b/src/main/java/com/indayvidual/server/domain/event/dto/response/UpdateEventResponseDto.java index 5fdb873..b0d34e9 100644 --- a/src/main/java/com/indayvidual/server/domain/event/dto/response/UpdateEventResponseDto.java +++ b/src/main/java/com/indayvidual/server/domain/event/dto/response/UpdateEventResponseDto.java @@ -33,9 +33,9 @@ public class UpdateEventResponseDto { @JsonFormat(pattern = "HH:mm") private LocalTime endTime; - @Schema(description = "색상 ID", example = "1") - private Long colorId; + @Schema(description = "색상 코드", example = "#CD7AFB") + private String color; @Schema(description = "하루종일 여부", example = "false") private Boolean isAllDay; -} +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/domain/event/entity/Event.java b/src/main/java/com/indayvidual/server/domain/event/entity/Event.java index acdff2e..df22a25 100644 --- a/src/main/java/com/indayvidual/server/domain/event/entity/Event.java +++ b/src/main/java/com/indayvidual/server/domain/event/entity/Event.java @@ -1,7 +1,6 @@ package com.indayvidual.server.domain.event.entity; import com.indayvidual.server.common.BaseEntity; -import com.indayvidual.server.domain.todo.entity.Color; import jakarta.persistence.*; import lombok.*; @@ -35,10 +34,9 @@ public class Event extends BaseEntity { @Column(name = "end_time", nullable = true) private LocalTime endTime; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "color_id", nullable = false) + @Column(name = "color_code", nullable = false, length = 7) @Builder.Default - private Color color = null; + private String colorCode = "#CD7AFB"; @Column(name = "user_end_time", nullable = false) @Builder.Default @@ -47,4 +45,4 @@ public class Event extends BaseEntity { @Column(name = "is_all_day", nullable = false) @Builder.Default private Boolean isAllDay = false; -} +} \ No newline at end of file diff --git a/src/main/java/com/indayvidual/server/global/api/code/status/ErrorStatus.java b/src/main/java/com/indayvidual/server/global/api/code/status/ErrorStatus.java index 4af6a5d..44dd368 100644 --- a/src/main/java/com/indayvidual/server/global/api/code/status/ErrorStatus.java +++ b/src/main/java/com/indayvidual/server/global/api/code/status/ErrorStatus.java @@ -76,7 +76,6 @@ public enum ErrorStatus implements BaseErrorCode { EVENT_GET_BY_DATE_FAILED(HttpStatus.BAD_REQUEST, "EVENT4006", "특정 날짜 일정 조회에 실패했습니다."), EVENT_INVALID_TIME_ORDER(HttpStatus.BAD_REQUEST, "EVENT4007", "시작 시간은 종료 시간보다 빨라야 합니다."), EVENT_INVALID_DATE_FORMAT(HttpStatus.BAD_REQUEST, "EVENT4008", "날짜 형식이 올바르지 않습니다."), - EVENT_INVALID_COLOR_ID(HttpStatus.BAD_REQUEST, "EVENT4009", "유효하지 않은 색상 ID입니다."), // ===== 시간표 관련 에러 (TIMETABLE) ===== TIMETABLE_CREATE_FAILED(HttpStatus.BAD_REQUEST, "TIMETABLE4001", "시간표 등록에 실패했습니다."),