MySQL 인덱스 최적화 전략: 느린 쿼리를 100배 빠르게 만드는 마법
1. 서론: 인덱스는 왜 중요한가?
데이터베이스의 성능은 곧 서비스의 응답 속도와 직결됩니다. 데이터가 수만 건일 때는 문제가 없다가, 수백만 건을 넘어서는 순간 웹 사이트가 느려지는 경험을 해보셨을 겁니다. 이때 가장 먼저 확인해야 할 것이 바로 **인덱스(Index)**입니다.
인덱스는 책의 맨 뒤에 있는 ‘색인’과 같습니다. 방대한 데이터 속에서 내가 원하는 정보를 찾기 위해 처음부터 끝까지 다 뒤지는 ‘Full Table Scan’을 방지하고, B-Tree 구조를 통해 원하는 위치로 즉시 점프하게 해줍니다.
2. 실무 사례: 500만 건의 주문 테이블 쿼리 최적화
상황: 쇼핑몰 프로젝트에서 특정 사용자의 최근 주문 내역을 조회하는 쿼리가 5초 이상 소요되고 있습니다.
Tomcat 세션 클러스터링 가이드: 고가용성(HA) 환경의 세션 복제 설정
서론
서비스 규모가 커지면 L4나 L7 로드 밸런서를 통해 여러 대의 WAS(Tomcat)를 운영하게 됩니다. 이때 사용자의 세션 정보가 특정 서버에만 남아있다면, 로드 밸런싱 과정에서 세션 끊김 현상이 발생합니다. 이를 해결하기 위해 서버 간 세션을 동기화하는 세션 클러스터링(Session Clustering) 설정이 필수적입니다.
1. Tomcat 기본 설정 (server.xml)
Tomcat은 멀티캐스트(Multicast) 방식을 이용한 자체 세션 복제 기능을 제공합니다. server.xml의 <Host> 태그 내부에 <Cluster> 설정을 추가합니다.
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
</Channel>
</Cluster>
2. 애플리케이션 활성화 (web.xml)
클러스터링 대상이 되는 웹 애플리케이션의 WEB-INF/web.xml 파일에 반드시 다음 태그를 추가해야 합니다. 이 태그가 없으면 세션 복제가 작동하지 않습니다.
Tomcat JVM 힙 메모리(Heap Memory) 최적화 설정 가이드
서론
Tomcat 기반의 Java 애플리케이션을 운영하다 보면 가장 빈번하게 발생하는 장애 중 하나가 바로 OutOfMemoryError입니다. 서버의 물리적 메모리가 충분하더라도 JVM에 할당된 메모리가 적절하지 않으면 서비스는 쉽게 멈출 수 있습니다. 이번 포스팅에서는 실무에서 필수적인 JVM 메모리 설정 파라미터를 정리합니다.
1. 힙 메모리(Heap Memory) 핵심 설정
힙 메모리는 객체가 생성되고 상주하는 공간입니다. 가장 중요한 두 가지 설정은 -Xms와 -Xmx입니다.
- -Xms: JVM이 시작될 때 할당하는 초기 힙 크기입니다.
- -Xmx: JVM이 가질 수 있는 최대 힙 크기입니다.
실무 권장 설정 (setenv.sh)
Tomcat의 bin/setenv.sh(윈도우는 setenv.bat) 파일을 생성하거나 수정하여 설정합니다.