Spring AI 시작하기

기술 스택 분석

핵심 기술

  • 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;
    }
}

성능 최적화

  • 스트리밍 응답으로 메모리 사용량 감소
  • 비동기 컨트롤러로 처리량 향상
  • 요청 제한 설정 구현

태그: Spring-AI Java-17 spring-boot AI-Integration Reactive-Streams

6월 20일 18:22에 게시됨