Post

[Render] SpringBoot Render + NeonDB 무료 배포 과정 정리


목차

  1. NeonDB 생성
  2. Docker File 생성
  3. Render New Web Service 생성
  4. 연결할 Git 브랜치 선택
  5. 필요에 따라 Environment Variables 추가
  6. Deploy Web Service


🔎그 전에 알아야할 것


Render란?

Render는 클라우드 PaaS(Platform as a Service)이다.
코드를 깃허브에 올리면, Render가 이를 가져와서 실제 인터넷에서 접속 가능한 상태로 만들어주는(배포) 서비스이다.

주요 특징

  • GitHub 연동 : 깃허브에 push만 하면 자동으로 빌드하고 배포해 준다.
  • 자동 HTTPS : 보안 연결(TLS) 설정을 알아서 해준다.
  • PostgresDB 제공 : 무료 플랜은 1GB 용량을 제공하지만, 생성 후 30일(기존 90일에서 단축됨)이 지나면 데이터베이스와 내부의 모든 데이터가 자동으로 삭제된다. (때문에 필자는 NeonDB를 선택했다.)

NeonDB란?

NeonDB는 Serverless PostgreSQL 데이터베이스 서비스이다.

무료 플랜 주요 특징

  • 저장 용량 : 프로젝트당 0.5GB
  • 컴퓨팅(CU) : 매월 프로젝트당 100 CU-hours 제공으로, 0.25 CU(최소 사양)로 설정 시 한 달에 약 400시간 작동 가능하다.
  • 자동 일시 중지 (Scale-to-Zero) : 5분 동안 접속이 없으면 DB가 자동으로 잠듦(이때는 CU 시간을 소모X). 다시 접속하면 약 0.5~2초 내에 깨어난다.
  • 프로젝트 개수: 최대 100개까지 생성 가능하다.
  • 데이터 전송(Egress): 월 5GB 무료다.


배포할 프로젝트 스펙

  • SpringBoot 3.2.12
  • JDK 17
  • React 18.3
  • PostgreSQL 17
  • Docker




1. NeonDB 생성

깃헙 로그인 후 New project를 클릭해 프로젝트를 생성해준다.

  • project name : 프로젝트 이름
  • Postgres version : 사용할 Postgres 버전
  • Cloud service provider : AWS 선택했다.
  • Region : 가장 가까운 Singapore 선택했다.

정보 입력 후 Create 버튼을 클릭하면 데이터베이스가 생성된다.
생성된 프로젝트를 클릭하고, Connection string을 클릭하면 접속 정보가 나오는데, 프로젝트 DB 설정 코드에 넣어주면 된다.

(아래 5.Environment 설정 부분 참고)



2. Docker File 생성

Render에 배포하기 위해서 프로젝트 루트 경로에 DockerFile을 생성해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Stage 1: Build frontend
FROM node:20-alpine AS frontend-build
WORKDIR /app/frontend
COPY frontend/package*.json ./
RUN npm install
COPY frontend/ ./
RUN npm run build

# Stage 2: Build backend
FROM gradle:8.5-jdk17 AS backend-build
WORKDIR /app
COPY build.gradle settings.gradle ./
COPY gradle/ gradle/
COPY gradlew ./
RUN chmod +x gradlew
COPY src/ src/
COPY --from=frontend-build /app/frontend/dist/ src/main/resources/static/
RUN gradle bootJar -x test --no-daemon

# Stage 3: Runtime
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=backend-build /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Xmx256m", "-jar", "app.jar"]

Stage1 : Node.js 환경에서 React 소스 코드를 빌드하여 정적 파일(HTML, JS, CSS)을 생성한다.
Stage2 : SpringBoot를 빌드하는 과정에서 Stage1에서 만든 프론트엔드 결과물을 백엔드의 정적 리소스 폴더(static)로 복사한다.
Stage3 : 빌드 도구(Node, Gradle)나 소스 코드를 모두 제외하고, 오직 실행에 필요한 app.jar와 자바 실행 환경(JRE)만 포함한다.



3. Render New Web Service 생성

Git계정으로 로그인 후 처음으로 +New -> Web Service를 클릭하면 신용카드 등록 창이 뜬다. (다른 블로그 글을 보면 바로 웹 서비스 생성으로 넘어가는 거 같은데 필자는 신용카드 등록을 해야만 넘어가졌다.. 바뀐 건가?)
신용카드 등록해주면 1달러가 바로 결제된다. 카드가 유효한지 확인을 위해 빠져나가는 돈으로 나중에 환불되는 금액인 것으로 추정.



4. 연결할 Git 브랜치 선택

  • Name : 프로젝트 이름
  • Language : Docker
  • Branch : 배포할 브랜치 선택
  • Region : Singapore (가장 가까운 거 선택)
  • Instance Type : Free !!


5. 필요에 따라 Environment Variables 추가

+Add Environment Variable로 필요한만큼 추가하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server:
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true

spring:
  datasource:
    url: jdbc:postgresql://${DB_HOST}/neondb?sslmode=require&channel_binding=require
    username: ${DB_USER}
    password: ${DB_PASSWORD}
    driver-class-name: org.postgresql.Driver

  security:
    user:
      name: ${SECURITY_USER}
      password: ${SECURITY_PW}

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: false

  sql:
    init:
      mode: never

  h2:
    console:
      enabled: false

logging:
  level:
    com.example.badminton: INFO

필자는 application.yml 파일에서 사용한 환경변수들을 등록해주었다.



6. Deploy Web Service

Deploy Web Service를 누르면 천천히 배포가 진행된다.
Push하면 자동으로 재배포가 이루어지며, 상단에 생성된 URL로 서비스 접속이 가능하다.

deploy

첫 접속 시 검정색 Render Welcome 화면이 보일 텐데 빌드 중이므로 기다리면 된다. 해당 화면은 15분간 접속이 없어 서버가 잠겼을 때 뜨는 화면이다.

데이터 로딩 과정이 생각보다 더 느려서 개인 프로젝트용으로만 사용하면 좋을 것 같다.


This post is licensed under CC BY 4.0 by the author.