Tomcat 접근 로그(Access Log) 커스텀 설정과 분석 효율 극대화

1. 서론: WAS 장애 대응의 나침반, 접근 로그(Access Log) 웹 서비스 운영 중 “어제 밤 특정 시간대에 서비스가 10초간 멈칫했다"거나 “간헐적으로 500 에러가 발생한다"는 사용자 인입이 들어왔을 때, 장애 원인을 규명하기 위한 가장 첫 번째 단서는 바로 **WAS의 접근 로그(Access Log)**입니다. 애플리케이션 로그(app.log)는 개발자가 명시적으로 log.info()나 log.error()를 찍어둔 코드 블록만 기록하지만, Tomcat의 접근 로그는 웹 서버로 인입된 **모든 HTTP 요청의 생애 주기(클라이언트 IP, 요청 URL, 처리 소요 시간, HTTP 상태 코드, 응답 바이트 수)**를 누락 없이 100% 포착합니다. ...

2026년 8월 19일 · 4 분 · 712 단어 · Chanyeol

Tomcat JVM 힙 메모리(Heap Memory) 최적화 설정 가이드

1. 서론: WAS 운영의 최대 복병, OutOfMemoryError Tomcat 기반의 Java 백엔드 시스템을 프로덕션 환경에서 운영하다 보면 한 번쯤 맞닥뜨리는 가장 치명적인 재앙이 바로 java.lang.OutOfMemoryError (OOM)입니다. 서버의 물리적 RAM이 32GB, 64GB로 충분하더라도 JVM에 할당된 힙 메모리 옵션이 기본값으로 방치되어 있다면, Tomcat은 불과 수백 MB의 기본 메모리만 사용하다가 대규모 트래픽이나 파일 업로드 요청이 들어오는 순간 프로세스가 급작스럽게 뻗어버릴 수 있습니다. 반대로 물리 메모리를 초과하여 힙 메모리를 과도하게 할당하면 OS 레벨의 메모리 스왑(Paging/Swapping)이 발생하여 시스템 전체 I/O가 마비되거나 긴 시간 동안 서버가 멈추는 STW(Stop-The-World) 현상이 초래됩니다. ...

2026년 8월 5일 · 4 분 · 802 단어 · Chanyeol

Tomcat 세션 클러스터링 가이드: 고가용성(HA) 환경의 세션 복제 설정

1. 서론: 다중 WAS 환경에서의 세션 불일치 문제 현대의 상용 웹 애플리케이션은 단일 인스턴스로 운영되지 않습니다. 고가용성(High Availability, HA) 확보와 트래픽 분산을 위해 L4/L7 스위치, AWS ALB, Nginx 등의 로드 밸런서 뒤에 최소 2대 이상의 Tomcat(WAS) 인스턴스를 두는 액티브-액티브(Active-Active) 클러스터링 구조가 기본입니다. 하지만 로드 밸런서가 라운드로빈(Round-Robin) 방식으로 클라이언트의 HTTP 요청을 여러 서버로 번갈아 전달하는 순간, ‘세션 불일치(Session Inconsistency)’ 문제가 발생합니다. [클라이언트 #1 로그인] ──▶ [로드 밸런서] ──▶ [Tomcat #1] (JSESSIONID_A 발급, 메모리 저장) [클라이언트 #1 다음 요청] ──▶ [로드 밸런서] ──▶ [Tomcat #2] (세션 정보 없음! 로그인 풀림 현상 발생) Tomcat #1에서 로그인에 성공하여 메모리에 세션을 생성했더라도, 다음 요청이 Tomcat #2로 인입되면 사용자는 순식간에 로그인 풀림 현상이나 장바구니 초기화 같은 치명적인 장애를 겪게 됩니다. ...

2026년 7월 22일 · 5 분 · 879 단어 · Chanyeol

Spring AI 프로젝트 마무리: 로컬 LLM 챗봇의 한계와 향후 발전 로드맵 (7편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: ‘Dev-Fortune’ 프로젝트를 마무리하며 기획부터 시작해 로컬 Ollama 모델 탑재, RAG 기반 지식 주입, 페르소나 튜닝, 그리고 비동기 SSE 스트리밍까지 달려온 7부작 ‘Dev-Fortune(개발자 사주 챗봇)’ 시리즈가 대단원의 막을 내렸습니다. 이 프로젝트의 본질적인 목표는 단순히 재미있는 토이 프로젝트를 만드는 것에 그치지 않았습니다. **“파이썬(Python)이 독점하다시피 했던 생성형 AI(GenAI) 애플리케이션 개발 생태계를 순수 자바와 Spring Boot 엔지니어링 환경에서 얼마나 깔끔하고 견고하게 구현할 수 있는가?”**에 대한 검증이었습니다. ...

2026년 7월 8일 · 4 분 · 839 단어 · Chanyeol

Spring AI RAG 워크플로우 분석: 사용자 질문부터 AI 답변까지의 여정 (6편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: 조각난 퍼즐을 하나로 연결하는 엔드투엔드 여정 이전 포스팅들을 통해 로컬 LLM 연동(Ollama), 사주 데이터의 벡터화 및 색인(SimpleVectorStore), 시니컬한 시니어 개발자 페르소나 설계(Prompt Engineering), 그리고 리액티브 SSE 스트리밍 엔드포인트(WebFlux)까지 각각의 빌딩 블록을 완성했습니다. 하지만 단위 모듈이 개별적으로 동작하는 것과, 이들이 유기적으로 결합되어 실서비스 트래픽을 처리하는 것은 완전히 다른 차원의 문제입니다. 사용자가 브라우저에서 고민을 입력하고 엔터 키를 누르는 찰나의 순간, 서버 내부에서는 Spring Boot의 비동기 리액티브 파이프라인, 임베딩 모델의 벡터 유사도 검색, 프롬프트 템플릿 컴파일, 그리고 로컬 LLM의 토큰 생성 과정이 톱니바퀴처럼 맞물려 돌아갑니다. ...

2026년 6월 24일 · 5 분 · 979 단어 · Chanyeol

Spring WebFlux와 SSE로 구현하는 AI 스트리밍 API: 실시간 대화 경험 (5편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: AI 답변, 왜 사용자를 기다리게 만들면 안 되는가? 일반적인 웹 API는 데이터베이스에서 데이터를 조회한 뒤 50~100ms 내외로 즉시 응답을 반환합니다. 하지만 거대 언어 모델(LLM)은 문장을 한 번에 만들어내지 않고, 단어(토큰) 단위로 확률을 계산하며 점진적으로 완성해 나갑니다. ...

2026년 6월 10일 · 4 분 · 821 단어 · Chanyeol

프롬프트 엔지니어링 실전: AI에게 시니컬한 개발자 페르소나 주입하기 (4편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: AI의 ‘인격’과 ‘품질’은 프롬프트에서 결정된다 3편을 통해 사주 안티패턴 데이터를 성공적으로 벡터화했지만, 검색된 문서를 그대로 모델에 던져주면 AI는 십중팔구 교과서적이고 장황한 답변을 쏟아냅니다: “안녕하세요! 질문해 주신 내용에 대해 사주팔자 관점에서 분석해 드리겠습니다. 데이터베이스 병목이 예상되오니 JPA Fetch Join을 사용하시고…” ...

2026년 5월 28일 · 4 분 · 794 단어 · Chanyeol

Spring AI RAG 구현하기: SimpleVectorStore로 전문 지식 데이터 주입 (3편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: AI는 어떻게 사주를 ‘공부’하는가? 사전 학습된 거대 언어 모델(LLM)은 일반적인 상식이나 범용 프로그래밍 지식에는 능통하지만, 우리가 기획한 **“사주팔자를 소프트웨어 안티패턴으로 치환한 독자적인 해석 규칙”**은 전혀 알지 못합니다. AI에게 특정 도메인의 전문 지식을 가르치는 방법은 크게 두 가지가 있습니다: ...

2026년 5월 18일 · 4 분 · 786 단어 · Chanyeol
초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼

초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼

초보자도 쉽게 따라하는 Linux Tomcat WAR 배포 튜토리얼 사내 레거시 자바 웹 애플리케이션을 새로 세팅한 우분투 서버에 배포하려다 톰캣(Tomcat) 버전과 자바 버전 호환성 문제로 반나절을 날린 적이 있었습니다. WAR 파일만 webapps/에 밀어 넣으면 끝날 줄 알았는데, systemd 서비스 등록부터 권한 설정, 방화벽(UFW), 404 에러까지 줄줄이 터지더군요. 저처럼 사내 서버나 개인 리눅스 인스턴스에 톰캣으로 WAR 배포를 진행하며 삽질하는 분들을 위해 실제 세팅 과정과 트러블슈팅 경험을 정리했습니다. ...

2026년 5월 4일 · 4 분 · 784 단어 · Chanyeol
Docker Compose로 멀티 컨테이너 환경 구축하기: 단계별 튜토리얼

Docker Compose로 멀티 컨테이너 환경 구축하기: 단계별 튜토리얼

Docker Compose로 멀티 컨테이너 환경 구축하기: 단계별 튜토리얼 주제 키워드: Docker Compose, 멀티 컨테이너, YAML 구성, 의존성 관리, CI/CD 통합 개인 프로젝트나 사내 인프라를 구축할 때 스프링 부트 웹 애플리케이션과 PostgreSQL DB를 각각 수동으로 docker run 명령어로 띄우다 보니 컨테이너 간 사설 네트워크가 안 묶여서 DB 연결 에러가 나거나, 서버 재부팅 시 DB 컨테이너가 먼저 안 떠서 웹이 뻗는 문제를 겪었습니다. 단일 YAML 파일 하나로 서비스 의존성(depends_on), 내부 네트워크, 영구 볼륨까지 한 번에 관리해 주는 Docker Compose를 도입하면서 이 삽질을 완전히 끝낼 수 있었습니다. 실무에서 바로 써먹을 수 있는 멀티 컨테이너 구성법과 운영 팁을 공유합니다. ...

2026년 4월 24일 · 4 분 · 785 단어 · Chanyeol