TIL8. AI API

2025. 2. 20. 17:22·TIL

핫걸 컨셉

AI API

 

gemini java api with spring boot 사용해보기

스프링부트를 사용하여 gemini api 사용하는 방법을 알아보자. gemini api를 google-cloud-vertexai로 이용하는 방법도 있지만, 여기서는 REST API를 통해 직접 사용해보기로 한다. gemini rest api 사용하는 방법

rudaks.tistory.com

1) 인증 키 발급

2) 사전 API 테스트

3) GeminiService

package com.sparta.tentenbackend.domain.ai.service;

import java.util.Collections;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class GeminiService {

  private final RestTemplate restTemplate;
  private final String API_KEY;
  private final String MODEL_NAME;

  public GeminiService(RestTemplate restTemplate, @Value("${gemini.api.key}") String API_KEY, @Value("${gemini.model.name}") String MODEL_NAME) {
    this.restTemplate = restTemplate;
    this.API_KEY = API_KEY;
    this.MODEL_NAME = MODEL_NAME;
  }

  public String callGeminiApi(String prompt) {
    String formattedPrompt = prompt + " (에 대한 답변을 50자 이하로 작성해주세요.)";
    String url = "https://generativelanguage.googleapis.com/v1beta/models/" + MODEL_NAME + ":generateContent?key=" + API_KEY;

    // JSON 요청 바디 생성
    Map<String, Object> requestBody = Map.of(
        "contents", Collections.singletonList(Map.of(
            "parts", Collections.singletonList(Map.of("text", formattedPrompt))
        ))
    );

    // HTTP 요청 헤더 설정
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    // HTTP 요청 객체 생성
    HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);

    // API 호출
    ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, request, Map.class);

    // 응답 파싱
    if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
      // 응답 바디에서 text만 추출
      Map<String, Object> responseBody = response.getBody();
      var candidates = responseBody.get("candidates");
      if (candidates instanceof java.util.List) {
        Map<String, Object> candidate = (Map<String, Object>) ((java.util.List) candidates).get(0);
        Map<String, Object> content = (Map<String, Object>) candidate.get("content");
        var parts = content.get("parts");
        if (parts instanceof java.util.List) {
          Map<String, String> part = (Map<String, String>) ((java.util.List) parts).get(0);
          return part.get("text"); // 'text' 값 반환
        }
      }
      throw new RuntimeException("API 응답에서 'text' 값을 찾을 수 없습니다.");
    } else {
      throw new RuntimeException("API 호출 실패: " + response.getStatusCode());
    }
  }
}

 

굳이 의존성 추가해가며 FeignClient를 쓰는 것보단 RestTemplate이 나을 것 같아서 RestTemplate으로 만들었다.

테스트해보니까 위 API 사전테스트 한 것처럼 답변이 출력되서 파싱하는 구문도 추가했다.

4) 결과

 

728x90

'TIL' 카테고리의 다른 글

TIL10. 리팩토링, 카테고리별 가게 목록 조회, soft-delete  (1) 2025.02.24
TIL9. 리뷰 검색 및 정렬, QueryDSL  (0) 2025.02.21
TIL7. S3 Bucket 적용, DTO Validation  (0) 2025.02.19
TIL6. Paging, S3 Bucket  (0) 2025.02.18
TIL5. 카테고리 API 마무리 + Review API 만들기  (2) 2025.02.17
'TIL' 카테고리의 다른 글
  • TIL10. 리팩토링, 카테고리별 가게 목록 조회, soft-delete
  • TIL9. 리뷰 검색 및 정렬, QueryDSL
  • TIL7. S3 Bucket 적용, DTO Validation
  • TIL6. Paging, S3 Bucket
hnajeahi
hnajeahi
개발 스터딩
  • hnajeahi
    hnajeahi-hub
    hnajeahi
  • 전체
    오늘
    어제
    • 전체보기 (94)
      • 개발일기 (2)
      • 코드그루 (63)
      • TIL (29)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 블로그 이사왔음!
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hnajeahi
TIL8. AI API
상단으로

티스토리툴바