이 실습의 목적은 프론트엔드부터 백엔드, 데이터베이스까지 독립된 계층으로 구성된 3계층 아키텍처 시스템을 구축해보는 것이다.
Nginx, Tomcat, MariaDB를 사용하여 각 계층을 구분하고, 실제 요청 흐름을 따라가며 동작을 이해하는 데 중점을 두었다.

3계층 아키텍처(Three-tier Architecture)는 애플리케이션을 세 가지 역할로 나누어 각 계층이 독립적으로 구성되는 구조다.
| 계층 | 구성 요소 예시 | 주요 역할 |
|---|---|---|
| 1. 프레젠테이션 계층 (Presentation Layer) | 웹 브라우저, 프론트엔드 (HTML/CSS/JS) | 사용자 인터페이스 제공, 사용자 입력 처리 |
| 2. 비즈니스 로직 계층 (Application Layer) | 웹 서버, 애플리케이션 서버 (Java, Spring, Node.js 등) | 비즈니스 로직 수행, 데이터 처리 |
| 3. 데이터 계층 (Data Layer) | DB 서버 (MySQL, Oracle, MongoDB 등) | 데이터 저장 및 조회, 데이터 무결성 유지 |
이 실습에서는 각각의 계층을 WEB(Nginx), WAS(Tomcat), DB(MariaDB)로 구성하여 구조를 구현했다.
| 서버 | OS | 호스트네임 | 서비스 | IP 주소 |
|---|---|---|---|---|
| WEB | Ubuntu 22.04 | web01 | nginx/1.18.0 | 192.168.32.110 |
| WAS | Ubuntu 22.04 | was01 | openjdk-17-jdk Apache Tomcat/10.1.42 | 192.168.32.120 |
| DB | Ubuntu 22.04 | db01 | MariaDB 10.6.22 | 192.168.32.150 |
apt install nginx
upstream tomcat_backend {
server 192.168.32.120:8080; // WAS IP주소:tomcat 포트
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/web;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /api { // URL 경로가 /api로 시작하는 요청을 이 블록에서 처리
rewrite ^/api(/.*)$ $1 break;
proxy_pass http://tomcat_backend; // 요청을 http://tomcat_backend로 프록시
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
/var/www/web 디렉토리에 html 파일 업로드
apt install -y openjdk-17-jdk
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.42/bin/apache-tomcat-10.1.42.tar.gz
tar -xvf apache-tomcat-10.1.42.tar.gz
MariaDB를 사용하고있기때문에 tomcat설치 경로/lib 에 mariadb-java-client-3.3.3.jar 파일을 업로드함
vi /usr/local/tomcat10/webapps/ROOT/db.jsp
<%@ page import="java.sql.*" %>
<%
String dbURL = "jdbc:mariadb://192.168.32.150:3306/web"; // [DB 서버 IP주소][DB서비스 포트][데이터베이스 명]
String dbUser = "ysm"; // [DB 계정]
String dbPassword = "qwer1234"; // [DB 계정 비밀번호]
Connection conn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
System.out.println("DB success!");
} catch (Exception e) {
e.printStackTrace();
response.setContentType("text/html;charset=UTF-8");
out.println("DB failed!");
}
%>
-- web 데이터베이스 생성
CREATE DATABASE web;
-- web 데이터베이스 사용
USE web;
-- users 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
-- posts 테이블 생성 (users 테이블과 외래키 관계)
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 사용자 생성
CREATE USER 'ysm'@'localhost' IDENTIFIED BY 'password';
-- 권한 부여
GRANT ALL PRIVILEGES ON web.* TO 'ysm'@'localhost';
-- 권한 적용
FLUSH PRIVILEGES;
-- 사용자 목록 확인
SELECT user, host FROM mysql.user;




