[실습] Vagrant로 3-Tier 아키텍처 구축하기

로컬 PC에서 Vagrant + VirtualBox로 Web-WAS-DB 3계층 아키텍처를 구성하고 자동 프로비저닝해본 실습 기록


🎯 실습 목표

  • 3-Tier 아키텍처 개념 이해 및 실습
  • Vagrant + VirtualBox로 멀티 VM 환경 구축
  • Shell Script 프로비저닝으로 자동화 경험
  • 각 계층 간 네트워크 통신 검증

📚 3-Tier 아키텍처란?

애플리케이션을 3개 계층으로 분리하는 소프트웨어 아키텍처 패턴:

계층역할구성 예시
Presentation Tier (Web)사용자 인터페이스, 정적 콘텐츠 제공Nginx, Apache
Application Tier (WAS)비즈니스 로직 처리Tomcat, Node.js, Spring Boot
Data Tier (DB)데이터 저장 및 관리MySQL, PostgreSQL, MongoDB

장점

  • 확장성: 각 계층을 독립적으로 스케일 아웃
  • 유지보수: 계층별 독립적 수정/배포
  • 보안: 직접적인 DB 접근 차단
  • 역할 분리: 프론트엔드/백엔드/DB 개발자 협업 용이

🏗️ 구성 아키텍처

┌─────────────────────────────────────────────┐
│ Host PC (Windows/Mac/Linux)                 │
│  ┌──────────────────────────────────────┐   │
│  │ VirtualBox                           │   │
│  │  ┌────────┐  ┌────────┐  ┌────────┐  │   │
│  │  │  Web   │─▶│  WAS   │─▶│   DB   │  │   │
│  │  │ Nginx  │  │Tomcat9 │  │MariaDB │  │   │
│  │  │10.0.0.10  │10.0.0.20  │10.0.0.30  │   │
│  │  └────────┘  └────────┘  └────────┘  │   │
│  └──────────────────────────────────────┘   │
│         ▲                                   │
│         │ Port Forwarding (80→8080)         │
│         │                                   │
│    http://localhost:8080                    │
└─────────────────────────────────────────────┘

IP 구성

서버IP포트스펙
Web10.0.0.10801GB RAM, 1 CPU
WAS10.0.0.2080801GB RAM, 1 CPU
DB10.0.0.3033061GB RAM, 1 CPU

🔧 사전 준비

필수 소프트웨어 설치

  1. VirtualBox 7.0+

  2. Vagrant 2.3+

# 설치 확인
vagrant --version
# 출력: Vagrant 2.4.9
 
VBoxManage --version
# 출력: 7.2.4r...

시스템 요구사항

  • 메모리: 최소 4GB (권장 8GB 이상)
  • 디스크: 10GB 여유 공간
  • CPU: 가상화 지원 (BIOS에서 Intel VT-x/AMD-V 활성화)

🚀 실습 과정

1. 프로젝트 디렉토리 생성

# D 드라이브에 프로젝트 폴더 생성
D:
mkdir vagrant-3tier
cd vagrant-3tier

2. Vagrantfile 작성

Vagrantfile은 Vagrant의 설정 파일이다. Ruby 언어로 작성되며, VM의 수, 스펙, 네트워크, 프로비저닝 스크립트 등을 정의함.

핵심 설정:

# 순차 실행 보장 (DB → WAS → Web 순서)
ENV['VAGRANT_NO_PARALLEL'] = 'yes'
 
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"  # Ubuntu 22.04 LTS
  
  # DB Server 정의
  config.vm.define "db" do |db|
    db.vm.hostname = "db-server"
    db.vm.network "private_network", ip: "10.0.0.30"
    
    db.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
      vb.cpus = 1
    end
    
    # MariaDB 설치 및 설정 (Shell Script 프로비저닝)
    db.vm.provision "shell", inline: <<-SHELL
      # apt 업데이트 및 MariaDB 설치
      apt-get update
      DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server
      
      # 외부 접속 허용
      sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
      systemctl restart mariadb
      
      # DB 및 사용자 생성
      mysql -e "CREATE DATABASE mydb;"
      mysql -e "CREATE USER 'appuser'@'%' IDENTIFIED BY 'password';"
      mysql -e "GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'%';"
      mysql -e "FLUSH PRIVILEGES;"
    SHELL
  end
  
  # WAS, Web 서버도 동일한 방식으로 정의...
end

💡 전체 Vagrantfile 코드: vagrant-3tier-code 참고

주요 개념:

설정설명
config.vm.box사용할 베이스 이미지 (Ubuntu 22.04)
config.vm.defineVM 이름 정의 (db, was, web)
vm.network네트워크 구성 (Private Network, 고정 IP)
vm.providerVirtualBox 설정 (메모리, CPU)
vm.provision자동 실행 스크립트 (Shell, Ansible 등)

3. VM 생성 및 프로비저닝

# 모든 VM 생성 및 자동 설치 (5-10분 소요)
vagrant up
 
# 출력 예시:
# Bringing machine 'db' up with 'virtualbox' provider...
# Bringing machine 'was' up with 'virtualbox' provider...
# Bringing machine 'web' up with 'virtualbox' provider...
# ==> db: Installing MariaDB...
# ==> was: Installing Tomcat 9...
# ==> web: Installing Nginx...

프로비저닝 과정:

  1. DB Server (10.0.0.30)

    • MariaDB 설치
    • 외부 접속 허용 설정 (0.0.0.0 바인딩)
    • 데이터베이스 mydb 및 사용자 appuser 생성
    • 테스트 테이블 및 샘플 데이터 삽입
  2. WAS Server (10.0.0.20)

    • Java 11 및 Tomcat 9 설치
    • DB 연결 테스트 (30초 대기 후 확인)
    • Tomcat 자동 시작
  3. Web Server (10.0.0.10)

    • Nginx 설치
    • 리버스 프록시 설정 (80번 포트 → WAS 8080 포워딩)
    • WAS 연결 테스트

4. 상태 확인

# VM 상태 확인
vagrant status
 
# 출력:
# Current machine states:
# db        running (virtualbox)
# was       running (virtualbox)
# web       running (virtualbox)

5. 동작 테스트

방법 1: 호스트에서 접근 (Port Forwarding)

# 웹 브라우저에서
http://localhost:8080
 
# 또는 curl로
curl http://localhost:8080

결과: Tomcat 기본 페이지 확인 ✅

방법 2: VM 내부에서 확인

# Web 서버 접속
vagrant ssh web
 
# Nginx가 WAS로 프록시하는지 확인
curl http://10.0.0.20:8080
 
# WAS에서 DB 연결 확인
vagrant ssh was
mysql -h 10.0.0.30 -u appuser -ppassword mydb -e "SELECT * FROM test_table;"
 
# 출력:
# +----+-----------------------+
# | id | message               |
# +----+-----------------------+
# |  1 | Hello from DB Server! |
# +----+-----------------------+

🐛 트러블슈팅

문제 1: VM이 병렬로 생성되어 순서가 꼬임

증상: WAS가 DB보다 먼저 떠서 DB 연결 실패

해결:

# Vagrantfile 상단에 추가
ENV['VAGRANT_NO_PARALLEL'] = 'yes'

문제 2: WAS에서 DB 연결 안 됨

원인: MariaDB가 localhost(127.0.0.1)만 리스닝

해결:

# DB 서버에서
sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl restart mariadb

문제 3: 포트 충돌

증상: Vagrant cannot forward the specified ports on this VM

해결:

# Vagrantfile에서 다른 포트 사용
web.vm.network "forwarded_port", guest: 80, host: 8081

💡 배운 점

1. Vagrant는 로컬 IaC 실습에 최적이다

  • 클라우드 비용 없이 인프라 코드 학습 가능
  • vagrant up 한 번으로 전체 환경 구축
  • 망쳐도 vagrant destroy 후 재생성하면 됨

2. 프로비저닝 자동화의 중요성

  • Shell Script로 시작해서 Ansible 등으로 확장 가능
  • 수동 설치 대비 실수 방지, 재현성 보장
  • 실무 DevOps 업무의 기본

3. 3-Tier 아키텍처의 실제 구조 이해

  • 각 계층이 독립적으로 동작하며 API로 통신
  • DB를 직접 노출하지 않고 WAS를 통해 접근
  • 확장 시 계층별로 VM 추가만 하면 됨

4. 네트워크 이해도 향상

  • Private Network (Host-Only): VM 간 통신
  • Port Forwarding: 호스트에서 VM 접근
  • Vagrant는 항상 첫 번째 어댑터로 NAT 자동 생성

🔗 관련 링크


📌 다음 단계

  • Docker Compose로 동일한 3-Tier 구성 (컨테이너 버전)
  • Ansible로 프로비저닝 자동화 개선
  • Terraform + AWS로 클라우드 환경 구축
  • Load Balancer 추가 (Nginx 이중화)
  • 모니터링 스택 추가 (Prometheus + Grafana)

결론: Vagrant는 로컬에서 인프라를 코드로 관리하는 경험을 쌓기에 완벽한 도구임. 이번 실습을 통해 3-Tier 아키텍처의 기본 개념과 자동화의 가치를 체감할 수 있었음. 🚀