Skip to content

Commit b8832fa

Browse files
committed
[refactor] 질문/답변 기반 줄거리 생성 로직 수정 및 중복 로직 메서드화
1 parent 957aec2 commit b8832fa

3 files changed

Lines changed: 87 additions & 52 deletions

File tree

src/main/java/everTale/everTale_be/domain/story/dto/request/StoryRequestDTO.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ public static class StoryWorldViewRequestDTO {
7373
@NoArgsConstructor
7474
@AllArgsConstructor
7575
public static class StoryAnswerRequestDTO {
76+
@Schema(description = "받은질문", example = "토토로는 비밀을 풀기위해 어떤 장비를 사용했나요?")
77+
private String question;
78+
7679
@Schema(description = "아이답변", example = "비밀을 풀기 위해 별을 모으는 지팡이를 사용했어요.")
7780
private String answer;
7881
}
@@ -95,6 +98,16 @@ public static class SketchImageRequestDTO {
9598
private MultipartFile sketch;
9699
}
97100

101+
@Getter
102+
@NoArgsConstructor
103+
@AllArgsConstructor
104+
public static class ImagePromptRequestDTO{
105+
106+
@Schema(description = "장면 프롬프트", example = "A little girl holding a balloon")
107+
private String prompt;
108+
109+
}
110+
98111
@Getter
99112
@Builder
100113
public static class FastApiInitStoryRequestDTO {

src/main/java/everTale/everTale_be/domain/story/external/StoryApiClient.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,10 @@ public String callFastApiForNextStory(StoryRequestDTO.NextStoryGenerateRequestDT
7474
}
7575

7676
// 질문 생성
77-
public String callFastApiForQuestion(String previousContent) {
78-
Map<String, String> request = Map.of("previous", previousContent);
77+
public String callFastApiForQuestion(StoryRequestDTO.NextStoryGenerateRequestDTO requestDto) {
7978
ResponseEntity<FastApiTextResponseDto> response = restTemplate.postForEntity(
8079
fastApiBaseUrl+"/ai/question",
81-
request,
80+
requestDto,
8281
FastApiTextResponseDto.class
8382
);
8483

@@ -90,10 +89,26 @@ public String callFastApiForQuestion(String previousContent) {
9089
}
9190

9291
// 아이 답변 반영한 다음 줄거리 생성
93-
public String callFastApiForNextStoryWithAnswer(String previousContent, String answer) {
94-
Map<String, String> request = Map.of("previous", previousContent, "answer", answer);
92+
public String callFastApiForNextStoryWithAnswer(
93+
StoryRequestDTO.NextStoryGenerateRequestDTO requestDto,
94+
String question,
95+
String answer
96+
) {
97+
// 요청 바디 구성
98+
Map<String, Object> request = new HashMap<>();
99+
request.put("question", question);
100+
request.put("answer", answer);
101+
request.put("previous", requestDto.getPrevious());
102+
request.put("pageNum", requestDto.getPageNum());
103+
request.put("genre", requestDto.getGenre());
104+
request.put("name", requestDto.getName());
105+
request.put("age", requestDto.getAge());
106+
request.put("gender", requestDto.getGender());
107+
request.put("personalities", requestDto.getPersonalities());
108+
109+
// FastAPI 호출
95110
ResponseEntity<FastApiTextResponseDto> response = restTemplate.postForEntity(
96-
fastApiBaseUrl+"/ai/next-from-answer",
111+
fastApiBaseUrl + "/ai/next-from-answer",
97112
request,
98113
FastApiTextResponseDto.class
99114
);
@@ -105,6 +120,7 @@ public String callFastApiForNextStoryWithAnswer(String previousContent, String a
105120
}
106121
}
107122

123+
108124
// 스케치 이미지 + 프롬프트로 초기 캐릭터 이미지 생성 요청
109125
public String callFastApiForInitCharacterImageFromSketch(
110126
MultipartFile sketch, StoryRequestDTO.StoryCharacterInfoRequestDTO request

src/main/java/everTale/everTale_be/domain/story/service/StoryService.java

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,7 @@ public String generateInitScene(Long storyId, StoryRequestDTO.StoryWorldViewRequ
196196
}
197197

198198
// 2-1. personalities 문자열 리스트로 변환
199-
List<String> personalities = storyCharacter.getCharacterPersonalities().stream()
200-
.map(cp -> cp.getPersonality().getPersonality())
201-
.collect(Collectors.toList());
199+
List<String> personalities = extractPersonalities(storyCharacter);
202200

203201
// 3. FastAPI 요청용 JSON 만들기
204202
StoryRequestDTO.FastApiInitStoryRequestDTO requestDto = StoryRequestDTO.FastApiInitStoryRequestDTO.builder()
@@ -216,14 +214,8 @@ public String generateInitScene(Long storyId, StoryRequestDTO.StoryWorldViewRequ
216214
// 5. 장르 저장
217215
story.updateGenre(request.getGenre());
218216

219-
220217
// 6. 첫 장면 저장 (page=1)
221-
Scene scene = Scene.builder()
222-
.page(1)
223-
.content(initStory)
224-
.build();
225-
226-
story.addScene(scene);
218+
saveNewScene(story,1,initStory);
227219

228220
// 7. 줄거리 반환
229221
return initStory;
@@ -236,38 +228,19 @@ public String generateInitScene(Long storyId, StoryRequestDTO.StoryWorldViewRequ
236228
public String generateNextScene(Long storyId, int pageNum) {
237229
// 1. 이전 줄거리 조회
238230
Scene prevScene = findMyScene(storyId, pageNum-1);
239-
String previousContent = prevScene.getContent();
240231

241232
// 2. Story & Character 조회
242233
Story story = prevScene.getStory();
243234
StoryCharacter character = story.getCharacter();
244235

245-
// 3. Personality 추출
246-
List<String> personalities = character.getCharacterPersonalities().stream()
247-
.map(cp -> cp.getPersonality().getPersonality())
248-
.collect(Collectors.toList());
249-
250-
// 4. DTO 조립 및 FastAPI 호출
251-
StoryRequestDTO.NextStoryGenerateRequestDTO dto =
252-
StoryRequestDTO.NextStoryGenerateRequestDTO.builder()
253-
.previous(previousContent)
254-
.pageNum(pageNum)
255-
.genre(story.getGenre().name())
256-
.name(character.getName())
257-
.age(character.getAge())
258-
.gender(character.getGender().name())
259-
.personalities(personalities)
260-
.build();
236+
// 3. DTO 조립 및 FastAPI 호출
237+
var dto = buildNextStoryDto(prevScene,story,character,pageNum);
261238

262-
// 5. FastAPI 호출 → 다음 줄거리 생성
239+
// 4. FastAPI 호출 → 다음 줄거리 생성
263240
String nextContent = storyApiClient.callFastApiForNextStory(dto);
264241

265-
// 6. 새 Scene 저장
266-
Scene newScene = Scene.builder()
267-
.page(pageNum)
268-
.content(nextContent)
269-
.build();
270-
story.addScene(newScene);
242+
// 5. 새 Scene 저장
243+
saveNewScene(story,pageNum,nextContent);
271244

272245
return nextContent;
273246
}
@@ -276,25 +249,27 @@ public String generateNextScene(Long storyId, int pageNum) {
276249
@Transactional(readOnly = true)
277250
public String generateQuestionFromPreviousScene(Long storyId, int pageNum) {
278251
Scene prevScene = findMyScene(storyId, pageNum - 1);
279-
return storyApiClient.callFastApiForQuestion(prevScene.getContent());
252+
Story story = prevScene.getStory();
253+
StoryCharacter character = story.getCharacter();
254+
255+
var dto = buildNextStoryDto(prevScene, story, character, pageNum);
256+
return storyApiClient.callFastApiForQuestion(dto);
280257
}
281258

282259
// 아이의 대답 기반 다음 줄거리 생성
283260
@Transactional
284-
public String generateNextSceneWithAnswer(Long storyId, int pageNum, String answer) {
261+
public String generateNextSceneWithAnswer(Long storyId, int pageNum, StoryRequestDTO.StoryAnswerRequestDTO request) {
285262
Scene prevScene = findMyScene(storyId, pageNum - 1);
286-
287-
String nextContent = storyApiClient.callFastApiForNextStoryWithAnswer(prevScene.getContent(), answer);
288-
289263
Story story = prevScene.getStory();
264+
StoryCharacter character = story.getCharacter();
265+
266+
var dto = buildNextStoryDto(prevScene, story, character, pageNum);
267+
String nextContent = storyApiClient.callFastApiForNextStoryWithAnswer(dto, request.getQuestion(), request.getAnswer());
268+
saveNewScene(story, pageNum, nextContent);
290269

291-
Scene newScene = Scene.builder()
292-
.page(pageNum)
293-
.content(nextContent)
294-
.build();
295-
story.addScene(newScene);
296270
return nextContent;
297271
}
272+
298273
// 장면 프롬프트 및 아이그림 기반 그림 생성
299274
@Transactional
300275
public String generateImageFromSketch(Long storyId, int pageNum, StoryRequestDTO.SketchImageRequestDTO request) {
@@ -306,10 +281,10 @@ public String generateImageFromSketch(Long storyId, int pageNum, StoryRequestDTO
306281

307282
// 줄거리 기반 그림 생성
308283
@Transactional
309-
public String generateImageFromPrompt(Long storyId, int pageNum) {
284+
public String generateImageFromPrompt(Long storyId, int pageNum, StoryRequestDTO.ImagePromptRequestDTO request) {
310285
Scene scene = findMyScene(storyId, pageNum);
311286

312-
String prompt = scene.getContent();
287+
String prompt = request.getPrompt();
313288
String imageUrl = storyApiClient.callFastApiForImageFromPrompt(prompt, scene.getStory().getGenre().name());
314289

315290
scene.updateImageUrl(imageUrl);
@@ -357,4 +332,35 @@ public String getSceneText(Long storyId, Long sceneId) {
357332

358333
return scene.getContent();
359334
}
335+
336+
private List<String> extractPersonalities(StoryCharacter character) {
337+
return character.getCharacterPersonalities().stream()
338+
.map(cp -> cp.getPersonality().getPersonality())
339+
.collect(Collectors.toList());
340+
}
341+
342+
private StoryRequestDTO.NextStoryGenerateRequestDTO buildNextStoryDto(
343+
Scene prevScene, Story story, StoryCharacter character, int pageNum
344+
) {
345+
return StoryRequestDTO.NextStoryGenerateRequestDTO.builder()
346+
.previous(prevScene.getContent())
347+
.pageNum(pageNum)
348+
.genre(story.getGenre().name())
349+
.name(character.getName())
350+
.age(character.getAge())
351+
.gender(character.getGender().name())
352+
.personalities(extractPersonalities(character))
353+
.build();
354+
}
355+
356+
private void saveNewScene(Story story, int pageNum, String content) {
357+
Scene newScene = Scene.builder()
358+
.page(pageNum)
359+
.content(content)
360+
.build();
361+
story.addScene(newScene);
362+
}
363+
364+
365+
360366
}

0 commit comments

Comments
 (0)