[DB] 3계층 아키텍처

cowmin·2025년 6월 13일
post-thumbnail

1. 개요

1.1 실습 목적 및 시스템 개요

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

  • 3계층 아키텍처 네트워크 구성도
    3계층 아키텍처 네트워크 구성도

1.2 3계층 아키텍처란?

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)로 구성하여 구조를 구현했다.


2. 서버 환경 및 구성

  • 가상화 환경: VMware
  • 네트워크 방식: NAT (내부망 192.168.32.xxx, 외부와 통신 가능)
  • 내부 통신: 192.168.32.xxx 대역을 공유하여 모든 서버 간 직접 통신 가능
서버OS호스트네임서비스IP 주소
WEBUbuntu 22.04web01nginx/1.18.0192.168.32.110
WASUbuntu 22.04was01openjdk-17-jdk
Apache Tomcat/10.1.42
192.168.32.120
DBUbuntu 22.04db01MariaDB 10.6.22192.168.32.150

3. 웹 서버(WEB - Nginx)

1. nginx 설치

apt install nginx

2. Tomcat 연동 설정 (proxy_pass 등)

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;
        }
}

3. 정적 HTML 배포

/var/www/web 디렉토리에 html 파일 업로드


4. 애플리케이션 서버 (WAS - Tomcat)

1. Java 설치

apt install -y openjdk-17-jdk

2. Tomcat 설치 및 JDBC 드라이버 추가

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 파일을 업로드함

3. JSP 업로드 및 DB 연결

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!");
    }
%>

5. 데이터베이스 서버 (DB - MariaDB)

1. 데이터베이스 및 테이블 생성 SQL

-- 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)
);

2. 사용자 계정 생성 및 권한 부여

-- 사용자 생성
CREATE USER 'ysm'@'localhost' IDENTIFIED BY 'password';

-- 권한 부여
GRANT ALL PRIVILEGES ON web.* TO 'ysm'@'localhost';

-- 권한 적용
FLUSH PRIVILEGES;

-- 사용자 목록 확인
SELECT user, host FROM mysql.user;

6. 기능 테스트

6.1 회원가입 (users 테이블 연동)

6.2 게시글 작성 (posts 테이블 연동)

0개의 댓글