시리즈 종료를 선언합니다.

배운 건 많은데 과연 내 기억에 남을지 ..

1. 개요

지난 세션에서 구축한 Docker 기반 WEB-WAS-DB 3-Tier 고가용성(HA) 아키텍처 인프라 위에 실제 동적 트랜잭션이 발생하는 웹 애플리케이션을 배포하고 데이터 파이프라인을 연결한다. 나아가 인프라의 안정적인 운영 및 모니터링을 위해 오픈소스 표준 APM 스택인 Prometheus와 Grafana 관제 시스템을 설계도에 통합하고 최종 검증을 수행한다.

2. 가상 인프라 및 관제 시스템 아키텍처 (Architecture Blueprint)

전체 시스템 구조는 최전방 Nginx(WEB)에서 트래픽을 수신하여 2대의 Tomcat(WAS) 클러스터로 로드 밸런싱을 수행하고, 백엔드의 MySQL(DB)과 실시간 트랜잭션을 처리하는 구조다. 여기에 프로메테우스가 각 노드의 메트릭을 수집하고 그라파나가 이를 시각화하는 APM 레이어가 추가되었다.

[Client Browser]
       │
       ▼ (HTTP/80)
┌──────────────┐
│ Nginx (WEB)  │ ──┐ (Round-Robin Proxy)
└──────────────┘   │
       │           ├─► ┌──────────────┐
       │ (내부망)  │   │  Tomcat-1    │ (WAS 1) ──┐
       │           │   └──────────────┘           │
       │           ├─► ┌──────────────┐           │ (JDBC / 3306)
       │           │   │  Tomcat-2    │ (WAS 2) ──┼─► ┌──────────────┐
       ▼           └── └──────────────┘           │   │  MySQL (DB)  │
┌──────────────────────────────┐                  │   └──────────────┘
│ APM 모니터링 레이어           │ ◄────────────────┘ (Metrics Scrape)
│ - Prometheus (데이터 수집)   │
│ - Grafana (3000포트 시각화)  │
└──────────────────────────────┘

3. 상세 구축 및 고도화 과정

Phase 1: 백엔드 DBMS 가상 콘솔 진입 및 스키마/데이터 구축

도커 컴포즈로 기동 중인 MySQL 가상 컨테이너 심장부에 직접 진역하여 방명록용 테이블 스키마를 생성하고 초기 검증용 영문 데이터를 적재했다.

  • MySQL 컨테이너 내부 접속 명령어:
  • DOS
     
    docker compose exec db mysql -u myuser -pmypassword mydb
    
  • 테이블 생성 및 데이터 인서트 DDL/DML (증적용):
  • SQL
     
    CREATE TABLE tb_guestbook (
        idx INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(30) NOT NULL,
        content TEXT NOT NULL,
        reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
    UPDATE tb_guestbook SET username = 'Zoe_Manager', content = 'Successfully connected DB to the non-stop infrastructure portal! Architecture complete!' WHERE idx = 1;
    UPDATE tb_guestbook SET username = 'Nginx_Rider', content = 'Safely and fairly distributing traffic via Round-Robin routing.' WHERE idx = 2;
    UPDATE tb_guestbook SET username = 'Tomcat_Cat', content = 'No more 404 errors. Serving the application perfectly now.' WHERE idx = 3;
    

Phase 2: WAS-DB 간 JDBC 드라이버 탑재 및 볼륨 마운트

자바(Tomcat) 미들웨어가 MySQL과 통신할 수 있도록 전용 커넥터 라이브러리(jar)를 다운로드하고, 컨테이너 내부에 공유 결합하는 구조를 설계도에 반영했다.

  • JDBC 드라이버 런타임 파일 다운로드:
  • DOS
     
    curl -o mysql-connector-j-8.0.33.jar https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
    
  • docker-compose.yml 내 드라이버 주입 설정 (증적용):
  • YAML
     
      was:
        image: tomcat:9.0
        scale: 2
        expose:
          - "8080"
        volumes:
          - ./ROOT:/usr/local/tomcat/webapps/ROOT
          - ./mysql-connector-j-8.0.33.jar:/usr/local/tomcat/lib/mysql-connector-j-8.0.33.jar
    

Phase 3: 프론트엔드 입력 폼 및 백엔드 동적 DB 저장 로직 구현 (index.jsp)

단순한 텍스트 하드코딩 조회 화면을 탈피하여 사용자가 직접 브라우저에서 데이터를 입력하고 저장할 수 있는 동적 트랜잭션 페이지를 개발했다.

  • JSP 주석 규격을 엄격히 준수하여 기존 톰캣 컴파일러의 500 내부에러(Page directive must not have multiple occurrences of pageencoding) 리스크를 원천 제거했다.
  • PreparedStatement 객체를 활용하여 실무 엔터프라이즈 보안 표준인 SQL 인젝션(SQL Injection) 취약점 방어 코드를 구현했다.
  • 데이터 삽입 완료 후 response.sendRedirect("index.jsp"); 메커니즘을 이식하여 브라우저 새로고침(F5) 시 데이터가 중복 인서트되는 트랜잭션 오류를 방지했다.

Phase 4: 오픈소스 표준 APM 관제 시스템(Prometheus & Grafana) 연계

인프라 부하 상태 및 자원 임계치를 실시간 뷰어로 관제하기 위해 프로메테우스와 그라파나 컨테이너 스택을 오케스트레이션 설계도에 추가했다.

  • prometheus.yml 환경 설정 파일 구축 (증적용):
  • YAML
     
    global:
      scrape_interval: 10s
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
    
  • APM 레이어가 포함된 최종 완성본 docker-compose.yml (증적용):
  • YAML
     
    version: '3.8'
    services:
      web:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf
      was:
        image: tomcat:9.0
        scale: 2
        expose:
          - "8080"
        volumes:
          - ./ROOT:/usr/local/tomcat/webapps/ROOT
          - ./mysql-connector-j-8.0.33.jar:/usr/local/tomcat/lib/mysql-connector-j-8.0.33.jar
      db:
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_DATABASE: mydb
          MYSQL_USER: myuser
          MYSQL_PASSWORD: mypassword
        expose:
          - "3306"
      prometheus:
        image: prom/prometheus:latest
        ports:
          - "9090:9090"
        volumes:
          - ./prometheus.yml:/etc/prometheus/prometheus.yml
      grafana:
        image: grafana/grafana:latest
        ports:
          - "3000:3000"
    

4. 최종 구동 검증 및 보안 감사(Security Audit) 결과

  1. 동적 로드밸런싱 및 데이터 정합성 검증: http://localhost 접근 시 프론트엔드 방명록 화면이 정상 렌더링된다. 새로고침 시 상단의 WAS 응답 내부 IP는 라운드 로빈에 의해 실시간으로 스위칭되나, 하단의 MySQL 데이터는 세션 차단 없이 완벽히 동기화되어 출력되는 고가용성(HA)을 검증했다.
  2. 데이터 무결성 트랜잭션 성공: 실시간 입력 폼에 테스트 데이터를 입력하고 등록 버튼 클릭 시, 백엔드 파이프라인을 타고 MySQL 내부에 즉시 적재되어 하단 표 테이블에 실시간으로 반영된다.
  3. APM 관제탑 가동: http://localhost:3000 그라파나 대시보드 서버에 정상 접근하여 계정 보안 설정을 갱신했다. 시계열 데이터 DB인 프로메테우스가 수집한 인프라 자원 메트릭이 실시간 그래프 선형 데이터로 정상 모니터링되는 것을 확인했다.
  4. GitHub 퍼블릭 배포 전 보안 검토: 로컬 연습용 더미 패스워드 구조이므로 퍼블릭 레포지토리 업로드가 가능하다. 다만 무거운 런타임 파일 배포 방지를 위해 .gitignore에 *.jar 및 *.log 정규식을 자산화하여 Git 추적 대상에서 제외 처리했다.

5. 결론 및 결어

8GB RAM 노트북이라는 열악한 호스트 물리 자원의 한계를 Docker 컨테이너 가상화 기술을 통해 극복하고, 실제 운영 환경에 준하는 [Nginx 리버스 프록시 -> Tomcat 이중화 클러스터 -> MySQL 격리 내부망 RDBMS -> Prometheus/Grafana APM 관제]로 이어지는 완벽한 인프라 및 백엔드 파이프라인 전 과정을 빌드업하는 데 성공했다. 이상으로 인프라 담당자 관점의 기술 구조 검증 세션을 종료한다.

+ Recent posts