[실습] 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 | 포트 | 스펙 |
|---|---|---|---|
| Web | 10.0.0.10 | 80 | 1GB RAM, 1 CPU |
| WAS | 10.0.0.20 | 8080 | 1GB RAM, 1 CPU |
| DB | 10.0.0.30 | 3306 | 1GB RAM, 1 CPU |
🔧 사전 준비
필수 소프트웨어 설치
# 설치 확인
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-3tier2. 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.define | VM 이름 정의 (db, was, web) |
vm.network | 네트워크 구성 (Private Network, 고정 IP) |
vm.provider | VirtualBox 설정 (메모리, 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...프로비저닝 과정:
-
DB Server (10.0.0.30)
- MariaDB 설치
- 외부 접속 허용 설정 (
0.0.0.0바인딩) - 데이터베이스
mydb및 사용자appuser생성 - 테스트 테이블 및 샘플 데이터 삽입
-
WAS Server (10.0.0.20)
- Java 11 및 Tomcat 9 설치
- DB 연결 테스트 (30초 대기 후 확인)
- Tomcat 자동 시작
-
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 자동 생성
🔗 관련 링크
- 전체 Vagrantfile 코드: vagrant-3tier-code
- Vagrant 공식 문서
- VirtualBox 다운로드
📌 다음 단계
- Docker Compose로 동일한 3-Tier 구성 (컨테이너 버전)
- Ansible로 프로비저닝 자동화 개선
- Terraform + AWS로 클라우드 환경 구축
- Load Balancer 추가 (Nginx 이중화)
- 모니터링 스택 추가 (Prometheus + Grafana)
결론: Vagrant는 로컬에서 인프라를 코드로 관리하는 경험을 쌓기에 완벽한 도구임. 이번 실습을 통해 3-Tier 아키텍처의 기본 개념과 자동화의 가치를 체감할 수 있었음. 🚀