Skip to content

Conversation

@hyeonda02
Copy link
Member

@hyeonda02 hyeonda02 commented Aug 19, 2025

관련 이슈

#36

작업한 내용

1. 응답 DTO 통합 관리, Clova API 호출시 사용되는 request, response DTO 통합

  • 기존에 개별 클래스로 관리되던 응답 DTO들을 ChatResponse 내부 static 클래스로 통합하였습니다.
    (관리 포인트를 줄이고 컨버터를 통한 DTO 변환 로직의 일관성을 확보하기 위함입니다.)
  • 또한 추천 질문 생성, 응답 생성 시(clova api호출) 사용되는 request, response DTO가 중복되는 것 같아 제거하였습니다.
    (질문 추천, 응답 생성 때문에 일부로 나누신거 같은데, 보니까 DTO의 필드값이 전부 똑같기 때문에 제거하는게 코드 가독성을 높이는 방향인것 같습니다!)

2. 챗봇 질문하기 API 개선

  • 컨트롤러에 @validated 어노테이션을 추가하고, 요청 DTO(질문DTO)에 @NotNull 제약 조건을 적용하여 입력값 유효성을 검증하도록 수정했습니다.
  • Clova 응답 스키마에 대해 서비스에서 NPE 가드를 추가하였습니다.
  • 예외 처리 범위를 외부 API 호출(Naver Clova) 및 응답 후처리 단계로 한정하였습니다.

    (예외 발생 지점을 명확히 추적하고, 불필요한 예외 래핑을 줄이기 위함입니다.. Dto를 생성하는 부분에서는 예외가 크게 발생하지 않기 때문에 최대한 외부 API를 호출하는 지점과, 응답값을 후처리하는 부분들 위주로 try-catch를 달았습니다.)

3. 채팅 로그 조회 API 개선

  • 기존에는 reportRepository.findById(...)를 통해 Report 객체를 조회했으나, 실제로는 사용하지 않아 불필요한 엔티티 로딩이 발생했습니다.→ existsById(...)로 변경하여 존재 여부만 확인하도록 리팩토링하였습니다.
  • 단순 DB 조회 및 변환 로직에 불필요하게 넓은 try-catch 블록이 적용되어 있던 부분을 제거했습니다.

    (해당 서비스 로직에서 발생 가능한 예외는 전역 예외 처리(@ControllerAdvice)를 통해 일관되게 관리되고 있기 때문입니다.)

4. 추천 질문 조회 API 개선

  • 리포트 조회, 요청 객체 생성 등 안정적인 구간은 글로벌 예외 처리에 위임하고,
예외 가능성이 높은 Clova API 호출 및 응답 파싱 과정만 별도의 try-catch로 감쌌습니다. (사실 2,3번에서 진행했던 작업과 같은 의미입니다!)
  • Clova 응답 스키마에 대해 서비스에서 NPE 가드를 추가하였습니다.

5. Clova 연동 구조 분리 (요청 생성은 converter에 HTTP 호출은 ClovaApiClient에)

가장 크게 변경된 부분입니다!

  • converter.ClovaApiConverter는 요청 생성 전담(프롬프트·하이퍼파라미터·messages 빌드)으로 역할 축소을 축소하였습니다.
  • converter.ClovaApiConverter에서 하이퍼파라미터(예: topP, topK, maxTokens 등)를 static final 상수로 추출하여 프리셋으로 관리했습니다.
  • infrastructure.ClovaApiClient를 도입하여 HTTP 호출만하도록 하였습니다(헤더/직렬화/응답 수신/예외 매핑).
  • 서비스에서도 ClovaApiConverter를 이용해 요청을 생성하고, ClovaApiClient에서 요청을 호출하는 식으로 로직을 변경하였습니다.

6. 메시지 후처리/JSON 파싱 리팩터링

  • ChatMessageUtil → ChatMessageConverter로 개명 및 converter 패키지로 이동시켰습니다.

    (문자열을 정리하는 역할을 수행하고 있기에 util보다는 converter 네이밍이 어울린다고 판단했습니다. )

PR Point 및 참고사항, 스크린샷

본문이 너무 긴데.. 정리하자면
최대한 기존 서비스 로직/주석 최대 유지했습니다.
try-catch 범위를 축소(외부 호출/후처리)했고
응답 DTO를 ChatResponse 내부 클래스로 통합, 중복 DTO 제거를 진행했습니다.

아래 부분들 위주로 확인 부탁드리겠습니다!

  1. 가장 큰 변경은 요청 본문 생성 , Clova API 호출 분리입니다. 아래 두 클래스 위주로 봐주시면 좋을 것 같습니다..!
    ClovaApiConverter = 요청 생성(프롬프트/하이퍼파라미터 세팅)
    ClovaApiClient = 실제 HTTP 호출

  2. Clova 요청 파라미터 값 동일한지 확인 부탁드립니다.
    topP=0.8, topK=0, temperature=0.5, repeatPenalty=5.0,
    maxTokens(채팅=512 / 추천=100), includeAiFilters=true, seed=0, stopBefore=[]

  3. 프론트로 나가는 응답 스키마/필드값 변화 없음 확인

가능한 기존 값과 동일하게 맞췄지만 놓친 부분이 있을 수 있습니다ㅠㅜ
숫자 파라미터나 응답 필드에서 달라진 점이 보이면 코멘트 부탁드립니다!
PR 본문이 길어져 죄송합니다 🙇‍♂️ 조금만 더 화이팅입니다!!

변경된 패키지 구조입니다.
스크린샷 2025-08-20 오전 3 01 45

그리고 해당 API에 대해 정상 작동하는 것을 확인했습니다!
아래 사진은 질문 2개 추천 하는 API 를 호출했을 경우의 응답값입니다.
스크린샷 2025-08-20 오전 3 16 56

채팅 로그를 확인하는 api를 호출했을 경우의 응답값입니다.

스크린샷 2025-08-20 오전 3 17 19

그리고 챗봇에게 질문하는 api를 호출했을 경우의 응답값입니다.
스크린샷 2025-08-20 오전 3 18 33
스크린샷 2025-08-20 오전 3 20 14

- controller에서 불필요한 주석을 제거하였습니다.
- ChatServiceImpl에서 외부 API 호출 부분만 try/catch로 감싸주었습니다.
- 컨버터에 DTO 생성로직을 모아 중복을 제거하고, 일관성을 확보해주었습니다.
- 전반적으로 Controller와 service, converter의 역할을 분리하였습니다.
- 중복되는 DTO 제거
- Clova 응답 스키마에 대해 서비스에서 NPE 가드 추가
- 패키지 구조 정리
@hyeonda02 hyeonda02 linked an issue Aug 19, 2025 that may be closed by this pull request
3 tasks
@hyeonda02 hyeonda02 requested a review from hardwoong August 19, 2025 18:44
@hyeonda02 hyeonda02 self-assigned this Aug 19, 2025
@hyeonda02 hyeonda02 added the ♻️ refactor refactor label Aug 19, 2025
@github-actions
Copy link

Test Results

1 tests   1 ✅  0s ⏱️
1 suites  0 💤
1 files    0 ❌

Results for commit 5b8bf02.

@hardwoong
Copy link
Member

꼼꼼하게 봐주셔서 너무 감사합니다.. 급하게 돌아가게 하느라 이정도로 디테일한 캐치는 미처 신경쓰지 못했네요ㅜㅜ 덕분에 많이 배워서 감사할 따름입니다.. 고생많으셨어용!!

@hyeonda02
Copy link
Member Author

꼼꼼하게 봐주셔서 너무 감사합니다.. 급하게 돌아가게 하느라 이정도로 디테일한 캐치는 미처 신경쓰지 못했네요ㅜㅜ 덕분에 많이 배워서 감사할 따름입니다.. 고생많으셨어용!!

크게 한건 없는데 머쓱하네요;;
해당 pr 머지하고 최종 큐에이 진행하겠습니다!!

@hyeonda02 hyeonda02 merged commit 586b41e into develop Aug 20, 2025
3 checks passed
@hyeonda02 hyeonda02 deleted the refact/36-chat-api branch August 20, 2025 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Refact : 챗봇 관련 api 리팩토링

3 participants