### 📌 Description 답변(rag_responses)과 출처(response_citations)를 하나의 API 응답으로 합쳐 `POST /search`에서 최종 반환한다. ### ✅ To-do - [ ] `RagFacade` 신설 (SearchFacade와 별도 트랜잭션으로 분리) - [ ] `SearchController`에서 `searchFacade.search()` 커밋 후 `ragFacade.generate(...)` 순차 호출 - [ ] SearchResultCommandService.saveAll()을 List<SearchResult> 반환으로 변경, response_citations.search_result_id 채우기 (Issue 4에서 미룬 부분) - [ ] NO_CONTEXT(검색 결과 0건) 처리: status=SUCCESS, answerText 고정 문구, LLM 호출 생략, citations 빈 배열 - [ ] `SearchResponse`에 `answer`/`citations` 필드 추가 (기존 `results` 필드 유지) - [ ] e2e 확인: `POST /search` 응답에 `results` + `answer` + `citations` 모두 포함되는지 ### 📒 기타 LLM 호출 중 DB 커넥션을 오래 물고 있지 않도록 트랜잭션 분리가 핵심. 기존 `results` 필드는 하위 호환을 위해 유지. search_result_id는 Issue 4에서 nullable로 비워뒀던 부분을 이번 이슈에서 마저 채운다.
📌 Description
답변(rag_responses)과 출처(response_citations)를 하나의 API 응답으로 합쳐
POST /search에서 최종 반환한다.✅ To-do
RagFacade신설 (SearchFacade와 별도 트랜잭션으로 분리)SearchController에서searchFacade.search()커밋 후ragFacade.generate(...)순차 호출response_citations.search_result_id 채우기 (Issue 4에서 미룬 부분)
SearchResponse에answer/citations필드 추가 (기존results필드 유지)POST /search응답에results+answer+citations모두 포함되는지📒 기타
LLM 호출 중 DB 커넥션을 오래 물고 있지 않도록 트랜잭션 분리가 핵심. 기존
results필드는 하위 호환을 위해 유지. search_result_id는 Issue 4에서 nullable로 비워뒀던 부분을 이번 이슈에서 마저 채운다.