Skip to content

Commit 6669609

Browse files
i3monthsclaude
andcommitted
feat(session): 제목 미입력 시 모드+직군 규칙 제목 자동 생성
히스토리에서 "면접 #id" 대신 의미 있는 제목을 보이도록, 세션 생성 시 제목이 비어 있으면 "{직군} {모드}"(예: "백엔드 기술 면접")로 채운다. SessionMode/JobCategory 에 koreanLabel() 추가. 부수: StackupApplicationTests 에 누락됐던 SessionQuestionPoolRepository @MockitoBean 추가 (질문 풀 도입 PR에서 빠져 컨텍스트 로드가 깨져 있던 것 복구). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 56dc7a8 commit 6669609

5 files changed

Lines changed: 63 additions & 3 deletions

File tree

backend/src/main/java/com/stackup/stackup/session/application/SessionService.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ public class SessionService {
4343
@Transactional
4444
public SessionResult create(Long userId, SessionCreateCommand command) {
4545
User user = loadUser(userId);
46+
String title = resolveTitle(command);
4647
InterviewSession session = sessionRepository.save(InterviewSession.create(
4748
user,
48-
command.title(),
49+
title,
4950
command.memo(),
5051
command.mode(),
5152
command.jobCategory(),
@@ -145,6 +146,16 @@ public SessionResult updateMeta(Long userId, Long sessionId, String title, Strin
145146
return SessionResult.of(session, contextDocumentIds(sessionId));
146147
}
147148

149+
// 제목 미입력 시 모드+직군으로 규칙 기반 제목 생성 (예: "백엔드 기술 면접").
150+
// 히스토리에서 "면접 #id" 대신 의미 있는 제목을 보이게 한다.
151+
private String resolveTitle(SessionCreateCommand command) {
152+
String title = command.title();
153+
if (title != null && !title.isBlank()) {
154+
return title;
155+
}
156+
return command.jobCategory().koreanLabel() + " " + command.mode().koreanLabel();
157+
}
158+
148159
private User loadUser(Long userId) {
149160
return userRepository.findByIdAndDeletedFalse(userId)
150161
.orElseThrow(() -> new DomainException(ApiErrorCode.USER_NOT_FOUND));

backend/src/main/java/com/stackup/stackup/session/domain/JobCategory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,14 @@ public enum JobCategory {
44
FRONTEND,
55
BACKEND,
66
INFRA,
7-
DBA
7+
DBA;
8+
9+
public String koreanLabel() {
10+
return switch (this) {
11+
case FRONTEND -> "프론트엔드";
12+
case BACKEND -> "백엔드";
13+
case INFRA -> "인프라";
14+
case DBA -> "DBA";
15+
};
16+
}
817
}

backend/src/main/java/com/stackup/stackup/session/domain/SessionMode.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,13 @@
33
public enum SessionMode {
44
TECHNICAL,
55
PERSONALITY,
6-
INTEGRATED
6+
INTEGRATED;
7+
8+
public String koreanLabel() {
9+
return switch (this) {
10+
case TECHNICAL -> "기술 면접";
11+
case PERSONALITY -> "인성 면접";
12+
case INTEGRATED -> "종합 면접";
13+
};
14+
}
715
}

backend/src/test/java/com/stackup/stackup/StackupApplicationTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.stackup.stackup.session.domain.MessageVoiceAnalysisRepository;
1414
import com.stackup.stackup.session.domain.SessionContextRepository;
1515
import com.stackup.stackup.session.domain.SessionFeedbackRepository;
16+
import com.stackup.stackup.session.domain.SessionQuestionPoolRepository;
1617
import com.stackup.stackup.user.domain.UserRepository;
1718
import com.stackup.stackup.user.domain.consent.UserConsentRepository;
1819
import org.junit.jupiter.api.Test;
@@ -61,6 +62,9 @@ class StackupApplicationTests {
6162
@MockitoBean
6263
private SessionFeedbackRepository sessionFeedbackRepository;
6364

65+
@MockitoBean
66+
private SessionQuestionPoolRepository sessionQuestionPoolRepository;
67+
6468
@MockitoBean
6569
private MessageVoiceAnalysisRepository messageVoiceAnalysisRepository;
6670

backend/src/test/java/com/stackup/stackup/session/application/SessionServiceTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,34 @@ void create_savesSessionAndPublishesEvent() {
6363
verify(events).publishEvent(any(SessionCreatedEvent.class));
6464
}
6565

66+
@Test
67+
void create_generatesTitleFromModeAndJobWhenBlank() {
68+
User user = userFixture(1L);
69+
when(userRepository.findByIdAndDeletedFalse(1L)).thenReturn(Optional.of(user));
70+
when(sessionRepository.save(any(InterviewSession.class))).thenAnswer(inv -> inv.getArgument(0));
71+
72+
SessionResult result = service.create(1L, new SessionCreateCommand(
73+
" ", null, SessionMode.TECHNICAL, JobCategory.BACKEND,
74+
5, 30, null, null, List.of()
75+
));
76+
77+
assertThat(result.title()).isEqualTo("백엔드 기술 면접");
78+
}
79+
80+
@Test
81+
void create_keepsProvidedTitle() {
82+
User user = userFixture(1L);
83+
when(userRepository.findByIdAndDeletedFalse(1L)).thenReturn(Optional.of(user));
84+
when(sessionRepository.save(any(InterviewSession.class))).thenAnswer(inv -> inv.getArgument(0));
85+
86+
SessionResult result = service.create(1L, new SessionCreateCommand(
87+
"내가 정한 제목", null, SessionMode.INTEGRATED, JobCategory.FRONTEND,
88+
5, 30, null, null, List.of()
89+
));
90+
91+
assertThat(result.title()).isEqualTo("내가 정한 제목");
92+
}
93+
6694
@Test
6795
void create_linksAnalyzedContextDocuments() {
6896
User user = userFixture(1L);

0 commit comments

Comments
 (0)