AI 기반 운영 자동화 도구인 Spring AI Ops 개발과정 소개. 주요 기능은 Grafana Alerting과 Loki 로그 조회로 AI 장애 분석, GitHub git push로 코드 리뷰를 AI가 수행하는 것. Spring Boot, Kotlin, Spring AI, Redis, Java 21 Virtual Thread 등 기술 스택 사용. 중요 설계 포인트와 트러블슈팅 사례 포함. AI AutoConfiguration을 비활성화하고 Redis를 데이터 저장소로 사용함.
ReadLifelog 웹 앱은 Google Drive를 이미지 저장소로 사용하며, 느린 속도 문제를 해결하기 위해 Cache를 적용했다. Metadata API 호출 제거와 Nginx의 proxy_cache를 활용하여 이미지 캐싱을 개선했고, Cloudflare Cache Rule도 적용했다. 이로 인해 이미지 로딩 속도가 향상되었다.
ReadKafka로 게시글을 발행하고, WebSocket을 통해 실시간 알림을 구현했는데, HTTPS 운영서버에서는 WebSocket이 동작하지 않아 Nginx 설정을 추가하여 문제 해결함. Nginx가 WebSocket 업그레이드 요청에 필요한 HTTP 헤더를 백엔드로 전달하지 않아 발생한 문제로, Upgrade와 Connection 헤더를 설정해야 함. Nginx에 `/ws/` 전용 location 블록을 추가하여 `proxy_http_version`, `proxy_set_header` 등의 설정을 적용하고 서비스를 재시작해야 함.
ReadVultr 서버에 Grafana LGTM 스택(Loki, Prometheus, Tempo, Grafana)을 구성하여 Spring Boot 애플리케이션의 메트릭·로그·트레이스를 통합 관측했다. Virtual 환경 제약 속에서도 Docker 기반 인프라와 OpenTelemetry를 활용해 로그-트레이스-메트릭 간 연동까지 구현했다. 구축 과정에서 발생한 다양한 버전/설정 이슈를 해결하며 실무적인 트러블슈팅 경험과 운영 안정성을 확보했다.
ReadGoogle Drive 이미지 프록시에서 과도한 순차 API 호출로 인한 성능 저하를 캐시 + 병렬 처리로 개선했다. 폴더/파일 ID를 캐싱하고 Virtual Thread로 다운로드·메타 조회를 병렬화하여 응답 시간을 단축했다. 이후 Redis(Valkey) + Spring Cache로 확장하여 캐시 공유·TTL·운영 안정성까지 확보한다.
ReadSpring AI를 활용하면 OpenAI 등 다양한 LLM을 ChatClient 추상화로 간단하게 Spring Boot 애플리케이션에 연동할 수 있다. 의존성 추가, API 키 설정, ChatClient 빈 등록, 서비스 호출의 4단계만으로 LLM 기반 API를 빠르게 구축 가능하다. 추상화 구조 덕분에 모델 교체(OpenAI → Anthropic 등)도 코드 변경 없이 설정만으로 유연하게 대응 가능하다.
Read애플리케이션 아키텍처는 비즈니스 요구사항과 기술적 제약을 고려하여 최적의 구조를 찾는 작업이며, 이를 통해 도메인 정의와 데이터 모델링을 포함한 프로젝트 진행됨. 데이터베이스 설계에는 도메인 간 관계, 정규화, 확장성을 고려하여 논리 모델링을 진행하고, 기술 스택 선택에서는 Java 21, Spring Boot, Kotlin 등을 결정함.멀티 모듈 구조, 애노테이션 기반의 인증, Virtual Thread를 활용한 FeignClient 등의 기술 채택과 코딩 컨벤션 정의 등이 이뤄짐.마지막으로 AWS SQS를 메시징 솔루션으로 선택하고, 기술 워크샵을 통해 최종 아키텍처를 확정함.
ReadJava 21 Virtual Thread + Spring Boot 3.5 + Spring Cloud 기반의 마이크로서비스 아키텍처로, 4개 독립 서비스 모듈과 공통 라이브러리로 구성된 백엔드 개발 가이드이다. @ParsedAuthToken + @ValidateUser 커스텀 애노테이션과 AOP를 조합해 JWT 파싱 및 사용자 검증 로직을 컨트롤러에서 완전히 분리한 것이 인증 설계의 핵심이다. 레이어별 메서드 명명 규칙(Controller → get*/save*, Service → find*/save*, Repository → find*/insert* 등)과 FeignClient를 Virtual Thread로 래핑하는 패턴을 팀 표준으로 정의한 실전 설계 가이드이다.
ReadJasypt를 사용하면 application.yml에 민감한 값을 ENC() 형태로 암호화 저장하고, 런타임에 자동 복호화하여 안전하게 사용할 수 있다. 암호화 키(jasypt.encryptor.password)는 코드에 두지 않고 반드시 환경변수나 VM 옵션으로 외부 주입해야 한다. 간단히 적용 가능하지만 키 관리, 알고리즘 변경, 복호화 범위(spring 하위 프로퍼티 제한) 등의 운영상 주의가 필요하다.
ReadSpring Boot 3 + GraalVM Native Image를 사용하면 JVM 없이 실행되는 바이너리를 생성할 수 있으며, 기동 속도가 약 93.5% 향상된다 (4.7초 → 0.3초). 설정은 build.gradle.kts에 native 플러그인 추가, application.yaml에 AOT 활성화, GRAALVM_HOME 환경변수 설정 후 ./gradlew nativeCompile로 빌드. 다만 컴파일 시간 12~13분, 환경 의존성, 미지원 라이브러리 존재, 운영 레퍼런스 부족 등의 이유로 실제 운영 도입에는 추가 검토가 필요하다.
Read