다른 작업 장소에서 프로젝트를 이어가려면 깃허브에 올린 프로젝트를 clone해야 합니다.
EC2로 접속 후 git 설치 -> 디렉토리 생성 후 clone 진행
다음과 같이 EC2에 프로젝트가 복사된 것을 확인할 수 있습니다.
여기에서 gradle로 테스트를 할 수 있는 이유는 gradlew 라는 wrapper 파일 때문입니다.
wrapper 파일은 새로운 환경에서 프로젝트를 설정할 때 java나 gradle을 별도로 설치 하지 않고 gradle을 사용할 수 있게 해줍니다.
작성한 코드를 실제 서버에 반영하는 것을 배포라고 합니다.
위의 3가지 경우 모두 배포에 해당한다고 볼 수 있습니다.
이것을 배포할 때마다 명령어로 하나하나치면 불편함이 동반됩니다. 따라서 쉘 스크립트로 스크립트만 실행하면 일련의 과정을 실행하는 작업을 진행합니다.
~/app/step1/deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=Spring_Practice
cd $REPOSITORY/$PROJECT_NAME
echo "> Git PULL"
git pull
echo "프로젝트 빌드 시작"
./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 &
vim 에서는 $변수명으로 변수에 접근할 수 있습니다.
저렇게 작성한 뒤 실행권한을 주고 실행하면 됩니다.
그럼 다음과 같이 nohup.out이 생성되는데 여기에 로그가 담겨있습니다.
nohup.out
내용은 애플리케이션의 실행에 실패했다는 내용입니다.
애플리케이션이 실패한 이유는 ClientRegistrationRepository생성에 실패했기 때문인데, clientId와 clientSecret이 있어야 합니다. 로컬에서는 application-oauth.properties파일에 id와 secret을 저장했지만, .gitignore파일에 올려놨기 때문에 pull을 실행해도 파일을 받지 못한 것입니다.
그렇기 때문에 EC2에서 직접 이 설정들을 가지고 있어야 합니다.
로컬에서 properties파일의 내용을 복사해 ec2 디렉토리 내에 저장하고, 쉘 스크립트에 경로를 붙여줍니다.
현재 RDS는 MariaDB를 사용 중입니다.
H2 테이블-> RDS 테이블 복사
JPA가 사용될 엔티티 테이블, 스프링 세션이 사용될 테이블 2가지를 생성합니다.
JPA 테이블은 테스트 로그에 나온 쿼리를 그대로 사용합니다.
스프링 세션 테이블은 schema-mysql.sql 파일에서 확인할 수 있습니다.
이것 역시 복사하여 RDS에 반영하도록 합니다.
먼저 MariaDB 드라이버를 build.gradle에 등록합니다.
그리고 서버에서 구동될 환경을 구성하기 위해
src/main/resources/application-real.properties 파일을 추가합니다. 실제 운영될 환경이기 때문에 보안상 이슈가 될 만한 설정들은 모두 제거합니다.
application-real.properties
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
OAuth와 마찬가지로 RDS 접속 정보도 보안 사항입니다.
app/application-real-db.properties
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds주소:포트명(기본은 3306)/database명
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
deploy.sh가 real profile을 쓸 수 있도록 코드를 개선한 뒤 deploy.sh를 다시 실행 시키면 html 코드가 나옵니다.
이제 저희가 EC2에 배포한 서비스가 브라우저에서 확인할 수 있는지 봐야합니다.
먼저 프로젝트가 8080포트로 배포되었으니 8080포트가 보안 그룹에 열려있는지 확인합니다.
그리고 다른 사용자들이 들어올 수 있어야 하기 때문에 HTTP, HTTPS 포트를 열어줍니다.
AWS EC2 도메인으로 접속
EC2에서 퍼블릭 DNS를 확인할 수 있는데 여기 뒤에 :8080을 붙이면 어디서든 서비스에 접속할 수 있습니다. 이렇게 도메인을 가지게 되었는데 도메인은 추후에 변경할 수 있습니다.
구글, 네이버에 EC2 주소 등록
프로젝트에 접근은 가능하나 아직 EC2 주소를 등록하지 않아 로그인이 안됩니다. 따라서 localhost뿐 아니라 EC2 도메인도 추가해 주어야 합니다.