🤍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를 실행해 보면 정상적으로 실행된다!
'💻 my code archive > 🏷️JAVA & Spring(Boot)' 카테고리의 다른 글
스프링부트 공부기록(16) - Travis CI 배포 자동화, S3, CodeDeploy 연동 (0) | 2022.03.08 |
---|---|
스프링부트 공부기록(15) - EC2 배포하기, RDS 접근, EC2에서 구글,네이버 로그인하기 (0) | 2022.03.05 |
스프링부트 공부기록(13) - AWD 데이터베이스 RDS 만들기, 인텔리제이 연결하기 (0) | 2022.03.04 |
스프링부트 공부기록(12) - AWS 배포 :: 회원가입, EC2 인스턴스 생성하기 (0) | 2022.03.02 |
스프링부트 공부기록(11) - 게시판 프로젝트 :: 네이버 API 로그인 구현하기 (1) | 2022.03.02 |