Virtual Thread로 병렬 호출하여 Thread Pool 고갈 문제 해결하기
·
Backend/Spring Boot
Introduce서비스를 개발하다 보면 단일 API 내에서 외부 API 호출이 N번 반복되는 구조가 자연스럽게 생겨난다. 최근에 장소 하나에 사진 10장을 보여주자 라는 요구사항이 있었다. 처음에는 단순히 순차 조회로 구현을 하였고, 로컬에서 테스트해 보니 1초 남짓한 응답 시간이 걸렸고 "좀 느리긴 하지만 괜찮겠지" 싶었다. GitHub - YAPP-Github/NDGL-BEContribute to YAPP-Github/NDGL-BE development by creating an account on GitHub.github.com 나도갈래 프로젝트는 유튜버의 여행 영상 속 동선을 AI가 분석하여 장소 정보를 제공하는 서비스이다. 장소 상세 정보를 조회해야 하는데 이때 Google Maps Places..
Swagger MCP Server 만들기 4편 - Spring AI로 MCP 서버를 구축하고, Claude Code에 연동하기
·
AI
이 시리즈는 Backend API의 Swagger 문서를 MCP 서버로 제공하여, LLM에서 자연어로 API를 검색하고, 완전한 네트워킹 코드를 자동 생성하는 시스템을 만드는 과정입니다.1편 : LLM 기반 API 탐색 자동화 설계2편 : Swagger API 파싱3편 : DB 저장 설계와 트러블 슈팅4편: Spring AI로 MCP 서버를 구축하고, Claude Code 연동하기 (현재 글)모든 코드는 해당 레포지토리에서 확인할 수 있습니다. GitHub - WooJJam/swagger-mcp-server: Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공하는 MCP S..
Swagger MCP Server 만들기 3편 - DB 저장 설계와 트러블 슈팅
·
AI
이 시리즈는 Backend API의 Swagger 문서를 MCP 서버로 제공하여, LLM에서 자연어로 API를 검색하고, 완전한 네트워킹 코드를 자동 생성하는 시스템을 만드는 과정입니다.1편 : LLM 기반 API 탐색 자동화 설계2편 : Swagger API 파싱3편 : DB 저장 설계와 트러블 슈팅 (현재 글)4편 : Spring AI로 MCP 서버를 구축하고, Claude Code 연동하기모든 코드는 해당 레포지토리에서 확인할 수 있습니다. GitHub - WooJJam/swagger-mcp-server: Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공하는 MCP ..
Swagger MCP Server 만들기 2편 - Swagger API 파싱
·
AI
이 시리즈는 Backend API의 Swagger 문서를 MCP 서버로 제공하여, LLM에서 자연어로 API를 검색하고, 완전한 네트워킹 코드를 자동 생성하는 시스템을 만드는 과정입니다.1편 : LLM 기반 API 탐색 자동화 설계2편 : Swagger API 파싱 (현재 글)3편 : DB 저장 설계와 트러블 슈팅4편: Spring AI로 MCP 서버를 구축하고, Claude Code 연동하기모든 코드는 해당 레포지토리에서 확인할 수 있습니다. GitHub - WooJJam/swagger-mcp-server: Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공하는 MCP S..
Swagger MCP Server 만들기 1편 - LLM 기반 API 탐색 자동화 설계
·
AI
이 시리즈는 Backend API의 Swagger 문서를 MCP 서버로 제공하여, LLM에서 자연어로 API를 검색하고, 완전한 네트워킹 코드를 자동 생성하는 시스템을 만드는 과정입니다.1편 : LLM 기반 API 탐색 자동화 설계 (현재 글)2편 : Swagger API 파싱3편 : DB 저장 설계와 트러블 슈팅4편: Spring AI로 MCP 서버를 구축하고, Claude Code 연동하기모든 코드는 해당 레포지토리에서 확인할 수 있습니다. GitHub - WooJJam/swagger-mcp-server: Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공Spring AI를 사용하여 Swagger API를 LLM이 자연어로 조회할 수 있도록 제공하는 MCP S..
RestClient는 어떻게 생성이 될까?
·
Backend/Spring Boot
IntroduceSpring Boot 애플리케이션에서 외부 API를 호출하는 일은 매우 흔하다. Spring 6부터는 기존 RestTemplate을 대체하는 새로운 HTTP 클라이언트로 RestClient가 도입되었고, 비교적 단순한 API 덕분에 빠르게 적용할 수 있다는 장점이 있다. 하지만 실제로 RestClient를 사용하다 보면 이런 궁금증이 생긴다.RestClient.create()는 내부적으로 무엇을 만들까?builder() 방식과는 어떤 차이가 있을까?매번 새로 만들어도 괜찮을까, 아니면 재사용해야 할까? 이 글에서는 RestClient가 생성되는 방식과 내부 동작 구조를 직접 뜯어보며 살펴본다. RestClient ConstructionRestClient는 두 가지 API로 생성할 수 있다..
나의 macOS를 GitHub Actions Runner로 만들기
·
DevOps/Github Actions
1. IntroducePrivate 레포에서 GitHub Actions를 사용하다 보면, 실행 시간이 무한하지 않다는 사실을 자연스럽게 체감하게 된다. 초기에는 단순한 빌드와 테스트만 수행했기 때문에 큰 문제가 되지 않았지만, 워크플로우가 늘어나고 CI 시간이 길어지면서 상황은 점점 달라졌다. PR 단위로 여러 워크플로우가 동시에 실행되고, 테스트 시간이 길어질수록 사용량은 빠르게 증가하였다. 이러한 흐름이 반복되다 보니, CI 실행 자체가 부담으로 느껴지기 시작했다. 그리고 자연스럽게 한 가지 질문에 도달했다. GitHub Actions를 꼭 GitHub에서만 실행해야 할까? GitHub Actions를 사용하고 있다는 이유만으로, 실행 환경까지 GitHub의 인프라에 종속될 필요는 없다. 실제로 Gi..
PR 본문 자동화를 위한 AI 워크플로우 설계
·
DevOps/Github Actions
1. Introduce 새로운 기능을 개발할 때마다 반복되는 작업 중 하나가 바로 PR 본문 작성이다. PR 본문은 단순한 형식 문서가 아니라, 리뷰어가 변경 의도를 이해하고 코드 리뷰를 진행하기 위한 필수 커뮤니케이션 수단이다. 그럼에도 불구하고 실제 개발 과정에서는 기능 구현 이후 다시 변경 사항을 정리하고 문장으로 풀어내는 데 생각보다 많은 시간이 소요된다. 특히 변경 범위가 넓거나 여러 파일에 걸쳐 수정이 발생한 경우, PR 본문을 작성하기 위해 다시 diff를 훑고, 핵심 내용을 정리하는 작업은 생각보다 되게 귀찮은 작업이다. 결과적으로 PR 본문은 “최소한의 설명만 있는 상태”로 올라가거나, 리뷰어가 직접 코드를 열어보며 맥락을 추론해야 하는 상황이 반복된다. 최근에는 AI 활용이 보편화되면서..
Java의 final은 불변성을 보장하지 않는다.
·
Backend/Java
Java의 final은 무엇인가?`final`은 '최종적' 이라는 의미를 가지는데, 자바에서 이는 초기값이 한번 정해지면 프로그램 실행 도중에 수정할 수 없음을 의미한다. 또한 이 `final` 은 변수, 메소드, 클래스에 붙을 수 있는데 각각 의미하는바가 달라진다.1. 클래스`final`이 붙은 클래스는 상속할 수 없다.public final class Car { } // final 클래스는 상속할 수 없다!public class Bus extends Car { }2. 메소드`final` 이 붙은 메소드는 오버라이딩 할 수 없다.public class Animal { public final void bark() { System.out.println("짖다."); }}public ..
자바와 스프링의 비동기 처리 - 2편: CompletableFuture의 예외 처리와 타임 아웃
·
Backend/Spring Boot
Introduce 자바와 스프링의 비동기 처리 - 1편: CompletableFuture 톺아보기Introduce 스프링에서 비동기 처리를 위해 흔히 `@Async` 를 사용하곤 한다.나 역시 프로젝트에서 `@Async` 를 적용하여 일부 후속 로직들을 메인 로직과 분리하여 실행하고 있었다. 그런데 얼마 전 면woojjam.tistory.com먼저 해당 글을 읽기 전에 이전 글을 읽고 오는것을 추천한다. `CompletableFuture` 는 비동기 작업을 간결하게 표현할 수 있게 도와주지만, 비동기 환경에서는 예외가 어디서, 어떻게 발생했는지 추적하거나 디버깅 하기도 어렵기에 이를 처리하는것이 쉽지 않다. 그렇다고 예외처리를 해놓지 않으면 다음과 같은 상황이 발생할 수 있다.비동기 로직 중 하나가 실패..