스프링부트 공부기록(14) - EC2 서버 배포 스크립트 작성, gradlew test 에러 원인, Junit5 맞게 코드 수정 해결 방법
my code archive
article thumbnail
반응형

🤍EC2에 프로젝트 Cone 받기

 

먼저 깃허브에 코드를 받아올 수 있게 깃을 설치하고 git clone으로 프로젝트를 저장할 디렉토리를 생성한다.

sudo yum install git //EC2에 깃 설치
git --version //설치 상태 확인
mkdir ~/app && mkdir ~/app/step1 //프로젝트 저장할 디렉토리 생성

깃허브 https 주소를 복사해와서

 

git clone을 진행한다.

git clone 복사한 주소

ll 명령어로 프로젝트 코드 전체 clone 받아졌는지 확인.

 

코드들이 수행되는지 테스트 해보기

./gradlew test

 

이 gradlew test에서 정말....많은 고생을 했다....ㅠㅠㅠㅠㅠㅠ

 

처음엔 될 것 처럼 희망 고문을 하더니...

 

상쾌한 Build failed...

 

💡해결 방법

(간절한 커밋 메시지 보이시나요..)정말 많은 삽질을 했다...처음에는 컴파일 에러 어쩌구 떠서...자바 버전이 잘못된 줄 알고 이것도 맞춰봤고 롬복 원인이라는 글도 있어서 롬복 의존성도 바꿔보고 수많은 시도 끝에 찾아낸 원인은... Junit5였는데...사람마다 원인은 다를 수 있어요..

 

  • gradle 6이상에 맞게 build.gradle 코드를 변경한다. 주석 처리된 부분이 기존 작성 코드이고 아래가 Gradle6에 맞게 변경한 것이다.

  • 의존성
  • test {useJunitPlatform()} Junit5 사용 위해 필수 선언되어야 함!
test {
    useJUnitPlatform()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.springframework.boot:spring-boot-starter-mustache')

    implementation('mysql:mysql-connector-java')

    //Lombok
    implementation('org.projectlombok:lombok')
    annotationProcessor('org.projectlombok:lombok')
    testImplementation("org.projectlombok:lombok")
    testAnnotationProcessor('org.projectlombok:lombok')
    //testCompileOnly('org.projectlombok:lombok:1.18.22')
    //compileOnly('org.projectlombok:lombok:1.18.22')

    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('com.h2database:h2:')

    implementation('org.springframework.boot:spring-boot-starter-oauth2-client')
    implementation('org.springframework.session:spring-session-jdbc:')

    testImplementation('org.springframework.boot:spring-boot-starter-test')
    testImplementation("org.springframework.security:spring-security-test")


}

 

  • 책에는 테스트 코드가 Junit4 기준으로 나와있는데 이걸 전부 Junit5에 맞춰 변환해야 한다.
  • @Test : imort 패키지 위치가 달라짐.
import org.junit.jupiter.api.Test; //Junit5
import org.junit.Test //Junit4
  • @RunWith -> @ExtendWith로 변경.
import org.junit.jupiter.api.extension.ExtendWith; //Junit5
import org.junit.runner.RunWith //Junit4

 

  • SpringRunner : @RunWith 괄호 안에 선언했던 SpringRunner -> SpringExtension 으로 변경.

import org.springframework.test.context.junit.jupiter.SpringExtension; //Junit5
import org.springframework.test.context.junit4.SpringRunner //Junit4

 

  • @After -> @AfterEach , @Before -> @BeforeEach
import org.junit.jupiter.api.BeforeEach //Junit5
import org.junit.Before //Junit4

import org.junit.jupiter.api.AfterEach //Junit5
import org.junit.After //Junit4

 

이외에도 추가 사항이 몇 가지 더 있는데 저자 이동욱님 블로그에서 확인 가능합니다.. 다들 이 글 보시고 고생 덜하시길...진짜 너무 힘들었다...

그런데 이 수정 역시 시간이 지나면 작동하지 않을 것이고 모든 개발 도구들은 버전업을 한다. 덕분에 로그를 보고 에러를 검색하고 달라진 버전에 맞춰 프로젝트를 수정하고 에러를 고치는 좋은 공부를 할 수 있었던 것 같다.

 

하루종일 삽질 끝에 드디어 만난 BUILD SUCCESSFUL

 

  • (+)추가 사항 : 아마 처음 실행하면 모두들 ./gradlew : Permission denied 라고 실행 권한 없다는 메시지 뜨실 거예요.. 이건 chmod +x ./gradlew 명령어로 실행 권한을 추가하면 됩니다.

 


🤍배포 스크립트 만들기

책에서 포함하는 배포의 의미

  • git clone 혹은 git pull을 통해 새 버전의 프로젝트를 받음
  • Gradle이나 Maven을 통해 프로젝트 테스트와 빌드
  • EC2 서버에서 해당 프로젝트 실행 및 재실행

 

1. 빔으로 배포 쉘 스크립트 작성.

vim ~/app/step1/deploy.sh //스크립트 파일 생성

 

REPOSITORY=/home/ec2-user/app/step1, PROJECT_NAME=bootpractice

  • 프로젝트 디렉토리 주소, 프로젝트 이름은 스크립트 내에서 자주 사용하는 값 --> 변수로 저장함.
  • 쉘에서는 타입 없이 선언하여 변수를 저장함.
  • 쉘에서는 $변수명 으로 변수를 사용할 수 있음.

 

✅cd $REPOSITORY/$PROJECT_NAME/

  • 제일 처음 git clone 받았던 디렉토리로 이동
  • 위에서 선언한 쉘 변수 설명을 따라 이동

 

✅git pull

  • 디렉토리 이동 후, master 브랜치 최신 내용을 받음.

 

✅./gradlew build

  • 프로젝트 내부의 gradlew로 build를 수행

 

✅cp ./build/libs/*.jar$REPOSITORY/

  • build 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사

 

✅CURRENT_PID=$(pgrep -f {PROJECT_NAME}.*jar)

  • 기존 수행 중이던 애플리케이션을 종료함.
  • pgrep : process id만 추출하는 명령어
  • -f : 프로세스 이름으로 찾는 옵션

✅if ~ else ~ fi

  • 현재 구동 중인 프로세스가 있는지 없는지 판단하여 기능을 수행하겠다.
  • process id 값을 보고 프로세스가 있을 시 해당 프로세스를 종료.

 

✅JAR_NAME=$(ls -tr$REPOSITORY/|grep jar|tail-n 1)

  • 새로 실행할 jar 파일명 찾기
  • 여러 jar 파일이 생기기 때문에 tail-n 로 가장 나중의 jar 파일(최신 파일)을 변수에 저장

✅nohup java-jar $REPOSITORY/$JAR_NAME 2>&1&

  • 찾은 jar 파일명으로 해당 jar 파일을 nohup으로 실행
  • 스프링부트 특성상 특별히 외장 톰캣을 설치할 필요가 없으며, 내장 톰캣을 사용하여 jar 파일만 있으면 바로 웹 애플리케이션 서버를 실행할 수 있다.
  • javar -jar 명령어를 사용하면 사용자가 터미널 접속을 끊을 시 애플리케이션도 함께 종료되기 때문에, 실행자가 터미널을 종료해도 애플리케이션은 계속 구동될 수 있도록 nohup 명령어를 사용.

 

2. 스크립트 실행 권한 추가

chmod +x ./deploy.sh //실행 권한 추가

 

 

3.  ./deploy.sh 명령어로 스크립트 실행

 

  • 애플리케이션을 실행 후 nohup.out 파일에 애플리케이션에서 출력되는 모든 내용이 저장됨.

 

  • nohup.out 파일을 열어보면 ClientRegistrationRepository를 찾을 수 없다는 에러가 발생했다.
  • 🔍에러 이유 : 앞서 개인 정보가 담긴 application-oauth.properties 파일을 .gitignore로 제외하고 깃허브에 올렸기 때문이다. 

 

  • 서버에서 직접 이 설정을 갖고 있게 하도록 app 디렉토리에 application-oauth.properties 파일을 생성한다.

 

4. application-oauth.properties 파일을 사용 가능하도록 deploy.sh 파일 수정

 

-Dspring.config.location 

  • 스프링 설정 파일 위치 지정
  • classpath가 붙으면 jar 안에 있는 resources 디렉토리 기준으로 경로가 생성됨.
  • application-oauth.properties는 외부에 있기 때문에 절대 경로 사용

 

5. 수정 후 다시 deploy.sh를 실행해 보면 정상적으로 실행된다!

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형