2024년 2월 20일에 작성되었고, 블로그를 이전하며 옮겨온 포스트입니다.
여기에서 원본을 확인할 수 있습니다.
들어가며
OpenAI의 ChatGPT는 현재 전 세계에서 가장 주목받고 있는 기술이다. ChatGPT에 대한 이해가 깊어지면서, 이를 활용한 API 개발에 대한 생각이 점점 커졌다. 또한, 최근에 릴리즈된 Spring Boot 3.0을 아직 제대로 활용해보지 않았던 점을 고려하여, 이번 프로젝트는 Spring Boot 3.0 기반으로 진행하기로 결정했다.
ChatGPT API 호출
ChatGPT 공식 문서에 따라 Spring Boot에서 본격적으로 활용하기 전 Postman을 통해 API 호출을 먼저 해보았다. 이 글을 쓰는 오늘(2024년 2월 19일) 기준, GPT 모델에 따른 엔드포인트는 다음과 같다.
| Model Family | Endpoint |
| gpt-4, gpt-4-turbo-preview,gpt-3.5-turbo | https://api.openai.com/v1/chat/completions |
| gpt-3.5-turbo-instruct, babbage-002,davinci-002 | https://api.openai.com/v1/completions |
Header
API 호출 시 헤더에 포함되는 항목들이다. $OPENAI_API_KEY 부분에는 ChatGPT API Keys에서 발급받은 Secret Key를 입력해 주면 된다.
Content-Type: application/json
Authorization: Bearer $OPENAI_API_KEY
Body
API 호출 시 바디에 포함되는 항목 들이다. model에는 원하는 모델을 선택하여 입력해 주면 된다.
그리고 messages 부분에 들어갈 항목에 대해서 자세히 알아봐야 할 필요가 있다. 현재 아래 예제를 보면, 한 요청에 2가지 메시지를 전달하고 있고, 각각 역할이 다른 것을 볼 수 있다. 하나는 system 하나는 user이다.
이 부분이 얼마 전 업데이트 된 부분이다. 단순하게 메시지만 전달하는 것이 아닌, 부가적인 요소를 삽입하여 더 구체적이고 이상적인 답변을 받아볼 수 있도록 하는 것이다.
role에 들어갈 수 있는 값과 간단한 설명은 다음과 같다.
- system
- 어떻게 행동(답변)할 지 지정하는 역할
- 주로 상황을 설정한다. → Act as a ____
- user
- 일반적으로 질문하는 역할
- assistant
- 보조자 역할. 이전 대화를 저장하고, 대화의 연속성을 지정하기 위해 사용
더 자세한 내용은 ChatGPT Chat Completions API 문서에서 확인할 수 있다.
{
"model": "gpt-3.5-turbo-0125",
"response_format": { "type": "json_object" },
"messages": [
{
"role": "system",
"content": "You are a helpful assistant designed to output JSON."
},
{
"role": "user",
"content": "Who won the world series in 2020?"
}
]
}
위 Endpoint, Header, Body 값을 가지고 API를 호출하면 다음과 같은 결과 값을 얻을 수 있다.
{
"id": "chatcmpl-8tqujCfSEroJwUPlY6ABf0T8c1NgD",
"object": "chat.completion",
"created": 1708322133,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\n \"error\": \"There was no World Series held in 2020 due to the COVID-19 pandemic.\"\n}"
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 31,
"completion_tokens": 25,
"total_tokens": 56
},
"system_fingerprint": "fp_6dd124df95"
}
그러면 Response 값에서 choices → content 부분에 아래와 같이 GPT 3.5의 답변이 표시됨을 확인할 수 있고, API를 정상적으로 호출할 수 있음을 확인할 수 있다.
만약에 정상적으로 답변이 표시되지 않는다면 맨 아래 챕터 오류 해결 부분을 참고하기 바란다.
There was no World Series held in 2020 due to the COVID-19 pandemic.
GPT 가격 정책
하지만, 이런 식으로 API를 호출하여 GPT 모델을 사용하는 것은 비용이 부과된다. 위 Response 값에서 usage 부분을 다시 한 번 보자.
"usage": {
"prompt_tokens": 31,
"completion_tokens": 25,
"total_tokens": 56
},
prompt_tokens 즉, 질문(Input)에는 31 토큰이 사용되었고, completion_tokens 즉, 답변에는 25 토큰이 사용되었다. 이제, ChatGPT의 가격 정책에 대해 확인해 보자.

필자가 이 글에서 사용한 GPT 모델은 GPT-3.5 Turbo(gpt-3.5-turbo-0125) 모델이다. 이 모델의 가격 정책을 확인해 보면, Input(질문)은 1,000 토큰 당 0.0005$ , 한화 1원이 부과되고, Output(답변)은 1,000 토큰 당 0.0015$, 한화 2원 정도가 부과된다. 아래 표를 참고하여 글자 수 당 토큰이 책정되는지 확인하면 좋을 것 같다.
| Language | Token |
| 영어(약 0.75 단어, 약 4자) | 1 Token |
| 한국어(1자) | 1 Token |
오류 해결
ChatGPT에서 아무런 설정도 하지 않은 채 Secret Key를 발급받고 API를 호출하니 다음과 같은 오류가 발생하였다.
{
"error": {
"message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.",
"type": "insufficient_quota",
"param": null,
"code": "insufficient_quota"
}
}
You exceeded your current quota, please check your plan and billing details. 결제 관련 정보들을 확인하라는 말인 것 같고, ChatGPT API가 유료임을 감안하여 생각해본 결과, 사전 충전된 크레딧이 없어 결제가 되지 않았던 것 같았다.

ChatGPT Billing Settings 페이지에서 카드를 등록하고, 최소 충전 크레딧인 5$를 충전했다. 그리고 나서 API 호출을 다시 시도해 보니 정상적인 결과 값을 얻을 수 있었다.
다른 오류는 ChatGPT API Errors 페이지에서 확인해 볼 수 있다.
'Backend > Java' 카테고리의 다른 글
| Spring, 테스트 코드는 왜 작성할까? (0) | 2026.08.22 |
|---|---|
| Spring Boot에서 ChatGPT 활용하기 #2: API로 GPT 응답 값 가져오기 (0) | 2026.08.22 |
| Spring Security: There is no PasswordEncoder mapped for the id "null" 오류 해결 (0) | 2026.08.22 |
| Cookie, Session, Token(JWT) 정리하기 (0) | 2026.08.22 |
| 'Spring Boot + React' 카카오 소셜 로그인 도입하기 (2) (0) | 2026.08.22 |