Repository navigation
feat: AI 톤 교정 API (#65 3/3) - #87
Conversation
There was a problem hiding this comment.
PR이 나뉘어 있어서 #86 서비스 코드까지 같이 보고 확인했습니다 !
PR 본문에 비동기 관련 이슈 별도로 다룬다고 작성해 두어서 큰 문제는 없을 것 같습니다 !
제가 알고 있는 선에서는 AI 톤 교정 요청 시 동기 호출로 인한 톰캣 워커 스레드 블록 부분 문제는 동시 호출 상한을 걸어주면 될 것 같기도 하구, 연결 끊김 부분은 홍준님이 말씀 주신 것처럼 알 수가 없다 보니 SSE 방식으로 처리해도 좋을 것 같아서 간단히 제 의견 적어 봅니다
응답 필드와 keyInfoWarning null 처리도 명세대로 나가는 것 확인했습니다 !
아 그리구 확인하면서 PR 왔다 갔다 보기가 조금 힘들었는데, 기능 하나는 400줄을 좀 넘더라도 PR 하나로 묶고, 스택은 서로 다른 기능이 공통 부분을 같이 써야 할 때만 쓰면 어떨까 싶어서 한번 얘기해 보면 좋을 것 같은 생각입니다 !
고생하셨습니다아 🙇♂️
꼼꼼하게 봐 주셔서 감사합니다! 비동기 관련 의견은 후속 이슈 #100에 같이 정리해 뒀어요. 동시 호출 상한으로 스레드 점유를 막는 방향과 서버 전송 이벤트로 연결 끊김을 감지하는 방향 둘 다 검토해 보겠습니다. PR 나누는 방식도 말씀 주신 게 맞는 것 같아요. 이번 건은 한 이슈를 이어서 작업한 거라 결국 #86까지 같이 보셔야 했어서, 쪼갠 의미가 크지 않았던 것 같습니다. 앞으로는 기능 하나는 조금 길어도 PR 하나로 올리고, 여러 기능이 공통 부분을 같이 쓸 때만 쌓는 방식으로 가도록 하겠습니다! |
관련 이슈
작업 내용
① #85 → ② 서비스 #86 위에 쌓았습니다. ②가 병합되면 기준 브랜치를 develop으로 바꿉니다.
correct()의 catch 한 곳에서만 반환해 이중 반환 없음. 명세 22번 비고·버전 표 갱신POST /api/v1/ai/tone-corrections(AiToneCorrectionController,@LoginUser Long userId)AiSuccessCode.TONE_CORRECTED(AI200_1, 200, "톤 교정에 성공했습니다.")AiToneCorrectRequest(style, text): 필드 순서 style → text (검증 에러는 첫 번째 하나만). style은 문자열로 받아@ValidToneStyle로 검사AiToneCorrectResponse:correctedText,style,keyInfoWarning,usagekeyInfoWarning: 차이가 없으면 null, 있으면 명세 문구 +missingValues·addedValuesusage.resetAt은 전역 직렬화 설정으로+09:00toString은 원문·결과 대신 길이와 개수만 보임 (스프링 디버그 로그가 요청 본문 객체를toString으로 찍음)CLAUDE.md: 출력 토큰 상한 4000 → 6000docs/s1-api-spec.md22번 비고: 출력 토큰 상한 4,000 → 6,000, 처리 중 이탈 문구 변경. 버전 표에 한 줄 추가명세와 달라진 점
이 PR에서 명세를 함께 고침
테스트
통합 테스트 (실제 필터·MySQL, 언어 모델은 가짜 구현을 감싼 스파이로 실패를 만듦, 트랜잭션 없이 실행)
AI200_1, 명세 순서의 필드, 선점 후 사용량(1회 → 남은 4), 23:59:30 요청의resetAt이2026-10-12T00:00:00+09:00,Cache-Control: no-storekeyInfoWarning, 횟수는 차감된 채AI429_1, 언어 모델을 부르지 않음AI422_1, 외부 오류AI502_1, 시간 초과AI504_1, 각각 사용량이 요청 전 값으로 돌아감ESSAY·소문자·없는 값 → AI400_1 (COMMON400_1아님), 둘 다 없으면 AI400_1, text 없음·공백만 → AI400_2, 3000자 통과·3001자 AI400_3. 검증 실패는 사용량 행이 생기지 않음USER404_1, 사용량 행 없음 (500 아님)COMMON401_1no-store,result는 null원문·결과는 저장하는 테이블·컬럼이 없음 (코드 확인)
결정하지 않고 둔 것 (#65 "결정 필요")
**: 서버에서 지우지 않음. [feat] AI 톤 교정 문체 열거형 · 문체별 지시문 #64 최종 확인에서 3000자 보고/공문 5회 중 1회확인 체크리스트
./gradlew build통과global공통 코드를 바꿨다면 디스코드에 공유함 (변경 없음)리뷰어에게
[중점] 처리 중 이탈 명세 변경(프론트 공유 필요), 응답 필드와
keyInfoWarningnull 처리