개발이군고구마

[전전긍긍 설정세팅] 5. Profile별 설정 과 보안 파일 관리 (#공통규약) 본문

SERVER/Architecture

[전전긍긍 설정세팅] 5. Profile별 설정 과 보안 파일 관리 (#공통규약)

김구황 2025. 5. 22. 23:38
728x90

현재 사이트는 운영/STG/local 로 분리되어 설정을 하고 있다.

그 동안 서버가 분리된 상황에서 각각 다른 포트와 환경 설정을 적용받고 있음에도 어떤 방식으로 작동하는 건지 이해하지 못했다. 

 

설정 세팅을 처음부터 하면서 원리에 대해 궁금증이 생겼고

이번을 계기로 어떻게 서버 환경을 분리하고, 각각에 환경에 각자 다른 설정을 적용하는지 알아보기로 하자. 

 

 

 

1. 원리 

소스 코드 빌드 .jar 파일 생성 

> .jar 파일 실행

> 기본 설정 실행

> 선택한 특정 환경의 설정파일이 기본설정 파일을 덮어씌움 

 

2. 설정 방식

1) 세팅

  • application.yml 을 통한 관리  
└── resources
        ├── application.yml
        ├── application-dev.yml
        ├── application-local.yml
        ├── application-prod.yml
        └── application-test.yml

yml과 properties 파일으로 설정 환경을 세팅할 수 있다. 환경별로 그에 해당하는 yml 파일의 세팅 조건을 적용한다. 

 

아래는 application-test.yml 파일의 예시

## 테스트용 H2 데이터베이스 설정

spring:
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
  sql:
    init:
      mode: never

 

application-dev.yml

spring:
  profiles:
    include: secret # 민감한 secret 파일의 항목 yml 파일을 따로 분리해서 요만큼만
    active: dev # 개발환경 dev 파일을 활성시키겠다는 것 -> jar 파일 실행하면 dev yml로 읽어 세운다

 

설정해놓은 환경에 따라서 그에 맞는 yml 파일이 기본 yml 파일 위에 덮어 씌워짐 

 

 

  • .csv 파일로 관리하는 현 사이트 예시
Key,Description,common,local,dev,stg,stg2,stg3,stg4,stg5,prd
example.spring.mvc.upload.common,업로드 S3 temp 디폴트값,/cont/example_uploads/temp/,c:/temp/cont/example_uploads,,,,,,,,

현재 우리는 csv 파일에서 아래와 같이 설정을 관리하며 필요 환경별로 다르게 넣는 정보들도 입력해주고 있다.

여기서 보면 common과 local로 들어가는 경로가 다르다.
스프링 실행파일을 local로 맞추어 넣기 때문에 설정파일이 생성돼 [local 이 입력]이 자동입력 되게 된다.

 

 

 

2) 실행 

- jar 파일 실행 명령어  

$ java -jar myapp.jar --spring.profiles.active=prod // profiles은 prod를 활성화

 

- 스프링단에서 설정 

-Dport.shutdown=80xx
-Dfile.encoding=UTF-8
-Dspring.profiles.active=local <- local로 jar 파일을 만들면 뜨는 표시
-Xms1024m

 

 

 

3) 예시

 

- application-prod.yml을 아래와 같이 작성해놓은 상태에서 

## swagger 사용x
springdoc:
  swagger-ui:
    enabled: false

- 서버를 prod 로 바꾸어놓고 빌드한 후 실행하면 swagger에 접근이 안된다. 

 

 

 

 

3. 보안 파일 관리 .env

application.yml 설정 파일 

spring:
  config:
    import: optional:file:.env
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
  datasource:
    url: jdbc:${DB_TYPE:mysql}://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:test}?${DB_PARAMS}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: ${DB_DRIVER:com.mysql.cj.jdbc.Driver}

 

설정파일에서 DB 정보들과 같이 중요한 정보들은 직접 입력하지 않고 보안 파일 .env로 관리한다. 

  • Environment File(환경 변수 파일) 의 줄임말.
  • 애플리케이션에서 사용되는 환경 변수(주로 중요한 설정값이나 비밀 정보)를 저장하는 텍스트 파일
  • 보통 프로젝트 루트 디렉토리에 위치
  • 데이터베이스 비밀번호, API 키, 비밀키(secret key) 등 민감한 정보를 소스 코드와 분리해 관리
  • 이 파일은 기본적으로 gitignore 파일에 저장되어 깃에 올라가지 않는데,
  • git과 연동되어 배포가 나가기 때문에 설정변수 값을 가지고 있는 .env 파일이 운영환경에 반영이 되지 않는다.  

applicaiton.xml 과 같은 루트 경로

 

 

1) Git Private Repository 이용하는 법

🔒 서버 모듈을 만드는 방법

.env 파일이나 중요한 properties 파일들의 정보를 개발자 본인이 직접 입력하는 건 번거로운 일이다.
수정이 빈번한 파일은 어떻게 할 것이며, 서로 정보가 틀어지지 않도록 모니터 할 것이기 때문이다.
이럴 때 사용하는 방법은 private repository를 submodule 하는 방식이다.

1) private repository를 생성하고 (팀원들과만 공유가능)
2) config 파일이 존재해야 하는 경로 (ex, resource -최상단) 에 넣고 submodule을 생성한다.
   다른 경로로 만들 것이면 dev에 application.yml 에서 config = import를 시켜준다.
   (해당 설정 파일은 profiles 상관없이 사용하겠다는 뜻)
3) 팀원들은 새로 git 프로젝트를 clone 받고 git submodule init 을 꼭!수행
4) 그 이후엔 submodule 에 반영된 사항은 우선 git submodule update
5) 이번 브랜치에 파일 추가 후 commit push 하면 팀원에 반영이 된다고 한다

 

2) 규모작으면 서로 공유하는 법 

🔒 서로 공유할 수 있는 slack, discord에서 수정한 변수 파일을 공유하여 각자에 로컬에 올리는 방법 

 


CICD 파이프라인은 git을 읽을텐데, 그렇다면 저런 민감 파일들은 어떻게 EC2에 반영할까?
- 로컬에 있는 파일을 EC2 에 일일이 옮겨 주는 작업이 필요하다. (.jar가 존재하는 경로와 같은 곳에 올려두어야 함)
- 아니면 직접 서버에서 수정하는 방법도 있다

 

 

 


참고

https://velog.io/@joon6093/Git-Submodule-%EC%A0%81%EC%9A%A9%EA%B8%B0 (깃 서브모듈)

https://velog.io/@zooneon/Spring-Boot-profile-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0 (profile)