Spring Boot + Gemini API 구현

송형근·2024년 9월 11일
0

TIL

목록 보기
34/43
post-thumbnail

프로젝트에서 Gemini API를 이용해 서비스에 적용해야하는 요건이 있음

API Key 발급

DTO 생성

  • RequestDto
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class GeminiReqDto {
    
        private List<Content> contents;
    
        @Data
        public class Content{
    
            private List<Part> parts;
    
            public Content(String text){
                parts = new ArrayList<>();
                Part part = new Part(text);
                parts.add(part);
            }
    
            @Data
            @NoArgsConstructor
            @AllArgsConstructor
            public class Part{
                private String text;
            }
        }
    
        public void createGeminiReqDto(String text){
            this.contents = new ArrayList<>();
            Content content = new Content(text);
            contents.add(content);
        }
    }
  • ResponseDto
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class GeminiResDto {
        private List<Candidate> candidates;
    
        @Data
        public static class Candidate {
            private Content content;
            private String finishReason;
        }
    
        @Data
        public static class Content {
            private List<Parts> parts;
            private String role;
    
        }
    
        @Data
        public static class Parts {
            private String text;
        }
    }
    

RestTemplate Bean 생성

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate geminiRestTemplate(){
        return new RestTemplate();
    }
}

Gemini 요청 로직 작성

public ProductDescriptionResDto getAIDescription(String productName){
        String geminiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key="
                + "{GEMINI-API-KEY}";
        String requestText = productName + "에 대한 상품 설명을 50자 이내로 작성해줘.";
        GeminiReqDto request = new GeminiReqDto();
        request.createGeminiReqDto(requestText);
        String description = "";
        try{
            GeminiResDto response = restTemplate.postForObject(geminiURL, request, GeminiResDto.class);
            description = response.getCandidates().get(0).getContent().getParts().get(0).getText();
        }catch (Exception e){
            log.error("INTERNAL SERVER ERROR");
            throw new CoreApiException(ErrorType.DEFAULT_ERROR);
        }

        return new ProductDescriptionResDto(description);
    }
  • geminiURL : {GEMINI-API-KEY} 부분에 발급받은 API Key를 넣어서 사용하면 됨
  • requestText : 답변이 너무 길어지는 것을 방지하기 위해 50자 이내 라는 조건을 추가
  • postForObject : RestTemplate의 Post 요청 메서드

P.S.

  • 무료 요청량이 제한이 있다보니 Key 관리에 주의를 기울여야 함
  • 캐싱이나 DB 저장을 통해 요청 횟수를 줄일 수 있음
profile
기록을 남겨보자

0개의 댓글