앞의 과정들에서 서비스 코드를 개발하고 배포환경을 구성했으니 실제로 서비스를 배포하겠습니다.
EC2에 접속해서 깃을 설치 합니다.
sudo yum install git
설치 후 상태를 확인합니다.
git --version
깃 설치가 완료되면 git clone으로 프로젝트를 저장할 디렉토리를 생성합니다.
mkdir ~/app && mkdir ~/app/step1
생성된 디렉토리로 이동합니다.
cd ~/app/step1
본인의 깃허브에 생성한 repository에서 https 주소를 복사 후 git clone을 진행합니다.
git clone 복사한 주소
git clone이 끝났으면 클론된 프로젝트로 이동하여 코드들이 잘 수행되는지 확인합니다.
cd 프로젝트명 // 프로젝트로 이동
ll //프로젝트 코드 확인
./gradlew test
만약 gradlew 실행 권한이 없다는 메세지가 뜬다면 다음 명령어로 실행 권한을 추가한 뒤 다시 테스트를 진행하면 됩니다.
-bash: ./gradlew: Permission denied //권한 오류 메세지
chmod +x ./gradlew // 실행 권한 추가 코드
혹시 테스트 중 에러가 나서 프로젝트 수정 후 다시 깃허브에 푸시를 했다면 다음 명령어를 사용하시면 됩니다.
git pull
저의 경우 gradlew test중 85%에서 멈춰서 진행이 되지 않았는데, ec2 인스턴스 중지 후 재시작한 뒤 test하니 잘 되었습니다.
gradlew 파일은 그레이들이 설치되지 않은 환경에서도 해당 프로젝트에 한해서 그레이들을 쓸 수 있도록 지원하는 Wrapper 파일입니다. 그렇기 때문에 현재 EC2에 그레이들을 설치하지 않았음에도 Gradle Task를 수행할 수 있습니다.
작성한 코드를 실제 서버에 반영하는 것을 배포라고 합니다. 이 책에서는 다음의 과정을 모두 포괄하는 의미입니다.
이런 과정을 배포할 때마다 개발자가 하나하나 명령어를 실행하는 것은 불편함이 많습니다. 그래서 쉘 스크립트로 작성해 스크립트만 실행하면 앞의 과정이 차례로 진행되도록 하겠습니다.
참고로, 쉘 스크립트와 vim은 서로 다른 역할을 합니다. 쉘 스크립트는 .sh라는 파일 확장자를 사진 파일이며 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류입니다.
vim은 리눅스 환경과 같이 GUI가 아닌 환경에서 사용할 수 있는 편집 도구입니다.
가장 대중적인 빔으로 리눅스 환경에서의 편집을 진행하겠습니다.
vim을 처음 사용하는 분은 다음 링크에서 간단한 튜토리얼을 보고 시작하는걸 추천합니다.
~/app/step1 에 deploy.sh 파일을 생성합니다.
vim ~/app/step1/deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=springboot-aws
cd $REPOSITORY/$PROJECT_NAME
echo "> Git Pull"
git pull
echo "> 프로젝트Build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/wq
echo "> 현재 구동중인 애플리케이션 pid확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "> 현재 구동중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo ">현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR_NAME: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
생성한 스크립트에 권한을 추가합니다.
cd ~/app/step1
chmod +x ./deploy.sh
ll //권한 확인
ll 명령어를 실행하면 deploy.sh 가 추가된 것을 확인할 수 있습니다.
스크립트를 실행합니다.
./deploy.sh
실행된 것을 확인 후 nohup.out 파일을 열어 로그를 확인합니다. nohup.out은 실행되는 애플리케이션에서 출력되는 모든 내용을 갖고있습니다.
vim nohup.out
nohup.out 제일 하단에 보면 ClientRegistrationRepository를 찾을 수 없다는 에러가 발생하면서 애플리케이션 실행에 실패한 것을 확인할 수 있습니다.
ClientRegistrationRepository를 생성하려면 clientId와 clientSecret가 필수입니다. 로컬PC에서는 application-oauth.properties가 있었지만 이 파일은 .gitignore에 등록하여 깃허브에 올라가지 않았습니다. 어플리케이션을 실행하기 위해 서버에서 직접 이 설정들을 가지고 있게 해줍니다.
step1이 아닌 app 디렉토리에 properties 파일을 생성합니다.
vim /home/ec2-user/app/application-oauth.properties
로컬에 있는 application-oauth.properties 파일 내용을 그대로 붙여넣은 후 저장합니다. 그리고 생성한 파일을 사용하도록 deploy.sh 파일을 수정합니다.
vim ~/app/step1/deploy.sh
nohup java -jar -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties $REPOSITORY/$JAR_NAME 2>&1 &
수정 후 deploy.sh를 실행하고 로그를 확인합니다.
./deploy.sh
vim nohup.out
RDS에서 사용중인 MariaDB에서 스프링부트 프로젝트를 실행하기 위해 다음의 작업들이 필요합니다.
JPA가 사용될 엔티티 테이블과 스프링 세션이 사용될 테이블 2가지를 생성합니다.
스프링 세션 테이블은 schema-mysql.sql 파일에서 확인할 수 있습니다.
create table posts (
id bigint not null auto_increment,
created_date datetime(6),
modified_date datetime(6),
author varchar(255),
content TEXT not null,
title varchar(500) not null,
primary key (id)
) engine=InnoDB;
create table user (
id bigint not null auto_increment,
created_date datetime(6),
modified_date datetime(6),
email varchar(255) not null,
name varchar(255) not null,
picture varchar(255),
role varchar(255) not null,
primary key (id)
) engine=InnoDB;
CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
EXPIRY_TIME BIGINT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_PRIMARY_ID CHAR(36) NOT NULL,
ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
ATTRIBUTE_BYTES BLOB NOT NULL,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
인텔리제이에 연동해놓은 RDS에 반영합니다.
MariaDB 드라이버를 build.gradle에 등록합니다.
implementation("org.mariadb.jdbc:mariadb-java-client")
서버에 구동될 환경을 하나 구성합니다. src/main/resources에 application-real.properties 파일을 추가합니다.
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.session.store-type=jdbc
설정 완료후 깃허브 푸시합니다.
OAuth와 마찬가지로 RDS 접속 정보도 보호해야할 정보이니 EC2 서버에 직접 설정 파일을 만듭니다.
vim ~/app/application-real-db.properties
application-real-db.properties에 다음 내용들을 추가합니다.
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show_sql=false
spring.datasource.hikari.jdbc-url=jdbc:mariadb://rds주소:포트명(기본은 3306)/database명
spring.datasource.hikari.username=db계정
spring.datasource.hikari.password=db계정 비밀번호
spring.datasource.hikari.driver-class-name=org.mariadb.jdbc.Driver
마지막으로 deploy.sh가 real profile을 사용할 수 있도록 변경합니다.
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/
home/ec2-user/app/application-oauth.properties,/
home/ec2-user/app/application-real-db.properties,classpath:/application-real.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
설정을 완료 후 deploy.sh를 실행하고 nohup.out파일을 확인합니다.
curl 실행 시 html 코드가 정상적으로 보인다면 성공입니다.
curl localhost:8080
마지막으로 실제 브라우저에서 로그인을 해보겠습니다. 그 전에 몇 가지 작업을 해보겠습니다.
EC2에 스프링 부트 프로젝트가 8080 포트로 배포되었으니, 8080 포트가 보안 그룹에 열려있는지 확인합니다.
8080 포트가 열려있지 않다면 편집 버튼을 눌러 추가합니다.
인스턴스 메뉴로 이동하여 본인이 생성한 EC2 인스턴스를 클릭 후 퍼블릭 DNS를 확인합니다.
이 주소는 EC2에 자동으로 할당된 도메인으로, 인터넷에 이 주소를 입력하면 우리의 EC2 서버에 접근할 수 있습니다.
이 도메인 주소에 8080 포트를 붙여 브라우저에 입력합니다.
현재 상태에서는 해당 서비스에 EC2의 도메인을 등록하지 않았기 때문에 구글과 네이버 로그인이 작동하지 않습니다. 차례대로 등록을 해줍니다.
구글 웹 콘솔로 접속하여 본인 프로젝트 -> [API 및 서비스] -> [OAuth 동의화면] 로 이동 후 상단의 앱 수정을 클릭합니다.
승인된 도메인에 도메인 추가를 눌러 EC2의 퍼블릭 DNS를 등록합니다.
좌측 메뉴에서 사용자 인증 정보 로 이동 후 본인이 등록한 서비스의 이름을 클릭합니다.
승인된 리디렉션 URI에 [EC2 퍼블릭 DNS:8080/login/oauth2/code/google]을 등록합니다.
설정이 완료되었으면 다시 EC2 DNS 주소로 이동해서 구글 로그인을 테스트합니다.
네이버 개발자 센터로 접속해 본인의 프로젝트로 이동합니다.
PC 웹 항목에서 서비스 URL과 Callback URL을 수정합니다.
수정 완료 후 구글 로그인과 마찬가지로 네이버 로그인도 테스트합니다.