[Spring Boot] Spring AI 활용해 LLM과 연동하기

IntroDeepseek를 테스트 해보고 리소스 대비 대단한 성능에 감탄을 했고, 그 이후로 항상 개인적으로 진행 중인 프로젝트에서도 하나씩 LLM을 연동한 기능을 추가하려고 생각해왔다. LLM을 적용해 가치를 만들어낼 수 있는 분야는 너무나도 다양하다.튜토리얼 수준으로 진행할 예정이기에 원래는 로컬에서 DeepSeek R-1의 8B 정도의 모델을 돌려서 처리하려 했지만, 아쉽게도 몇 번의 테스트 결과 해결되지 않는 한글 처리 이슈가 있었다. 응답이 오래 걸리는건 스케줄러로 처리하도록 하면 어느정도는 해결 가능하지만, 정확도는 타협할 수 없는 부분이다. 32B 이상 모델은 사용해야 한글도 원활하게 소화해내는걸로 보이는데 집에서 열심히 돌아가고 있는 서버 노트북 스펙은 그 정도를 감당할 수준이 아니다.그래..

Programming/JPA ⁄ Spring 2025.02.28
[Spring Boot] 정적 파일 캐싱 및 자동 버전 관리 설정

Intro웹 애플리케이션에서 정적 파일(이미지, CSS, JS 등)의 성능 최적화는 중요하다. 캐시를 활용하면 불필요한 네트워크 요청을 줄여서 성능을 개선할 수 있으며, 파일의 버전 관리를 자동화하면 배포할 때 브라우저가 새로운 리소스를 제대로 가져오게 만들 수 있다. 잘못 캐시해두면 기껏 새로운 정적 파일을 배포했지만 사용자들은 브라우저에 캐시된 엉뚱한 정적자원을 활용하는 사태가 벌어진다.Spring Boot에서는 spring.web.resources.cache.period 및 spring.web.resources.chain.strategy.content.enabled 설정을 활용하면 정적 파일의 캐싱과 버전 관리를 쉽게 적용할 수 있다.이번 글에서는 새로운 Spring Boot 프로젝트를 생성하고, ..

Programming/JPA ⁄ Spring 2025.02.13
Spring 6의 HTTP Interface

IntroSpring Framework 6.1 에서 새롭게 등장한 HTTP Interface는 외부 API를 호출하고 데이터를 처리하는 과정을 아주 단순하게 해준다.기존에도 RestTemplate, WebClient 등의 강력한 도구들이 있었지만, Feign Client 에서 영감을 받은 선언적 인터페이스 방식의 HTTP Interface는 간결한 코드로 손쉽게 사용할 수 있다.이번 글에서는 스프링에서 외부 API 호출을 어떻게 진화시켜왔는지 살펴보고, 마지막으로 HTTP Interface를 활용해 간단히 외부 API 요청을 처리하는 방법을 알아본다. 실습에 앞서 스프링부트 프로젝트를 생성해주자.스프링부트 버전은 꼭 3.1+ 해줘야 Http Interface를 사용할 수 있다. Dependencies에 ..

Programming/JPA ⁄ Spring 2024.11.26
스프링 시큐리티 필터가 2번 중복적용된 문제 해결

Intro JWT 토큰 값을 읽어서, 상황에 따라 인증하거나 만료되었다면 리프레시 토큰을 사용해 새로운 토큰을 발급받는 역할을 하는 JwtAuthFilter 를 만들어 등록해두었다. 시큐리티 필터체인에서 아래와 같이, AuthorizationFilter 이전에 등록해서 작동하도록 해 두었는데 http.addFilterBefore(jwtAuthFilter, AuthorizationFilter::class.java) 요청이 올 때마다 자꾸 해당 필터를 두번씩 거치는 문제가 있었다. 원인 간편하게 Bean으로 등록 해두고 사용하려고 클래스에 @Component 어노테이션을 붙여서 사용했는데 그게문제였다. 아래는 스프링 부트 도큐먼트에서 Filter에 관한 내용이다 https://docs.spring.io/sp..

Programming/JPA ⁄ Spring 2024.01.23
[Spring Boot] 정적자원 캐싱하는방법

Intro 가족들이 필요로해서 만들었고, 운영한지 이제 한 2년정도 된 스프링부트로 만든 토이 프로젝트가 있다. 리액트를 필두로 몇년째 이어지는 프론트엔드 춘추전국시대에 특별히 마음에 들거나 잘하는 프론트엔트 프레임워크가 없다보니, 사용하고 싶은 프론트엔드 스펙이 정해지면 그때 떼낼 생각으로 최대한 API콜 위주로 하며 thymeleaf로 개발했고, 아직까지는 큰 불편없이 쓰고 있다. 지금까지는 부트스트랩 jQuery vue.js 등의 라이브러리를 대부분 CDN에서 받아오도록 해놨었는데 이제부터는 소스코드에 포함해 배포하기로 했다. 오프라인이나 내부망에서 사용할 프로젝트는 아니기때문에 특별히 변경해야 할 이유는 없었지만 그래도 어플리케이션의 전체적인 구동을 통제하에 두고싶은 마음에 해보았다. 문제 그런데..

Programming/JPA ⁄ Spring 2024.01.23