티스토리 뷰

반응형

2026.05.08 - [AI] - OpenAI API 연동 - STEP1) 연동하기 기초

OpenAI API 연동의 STEP 2는 전 단계에서 받은 원시 JSON 응답을 다듬어 실제 텍스트만 추출(Parsing)하고, 예외 상황을 처리하여 프로그램의 안정성을 높이는 단계입니다.

실무에서 가장 많이 사용하는 Jackson 라이브러리를 활용한 데이터 구조화 방법을 자세히 안내해 드릴게요.


STEP 2: JSON 파싱 및 구조화된 데이터 처리

1. JSON 구조 이해하기

OpenAI의 응답은 꽤 복잡한 계층 구조를 가지고 있습니다. 우리가 필요한 답변은 보통 choices[0].message.content 안에 들어 있습니다.


2. Jackson을 이용한 데이터 추출 예제

단순히 문자열로 출력하는 것이 아니라, Java 객체로 변환하여 필요한 데이터만 쏙 뽑아내는 과정입니다.

Java
 
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class OpenAI_Step2 {
    private static final String API_KEY = "YOUR_API_KEY";

    public static void main(String[] args) {
        String prompt = "Java 개발자로서 성장하기 위한 로드맵을 짧게 요약해줘.";
        
        try {
            String responseBody = callOpenAI(prompt);
            
            // Jackson ObjectMapper 생성
            ObjectMapper objectMapper = new ObjectMapper();
            
            // JSON 트리 구조로 읽기
            JsonNode rootNode = objectMapper.readTree(responseBody);
            
            // 실제 답변 텍스트 추출 (choices -> 0번째 -> message -> content)
            String answer = rootNode.path("choices").get(0)
                                    .path("message").path("content").asText();
            
            System.out.println("\n=== GPT의 답변 ===");
            System.out.println(answer);

        } catch (Exception e) {
            System.err.println("오류 발생: " + e.getMessage());
        }
    }

    public static String callOpenAI(String prompt) throws Exception {
        String jsonPayload = String.format("""
            {
                "model": "gpt-3.5-turbo",
                "messages": [{"role": "user", "content": "%s"}]
            }
            """, prompt);

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.openai.com/v1/chat/completions"))
            .header("Content-Type", "application/json")
            .header("Authorization", "Bearer " + API_KEY)
            .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // HTTP 상태 코드 확인 (Error Handling)
        if (response.statusCode() != 200) {
            throw new RuntimeException("API 호출 실패! 상태코드: " + response.statusCode() + " 응답: " + response.body());
        }

        return response.body();
    }
}

3. 주요 개선 사항 (안정성 강화)

A. 에러 핸들링 (Error Codes)

API 연동 시 발생할 수 있는 주요 에러를 사전에 체크해야 합니다.

  • 401 (Unauthorized): API 키가 잘못되었거나 만료됨.
  • 429 (Too Many Requests): 무료 할당량을 다 썼거나 호출 속도가 너무 빠름.
  • 500 (Server Error): OpenAI 서버 자체의 일시적인 오류.

B. 보안 강화 (Environment Variables)

코드에 API 키를 직접 적는 것은 매우 위험합니다. 시스템 환경 변수를 사용하세요.

Java
 
// OS 환경 변수에서 키를 읽어옴
private static final String API_KEY = System.getenv("OPENAI_KEY");

4. 요약: STEP 2에서 배운 것

  1. JSON 파싱: 복잡한 응답 뭉치에서 Jackson을 이용해 필요한 텍스트만 추출했습니다.
  2. 예외 처리: statusCode를 체크하여 서버 오류나 인증 오류를 감지할 수 있게 되었습니다.
  3. 동적 입력: 고정된 질문이 아니라 변수를 통해 다양한 질문을 던질 수 있는 구조를 만들었습니다.

2026.05.08 - [AI] - OpenAI API 연동 - STEP3) 대화 문맥 유지

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형