배포를 진행하던 중 의문이 들었다 프론트엔드 코드와 백엔드 코드는 git에서 코드를 ec2로 pull 해주고 docker 로 환경설정을 해주어서 실행을 시키는데 Database는 어떻게 해야하지? 뭔가 전체적인 그림이 안떠올라서 답답했고 정리를 해보려고 한다.
이번 글에서는 Docker 배포 아키텍처를 완전히 이해해 보려고 한다!
일단 우리가 만들고 있는 시스템은 EC2 서버 안에 있는
Frontend Container (Vue.js + Nginx)
Backend Container (Spring Boot)
MySQL Container (데이터베이스)
Redis Container (캐시/세션 저장소)
이게 각각이 독립적인 "가상 컴퓨터라고 생각하면 된다!
// Backend Entity 클래스가 있으면
@Entity
public class User {
@Id
private Long id;
private String username;
// ...
}
// MySQL에 자동으로 이런 테이블 생성됨
CREATE TABLE user (
id BIGINT PRIMARY KEY,
username VARCHAR(255)
);
다들 JPA를 사랑하는 이유가 있다 위에 보는 것 같이 MySQL Container 에 Entity를 보고 SQL 테이블을 자동으로 생성해준다!
MyBatis는 schema.sql 파일을 생성하고 테이블 생성 SQL을 작성해주어야 한다..
그 후 application.properties에 추가하여 Container에 추가한다.
# 시작시 schema.sql 실행
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
DB 연결을 어떤 방식으로 하는지에 따라 배포 단계도 달라지니 조심!
Docker Compose MySQL 설정
mysql:
image: mysql:8.0 # ← MySQL 8.0 Docker 이미지
environment:
MYSQL_ROOT_PASSWORD: -----
MYSQL_DATABASE: baseball_chat # ← 빈 DB 자동 생성
MYSQL_USER: -----
MYSQL_PASSWORD: -----
volumes:
- mysql_data:/var/lib/mysql # ← 데이터 영구 저장
그래서 MySQL 컨테이너를 시작하고 baseball_chat 이라는 빈 데이터베이스를 생성한다.
그리고 Backend를 연결 시에 테이블을 자동 생성하고 Docker Volumn에 영구 저장
MySQL 공식 이미지를 사용하고 있어서 따로 이미지는 필요없고 환경변수로 모든 설정이 가능하다!
docker exec -it blc-mysql mysql -u ----- -p----- baseball_chat

우리는 JPA Entity로 테이블이 다 생성이 되어있어서 잘 생성된 테이블을 확인할 수 있었다!
Redis는 캐시, 세션, 실시간 데이터용으로 우리 WebSocket 프로젝트의 핵심 친구이다 (아직 코드는 안짰지만 ㅎㅎ)
Redis Docker 컨테이너
redis:
image: redis:7-alpine # ← 공식 Redis 이미지
ports:
- "6379:6379"
MySQL처럼 공식 이미지를 사용!
공부를 다 하고 배포를 진행 중.. 문제가 생겼다.. 프론트엔드, 백엔드, db, redis 컨테이너의 용량을 다 커버할 수 없는 상황이 생겼다.
문제를 파악하고 주변에 도움을 청하고 솔루션을 몇개 얻어보았다.
프론트 무료 배포 (firebase) 를 찾아서 배포하고, 몽고db 를 사용해서 db도 따로 빼 (kimin son 감사합니다)
너 ec2에 db를 같이 넣었어? 보통은 rds라고 따로 빼긴 해, 그리고 ec2는 기본적으로 스왑메모리 설정이 안되어 있어서 램 부족하면 꺼짐, 세팅 ㄱㄱ (always_mun 감사합니다)
내가 생각한 방법 그냥 팀원 4명이니깐 프론트, 백, redis, DB 4명을 나눠서 배포를 해서 합치자
다음 포스팅은 이 세가지 방법 중 하나를 선택해서 배포하고 결과를 포스팅 하겠습니다.