Polymor!

[AWS] RDB 와 스프링 연동하기 본문

Web

[AWS] RDB 와 스프링 연동하기

Megan Kim 2021. 2. 10. 17:10

AWS 제품 중 RDB 인스턴스를 스프링과 연동하는 법에 대해 살펴봅시다.

* Amazon EC2 : Amazon Elastic Computing Cloud - A사 클라우드 컴퓨팅 제품들 중 가장 핫한 제품이라고 볼 수 있다.

 

 

우선, AWS에서 프리티어로 RDB 인스턴스를 생성합니다. 프리티어는 12개월간 무료로 한정된 리소스를 사용하는 타입입니다. 제공 범위 초과하여 사용할 시 요금이 부과되는데, 예를들어 SSD 20GB가 최대인데, 21GB 사용시 요금 부과된다. 금수저가 아니라면 주의하자. 

 

 

인스턴스 생성은 몇가지 옵션만 설정하면 곧 바로 10분내로 생성이된다. 이때 신경써야할 옵션은 다음과 같다.

 

 

1. 본인이 필요로하는 데이터베이스의 엔진 선택. 

나는 MariaDB(MySQL과흡사) 를 사용할 예정이므로 다음과 같이 택했다.

 

 

2. 'Public Access Allow' 옵션 사용하기

인스턴스 생성 시 'Public Access Allow'를 해주어야만 범용적으로 사용이 가능하다. 

 

 

 

3. VPC 에서 인바운드 규칙 추가하기

보안을 위해 허용 ip와 포트번호 범위를 추가한다. VPC 보안 그룹에서 인바운드 규칙을 설정하여 allow/deny 할 IP 등을 설정해줄 수 있다. 참고로 VPC는 Virtural Private Cloud의 약자로, EC2의 네트워킹 계층으로서 사용자가 정의하는 가상 네트워크라고 볼 수 있다.

 

인바운드 규칙을 설정하지않으면 스프링 부트 실행시 TCP CONNECTION TIMEOUT 에러가 발생한다.

 

 

 

 

 

*인스턴스 생성이 완료 되었으면, 이제 스프링 Web Application에서 기존에 사용하던 Local DB가 아닌, AWS RDB를 연결해보자. [Gradle 기준]

 

1. Dependencies 추가

// build.gradle

runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

 

2. applications.properties (혹은 application.yml) 

server.port=스프링 서버의 포트 

/* 필수 */
spring.datasource.url=jdbc:mariadb://인스턴스 엔드포인트/생성데이터베이스명
spring.datasource.username= 인스턴스 유저명
spring.datasource.password= 인스턴스 패스워드

driver-class-name= org.mariadb.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect

/* 선택 */
spring.jpa.show-sql=true
spring.jackson.property-naming-strategy=SNAKE_CASE
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
createDatabaseIfNotExist=true

* 생성 데이터베이스 명은 아래에서와 같이 미리 만들어야 사용할 수 있다. 'DB 식별자'와는 다른 것이니 에러에 주의하자.

 

* DDL-AUTO = CREATE를 두고 스키마에 테이블을 생성해도 되지만, 나는 별도로 Command Line으로 셋팅하였다.

  또한 Docker 가상 환경 MySQL 에서 작성한 것을 참고하길 바란다.

 

docker exec -i -t mariadb bash 
root@e7e28e122e3d:/# mysql -h <인스턴스엔드포인트> -P <포트번호> -u <유저네임> -p
Enter Password : <유저패스워드>
mysql > CREATE SCHEMA `shop`

		CREATE TABLE `shop`.`product`
(
    `product_id`     BIGINT      NOT NULL AUTO_INCREMENT,
    `seller_id`      BIGINT      NOT NULL,
    `title`          VARCHAR(50) NOT NULL,
    `meta_title`     VARCHAR(50),
    `slug`           VARCHAR(50) ,
    `sku`            VARCHAR(50),
    `price`          INT         NOT NULL DEFAULT 0,
    `discount_rate`  INT        DEFAULT 0,
    `quantity`       INT         NOT NULL DEFAULT 0,
    `thumbnail_path` VARCHAR(200)         DEFAULT NULL,
    `image_path`     VARCHAR(200)         DEFAULT NULL,
    `content`        TEXT                 DEFAULT NULL,
    `created_at`     DATETIME    NOT NULL,
    `updated_at`     DATETIME             DEFAULT NULL,
    `published_at`   DATETIME             DEFAULT NULL,
    `starts_at`      DATETIME             DEFAULT NULL,
    `ends_at`        DATETIME             DEFAULT NULL,
    PRIMARY KEY (`product_id`),
    UNIQUE INDEX `uq_slug` (`slug` ASC),

    CONSTRAINT `fk_product_account`
        FOREIGN KEY (`seller_id`) REFERENCES `shop`.`account` (`account_id`)

);

 

위와 같은 방법으로 스키마와 테이블을 잘 생성하였으면 이제 스프링을 돌려보자.

그럼 다음과 같이 API를 통해 실행하였을 때 Query문이 잘 실행되는 것을 볼 수 있다.

 

 

API request 실행 to Spring

 

 

insert query 실행 to RDB

 

 

이렇게 하면 스프링과 EC2 DB 연동을 마무리 되었다.

Spring Web 어플리케이션을 EC2 클라우드 서버를 통해 배포하는 것과 스트리밍 서버를 연동 시키는 과정을 해볼 예정이다.

Comments