logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Docker

Docker - 3Tier 아키텍쳐 구성

Rawon
2025년 10월 1일
목차
Docker로 구현하는 3-Tier 아키텍처
3-Tier 아키텍처 개요
각 계층의 역할
Docker를 활용한 3-Tier 구성
NGINX 프록시 설정 예시
3-Tier 아키텍처의 주요 이점
실무에서의 구현 고려사항

목차

Docker로 구현하는 3-Tier 아키텍처
3-Tier 아키텍처 개요
각 계층의 역할
Docker를 활용한 3-Tier 구성
NGINX 프록시 설정 예시
3-Tier 아키텍처의 주요 이점
실무에서의 구현 고려사항

Docker로 구현하는 3-Tier 아키텍처

3-Tier 아키텍처 개요

javascript
+----------------+       +----------------+       +----------------+
|                |       |                |       |                |
|   클라이언트    +------>+    웹 서버     +------>+  애플리케이션   +------>+  데이터베이스  |
|   (브라우저)    |       |   (NGINX)     |       |    서버        |       |   (MySQL 등)  |
|                |       |                |       |                |       |                |
+----------------+       +----------------+       +----------------+       +----------------+
                           정적 파일 제공           비즈니스 로직 처리         데이터 저장/조회

각 계층의 역할

1. 프레젠테이션 계층 (웹 서버)

  • 사용자 인터페이스 제공
  • 정적 파일(HTML, CSS, JavaScript) 서빙
  • API 요청을 애플리케이션 서버로 프록시
  • 일반적으로 NGINX, Apache 등 사용
  • 보안의 첫 번째 방어선 역할

2. 애플리케이션 계층 (웹 애플리케이션 서버)

  • 비즈니스 로직 처리
  • 데이터 가공 및 처리
  • 외부에 직접 노출되지 않음
  • Node.js, Spring Boot, Django 등 다양한 기술 스택 사용

3. 데이터 계층 (데이터베이스 서버)

  • 데이터의 영구 저장소
  • 구조화된 데이터 관리
  • MySQL, PostgreSQL, MongoDB 등 사용

Docker를 활용한 3-Tier 구성

yaml
version: '3'

services:
  # 웹 서버 (프레젠테이션 계층)
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./frontend:/usr/share/nginx/html
    depends_on:
      - backend
    networks:
      - frontend-network

  # 애플리케이션 서버 (비즈니스 계층)
  backend:
    build: ./backend
    environment:
      - DB_HOST=database
      - DB_USER=user
      - DB_PASSWORD=password
      - DB_NAME=myapp
    expose:
      - "8080"
    depends_on:
      - database
    networks:
      - frontend-network
      - backend-network

  # 데이터베이스 서버 (데이터 계층)
  database:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=myapp
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - backend-network

networks:
  frontend-network:
  backend-network:

volumes:
  db-data:

NGINX 프록시 설정 예시

javascript
server {
    listen 80;
    server_name 
example.com
;

    # 정적 파일 제공
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # API 요청을 백엔드로 프록시
    location /api/ {
        proxy_pass 
http://backend:8080/
;
        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-Tier 아키텍처의 주요 이점

  1. 보안 강화: 각 계층은 필요한 계층에만 접근 가능
  2. 확장성: 각 계층을 독립적으로 수평/수직 확장 가능
  3. 유지보수성: 계층별 독립적인 업데이트/배포 가능
  4. 성능 최적화: 각 계층별 최적화 전략 적용 가능
  5. 장애 격리: 한 계층의 문제가 다른 계층에 제한적 영향

실무에서의 구현 고려사항

  • 컨테이너 간 통신은 Docker 네트워크를 통해 격리
  • 환경변수를 통한 설정 관리
  • 데이터 영구성을 위한 볼륨 마운트
  • 보안을 위한 내부 네트워크 구성
  • 헬스체크 및 자동 복구 설정

일반적으로 엔터프라이즈 웹 애플리케이션은 3가지 종류의 서버로 구성됩니다.

  1. 프론트엔드 소스를 제공하는 웹 서버
  2. 비즈니스 로직을 수행하는 웹 어플리케이션 서버
  3. 데이터를 저장하는 데이터베이스 서버

이 3가지 종류의 서버가 유기적으로 상호작용하면서 하나의 애플리케이션으로 구성되는 것을 3Tier 아키텍처라고 부릅니다.

이 3Tier 애플리케이션에서 가장 먼저 클라이언트의 첫번째 진입점 역할을 하는 서버가 바로 웹서버 입니다. 클라이언트가 주소창에 어떤 요청을 보냈을 때, 요청한 경로에 해당하는 HTML이나 JS 같은 정적 파일을 사용자에게 제공해줍니다.

정적 파일이라는 것은 어떤 사용자이든 간에 동일한 경로로 보낸 요청은 동일한 내용의 페이지를 제공한다는 것을 의미합니다.

사용자마다 다른 데이터를 제공하기 위해서는 프론트엔드에서 제공받은 파을을 활용해서 클라이언트가 다시 백엔드 애플리케이션으로 요청을 보내야 합니다.

그리고 백엔드 애플리케이션은 데이터베이서에 요청을 보내서 영속성이 필요한 데이터를 조회하고 저장할 수 있습니다.


이때, 보통 클라이언트에 http://127.0.0.0/api/user 와 같이 백엔드 서버가 그대로 노출되어 있는 것을 볼 수 있는데, 일반적으로 백엔드 애플리케이션은 사용자가 직접 접근하지 않도록 설정하는 것이 유리합니다.

백엔드 애플리케이션은 시스템과 실제 데이터에 밀접한 연관이 있기 때문에 보안에 특히 주의해야 하기 때문입니다.

그래서 보통 NGINX 의 Proxy 라는 기능을 활용해서 백엔드 애플리케이션의 접근을 제한합니다.

이를 통해 백엔드 애플리케이션에 대한 요청은 웹 서버를 통해서만 접근이 가능하며, 웹 서버는 클라이언트와 백엔드 애플리케이션의 다리역할을 하기 위해서 프록시라는 기술을 활용합니다.

💡 Proxy는 요청을 전달해준다는 의미이며,
Nginx의 프록시 기술을 활용하면 특정 경로(/api로 시작하는 경로)로 온 요청을 지정한 서버로 전달함으로서 보안 향상, 부하 관리 및 API 응답 캐싱을 활용할 수 있습니다.

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/CigvZ