이 글은 '스프링부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱(jojoldu)'을 공부하며 작성한 글로 생략된 내용은 책을 구매해서 확인하는 것을 권장합니다.
참고 소스코드 깃허브 https://github.com/jojoldu/freelec-springboot2-webservice
http://www.yes24.com/Product/Goods/83849117
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - YES24
가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 머스테치, 스프링
www.yes24.com
이 책의 8장에 해당하는 EC2 서버에 프로젝트 배포 중 스프링부트 프로젝트로 RDS 접근 및 EC2에서 소셜 로그인하는 과정에 대해 정리하고자 한다.
스프링 부트 프로젝트로 RDS 접근하기
RDS는 MariaDB를 사용중이므로 이 MariaDB에서 스프링부트 프로젝트를 실행하기 위한 작업을 해주어야 한다.
- RDS 테이블생성: H2에서 자동 생성해주던 테이블들을 MariaDB에서는 직접 쿼리를 이용해서 생성한다.
- 프로젝트 설정: 자바 프로젝트가 mariadb에 접근하려면 데이터베이스 드라이버 필요하다. 프로젝트에 mariadb에서 사용가능한 드라이버를 추가한다.
- EC2(리눅스 서버) 설정: 데이터베이스의 접속 정보는 공개되면 외부에서 데이터를 모두 가져갈수 있기 때문에 EC2 서버 내부에서 접속 정보를 관리하도록 설정
1. RDS 테이블 생성
RDS에 JPA가 사용될 엔티티 테이블과 스프링 세션이 사용될 테이블 2가지종류를 생성한다.
JPA가 사용될 엔티티 테이블
애플리케이션 실행시 로그로 생성되는 쿼리를 사용하면 된다.
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
스프링 세션 테이블
file 검색(윈도우 Ctrl+Shift+N)에서 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 설정을 위해 사용했던 DB Broswer의 콘솔창에서 실행
테이블 생성을 하기전에 쿼리가 수행될 데이터베이스를 설정하기 위해 아래 쿼리 먼저 실행
use springboot_webservice;
2. 프로젝트 설정
2-1. MariaDB 드라이버를 build.gradle에 등록
implementation("org.mariadb.jdbc:mariadb-java-client")
2-2. 서버에서 구동될 환경 구성 - application-real.properties 생성
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
3. EC2 설정
OAuth와 마찬가지로 RDS 접속 정보도 보호해야 하는 정보이다.
3-1. EC2 서버에 직접 설정파일을 두기 위해 apllication-real-db.properties 파일 생성
vim ~/app/application-real-db.properties
아래 내용 작성
책(2.1.7)과 다른 스프링부트 버전(2.4.1)을 사용하고 있기 때문에, 작성 방식이 달라 책과 다르게 아래 내용을 작성한다.
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
3-2. deploy.sh가 real.profile을 쓸 수 있도록 수정
수정 후 step1 디렉토리로 이동해서 deploy.sh 실행
./deploy.sh
실행후 nohup.out 파일에 들어가보니 데이터베이스를 몾차는 에러가 발생했다.
데이터베이스 이름이 springboot_webservice인데, springboot-webservice로 작성해서 생긴 문제였다.
이름에 오타 없는지 두번세번 꼭 확인하자!
curl 명령어 실행 후 html 코드가 보이면 성공적으로 EC2에 서비스가 배포된 것이다.
curl localhost:8080
EC2에서 소셜 로그인하기
브라우저에서 확인하기 전 몇 가지 작업이 필요하다.
- AWS 보안 그룹 변경 - EC2에 스프링 부트 프로젝트가 8080포트로 배포
- ec2 선택 후 보안그룹 -> 인바운드 규칙에서 8080포트가 열려 있는지 확인 안열렸다면 추가
- AWS EC2 도메인으로 접속
- 인스턴스 -> 생성한 인스턴스 -> 퍼블릭IPv4 DNS 확인 - EC2에서 자동으로 할당된 도메인
- 퍼블릭DNS:8080으로 접속
지금 상태에서는 해당 서비스에 localhost만 등록하고 EC2의 도메인을 등록하지 않았기 때문에 구글과 네이버 로그인 작동 불가
- 구글에 EC2 주소 등록 (https://console.cloud.google.com/home/dashboard)
- API 및 서비스 -> 사용자 인증 정보 -> OAuth 2.0 클라이언트ID 중 해당하는 ID 선택 -> 승인된 리다이렉션 URL추
- 네이버에 EC2 주소 등록 (https://developers.naver.com/apps/#/myapps)
- API 설정 -> 서비스 URL 퍼블릭DNS 주소로 변경, 네이버아이디로 로그인 Callback URL 추가
네이버와 구글 EC2 주소 등록후 로그인해보면 잘되는 것을 확인할 수 있다.
현재 방식의 문제점!!
- 수동 실행되는 Test
- 본인이 짠 코드가 다른 개발자의 코드에 영향을 끼치지 않는지 확인하기 위해 전체 테스트 필요한 상태
- 수동 Build
- 다른사람이 작성한 브랜치와 본인이 작성한 브랜티가 합쳐졌을 때(Merge) 이상이 없는지 Build를 수행해야 알 수 있다.
다음 9장은 이 문제를 해결하기 위해 깃허브에 푸시를 하면 자동으로 Test & Build & Deploy가 진행되도록 개선한다.
'스프링부트와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
Travis CI 배포 자동화 - Travis CI와 AWS S3, CodeDeploy 연동 (0) | 2023.04.13 |
---|---|
Travis CI 배포 자동화 - Travis CI와 프로젝트, Travis CI와 AWS S3 연동 (0) | 2023.04.06 |
EC2 서버에 프로젝트 배포하기 - EC2에 프로젝트 Clone 및 배포 스크립트 작성(외부 Security 파일 등록) (0) | 2023.03.27 |
AWS에 데이터베이스 환경 구축 - 내 PC에서 RDS 접속과 RDS와 EC2의 연동 확인 (0) | 2023.03.15 |
AWS에 데이터베이스 환경 구축 - AWS RDS(MariaDB) 인스턴스 생성 및 파라미터 설정 (0) | 2023.03.15 |
댓글