이제 개발서버에 백엔드 앱을 올릴 준비를 하게 되었으니 앱을도커컨테이너에 올리게 동작 시켰을 시 서버 환경에 맞게 DB와 Redis 연결 설정을 만들어 주어야 한다.
기본적으로 application.yml 이나 applicaton.properties 파일들은 민감한 정보이므로 github repo에 올리지 않는다.
앱을 배포를 하기 위해선 앱을 빌드를 해야하고 앱을 빌드할때는 꼭 필요한 설정파일이 application 설장파일이다.
이것들을 관리하는 방법 또 한 여러가지 방법이 있다.
그 중에 나는 git의 submodules 기능을 이용하여 application.yml을 관리 하는 방법을 택 했다.
git submodules이란?
저장소 안에 다른 저장소를 원하는 디렉토리를 복제하는 기능이다. 예를 들어 A,B 프로젝트에서 공통되게 사용하는 모듈(라이브러리, 설정 값 등) C가 있다고 하자. A,B,C 모두 저장소이다. 이때 A, B 저장소에 C 소스 코드가 중복될 수 있다. 이를 A,B 저장소에 C를 서브 모듈로 두어 공통되게 사용할 수 있다. C가 수정되면 A,B 모두 수정된 코드를 사용할 수 있다.
그러면 이 깃 서브모듈을 통해 저장소를 복제하게 되면 어떻게 배포를 하게 되는것이는 것인가?
1. GitHub private repo를 만들고 repo에 application.* 파일들을 넣는다. (private repo 권한이 있는 사람만 확인할 수 있다)
2. spring 프로젝트가 담겨있는 public repo에 설정 파일이 들어있는 private repo를 submoudles화 한다.
3. 프로젝트 빌드/배포할 때 submodules의 설정 파일들을 /src/main/resources으로 복사하여 사용한다.
4. 복사된 설정파일들은 .gitignore 파일로 push하지 않는다.
이러한 흐름으로 서브모듈을 메인 레포지에 저장을 하여 사용을 하게되며 .gitignore 로 인하여 복제된 서브모듈 파일들이 메인 레포지에 푸시가 되지않는다.
장점
- 설정 파일을 별도의 저장소에서 관리할 수 있다.
- 로컬 개발할 때 별도의 환경변수 지정 없이 설정 파일을 그대로 사용할 수 있다.
- GitHub Actions와 연동이 쉽다.
단점
- private repo라고 해도 설정 값들이 암호화되어있는 것이 아니기에 private repo 노출 시 취약할 수 있다.
이제 submodules를 최종프로젝트 레포지에 적용시켜 보겠다.
먼저 서브모듈이될 레포지를 생성해 주겠다.
팀 프로젝트의 orgainzation 인 9kuku 에 9oods-private라는 레포지를 조원들만 확인할 수 있도록 Private를 걸고 설정파일들을 추가할 수 있도록 생성을 해주었다.
그리고 private 라는 디렉토리를 생성시켜 그 안에 스프링부트 앱의 config 파일들을 환경별로 생성 시켜 주었다.
나는 로컬의 개발 환경과 개발서버의 환경 설정을 저렇게 나누 었다.
로컬환경의 설정 코드를 예로 보자면
//application-local.yml
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:mysql://localhost:3306/9oods
username: 유저이름
password: 비밀번호
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
default_batch_fetch_size: 1000
session:
events:
log: LOG_QUERIES_SLOWER_THAN_MS=3000
show_sql: true
format_sql: true
use_sql_comments: true
data:
redis:
port: 6379
host: localhost
jwt:
secret:
key: jwt키
스프링 설정의 프로파일을 local로 설정을 해주 었고
DB 정보에 접속할 host 주소 유저이름 비밀번호 그리고 jpa 설정과 redis에 연결하기 위한 정보 그리고
토큰을 통한 인증을위해 jwt.secret.key라는 환경변수를 입력 해 주었다.
dev도 비슷하게 서버 환경에 맞는 주소 docker 환경에서의 컨테이너간 통신이기 때문에 컨테이너 이름을 예를들면 mysql-test 가 컨테이너 이름이고 열어놓은포트가 3305:3306 그리고 연결할 db 이름이 test9oods라면
jdbc:mysql://mysql-test:3305/test9oods
이런식으로 url을 적어주면된다. 추후에 이렇게 설정을 입력을 잘 해 주었는데도 배포하고 서버에서 앱을 실행시키면 db에 연결할 수 없다는 오류가 발생 했는데 그 것든 추후 글에 다루겠다.
이렇게 서브모듈 레포지를 완성 시킨 뒤 git bash를 통하여
적용시킬 레포지에다가
// 서브 모듈 추가
git submodule add [git repo link] [dir 이름]
을 입력해주면 레포지에 서브모듈이 추가가 된다.
레포지 저장소에 서브모듈과 .gitmodules 파일이 생성이된다.
.gitmodules 파일에는
이렇게 서브모듈 이름과
서브 모듈의 저장소 위치가 보인다.
이 파일에 branch 명령어를 입력하여 서브모듈을 특정 브랜치에만 적용시킬 수 있도록 할 수 도 있다.
branch = 적용시킬 브랜치 명
깃헙 프로젝트 레포지를 들어가면
이렇듯 서브모듈이 적용 된 것 또한 확인 할 수있다.
서브 모듈 명령어 로는
서브 모듈이 포함된 프로젝트를 clone 받아 올때 권한이 있다면 main repo를 받고 sub repo를 클론한다.
git clone 레포지
이미 클론 받은 프로젝트 update
git pull 메인레포지
git submodule update --remote --merge
서브 모듈만 업데이트 하여 머지할 수 가 있다.
서브모듈의 최신상태를 확인
git submodule status
이제 받은 서브모듈을 어떻게 빌드 할때 적용시키냐 하면
task copyPrivate(type: Copy) {
copy {
from './9oods-private/private'
into 'src/main/resources'
}
}
bulid.gradle에 명령어를 추가하여 서브 모듈의 모든 것을 src/main/resources에 복사하도록 하는 일을 작성하여 빌드 때 작동하도록 할 수 있다.
또는 필요한 파일만 가져오려면
include라는 조건을 걸어서
task copyGitSubmodule(type: Copy) {
from '서브모듈경로'
include '*.yml'
into './src/main/resources'
}
이렇게 설정파일들만 복사 하도록 할 수 도 있다.
그리고 이러한 설정파일들은 .gitignore에 추가하여 레포지에 푸쉬되지않도록 설정을 끝맞추면 된다.
### Property ###
/src/**/*.properties
/src/**/*.yml
/src/**/*.yaml
추가적으로 나는 이 CI/CD과정을 겪으면서 오류가 있었는데 배포한 앱이 설정을 dev로 따라가고 있지만 jwt.sercet.key를 읽어 올 수 없다는 것이 였다. 그러한 오류가 왜 발생하나 하고 원인을 찾게 되었는데.
추후 글로 다룰 gitactions workflows 작업에서 서브모듈을 접글 할 수 있게 그리고 서브모듈을 사용할 수 있게 하는 명령어를 추가해 주 었어야 했는데 그 문구를 추가를 해 주지 못하여 설정 파일을 적용 시킬 수 없었 던 것이 였다..
actions 워크플로우가 동작할 때 서브 모듈을 사용하게 할려면 이 문구를 추가 해 주어야 한다./
checkout repo라는 작업이 시작될때
# .github/workflows/*.yml
- name: Checkout repo
uses: actions/checkout@v4
with:
token: ${{ secrets.ACTION_TOKEN }}
submodules: true
이 with 아래 부분을 추가해 주어야 한다. 그래야 서브모듈을 불러 와 사용할 수 있게 되는 것이다.
그리고 토큰은 action에 secret에 이 서브모듈을 사용할 수 있는 유저의 Token을 시크릿 환경변수로 넣어주어야 제대로 사용 할 수 있다.
참고
'내일배움캠프' 카테고리의 다른 글
내일 배움 캠프 최종 프로젝트 - git actions CI/CD (0) | 2024.04.11 |
---|---|
내일 배움 캠프 최종 프로젝트 - 스프링부트 서버를 컨테이너로 올리기 전 준비(도커 설치) (0) | 2024.04.11 |
내일 배움 캠프 최종 프로젝트 - GCP VM mobaXterm 접속 (0) | 2024.04.10 |
내일 배움 캠프 최종 프로젝트 - CI/CD 설계 전 서버 구축(GCP Computing engine) (0) | 2024.04.09 |
내일배움캠프 최종프로젝트 - 캐싱 적용-1 (0) | 2024.04.04 |