우선 EC2에 접속해서 깃 설치
sudo yum install git
git --version
깃 설치 이후 git clone으로 프로젝트를 저장할 디렉토리 생성
mkdir ~/app && mkdir ~/app/step1
위 명령어에서 ~는 현재 사용자의 홈 디렉토리 나타냄
-> mkdir은 디렉토리를 만들기 위한 명령어며, &&는 앞에 명령어가 정상적으로 실행되었을 때 다음 명령어를 실행하도록 함
-> 위 명령어는 사용자의 홈 디렉토리에 app 디렉토리를 만들고, 그 안에 step1 디렉토리를 만듬
만든 이후 디렉토리 이동
cd ~/app/step1
이동 한후 프로젝트의 https 주소를 복사하여 git clone 진행
클론 이후 파일들이 잘 옮겨졌는지 확인하였음
코드들이 잘 수행되는지 테스트로 검증
./gradlew test
위 코드는 gradle 빌드 도구를 사용하여, 프로젝트 테스트를 실행하는 명령어
-> /gradlew는 Gradle의 Wrapper를 실행한느 명령어로, 로컬 환경에 Gradle이 설치되어 있지 않아도 Gradle 빌드를 실행할수 있도록 지원
정상적으로 테스트 통과 화면
작성한 코드를 실제 서버에 반영하는 것
을 배포라고 함
배포란 다음과 같은 과정을 모두 포괄하는 의미
배포할 때마다 개발자가 하나하나 명령어를 실행하는 것은 불편한점이 많음
-> 따라서 이를 쉘 스크립트로 작성해 스크립트만 실행하면 앞의 과정이 차례로 진행되게 할 예정
쉘 스크립트는 .sh라는 파일 확장자를 가진 파일
-> Node JS가 .js라는 파일을 통해 서버에서 작동하는 것처럼 쉘 스크립트 역시 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류
리눅스에는 빔 외에도 이맥스,나노 등의 도구가 있지만 Vim이 가장 대중적임
-> 경로에 deploy.sh 파일 하나 생성
vim ~/app/step1/deploy.sh
스크립트 내에서 자주 사용하는 값은 REPOSITORY, PROJECT_NAME 변수로 선언
-> 쉘에서는 타입 없이 선언하며, $변수명
으로 변수 사용 가능
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
이는 build의 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사
pgrep은 process id만 추출하는 명령어
-> -f 옵션은 프로세스 이름으로 찾음
if~else~fi
-> 현재 구동중인 프로세스가 있는지 없는지 판단해서 기능 수행
JAR_NAME= $(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
여러 jar 파일이 생기기 때문에, tail-n로 가장 나중의 jar파일(최신 파일)을 변수에 저장
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
찾은 jar 파일명으로 해당 jar파일을 nohup으로 실행
-> 스프링 부트는 특별히 외장 톰캣을 설치할 필요가 없고, 내장 톰캣을 사용해서 jar 파일만 있으면 바로 WAS를 실행할 수 있음
-> 애플리케이션 실행자가 터미널을 종료해도 애플리케이션은 계속 구동될 수 있도록 nohup 명령어 사용
생성한 스크립트에 실행 권한 추가
실행 및 결과 확인
nohup.out
(실행되는 애플리케이션에서 출력되는 모든 내용 가지고 있음) 파일 열어 로그 확인
다음과 같은 오류 발생
위 오류 이유
-> ClientRegistrationRepository를 생성하려면 clientId와 clientSecret이 필수
-> 로컬의 경우에는 application-oauth.properties
가 있어 문제 X
-> 하지만 이는 .gitignore에 등록해 git 에서 제외 대상이라 깃 허브에는 올라가 있지 않음
애플리케이션을 실행하기 위해 공개된 저장소에 ClientId와 ClientSecret을 올릴순 없으니 서버에서 직접 이 설정들을 가지고 있게 진행
우선 step1이 아닌 app 디렉토리에 properties 파일 생성
vim ~/app1/application-oauth.properties
파일 생성 후 로컬에 있는 application-oauth.properties 파일 내용을 그대로 붙여 넣음
-> 그리고 이 파일을 쓰도록 deploy.sh파일 수정
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app1/application-oauth.properties \
$REPOSITORY/$JAR_NAME 2>&1 &
-Dspring.config.location
: 스프링 설정 파일 위치 지정, 이때 application.properties와 OAuth 설정을 담고 있는 application-oauth.properties의 위치를 지정
이때 classpath가 붙으면 jar 안에 있는 resources 디렉토리를 기준으로 경로가 생성됨
수정후 다시 deplosy.sh를 실행
정상 동작 확인 완료!
RDS는 MariaDB로 사용중
-> 이 MariaDB에서 스프링부트 프로젝트를 실행하기 위해선 몇가지 작업 필요
테이블 생성
: H2에서 자동 생성해주던 테이블들을 MariaDB에서는 직접 쿼리 이용해 생성프로젝트 설정
: 자바 프로젝트가 MariaDB에 접근하려면 데이터베이스 드라이버가 필요, MariaDB에서 사용 가능한 드라이버를 프로젝트에 추가EC2(리눅스 서버 설정)
: 프로젝트 안에 접속 정보를 갖고 있다면 깃 허브와 같이 오픈된 공간에선 누구든 해킹할 위험이 있음(EC2 서버 내부에서 접속 정보를 관리하도록 설정)JPA가 사용될 엔티티 테이블
과, 스프링 세션이 사용될 테이블
총 2가지를 생성
-> JPA가 사용할 테이블은 테스트 코드 수행 시 로그로 생성되는 쿼리를 사용하면 됨
테스트 코드 수행 시 다음과 같은 로그 발생하는데 이를 복사하여 RDS에 반영
Hibernate: 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
Hibernate: 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
스프링 세션 테이블은 schema-mysql.sql 파일에서 확인 가능
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
파일 추가
application-real.properties로 파일을 만들면 profile=real
인 환경이 구성된다고 보면 됨
-> 실제 운영될 환경이기 때문에 보안/로그상 이슈가 될만한 설정을 모두 제거하며 RDS 환경 profile 설정이 추가됨
application-real.properties
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
이후 git push 진행
OAuth와 마찬가지로 RDS 접속 정보도 보호해야 할 정보니 EC2 서버에 직접 설정 파일을 둠
-> app 디렉토리에 application-real-db.properties
생성
vim ~/app/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을 쓸수 있도록 개선
여기서 application-real.properties를 활성화
-> application-real.properties의 spring.profiles.include=oauth,real-db 옵션 때문에 real-db 역시 함께 활성화 대상에 포함
curl 명령어로 html 코드가 보인다면 성공
AWS 보안 그룹 변경
-> EC2에 스프링 부트 프로젝트가 8080포트로 배포되었으나, 8080 포트가 보안 그룹에 열려있는지 확인
AWS EC2 도메인으로 접속
-> 생성한 EC2 인스턴스를 선택하면 퍼블릭 DNS를 확인할 수 있는데, 이 주소가 EC2에 자동으로 할당된 도메인
-> 이 주소에 80880포트를 붙여 입력해보기
http://ec2 ~~~~ amazonaws.com:8080/
접속은 잘되지만 해당 서비스에 EC2의 도메인을 등록하지 않았기 때문에 구글과 네이버 로그인이 작동하지 않음
승인된 도메인에 EC2의 퍼블릭 DNS 등록
이후 사용자 인증 정보 탭에서 등록한 서비스의 이름 클릭
퍼블릭 DNS 주소에:8080/login/oauth2/code/google
주소를 추가하여 등록
구글 로그인 또한 정상적으로 실행 됨
네이버 개발자 센터로 접속해서 본인 프로젝트로 이동
여기서 서비스 URL
는 로그인을 시도하는 서비스가 네이버에 등록된 서비스인지 판단하기 위한 항목
-> 8080 포트를 제외하고 실제 도메인 주소만 입력
-> EC2의 주소를 등록하면 localhost가 안되므로 개발 단계에서는 등록하지 않는 것을 추천
Callback URL 에는 전체주소 등록(EC2 퍼블릭 DNS :8080/login/oauth2/code/naver)
이때 터미널에서 생성하였던 application-oauth.properties
이때 redirect-uri 값 수정해야 정상 반영됨!