개발자의 서재

Chapter.08-2 : AWS EC2 서버에 프로젝트를 배포해 보자(RDS DB와 연결, 소셜로그인 도메인정보 수정) 본문

SpringBootProject/SpringBoot_ Oauth_AWS

Chapter.08-2 : AWS EC2 서버에 프로젝트를 배포해 보자(RDS DB와 연결, 소셜로그인 도메인정보 수정)

ironmask431 2022. 3. 1. 18:06

"스프링부트와 AWS로 혼자 구현하는 웹 서비스" 라는 책을 바탕으로 학습목적의 프로젝트를 진행하고 있습니다. 

 

소스 : https://github.com/ironmask431/springboot_aws_01

Chapter.08 : EC2 서버에 프로젝트를 배포해 보자

8.4 스프링부트 프로젝트와 RDS 연결하기 

기존 스프링부트 프로젝트에 AWS RDS (MariaDB)를 연결해보겠습니다. 

진행할 작업은 다음과 같습니다. 

1. 테이블생성 : H2에서 자동생성하던 테이블들을 mariaDB에서는 직접 쿼리를 이용해 생성합니다. 
2. 프로젝트 설정 : 프로젝트에서 mariaDB에 접근가능하도록 mariaDB driver 라이브러리를 추가합니다. 
3. DB접속정보 properties 생성 : DB접속정보를 담을 properties 를 새로 생성합니다. 
(application-oauth.properties 와 같은 비밀정보이므로 git에는 올리지않고,  EC2 서버에서는 별도로
생성하여 사용합니다. ) 

 

* RDS 테이블 생성 

RDS DB에 접속 후 JPA entity 가 적용될 테이블2개 (POSTS, USER),

세션정보를 저장할 테이블 2개 (SPRING_SESSION, SPRING_SESSION_ATTRIBUTES) 를 생성해줍니다. 

JPA 테이블 2개는 테스트 코드 수행시 로그로 생성되는 쿼리를 사용하면 됩니다. 

 

테스트코드 수행

전체 테스트 실행 시 로그에서 create table 검색

create table POSTS (
id bigint not null auto_increment
, create_date datetime
, modified_date datetime
, author TEXT not null
, content TEXT not null
, title varchar(500) not null
, primary key (id)
) engine=InnoDB;

create table USER (
	id bigint not null auto_increment
	, create_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 파일에서 확인 가능합니다.

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;

테이블 4개 생성완료

* 프로젝트 설정 

1. build.gradle 에 MariaDB 드라이버 추가

//MariaDB java client
implementation('org.mariadb.jdbc:mariadb-java-client')

2. DB접속 정보를 저장할 applicatoin-real-db.properties 생성

이 설정파일은 application-oauth.properties 와 마찬가지로 중요 정보가 포함되어  있기 때문에

.gitignore 에 등록하여 푸시되지 않도록 합니다.  (ec2 서버에는 별도로 파일 생성해서 사용 예정)

#jpa로 테이블 자동생성 옵션 끄기
spring.jpa.hibernate.ddl-auto=none

#DB접속정보
spring.datasource.url=jdbc:mariadb://RDS엔드포인트(접속url):3306/데이터베이스이름
spring.datasource.username=계정명
spring.datasource.password=패스워드
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

- h2가 아닌 실제DB를 사용할 경우 jpa테이블 자동생성 옵션을 반드시 꺼야합니다. 

(실 운영DB에 테이블이 모두 새로 생성 될 수 있으므로 반드시 off ) - 주의

 

- 데이터베이스 이름은 DB툴에서 접속 하여 확인. ("innodb")

3. application.properties 에서 profiles 에 real-db 추가

# 포함할 properties 파일 기재
spring.profiles.include=oauth,real-db

4. gradle build 후 로컬 구동

(gradle build 는 처음엔 실패했지만, 로컬 구동 후 다시 해보니 success)

* 항상 로컬에서 build 하여 빌드성공 확인 후 push 하자. (EC2 서버에서 빌드오류나면 고치기 힘듬.. )

 

5. 로그인, 글 작성 시 RDS테이블에 데이터정상 입력 되는 것 확인

(mariaDB 연동 시 h2 DB는 자동으로 미사용 처리 되는듯합니다.)

 

* EC2 서버에서 사용할 application-real.properties 생성  

application.properties 에서 보안/로그상 이슈가 될 만한 설정들은 제거한 설정파일을 별도로 생성합니다.

(devtools 옵션과 h2 옵션만 주석처리)

spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# spring.h2.console.enabled=true
# spring.devtools.livereload.enabled=true
spring.profiles.include=oauth,real-db
spring.session.store-type=jdbc
org.gradle.daemon=false

* EC2 서버에서 구동 하기 

1. 수정내역 git push ,  ec2 서버에서 git pull 

 

2. git pull 받은 후 build 정상 확인

 

3. app/ 경로에 application-real-db.properties 파일 생성

(로컬의 application-real-db.properties 과 같은 내용으로 작성함.)

 

4. deploy.sh 수정함 

nohup java -jar \
-Dspring.config.location=\
classpath:/application.properties,\
classpath:/application-real.properties,\
/home/ec2-user/app/application-oauth.properties,\
/home/ec2-user/app/application-real-db.properties, \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &

-Dspring.config.location 에

application-real.properties 와  applicaiton-real-db.properties 도 추가하고, 

-Dspring.profiles.active=real 도 추가함.  < 이것은 구동 시 application-real.properties 설정파일을 활성화 

하겠다는 의미이고, application-real.properties 파일내에 oauth, real-db 프로필이 포함되어 있기 때문에,

oauth, real-db 설정파일도 활성화 대상이 된다. 

 

5. deploy.sh 쉘 실행, nohup.log 확인

tomcat 8080 포트 정상 구동 확인 완료

8080포트 접속상태도 정상인지 확인 해본다. 

curl -v telnet://localhost:8080

6. 브라우저에서 ec2 서버로 접속하여 RDS의 데이터가 정상 노출되는 것도 확인

8.5 EC2 에서 소셜 로그인하기

EC2 서버에서도 소셜 로그인 기능을 사용하기 위해 

구글, 네이버, 카카오 소셜로그인 등록 시 localhost:8080 으로 등록 했던 정보들에

EC2 도메인정보도 추가해준다.

 

1. EC2 인스턴스 퍼블릭 IPv4 DNS 확인

2. 구글 클라우드 플랫폼 접속 > API및 서비스, 사용자 인증정보 > 클라이언트 id 클릭

3. 승인된 리디렉션 URI 에 EC2 DNS 도메인정보 추가

(기존 localhost 등록한 내용에서 localhost 부분만 EC2 DNS로 변경해서 추가함)

4. 네이버 Developers 접속 > 내 애플리케이션 > API설정 탭 클릭

5. 서비스URL을 "http://localhost:8080" 에서 "http://(EC2 DNS):8080" 으로 변경함.

네이버의 경우 서비스 URL을 1개만 등록 가능함.  변경하게 되면 localhost 에서는 네이버 로그인 불가능.

localhost 도 가능하게 하려면 네이버 애플리케이션을 하나 더 만들어서 신규키를 발급받아서 해야함. 

(localhost용 네이버 oauth 정보와 ec2 서버용 oauth 정보가 각각 따로 있어야함.)

 

네이버로그인 callback url 에 EC2 DNS 를 추가함. 

(기존 localhost 등록한 내용에서 localhost 부분만 EC2 DNS로 변경해서 추가함)

6. 카카오 Developers 접속 > 내 애플리케이션 > 앱설정 > 플랫폼  > web 사이트도메인 수정

7. web 플랫폼 수정 > 사이트 도메인 > http://(ec2 dns):8080 추가함.

8. 카카오 로그인 > Redirect URI > 수정

9.  Redirect URI  ec2 dns 정보 추가함. 

(기존 localhost 등록한 내용에서 localhost 부분만 EC2 DNS로 변경해서 추가함)

10. 브라우저에서 EC2 DNS:8080 으로 접속하여 구글, 네이버, 카카오 소셜 로그인 정상 확인

Comments