Code N Solve ๐: Spring Boot ํ๋ก์ ํธ์์ Render ๋ฐฐํฌ ์คํจ ์ฌ๋ก ์ ๋ฆฌ
์ง๋๋ฒ Vite ๋ฐฐํฌ ์ค๋ฅ ๊ธ๊ณผ๋ ๋ฌ๋ฆฌ, Java + Spring Boot + Gradle1 ํ๊ฒฝ์ ๋ฐฑ์๋ ํ๋ก์ ํธ๋ฅผ Render2์ Docker๋ก ๋ฐฐํฌํ ๋ ๊ฒช์ ๋น๋ ์คํจ ์ฌ๋ก์ ํด๊ฒฐ ๊ณผ์ ์ ์ ๋ฆฌํ์๋ค.
๊ฐ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ถ์ํ๊ณ ํด๊ฒฐํ ๊ณผ์ ์ ๋ํด ์์๋ณด์.
Vite๋ Node.js ํ๊ฒฝ์ด ์๋, Java ๊ธฐ๋ฐ ์๋ฒ๋ฅผ Docker ํ๊ฒฝ์์ Render๋ก ๋ฐฐํฌํ๋ ค๊ณ ํ๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์์ด ๋๋ฉด ์ข๊ฒ ๋ค.
๐จ 1. ./gradlew
์คํ ์ค๋ฅ - Permission denied
โ ๋ฌธ์ ์ํฉ
./gradlew: Permission denied
๐ง ์์ธ ๋ถ์
-
Git์์ ํ์ผ ๊ถํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ์ ๋์ง ์๊ธฐ ๋๋ฌธ์, ๋ก์ปฌ์์๋ ์คํ๋๋
./gradlew
ํ์ผ์ด ๋ฆฌ๋ ์ค ๋ฐฐํฌ ํ๊ฒฝ(Render ๋ฑ)์์๋ ์คํ ๊ถํ(x) ์์ด ๋ณต์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์. -
ํนํ
gradlew
๋.gitignore
๋ก ์ ์ธ๋์ง ์๋๋ผ๋chmod +x
๋ก ๋ถ์ฌ๋ ์คํ ๊ถํ ์์ฒด๊ฐ Git ์ปค๋ฐ์ ๋ฐ์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉฐ, ์ด๋ Linux ํ๊ฒฝ์์Permission denied
์ค๋ฅ๋ฅผ ์ ๋ฐํจ. -
Windows๋ macOS ํ๊ฒฝ์์๋ ์คํ ๊ถํ์ด ๋ฌธ์ ์์ด ์ ์ฉ๋ ์ ์์ผ๋, Render์ Docker ๋น๋๋ Linux ๊ธฐ๋ฐ์ด๋ฏ๋ก ์ด ๊ถํ์ด ์๊ฒฉํ ์๊ตฌ๋จ.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. ์คํ ๊ถํ ๋ถ์ฌ
-
chmod +x ./gradlew
๐จ 2. Gradle Wrapper ์์ - GradleWrapperMain ์ค๋ฅ
โ ๋ฌธ์ ์ํฉ
Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain
๐ง ์์ธ ๋ถ์
-
Gradle ํ๋ก์ ํธ๋ฅผ Git์ผ๋ก ๊ด๋ฆฌํ ๋, ์ข ์ข
.gitignore
์ ์ํด ๋ฌด์ฌ์ฝ ์ ์ธ๋๊ฑฐ๋ ์ปค๋ฐ ๋๋ฝ๋๋ ๊ฒฝ์ฐ๊ฐ ์์. -
ํนํ ๋ค์ ํ์ผ๋ค์ Gradle์ Wrapper3 ๊ธฐ๋ฅ์ ๊ตฌ์ฑํ๋ ํต์ฌ ํ์ผ๋ก, Wrapper ๋ฐฉ์์ ๋น๋๋ Gradle์ด ์ค์น๋์ง ์์ ํ๊ฒฝ์์๋ ๋น๋๋ฅผ ์ํํ ์ ์๊ฒ ๋์์ค.
gradlew
gradlew.bat
gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
-
๋ฐ๋ผ์ ์ ํ์ผ๋ค์ด ๋๋ฝ๋๋ฉด
./gradlew
์คํ ์ ๋ด๋ถ์ ์ผ๋กorg.gradle.wrapper.GradleWrapperMain
ํด๋์ค๋ฅผ ์ฐพ์ ์ ์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํจ.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. .gitignore
์ ์ํด ๋๋ฝ๋ ๊ฒฝ์ฐ ๋ค์ ํ์ผ๋ค์ ๋ฐ๋์ ์ปค๋ฐ
-
gradlew gradlew.bat gradle/wrapper/gradle-wrapper.jar gradle/wrapper/gradle-wrapper.properties
- ์ด ํ์ผ๋ค์ Gradle ๋น๋ ์์คํ
์ ํต์ฌ ์์๋ก, Gradle ์ค์น ์์ด๋
./gradlew
๋ช ๋ น์ด๋ก ๋น๋๊ฐ ๊ฐ๋ฅํ๊ฒ ํจ.
๐จ 3. JAVA_HOME ๊ด๋ จ ์ค๋ฅ
โ ๋ฌธ์ ์ํฉ
Docker ๋น๋ ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฐ์.
ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
๐ง ์์ธ ๋ถ์
-
Render์ ๊ธฐ๋ณธ ๋ฐฐํฌ ํ๊ฒฝ์ Node.js๋ Python๊ณผ ๊ฐ์ ์ธ์ด์๋ ์นํ์ ์ด์ง๋ง, Java๋ฅผ ์คํํ ์ ์๋ ํ๊ฒฝ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์์.
-
ํนํ
env: docker
์ค์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ณ๋์ Docker ์ด๋ฏธ์ง์์ Java๊ฐ ์ค์น๋์ง ์์ผ๋ฉด Gradle ๋น๋ ๊ณผ์ ์์JAVA_HOME
์ค์ ์ด ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋จ. -
Java ๊ธฐ๋ฐ์ ๋น๋๋ฅผ ์ํ ํ๊ฒฝ์ ์ง์ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋ฉฐ, Gradle ๋น๋ ์ ๋ด๋ถ์ ์ผ๋ก Java compiler๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํจ.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. Dockerfile์ ์ฌ์ฉํด Java๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์น
-
# Dockerfile FROM eclipse-temurin:21-jdk WORKDIR /app COPY . . RUN chmod +x ./gradlew RUN ./gradlew build CMD find ./build/libs -name "*.jar" | xargs java -jar
-
Render์์ Java๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ ์ํด Dockerfile์์ Java๋ฅผ ๋ช ์์ฒ์ผ๋ก ์ค์นํจ.
eclipse-temurin
4์ OpenJDK๋ฅผ ์ ๊ณตํ๋ ๊ณต์ Docker ์ด๋ฏธ์ง.
๐จ 4. Gradle Toolchain ์๋ฌ (Java 17 ์๊ตฌ)
โ ๋ฌธ์ ์ํฉ
Failed to calculate the value of task ':compileJava' property 'javaCompiler'.
Cannot find a Java installation matching: {languageVersion=17...}
๐ง ์์ธ ๋ถ์
-
Gradle Toolchain5 ๊ธฐ๋ฅ์ ํน์ Java ๋ฒ์ ์ผ๋ก์ ์ผ๊ด๋ ๋น๋๋ฅผ ์ํด ์ฌ์ฉ๋จ.
- ์:
JavaLanguageVersion.of(17)
.
- ์:
-
๊ทธ๋ฌ๋ Render์ Docker ๋น๋ ํ๊ฒฝ์์๋ ์๋์ผ๋ก ํ์ํ Java ๋ฒ์ ์ ๋ค์ด๋ก๋ํ์ง ์์.
-
๋ฐ๋ผ์
toolchain
์ ๋ช ์๋ ๋ฒ์ ๊ณผ Docker ์ด๋ฏธ์ง์ JDK ๋ฒ์ ์ด ์ผ์นํ์ง ์์ผ๋ฉด ๋น๋ ์ Gradle์ด ํด๋น ๋ฒ์ ์ ์ฐพ์ง ๋ชปํด ์ค๋ฅ๋ฅผ ๋ฐ์์ํด. -
Java toolchain ์ค์ ์ด ์ ์ฉ๋ ์ํ์์
eclipse-temurin:21-jdk
๋ฑ ์์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ ์ ์์.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. build.gradle
์์ toolchain ์ ๊ฑฐ
-
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }
build.gradle
์์ toolchain ์ ๊ฑฐ ๋๋ Java ๋ฒ์ ์๋ ๋งค์นญ ์ ๊ฑฐ.
๋๋ 2. Java ๋ฒ์ Docker์ ๋ง์ถ๊ธฐ
-
FROM eclipse-temurin:17-jdk
-
Dockerfile์ JDK ๋ฒ์ ์ Gradle toolchain๊ณผ ์ผ์น์ํด.
-
๐ ์ถ๊ฐ๋ก, Gradle์ toolchain ์ค์ ์ด ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ Dockerfile์์ ๋์ผํ JDK ๋ฒ์ ์ ๋ช ์์ ์ผ๋ก ํฌํจ์์ผ์ผ ํจ.
-
java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }
-
์ด ๊ฒฝ์ฐ, ๋น๋ ํ๊ฒฝ์์๋ ์ ํํ JDK 17์ด ์ค์น๋์ด ์์ด์ผ ์ ์ ์๋ํจ.
-
Failed to calculate the value of task ':compileJava' property 'javaCompiler'. Cannot find a Java installation matching: {languageVersion=17...}
-
๐จ 5. Render ๋ฐฐํฌ ์ค์ - render.yaml
๐ง ์์ธ ๋ถ์
-
Github ์ ์ฅ์ ๋ฃจํธ์
render.yaml
์ด ์์ด์ผ ํจ. -
Dockerfile
๊ธฐ์ค์ผ๋ก ๋น๋๋๋๋ก ์ค์ ํ์ํจ. -
Dockerfile
์ด ์กด์ฌํ๊ณCMD
๊ตฌ๋ฌธ์์.jar
์คํํด์ผ ํจ. -
์ฌ๋ฌ ์๋น์ค๊ฐ ์์ ๊ฒฝ์ฐ
healthCheckPath
,buildCommand
๋ฑ ์ถ๊ฐ ์ค์ ๊ฐ๋ฅ.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. render.yaml
์์ฑ
services:
- type: web
name: testweave
env: docker
plan: free
๐จ 6. DATABASE_URL ์๋ ์ ๊ณต vs H2
-
Render๋ PostgreSQL ์ฌ์ฉ ์ ํ๊ฒฝ๋ณ์
DATABASE_URL
์ ์๋ ์ ๊ณตํจ.6 -
postgres://<user>:<password>@<host>:<port>/<dbname>
ํ์์ ์ ์ ๋ฌธ์์ด๋ก, Spring Boot์์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ํ ์ค๋ก ์ ๊ณตํจ. -
๊ธฐ์กด์
H2 (in-memory)
๋ฅผ ์ฌ์ฉํ๋ค๋ฉดapplication.properties
์ ๋ค์์ ๋ฐ์ํด์ผ ํจ.
โ ๋ฌธ์ ์ํฉ
๐ง ์์ธ ๋ถ์
-
๋ก์ปฌ ๊ฐ๋ฐ์์ H2 ์ธ๋ฉ๋ชจ๋ฆฌ DB๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, Render์ ๊ฐ์ ์ด์ ๋ฐฐํฌ ํ๊ฒฝ์ธ์๋ PostgreSQL ๊ฐ์ ์์์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์ํจ
-
Render๋ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก
DATABASE_URL
ํ๊ฒฝ๋ณ์๋ฅผ ์์ฑํด์ฃผ์ง๋ง, Spring Boot์application.properties
์์ ์ด ๊ฐ์ ์ฝ๋๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก H2๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํจ. -
๋ํ PostgreSQL์ ์ฌ์ฉํ๋ ค๋ฉด JDBC ๋๋ผ์ด๋ฒ ์์กด์ฑ์ ๋ณ๋๋ก ์ถ๊ฐํด์ผ ํ๋ฉฐ, ๋ก์ปฌ์์๋ ๋ฌธ์ ๊ฐ ์์๋ ์ค์ ์ด Render์์๋ ์๋ํ์ง ์์ ์ ์์.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. PostgreSQL ์ฌ์ฉ ์ ์ค์
-
# application.properties spring.datasource.url=${DATABASE_URL} spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=update
-
# build.gradle dependencies { implementation 'org.postgresql:postgresql:42.7.3' }
-
PostgreSQL ๋๋ผ์ด๋ฒ ์์กด์ฑ๋ build.gradle์ ์ถ๊ฐ ํ์ํจ.
โ H2์์ ์ ํ ์ ์ฃผ์
-
๋ก์ปฌ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ ํ๊ฒฝ์์ DB๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ์คํค๋ง๊ฐ ์ผ์นํ์ง ์์ ์ ์์ผ๋ฏ๋ก Flyway ๋๋ Liquibase ๋ฑ์ ๋ง์ด๊ทธ๋ ์ด์ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์.
-
Render์์ ์ ๊ณตํ๋
DATABASE_URL
ํ๊ฒฝ๋ณ์๋ ์๋์ ๊ฐ์ ํ์.postgres://username:password@hostname:port/dbname
-
ํด๋น URL์
spring.datasource.url
์ ๊ทธ๋๋ก ๋ฃ์ผ๋ฉด Spring Boot์์ ์๋์ผ๋ก ๋ถ๋ฆฌ ํ์ฑํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํจ.
๊ฒฐ๋ก
-
./gradlew
์ ์คํ ๊ถํ ๋ถ์ฌ (chmod +x ./gradlew
) -
gradlew
,gradle-wrapper.jar
,.properties
๋ฑ Wrapper ๊ด๋ จ ํ์ผ์ Git์ ๋ฐ๋์ ์ปค๋ฐ -
Dockerfile
์์eclipse-temurin
์ด๋ฏธ์ง๋ก Java ํ๊ฒฝ ๋ช ์ -
Gradle
toolchain
์ ์ฌ์ฉํ ๊ฒฝ์ฐ Docker JDK ๋ฒ์ ๊ณผ ์ผ์น์ํฌ ๊ฒ -
Render ๋ฃจํธ์
render.yaml
์กด์ฌ ํ์ธ -
PostgreSQL ์ฌ์ฉ ์
DATABASE_URL
๊ณผ JDBC ์ค์ ์ถ๊ฐ -
๋ก์ปฌ์์๋ H2, ์ด์์์๋ PostgreSQL์ ์ฌ์ฉํ๋ค๋ฉด DB ๋ง์ด๊ทธ๋ ์ด์ ๋๊ตฌ(Flyway ๋ฑ) ๋์ ๊ณ ๋ ค
Render๋ ํธ๋ฆฌํ๊ณ ๋ฌด๋ฃ๋ก ๋ฐฐํฌํ ์ ์๋ ๋๊ตฌ์ด์ง๋ง Java ํ๋ก์ ํธ๋ฅผ ์ํ ๋ณ๋ ์ค์ ์ด ํ์ํ๋ค๋ ์ ์ ๊ผญ ๊ธฐ์ตํด์ผ๊ฒ ๋ค!