Spring Boot + Docker + Render 배포 자동화 과정

dev.hyjang·2025년 7월 21일
post-thumbnail

이 글에서는 Spring Boot 애플리케이션을 Docker 컨테이너로 만들고, Render를 이용해 자동 배포하는 전체 과정을 정리했습니다.
프로젝트 초기 세팅부터 Dockerfile 작성, Render 환경 변수 설정, 그리고 Git 연동을 통한 자동 배포까지 단계별로 다룹니다.
특히, 실제 배포 과정에서 마주쳤던 문제와 해결 방법도 함께 기록하여, 처음 Render 배포를 시도하는 분들이 시행착오를 줄일 수 있도록 구성했습니다.


스프링부트 프로젝트 세팅

프로젝트 생성

이번 프로젝트는 Spring Boot 애플리케이션을 Docker로 컨테이너화하고,
Render를 통해 자동 배포하는 것을 목표로 합니다.
먼저 Spring Initializr를 이용해 기본 프로젝트를 생성했습니다.

  • Framework: Spring Boot 3.5.3
    → 최신 버전의 Spring Boot로, Java 17 이상에서 실행 가능
  • Build Tool: Gradle
    → 의존성 관리가 편리하고 빌드 속도가 빠름
  • JDK: Java 17
    → LTS(Long Term Support) 버전으로 안정성이 높음

프로젝트 실행 테스트

프로젝트를 생성한 직후, IDE에서 바로 실행해 보고
Spring Boot 로고와 함께 Started Application 로그가 나오면 성공입니다.
이 단계에서 실행이 안 되면 Gradle 설정이나 JDK 경로부터 점검해야 합니다.


데이터베이스 연결 (H2 Database)

이번 예제에서는 개발 단계에서만 H2 Database를 사용합니다.
H2는 가볍고 메모리 모드 지원 덕분에 빠른 테스트에 유리합니다.

  1. build.gradle에 의존성 추가
  runtimeOnly 'com.h2database:h2'
  1. application.yml에 데이터베이스 설정 추가
  2. H2 1.4.198 이후 버전에서는 보안 정책 변경으로 파일 기반 DB가 자동 생성되지 않음
    따라서 DB 파일을 직접 생성해야 할 수 있습니다.

위 위치에 test.mv.db 파일을 생성한 뒤 접속하면 정상적으로 접근됩니다.

H2 콘솔 접속 후 테스트용 테이블을 만들어 확인합니다.

메모리 모드 사용 예시

테스트용 데이터베이스를 메모리에만 유지하려면 아래와 같이 설정합니다.
이 경우 애플리케이션이 종료되면 데이터는 사라집니다.

datasource:  
  url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1  
  driver-class-name: org.h2.Driver  
  username: sa  
  password:

로깅 설정

Spring Boot의 기본 로깅 레벨은 INFO입니다.
전체 로그를 보고 싶다면 application.yml에 다음과 같이 설정합니다.

logging:
  level:
    root: INFO
  • 개발 중에는 DEBUG로 변경하면 쿼리 실행 로그까지 확인 가능하지만,
    운영 환경에서는 성능 저하를 막기 위해 INFO 또는 WARN을 권장합니다.

MyBatis 연결 설정

MyBatis를 사용해 DB와 연동하기 위한 기본 설정입니다.

mybatis:  
  mapper-locations: classpath:/mapper/**/*.xml  
  type-aliases-package: com.ccp.simple.domain  
  configuration:  
    map-underscore-to-camel-case: true
  • mapper-locations: XML 매퍼 파일 위치 지정
  • type-aliases-package: DTO/VO 클래스의 패키지 경로
    → 클래스명을 짧게 사용할 수 있음
  • map-underscore-to-camel-case: DB 컬럼명(user_name)을 Java 필드명(userName)으로 자동 변환

설정파일 전체 예시

아래는 지금까지의 설정을 합친 application.yml 예시입니다.

spring:  
  datasource:  
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1  
    driver-class-name: org.h2.Driver  
    username: sa  
    password:  
  h2:  
    console:  
      enabled: true  
  sql:  
    init:  
      schema-locations: classpath:schema.sql  
      data-locations: classpath:data.sql  
      mode: always  

mybatis:  
  mapper-locations: classpath:/mapper/**/*.xml  
  type-aliases-package: com.ccp.simple.domain  
  configuration:  
    map-underscore-to-camel-case: true  

logging:  
  level:  
    root: INFO

프로젝트 및 테이블 구조

프로젝트 구조

테이블 구조

  • 참고: bbs 테이블은 생성하지 않음

조회 기능 테스트

@RestController
@RequiredArgsConstructor
@RequestMapping("user")
public class UserController {
    private final UserService userService;

    @GetMapping()
    public List<User> getUsers() {
        return userService.getUsers();
    }
}


도커 배포

데이터베이스 메모리 모드 변경

datasource:  
  url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1  
  driver-class-name: org.h2.Driver  
  username: sa  
  password:
  • H2 메모리 모드 사용 시 앱 종료하면 데이터 초기화됨
  • 파일 모드로 변경 필요
datasource:  
  url: jdbc:h2:file:./data/testdb;DB_CLOSE_ON_EXIT=FALSE  
  driver-class-name: org.h2.Driver  
  username: sa  
  password:
  • 도커 컨테이너에 데이터 파일 복사 또는 볼륨 마운트 예정

빌드 (Jar 파일 생성)

./gradlew clean build
  • build/libs/ 폴더 내 yourprojectname-version.jar 생성됨

도커 설치

  • Docker Desktop (Windows용) 설치
  • docker --version으로 설치 확인
  • Docker는 WSL2 위에서 작동하므로 WSL 설치 및 업데이트 필요

WSL 업데이트 이슈 참고


1. Dockerfile 생성

  • 프로젝트 루트(예: build.gradle 위치)에 생성
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/simple-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

2. Docker 이미지 빌드

docker build -t simple-app .
  • 이미지 확인
docker images


3. Docker 컨테이너 실행

docker run -d -p 8080:8080 --name simple-container simple-app
  • 컨테이너 실행 확인
docker ps


자동 배포

GitHub Push → 자동 빌드 → 자동 Docker 배포

방법설명자동화 수준설정 난이도비용
✅ Render 사용GitHub Push 시 Docker 빌드 + 실행 자동화⭐ 완전 자동매우 쉬움무료 플랜 있음
✅ GitHub Actions + AWS EC2GitHub Push → EC2에서 Docker 자동 실행⭐⭐ 유연함약간 어려움AWS 비용 발생

Render 자동 배포 과정

  1. Render 가입 (https://render.com)
  2. Web Service 선택

  1. GitHub 연결
  2. 레포지토리 선택, Language는 Docker 설정

  1. 배포 버튼 클릭

배포 중 발생한 오류

error: failed to solve: failed to compute cache key: failed to calculate checksum of ref ... no such file or directory
  • 원인: Render가 Dockerfile만 보고 빌드 시도하는데, 빌드된 Jar가 없어 실패

  • 해결법

    1. Jar 파일을 깃허브에 수동 업로드 (비효율)
    2. Dockerfile에 Gradle 빌드 명령어 포함 (추천)

Dockerfile 수정 전

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/simple-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Dockerfile 수정 후 (빌드 포함)

# Build stage
FROM gradle:8.5-jdk17 AS builder
COPY --chown=gradle:gradle . /home/gradle/project
WORKDIR /home/gradle/project
RUN gradle build --no-daemon

# Run stage
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /home/gradle/project/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

배포 재시도 결과


자동 배포 테스트 성공 화면


마무리

  • Render를 이용한 자동 배포는 설정이 매우 간단해서 초보자도 쉽게 따라할 수 있음
  • Dockerfile 내에서 Gradle 빌드 포함은 자동화에 필수적
  • 앞으로도 GitHub Push → Render 자동 배포 흐름으로 운영 가능

profile
낭만감자

0개의 댓글