ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Deployment] Spring Boot 프로젝트 Google Cloud SQL, VM 사용하여 배포하기
    BACKEND 2023. 5. 10. 00:17

    본 글은 스프링 부트로 진행한 프로젝트를 Google Cloud Platform으로 배포하는 과정을 담고 있습니다.

    1. 프로젝트 생성

    구글 클라우드에서는 AWS와 마찬가지로 처음 가입하면 $300 크레딧을 제공해준다. 가입을 한 후 프로젝트를 생성해준다.

    그리고 왼쪽 상단의 메뉴 탭에서 Compute Engine 탭을 클릭한 뒤 VM 인스턴스를 만들어야 한다.

    • 이름 : 이름은 원하는 인스턴스 이름을 사용하면 된다.
    • 리전 : 위치는 서버의 물리적 위치를 선택해야 한다. 서울에 있으니 서울을 선택한다. (예전엔 일본이 가장 가까운 리전 이어서 가상머신 돌아가는게 굉장히 느렸다고 한다.(물론 카더라..))
    • 머신 구성 선택 : 이 부분은 추후 업그레이드가 가능한데 우선은 micro 보다 small을 선택하는 것을 추천한다. micro를 하고 빌드를 하였다가 30분이나 걸리다가 gradle daemon이 자꾸 꺼지는 이슈가 발생하여서 크기를 small로 변경하였더니 아주 잘 돌아갔다.
    • 부팅 디스크:  부팅 디스크는 변경이 필요하다. 아래 변경 버튼을 눌러 아래와 같이 설정해주었다.

    • ID 및 API 액세스
      • 엑세스 범위 : 모든 Cloud API에 대한 전체 액세스 허용
      • 방화벽 - HTTP, HTTPS 트래픽 모두 선택 

    이렇게 설정한 후 인스턴스를 생성하면 몇 분 이내에 인스턴스가 생성된다.

    2. 공개 IP 주소 예약

    이렇게 설정한 후에 왼쪽 상단의 메뉴에 있는 VPC 네트워크 메뉴 - IP 주소에 들어간 외부 IP를 예약한다.

    여기서 예약한 IP 주소는 바로 뒤에 SQL 인스턴스를 생성하고 프로젝트에서 DB에 접근할 때 사용하게 된다.

    3. Google Cloud SQL 인스턴스 생성

     

    위의 과정까지 문제가 없었다면 오른쪽 상단 메뉴바에서 SQL을 선택한다.

    상단에 인스턴스 만들기를 통해 SQL instance를 생성한다.

    생성할 SQL 엔진을 선택해준다. 내 Spring Boot 프로젝트는 MySQL 기반이기 때문에 MySQL로 진행하였다.

    인스턴스 ID와 비밀번호를 입력한다. 비밀번호는 없어도 된다.(나중에 프로젝트 혹은 워크밴치에서 SQL에 접근할 때 사용)

    리전은 단일 영역으로 설정하고 인스턴스를 만든다.

    그 후에 리디렉트 되는 창에서 공개 IP 주소는 로컬 워크밴치와 Ubuntu 서버에서 접속 테스트를 하기 위해 꼭 필요하다! application.yaml에도 작성해야 한다.

    다음은 SQL의 사용자 메뉴에 들어간다.

    사용자 계정 추가를 진행한다.

    사용자 이름, 비밀번호 등을 설정 해준다. 이 hostname도 나중에 워크벤치에서 들어오거나 yaml파일에 넣을 때 사용한다.

     

    아무리 공개 IP가 되어있더라도, 네트워크 승인을 해야 연결이 가능하다. 네트워크 승인을 해주기 위해 SQL인스턴스 내부에 연결 탭으로 이동한다.

    새 네트워크에 아까 받았던 ubuntu의 공개 IP주소/32 를 입력한다. 만일 로컬에서도 접속하고 싶다면 0.0.0.0/0도 입력해야 한다.

    추가 후 화면이다.

    4. MySQL 워크벤치에서 원격 SQL 접근하기

    이제 위에서 접근 권한을 설정해주었으므로 로컬의 워크밴치에서 들어가볼 수 있다.

    워크벤치에서 새로운 Connection을 만들고 아래와 같이 적어주고 Test Connection을 눌러 맞는 암호를 입력하면 잘 접근이 되는 것을 확인할 수 있다.

    5. VM 접근

    다시 VM Instance에 돌아와 아까 생성한 Ubuntu를 SSH로 연결한다.

    SSH에 접근 후 다음 명령어를 통해 mysql을 설치한다.

    sudo passwd  #root 계정의 패스워드를 설정합니다.
    Changing password for user root.
    New password:
    BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
    Retype new password:
    $ sudo apt-get install mysql-server # mysql 설치

    그리고 Spring Project와 맞는 java버전으로 java도 설치한다.

    $ sudo apt update
    $ sudo apt install openjdk-17-jdk

    6. VM에 git clone 받고 VM에 application.yaml 입력하기

    이제 원격 git에 있는 레포지토리를 VM에 clone 받아와야 한다.

    다음 명령어를 통해 git 레포지토리를 clone 받는다.

     

    git clone (클론할 레포지토리 링크)

     

    그리고 나는 application.yaml(환경변수 지정해놓은 파일)은 .gitignore에 올려놨기 때문에 VM 안에서 새로 작성해 주었다.

    다음 명령어를 터미널 창에 친다.

     

    cd CareSpoon_BackEnd # 클론 받은 레포지토리
    cd carespoon/src/main/java/com/carespoon/resources
    vim application.yaml

    vim은 마우스도 먹지 않고 키보드로만 가능하다. 편집하기 위해 i키를 누른다.

     

    그리고 여기서 주의할 점은 application.yaml에 넣어줄 database url을 아까 위에서 받아온 sql 공개 IP 주소를 넣어줘야 한다는 것이다.

    다음과 같이 입력해주면 된다.

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://아까받은공개IP주소:3306/carespoon?&serverTimezone=Asia/Seoul
        username: 아까 생성한 서비스 계정
        password: 서비스 계정의 비밀번호

    나머지는 본인 프로젝트에 있었던 것 그대로 작성하면 된다.

    여기서 오타가 나면 엄청난 에러의 굴레에 갇히기 때문에 맞춤법을 눈 찢어지게라도 봐야한다.

     

    7. VM에서 build 

    다시 spring project의 루트 파일로 이동해서(클론한 레포지토리 디렉토리보다 한 파일 위(보통 Readme.md가 있으므로)) 다음 명령어를 쳐 build를 해준다.

    ./gradlew build

    성공적으로 빌드가 되었다면 이제 실행할 수 있는 상태가 된 것이다. 만약 대몬이 닫히거나 예기치 못하게 종료되었다는 에러가 뜬다면 VM의 CPU를 늘려보는 것도 한 방법이다. 

     

    이제 실행해보자. 빌드가 성공적으로 되었다면 프로젝트 루트 디렉토리에서 다음 명령어를 통해 이동할 수 있다.

    cd build/libs

    그리고 다음의 명령어를 쳐보면 실행을 시킬 수 있다.

    java -jar (jar 파일 이름)

    jar 파일 이름은 ls 명령어를 통해 확인할 수 있다. plain파일 말고 다른 파일의 이름을 적어야 한다.

    성공적으로 실행이 되었다.

    Trouble 1 : 실행하면서 만났던 NoSuchFileException

    분명 환경변수를 다 수정해주었는데 이상하게 NoSuchFileException이 떴다. 알고보니 내가 서비스단에서 선언해서 초기화해두었던 경로 문제였고 그 경로들은 모두 내 로컬 컴퓨터에 맞춰져 있었기 때문에 우분투에 맞게 수정해주어야했다.

    혹시 누군가 이 에러를 만났는데 32비트 읽는 처리까지 다 해놨는데도 해결되지 않는다면 이 방법을 제안한다.

     

     

    Trouble 2: 배포 후 Postman 테스트에서 connect ECONNREFUSED

    SSH창을 끄고 한 몇시간 이따가 포스트맨을 틀어 요청을 보냈는데 connect ECONNREFUSED가 떠서 VM이 꺼진거였는지, 확인하러 들어갔는데 인스턴스는 계속 돌고 있었다.

     

    검색을 해보니 ssh창을 없애면 ssh 세션이 종료되어서 ssh 클라이언트에 종속되어 있었던 프로젝트가 종료되는 것이었다.

    그래서 다시 실행시킬때는 java -jar 명령어에 백그라운드 옵션을 추가해서 실행시켜야 한다.

     

    백그라운드 옵션은 다음과 같다.

    nohup java -jar (jar 파일 이름) &

    명령어 앞에 nohup과 끝에 &을 붙여주면 8080포트에서 백그라운드로 서버가 돌아간다.

     

    배포 완료 후 테스트 

     

    그렇게 실행이 잘되었으면 이제 배포는 완료된 것이다.

     

    PostMan에서 baseurl을 바꾸고 테스트 해보면

    이렇게 원하는 결과값을 돌려준다. 

    배포 완료!

     

    이상으로 블로그 글을 마칩니다.

Designed by Tistory.