▪️EC2 서버에 프로젝트를 배포해 보자
먼저 EC2에 접속해서 아래 명령어를 입력해 깃을 설치한다.
sudo yum install git
성공적으로 Git을 설치하고 나면 아래와 같이 설치여부 및 버전을 확인할 수 있다.
git --version
다음으로 우리의 프로젝트를 담을 디렉토리를 만들자.
app 디렉토리를 만들고, 그 아래에 step1 디렉토리를 만든다.
그리고 해당 디렉토리로 이동한다.
mkdir ~/app && mkdir ~/app/step1
cd ~/app/step1
복사한 https 주소를 통해 git c lone을 진행한다.
git clone 복사한 주소
이후 프로젝트로 이동해 코드들이 잘 수행되는지 테스트로 검증해보자.
chmod +x ./gradlew
./gradlew test
▪️배포 스크립트 만들기
우리가 배포를 한다고 하면, 여러 가지 의미를 내포하고 있다. 보통은 다음과 같은 의미를 가진다.
1. git clone 또는 git pull을 통해 새 버전의 프로젝트를 내려받는다
2. Gradle / Maven을 통한 프로젝트 테스트 및 빌드를 수행한다
3. EC2 서버에서 프로젝트를 실행한다
이런 과정을 Linux terminal 환경에서 매번 직접 치는 것은 개발자에게 매우 수고로운 일이 아닐 수 없다.
다행히 이를 파일 하나에 적어 두고, 파일을 실행하는 것으로 한 번에 모든 과정이 진행되도록 할 수 있다. 이를 '쉘 스크립트' 라고 한다.(쉘 스크립트는 .sh 확장자를 가지며, Linux 환경에서 사용할 수 있다.)
vim ~/app/step1/deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=springboot-web-practise
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/
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 &
생성한 스크립트에 실행 권한 추가한다.
chmod +x ./deploy.sh
스크립트 실행한다.
./deploy.sh
실행 결과는 같은 디렉토리의 nohup.out 파일을 열어 보면 확인할 수 있다.
맨 밑을 확인해 보면 아래와 같은 결과가 나온다.
이는 oauth2 관련 문제 때문에 구동에 실패했다는 메세지이다.
▪️외부 Security 파일 등록하기
앞서 5장에서, oauth2 관련 값을 담을 application-oauth.properties 파일을 만들고, 이 파일을 .ignore 파일에 추가했었다.이 파일은 oauth2 인증에 관련된 중요한 정보를 담고 있기 때문에 우리의 프로젝트 구동에는 이 파일에 담긴 내용이 필수적이다.
따라서 이 내용을 EC2 내부로 수동으로 옮겨야 한다. 그래서 서버에서 직접 이 설정들을 가지고 있게 해야한다.
먼저 app 디렉토리 아래에 properties 파일을 만들자.
vim /home/ec2-user/app/application-oauth.properties
그리고 로컬에 있는 application-oauth.properties 파일 내용을그대로 붙여넣기를 한다.
이렇게 생성한 파일을 쓰도록 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를 실행해본다.
그렇다면 정상적으로 실행된 것을 확인할 수 있다.
-Dspring.config.location
- 스프링 설정 파일 위치를 지정한다.
- 기본 옵션들을 담고있는 application.properties과 OAuth 설정들을 담고 있는 application-oauth2.properties의 위치를 지정한다.
- classpath가 붙으면 jar 안에 있는 resources 디렉토리를 기준으로 경로가 생성된다.
- application-oauth.properties는절대경로를 사용한다.외부에 파일이 있기 때문이다.
이제 RDS 접근 설정도 추가해보자!
▪️스프링 부트 프로젝트로 RDS 접근하기
MariaDB에서 스프링부트 프로젝트를 실행하기 위해서는 몇 가지 작업이 필요하다.
테이블 생성 - H2에서는 자동으로 생성해 줬지만, MariaDB는 직접 생성해 주어야 한다.
프로젝트 설정 - Java 프로젝트가 MariaDB에 접근하려면 DB 드라이버가 필요하다.
EC2 설정 - EC2 서버 내부에서 접근 정보를 관리하도록 설정한다.
RDS 테이블 생성
MariaDB 내에 테이블을 생성해 보자. JPA가 사용될 엔티티 테이블과 스프링 세션이 사용할 테이블 두 가지를 만든다.
JPA가 사용할 테이블을 테스트 코드 수행 시 로그로 생성되는 쿼리를 사용하면 된다.
create table posts (id bigint not null auto_increment, created_date datetime, modified_date datetime, 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, modified_date datetime, email varchar(255) not null, name varchar(255) not null, picture varchar(255), role varchar(255) not null, primary key (id)) engine=InnoDB
스프링 세션 테이블을 schema-mysql.sql 파일에서 확인할 수 있다.이를 복사하여 RDS에 반영한다.
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)
);
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
);
프로젝트 설정
MariaDB 드라이버를 build.gradle에 등록한다.
compile("org.mariadb.jdbc:mariadb-java-client")
그리고 서버에서 읽을 환경을 하나 구성한다.
src/main/resources/ 아래에 application-real.properties 파일을 만든다.
이 파이을 만들면 profile=real인 환경이 구성된다고 보면 된다.
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
모든 설정이 완료되면 깃허브에 푸시한다.
+참고
나는 위가 에러가 떠서 아래와같이 설정했다.
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
EC2 설정
MariOAuth와 마찬가지로 RDS 접속 정보도 보호해야 할 정보이니 EC2서버에 직접 설정 파일을 둔다.
vim ~/app/application-real-db.properties
그리고 아래 내용을 추가한다.
여기서 첫번째 줄을 통해 자동생성 옵션을 None(생성하지 않음.)으로 지정한다.
RDS에는 실제 운영으로 사용될 테이블이니 스프링부트에서 새로 만들지 않도록 해야 한다.
이 옵션을 하지 않으면 자칫 테이블이 모두 새로 생성될 수 있다.
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds주소:포트명(3306)/db이름
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
oauth 때와 같이, 이 파일을 읽을 수 있도록 deploy.sh 파일을 수정한다.
-Dspring.profiles.active=real을 통해 application-real.properties를 활성화시킨다.
~
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를 실행해 정상적으로 실행되는지 확인한다.
아래 curl 명령어로 html 코드가 정상적으로 보인다면 성공이다.
curl localhost:8080
▪️EC2에서 소셜 로그인 하기
이제 직접 접속해서 확인해 보자.
접속을 위해서는 일단 AWS 보안 그룹 변경이 필요하다. EC2에 스프링 부트 프로젝트가 8080 포트로 배포되었으니, 8080 포트가 보안 인바운드 그룹에 열려 있는지 확인하자.
그후 퍼블릭주소:8080을 입력하면 잘 접속되는 것을 확인 가능하다.
OAuth2를 이용한 소셜 로그인을 구현할 때, 도메인을 입력하는 칸이 있었다.
당시에는 로컬 환경에서 테스트 중이었으므로 localhost:8080을 입력했다.
이걸 수정해 주어야 한다.
https://console.cloud.google.com/home/dashboard
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
위로 접속해 [API 및 서비스 => 사용자 인증정보] 이동한다.
[OAuth 동의 화면] 탭을 선택하고 승인된 도메인에 'http://'없이 퍼블릭 DNS를 등록한다.
[사용자 인증 정보] 탭을 클릭해서 본인이 등록한 서비스의 이름을 클릭한다.
퍼블릭DNS주소에 http://[퍼블릭 DNS 주소]:8080/login/oauth2/code/google주소를 추가하여 승인된 리디렉션 URI에 등록한다.
마찬가지로, 네이버 개발자 센터로 접속해 본인 프로젝트로 이동한다.
그리고 API 설정 탭을 클릭한다.
여기서 서비스 URL과 Callback URL 두개를 수정한다.
서비스 URL : 8080포트 제외 실제 도메인 주소만 입력. http://DNS주소/
Callback URL : 전체 주소를 등록. (http://[EC2 퍼블릭 DNS]:8080/login/oauth2/code/naver)