본문 바로가기

회고록(TIL&WIL)

TIL 2022.11.14 Spring boot (gradle) dot.env dockerfile-docker-compose

개발 환경

jdk-8

Spring boot

gradle

JPA - postgres

dockerfile

docker-compose

dot-env

AWS EC2 ubuntu t2.micro

AWS RDS postgres


목표

로컬환경의 경우 postgres 이미지를 다운받아 container에 올리는 식으로 DB를 다운받지않고도 로컬 환경 구성

배포환경의 경우 EC2에 프로젝트를 배포하고 RDS에 연결하여 환경 구성

두개의 환경을 나누기 위해 dot-env 이용하여 각 환경에 따른 설정 세팅

dockerfile 작성하여 프로젝트 docker container에 띄우고 docker-compose 를 이용하여 한번에 빌드 및 실행

 

브랜치 전략

EC2에선 public branch를 동기화 해두고 feature/<service> branch에서 기능 개발 후

main으로 PR 및 merge 한 다음 local에서 main branch 접속해서 테스트 하여 정상작동 확인 후

git checkout publish 로 브랜치 변경 후 git merge main 하고 EC2로 접속해서 git pull 하여서 개발 코드 배포


Dockerfile

프로젝트App의 메인 경로에 Dockerfile 생성 (PaymentService/payment/Dockerfile)

gradle 관련 파일들 COPY

RUN dos2unix ./gradlw  -> window 환경에서 프로젝트 작성 후 배포환경(Linux)에서 gradle을 사용할 수 있게해주는 코드

RUN chmod +x ./gradlew -> 사용자권한을 부여함으로써 권한 에러 해결

FROM openjdk:8-jdk-alpine
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle . 
COPY src src
RUN dos2unix ./gradlew
RUN chmod +x ./gradlew
RUN ./gradlew bootjar
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

이상태로 docker build를 하게 되면 상당한 시간이 소요되는데 gradle이 build 되는 과정에서 많은시간이 소모된다.

이를 가장 쉽고 빠르게 줄일 수 있는 방법으로 메인 프로젝트 경로에 gradle.properties 파일을 생성 후 코드추가하면 끝

# gradle.properties
org.gradle.daemon=true

dot-env

로컬환경에 띄워둔 db 이미지에 접근하기 위한 dot-env

#SPRING .env
SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres_db
SPRING_DATASOURCE_USERNAME=postgres_user
SPRING_DATASOURCE_PASSWORD=root

배포환경 RDS에 접근하기 위한 dot-env

#SPRING pro.env
SPRING_DATASOURCE_URL=jdbc:postgresql://RDS주소:5432/RDS_DB명
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=password

dot-env 파일들의 경우 github에 노출되면 안되기 때문에 .gitignore에 추가되어 있어야하며 배포환경에는 따로 집어넣어 줘야한다. ec2 접속하기 전에 scp 명령어를 이용해서 해당 경로에 env파일을 전송해 줄 수 있다.

# ec2 ssh 접속
ssh -i [pem키] ubuntu@[EC2주소]

# .env 파일 로컬 => 서버 전송
scp -i [pem키] -r [env파일] ubuntu@[EC2주소]:~/[저장할 경로]

docker-compose

db

image : postgres 이미지를 다운 받음으로써 postgres를 직접 컴퓨터에 다운받지 않고도 사용할 수 있게 만듦

(현재 컴퓨터에 postgres가 깔려있다면 localhost로 접근이 안될 수 있기 때문에 이방법을 사용할 경우 컴퓨터에 설치된 postgres를 지워야한다.)

environment : postgres DB 를 생성할 때 설정할 기본 정보들 해당 정보로 연결하기 때문에 .env에 저장해준다.

 

app

build : docker-compose 파일 이랑 Dockerfile 위치가 같은 경우 해당 코드로 dockerfile을 기반으로 build 한다는 뜻

(docker-compose 파일이 외부에 있을 경우 Dockerfile이 있는 프로젝트 메인경로를 지정해주어야한다)

env_file : 앞서 작성한 dot-env 파일을 불러오게 할 수 있다.

environment : Spring boot JPA 를 이용하기 때문에 DB와 연결 및 쿼리문 확인을 위한 설정

모든 환경설정이 잘들어와 있는지 확인하기 위해서 docker-compose config 를 이용해서 확인가능하다

version: "3"
services:
  db:
    image: postgres:latest
    container_name: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=postgres_db
      - POSTGRES_USER=postgres_user
      - POSTGRES_PASSWORD=root
    volumes:
      - ./postgres/:/var/lib/postgresql/data
  app:
    container_name: spring
    build: .
    ports:
      - "8080:8080"
    env_file:
      - .env
    environment:
      - SPRING_DATASOURCE_DIVER-CLASS-NAME=org.postgresql.Driver
      - SPRING_DATASOURCE_PLATFORM=postgres
      - SPRING.JPA.HIBERNATE.DDL-AUTO=update
      - SPRING.JPA.SHOW.SQL=true
      - SPRING.JPA.DATABASE=postgresql
      - SPRING.JPA.PROPERTIES.HIBERNATE.FORMAT_SQL=true
      - SPRING.JPA.DATABASE-PLATFORM=org.hibernate.dialect.PostgreSQLDialect
      - SPRING.JPA.GENERATE-DDL=true
volumes:
  postgres-data:

배포환경 MSA 구성으로 되어있어 해당 service 말고도 다른 service 들이 하나의 docker-compose에 전부 작성되어있으며

다같이 배포되어있고 최종적으로 docker-compose up 명령어 하나로 모든 서비스를 빌드하고 실행되도록 하였다.

로컬환경과 다르게 build 부분과 env_file 에서 경로를 다르게 설정해준 것이 차이점 service 부분도 구분을 위해

이름을 payment_service로 확실하게 명시하였다.

payment_service:
    container_name: spring
    build: ./PaymentService/payment/
    ports:
      - 8080:8080
    expose:
      - 8080
    env_file:
     - ./PaymentService/payment/.pro.env
    environment:
      - SPRING_DATASOURCE_DIVER-CLASS-NAME=org.postgresql.Driver
      - SPRING_DATASOURCE_PLATFORM=postgres
      - SPRING.JPA.SHOW.SQL=true
      - SPRING.JPA.DATABASE=postgresql
      - SPRING.JPA.PROPERTIES.HIBERNATE.FORMAT_SQL=true
      - SPRING.JPA.DATABASE-PLATFORM=org.hibernate.dialect.PostgreSQLDialect
      - SPRING.JPA.GENERATE-DDL=true