Skip to content

[INFRA] 3. Backend와 DB 연결

Hanuel Lee edited this page Aug 26, 2023 · 4 revisions

0. Intro

image

이제 DEV 서버와 DB 서버를 연결하도록 하자.

펀잇팀은 DB로 MySql을 사용하기로 했다.

1. DB서버 생성

DB서버는 앞서 만들었던 INFRA서버, DEV서버와 다르게 외부에서의 접근이 필요없기에 public ip를 설정하지 않아도 된다.

그러므로 같은 VPC 안에 위치한 DEV서버(또는 PROD서버)만 DB서버로 접근할 수 있다.

2. MySql 설치

MySql 설치하는 방법은 인터넷에 잘 정리되어있으므로 넘어가도록 하겠다! 😋

3. DB 정보 세팅

이제 새로 만든 DB서버를 우리의 Spring application과 연결해야 한다.

이때 DB 관련 정보(url, password등)는 보안상 중요하기 중요하기 때문에 함부로 다른 코드들과 함께 깃에 업로드해서는 안된다!

그러므로 DB정보를 어떻게 전달할 수 있을지 생각해보자 🤔

우리팀이 생각한 방법은 크게 3가지이다.

  1. DEV서버에 환경변수로 설정해두고 jar파일 실행할 때 넣어주기
  • nohup java -jar -DDEPLOY_ACTIVE=dev -DDB_URL=jdbc:mysql://190.190.190.190:3306/funeat?serverTimezone=UTC ...
  1. INFRA서버에서 빌드 전에 관련 값들을 세팅해주기
  • 방법1) jenkins 환경변수를 설정해두고 빌드 직전에 값 바꿔치기
  • 방법2) INFRA서버에 application.yml을 두고 빌드 직전에 파일 바꿔치기
  1. git submodule 부모 레포지토리 하위에 자식 레포지토리(서브모듈)를 둬서 관리

펀잇은 이 중에서 2-1방법을 사용했다! 그러므로 이 글에서는 보안 정보를 jenkins에 환경변수로 두고, 빌드 직전에 값 바꿔치기하는 법으로 알아보겠다.

1) jenkins 환경변수 설정

☁️ Jenkins 관리 > System System 페이지에서 밑으로 내리다보면 Global properties 란이 있다.

image

이런식으로 필요한 환경변수들을 하나씩 추가하면 된다!

2) jenkins 스크립트 수정

일단 환경변수 세팅 적용 후 전체 스크립트는 아래와 같다.

pipeline {
    agent any
    tools {
        gradle 'gradle'
    }
    stages {
        stage('Git Clone') {
            steps {
                git branch: 'develop', url: {git url}
            }
        }
        stage('DB Setting') {
            steps {
                script {
                    sh '''
                        sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_DB_USERNAME }|${DEV_DB_USERNAME}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_DB_PASSWORD }|${DEV_DB_PASSWORD}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_IMAGE_PATH }|${DEV_IMAGE_PATH}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEPLOY_ACTIVE:dev }|${DEPLOY_ACTIVE}|" "${WORKSPACE}/src/main/resources/application.yml"
                        sed -i "s|{ REST_API_KEY }|${REST_API_KEY}|" "${WORKSPACE}/src/main/resources/application.yml"
                        sed -i "s|{ REDIRECT_URI }|${REDIRECT_URI}|" "${WORKSPACE}/src/main/resources/application.yml"
                    '''
                }
            }
        }
        stage('Build') {
            steps {
                dir("./backend") {
                    sh "./gradlew clean build"
                }
            }
        }
        stage('Deploy') {
            steps {
                sshagent(credentials: ['aws-key']) {
                    sh '''
                        ls
                        pwd
                        ssh -o StrictHostKeyChecking=no ubuntu@{개발서버ip} uptime
                        scp /var/jenkins_home/workspace/{item이름}/backend/build/libs/funeat-0.0.1-SNAPSHOT.jar ubuntu@{개발서버ip}:/home/ubuntu/funeat
                        ssh -t ubuntu@{개발서버ip} ./deploy.sh
                    '''
                }
            }
        }
    }
}

기존 Git Clone 스테이지와 Build 스테이지 사이에 DB Setting 스테이지가 추가되었다.

DB Setting 스테이지를 자세히 살펴보자.

        stage('DB Setting') {
            steps {
                script {
                    sh '''
                        sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_DB_USERNAME }|${DEV_DB_USERNAME}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_DB_PASSWORD }|${DEV_DB_PASSWORD}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEV_IMAGE_PATH }|${DEV_IMAGE_PATH}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
                        sed -i "s|{ DEPLOY_ACTIVE:dev }|${DEPLOY_ACTIVE}|" "${WORKSPACE}/src/main/resources/application.yml"
                        sed -i "s|{ REST_API_KEY }|${REST_API_KEY}|" "${WORKSPACE}/src/main/resources/application.yml"
                        sed -i "s|{ REDIRECT_URI }|${REDIRECT_URI}|" "${WORKSPACE}/src/main/resources/application.yml"
                    '''
                }
            }
        }

펀잇은 sed 명령어를 사용해서 환경변수를 yml파일에 세팅했다.

sed 명령어는 vi 편집기처럼 편집에 특화된 명령어이다. 수정, 치환, 삭제, 글쓰기 등 웬만한 편집기능이 다 가능하다.

sed 명령어를 통해 기존 yml파일 속 변수들을 앞서 설정해둔 jenkins 속 환경변수로 치환할 수 있다.

sed "s|원본문자열|바꿀문자열|' 파일명 이런 식으로 사용할 수 있다.

⚠️ 단, 이렇게 쓰면 원본파일은 바꾸지 않고 표준출력을 한다. (원본파일을 바꾸고 싶으면 -i 옵션을 붙여야 한다.)
⚠️ 참고로 모든 기호가 구분자가 될 수 있다. (sed "s|${BEFORE}|${AFTER}| sample.txt" 가능, sed "s@${BEFORE}@${AFTER}@ sample.txt" 가능)

즉, 위의 DB Setting 스테이지에서

sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"

이 명령어의 의미는 ${WORKSPACE}/src/main/resources/application-dev.yml 파일안에 있는 { DEV_DB_URL }(실제 문자열)을 ${DEV_DB_URL}(jenkins의 환경변수)로 치환하라 는 뜻이다.

이런식으로 펀잇은 sed 명령어를 사용해서 DB 관련 정보나 소셜로그인 관련 정보를 치환했다!

이제 jenkins에서 DB정보가 이미 세팅된 채로 빌드가 가능하다! (git clone -> db setting -> build -> deploy)

참고로 ${WORKSPACE}는 jenkins내의 파일 위치이다.
보통 /var/jenkins_home/workspace/{jenkins item명}이다.
펀잇은 /var/jenkins_home/workspace/funeat-dev/backend이다! (git에서 backend폴더 내에 소스코드가 위치)

4. DB 연결

외부서버(DEV서버)에서 DB서버로 접속해야하기 때문에

DB서버에서 외부 서버로부터의 접속을 허용하는 설정을 해줘야 한다!

cd /etc/mysql/mysql.conf.d

vi mysqld.cnf

해당 파일에서 bind-address 값을 0.0.0.0 으로 수정한 후 wq!로 저장한다.

service mysql restart

mysql 서버를 재시작하면 끝!!

이 글은 펀잇팀 오잉이 작성하였습니다.

🔐 공통

🔑 프론트엔드

🔒 백엔드

📝 회의록

🤩 데모데이

Clone this wiki locally