공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 포스팅에서는 AWS EC2 클라우드 서비스에 배포하기 전, 운영 환경에서 사용할 Docker Compose와 Spring Profile을 작성하고, 이를 통해 운영 환경에서 애플리케이션을 실행하는 방법을 설명한다.
1. 운영 환경에서의 컨테이너 구성
AWS EC2에 배포할 때는 단순히 IntelliJ에서 Spring Boot 애플리케이션을 실행하는 것이 아니라, Docker를 이용해 필요한 컨테이너들을 실행해야 한다. 이 작업을 통해 AWS EC2와 같은 클라우드 환경에서 안정적이고 일관된 방식으로 애플리케이션을 운영할 수 있다.
운영 환경에서는 총 3개의 컨테이너가 필요하다:
- Redis: 캐싱 및 빠른 데이터 조회를 위해 사용.
- Database (MariaDB): 데이터베이스로 약국 정보를 저장.
- Spring Boot 애플리케이션: 사용자로부터 요청을 처리하고 데이터를 제공.
이를 위해 Docker Compose를 작성하여, 한 번의 명령으로 세 개의 컨테이너를 동시에 실행하고 관리할 수 있다.
2. Docker Compose 설정
Docker Compose란?
Docker Compose는 여러 개의 Docker 컨테이너를 정의하고, 한 번에 실행할 수 있는 도구이다. 각 서비스의 정의와 네트워크 설정, 환경 변수 주입 등도 함께 설정할 수 있어 운영 환경에서 애플리케이션을 손쉽게 배포하고 관리하는 데 유용하다.
version: "3.8" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너들을 정의
pharmacy-recommendation-redis: # 서비스명
container_name: pharmacy-recommendation-redis # 컨테이너 명
build:
dockerfile: Dockerfile
context: ./redis
image: eunchan97/pharmacy-recommendation-redis
ports:
- "6379:6379"
pharmacy-recommendation-database:
container_name: pharmacy-recommendation-database
build:
dockerfile: Dockerfile
context: ./database
image: eunchan97/pharmacy-recommendation-database
environment:
- MARIADB_DATABASE=pharmacy-recommendation
- MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
volumes:
- ./database/config:/etc/mysql/conf.d
- ./database/init:/docker-entrypoint-initdb.d
ports:
- "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
pharmacy-recommendation-app:
container_name: pharmacy-recommendation-app
build: .
depends_on: # DB, REDIS 컨테이너가 실행된 다음 WEB을 실행시킨다.
- pharmacy-recommendation-database
- pharmacy-recommendation-redis
image: eunchan97/pharmacy-recommendation-app
environment:
- SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- KAKAO_REST_API_KEY=${KAKAO_REST_API_KEY}
ports:
- "80:8080"
restart: always # depends on은 실행 순서만 컨트롤 할뿐,
# 컨테이너 안의 서비스가 실행가능한 상태인지까지는 확인 하지 않기 때문에
# DB 또는 Redis가 아직 실행가능한 상태가 아니여서 실패하는 경우 재시작 하도록 설정
services: 실행할 컨테이너들을 정의하는 영역이다.
- pharmacy-recommendation-redis: Redis 서버를 위한 컨테이너 정의한다.
- ports: Redis의 기본 포트 6379를 외부와 연결한다.
- pharmacy-recommendation-database: MariaDB 데이터베이스 컨테이너 정의한다.
- environment: 데이터베이스 이름과 root 패스워드를 환경 변수로 설정한다.
- volumes: 데이터베이스 설정 파일과 초기화 스크립트를 컨테이너 내부와 외부에서 공유하도록 설정한다.
- ports: MariaDB의 기본 포트 3306을 외부와 연결한다.
- pharmacy-recommendation-app: Spring Boot 애플리케이션 컨테이너 정의한다.
- depends_on: Redis와 Database가 실행된 후에 애플리케이션이 실행되도록 설정한다.
- ports: 외부에서 접속할 수 있도록 8080 포트를 80 포트로 매핑한다.
- environment: Spring 애플리케이션이 실행될 때 필요한 환경 변수들을 .env 파일에서 불러와 주입한다.
- restart: always: 컨테이너가 비정상 종료되었을 때 자동으로 재시작되도록 설정한다.
3. 환경 변수 설정
컨테이너에서 사용할 중요한 정보들을 코드에 직접 입력하지 않고, .env 파일을 통해 환경 변수로 관리한다. 이는 보안 측면에서 매우 중요하며, 코드와 환경 설정을 분리하는 좋은 방법이다.
ls -a
vi .env
-------------------
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=1234
SPRING_PROFILES_ACTIVE=prod
KAKAO_REST_API_KEY=[API_KEY]
-------------------
:wq
.env 파일에 설정된 변수들은 Docker Compose 파일에서 사용되며, 애플리케이션이 실행될 때 필요한 데이터베이스 정보나 API 키가 안전하게 주입된다.
4. Spring 프로파일 설정 (prod, local)
Spring에서는 프로파일을 통해 개발 환경(local)과 운영 환경(prod)에 따라 설정을 분리할 수 있다. 이를 통해 운영 환경에서는 성능과 안정성에 맞춘 설정을 사용하고, 개발 환경에서는 디버깅과 테스트에 적합한 설정을 사용할 수 있다.
운영 환경에서 prod 프로파일을 설정하며, Docker Compose의 각 컨테이너가 서로 통신할 수 있도록 구성한다.
spring:
profiles:
active: local # default profile
group:
local:
- common
prod:
- common
---
spring:
config:
activate:
on-profile: common
kakao:
rest:
api:
key: ${KAKAO_REST_API_KEY}
---
spring:
config:
activate:
on-profile: local
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3306/pharmacy-recommendation
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
redis:
host: localhost
port: 6379
jpa:
hibernate:
ddl-auto: validate
show-sql: true
pharmacy:
recommendation:
base:
url: http://localhost:8080/dir/
---
spring:
config:
activate:
on-profile: prod
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://pharmacy-recommendation-database:3306/pharmacy-recommendation
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
redis:
host: pharmacy-recommendation-redis
port: 6379
jpa:
hibernate:
ddl-auto: validate # prod 배포시 validate
show-sql: true
pharmacy:
recommendation:
base:
url: http://localhost/dir/
- spring.datasource: MariaDB 데이터베이스에 연결하는 설정이다.
- url: 데이터베이스의 주소를 명시한다. Docker Compose 내부에서 MariaDB는 pharmacy-recommendation-database라는 서비스명을 통해 통신한다.
- username, password: .env 파일에서 설정한 데이터베이스 사용자명과 비밀번호를 불러온다.
- redis: Redis 서버에 연결하는 설정이다.
- host: Docker Compose의 Redis 서비스 이름인 pharmacy-recommendation-redis로 설정하여, 애플리케이션이 해당 컨테이너와 통신할 수 있게 한다.
- port: Redis의 기본 포트 6379를 설정한다.
- jpa: Hibernate와 JPA 설정으로, 데이터베이스 스키마를 검증하고 SQL 쿼리를 보여주도록 설정이다.
- ddl-auto: validate: 운영 환경에서는 스키마를 생성하지 않고, 기존 스키마가 유효한지 검증하는 방식으로 설정한다.
- pharmacy.recommendation.base.url: 애플리케이션의 기본 URL 설정이다. EC2에 배포할 경우, EC2의 IP 주소로 변경될 것이다.
5. 컨테이너 빌드 및 실행
운영 환경에서 컨테이너를 실행하기 전에, 최신 소스 코드가 반영된 app.jar 파일이 필요하므로 애플리케이션을 재빌드해야 한다.
1) 애플리케이션 재빌드
아래 명령어를 사용해 애플리케이션을 클린 빌드 한다. 이 명령은 테스트 코드도 함께 실행하며, Docker Desktop이 실행된 상태여야 한다.
./gradlew clean build -PKAKAO_REST_API_KEY=[키 값]
- 이 명령어를 통해 app.jar 파일이 생성되고, 소스 코드의 변경 사항이 반영된 상태로 애플리케이션을 다시 빌드할 수 있다.
2) Docker Compose 실행
재빌드가 완료된 후, Docker Compose 명령어로 컨테이너들을 실행한다. 이 명령어는 애플리케이션, Redis, 그리고 데이터베이스 컨테이너를 빌드하고 실행한다.
docker-compose up --build
3) 컨테이너 상태 확인
아래 명령어로 실행된 컨테이너들이 정상적으로 작동하는지 확인한다. 3개의 컨테이너(Redis, Database, Spring Boot 애플리케이션)가 모두 실행 중이어야 한다.
6. 애플리케이션 실행 및 확인
Docker Compose를 통해 컨테이너들이 정상적으로 실행되면, 웹 브라우저에서 애플리케이션이 정상적으로 작동하는지 확인할 수 있다. 아래의 URL에 접속하여 Pharmacy Recommendation 애플리케이션이 실행되는 것을 확인한다.
Pharmacy Recommendation 웹 페이지에 접속하면 주소를 입력해 약국 추천 결과를 확인할 수 있다. 이로써 운영 환경에서 Redis, 데이터베이스, Spring Boot 애플리케이션이 정상적으로 연동되는 것을 검증할 수 있다.
'BackEnd > Project' 카테고리의 다른 글
[SNS] Ch01. 개요 (0) | 2024.09.06 |
---|---|
[PharmNav] Ch09. AWS EC2 생성 및 배포하기 (0) | 2024.09.06 |
[PharmNav] Ch08. Redis 테스트 코드 작성 (0) | 2024.09.05 |
[PharmNav] Ch08. redis를 이용한 성능 개선 (0) | 2024.09.05 |
[PharmNav] Ch08. Redis 자료구조를 이용하여 구현 (1) | 2024.09.05 |