OpenAI 이미지 생성
OpenAI 이미지 생성 (OpenAI Image Generation)
Spring AI는 OpenAI의 이미지 생성 모델인 DALL-E를 지원해요. 이 글에서는 API 키 설정, 자동 설정, 이미지 관련 프로퍼티, 런타임 옵션, 그리고 HTTP 클라이언트 커스터마이징까지 알아볼게요.
출처: 문서
본문
Spring AI는 OpenAI의 이미지 생성 모델인 DALL-E를 지원해요.
| __ | 2.0.0-M5 버전부터 Spring AI는 모든 OpenAI 모델을 위해 내부적으로 공식 openai-java SDK를 사용해요. 전환은 매끄러울 것으로 예상되며, OpenAI API 프로퍼티와 빌더의 기존 사용자에게는 호환성이 깨지는 변경이 없어요. 문제를 발견하면 Spring AI GitHub Issues로 알려주세요. |
|---|
Prerequisites
ChatGPT 모델에 접근하려면 OpenAI로 API 키를 만들어야 해요.
OpenAI signup page에서 계정을 만들고 API Keys page에서 토큰을 생성하세요.
Spring AI 프로젝트는 spring.ai.openai.api-key라는 구성 프로퍼티를 정의하는데, 여기에 openai.com에서 얻은 API Key 값을 설정해야 해요.
이 구성 프로퍼티를 application.properties 파일에 설정할 수 있어요:
spring.ai.openai.api-key=<your-openai-api-key>
API 키 같은 민감한 정보를 다룰 때 보안을 강화하려면, Spring Expression Language(SpEL)를 사용해 커스텀 환경 변수를 참조할 수 있어요:
# In application.yml
spring:
ai:
openai:
api-key: ***
# In your environment or .env file
export OPENAI_API_KEY=<your-openai-api-key>
또한 애플리케이션 코드에서 프로그래밍 방식으로 이 구성을 설정할 수도 있어요:
// Retrieve API key from a secure source or environment variable
String apiKey = System.getenv("OPENAI_API_KEY");
Auto-configuration
| __ | Spring AI 자동 설정과 스타터 모듈 아티팩트 이름에 큰 변경이 있었어요. 자세한 내용은 upgrade notes를 참고해주세요. |
|---|
Spring AI는 OpenAI Image Generation Client에 대한 Spring Boot 자동 설정을 제공해요. 활성화하려면 프로젝트의 Maven pom.xml 파일에 다음 의존성을 추가하세요:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
또는 Gradle build.gradle 빌드 파일에 추가할 수도 있어요:
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-openai'
}
| __ | 빌드 파일에 Spring AI BOM을 추가하려면 Dependency Management 섹션을 참고해주세요. |
|---|
Image Generation Properties
Connection Properties
프리픽스 spring.ai.openai는 OpenAI에 연결할 수 있게 해주는 프로퍼티 프리픽스예요.
| Property | Description | Default |
|---|---|---|
| spring.ai.openai.base-url | 연결할 URL | api.openai.com |
| spring.ai.openai.api-key | API 키 | - |
| spring.ai.openai.organization-id | 선택적으로 API 요청에 사용할 조직을 지정할 수 있어요. | - |
| spring.ai.openai.project-id | 선택적으로 API 요청에 사용할 프로젝트를 지정할 수 있어요. | - |
| spring.ai.openai.timeout | OpenAI 클라이언트의 요청 타임아웃. | 60 sec. |
| spring.ai.openai.max-retries | OpenAI 클라이언트의 최대 재시도 횟수. | 3 |
| spring.ai.openai.proxy | OpenAI 클라이언트의 프록시 설정. | - |
| spring.ai.openai.custom-headers | OpenAI 클라이언트 요청에 추가할 커스텀 HTTP 헤더. | empty |
| spring.ai.openai.connection-pool-metrics-enabled | 기저 OkHttp 클라이언트의 연결 풀 메트릭을 활성화할지 여부. | false |
| __ | 여러 조직에 속한 사용자(또는 레거시 사용자 API 키로 프로젝트에 접근하는 사용자)의 경우, 선택적으로 API 요청에 사용할 조직과 프로젝트를 지정할 수 있어요. 이 API 요청의 사용량은 지정된 조직과 프로젝트의 사용량으로 집계돼요. |
|---|
Retry Properties
프리픽스 spring.ai.retry는 OpenAI Image 클라이언트의 재시도 메커니즘을 구성할 수 있게 해주는 프로퍼티 프리픽스예요.
| Property | Description | Default |
|---|---|---|
| spring.ai.retry.max-attempts | 최대 재시도 횟수. | 10 |
| spring.ai.retry.backoff.initial-interval | 지수 백오프 정책의 초기 대기 시간. | 2 sec. |
| spring.ai.retry.backoff.multiplier | 백오프 간격 배수. | 5 |
| spring.ai.retry.backoff.max-interval | 최대 백오프 시간. | 3 min. |
| spring.ai.retry.on-client-errors | false면 4xx 클라이언트 오류 코드에 대해 NonTransientAiException을 던지고 재시도하지 않음 |
false |
| spring.ai.retry.exclude-on-http-codes | 재시도를 유발하지 않아야 하는 HTTP 상태 코드 목록 (예: NonTransientAiException을 던지기 위해). | empty |
| spring.ai.retry.on-http-codes | 재시도를 유발해야 하는 HTTP 상태 코드 목록 (예: TransientAiException을 던지기 위해). | empty |
Configuration Properties
| __ | 이미지 자동 설정의 활성화/비활성화는 이제 프리픽스 spring.ai.model.image이 붙은 최상위 프로퍼티로 설정해요. 활성화하려면 spring.ai.model.image=openai (기본값으로 활성화됨). 비활성화하려면 spring.ai.model.image=none (또는 openai와 일치하지 않는 어떤 값). 이 변경은 여러 모델의 설정을 허용하기 위한 것이에요. |
|---|
프리픽스 spring.ai.openai.image는 OpenAI의 ImageModel 구현을 구성할 수 있게 해주는 프로퍼티 프리픽스예요.
| Property | Description | Default |
|---|---|---|
| spring.ai.openai.image.enabled (제거됨, 더 이상 유효하지 않음) | OpenAI 이미지 모델 활성화. | true |
| spring.ai.model.image | OpenAI 이미지 모델 활성화. | openai |
| spring.ai.openai.image.base-url | 선택적으로 spring.ai.openai.base-url을 재정의하여 채팅 전용 URL 제공 | - |
| spring.ai.openai.image.api-key | 선택적으로 spring.ai.openai.api-key를 재정의하여 채팅 전용 api-key 제공 | - |
| spring.ai.openai.image.organization-id | 선택적으로 API 요청에 사용할 조직을 지정할 수 있어요. | - |
| spring.ai.openai.image.project-id | 선택적으로 API 요청에 사용할 프로젝트를 지정할 수 있어요. | - |
| spring.ai.openai.image.n | 생성할 이미지 수. 1에서 10 사이여야 해요. dall-e-3의 경우 n=1만 지원돼요. | - |
| spring.ai.openai.image.model | 이미지 생성에 사용할 모델. | ImageModel.GPT_IMAGE_1_MINI.toString() |
| spring.ai.openai.image.quality | 생성될 이미지의 품질. HD는 이미지 전반에 걸쳐 더 세밀한 디테일과 더 큰 일관성의 이미지를 만들어요. 이 매개변수는 dall-e-3에서만 지원돼요. | - |
| spring.ai.openai.image.response_format | 생성된 이미지가 반환되는 형식. URL 또는 b64_json 중 하나여야 해요. | - |
spring.ai.openai.image.size |
생성된 이미지의 크기. dall-e-2의 경우 256x256, 512x512, 1024x1024 중 하나여야 해요. dall-e-3 모델의 경우 1024x1024, 1792x1024, 1024x1792 중 하나여야 해요. | - |
spring.ai.openai.image.size_width |
생성된 이미지의 너비. dall-e-2의 경우 256, 512, 1024 중 하나여야 해요. | - |
spring.ai.openai.image.size_height |
생성된 이미지의 높이. dall-e-2의 경우 256, 512, 1024 중 하나여야 해요. | - |
spring.ai.openai.image.style |
생성된 이미지의 스타일. vivid 또는 natural 중 하나여야 해요. Vivid는 모델이 초현실적이고 극적인 이미지를 생성하도록 기울게 해요. Natural은 모델이 더 자연스럽고 덜 초현실적으로 보이는 이미지를 생성하게 해요. 이 매개변수는 dall-e-3에서만 지원돼요. | - |
spring.ai.openai.image.user |
최종 사용자를 나타내는 고유 식별자로, OpenAI가 남용을 모니터링하고 감지하는 데 도움이 될 수 있어요. | - |
| __ | 공통 spring.ai.openai.base-url, spring.ai.openai.api-key, spring.ai.openai.organization-id, spring.ai.openai.project-id 프로퍼티를 재정의할 수 있어요. spring.ai.openai.image.base-url, spring.ai.openai.image.api-key, spring.ai.openai.image.organization-id, spring.ai.openai.image.project-id 프로퍼티가 설정되면 공통 프로퍼티보다 우선해요. 서로 다른 모델과 서로 다른 모델 엔드포인트에 서로 다른 OpenAI 계정을 사용하려 할 때 유용해요. |
|---|
| __ | spring.ai.openai.image.options 프리픽스가 붙은 모든 프로퍼티는 런타임에 재정의할 수 있어요. |
|---|
Runtime Options
OpenAiImageOptions.java는 사용할 모델, 품질, 크기 등 모델 구성을 제공해요.
시작 시 기본 옵션은 OpenAiImageOptions를 OpenAiImageModel 생성자에 전달해 구성할 수 있어요. 또는 앞서 설명한 spring.ai.openai.image.* 프로퍼티를 사용할 수도 있어요.
런타임에는 ImagePrompt 호출에 새 요청별 옵션을 추가해 기본 옵션을 재정의할 수 있어요. 예를 들어 quality와 생성할 이미지 수 같은 OpenAI 특정 옵션을 재정의하려면 다음 코드 예시를 사용하세요:
ImageResponse response = openaiImageModel.call(
new ImagePrompt("A light cream colored mini golden doodle",
OpenAiImageOptions.builder()
.quality("hd")
.n(4)
.height(1024)
.width(1024).build())
);
| __ | 모델별 OpenAiImageOptions에 더해, ImageOptionsBuilder#builder()로 만든 이식 가능한 ImageOptions 인스턴스를 사용할 수도 있어요. |
|---|
Customizing the HTTP Client
Spring AI는 내부적으로 공식 openai-java SDK를 사용하며, SpringAiOpenAiHttpClient.Builder가 만든 커스텀 OkHttp 클라이언트로 HTTP 전송을 구성해요. 기저 OkHttpClient가 생성되기 전에 하나 이상의 OpenAiHttpClientBuilderCustomizer 빈을 노출해서 그 빌더를 가로챌 수 있어요. 각 커스터마이저는 모든 OpenAI 모델(chat, embedding, image, audio, moderation)이 사용하는 동일한 빌더를 받으므로, 커스터마이징이 균일하게 적용돼요.
@FunctionalInterface
public interface OpenAiHttpClientBuilderCustomizer {
void customize(SpringAiOpenAiHttpClient.Builder builder);
}
전형적인 사용 사례:
-
OkHttp
Interceptor인스턴스 등록 (인증, 전파 헤더, 커스텀 로깅); -
디스패처
ExecutorService교체 (예: 비동기 I/O를 가상 스레드로 라우팅); -
빌더가 노출하는 프록시, SSL, 호스트 이름 검증, 연결 풀 크기 구성.
커스터마이저가 여러 개 있으면 @Order / Ordered 순서로, Spring AI 기본값 이후에 적용되므로 사용자 코드가 우선해요.
OpenAi*Model.Builder를 통해 모델을 수동으로 연결할 때도 동일한 훅을 사용할 수 있어요:
var chatModel = OpenAiChatModel.builder()
.options(OpenAiChatOptions.builder().model("gpt-4o").build())
.httpClientBuilderCustomizer(myCustomizer)
.build();