Skip to content

Commit 6662d8f

Browse files
committed
p2 role_label복귀
1 parent f781a8c commit 6662d8f

6 files changed

Lines changed: 33 additions & 16 deletions

File tree

ai_server/app/application/dto/question_dto.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class GeneratePersonalQuestionInput:
1818

1919
family_id: str # UUID
2020
member_id: str # UUID
21+
role_label: str
2122
base_question: str
2223
base_answer: str
2324
answered_at: datetime
@@ -33,7 +34,16 @@ class GeneratePersonalQuestionOutput:
3334

3435

3536
# 가족 질문은 동일한 DTO 사용 (입력 구조 동일)
36-
GenerateFamilyQuestionInput = GeneratePersonalQuestionInput
37+
@dataclass
38+
class GenerateFamilyQuestionInput:
39+
"""가족 질문 생성 Use Case 입력 DTO"""
40+
41+
family_id: str # UUID
42+
member_id: str # UUID
43+
base_question: str
44+
base_answer: str
45+
answered_at: datetime
46+
3747
GenerateFamilyQuestionOutput = GeneratePersonalQuestionOutput
3848

3949

ai_server/app/application/use_cases/base.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,12 @@ async def execute(self, input_dto: Any) -> Any:
194194
log_prefix = self._get_log_prefix()
195195
logger.info(f"[Use Case] {log_prefix} 시작")
196196

197-
# 1. role_label 조회 (memberId로 최근 질문에서 추출)
198-
role_label = await self._get_role_label(input_dto.member_id)
197+
# 1. role_label 결정
198+
# - P2: API에서 role_label을 받는 경우 우선 사용
199+
# - 그 외: member_id 기준 최근 질문에서 추출
200+
role_label = getattr(input_dto, "role_label", None) or await self._get_role_label(
201+
input_dto.member_id
202+
)
199203
if not role_label:
200204
logger.warning(
201205
f"[Use Case] role_label을 찾을 수 없음: member_id={input_dto.member_id}, "

ai_server/app/presentation/routers/question_router.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ async def generate_personal_question(
7373
use_case_input = GeneratePersonalQuestionInput(
7474
family_id=request.familyId,
7575
member_id=request.memberId,
76+
role_label=request.roleLabel,
7677
base_question=request.baseQuestion,
7778
base_answer=request.baseAnswer,
7879
answered_at=datetime.fromisoformat(request.answeredAt.replace("Z", "+00:00")),

ai_server/app/presentation/schemas/question_schemas.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class PersonalQuestionRequestSchema(BaseModel):
2525

2626
familyId: str = Field(alias="familyId", description="가족 ID (UUID)")
2727
memberId: str = Field(alias="memberId", description="멤버 ID (UUID)")
28+
roleLabel: str = Field(alias="roleLabel", description="역할 레이블 (예: '첫째 딸', '아빠')")
2829
baseQuestion: str = Field(alias="baseQuestion", description="기준 질문")
2930
baseAnswer: str = Field(alias="baseAnswer", description="기준 답변")
3031
answeredAt: str = Field(alias="answeredAt", description="답변 시각 (ISO 8601)")

ai_server/tests/refactoring/test_infrastructure.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ async def test_full_flow_with_infrastructure(self):
299299
input_dto = GeneratePersonalQuestionInput(
300300
family_id="family-1",
301301
member_id="member-10",
302+
role_label="첫째 딸",
302303
base_question="테스트",
303304
base_answer="테스트",
304305
answered_at=datetime.now(),

ai_server/tests/refactoring/test_use_cases.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ async def test_generate_personal_question_success(
9393
input_dto = GeneratePersonalQuestionInput(
9494
family_id="family-1",
9595
member_id="member-10",
96+
role_label="첫째 딸",
9697
base_question="오늘 뭐 했어?",
9798
base_answer="친구들과 놀았어요",
9899
answered_at=datetime(2026, 1, 20, 14, 30, 0),
@@ -138,6 +139,7 @@ async def test_generate_personal_question_with_empty_rag(
138139
input_dto = GeneratePersonalQuestionInput(
139140
family_id="family-1",
140141
member_id="member-10",
142+
role_label="첫째 딸",
141143
base_question="오늘 뭐 했어?",
142144
base_answer="공부했어요",
143145
answered_at=datetime(2026, 1, 20, 14, 30, 0),
@@ -175,6 +177,7 @@ async def test_generate_personal_question_vector_store_failure_raises_error(
175177
input_dto = GeneratePersonalQuestionInput(
176178
family_id="family-1",
177179
member_id="member-10",
180+
role_label="첫째 딸",
178181
base_question="테스트",
179182
base_answer="테스트",
180183
answered_at=datetime.now(),
@@ -347,6 +350,7 @@ async def test_regenerate_when_similarity_over_threshold(
347350
input_dto = GeneratePersonalQuestionInput(
348351
family_id="family-1",
349352
member_id="member-10",
353+
role_label="첫째 딸",
350354
base_question="오늘 뭐 했어?",
351355
base_answer="친구랑 놀았어요",
352356
answered_at=datetime(2026, 1, 20, 14, 30, 0),
@@ -361,9 +365,7 @@ async def test_regenerate_when_similarity_over_threshold(
361365
assert output.metadata["regeneration_count"] == 1
362366

363367
@pytest.mark.asyncio
364-
async def test_max_regeneration_limit(
365-
self, mock_vector_store, mock_question_generator
366-
):
368+
async def test_max_regeneration_limit(self, mock_vector_store, mock_question_generator):
367369
"""[RED] 최대 3회 재생성 후 마지막 질문 반환"""
368370
from app.application.use_cases.generate_personal_question import (
369371
GeneratePersonalQuestionInput,
@@ -373,7 +375,8 @@ async def test_max_regeneration_limit(
373375

374376
# Given: 모든 질문이 유사함
375377
mock_question_generator.generate_question.return_value = (
376-
"계속 유사한 질문", QuestionLevel(2)
378+
"계속 유사한 질문",
379+
QuestionLevel(2),
377380
)
378381
mock_vector_store.search_similar_questions.return_value = 0.95 # 항상 유사
379382

@@ -385,6 +388,7 @@ async def test_max_regeneration_limit(
385388
input_dto = GeneratePersonalQuestionInput(
386389
family_id="family-1",
387390
member_id="member-10",
391+
role_label="첫째 딸",
388392
base_question="오늘 뭐 했어?",
389393
base_answer="친구랑 놀았어요",
390394
answered_at=datetime(2026, 1, 20, 14, 30, 0),
@@ -400,9 +404,7 @@ async def test_max_regeneration_limit(
400404
assert output.metadata["similarity_warning"] is True
401405

402406
@pytest.mark.asyncio
403-
async def test_no_regeneration_when_unique(
404-
self, mock_vector_store, mock_question_generator
405-
):
407+
async def test_no_regeneration_when_unique(self, mock_vector_store, mock_question_generator):
406408
"""[RED] 처음부터 고유하면 재생성 없음"""
407409
from app.application.use_cases.generate_personal_question import (
408410
GeneratePersonalQuestionInput,
@@ -420,6 +422,7 @@ async def test_no_regeneration_when_unique(
420422
input_dto = GeneratePersonalQuestionInput(
421423
family_id="family-1",
422424
member_id="member-10",
425+
role_label="첫째 딸",
423426
base_question="오늘 뭐 했어?",
424427
base_answer="친구랑 놀았어요",
425428
answered_at=datetime(2026, 1, 20, 14, 30, 0),
@@ -486,9 +489,7 @@ def mock_question_generator(self):
486489
return mock
487490

488491
@pytest.mark.asyncio
489-
async def test_family_recent_question_success(
490-
self, mock_vector_store, mock_question_generator
491-
):
492+
async def test_family_recent_question_success(self, mock_vector_store, mock_question_generator):
492493
"""[RED] 가족 최근 질문 기반 생성 - 성공 케이스"""
493494
# Given
494495
from app.application.dto.question_dto import (
@@ -566,9 +567,7 @@ async def test_family_recent_question_regenerate_on_high_similarity(
566567
assert output.metadata["regeneration_count"] == 1
567568

568569
@pytest.mark.asyncio
569-
async def test_family_recent_question_empty_context(
570-
self, mock_question_generator
571-
):
570+
async def test_family_recent_question_empty_context(self, mock_question_generator):
572571
"""[RED] 최근 질문이 없어도 생성 가능"""
573572
from app.application.dto.question_dto import FamilyRecentQuestionInput
574573
from app.application.use_cases.family_recent_question import (
@@ -609,6 +608,7 @@ def test_generate_personal_question_input_dto(self):
609608
input_dto = GeneratePersonalQuestionInput(
610609
family_id="family-1",
611610
member_id="member-10",
611+
role_label="첫째 딸",
612612
base_question="테스트",
613613
base_answer="테스트",
614614
answered_at=datetime.now(),

0 commit comments

Comments
 (0)