[Springboot] 스프링부트로 DALL-E API 호출하기

비타민·2023년 10월 15일
1

프로젝트를 진행하는 과정에서, 사용자가 원하는 이미지를 생성하여 출력하는 기능을 구현하기 위해 OpenAI사의 DALL-E API를 유료 결제를 통해 사용하게 되었습니다.
(DALL-E: OpenAI에서 개발한 생성형 이미지 생성형 인공지능)

이번 포스팅에서는 Springboot로 OpenAI사의 DALL-E API를 호출하는 코드를 다루고자합니다. Springboot로 DALL-E API를 호출하는 레퍼런스가 적어 어려움이 있었는데, 특히 한국어로는 정말 많이 없는 것 같아 이렇게 포스트를 작성하게 되었습니다! ໒(⊙ᴗ⊙)७✎▤
아무쪼록 많은 분들께 도움이 되었으면 좋겠는 마음으로 포스팅을 시작하겠습니다.

설정파일 수정

: 제일 중요한 부분이라고 볼 수 있다! ( ・ω・)ノ

build.gradle

build.gradle의 dependencies 부분에 아래 라인들을 추가해주었다.

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

implementation 'com.theokanning.openai-gpt3-java:client:0.10.0'
implementation 'com.theokanning.openai-gpt3-java:service:0.10.0'

implementation 'com.stripe:stripe-java:22.10.0'
implementation 'javax.xml.bind:jaxb-api:2.3.0'
implementation 'sh.platform:config:2.2.2'

application.properties

: 발급받은 api key값을 application.properties에 추가해주었다.

openai.key={값}

코드 구현

AIService.java

import com.theokanning.openai.image.CreateImageRequest;
import com.theokanning.openai.service.OpenAiService;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AIService {

    @Resource(name = "getOpenAiService")
    private final OpenAiService openAiService;

    public String generatePicture(String prompt) {
        CreateImageRequest createImageRequest = CreateImageRequest.builder()
                .prompt(prompt)
                .size("512x512")
                .n(1)
                .build();

        String url = openAiService.createImage(createImageRequest).getData().get(0).getUrl();
        return url;
    }
}

DALL-E의 API 문서를 읽어보면, API가 반환하는 이미지의 형태(ResponseFormat)을 총 2가지, URL 또는 Base64 data로 설정할 수 있다는 것을 확인할 수 있다. Default로는 URL이 반환된다. (주의: URL은 1시간 후 만료된다.)

참고: https://platform.openai.com/docs/guides/images/usage

ServicesConfig.java

import com.theokanning.openai.service.OpenAiService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class ServicesConfig {
    @Value("${openai.key}")
    private String apiKey;


    @Bean
    public OpenAiService getOpenAiService() {
        return new OpenAiService(apiKey, Duration.ofSeconds(30));
    }
}

맨 처음 application.properties에 정의한 openai.key를 Config 파일에도 선언해주었다!

Controller.java

: 요청 주소는 "/image"로 하여, 아래와 같은 Controller 코드를 작성하였다.

@PostMapping("/image")
public ResponseEntity<?> generateImage(@RequestBody String prompt) {
    return new ResponseEntity<>(aiService.generatePicture(prompt), HttpStatus.OK);
}

(위의 이미지 참고) DALL-E API 문서를 확인하면 "Required"되는 항목인 String 형태의 prompt 변수가 있는 것을 알 수 있다. 이를 RequestBody로 담고, 아까 AIService.java에서 작성한 generatePicture() 함수를 호출하여 url인 String 값을 반환하는 API를 위한 Controller 코드를 위와 같이 작성하였다.

정리

결론적으로 이번 포스팅에서 구현한 DALL-E API는

"/image"라는 path로 아래의 RequestBody를 담아 POST 호출하면,

RequestBody:

{
”prompt” :”String”
}

ResponseBody
JSON 객체가 아닌, url의 String 값을 반환한다.

번외

ResponseFormat: Base64 Data

:만약 API 호출시 반환값을 url이 아닌 Base64 Data로 바꾸고 싶으시다면! 아래 코드를 참고하세요! ʕo•ᴥ•ʔ✎

AIService.java

public String generatePicture(String prompt) {
    CreateImageRequest createImageRequest = CreateImageRequest.builder()
            .prompt(prompt)
            .size("512x512")
            .n(1)
            .responseFormat("b64_json") //b64_json 포맷으로의 반환을 위해 이 코드 추가!
            .build();


    //이미지 URL 대신 base64 data를 리턴하는 것으로 변경!
    String b64 = openAiService.createImage(createImageRequest).getData().get(0).getB64Json();
    return b64;
}

차이점은
1. RequestBody에 responseFormat을 b64_json으로 설정해줘야한다.
2. 따라서, .getData().get(0).getUrl(); 이 아닌, .getData().get(0).getB64Json();의 형태로 값을 가져와야한다.

P.S. 이 포스트는 구현 직후에 작성한 것이 아닌, 기억을 더듬으며 회고한 기록이라 중간중간 빠뜨린 부분이 있을 수도 있습니다! 혹시 따라하시다가 오류/문제가 발생하거나, 도움이 필요하시면 언제든 댓글 부탁드립니다!!

profile
☁️ 백엔드 개발, 클라우드, AI 분야에 관심이 많아요 ☁️

0개의 댓글

관련 채용 정보