본문 바로가기
Back-end/Spring Boot + REST API

Spring boot - blog application (REST API) : AWS RDS, Elastic Beanstalk

by javapp 자바앱 2022. 9. 8.
728x90

AWS

EC2 프로세서, 스토리지, 네트워킹, OS 및 구매 모델의 다양한 옵션을 제공하며, 클라우드에서 안전하고 크기 조정 가능한 컴퓨팅을 제공합니다.
Elastic Beanstalk  AWS Elastic Beanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go 및 Docker를 사용하여 개발된 웹 애플리케이션 및 서비스를 Apache, Nginx, Passenger 및 IIS와 같은 친숙한 서버에서 손쉽게 배포하고 확장할 수 있는 서비스
RDS  Amazon Aurora, PostgreSQL, SQL Server 및 MySQL 중에서 선택한 관계형 데이터베이스
S3 확장성, 데이터 가용성, 보안 및 성능을 갖춘 클라우드 객체 스토리지
Route 53 높은 가용성과 확장성이 뛰어난 클라우드 Domain Name System (DNS) 웹 서비스

 

메타 데이터 넣기

기본적으로 해당 프로젝트에서는 권한 설정을 위해 roles 테이블의 권한을 메타 데이터로 유지합니다.

Roles Table

첫번째 방법으로 sql 파일로 관리를 하는 방법

(두번째 방법으로 할 것이기 때문에 일단 삭제)

 

두번째 방법으로 SpringBootApplication 에서 run 메소드 작성

@SpringBootApplication
public class SpringbootBlogRestApiApplication implements CommandLineRunner{
	
	@Bean
	public ModelMapper modelMapper() {
		return new ModelMapper();
	}

	public static void main(String[] args) {
		SpringApplication.run(SpringbootBlogRestApiApplication.class, args);
	}

	
	/* 메타 데이터 테이블 작성 */
	
	@Autowired
	private RoleRepository roleRepository;
	
	@Override
	public void run(String... args) throws Exception {
		Role adminRole =new Role();
		adminRole.setName("ROLE_ADMIN");
		roleRepository.save(adminRole);
		
		Role userRole =new Role();
		userRole.setName("ROLE_USER");
		roleRepository.save(userRole);
	}
}

최초 실행시 run() 메소드가 실행되어 메타 데이터를 테이블에 insert 하도록 합니다.

 

 

프로파일 분리 (application.properties)

AWS에 배포하기전에 properties 파일을 환경에 따라 분리

개발환경: dev

운영환경: prod

테스트환경: qa

 

application.properties

#spring.datasource.dbcp2.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/myblog?userSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
#spring.datasource.username = root
#spring.datasource.password = 3578

# hibernate properties
#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

#spring.jpa.show-sql=true
#spring.jpa.hibernate.ddl-auto= update

logging.level.org.springframework.security=DEBUG

#spring.security.user.name=kjh
#spring.security.user.password=password
#spring.security.user.roles=ADMIN

###
app.jwt-secret= JWTSecretkey
# 7일
app.jwt-expiration-milliseconds= 604800000 

spring.mvc.pathmatch.matching-strategy=ant-path-matcher

spring.profiles.active=dev

spring.profiles.active=dev

활성화할 파일을 지정합니다.

 

c.s.b.SpringbootBlogRestApiApplication   : The following 1 profile is active: "dev"

실행시 활성화한 properties 파일을 알려줍니다.

 

 

application-dev.properties, application-prod.properties, application-qa.properties

spring.datasource.dbcp2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myblog?userSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password = 3578

# hibernate properties
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto= update

환경에 따라 바뀔 수 있는 부분을 파일에 작성합니다.

 

 


 

 

AWS RDS

 

 

MySQL 데이터 베이스 표준 생성

 

 

프리 티어 선택

 

 

설정 - DB 인스턴스 식별자

자격 증명 설정

 

연결 - 퍼블릭 엑세스

 

 

추가 구성 - 데이터베이스 이름

 

데이터베이스 생성

 

데이터베이스 생성 완료

 

 

보안 그룹 설정

 

인바운드 규칙 편집

 

규칙 저장

 

인바운드 규칙 설정 완료

 

 


 

 

MySQL 인스턴스 연결

 

hostname 에 엔드포인트 연결

 

연결 테스트

 

 

 


 

 

AWS Elastic Beanstalk

Package Spring Boot Blog App as JAR File

JAR 파일을 AWS Cloud 에 배포하기 위해 패키징 작업

url 에 aws 엔드포인트 적용, password 수정

nginx가 서버 내부의 5000번 포트와 연결되기 때문에

5000번 포트로 실행해야 배포할 애플리케이션이 정상적으로 동작됩니다.

 

 

application.properties

prod로 설정파일 지정

 

 

Maven clean -> Maven install

Maven clean

Maven clean
Maven clean

 

Maven install

Maven install
Maven install
target 파일 생성

 

 


※ Maven clean, install 을 하는 이유를 알아봤습니다.

 

메이븐이란

자바 프로젝트의 빌드를 자동화 해주는 툴

 

- 빌드

자바프로젝트 - src - lib/*.jar

complie - package - deploy

 

 

Maven 라이프사이클

메이븐이 작동하는 원리

출처 : https://www.slideshare.net/ssuser5445b7/ss-56566336?qid=927855f5-7c8a-4f88-a834-d31292324fd2&v=&b=&from_search=4

 

"Maven install" 명령 내리면 complie ~ install 단계까지 모두 실행

phase 에는 plugin이 존재 하고 해당 plugin에서 수행 가능한 명령을 goal 이라고 합니다.

 

 

Compile

maven compile

소스코드를 컴파일해주는 단계입니다.

성공적으로 컴파일이 된다면 target/classes폴더가 만들어지고 컴파일된 class파일이 생성됩니다.

Test

maven test

테스트 코드를 실행해주는 단계입니다. 실패하면 빌드가 멈춥니다.

이 단계에서 target/test-classes폴더와 안에 컴파일된 class파일이 생성되고 target/surefire-reports 폴더에 테스트 결과가 기록됩니다.

Package

maven package

해당 프로젝트를 지정한 확장자로 묶어주는 단계입니다.

확장자 타입은 pom.xml에 packaging 태그로 묶이게 되고

"artifactId-version.packaging" 형태의 파일을 target폴더안에 생성해줍니다.

install

maven install

로컬 리포지토리 즉 Maven이 설치되어 있는 PC에 배포하게 됩니다.

deploy

maven deploy

원격 리포지토리가 등록되어 있다면 해당 원격 리포지토리에 배포하게 됩니다.

 

Clean 라이프사이클

maven clean

생성된 target 폴더를 삭제해버립니다.

 

Site 라이프사이클

문서 사이트를 생성할 수 있도록 지원합니다.

 

 

 


 

 

Elastic Beanstalk 서비스에 배포하기

AWS - Elastic Beanstalk

 

애플리케이션 이름 작성

 

로컬파일에 maven install 으로 생성된 jar 파일 선택

 

파일 업로드 완료

플랫폼 java 설정

자바 11

 

파일 업로드 완료

 

애플리케이션 생성

추가 옵션 구성

 

데이터 베이스 편집

 

AWS RDS username, password

 

편집 완료.

 

롤링과 배포

 

2. Github Action & AWS Beanstalk 배포하기 - profile=local로 배포하기

지난 시간에 만들어둔 Github Action을 통해 profile=local로 Beanstalk에 배포를 진행해보겠습니다. profile=local, 즉, 운영 DB와 구글&네이버 OAuth 를 사용하지 않는 간단한 테스트 용도로만 배포할 예정입니.

jojoldu.tistory.com

 

배포 방식을 다르게 둘 수가 있는데

https://youtu.be/AfRnvsRxZ_0?t=2816 캡처

"추가 배치를 사용한 롤링" 을 사용해 다운타임 시간없이 추가 배치를 두어 버전 업(재배포)를 할 수 있습니다.

 

 

앱 생성

 

생성중

 

 

..swagger-ui/#/

스웨거 ui 접속 테스트 성공!

 

 

재배포

Maven clean

Maven install 

 


 

 

댓글