본문 바로가기
강의 실습/비전공자도 이해할 수 있는 AWS 입문 실전

[실습] 5-2. Spring Boot 서버에 RDS 연결하기

by jint 2026. 1. 7.

Express 서버에 RDS를 연결했던 기존 EC2 인스턴스와 보안 그룹을 삭제한 후 진행한다.


1. EC2 인스턴스 생성
EC2 인스턴스 서비스에 접속하여 리전(Region)을 아시아 태평양 (서울)로 선택
"인스턴스 시작" 버튼 클릭

- 이름 : test-server

- 애플리케이션 및 OS 이미지(Amazon Machine Image) : Ubuntu Server 24.04 LTS (HVM), SSD Volume Type

- 인스턴스 유형 : t3.micro

- 키 페어
키 페어 없이 계속 진행(권장되지 않음)

- 네트워크 설정 - 방화벽(보안 그룹)
보안 그룹 이름 : test-server-security-group
설명 : test-server-security-group created 2026-01-07T12:36:19.065Z
인바운드 보안 그룹 규칙)
보안 그룹 규칙 1 (TCP, 22, 0.0.0.0/0)
유형 : ssh
프로토콜 : TCP
포트 범위 : 22
소스 유형 : 위치 무관

보안 그룹 규칙 2 (TCP, 80, 0.0.0.0/0)
유형 : HTTP
프로토콜 : TCP
포트 범위 : 80
소스 유형 : 위치 무관

- 스토리지 구성
크기(GiB) : 30
볼륨 유형 : gp3

gradle 빌드시 멈추는 것을 방지하기 위해 인스턴스 유형을 t3.micro, 스토리지 크기를 30GiB 볼륨 유형을 gp3로 설정한다.

"인스턴스 시작" 버튼 클릭


2. EC2 인스턴스 연결 후 Spring Boot 서버를 위한 jdk 설치
Spring Boot 서버 실행을 위해 jdk를 설치한다.

- Ubuntu

ubuntu@ip-172-31-38-141:~$ sudo apt update && /
sudo apt install openjdk-17-jdk -y
Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
...
No VM guests are running outdated hypervisor (qemu) binaries on this host.
ubuntu@ip-172-31-38-141:~$ java -version
openjdk version "17.0.17" 2025-10-21
OpenJDK Runtime Environment (build 17.0.17+10-Ubuntu-124.04)
OpenJDK 64-Bit Server VM (build 17.0.17+10-Ubuntu-124.04, mixed mode, sharing)



3. EC2 인스턴스에서 Spring Boot 서버 clone
링크 : https://github.com/JSCODE-BOOK/aws-rds-springboot

 

GitHub - JSCODE-BOOK/aws-rds-springboot

Contribute to JSCODE-BOOK/aws-rds-springboot development by creating an account on GitHub.

github.com


- Ubuntu

ubuntu@ip-172-31-38-141:~$ sudo su
root@ip-172-31-38-141:/home/ubuntu# git clone https://github.com/JSCODE-BOOK/aws-rds-springboot.git
Cloning into 'aws-rds-springboot'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 29 (delta 0), reused 29 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (29/29), 46.24 KiB | 11.56 MiB/s, done.



4. application.yml 파일 수정
직접 생성한 RDS에 연결하기 위한 정보를 application.yml 에 입력한다.

- Ubuntu

root@ip-172-31-38-141:/home/ubuntu# cd aws-rds-springboot/src/main/resources
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/src/main/resources# ls
application.yml
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/src/main/resources# vi application.yml


- Ubuntu Vim

server:
  port: 80
spring:
  datasource:
    url: jdbc:mysql://test-db.cbmowk46y5r2.ap-northeast-2.rds.amazonaws.com:3306/test
    username: admin
    password: testdb123
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
:wq


clone 받고 application.yml 파일이 있는데 원래는 이렇게 구성하면 안된다. 편의상 사용하기 좋게 올려놓은 것이다.
만약 자신의 Spring Boot 프로젝트를 퍼블릭 깃허브 리포지토리에 업로드한다면 .gitignore를 활용해 application.yml 파일을 제외한다.


5. Spring Boot 서버가 RDS와 잘 연결되는 지 확인
기존 빌드된 파일을 삭제하고 새롭게 .jar로 빌드하기 위해 clean build 명령어를 사용한다.

- Ubuntu

root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/src/main/resources# sudo lsof -i:80
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/src/main/resources# cd ../../../
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot# ./gradlew clean build
Downloading https://services.gradle.org/distributions/gradle-8.10-bin.zip
.............10%.............20%.............30%.............40%.............50%.............60%.............70%.............80%.............90%.............100%

Welcome to Gradle 8.10!

Here are the highlights of this release:
 - Support for Java 23
 - Faster configuration cache
 - Better configuration cache reports

For more details see https://docs.gradle.org/8.10/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)
<==========---> 78% EXECUTING [4m 3s]
> :test > 0 tests completed
> :test > Executing test com...RdsSpringBootSampleApplicationTests


비교적 좋은 성능으로 EC2 인스턴스 유형을 t3.micro로 설정하였지만 메모리가 적어서 멈춰버렸다. EC2 인스턴스를 재부팅 후 다시 실행하여 스왑파일을 생성 후 다시 빌드를 진행한다.


링크 : https://velog.io/@shawnhansh/AWS-EC2-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%8A%A4%EC%99%91

 

AWS EC2 램 늘리기(feat. 스왑)

이제 gradle이 멈추지 않습니다✨

velog.io


- Ubuntu

top - 13:05:45 up 2 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 111 total,   1 running, 110 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
MiB Mem :    914.2 total,    479.1 free,    344.5 used,    247.3 buff/cache     
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    569.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                                    
      1 root      20   0   22132  13248   9536 S   0.0   1.4   0:01.11 systemd                                                                                                                                    
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd                                                                                                                                   
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_workqueue_release                                                                                                                     
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-rcu_gp                                                                                                                           
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-sync_wq                                                                                                                          
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-kvfree_rcu_reclaim                                                                                                               
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-slub_flushwq                                                                                                                     
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-netns                                                                                                                            
      9 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0-events                                                                                                                         
     10 root      20   0       0      0      0 I   0.0   0.0   0:00.02 kworker/0:1-events                                                                                                                         
     11 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri                                                                                                                
     12 root      20   0       0      0      0 I   0.0   0.0   0:00.08 kworker/u8:0-events_power_efficient                                                                                                        
     13 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-mm_percpu_wq                                                                                                                     
     14 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_rude_kthread                                                                                                                     
     15 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_trace_kthread                                                                                                                    
     16 root      20   0       0      0      0 S   0.0   0.0   0:00.01 ksoftirqd/0                                                                                                                                
     17 root      20   0       0      0      0 I   0.0   0.0   0:00.05 rcu_sched                                                                                                                                  
     18 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_par_gp_kthread_worker/0                                                                                                            
     19 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_exp_gp_kthread_worker                                                                                                                  
     20 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0                                                                                                                                
     21 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0                                                                                                                              
     22 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0                                                                                                                                    
     23 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                                                                                                                                    
     24 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1                                                                                                                              
     25 root      rt   0       0      0      0 S   0.0   0.0   0:00.06 migration/1                                                                                                                                
     26 root      20   0       0      0      0 S   0.0   0.0   0:00.01 ksoftirqd/1                                                                                                                                
     27 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0-cgroup_destroy                                                                                                                 
     28 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri                                                                                                                
     29 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs                                                                                                                                  
     30 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-inet_frag_wq                                                                                                                     
     31 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kauditd                                                                                                                                    
     32 root      20   0       0      0      0 S   0.0   0.0   0:00.00 khungtaskd                                                                                                                                 
     33 root      20   0       0      0      0 I   0.0   0.0   0:00.04 kworker/u8:1-events_power_efficient                                                                                                        
ubuntu@ip-172-31-38-141:~$ free
               total        used        free      shared  buff/cache   available
Mem:          936152      352724      490548        2760      253200      583428
Swap:              0           0           0
ubuntu@ip-172-31-38-141:~$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 30.9741 s, 139 MB/s
ubuntu@ip-172-31-38-141:~$ sudo chmod 600 /swapfile
ubuntu@ip-172-31-38-141:~$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=52550030-f1f9-4dd1-a829-ce8b78664235
ubuntu@ip-172-31-38-141:~$ sudo swapon /swapfile
ubuntu@ip-172-31-38-141:~$ sudo swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   4G   0B   -2
ubuntu@ip-172-31-38-141:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:           914Mi       347Mi        74Mi       2.7Mi       658Mi       566Mi
Swap:          4.0Gi          0B       4.0Gi
ubuntu@ip-172-31-38-141:~$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0
ubuntu@ip-172-31-38-141:~$ sudo vi /etc/fstab


- Ubuntu Vim

LABEL=cloudimg-rootfs   /        ext4   discard,commit=30,errors=remount-ro     0 1
LABEL=BOOT      /boot   ext4    defaults        0 2
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
/swapfile none swap sw 0 0
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
"/etc/fstab" 4L, 173B                                                                                                                                                                           1,1           All


메모리가 약 1GB 정도 된다. 다음 과정을 통해 스왑파일을 생성하여 메모리를 늘렸다.


#1 스왑 파일 생성 : 4GB 크기의 스왑파일 생성한다. (sudo dd if=/dev/zero of=/swapfile bs=1M count=4096)
#2 파일 권한 설정 : 소유자(root)만 읽고 쓸 수 있도록 권한을 설정한다. (sudo chmod 600 /swapfile)
#3 스왑 영역 설정 : 생성된 파일을 스왑 영역으로 포맷한다. (sudo mkswap /swapfile)
#4 스왑 활성화 : 시스템에 스왑 파일을 즉시 활성화한다. (sudo swapon /swapfile)
#5 스왑 활성화 확인 : 스왑이 정상적으로 활성화되었는지 확인한다. (sudo swapon --show 또는 free -h)
#6 영구 활성화 설정 : 시스템 재부팅 시에도 스왑 파일이 자동으로 활성화되도록 /etc/fstab 파일에 "/swapfile none swap sw 0 0" 내용을 추가 (echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab)

이렇게 4GB 스왑 파일이 성공적으로 생성 및 활성화 되었다.

다시 빌드를 진행한다.

- Ubuntu

ubuntu@ip-172-31-38-141:~$ ls
aws-rds-springboot
ubuntu@ip-172-31-38-141:~$ cd aws-rds-springboot
ubuntu@ip-172-31-38-141:~/aws-rds-springboot$ sudo su
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot# ./gradlew clean build
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

> Task :test

RdsSpringBootSampleApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
        Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1806
            Caused by: org.hibernate.service.spi.ServiceException at AbstractServiceRegistryImpl.java:276
                Caused by: org.hibernate.HibernateException at DialectFactoryImpl.java:191

1 test completed, 1 failed

> Task :test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///home/ubuntu/aws-rds-springboot/build/reports/tests/test/index.html

* Try:
> Run with --scan to get full insights.

BUILD FAILED in 35s
8 actionable tasks: 8 executed
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot# ./gradlew clean build -x test

BUILD SUCCESSFUL in 4s
6 actionable tasks: 6 executed
<-------------> 0% WAITING
> IDLE


빌드가 성공되었다면, Spring Boot 서버가 정상으로 실행되는지 확인한다.

- Ubuntu

root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot# ls
build  build.gradle  gradle  gradlew  gradlew.bat  settings.gradle  src
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot# cd build/libs
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/build/libs# ls
aws-rds-springboot-0.0.1-SNAPSHOT-plain.jar  aws-rds-springboot-0.0.1-SNAPSHOT.jar
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/build/libs# sudo nohup java -jar aws-rds-springboot-0.0.1-SNAPSHOT.jar &
[1] 1857
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/build/libs# nohup: ignoring input and appending output to 'nohup.out'

root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/build/libs# sudo lsof -i:80
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    1859 root   19u  IPv6  11196      0t0  TCP *:http (LISTEN)
root@ip-172-31-38-141:/home/ubuntu/aws-rds-springboot/build/libs# ps aux | grep java
ubuntu      1378  0.8  6.4 2357980 60568 ?       Ssl  13:25   0:06 /usr/lib/jvm/java-17-openjdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/ubuntu/.gradle/wrapper/dists/gradle-8.10-bin/deqhafrv1ntovfmgh0nh3npr9/gradle-8.10/lib/gradle-daemon-main-8.10.jar -javaagent:/home/ubuntu/.gradle/wrapper/dists/gradle-8.10-bin/deqhafrv1ntovfmgh0nh3npr9/gradle-8.10/lib/agents/gradle-instrumentation-agent-8.10.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.10
root        1533  6.6 36.5 2466112 342140 ?      Ssl  13:27   0:41 /usr/lib/jvm/java-17-openjdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /root/.gradle/wrapper/dists/gradle-8.10-bin/deqhafrv1ntovfmgh0nh3npr9/gradle-8.10/lib/gradle-daemon-main-8.10.jar -javaagent:/root/.gradle/wrapper/dists/gradle-8.10-bin/deqhafrv1ntovfmgh0nh3npr9/gradle-8.10/lib/agents/gradle-instrumentation-agent-8.10.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.10
root        1857  0.0  0.7  17552  7000 pts/2    S    13:37   0:00 sudo nohup java -jar aws-rds-springboot-0.0.1-SNAPSHOT.jar
root        1858  0.0  0.2  17552  2408 pts/3    Ss+  13:37   0:00 sudo nohup java -jar aws-rds-springboot-0.0.1-SNAPSHOT.jar
root        1859 42.6 22.2 2789004 208444 pts/3  Sl   13:37   0:16 java -jar aws-rds-springboot-0.0.1-SNAPSHOT.jar
root        1898  0.0  0.2   7076  2140 pts/2    S+   13:38   0:00 grep --color=auto java



6. 백엔드 서버로 요청 보내기
웹 브라우저에서 PublicIPs로 요청을 보내 백엔드 서버가 정상으로 응답하는지 확인한다.
이번에 내려받은 프로젝트에는 데이터베이스에 게시글 데이터를 저장한 뒤 데이터를 불러오는 로직의 GET /board API가 포함되어 있다.
따라서 PublicIPs 에 /board를 붙여서 요청한다.

 

Spring Boot 서버가 RDS 인스턴스와 정상 연결 확인


위와 같은 형태로 응답이 반환된다면 Spring Boot 서버가 RDS 인스턴스와 정상적으로 연결된 것이다.


7. MySQL에서 데이터 확인
- SQL

-- test 스키마(데이터베이스) 모든 테이블 조회
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test';

-- 확인한 테이블에서 데이터 조회
SELECT * FROM test.boards;

 

test 스키마의 boards 테이블 데이터 조회


GET /board API로 저장된 데이터를 확인할 수 있다.


참고링크 : https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9D%B4%ED%95%B4%ED%95%A0%EC%88%98%EC%9E%88%EB%8A%94-aws-%EC%9E%85%EB%AC%B8%EC%8B%A4%EC%A0%84

 

비전공자도 이해할 수 있는 AWS 입문/실전| JSCODE 박재성 - 인프런 강의

현재 평점 4.9점 수강생 2,888명인 강의를 만나보세요. 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 AWS 입문 강의를 만들어봤습니다! EC2를 활용한 백엔드 API 서버 배포, R

www.inflearn.com

댓글