개발자의 서재
Chapter.08-2 : AWS EC2 서버에 프로젝트를 배포해 보자(RDS DB와 연결, 소셜로그인 도메인정보 수정) 본문
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 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 파일에서 확인 가능합니다.
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 으로 접속하여 구글, 네이버, 카카오 소셜 로그인 정상 확인
'SpringBootProject > SpringBoot_ Oauth_AWS' 카테고리의 다른 글
Chapter.09 : 게시판 기능 보완하기 (0) | 2022.03.04 |
---|---|
Chapter.08-1 : AWS EC2 서버에 프로젝트를 배포해 보자(git pull, 배포 스크립트 만들기) (0) | 2022.02.27 |
Chapter.07 : AWS에 DB환경을 만들어보자 - AWS RDS (0) | 2022.02.25 |
Chapter.06 : AWS 서버 환경을 만들어보자 - AWS EC2 (0) | 2022.02.19 |
Chapter.05-2 : 스프링 시큐리티와 OAuth 2.0 으로 로그인 구현하기(코드 개선 + 테스트) (0) | 2022.02.18 |