최근에 Spring Ai를 알았는데 이게 참 신세계다..
예전엔 ai연동하려면 RestTemplate써서 모델올려둔 서버에 api쏘고 그랬던거같은데 😅
근데 은근 이게 막히는게 많아서 글로 남겨보려고한다.
Google Cloud의 Vertex AI Gemini 모델을 연동하여 환경 구성부터 API 호출까지의 전체 과정을 알아보도록하자!
사용 환경은 IntelliJ 기준이다.
먼저 Google Cloud Console 에서 결제 정보를 등록하면 90일 동안 무료로 사용할 수 있다.

정상적으로 했으면 이렇게 나온다
Vertex AI 사용을 위해 서비스 계정을 생성하고 적절한 권한을 부여해야 한다.
Vertex AI 사용자로 설정
resources 폴더에 저장하고 .gitignore에 반드시 등록해두기API 및 서비스 > 라이브러리 메뉴에서 Vertex AI API를 검색한 후, 사용 버튼을 클릭하여 활성화한다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.3'
id 'io.spring.dependency-management' version '1.1.7'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.ai:spring-ai-bom:1.0.0"
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.ai:spring-ai-starter-model-vertex-ai-gemini'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
spring:
ai:
vertex:
ai:
credentials-uri: classpath:genai-key.json
gemini:
project-id: YOUR_PROJECT_ID
location: us-central1
gemini:
chat:
options:
model: gemini-2.0-flash
spring.ai.vertex.ai.credentials-uri=classpath:genai-key.json
spring.ai.vertex.ai.gemini.project-id=YOUR_PROJECT_ID
spring.ai.vertex.ai.gemini.location=us-central1
spring.ai.vertex.gemini.chat.options.model=gemini-2.0-flash
모델은 저런식으로 명칭을 쓰면되는데 지금은 2.5-pro 까지 나온상태인듯하다. 적당한거 쓰자.
Spring AI의 ChatClient를 활용하여, 일기를 자연스럽게 다듬어주는 API를 만들어보았다.
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/ai")
public class TestAiController {
private final ChatClient chatClient;
public TestAiController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@PostMapping("/refine-diary")
public String refineDiary(@RequestBody DiaryRefineRequest req) {
String prompt = """
아래는 사용자가 작성한 일기야.
문맥을 바꾸지 않으면서 어색한 표현을 자연스럽게 다듬어 주고
존댓말을 유지하고, 문장은 최대한 매끄럽게 수정해줘.
[사용자 일기 원문]
%s
""".formatted(req.diary());
return chatClient
.prompt()
.user(prompt)
.call()
.content();
}
public record DiaryRefineRequest(String diary) {}
}
IntelliJ 기준으로 Run ▸ Edit Configurations > Environment Variables에서 아래 값을 추가한다.
GOOGLE_APPLICATION_CREDENTIALS=\절대\경로\genai-key.json
해당 값을 정상적으로 등록하지 못했으면
Your default credentials were not found오류가 발생한다.
API가 정상적으로 작동하는지 Postman을 통해 테스트해볼 수 있다.
POST /api/ai/refine-diary{
"diary": "오늘은 기분이 나빳다. 친구랑 싸워서 속상하다 근데 내가 참아야 되는건가? 매번 친구는 사과를 받는편이고 나는 사과를 하는편이다. 오늘은 왠지 평소처럼 무던하게 넘겨보낼 수 없는 하루였다. 무더운 더위때문이였을까ㅡ오늘은 장마 후 날씨라 불쾌지수가 조금 상승한 탓일까 기후에 기대서 평소와 다른 내 태도를 분석해본다."
}

뭐 이런식으로?
.gitignore에 반드시 등록해야 한다. 안그러면... 책임못진다gemini-2.0-flash)은 향후 변경될 수 있으므로 공식 문서를 참고해보자이젠 스프링도 AI시대인가~?