최근 어떤 블로그를 봤는데, 그 블로그에는 대략적인 내용을 요약해주는 ChatGPT 영역이 따로 있는 것을 보았습니다.
(참고한 주소: https://devocean.sk.com/blog/techBoardDetail.do?ID=165522&boardType=techBlog)
이걸 보고 제 블로그에도 적용하면 좋겠다는 생각이 들었습니다.
이 기능을 넣기 위해서는 다음과 같은 준비가 필요했습니다:

두 가지 방안을 고려해 보았습니다.
방안 1: 사용자가 게시글을 조회할 때마다 OpenAI API를 호출한다.
이 방안은 UX 측면에서 좋지 않을 것 같았습니다. 이유는 매번 다른 요약본이 표시될 가능성이 있고, 매번 요약하는 데 걸리는 시간이 사용자를 불편하게 만들 것이라 생각했습니다. 또한 OpenAI API를 반복적으로 호출해야 하므로 비용도 부담스러워서 이 방안은 기각되었습니다.
방안 2: 게시글을 생성 및 수정할 때 OpenAI API를 호출하고, 받은 응답을 테이블에 저장한다.
이 방안은 OpenAI API 호출이 게시글 생성 및 수정 시에만 이루어지기 때문에 비용 절감에 유리하고, 이미 저장된 요약본을 제공하므로 빠른 요약 정보 조회를 위해 사용자 UX도 향상시킬 수 있습니다. 단, 문제는 admin 페이지에서 게시글을 생성 또는 수정할 때 OpenAI 응답 시간이 길어지면 Timeout으로 인해 500 에러가 발생할 수 있다는 점입니다.
이를 해결하기 위해 Celery Task를 사용하여 비동기 처리로 구현할 예정입니다.
아래는 흐름도입니다.

이 방법으로 admin 페이지에서는 문제없이 게시글이 최신화될 것입니다. 그러나 비동기 처리를 하면 사용자는 즉시 요약본을 확인할 수 없습니다. 이를 해결하기 위해 다음과 같은 흐름을 생각했습니다.
게시글을 참조하고 있는 요약 테이블을 만들 것입니다.

요약 테이블을 1:N 관계로 생성하고, 아래와 같은 필드들을 포함할 것입니다:
게시글을 생성하거나 수정하면 동시에 요약 테이블이 생성되고, 진행 상태가 PROCESSING으로 설정됩니다. OpenAI API로부터 요약된 정보가 전달되면 요약 테이블을 업데이트하고, 상태를 DONE으로 변경합니다.
게시글 조회 시 요약 테이블의 마지막 상태가 PROCESSING이라면 "아직 요약 중이에요~"라는 문구와 함께 로딩 이미지를 보여주고, 일정 간격으로 API를 폴링하여 DONE 상태일 경우 요약본을 최신화합니다.
특수한 상황에서 FAILED 상태가 되면, 예로 PROCESSING 상태가 5분 이상 유지된 경우 CRONJOB을 통해 FAILED로 전환합니다. 이때는 "요약을 할 수 없어요~"라는 문구를 표시하고, 저에게 알림 메일을 보내 모니터링할 수 있도록 할 계획입니다.
이러한 계획을 바탕으로 작업을 시작해 보겠습니다.