diff --git a/src/main/java/org/ezcode/codetest/infrastructure/event/config/RedisStreamConfig.java b/src/main/java/org/ezcode/codetest/infrastructure/event/config/RedisStreamConfig.java index 791097d6..9a17c9ed 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/event/config/RedisStreamConfig.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/event/config/RedisStreamConfig.java @@ -1,7 +1,10 @@ package org.ezcode.codetest.infrastructure.event.config; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.time.Duration; import java.util.Map; +import java.util.UUID; import java.util.concurrent.Executor; import org.ezcode.codetest.infrastructure.event.listener.RedisJudgeQueueConsumer; @@ -50,7 +53,7 @@ public void initConsumerGroup() { connection.xGroupDelConsumer( "judge-queue".getBytes(), "judge-group", - "consumer-1" + getConsumerName().replace("consumer-", "") ); return null; }); @@ -90,7 +93,7 @@ public StreamMessageListenerContainer> StreamMessageListenerContainer.create(factory, options); container.receive( - Consumer.from("judge-group", "consumer-1"), + Consumer.from("judge-group", getConsumerName()), StreamOffset.create("judge-queue", ReadOffset.lastConsumed()), consumer ); @@ -98,4 +101,13 @@ public StreamMessageListenerContainer> container.start(); return container; } + + private String getConsumerName() { + try { + return "consumer-" + InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + log.warn("호스트명 확인 실패, UUID 사용: {}", e.getMessage()); + return "consumer-" + UUID.randomUUID().toString().substring(0, 8); + } + } } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/event/listener/RedisJudgeQueueConsumer.java b/src/main/java/org/ezcode/codetest/infrastructure/event/listener/RedisJudgeQueueConsumer.java index 15f13518..ae98b4f7 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/event/listener/RedisJudgeQueueConsumer.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/event/listener/RedisJudgeQueueConsumer.java @@ -36,7 +36,6 @@ public void onMessage(MapRecord message) { try { log.info("[컨슈머 수신] {}", msg.sessionKey()); - Thread.sleep(6000); submissionService.processSubmissionAsync(msg); log.info("[컨슈머 ACK] messageId={}", message.getId()); diff --git a/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIMessageBuilder.java b/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIMessageBuilder.java index debe6658..8196352b 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIMessageBuilder.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIMessageBuilder.java @@ -9,12 +9,14 @@ @Component class OpenAIMessageBuilder { - private static final String MODEL_NAME = "o4-mini"; + private static final String MODEL_NAME = "gpt-4o"; private static final String PREFIX = """ 당신은 코딩 테스트 사이트의 코드 리뷰어입니다. 아래 **정확히** 이 형식을 지켜 응답하세요: - '시간 복잡도:', '코드 총평:' 같은 제목은 **제목**과 같이 볼드체로 변환합니다. + '코드 총평' 같은 제목은 **제목** 과 같이 볼드체로 변환합니다. + **[중요] 오답일 경우 시간 복잡도 항목은 절대 금지입니다.** + 만약 형식을 지켜 응답하지 않으면 시스템은 응답을 폐기합니다. """.stripIndent(); private static final String SUFFIX = """ @@ -63,30 +65,38 @@ private String buildSystemPrompt(boolean isCorrect) { String body; if (isCorrect) { body = """ - - 시간 복잡도: Big-O 표기법으로만 답하세요. **단, N과 M을 같다고 가정하고 n으로 표기하세요.** + **시간 복잡도**: Big-O 표기법으로만 답하세요. + **단, N과 M을 같다고 가정하고 n으로 표기하세요.** 코드에 포함된 중첩 루프(depth)에 따라 O(N^k) 형태로 정확히 표기해주세요. **for 루프뿐만 아니라 while 루프도 모두 중첩(depth)에 포함**하여, 코드에 실제로 있는 루프 개수만큼 exponent를 세십시오. 예) for-for-for ⇒ O(n³), for-for-while ⇒ O(n³), for-for-for-for-while ⇒ O(n⁵) \n - - 코드 총평: - 각 문장은 한 탭(\t) 들여쓰기 + '- '로 시작. - 문장 끝에만 마침표를 붙이세요. + **코드 총평**: + 각 문장은 '- '로 시작. + 문장 끝에만 마침표를 붙이고 줄바꿈 하세요. \n - - 조금 더 개선할 수 있는 방안: - 각 문장은 한 탭(\t) 들여쓰기 + '- '로 시작. - 문장 끝에만 마침표를 붙이세요. + **조금 더 개선할 수 있는 방안**: + 각 문장은 '- '로 시작. + 문장 끝에만 마침표를 붙이고 줄바꿈 하세요. """.stripIndent(); } else { body = """ - - 코드 총평: - 각 문장은 한 탭(\t) 들여쓰기 + '- '로 시작. - 문장 끝에만 마침표를 붙이세요. + **코드 총평**: + 각 문장은 '- '로 시작. + 문장 끝에만 마침표를 붙이고 줄바꿈 하세요. \n - - 공부하면 좋은 키워드: + **공부하면 좋은 키워드**: 1. 첫 번째 키워드 2. 두 번째 키워드 3. 세 번째 키워드 … 필요한 만큼 번호를 늘려주세요. + \n + **조금 더 개선할 수 있는 방안**: + 각 문장은 '- '로 시작. + 문장 끝에만 마침표를 붙이고 줄바꿈 하세요. + + 절대 시간 복잡도라는 단어도 쓰지 마세요. + Big-O 표기법도 절대 포함하지 마세요. """.stripIndent(); } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIResponseValidator.java b/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIResponseValidator.java index f8fa919b..04b99e84 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIResponseValidator.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/openai/OpenAIResponseValidator.java @@ -8,13 +8,20 @@ protected boolean isValidFormat(String content, boolean isCorrect) { if (content == null) return false; - if (isCorrect) { - return content.contains("시간 복잡도:") && - content.contains("코드 총평:") && - content.contains("조금 더 개선할 수 있는 방안:"); + if (!isCorrect) { + + boolean containsRequired = content.contains("**코드 총평**:") && + content.contains("**공부하면 좋은 키워드**:")&& + content.contains("**조금 더 개선할 수 있는 방안**:"); + + boolean containsForbidden = content.contains("**시간 복잡도**:") || + content.toLowerCase().contains("**시간복잡도:**"); + + return containsRequired && !containsForbidden; } - return content.contains("코드 총평:") && - content.contains("공부하면 좋은 키워드:"); + return content.contains("**시간 복잡도**:") && + content.contains("**코드 총평**:") && + content.contains("**조금 더 개선할 수 있는 방안**:"); } } diff --git a/src/main/resources/templates/test-submit.html b/src/main/resources/templates/test-submit.html index 684b75ee..0531f86d 100644 --- a/src/main/resources/templates/test-submit.html +++ b/src/main/resources/templates/test-submit.html @@ -121,6 +121,24 @@ background-color: #00b472; } + button:disabled { + background-color: #555; + cursor: not-allowed; + } + + .review-box { + margin-top: 16px; + background-color: #2a2d3d; + padding: 20px; + border-radius: 10px; + color: #f0f2f5; + } + + .review-box strong, + .review-box b { + color: #00d084; + } + .result-box { background-color: #1e212f; padding: 16px; @@ -288,6 +306,7 @@

코드 제출

+

채점 결과

@@ -295,6 +314,7 @@

채점 결과

여기에 테스트 결과가 표시됩니다
+ @@ -305,7 +325,11 @@

채점 결과

+