diff --git a/backend/src/main/java/com/isp/backend/domain/gpt/constant/ParsingConstants.java b/backend/src/main/java/com/isp/backend/domain/gpt/constant/ParsingConstants.java new file mode 100644 index 00000000..6315bb9f --- /dev/null +++ b/backend/src/main/java/com/isp/backend/domain/gpt/constant/ParsingConstants.java @@ -0,0 +1,13 @@ +package com.isp.backend.domain.gpt.constant; + +import java.util.List; + +public class ParsingConstants { + public static final String DATE_REGEX = "(\\d{4}-\\d{2}-\\d{2})"; + public static final String NEW_LINE_REGEX = "\n"; + public static final String CURRENT_DATE = ""; + public static final int BEGIN_INDEX = 3; + public static final List FILTER_STRINGS = List.of( + "Message(role=assistant, content=", ")" + ); +} diff --git a/backend/src/main/java/com/isp/backend/domain/gpt/entity/GptScheduleParser.java b/backend/src/main/java/com/isp/backend/domain/gpt/entity/GptScheduleParser.java new file mode 100644 index 00000000..a0713998 --- /dev/null +++ b/backend/src/main/java/com/isp/backend/domain/gpt/entity/GptScheduleParser.java @@ -0,0 +1,60 @@ +package com.isp.backend.domain.gpt.entity; + +import com.isp.backend.domain.gpt.constant.ParsingConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RequiredArgsConstructor +@Component +public class GptScheduleParser { + + public List parseScheduleText(String scheduleText) { + List schedules = new ArrayList<>(); + Pattern pattern = Pattern.compile(ParsingConstants.DATE_REGEX); + + List lines = List.of(scheduleText.split(ParsingConstants.NEW_LINE_REGEX)); + List currentScheduleDetail = new ArrayList<>(); + String currentDate = ParsingConstants.CURRENT_DATE; + + for (String line : lines) { + processLine(line, pattern, schedules, currentScheduleDetail, currentDate); + } + + addScheduleIfNotEmpty(currentDate, schedules, currentScheduleDetail); + + return schedules; + } + + private void processLine(String line, Pattern pattern, List schedules, List currentScheduleDetail, String currentDate) { + Matcher dateMatcher = pattern.matcher(line); + + if (dateMatcher.find()) { + handleNewDate(currentDate, schedules, currentScheduleDetail, dateMatcher.group(1)); + } else { + handleNonDateLine(line, currentScheduleDetail); + } + } + + private void handleNewDate(String currentDate, List schedules, List currentScheduleDetail, String newDate) { + if (!currentDate.isEmpty()) { + schedules.add(new GptSchedule(currentDate, currentScheduleDetail)); + } + } + + private void handleNonDateLine(String line, List currentScheduleDetail) { + if (!line.trim().isEmpty() && ParsingConstants.FILTER_STRINGS.stream().noneMatch(line::contains)) { + currentScheduleDetail.add(line.trim().substring(ParsingConstants.BEGIN_INDEX)); // Remove leading index + } + } + + private void addScheduleIfNotEmpty(String currentDate, List schedules, List currentScheduleDetail) { + if (!currentDate.isEmpty()) { + schedules.add(new GptSchedule(currentDate, currentScheduleDetail)); + } + } +} diff --git a/backend/src/main/java/com/isp/backend/domain/gpt/service/GptService.java b/backend/src/main/java/com/isp/backend/domain/gpt/service/GptService.java index cf9b9c83..8f046235 100644 --- a/backend/src/main/java/com/isp/backend/domain/gpt/service/GptService.java +++ b/backend/src/main/java/com/isp/backend/domain/gpt/service/GptService.java @@ -7,7 +7,7 @@ import com.isp.backend.domain.gpt.dto.GptScheduleResponseDto; import com.isp.backend.domain.gpt.entity.GptMessage; import com.isp.backend.domain.gpt.entity.GptSchedule; -import com.isp.backend.domain.gpt.mapper.JsonMapper; +import com.isp.backend.domain.gpt.entity.GptScheduleParser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -27,7 +27,7 @@ @Service public class GptService { private final RestTemplate restTemplate; - private final JsonMapper jsonMapper; + private final GptScheduleParser gptScheduleParser; @Value("${api-key.chat-gpt}") private String apiKey; @@ -50,7 +50,7 @@ public GptScheduleResponseDto getResponse(HttpEntity chatGptReque GptConfig.CHAT_URL, chatGptRequestHttpEntity, GptResponseDTO.class); - List gptSchedules = jsonMapper.parseScheduleText(getScheduleText(responseEntity)); + List gptSchedules = gptScheduleParser.parseScheduleText(getScheduleText(responseEntity)); return new GptScheduleResponseDto(gptSchedules); }