본문 바로가기

DevOps

Spring 프로젝트 AWS EC2 배포하기 - H2 DB 연결

이번 포스팅에서는 H2 DB를 AWS EC2 내부에 데이터베이스로 연결시켜 사용하는 방법을 알아보겠습니다.

 

H2는 mysql와 같은 관계형 데이터베이스(RDBMS)입니다. 오픈소스로 무료로 사용할 수 있으며, 웹 콘솔 기반으로 쉽게 설정해서 사용할 수 있어 소규모의 어플리케이션에서 활용됩니다. 표준 SQL의 대부분을 지원하며(약간의 문법차이는 있습니다.) 용량이 낮아 테스트 환경, 로컬 환경에서도 많이 사용됩니다. 이제, H2를 이용해서 배포하기 위한 환경 설정을 진행해보겠습니다.

 

H2 DB 설정


H2DB는 Java 기반 RDBMS 이므로 자바가 설치되어 있어야 합니다. 먼저, http://h2database.com/html/main.html에서 다운로드 해줍니다. Ubuntu인 EC2에서 사용하므로 All Platforms 버전으로 다운로드 받습니다.

 

다운로드가 완료되었으면, EC2 서버로 넘겨줘서 DB를 가동시켜주어야합니다. 압축된 상태로 다운받았을텐데, 풀면 용량이 크니 압축파일 그대로 넘겨줍니다. 

 

scp -i {pemkeyname}.pem {filename} {hostname(ex-ubuntu)}@{IPv4 DNS NAME}:/home/ubuntu
# key로 ssh 접속하여 파일을 전송합니다.

위 명령어로 특정 파일을 EC2 서버의 루트 경로로 전송할 수 있습니다. 전송 완료된 파일의 압축을 해제해줍니다.

./bin/h2.sh

압축을 풀어 bin 폴더의 h2.sh 스크립트 파일을 실행시켜주면 H2 DB를 실행시킬 수 있습니다. 그러나, EC2 서버에서 실행시켜보면 다음과 같은 에러가 발생합니다.

Browser detection failed, and java property 'h2.browser' and environment variable BROWSER are not set to a browser executable.

위 에러의 의미는 H2는 Browser 기반 DB인데 실행할 수 있는 감지된 browser가 존재하지 않는다는 의미입니다. 브라우저를 설치하고 잘 설정해주는 방법도 있겠지만, browser 대신 TCP 프로토콜로 실행시켜보겠습니다. 다음 명령어로 백그라운드로 H2 DB를 실행시킬 수 있습니다.

nohup java -cp h2-{version}.jar org.h2.tools.Console -tcp &

nohup은 터미널과 세션이 종료되어도 프로세스가 동작하도록 만들어주는 명령어입니다. 즉 프로세스를 현재 사용자 세션이 아닌 운영체제가 제공하는 백그라운드 세션에서 실행합니다. &는 사용자 세션에서 실행되며 화면 출력을 현재 세션에서 계속 사용할 수 있도록 전환해주는 명령어입니다. 참고로 org.h2.tools.Console 대신 org.h2.tools.Shell을 사용하면 mysql처럼 CLI에서 쿼리를 DB로 전송할 수 있는 API를 사용할 수 있습니다.

 

방금까지의 설명은 H2 DB를 인스턴스로 가져와서 개별로 가동시킨 후 연결시키는 방식입니다. 위의 방식대로 해도 되지만, 세팅이 굉장히 번거롭습니다. 다행히도 SpringBoot는 아주 쉽게 H2 DB를 사용할 수 있는 환경을 제공합니다. 바로 DB 파일만(예를 들어 test.mv.db) 인스턴스로 전송하면 SpringBoot가 스프링 어플리케이션 실행 시 H2를 가동시켜 DB까지 연결해줍니다. 그리고 어플리케이션 종료 시 같이 종료도 해줍니다. 아주 놀라웠는데 이 세팅을 application.properties에서 단 한 줄로 가능합니다. 첫 줄만으로 Spring Boot 시 H2 Console이 작동되며, (Spring에서 경로 설정은 별도로 해주어야합니다.) 2~3줄의 설정으로 배포 주소의 /h2-console URL로 H2 DB에 접근이 가능해집니다.

 

spring.h2.console.enabled=true # Console 사용을 True로 해서 Boot 시 연결됩니다.
spring.h2.console.path=/h2-console # Console의 접근 url을 h2-console로 지정합니다.
spring.h2.console.settings.web-allow-others=true # 접근을 허용합니다.

 

이제 간단한 DB를 만들어서 인스턴스 내로 가져와보겠습니다. 먼저 H2 DB를 로컬에서 설치한 후, 실행시켜봅니다. 

H2를 처음 설치하면 test DB가 자동으로 생성됩니다. test.mv.db라는 파일로 저장되는데, 이 파일을 인스턴스로 옮겨서 사용하면 됩니다. Test Connection 버튼을 눌러 접속 상태를 확인하고, Connect를 눌러서 접속합니다. 저는 예시로 유저의 정보를 담고 있는 users 테이블과 글의 정보를 담고 있는 articles 테이블을 생성했습니다.

 

CREATE TABLE users (
  id VARCHAR(255),
  password VARCHAR(255),
  name VARCHAR(255),
  email VARCHAR(255),
  idx int AUTO_INCREMENT
  PRIMARY KEY(idx)
);

CREATE TABLE articles
(
writer VARCHAR(255),
title VARCHAR(255),
contents VARCHAR(500),
id int AUTO_INCREMENT,
PRIMARY KEY (id)
);

생성이 잘 되었는지 확인하기 위해 간단한 insert 쿼리와 select 쿼리로 조회해봅니다. 정상 작동되면 테이블의 정보를 가지고 있는 test.mv.db 파일을 인스턴스로 전송해봅시다. 아래 명령어로 제 test DB를 전송했습니다.

scp -i ~/Downloads/new_poro_key.pem test.mv.db ubuntu@ec2-3-135-208-179.us-east-2.compute.amazonaws.com:/home/ubuntu

스프링 어플리케이션이 실행될 때 H2 DB가 실행되더라도 H2 DB의 접근 경로와 비밀번호, driver 정보 등을 Spring이 알고 있어야합니다. 프로젝트의 application.properties 파일에 URL, 유저 이름, 패스워드(있다면) 정보를 저장해야합니다.

#application.properties
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:~/be-java-cafe/test
spring.datasource.username=sa


인스턴스 내에서 스프링 프로젝트가 로컬로 DB에 접근하여 데이터를 가져오기 때문에 localhost와 루트 기준의 DB 주소를 입력해주면됩니다. test.mv.db인 경우 test까지만 입력해주면 됩니다. username은 H2 DB는 default가 sa이며 패스워드가 없기 때문에 위처럼 설정해주면 됩니다.


스프링 어플리케이션 실행


스프링 어플리케이션을 빌드하는 방법에 크게 두 가지가 있는데, 로컬에서 빌드까지 완료한 후 JAR 파일을 인스턴스로 전송해서 실행시키는 방법과, git으로 clone해서 인스턴스 내에서 빌드한 후 실행시키는 방법이 있습니다. 후자가 변경사항이 발생할 시 반영하기 쉽지만, 프리티어에서 제공하는 인스턴스는 굉장히 느리기 때문에 빌드 속도가 굉장히 느렸습니다. mysql까지 설치한 경우는 무한로딩에 빠지기도 합니다. 그래서 저는 로컬에서 빌드한 후 전송해서 배포하는 방법으로 문제를 해결했습니다.

 

gradle을 사용하는 스프링 부트 어플리케이션의 경우 빌드 명령어로 빌드해줍니다.

./gradlew build # 프로젝트 빌드

빌드 결과물은 build/libs/에 jar파일로 생성되며, 파일을 위의 scp 명령어로 인스턴스 내로 전송합니다. 전송이 완료되면, 인스턴스 내에서 터미널로 다음 명령어로 실행해봅니다.

java -jar cafe.0.0.1.SNAPSHOT.jar

스프링 프로젝트가 정상 실행된다면, AWS 상세 정보의 IPv4 DNS:8080 혹은 IPv4 Address:8080로 접속할 수 있습니다. 주의할 점은, https가 아닌 http로 접속해야합니다. HTTPS로 접속 시 오류가 발생합니다.

정상 작동된다면 아래처럼 로컬과 동일하게 작동되어야합니다. 특별히 문제가 없다면 H2와 동일하게 nohup과 & 키워드를 사용해서 백그라운드로 배포할 수 있습니다.

DB 정보를 모니터링 하고 싶다면 url주소/h2-console에 접속해서 쿼리를 전송해서 확인할 수 있습니다.

 

이렇게 간단한 H2 DB를 이용한 웹 서비스를 AWS EC2로 배포해보았습니다.