Railway๋?
๊ธฐ์กด AWS์ EC2 ํ๋ฆฌํฐ์ด๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ํ๋ฆฌํฐ์ด ๊ธฐ๊ฐ์ ๋งค๋ฒ ์์กดํด์ผํ๊ณ , ์ธํ๋ผ๋ ๋ชจ๋ ์ค์ค๋ก ๊ตฌ์ถํด์ผํ๋ ๋ถ๋ถ์ด ๊ต์ฅํ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋๊ปด์ก๋ค.
๊ทธ๋์ ์ ๋ ดํ๊ฒ ํธ์คํ ํ ์ ์๋ ์๋น์ค๋ฅผ ์ฐพ๋ค๊ฐ Railway๋ฅผ ๋ฐ๊ฒฌํ์๋ค.
Railway๋ ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์๋๋ก ๋๋ PaaS(Platform as a Service) ์๋น์ค์ด๋ค.
Railway
Railway is an infrastructure platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud.
railway.com
์ฃผ์ ํน์ง์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐํธํ ๋ฐฐํฌ: GitHub์ ์ฐ๋ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค. Docker๋ฅผ ์ง์ ์ค์ ํ ํ์ ์์ด git push๋ง ํ๋ฉด ์๋ก์ด ๋ฒ์ ์ด ๋ฐฐํฌ๋๋ค.
- ์๋ํ๋ ์ธํ๋ผ: ๊ธฐ๋ณธ์ ์ผ๋ก MySQL, PostgreSQL, Redis, MongoDB ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค. ์ฆ, ๋ช ๋ฒ์ ํด๋ฆญ๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ ๋ฒ์ ๋ฐฐํฌํ ์ ์๋ค.
- ์ค์๊ฐ ๋ก๊ทธ ๋ฐ ๋ชจ๋ํฐ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
- โญ๏ธ ๋ฌด๋ฃ ํฌ๋ ๋ง ์ ๊ณต: ๋ฌด๋ฃ ํฌ๋ ๋ง $5๋ฅผ ์ ๊ณตํ์ฌ, ํ ์ด ํ๋ก์ ํธ์ ์ ํฉํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ํ ์ด ํ๋ก์ ํธ ๋ฐฐํฌ์ Railway ์ฌ์ฉ์ ์ ๋ง ๊ฐ์ถํ๋ค.๐

Redis / MySQL Deployment
์ ๋๊ฐ์ง Database๋ ์ค๋ช ์ ํ๋ ๊ฒ์ด ๋ถ๋๋ฌ์ธ ์ ๋๋ก, ์ ๋ง ํด๋ฆญ ๋ช๋ฒ์ผ๋ก ๋ฐ๋ก ์์ฑ๋๋ค.

- ์ ํ๋ฉด์์ ํ์ํ Database๋ค์ ํด๋ฆญํด์ฃผ๋ฉด ๋ฐ๋ก ์์ฑ์ด ์๋ฃ๋๋ค.

- ์์ฑ์ด ์๋ฃ๋ Database์ ๋ํด Variables ํญ์ผ๋ก ๋ค์ด๊ฐ๋ฉด, Spring ์ค์ ์ ํ์ํ ๋ณ์๋ค์ ํ์ธํ ์ ์๋ค.

- ์๋ฅผ๋ค์ด ์์ ๊ฐ์ด ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ, ์คํ๋ง ํ๊ฒฝ๋ณ์์๋ ๋์ผํ๊ฒ ์ค์ ํ๋ฉด ๋๋ค.
# application.yml
spring:
data:
redis:
host: redis.railway.internal
Spring Boot Deployment
์์ ๊ฐ์ด Database๋ฅผ ๋จผ์ ์ค์ ํ๊ณ , Spring Boot์ ํ๊ฒฝ ๋ณ์ ์ค์ ๊น์ง ๋ง์น๋ฉด,
Spring Boot ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ ์ ์๋ ํ๊ฒฝ์ด ๋๋ฌ๋ค!
+ Create ๋ฒํผ์ ๋๋ฌ GitHub Repo๋ฅผ ํด๋ฆญํ๋ค.

- Configure GitHub App ์ ํตํด ์ ๊ทผ ์ค์ ์ ๋ง์น๋ฉด, ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ ํ ๋ ํฌ๊ฐ ๋ณด์ธ๋ค.

- ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ฑ๋๊ณ , Deployments ํญ์ผ๋ก ๋ค์ด๊ฐ๋ฉด, ์์ ๊ฐ์ด ๋น๋๋๊ณ ์๋ ํํฉ์ ๋ณผ ์ ์๋ค.
- Dockerfile๋ก ๋น๋๋ฅผ ์งํํ๋ฉฐ, ๋ฐฐํฌ๊น์ง ์๋ฃํ๋ค.
- ํญ์์ ๋ณด์ด๋ฏ, ๋น๋ ๋ก๊ทธ์ ๋ฐฐํฌ ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ, Http ์์ฒญ ๋ก๊ทธ๊น์ง ํ๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค. (ํฐ๋ฏธ๋๋ก ๋ก๊ทธ ๋ณด๋ ์์ ์๊ฐ๋ผโฆ๐)



๋ง์ ์ค์ ์ ํ๊ณ ๋๋, ์ด๋ฐ ๊ฐํธํ ์๋น์ค๊ฐ ์์ ์ ์๋ค๋ ๊ฒ์ ๋งค์ฐ ๋๋๋คโฆ
Railway์์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ํฌ๋ ๋ง $5๊ฐ ์ผ๋ง๋ ๋ฒํธ ์ ์๋์ง ์์ง๊น์ง ๊ฐ๋ ๋์ง ์์ง๋ง,
์ ๊ตฌ๋ ์ ํ๊ณ ์๋ผ๋ ๊ณ์ํด์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ๋๋ก UI ๋ฐ ๋ชจ๋ ์ธํ ์ด ๊ฐํธํ๊ณ ๋ช ๋ฃํ๋ค.
โ ๋๋ ๊ตฌ๋งคํ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ์๋๋ฐ, ๋๋๊ฒ๋ HTTP Secure ์ค์ ๊น์ง ์๋์ผ๋ก ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ ๋งํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ง๋ง, ์ปค์คํ ๋๋ฉ์ธ ์ฐ๊ฒฐ๊น์ง๋ ํด๋ฆญ ๋ช๋ฒ์ด๋ฉด ๊ฐ๋ฅํ๋ค!!!!
๋์ปค ๋น๋์๋ ์ ๋ฅผ ์ข ๋จน์ด์, Dockerfile ์ฝ๋ ๊ณต์ ๋ก Railway ์ฌ์ฉ๊ธฐ๋ฅผ ๋ง์น๊ฒ ๋ค.
# 1๋จ๊ณ: Gradle์ ์ฌ์ฉํด ๋น๋
FROM openjdk:17-alpine AS builder
WORKDIR /app
COPY . .
RUN apk add --no-cache bash
RUN chmod +x ./gradlew
RUN ./gradlew clean build --no-daemon
# 2๋จ๊ณ: ๋น๋๋ JAR ํ์ผ๋ง ์คํ ์ปจํ
์ด๋๋ก ๋ณต์ฌ
FROM openjdk:17-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Duser.timezone=Asia/Seoul", "-jar", "/app/app.jar"]
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Railway๋?
๊ธฐ์กด AWS์ EC2 ํ๋ฆฌํฐ์ด๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ํ๋ฆฌํฐ์ด ๊ธฐ๊ฐ์ ๋งค๋ฒ ์์กดํด์ผํ๊ณ , ์ธํ๋ผ๋ ๋ชจ๋ ์ค์ค๋ก ๊ตฌ์ถํด์ผํ๋ ๋ถ๋ถ์ด ๊ต์ฅํ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋๊ปด์ก๋ค.
๊ทธ๋์ ์ ๋ ดํ๊ฒ ํธ์คํ ํ ์ ์๋ ์๋น์ค๋ฅผ ์ฐพ๋ค๊ฐ Railway๋ฅผ ๋ฐ๊ฒฌํ์๋ค.
Railway๋ ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์๋๋ก ๋๋ PaaS(Platform as a Service) ์๋น์ค์ด๋ค.
Railway
Railway is an infrastructure platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud.
railway.com
์ฃผ์ ํน์ง์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐํธํ ๋ฐฐํฌ: GitHub์ ์ฐ๋ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค. Docker๋ฅผ ์ง์ ์ค์ ํ ํ์ ์์ด git push๋ง ํ๋ฉด ์๋ก์ด ๋ฒ์ ์ด ๋ฐฐํฌ๋๋ค.
- ์๋ํ๋ ์ธํ๋ผ: ๊ธฐ๋ณธ์ ์ผ๋ก MySQL, PostgreSQL, Redis, MongoDB ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค. ์ฆ, ๋ช ๋ฒ์ ํด๋ฆญ๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ ๋ฒ์ ๋ฐฐํฌํ ์ ์๋ค.
- ์ค์๊ฐ ๋ก๊ทธ ๋ฐ ๋ชจ๋ํฐ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
- โญ๏ธ ๋ฌด๋ฃ ํฌ๋ ๋ง ์ ๊ณต: ๋ฌด๋ฃ ํฌ๋ ๋ง $5๋ฅผ ์ ๊ณตํ์ฌ, ํ ์ด ํ๋ก์ ํธ์ ์ ํฉํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ํ ์ด ํ๋ก์ ํธ ๋ฐฐํฌ์ Railway ์ฌ์ฉ์ ์ ๋ง ๊ฐ์ถํ๋ค.๐

Redis / MySQL Deployment
์ ๋๊ฐ์ง Database๋ ์ค๋ช ์ ํ๋ ๊ฒ์ด ๋ถ๋๋ฌ์ธ ์ ๋๋ก, ์ ๋ง ํด๋ฆญ ๋ช๋ฒ์ผ๋ก ๋ฐ๋ก ์์ฑ๋๋ค.

- ์ ํ๋ฉด์์ ํ์ํ Database๋ค์ ํด๋ฆญํด์ฃผ๋ฉด ๋ฐ๋ก ์์ฑ์ด ์๋ฃ๋๋ค.

- ์์ฑ์ด ์๋ฃ๋ Database์ ๋ํด Variables ํญ์ผ๋ก ๋ค์ด๊ฐ๋ฉด, Spring ์ค์ ์ ํ์ํ ๋ณ์๋ค์ ํ์ธํ ์ ์๋ค.

- ์๋ฅผ๋ค์ด ์์ ๊ฐ์ด ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ, ์คํ๋ง ํ๊ฒฝ๋ณ์์๋ ๋์ผํ๊ฒ ์ค์ ํ๋ฉด ๋๋ค.
# application.yml
spring:
data:
redis:
host: redis.railway.internal
Spring Boot Deployment
์์ ๊ฐ์ด Database๋ฅผ ๋จผ์ ์ค์ ํ๊ณ , Spring Boot์ ํ๊ฒฝ ๋ณ์ ์ค์ ๊น์ง ๋ง์น๋ฉด,
Spring Boot ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ ์ ์๋ ํ๊ฒฝ์ด ๋๋ฌ๋ค!
+ Create ๋ฒํผ์ ๋๋ฌ GitHub Repo๋ฅผ ํด๋ฆญํ๋ค.

- Configure GitHub App ์ ํตํด ์ ๊ทผ ์ค์ ์ ๋ง์น๋ฉด, ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ ํ ๋ ํฌ๊ฐ ๋ณด์ธ๋ค.

- ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ฑ๋๊ณ , Deployments ํญ์ผ๋ก ๋ค์ด๊ฐ๋ฉด, ์์ ๊ฐ์ด ๋น๋๋๊ณ ์๋ ํํฉ์ ๋ณผ ์ ์๋ค.
- Dockerfile๋ก ๋น๋๋ฅผ ์งํํ๋ฉฐ, ๋ฐฐํฌ๊น์ง ์๋ฃํ๋ค.
- ํญ์์ ๋ณด์ด๋ฏ, ๋น๋ ๋ก๊ทธ์ ๋ฐฐํฌ ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ, Http ์์ฒญ ๋ก๊ทธ๊น์ง ํ๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค. (ํฐ๋ฏธ๋๋ก ๋ก๊ทธ ๋ณด๋ ์์ ์๊ฐ๋ผโฆ๐)



๋ง์ ์ค์ ์ ํ๊ณ ๋๋, ์ด๋ฐ ๊ฐํธํ ์๋น์ค๊ฐ ์์ ์ ์๋ค๋ ๊ฒ์ ๋งค์ฐ ๋๋๋คโฆ
Railway์์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ํฌ๋ ๋ง $5๊ฐ ์ผ๋ง๋ ๋ฒํธ ์ ์๋์ง ์์ง๊น์ง ๊ฐ๋ ๋์ง ์์ง๋ง,
์ ๊ตฌ๋ ์ ํ๊ณ ์๋ผ๋ ๊ณ์ํด์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ๋๋ก UI ๋ฐ ๋ชจ๋ ์ธํ ์ด ๊ฐํธํ๊ณ ๋ช ๋ฃํ๋ค.
โ ๋๋ ๊ตฌ๋งคํ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ์๋๋ฐ, ๋๋๊ฒ๋ HTTP Secure ์ค์ ๊น์ง ์๋์ผ๋ก ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ ๋งํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ง๋ง, ์ปค์คํ ๋๋ฉ์ธ ์ฐ๊ฒฐ๊น์ง๋ ํด๋ฆญ ๋ช๋ฒ์ด๋ฉด ๊ฐ๋ฅํ๋ค!!!!
๋์ปค ๋น๋์๋ ์ ๋ฅผ ์ข ๋จน์ด์, Dockerfile ์ฝ๋ ๊ณต์ ๋ก Railway ์ฌ์ฉ๊ธฐ๋ฅผ ๋ง์น๊ฒ ๋ค.
# 1๋จ๊ณ: Gradle์ ์ฌ์ฉํด ๋น๋
FROM openjdk:17-alpine AS builder
WORKDIR /app
COPY . .
RUN apk add --no-cache bash
RUN chmod +x ./gradlew
RUN ./gradlew clean build --no-daemon
# 2๋จ๊ณ: ๋น๋๋ JAR ํ์ผ๋ง ์คํ ์ปจํ
์ด๋๋ก ๋ณต์ฌ
FROM openjdk:17-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Duser.timezone=Asia/Seoul", "-jar", "/app/app.jar"]