실무 아키텍처 설계, 장애 대응 시나리오, 튜닝 및 최적화, 그리고 보안 및 이중화 전략까지 포괄해야 합니다. 아래는 시험을 대비한 WEB/WAS 핵심 개념 정리, 시나리오형 문제집, 암기카드, 키워드 인덱스 요약 구성입니다.
📘 1. 핵심 개념 요약 (TA 직무역량 관점)
1.1. WEB/WAS 구조 개요
- WEB Server: 요청을 정적 리소스(html, css 등)로 처리, WAS로 요청 전달
- 예: NGINX, Apache
- WAS: Java Servlet 기반 동적 처리 (Tomcat, JBoss, WebLogic 등)
- 구성 패턴
- 단일서버 구성: WEB+WAS 통합 → 빠른 구축, 낮은 확장성
- 분리 구성: WEB ↔ WAS → 장애 격리, 부하분산 용이
1.2. 주요 아키텍처 설계 고려사항
- 이중화: L4/L7 로드밸런서, Active-Standby 구성
- 세션 처리: Sticky Session vs Session Clustering (ex: Redis 기반)
- Connection Pool: DB와의 연결 성능 및 장애 대응 핵심
- Reverse Proxy/SSL Offload: NGINX 활용
1.3. 성능 및 보안 튜닝
- JVM 옵션 설정 (-Xms, -Xmx, GC, Thread)
- HTTP Keep-Alive, Compression 설정
- WAS 보안 설정 (context.xml, web.xml, XSS/CSRF 대응)
1.4. 실무 주요 설정 파일
- server.xml: 포트, 커넥터 설정
- web.xml: Servlet 매핑 및 보안정책
- context.xml: DB Connection 설정 및 리소스 관리
- setenv.sh: JVM 옵션 설정
📚 2. 시나리오 기반 문제집 (20문항)
각 문항은 [문제 - 정답 - 해설] 3단 구성이며 난이도 표시 포함
✅ 예시 문제
문제 1 (난이도: 중)
WAS 서버에서 GC 튜닝 이후 API 응답 시간이 급격히 느려졌다. 가능한 원인으로 적절한 것은?
① GC 로그 미설정으로 모니터링 부재
② Xms, Xmx 설정이 동일하여 Heap 확장이 안됨
③ ThreadPool Core 수 증가
④ ConnectionPool MaxActive 감소
⑤ /dev/random 대기 문제
정답: ②
해설: Xms와 Xmx가 동일하면 메모리 확장에 의한 GC 이슈는 방지되지만, 설정값이 너무 높으면 Full GC 발생 가능성 및 메모리 오버커밋 문제가 발생할 수 있음.
문제 7 (난이도: 상)
WEB-WAS 분리 구성에서 HTTP 499 오류가 빈번하게 발생하고 있다. 가장 먼저 확인할 사항은?
① NGINX의 proxy_read_timeout 설정
② Tomcat의 maxThreads 설정
③ DB의 slow query log
④ session timeout
⑤ HTTP Keepalive 설정
정답: ①
해설: HTTP 499는 클라이언트가 응답을 기다리지 못하고 연결을 종료했을 때 발생. 주로 proxy_read_timeout 설정값보다 백엔드(WAS)의 응답이 늦는 경우 발생.
총 20문항 제공 가능
➡️ 요청 시 전체 문항 생성하여 제공해드릴게요.
🧠 3. 암기카드 요약 (Flashcard형)
| WEB Server | 정적 리소스 처리, WAS로 요청 전달 (NGINX, Apache) |
| WAS | 동적 컨텐츠 처리 (Tomcat, WebLogic 등) |
| Sticky Session | L4/L7 로드밸런서에서 세션을 특정 서버에 고정 |
| GC 튜닝 | Full GC 발생 빈도, 메모리 누수 확인 |
| ThreadPool | 요청 병렬 처리 수 조절, WAS 성능 영향 |
| server.xml | 커넥터 설정, 포트 및 SSL 등 |
| context.xml | 리소스 설정(DB Pool 등), JNDI 연동 |
| session clustering | Redis, DB로 세션 공유하여 무중단 구성 |
| Connection Pool | maxActive, minIdle, validationQuery 설정 중요 |
| 499 오류 | NGINX에서 클라이언트가 응답 기다리지 못하고 종료한 경우 |
🔍 4. 블로그용 키워드 인덱스 요약본 (Ctrl+F 검색용)
✍️ 다음 추천 학습 흐름
- 기본개념 정리: 위 요약 + 암기카드 암기
- 시나리오 문제 풀기: 예상 문제집 20문항
- 실제 설정파일 분석: server.xml, web.xml, context.xml, setenv.sh 실습
- 장애 사례 스터디: HTTP 5xx, GC Delay, ThreadPool Block 등
- 오픈북 블로그 세팅: Ctrl+F 검색용 키워드 준비
🛠 WEB/WAS 실전 장애 대응 시나리오형 문제집 (총 15문항)
각 문항은 **[난이도 표시 포함]**이며, TA 시점에서 판단력, 원인 분석, 조치 방안까지 평가합니다.
✅ NO.01 - HTTP 499 오류 발생
[난이도: 중]
시나리오: 서비스 로그에서 HTTP 499 오류가 증가하고 있다. 클라이언트는 웹브라우저이며, WAS는 Tomcat, WEB은 NGINX이다.
질문: 가장 먼저 확인해야 할 설정은 무엇이며, 그 이유는?
- 정답: NGINX의 proxy_read_timeout 설정
- 해설: HTTP 499는 클라이언트가 응답을 기다리지 못하고 연결을 끊을 때 발생한다. 대부분 NGINX가 설정한 proxy_read_timeout보다 WAS의 응답이 늦을 때 발생하며, 이 경우 WAS 응답 시간이 정상인지 확인 후, NGINX timeout을 늘릴 수 있다.
✅ NO.02 - ThreadPool 고갈로 인한 대기
[난이도: 상]
시나리오: WAS에서 API 요청이 지연되고, maxThreads 도달로 새 요청이 지연되며, JVM은 정상 상태이다.
질문: 조치 순서를 서술하시오.
- 정답:
- threadDump로 스레드 상태 확인
- Blocking 요청 여부 확인 (ex: DB lock, 외부 API 대기 등)
- maxThreads 조정 또는 작업 분산
- 해설: 단순히 maxThreads를 올리는 것이 아니라, 대기 스레드의 원인을 분석해야 한다. threadDump 확인은 병목 원인 추적의 기본이다.
✅ NO.03 - Connection Pool 고갈
[난이도: 상]
시나리오: DB 연결 오류가 간헐적으로 발생하며, Cannot get a connection 메시지가 보인다. DB 자체는 정상이다.
질문: 가능한 원인과 대응 방안은?
- 정답: Connection Pool 고갈로 인해 새 요청을 처리하지 못함 → 원인: 커넥션 미반납, 대기시간 초과 등
- 대응: maxActive, maxWait, validationQuery 설정 확인, 커넥션 leak 점검
- 해설: 커넥션 풀은 DB 연결 자원으로, 미반납 시 다음 요청이 대기하게 되고 응답 지연이 발생한다. Validation 쿼리 및 Timeout 설정 확인이 필요하다.
✅ NO.04 - session timeout 오류
[난이도: 중]
시나리오: 로그인을 했지만 일정 시간 후 아무 행동 없이 페이지 이동 시 재로그인이 요구된다.
질문: 점검 항목을 모두 나열하시오.
- 정답:
- web.xml의 <session-timeout> 설정 확인
- NGINX idle timeout 확인
- 로드밸런서(L7)의 세션 유지 여부 확인
- 해설: 세션 유지 시간은 클라이언트와 WEB, WAS 각각의 timeout에 따라 종료될 수 있다.
✅ NO.05 - GC로 인한 응답 지연
[난이도: 상]
시나리오: WAS 서버에서 주기적으로 전체 API 응답이 멈추는 현상이 발생한다. 로그에는 Full GC가 확인된다.
질문: GC 튜닝을 위해 확인해야 할 항목은?
- 정답:
- -Xmx, -Xms 메모리 설정
- GC 로그 (-Xlog:gc*) 확보
- heapDump 분석
- OldGen 증가속도 확인
- 해설: Full GC는 Old 영역이 가득 차면 발생하며, 메모리 부족 또는 객체 누수가 원인일 수 있다. GC 로그를 통한 분석이 우선이다.
✅ NO.06 - WAS 종료 없이 포트 미응답
[난이도: 중]
시나리오: WAS 프로세스는 떠 있지만, 8080 포트에서 응답이 없다. netstat에선 포트 LISTEN 중이다.
질문: 추가로 확인할 항목은?
- 정답:
- ThreadPool 상태 (maxThreads 도달 여부)
- Application 내부 Blocking (DB, 외부 API 등)
- 해설: 프로세스는 살아 있어도 모든 요청을 처리하지 못하고 blocking 상태일 수 있다.
✅ NO.07 - WAR 재배포 이후 장애
[난이도: 하]
시나리오: 신규 WAR 파일 배포 이후 기존 REST API가 404를 발생시킨다.
질문: 우선 확인할 항목은?
- 정답: web.xml servlet mapping 또는 URL context path 설정
- 해설: 배포 후 404는 매핑 오류나 context path 오류가 주요 원인이다.
✅ NO.08 - Static 리소스 누락
[난이도: 하]
시나리오: 이미지, JS, CSS 파일이 로드되지 않으며 403 오류 발생
질문: 원인과 조치방안은?
- 정답: NGINX 또는 Apache의 접근 권한 설정 오류
- 조치: /static/ 경로 접근 허용, SELinux 또는 권한 확인
- 해설: 보안 설정으로 인한 차단일 수 있다.
✅ NO.09 - 세션 공유 안됨
[난이도: 상]
시나리오: L7 로드밸런서로 여러 WAS로 부하 분산 시 로그인 후 다른 요청에서 세션이 유지되지 않는다.
질문: 가능한 원인과 해결책은?
- 정답:
- Sticky Session 미적용 → 해결: Sticky 설정 적용
- Session clustering 미구현 → 해결: Redis, DB 등 외부 공유 세션 구현
- 해설: 세션이 노드 간 공유되지 않으면 로그인 상태가 유지되지 않는다.
✅ NO.10 - JSP 컴파일 지연
[난이도: 중]
시나리오: 신규 배포 후 처음 페이지 접근 시 응답 지연이 발생함
질문: 원인 및 개선방안은?
- 정답: JSP 최초 접근 시 컴파일 발생 → 개선: 사전 컴파일 또는 첫 접근 자동화 스크립트
- 해설: JSP는 최초 접근 시 컴파일을 수행하며 지연이 발생할 수 있다.
추가 구성 가능한 문제 항목 (예고)
| 11 | Tomcat 재시작 후 bind 오류 | 중 |
| 12 | Reverse Proxy 구성 오류 | 하 |
| 13 | /dev/random 대기 이슈 | 상 |
| 14 | Root Context 충돌 이슈 | 중 |
| 15 | XSS 필터 적용 오류 | 상 |
🛠 WEB/WAS 실전 장애 대응 시나리오 문제집 (30문항)
🔹1~10번: 응답 지연 및 오류 코드 중심
✅ NO.01 [중] HTTP 499 오류 발생
시나리오: 클라이언트 로그에 HTTP 499 오류 다수 발생
질문: 가장 먼저 확인할 설정은?
- 정답: NGINX proxy_read_timeout
- 해설: 클라이언트가 응답을 기다리지 못해 끊은 경우 발생하며, WAS 지연 시 timeout을 늘려야 한다.
✅ NO.02 [상] ThreadPool 고갈
시나리오: 요청 폭주 시 thread 수가 maxThreads에 도달
질문: 우선적으로 수행할 조치는?
- 정답: threadDump로 blocking 원인 확인
- 해설: 단순 thread 수 증가보단 병목 원인 파악이 선행되어야 함
✅ NO.03 [상] Connection Pool 고갈
시나리오: DB 연결 오류 – “cannot get connection” 발생
- 정답: 커넥션 미반납 여부, maxActive 확인
- 해설: Connection leak, validation query, timeout 등 점검 필수
✅ NO.04 [중] Session timeout 현상
시나리오: 로그인 후 일정 시간 뒤 세션 만료
- 정답: web.xml, LB idle timeout 설정 확인
- 해설: Client ↔ Web ↔ WAS 모든 경로의 timeout 정책 확인
✅ NO.05 [상] Full GC로 인한 멈춤
시나리오: 주기적 WAS 응답 멈춤
- 정답: GC 로그 확보 후 heap size, 객체 수명 확인
- 해설: Old 영역 누수, GC 정책 부적절, Memory over allocation 등
✅ NO.06 [중] WAS 프로세스는 살아 있으나 포트 응답 없음
시나리오: netstat에선 LISTEN, 요청 무응답
- 정답: ThreadPool block 상태 확인
- 해설: deadlock, 외부 API wait, DB lock 확인 필요
✅ NO.07 [하] WAR 재배포 이후 REST API 404
- 정답: URL 매핑 또는 context path 오류
- 해설: web.xml 매핑 확인
✅ NO.08 [하] 정적 리소스 403 오류
- 정답: 접근 권한 설정, SELinux 확인
- 해설: OS 또는 NGINX 보안 정책이 차단했을 가능성
✅ NO.09 [상] L7 LB 세션 미유지
- 정답: Sticky Session 또는 Session Clustering 미구현
- 해설: Redis, DB 등 외부 세션 공유 구현 고려
✅ NO.10 [중] JSP 초기 진입 지연
- 정답: 최초 JSP 컴파일
- 해설: 사전 컴파일로 지연 최소화 가능
🔹11~20번: 설정 오류 및 배포 장애 중심
✅ NO.11 [중] Tomcat 재기동 후 8080 bind 오류
- 정답: 이전 프로세스 종료 미완 → ps -ef | grep java 확인
- 해설: OS 포트 점유 상태를 확인해야 함
✅ NO.12 [하] NGINX reverse proxy 설정 오류
- 정답: proxy_pass 대상 주소 확인
- 해설: 슬래시 유무, root vs alias 문제
✅ NO.13 [상] /dev/random 대기
- 정답: Entropy 부족 → /dev/urandom 사용
- 해설: TLS handshake 지연 원인
✅ NO.14 [중] root context 중복
- 정답: context.xml의 path 중복 제거
- 해설: ROOT.war 중복시 충돌 발생
✅ NO.15 [상] web.xml 필터 설정 오류
- 정답: URL 패턴 잘못 매핑됨
- 해설: 필터 우선순위, mapping 순서 확인
✅ NO.16 [중] 비정상적인 reload 후 500
- 정답: server.xml, context.xml 설정 충돌
- 해설: 자원 중복 또는 오염된 캐시로 인한 문제
✅ NO.17 [상] OutOfMemoryError: Metaspace
- 정답: JVM 옵션 중 -XX:MaxMetaspaceSize 증가
- 해설: 클래스 로더 누수 또는 클래스 재정의 가능성
✅ NO.18 [중] PermGen space 오류
- 정답: Java 7 이전 → -XX:MaxPermSize 조정
- 해설: Java 8 이후는 Metaspace로 대체됨
✅ NO.19 [중] WAR 안에 libs 충돌
- 정답: 의존 라이브러리 버전 불일치
- 해설: ClassLoader 충돌 → NoSuchMethodError 가능
✅ NO.20 [하] 로컬에서는 정상, 서버에서 오류
- 정답: 환경변수 또는 시스템 속성 누락
- 해설: -Dspring.profiles.active 누락 등
🔹21~30번: 보안, 인프라 및 외부 연동 장애
✅ NO.21 [중] CSRF 오류 발생
- 정답: Referer, Origin 헤더 누락
- 해설: 웹브라우저 외부 접근 시 차단됨
✅ NO.22 [상] 외부 API 호출 시 timeout
- 정답: 호출 timeout, retry 정책 미적용
- 해설: Circuit Breaker 적용 검토
✅ NO.23 [중] TLS 인증서 오류
- 정답: 인증서 만료 또는 신뢰 anchor 없음
- 해설: SSL chain 누락 가능성
✅ NO.24 [상] JVM CPU 사용률 100%
- 정답: Infinite Loop, Busy Wait
- 해설: jstack, jvisualvm 활용
✅ NO.25 [중] NGINX Keepalive 사용 시 문제
- 정답: Connection 재사용 실패
- 해설: backend connection pool 부족
✅ NO.26 [상] Tomcat에 사용자 정의 필터 적용 시 모든 요청 실패
- 정답: filter에서 예외 처리 누락
- 해설: chain.doFilter 미호출로 chain 중단됨
✅ NO.27 [하] WAS 로그가 생성되지 않음
- 정답: log4j/logback 설정 경로 오류
- 해설: log 디렉토리 권한 포함 확인
✅ NO.28 [상] Redis 기반 세션 장애 발생
- 정답: Redis eviction 정책 및 TTL 설정
- 해설: 세션 만료 및 메모리 부족 문제 발생 가능
✅ NO.29 [중] gzip 설정 후 페이지 깨짐
- 정답: 중복 압축 설정
- 해설: WAS와 WEB 모두 gzip 시 이중 압축
✅ NO.30 [상] multipart 업로드 오류
- 정답: maxPostSize 설정 부족
- 해설: 업로드 용량 제한 기본 2MB
📌 다음 제공 가능 항목
- ✅ [PDF/Word 변환]: 실전 대비 문제집 출력용
- ✅ [암기카드 요약]: 키워드 중심 1줄 요약
- ✅ [Ctrl+F용 키워드 인덱스]: 블로그용 검색 최적화
- ✅ [빈칸형 연습문제/정답 숨김용 버전]
🧠 WEB/WAS 실전 장애 대응 암기카드 요약 (30개)
| 01 | HTTP 499 | NGINX의 proxy_read_timeout 설정이 낮으면 WAS 응답 지연 시 499 오류 발생 |
| 02 | ThreadPool 고갈 | maxThreads 도달 시 threadDump로 blocking 원인부터 분석 |
| 03 | ConnectionPool 고갈 | 커넥션 미반납, leak 발생 시 DB 연결 오류 발생 |
| 04 | Session timeout | web.xml, LB, NGINX 모두 timeout 설정 확인 필요 |
| 05 | Full GC 지연 | Full GC로 WAS 전체 멈춤 → GC 로그, heapDump 분석 필요 |
| 06 | 프로세스 살아있지만 무응답 | 포트 LISTEN이어도 blocking thread로 응답 없음 가능 |
| 07 | WAR 재배포 404 | context path 또는 servlet mapping 설정 오류 확인 |
| 08 | 정적 리소스 403 | NGINX 권한, SELinux, 파일 권한 설정 확인 |
| 09 | 세션 미유지 | Sticky Session 또는 Session clustering 미적용 문제 |
| 10 | JSP 지연 | 최초 JSP 접근 시 컴파일 지연 → 사전 컴파일 권장 |
| 11 | 포트 바인딩 실패 | 이전 WAS 프로세스 종료 안 됨 → ps, lsof로 확인 |
| 12 | reverse proxy 오류 | NGINX proxy_pass 경로 오류 또는 슬래시 누락 문제 |
| 13 | /dev/random 지연 | TLS handshake 지연 → /dev/urandom 사용 권장 |
| 14 | Root context 충돌 | context path 중복 시 충돌 발생 (ex: ROOT.war) |
| 15 | web.xml 필터 오류 | 잘못된 필터 매핑 시 요청 전체 차단 가능 |
| 16 | Reload 후 500 | 설정파일 충돌 또는 context 오염 가능성 |
| 17 | Metaspace OOM | -XX:MaxMetaspaceSize 설정 부족 또는 클래스 로더 누수 |
| 18 | PermGen OOM | Java 7 이하에서는 -XX:MaxPermSize로 설정 필요 |
| 19 | 라이브러리 충돌 | WAR 내 라이브러리 중복 → NoSuchMethodError 가능 |
| 20 | 로컬만 정상 | -Dspring.profiles.active 등 환경변수 누락 의심 |
| 21 | CSRF 오류 | Referer 또는 Origin 헤더 누락 시 필터 통과 실패 |
| 22 | 외부 API timeout | Retry, timeout, Circuit Breaker 미구현 시 장애 발생 |
| 23 | TLS 인증서 오류 | 인증서 만료 또는 Chain 누락으로 SSL 오류 발생 |
| 24 | JVM CPU 100% | 무한 루프, Busy Wait 발생 → jstack 분석 필요 |
| 25 | Keepalive 문제 | WEB ↔ WAS 간 커넥션 재사용 실패 → connection pool 확인 |
| 26 | Filter 적용 후 전체 오류 | chain.doFilter 호출 누락 시 전체 요청 막힘 |
| 27 | 로그 생성 안됨 | log 설정 경로 오류 또는 로그 디렉토리 권한 문제 |
| 28 | Redis 세션 장애 | TTL, eviction 정책 미설정 시 세션 유실 가능 |
| 29 | gzip 설정 오류 | WAS/WEB 모두 gzip 설정 시 이중 압축으로 오류 발생 |
| 30 | 파일 업로드 실패 | multipart 설정의 maxPostSize 미조정으로 제한 초과 발생 |
📌 활용 팁
- ✅ 오픈북용 블로그: Ctrl+F → 키워드 검색 (gzip, 499, GC, threadpool, redis, upload)
- ✅ 시험 직전 스캔: 개념-원인-조치 키워드 3단 기억 반복
- ✅ PDF 카드화 요청 가능: 원하시면 카드 형식으로 PDF 출력도 해드릴게요
'WEB & WAS > 기본 개념' 카테고리의 다른 글
| WEB/WAS 실무 심화 핵심 요약 (0) | 2025.05.08 |
|---|