AWS를 활용한 EC2 - Spring 배포 해보기

정지인·2025년 5월 12일

Spring Boot 프로젝트를 AWS EC2에 Docker로 배포하면서 겪은 실제 에러들과 해결 과정을 중심으로 정리 해봤습니다.


목표

  • Spring Boot 프로젝트 .jar 빌드
  • MariaDB와 연결된 상태로 Docker Compose 구성
  • EC2에서 외부 접속 가능한 서버 구축 (http://퍼블릭IP:8080)

1. EC2 인스턴스 생성 및 접속

1-1 EC2 생성 시 설정

  • AMI: Ubuntu 22.04 LTS
  • 인스턴스 타입: t2.micro (무료 티어)
  • 보안 그룹 설정
    • TCP 22 (SSH): 내 IP
    • TCP 8080 (Spring): 0.0.0.0/0
    • TCP 3306 (DB): 본인 필요에 따라

1-2 SSH 접속

ssh -i ~/path/to/key.pem ubuntu@퍼블릭IP

2. EC2에 Docker & Compose 설치

# Docker 설치
sudo apt update
sudo apt install -y docker.io

# Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

3. Spring Boot 프로젝트 .jar 파일 생성

# 컴퓨터 로컬에서 실행

./gradlew clean build -x test

빌드 결과물 확인:
build/libs/your-app-name-0.0.1-SNAPSHOT.jar


4. EC2에 .jar 전송

scp -i ~/path/to/key.pem build/libs/*.jar ubuntu@퍼블릭IP:~/

5. Dockerfile & docker-compose.yml 작성

📄 Dockerfile

FROM openjdk:21
COPY board-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

📄 docker-compose.yml

version: "3"
services:
  spring:
    container_name: spring
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - mariadb
    networks:
      - app-network
    restart: always

  mariadb:
    container_name: mariadb
    image: mariadb:10.5
    ports:
      - "3306:3306"
    environment:
      MARIADB_ROOT_PASSWORD: user
      MARIADB_DATABASE: board
      MARIADB_USER: user
      MARIADB_PASSWORD: user
    networks:
      - app-network
    restart: always

networks:
  app-network:
    driver: bridge

6. application.yml 설정

spring:
  datasource:
    url: jdbc:mariadb://mariadb:3306/board
    username: user
    password: user
    driver-class-name: org.mariadb.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true

server:
  port: 8080

🚀 7️⃣ 실행

# 빌드 및 실행
docker-compose up --build -d

# 로그 확인
docker logs spring

# 컨테이너 확인
docker ps

오류

1. sudo 명령어 오류

  • 윈도우는 sudo 명령어를 사용을 못한다.
    ssh -i ~/path/to/key.pem ubuntu@퍼블릭IP
    를 통해서 우분투 서버로 들어가서 해결해줬습니다.

2. 인스턴스 상태 검사 실패

  • 서버 재연결을 통해서 해결해주었습니다.

3. Spring 서버 연결 오류


저는 localhost로 돌렸을 땐 스프링이 연결이 되고 , 원격 서버로 돌렸을 때는 계속 spring 연결이 실패되는 오류를 겪었습니다.

이 와 같이 java가 아닌 jshell을 인식을 하거나

Dockerfile의 경로를 잘못 설정하여 gradlew이 실패되는 오류도 겪었습니다.

그 외의 오류들

에러 메시지원인해결 방법
Access denied for user 'root'@'172.xx.x.x'DB 계정 권한 부족컨테이너 내에서 GRANT ALL PRIVILEGES 수행
network app-network not found네트워크 이름 불일치docker network inspect로 확인 후 이름 일치시킴
Cannot remove container is running기존 컨테이너 종료 안됨docker rm -f mariadb spring 강제 제거
.jar 파일이 없어요경로 또는 이름 불일치Dockerfile.jar 위치/이름 다시 확인
Unable to determine DialectDB 접속 실패JDBC URL 또는 자격정보 잘못됨 – 대부분 yml 설정 오타

반성문

사실 눈치 채셨을 지 모르겠지만 , 저는 결국 배포에 실패했습니다.


그리고 피해자까지 발생했습니다 ... 괴롭혀서 죄송합니다 ...

이렇게 피해자까지 발생시키면서 결국 끝내 배포에 성공하지 못했습니다.

아직 까지 해결하지 못한 원인은

Access denied for user 'root'@'172.19.0.3' (using password: YES)

즉, Spring이 DB에 연결할 때 사용하는 계정 root의 비밀번호가 실제 MariaDB 내부와 맞지 않는다는 것입니다...

제가 docker-compose.yml 과 application.yml에 설정해놨던 비밀번호가 실제 db에선 다르게 저장되어서 계속 비밀번호가 일치하지 않아서 mariaDB에서 spring 접근을 막고 있던 것 이였습니다 ...

어떤 문제가 발생하는 지 알면서도 이걸 고치지 못해서 정말 답답하고 서러웠습니다.

마치며 ...

배포가 정말 어렵다고 듣긴 했는데 이렇게 시간과 살을 갉아먹을 줄은 몰랐습니다. 아마 처음에 ppt 파일의 내용들을 아무 생각없이 복사 붙혀넣기 했던게 계속 오류를 발생시키는 것 같습니다 .. 다들 저와 같은 실수를 하지 않으셨으면 좋겠습니다.

저를 가장 괴롭혔던 로그를 복기하며 ... 마치겠습니다

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _ | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.4.3)

2025-05-12T14:13:14.836Z  INFO 1 --- [board] [           main] study.board.BoardApplication             : Starting BoardApplication v0.0.1-SNAPSHOT using Java 21 with PID 1 (/app.jar started by root in /)
2025-05-12T14:13:14.847Z  INFO 1 --- [board] [           main] study.board.BoardApplication             : No active profile set, falling back to 1 default profile: "default"
2025-05-12T14:13:17.660Z  INFO 1 --- [board] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-05-12T14:13:17.761Z  INFO 1 --- [board] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 87 ms. Found 2 JPA repository interfaces.
2025-05-12T14:13:18.678Z  INFO 1 --- [board] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)  
2025-05-12T14:13:18.701Z  INFO 1 --- [board] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-05-12T14:13:18.702Z  INFO 1 --- [board] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.36]
2025-05-12T14:13:18.749Z  INFO 1 --- [board] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-05-12T14:13:18.751Z  INFO 1 --- [board] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3754 ms
2025-05-12T14:13:19.092Z  INFO 1 --- [board] [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2025-05-12T14:13:19.164Z  INFO 1 --- [board] [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.6.8.Final
2025-05-12T14:13:19.206Z  INFO 1 --- [board] [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled    
2025-05-12T14:13:19.660Z  INFO 1 --- [board] [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2025-05-12T14:13:19.712Z  INFO 1 --- [board] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-05-12T14:13:19.864Z  WARN 1 --- [board] [           main] o.m.jdbc.message.server.ErrorPacket      : Error: 1045-28000: Access denied for user 'root'@'172.19.0.3' (using password: YES)
2025-05-12T14:13:20.869Z  WARN 1 --- [board] [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1045, SQLState: 28000
2025-05-12T14:13:20.869Z ERROR 1 --- [board] [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=3) Access denied for user 'root'@'172.19.0.3' (using password: YES)
2025-05-12T14:13:20.871Z  WARN 1 --- [board] [           main] o.h.e.j.e.i.JdbcEnvironmentInitiator     : HHH000342: Could not obtain connection to query metadata

org.hibernate.exception.GenericJDBCException: unable to obtain isolated JDBC connection [(conn=3) Access denied for user 'root'@'172.19.0.3' (using password: YES)] [n/a]
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:63) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]    
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]     
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:320) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:129) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81) ~[hibernate-core-6.6.8.Final.jar!/:6.6.8.Final] ```

profile
멋쟁이사자 13기 백엔드

3개의 댓글

comment-user-thumbnail
2025년 5월 12일

고생했어요 열심히한 것이 잘 보입니다!

답글 달기
comment-user-thumbnail
2025년 5월 13일

카톡 내용에서 고생하신게 보입니다.. 수고하셨습니다!!

답글 달기
comment-user-thumbnail
2025년 5월 13일

아쉽네요 주말까지 엄청 열심히 하셨는데 꼭 성공하시길 바라겠습니다..! 고생하셨습니다!

답글 달기