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 인스턴스와 정상적으로 연결된 것이다.
7. MySQL에서 데이터 확인
- SQL
-- test 스키마(데이터베이스) 모든 테이블 조회
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test';
-- 확인한 테이블에서 데이터 조회
SELECT * FROM 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
'강의 실습 > 비전공자도 이해할 수 있는 AWS 입문 실전' 카테고리의 다른 글
| S3란? / S3를 왜 사용하는걸까? / 현업에서 S3를 많이 사용할까? (0) | 2026.01.08 |
|---|---|
| 비용 나가지 않게 RDS 깔끔하게 종료하기 (0) | 2026.01.07 |
| [실습] 5. Express 서버에 RDS 연결하기 (0) | 2026.01.06 |
| [실습] 4. RDS에 접속하기 (0) | 2026.01.05 |
| [실습] 3. 파라미터 그룹 추가하기 (0) | 2026.01.04 |
댓글