[SpringBoot] 작업 환경 분리하기

smlee·2022년 8월 18일
0

SpringBoot - JPA

목록 보기
3/8
post-thumbnail

❓ 환경 분리

현재 진행 중인 프로젝트가 있는데, 이 프로젝트는 실제 배포를 할 서비스이므로 CD(Continuous Development)를 위하여 실제 환경개발 환경을 분리했어야 했었다.

프로젝트를 진행하며 3단계로 환경을 나눌 계획을 세웠다.

  1. dev
    • dev DB + dev server
    • 개발 환경에서 사용할 데이터베이스와 서버를 사용
    • dev 환경에서는 말 그대로 개발 중 사용하는 DB와 서버이므로 테스트 값들이 많이 들어가 있고, 여러 기능들을 여러 사람이 push하는 상태이므로 실제 환경에서 잘 돌아가는지 확인하기 어렵다.
  2. stage(staging)
    • prod DB + staging server
    • dev 설명에서 언급했듯, dev 환경은 실제 환경에서 잘 돌아가는지 확인하기 어렵다. 따라서 prod DB에서도 내가 개발한 source가 잘 작동되는지 확인하고 prod server에 push를 해야한다.
    • 따라서 중간 테스트 환경을 진행할 stage 서버를 마련
  3. prod
    • prod DB + prod server
    • 실제 서비스가 운용되는 실서버, 실제 DB이다.

위와 같이 서버는 3개에서 개발 및 테스트가 이루어질 예정이다. 하지만, 스프링부트 프로젝트는 하나이므로 스프링부트 프로젝트에서 어떤 환경에 적용할지를 알려주어야 한다. 따라서 작업 환경 분리 작업이 필요하다.

❗ application.yml로 개발 환경 분리하기

위에서처럼 포트와 db를 3개의 단계로 분리할 예정이므로 application-dev.yml, application-stage.yml, application-prod.yml 3개의 파일로 나누었다. 각각의 파일에서는 각 환경의 포트 번호, 데이터베이스 정보 등을 저장한다. 이때, - 뒤에 붙는 것은 개발 환경명이다.

그리고 추가로 application.yml 파일을 만들어 현재 개발하고 있는 환경을 지정한다.

(1) application-dev.yml

dev 서버 정보를 담고 있는 파일이다.

server:
  port: 8000

spring:
  application:
    name: (프로젝트명-dev)
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    generate-ddl: false
    show-sql: true
    properties:
      hibernate:
        format_sql: true

  datasource:
    platform: mysql
    url: (dev DB 엔드 포인트)
    username: (dev DB username)
    password: (dev DB password)
    driver-class-name: com.mysql.cj.jdbc.Driver

만약 dev 환경의 포트 번호가 8000번이면 해당 포트 번호를 적어준다. 그리고 개발에 필요한 옵션들을 spring 쪽에서 준다.

그리고 datasource 쪽에 AWS RDS의 dev db의 엔드포인트와 username, password를 입력해준다.

(2) application-stage.yml

server:
  port: 7000

spring:
  application:
    name: (프로젝트명-stage)
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    generate-ddl: false
    show-sql: true
    properties:
      hibernate:
        format_sql: true

  datasource:
    platform: mysql
    url: (prod DB 엔드 포인트)
    username: (prod DB username)
    password: (prod DB password)
    driver-class-name: com.mysql.cj.jdbc.Driver

dev 환경 설정과 크게 다를 바 없다. 달라진 점은 포트 번호와, application name, datasource이다.

dev 환경에서 사용하는 DB와 stage, prod 환경에서 사용하는 DB가 다르므로 환경에 맞는 RDS 엔드포인트와 username, password를 입력해준다.

(3) application-prod.yml

server:
  port: 8080

spring:
  application:
    name: (프로젝트명-stage)
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    generate-ddl: false
    show-sql: true
    properties:
      hibernate:
        format_sql: true

  datasource:
    platform: mysql
    url: (prod DB 엔드 포인트)
    username: (prod DB username)
    password: (prod DB password)
    driver-class-name: com.mysql.cj.jdbc.Driver

prod 환경은 stage 서버와 db를 변경하므로 application-stage.yml 파일과 다른 점은 포트 번호 뿐이다.

(4) application.yml

spring:
  profiles:
    active: (실행할 환경명 / 이 예시의 경우 dev, stage, prod 중 하나)

(1)에서 (3)까지의 과정을 통해 환경 설정을 모두 했으므로 이제 application.yml에서는 어떤 서버를 실행할 지 선택하면 된다.

실행 예시

만약 application.yml에 dev라고 설정하고 실행해보면 다음과 같이 실행 된다.

application.yml에서 설정한대로 dev 환경이 실행되고 포트도 dev에서 설정했듯이 8000번이 실행된다.

만약 다른 환경을 실행하고 싶으면 어떻게 해야 할까?

application.yml에서 실행할 환경명을 다시 설정하거나
java -jar .\build\libs\빌드할 jar파일명-1.0.0.jar --spring.profiles.active=실행할 환경명를 실행하여 실행할 환경명을 spring.profiles.active 옵션으로 설정하면 된다.


위 이미지는 spring.profiles.active 옵션을 통해 stage 서버를 실행한 것이다. (2)번에서 설정했듯 7000번 포트가 잘 실행된 것을 확인할 수 있다.

0개의 댓글