기술 스택 분석
핵심 기술
- Java 17: 최신 LTS 버전으로 성능 및 보안 향상
- Spring Boot 3.4.2: 현대적 애플리케이션 개발 지원
- Spring AI 1.0.0-M5: 통합 AI 서비스 추상화 프레임워크
의존성 설정
<repositories>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M5</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
</dependencies>
프로젝트 아키텍처
src/main/java/com/example/ai/
├── controller/
│ └── AIController.java
├── service/
│ └── AIService.java
└── config/
└── AppConfig.java
서비스 계층
@Service
public class AIService {
private final ChatModel aiModel;
public AIService(ChatModel aiModel) {
this.aiModel = aiModel;
}
}
컨트롤러 계층
@RestController
@RequestMapping("/ai")
public class AIController {
private final AIService aiService;
@GetMapping("/query")
public String handleQuery(@RequestParam String input) {
return aiService.process(input);
}
}
핵심 기능 구현
기본 대화 처리
public String basicResponse(String input) {
return aiModel.generate(input);
}
템플릿 기반 응답
public String templateResponse(String topic, String style) {
SystemPromptTemplate template = new SystemPromptTemplate("""
{domain} 전문가로서 답변:
- 스타일: {tone}
- 주제: {subject}
""");
Prompt prompt = template.create(Map.of(
"domain", "기술",
"tone", style,
"subject", topic
));
return aiModel.generate(prompt);
}
구조화된 응답
public record MovieResponse(String title, int year, String director) {}
public MovieResponse structuredMovieData() {
BeanOutputConverter<MovieResponse> converter =
new BeanOutputConverter<>(MovieResponse.class);
String template = "{year}년 최고 영화 1개 정보를 {format} 형식으로";
Prompt prompt = new PromptTemplate(template)
.add("year", "2023")
.add("format", converter.getFormat())
.create();
return converter.convert(aiModel.generate(prompt));
}
스트리밍 응답
public Flux<String> streamOutput() {
return ChatClient.create(aiModel)
.prompt()
.user("재미있는 이야기 만들어줘")
.stream()
.content();
}
환경 설정
server.port=9001
spring.ai.openai.api-key=your_api_key
spring.ai.openai.model=moonshotai/Kimi-K2-Instruct
logging.level.org.springframework.ai=DEBUG
고려 사항
오류 처리
@RestControllerAdvice
public class ErrorHandler {
@ExceptionHandler(ApiException.class)
public ProblemDetail handleAIError(Exception ex) {
ProblemDetail detail = ProblemDetail.forStatus(500);
detail.setTitle("AI 서비스 오류");
detail.setDetail(ex.getMessage());
return detail;
}
}
성능 최적화
- 스트리밍 응답으로 메모리 사용량 감소
- 비동기 컨트롤러로 처리량 향상
- 요청 제한 설정 구현