8.3 외부 Security 파일 등록하기
이유는 다음과 같다.
ClientRegistrationRepository를 생성하려면 clientId와 clientSecret가 필수이다. 로컬 PC에서 실행할 때는 application-oauth.properties가 있어 문제가 없었다.
하지만 이 파일은 .gitignore로 git에서 제외 대상이라 깃허브에는 올라지 있지 않다. 애플리케이션을 실행하기 위해 공개된 저장소에 ClientId와 ClientSecret을 올릴 수 없으니 서버에서 직접 이 설정들을 가지고 있게 해 준다.
먼저 step1이 아닌 app디렉터리에 properties파일을 생성한다.
vim /home/ec2-user/app/application-oauth.properties
그리고 로컬에 있는 application-oauth.properties파일 내용을 그래도 붙여 넣기를 한다. 해당 파일을 저장하고 종료한다(:wq). 그리고 방금 생성한 application-oauth.properties을 쓰도록 deploy.sh 파일을 수정한다.
...
nohup java -jar \ -Dspring.config.location=class.path:/application.properties,/home/ec2-user/app/application-oauth.properties \ $REPOSITORY/$JAR_NAME 2>&1 &
...
① -Dspring.config.location
- 스프링 설정 파일 위치를 지정한다.
- 기본 옵션들을 담고 있는 application.properties과 OAuth 설정들을 담고 있는 application-oauth.properties의 위치를 지정한다.
- classpath가 붙으면 jar안에 있는 resources 디렉터리를 기준으로 경로가 생성된다.
- application-oauth.properties은 절대 경로를 사용한다. 외부에 파일이 있기 때문이다.
수정이 다 되었다면 다시 deploy.sh를 실행한다.
-> 그럼 정상적으로 실행된 것을 확인할 수 있음
8.4 스프링 부트 프로젝트로 RDS 접근하기
RDS는 MariaDB를 사용 중이다. 이 MariaDB에서 스프링 부트로 프로젝트를 실행하기 위해선 몇 가지 작업은 다음과 같다.
- 테이블 생성 : H2에서 자동 생성해주던 테이블들을 MariaDB에선 직접 쿼리를 이용해 생성한다.
- 프로젝트 생성 : 자바 프로젝트가 MariaDB에 접근하려면 데이터베이스 드라이버를 프로젝트에 추가한다.
- EC2(리눅스 서버) 설정 : 데이터베이스의 접속 정보는 중요하게 보호해야 할 정보이다. 공개되면 외부에서 데이터를 모두 가져갈 수 있기 때문이다. 프로젝트 안에 접속 정보를 갖고 있다면 깃허브와 같이 오픈된 공간에선 누구나 해킹할 위험이 있다. EC2 서버 내부에서 접속 정보를 관리하도록 설정한다.
RDS 테이블 생성
먼저 RDS에 테이블을 생성하겠다. 여기선 JPA가 사용될 엔티티 테이블과 스프링 세션이 사용될 테이블 2가지 종류를 생성한다. JPA가 사용할 테이블은 테스트 코드 수행 시 로그로 생성되는 쿼리를 사용하면 된다. 테스트 코드를 수행하면 다음과 같이 로그가 발생하니 create table부터 복사하여 RDS에 반영한다.
스프링 세션 테이블은 schema-mysql.sql파일에서 확인할 수 있다. File 검색(윈도우 ctrl + shift + N )으로 찾는다.
해당 파일에는 다음과 같은 세션 테이블이 있다.
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에 반영한다. RDS에 필요한 테이블은 모두 생성했으니 프로젝트 설정으로 넘어간다.
프로젝트 설정
먼저 MariaDB 드라이버를 build.gradle에 등록한다.
compile("org.mariadb.jdbc:mariadb-java-client")
그리고 서버에서 구동될 환경을 하나 구성한다.
src/main/resources/에 application-real.properties 파일을 추가한다. 앞에서 이야기한 대로 application-real.properties로 파일을 만들면 profile=real인 환경이 구성된다고 보면 된다. 실제 운영될 환경이기 때문에 보안/로그상 이슈가 될 만한 설정들을 모두 제거하며 RDS환경 profile 설정이 추가된다.
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
모든 설정이 다 되었다면 깃허브로 푸시한다.
EC2설정
OAuth와 마찬가지로 RDS 접속 정보도 보호해야 할 정보이니 EC2 서버에 직접 설정 파일은 둔다. app 디렉터리에 application-real-db.properties 파일을 생성한다.
vim ~/app/application-real/db/properties
그리고 다음과 같은 내용을 추가한다.
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds주소:포트명(기본은 3306)/database이름
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
① spring.jpa.hibernate.ddl-auto=none
- JPA로 테이블이 자동 생성되는 옵션을 None(생성하지 않음)으로 지정한다.
- 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.properties,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 파일을 열어 다음과 같이 로그가 보이면 성공적으로 수행된 것이다.
Tomcat started on port(s) : 8080 (http) with context path ..
Started Application in ~~seconds (JVM running for ~~~)
curl 명령어로 html 코드가 정상적으로 보인다면 성공이다.
curl localhost:8080
마지막으로 실제 브라우저에서 로그인을 시도해 보겠다.
출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]
'Back-End > Springboot와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
Chapter 09. 코드가 푸시되면 자동으로 배포해 보자 - Travis CI 배포 자동화 (2) (0) | 2022.04.30 |
---|---|
Chapter 09. 코드가 푸시되면 자동으로 배포해 보자 - Travis CI 배포 자동화 (1) (0) | 2022.04.29 |
Chapter 08. EC2 서버에 프로젝트를 배포해 보자 (2) (0) | 2022.04.07 |
Chapter 08. EC2 서버에 프로젝트를 배포해 보자 (1) (0) | 2022.04.03 |
Chapter 07. AWS에 데이터베이스 환경을 만들어보자 - AWS RDS (3) (0) | 2022.04.03 |