분류 전체보기
-
실무에서 Service → Manager → Processor 구조로 설계하는 이유시스템설계 2026. 2. 5. 21:58
들어가며실무에서 코드를 작성하다 보면 이런 고민을 하게 된다.Service가 점점 커진다로직이 한 메서드에 몰린다테스트하기가 점점 힘들어진다“이 로직 어디까지가 한 작업이지?”가 헷갈린다나도 비슷한 문제를 겪었고, 그 과정에서Service → Manager → Processor 구조로 점진적으로 정리하게 되었다.이 글에서는 다음을 아주 쉽게 설명해보려고 한다.유스케이스란 무엇인가트랜잭션 경계는 왜 필요한가Service / Manager / Processor는 각각 무슨 역할인가실제 코드 예제1. 유스케이스란 무엇인가?한 줄 정의유스케이스 = 사용자가 의도를 가지고 한 번 행동하는 것예시 (우리 서비스 기준)백테스트를 실행한다백테스트를 공유한다공유된 백테스트를 구매한다구매한 백테스트를 조회한다👉 이 중 ..
-
SSE 스트리밍 응답이 20분 걸린 이유를 p95 메트릭으로 추적해본 기록 - 1개발회고 2026. 1. 28. 19:16
SSE 스트리밍이 15~20분 걸린다고 했을 때, 내가 했던 것들 (Prometheus/Grafana 회고)AI 응답을 SSE로 스트리밍하는 구조를 운영하다 보니 “응답이 너무 오래 걸린다”는 피드백이 들어왔다.특이한 점은 아예 응답이 없는 게 아니라, 응답은 오는데 전체가 끝나기까지 15~20분이 걸린다는 것.처음엔 막연히 “네트워크가 느린가?”, “OpenRouter가 밀리나?”, “소켓이 안 닫히나?” 같은 생각부터 들었다.근데 이건 추측일 뿐이라, 결국 결론은 하나였다.감으로 추측하지 말고, 숫자로 갈라보자.지금 구조에서 “관측 포인트”를 잡은 위치내 서비스는 AiProxyService.relayChatStream()에서 OpenRouter의 스트림을 그대로 릴레이한다.이때 Reactor Flux..
-
Tomcat,Spring Boot에서 GET,POST 요청은 어떻게 처리될까?카테고리 없음 2026. 1. 2. 08:16
Tomcat → Spring MVC → Controller → Response 전체 흐름 완전 해부 1️⃣ 들어가며Spring Boot로 개발하다 보면 우리는 보통 이렇게만 생각한다. 브라우저 → @GetMapping → 응답하지만 실제로는 이 한 줄의 요청이 처리되기까지Tomcat, Servlet Container, Filter, DispatcherServlet, HandlerMapping, MessageConverter 등수많은 컴포넌트와 메소드 호출을 거친다.이 글에서는 GET 요청(@GetMapping) 을 기준으로Tomcat에서 시작해 → Spring MVC 내부를 통과 → 다시 Tomcat을 통해 응답이 반환되는 전체 흐름을메소드 단위까지 내려가며 정리한다. [ Browser ] | ..
-
HTTPS(TLS)는 어떻게 암호화될까? — 공개키, 인증서, 대칭키를 쉽게 이해하기자바웹프로그래밍 2026. 1. 1. 19:44
1. HTTPS는 왜 필요할까?HTTP는 평문 통신이다.즉, 네트워크 중간에서 패킷을 가로채면 요청/응답 내용이 그대로 보인다.이를 해결하기 위해 등장한 것이:HTTPS = HTTP + TLS(암호화)HTTPS의 목표는 단순하다.🔐 통신 내용을 암호화하고🧾 접속한 서버가 진짜인지 확인하는 것2. HTTPS에서 쓰이는 암호화 방식은 두 가지HTTPS(TLS)는 암호화 방식을 하나만 쓰지 않는다.구분용도공개키 암호(비대칭)서버 신원 확인, 대칭키를 안전하게 합의대칭키 암호실제 데이터(HTTP 요청/응답) 암호화👉 핵심 포인트“공개키는 보조, 대칭키가 주력”3. 서버 인증서(Certificate)는 왜 필요할까?서버는 TLS 연결 초기에 인증서(Certificate) 를 브라우저에 보낸다.인증서 안에는 ..
-
Tomcat에서 Mono를 반환하면 정말 논블로킹일까? — Tomcat 스레드, Servlet Async, WebClient를 처음부터 끝까지 정리카테고리 없음 2026. 1. 1. 16:46
📘 Tomcat + MVC + WebClient(Mono 반환) 완전 정리Spring MVC 프로젝트에서 다음과 같은 코드를 보면 많은 개발자들이 혼란을 느낀다. @GetMapping("/async") public Mono async() { return webClient.get().uri("http://external/api") .retrieve() .bodyToMono(String.class); }block()도 없고Mono를 반환하는데왜 “Tomcat에서는 여전히 블로킹 비동기다”라는 말이 나올까?이 글에서는 Tomcat을 전혀 모르는 사람도 이해할 수 있도록,요청이 들어온 순간부터 응답이 네트워크로 나가기까지..
-
CompletableFuture + commonPool은 왜 위험한가 — timeout을 걸어도 서버가 망가지는 이유Spring 2025. 12. 24. 16:46
[개요] 이 글은 다음 질문에서 출발했다.“CompletableFuture로 비동기 처리하고 timeout까지 걸었는데,왜 서버는 여전히 터질 수 있을까?”이 질문에 답하기 위해ForkJoinPool(commonPool), CompletableFuture timeout, RestTemplate 블로킹 I/O를직접 코드와 로그로 실험하며 검증했다.이 글은 이론 설명이 아니라실제 실험 결과를 통해 ‘왜 이런 문제가 발생하는지’를 증명하는 기록이다. 1. 처음 상태: commonPool + CompletableFuture (timeout 없음)대출 비교 API를 구현하면서 여러 금융사 API를 병렬 호출했다.각 금융사 API는 RestTemplate을 사용한 외부 HTTP 호출이었고, 느린 금융사(SLOW)가..
-
함수형 인터페이스 정리(Supplier,Consumer,Function,Predicate)카테고리 없음 2025. 12. 23. 11:53
Java 함수형 인터페이스 4종 정리Supplier, Consumer, Function, Predicate Java의 java.util.function 패키지는 람다/메서드 레퍼런스로 “함수”를 값처럼 전달할 수 있게 해주는 표준 함수형 인터페이스들을 제공한다. 그 중 가장 많이 쓰는 4개가 아래다.Supplier: 입력 없음 → 값 제공Consumer: 값 받기 → 소비(부작용)만 함Function: 값 변환 → 다른 값으로 매핑Predicate: 조건 검사 → true/false 1) Supplier — “입력 없이 T를 만든다/제공한다”의미매개변수(입력)가 없고호출 시점에 T 타입 값을 반환한다.“지연 생성(lazy)”, “기본값 생성”, “팩토리”에 많이 사용된다.시그니처@FunctionalInt..
-
HTTP method 공부 (GET,POST,HEAD,TRACE,OPTIONS)공부일기장 2025. 12. 22. 16:46
1️⃣ 한 줄 정의 (가장 중요)REST API는 HTTP를 기반으로, 자원(Resource)을 URI로 식별하고표준 HTTP 메서드를 통해 자원의 상태(State)를 표현(Representation)하고 전송하는 아키텍처 스타일입니다.1) Safe / Idempotent가 뭔가?Safe (안전)서버의 상태를 “변경하지 않는” 요청즉 “조회용” 성격예: GET, HEAD, OPTIONS (일반적으로)주의: “안전”은 보안(safe security)이 아니라 부작용(side effect) 없음 의미.Idempotent (멱등)같은 요청을 여러 번 해도 결과가 같아야 함“서버 최종 상태” 기준으로 같으면 멱등예)DELETE /users/1을 10번 → 최종적으로 “1번 유저는 없음” (같음) → 멱등POST..