구현하고자 하는 기능 설명
해당 기능에서 SpringBoot의 역할은 React와 FastAPI의 중간다리로 요청과 응답을 전달해주는 것이다.
기본 웹의 JSON 리턴 값을 생각한 나머지 FastAPI에서 보내주는, 정확히는 OpenAI API의 리턴이 일반적인 JSON 리턴값처럼 조작할 수 없다는 사실을 간과했다.
OpenAI API의 응답은 단순 문자열(String) 형태로 온다.
ResponseBody
{
"isSuccess" : true,
"code" : 200,
"message" : "요청에 성공하셨습니다",
"result" : {
"chat_id" : 1,
"created_at" : "2024-10-26 3:40:23",
"chatResponse" : "챗봇 응답입니다.",
"song_info" : {
"song_id": 1,
"album_title" : "Whiplash - The 5th Mini Album",
"artist" : "aespa",
"songTitle" : "whiplash",
"genre" : "댄스, R&B/Soul, 록/메탈"
}
},
}
ResponseBody
{
"isSuccess" : true,
"code" : 200,
"message" : "요청에 성공하셨습니다",
"result" : {
"chatResponse" : "챗봇 응답입니다."
},
}
방법1 . 프롬프팅으로 song_info를 응답에 포함하는 방법
chatResponse를 다음과 같은 형태로 받는 것이다.
어쨌든 하나의 문자열로 받으니 가능할 것 같다.
챗봇 응답입니다. 노래 정보: {"song_id": 1, "album_title": "Whiplash - The 5th Mini Album", "artist": "aespa", "songTitle": "whiplash", "genre": "댄스, R&B/Soul, 록/메탈"}
방법2. song_info만 추출하는 별도의 API 구현
별도의 API로 분리해버리면 chat 도메인에서는 chat에 대한 응답만, song 도메인에서는 song에 대한 정보만 처리할 수 있으니 깔끔하다고 생각한다.
응답을 요청할 때 API를 2개 사용해 네트워크 처리는 증가할 수 있지만, 미미한 수준이라고 판단했다.
우리 프로젝트에서 song_info를 어떻게 활용할 것인지 고려해보았을 때 방법2가 더 적합하다고 판단된다.
방법1처럼 song_info를 추출한다고 해도 어쨌든 별도의 도메인에 song에 대한 정보를 저장해야 하기 때문에 코드량은 비슷할 뿐더러, 확장성이나 유지보수측에서도 방법2가 더 효율적이라고 생각된다.