스프링 4

Spring Cache 깊게 파헤치기: Cache vs CacheManager

Spring에서 캐시를 사용할 때 @Cacheable 어노테이션 한 줄로 마법처럼 동작하는 배경에는 CacheManager와 Cache라는 두 핵심 인터페이스의 철저한 역할 분담이 있습니다. 이 둘의 관계를 이해하면 커스텀 캐싱 전략을 훨씬 유연하게 설계할 수 있습니다.1. CacheManager: 캐시를 찍어내는 "공장이자 관리소"CacheManager는 캐시 추상화의 최상위 진입점입니다. 애플리케이션 내의 모든 캐시 인스턴스를 생성하고 관리하는 역할을 합니다.주요 역할:캐시 생성 및 조회: "users", "products" 등 이름에 맞는 Cache 객체를 생성하거나 찾아줍니다.설정의 중심: 데이터 유효 기간(TTL), 최대 크기, 직렬화 방식 등 '어떻게(How)' 저장할지를 결정합니다.라이프사이..

스프링 10:30:52

[Spring Boot/Kotlin] Spring Cache 어노테이션 심화 가이드

1. 개요Spring Cache 추상화의 가장 큰 장점은 비즈니스 로직에 캐시 코드를 섞지 않고, 어노테이션(Annotation) 만으로 선언적인 캐싱을 적용할 수 있다는 점입니다. 본 보고서는 Spring Cache의 핵심 어노테이션인 @Cacheable, @CachePut, @CacheEvict 등의 기능과 속성을 상세히 분석하고, Kotlin 환경(Data Class, Coroutines)에서의 구체적인 사용 패턴을 제시합니다.2. 핵심 어노테이션 상세 분석2.1 @Cacheable: 조회 및 저장의 자동화가장 빈번하게 사용되는 어노테이션으로, 캐시 룩어사이드(Look-aside) 전략을 수행합니다. 데이터가 캐시에 있으면 반환하고, 없으면 메서드를 실행 후 결과를 캐시에 저장합니다.2.1.1 기본..

스프링 10:02:11

[Spring Boot/Kotlin] Redis 캐싱: PageImpl 직렬화 에러와 ClassCastException 완벽 해결 가이드

Spring Boot와 Redis를 연동하여 캐싱을 구현하다 보면, 특히 Kotlin 환경에서 페이징된 데이터(Page)를 캐싱할 때 두 가지 큰 장벽에 부딪히게 됩니다.InvalidDefinitionException: PageImpl은 기본 생성자가 없어 Jackson이 역직렬화를 못 함.ClassCastException: 캐시에서 꺼낸 데이터가 DTO가 아닌 LinkedHashMap으로 변환됨.이 글에서는 이 문제의 원인을 파헤치고, 커스텀 Serializer를 이용한 근본적인 해결법과 Wrapper 클래스를 이용한 간편한 해결법 두 가지를 소개합니다.문제의 원인1. PageImpl의 구조적 문제Spring Data의 PageImpl 클래스는 Jackson이 데이터를 복원할 때 필요한 기본 생성자(N..

스프링 2026.02.17

OpenFeign부터 Spring AI, 그리고 Kotlin 최적화까지: 타입 안전한 AI 서비스 구축기

1. 서론: "API 스펙을 직접 구현해야 하나?"'Morning Commit' 프로젝트의 핵심 기능은 기술 블로그 게시글을 AI가 분석하여 요약, 핵심 인사이트, 난이도 등을 추출하는 것입니다. 초기에는 이 기능을 구현하기 위해 가장 익숙한 방식인 REST API 직접 호출을 선택했습니다.하지만 개발을 진행할수록 비즈니스 로직보다 OpenAI의 API 스펙을 관리하는 데 더 많은 시간을 쏟고 있다는 것을 깨달았습니다.2. 태동기: 직접 통신의 시대 (OpenFeign & ObjectMapper)초기 아키텍처는 OpenFeign을 사용하여 OpenAI 엔드포인트와 통신했습니다.2-1. 직면한 문제점 (Pain Points)DTO 관리의 부담 (Boilerplate Hell)OpenAI의 요청/응답 규격을..

스프링 2026.02.17