8.4 부터는 여기에 따로정리하겠다.
8.4 스프링부트 프로젝트로 RDS 접근하기
RDS는 우린 현재 MariaDB를 사용중이다. MariaDB에서 스프링부트 프로젝트를 실행하려면 다음과 같은 작업을 선행해야한다.
- 테이블 생성 : H2 DB에서는 자동으로 생성해주던 테이블을 직접 쿼리를 사용해 생성해야한다.
- 프로젝트 설정 : 자바 프로젝트가 MariaDB에 접근하려면 DB드라이버를 추가해야한다.
- EC2 (리눅스 서버) 설정 : 데이터 베이스 접속 정보는 보호되어야할 정보이다. 공개시엔 외부에서 데이터를 모두 가져갈 수 있는 데이터 유출이 일어날 수 있다. 따라서, 프로젝트 안에 접속 정보를 가지고 있다면 깃헙에서 해킹 될 수 있다. 따라서, EC2 서버 내부에서 접속 정보를 관리해야한다.
RDS 테이블 생성하기
우리는 JPA를 사용해 엔티티 테이블, 스프링 세션을 다뤘다.
JPA가 사용할 테이블은 테스트 코드 수행시 로그로 생성되는 쿼리를 사용하자.
발생하는 로그에서 Create table 명령어를 찾으면 다음과 같다.
create table posts (
id bigint not null auto_increment,
created_date datetime, modified_date datetime,
author varchar(255), content TEXT not null, title varchar(500) not null,
primary key (id)
) engine=InnoDB;
create table user (
id bigint not null auto_increment, created_date datetime, modified_date datetime,
email varchar(255) not null, name varchar(255) not null,
picture varchar(255) not null, role varchar(255) not null,
primary key (id)
) engine=InnoDB;
[ 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 console에 해당 명령어들을 입력해서 테이블을 생성하면 되는데 여기서 또 오류가 발생!
Error executing SQL statement. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX...' at line 2 - Connection: freelec: 33ms
뭘까 이 오류는 일단 하나하나 잘 따져보다가 다른 블로그들을 몇개 찾아봤는데 너무 문제없이 잘 해결들 하셔서 띠용했다.
그런데 sql 명령어를 하나하나 실행하니까 또 잘 처리되네..? 뭐지 ㅋㅋㅋ 아무튼 성공
이제 프로젝트 설정을 위해 build.gradle에 해당 코드를 추가하자.
implementation "org.mariadb.jdbc:mariadb-java-client"
이어서 applicatioin-real.properties 파일에 해당 코드를 추가하자.
spring.profiles.include-oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
이렇게 되면 profile=real인 환경이 구성된다.
실제 운영될 환경이기에, 보안/로그상 이슈가 될 설정은 모두 제거하며 RDS 환경 profile 설정이 추가된다.
EC2 설정
RDS 접속 정보 또한 보호해야할 정보이므로 깃헙에 올릴 수 없지EC2 서버에 직접 설정 파일을 만들자
vim ~/app/application-real-db.properties
properties파일
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://{RDS엔드포인트}:3306/freelec_springboot2_webservice
spring.datasource.username=youth
spring.datasource.password=비밀번호우
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
코드 설명
spring.jpa.hibernate.ddl-auto=none
- JPA로 테이블이 자동생성되는 옵션을 생성되지 않음으로 지정하는 코드
- RDS에서는 실제로 운영때 사용할 테이블이므로 스프링부트에서 만들지 않도록 주의해야한다. 이 설정을 신경쓰지 않으면 테이블이 모두 새로 생성될 수 있으니 주의하자.
또한, deploy.sh에 real profile을 쓸 수 있도록 다음과 같이 추가수정하자.
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.propertie s,classpath:/application-real.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
Dspring.profiles.active=real
- application-real.properties 파일을 활성화시킨다.
- application-real.properties의 spring.profiles.include=oauth,real-db 옵션으로 인해 real-db 또한 활성화된다.
이렇게 새로 추가한 deploy.sh를 실행할때 다음과 같은 로그가 nohup.out에 나온다면 성공이다.
이후 curl localhost:8080 을 실행시 다음과 같이 html 코드가 보인다면 성공이다.
8.5 EC2에서 소셜로그인하기
해당 서비스가 8080포트로 배포되었다. 따라서, EC2 보안그룹 -> 8080포트가 열려있는지 우선 확인한다.
나는 잘 열려있었다.
따라서 EC2 인스턴스의 퍼블릭 주소를 확인하고 8080포트로 접속한다.
위와 같이 배포되고 있는 서비스를 확인할 수 있다. 이제 여기서 구글과 네이버 로그인이 실제로 잘 되는지 확인해볼차례이다.
우리는 5장까지 만든 서비스에서 구글 / 네이버 인증 API 로그인 인증을 할때 내 컴퓨터에서 서비스를 구동하고, 서비스 url로 localhost:8080을 등록했다. 그러나, 이 곳에선 EC2에 배포된 어플리케이션을 퍼블릭DNS로 접근하는 방식을 활용했다. 따라서, 이 퍼블릭 url을 등록해줘야한다.
구글로그인 / 네이버로그인 버튼을 누르면 오류창이 뜬다.
따라서 각 로그인 콘솔 / 개발자 페이지에 들어가자.
승인된 도메인 / 서비스 url로 포트번호를 제외한 ec2 - *** - amazonaws.com을 입력한다.
- 로그인을 시도하는 서비스가 구글 / 네이버에 등록되었는지를 판단하기 위한 항목
- 네이버에서는 아직 하나밖에 지원하지 않음. (아래는 다 네이버 이야기)
- EC2 주소를 등록하면 localhost에서는 실행되지 않는다는 뜻
- 따라서, 개발단계에서는 등록하지 않고 배포단계에서만 등록하는 것이 좋다!
- localhost를 사용하고 싶으면 서비스를 하나 더 생성해야함
승인된 리디렉션 uri / callback uri에 DNS + 포트번호 /login/oauth2/code/google(or naver)를 입력한다.
- 전체 주소를 등록한다.
이렇게 로그인하면 다음과 같이 로그인이 잘 되는 것을 볼 수 있다.
해당 방식에는 몇가지 문제가 존재한다고 한다.
- 수동 실행되는 test
- 수동 build
이제 Test&Build를 자동으로 하는 방법을 진행한다고 한다~
'BE > 6기 코테이토 - Spring Study' 카테고리의 다른 글
6회. Ch10 - 24시간 365일 중단 없는 서비스를 만들자 (0) | 2023.03.02 |
---|---|
5회. Ch9 - 코드가 푸시되면 자동으로 배포해보자- Travis CI 배포 자동화 (0) | 2023.02.22 |
4.5회. Ch8. 다시도전 (그래도 실패를 곁들인) (0) | 2023.02.17 |
4회(1). Ch8 - EC2서버에 프로젝트를 배포해보자 (0) | 2023.02.15 |
4회. Ch7 - AWS에 데이터베이스 환경을 만들어보자. - AWS RDS (0) | 2023.02.14 |