๐Ÿ“ค ๋ฐฐํฌ

[Docker] ์Šคํ”„๋ง ๋ถ€ํŠธ + PostgreSQL Docker ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ๊ฒช์€ ๋ฌธ์ œ์  ๊ธฐ๋ก

์†Œ์˜ ๐Ÿ€ 2025. 4. 10. 10:23

๋“ค์–ด๊ฐ€๋ฉด์„œ

์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ์—์„œ ์ง„ํ–‰ํ•œ ๋ฏธ์…˜์—์„œ
๋„์ปค์™€ AWS๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฏธ์…˜์„ ์ ์šฉํ–ˆ๋Š”๋ฐ

 

๋„์ปค๊ฐ€ ์ฒ˜์Œ์ด๋ผ ๋„ˆ๋ฌด ์–ด๋ ต๊ณ , ์ƒ๊ฐ๋งŒํผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.
์•”ํŠผ ์„ฑ๊ณตํ–ˆ์œผ๋‹ˆ ๊ทธ ๊ณผ์ •๊ณผ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

ํ™˜๊ฒฝ

  • Spring Boot 3.4
  • PostgreSQL 14
  • ๋ฐฐํฌํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ: ๊นƒํ—ˆ๋ธŒ

๋ชฉํ‘œ

  • Dockerfile ์ž‘์„ฑ
    • Dockerfile์—์„œ jar ๋นŒ๋“œ, ์ด๋ฏธ์ง€ ๋นŒ๋“œ
  • Docker Compose ๊ตฌ์„ฑ
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ
    • PostgreSQL ํฌํ•จ
    • ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณผ๋ฅจ: ํŒŒ์ผ ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ
    • PostgreSQL ๋ณผ๋ฅจ

Dockerfile

Dockerfile๋กœ jar ๋นŒ๋“œ ์ค‘ ์—๋Ÿฌ

  • Unsupported class file major version 65 ์˜ˆ์™ธ

https://syleeblog.tistory.com/35

 

์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.
์ด๋•Œ๋Š” ๋ณ„ ์—๋Ÿฌ ์—†์ด ๋๋‚  ๊ฑฐ๋ผ ์ƒ๊ฐํ•œ ์ดˆ๋ฐ˜์ด๋ผ
ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ธ€ ํ•˜๋‚˜ ์ ์œผ๋ฉด ๋๋‚  ์ค„ ์•Œ์•˜๋Š”๋ฐ..

jar ๋นŒ๋“œ ์ค‘ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํŒจ

๋‚˜๋Š” src/test์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์—ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


๋‚ด๊ฐ€ Run์„ ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ๋‹ค.
๋˜ํ•œ ์ง์ ‘ ./graldew build๋ฅผ ํ–ˆ์„ ๋•Œ๋„ ๋ฌธ์ œ ์—†์—ˆ๋‹ค.

 

 

๊ทธ๋Ÿฐ๋ฐ Dockerifle์„ ํ†ตํ•ด jar ๋นŒ๋“œ ์ค‘ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „๋ถ€ ์‹คํŒจํ•˜๋ฉฐ
ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ๋‹ค.

 

์ด ๊ฒฝ์šฐ, ์•„์ง ์ •ํ™•ํ•œ ์›์ธ์„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ
ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋“ค์˜ ์œ„์น˜๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค.

 

 

integratinoTests ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋“ค์„
๊ฐ€์žฅ ์œ„๋กœ ๋นผ๋ƒˆ๋‹ค.


๊ทธ๋žฌ๋”๋‹ˆ Dockerfile์„ ํ†ตํ•œ ๋นŒ๋“œ๊ฐ€ ๋๋‹ค.

@SpringBootTest ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํŒจํ‚ค์ง€์— ์žˆ์œผ๋ฉด ์•ˆ ๋˜๋Š” ๊ฑธ๊นŒ?
์ด ๋ถ€๋ถ„์€ ๊ณต๋ถ€๊ฐ€ ๋” ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


์•„๋ž˜๊ฐ€ ๋‚ด ์ตœ์ข… Dockerfile์ด๋‹ค.
docker build -t discodeit:local๋กœ ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•œ ํ›„ ๋นŒ๋“œํ•˜๋ฉด ๋‚ด๊ฐ€ ๋”ฐ๋กœ ./gradlew buildํ•˜์ง€ ์•Š์•„๋„
ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ณ , ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.

FROM gradle:8.12.1-jdk17 AS builder
WORKDIR /app
COPY . /app
RUN gradle build --no-daemon 

FROM amazoncorretto:17
WORKDIR /app
EXPOSE 80
ENV PROJECT_NAME=discodeit
ENV PROJECT_VERSION=1.2-M8
ENV JVM_OPTS=""
COPY --from=builder /app/build/libs/${PROJECT_NAME}-${PROJECT_VERSION}.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Docker-compose

ํ™˜๊ฒฝ๋ณ€์ˆ˜ .env ์ ์šฉ ์ค‘ ์—๋Ÿฌ

  • ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์„ค์ •์ด pg_hba.conf ํŒŒ์ผ์— ์—†์Šต๋‹ˆ๋‹ค.

https://syleeblog.tistory.com/36

์ด ๊ธ€์— ์ •๋ฆฌํ•˜์˜€๋‹ค.

Connection to localhost:5432 refused

์–ด๋–ป๊ฒŒ๋“  ์ด๋ฏธ์ง€ ๋นŒ๋“œ์™€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์— ์„ฑ๊ณตํ•˜์˜€์œผ๋‚˜
๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ PostgreSQL DB์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋กœ๊ทธ๊ฐ€ ๋–ด๋‹ค.

 

์—ฌ๊ธฐ์„œ localhost๊ฐ€ ๋ฌธ์ œ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
๋‚˜๋Š” ๋‚ด ํ˜ธ์ŠคํŠธ์˜ PostgreSQL์„ ์“ฐ๋„๋ก ์˜๋„ํ–ˆ๊ธฐ์— localhost๊ฐ€ ๋ฌธ์ œ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.(์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋กœ์ปฌ DB์— ์—ฐ๊ฒฐ)

 

๊ทธ๋Ÿฌ๋‚˜ ๋กœ๊ทธ์—์„œ ๋งํ•˜๋Š” localhost๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋กœ์ปฌ์„ ์˜๋ฏธํ•œ๋‹ค.
์ฆ‰, ์ปจํ…Œ์ด๋„ˆ ์ž…์žฅ์—์„œ localhost:5432๋Š” ์ปจํ…Œ์ด๋„ˆ ์ž๊ธฐ ์ž์‹ ์˜ 5432 ํฌํŠธ๋ฅผ ๋ณด๋Š” ๊ฑฐ์ง€, ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ DB๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

ํ˜„์žฌ ๋„์ปค ๋‚ด์—์„œ 5432 ํฌํŠธ๋กœ ๋Œ์•„๊ฐ€๋Š” PostgreSQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์–ด์„œ ๋‚œ ์˜ค๋ฅ˜ ๊ฐ™๋‹ค.

Docker ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ DB์— ์ ‘๊ทผํ•˜๋ ค๋ฉด
yaml์—์„œ localhost ๋Œ€์‹  host.docker.internal์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

spring:
  datasource:
    url: jdbc:postgresql://host.docker.internal:5432/${DB_NAME}

๋ณผ๋ฅจ: ํŒŒ์ผ ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ

์ด ์„œ๋น„์Šค์—์„œ๋Š”
์‚ฌ์šฉ์ž๋“ค์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„, ๋˜๋Š” ๋ฉ”์‹œ์ง€ ์ฒจ๋ถ€ ํŒŒ์ผ์„
ํŒŒ์ผ ์‹œ์Šคํ…œ์— binary ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ ์œ„์น˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ์œ„์น˜์˜ localStorage์ด๋‹ค.

 

 

๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ์˜ฌ๋ฆด ๋•Œ ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜์†ํ™”ํ•˜๊ณ ์ž ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‚˜์ฒ˜๋Ÿผ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ๋ณผ๋ฅจ์œผ๋กœ ์˜ฌ๋ฆฌ๋ ค๋Š” ๊ธ€์ด ๋ณ„๋กœ ์—†์–ด ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์•„์ฃผ ๊ฐ„๋‹จํ–ˆ๋‹ค.

 

localStorage ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ์žˆ์œผ๋ฏ€๋กœ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ volumes๋ฅผ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
{๋กœ์ปฌ์—์„œ์˜ ๊ฒฝ๋กœ}:{๋„์ปค์—์„œ์˜ ๊ฒฝ๋กœ}

 

์„œ๋ฒ„์—์„œ /app/binaryContentStorage ๊ฒฝ๋กœ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉด
๋กœ์ปฌ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ./localStorage์— ํŒŒ์ผ์ด ์ €์žฅ๋œ๋‹ค.
์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ ๋„์›Œ๋„ ํŒŒ์ผ์ด ๊ณ„์† ์œ ์ง€๋œ๋‹ค.

version: '3'
services:
  app:
    build: .
    image: discodeit:local
    # โœ… ์ด ๋ถ€๋ถ„!!!
    volumes:
      - ./localStorage:/app/binaryContentStorage
    environment:
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    ports:
      - 8081:8080

 

์ด๋•Œ ์ฝ”๋“œ์—์„œ ๊ฒฝ๋กœ ์„ค์ •์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
์„œ๋ฒ„์—์„œ /app/binaryContentStorage์— ์ €์žฅํ• ๊ฑฐ๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ
์ฝ”๋“œ์—์„œ๋„ ํŒŒ์ผ ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ /app/binaryContentStorage๋กœ ์ˆ˜์ •ํ•œ๋‹ค.

 

public class LocalBinaryContentStorage implements BinaryContentStorage {

  private Path root = Paths.get("/app/binaryContentStorage");

  ...

}

PostgreSQL ๋ณผ๋ฅจ

version: '3'
services:
  app:
      (์ƒ๋žต)
  db:
    image: postgres:14
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgresql-data:/var/lib/postgresql/data

volumes:
  postgresql-data:

 

์ด๋•Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์€ .env ํŒŒ์ผ์— ์ €์žฅํ•˜์˜€๋‹ค.
.env ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋„์–ด์“ฐ๊ธฐ์— ์ฃผ์˜ํ•˜์ž.
DB_USERNAME=discodeit_user์ฒ˜๋Ÿผ = ์ „ํ›„๋กœ ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.

PostgreSQL ์„œ๋น„์Šค ์‹คํ–‰ ํ›„ schema.sql ์ž๋™ ์‹คํ–‰

volumes์— docker-entrypoint-initdb.d ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

{๋กœ์ปฌ ํ”„๋กœ์ ํŠธ์˜ schema.sql ์œ„์น˜}:{/docker-entrypoint-initdb.d/schema.sql}

    volumes:
      - postgresql-data:/var/lib/postgresql/data
      - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql

Unable to determine Dialect without JDBC metadata

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ
JPA ์„ค์ •์ด ๋ˆ„๋ฝ๋๋Š”์ง€ DB ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

[์ž˜๋ชป๋œ docker-compose]

version: '3'
services:
  app:
    build: .
    image: discodeit:local
    volumes:
      - ./localStorage:/app/binaryContentStorage
    ports:
      - 8081:8080
    depends_on:
      - db
  db:
    image: postgres:14
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgresql-data:/var/lib/postgresql/data
      - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql

volumes:
  postgresql-data:

 

[์˜ฌ๋ฐ”๋ฅธ docker-compose]

version: '3'
services:
  app:
    build: .
    image: discodeit:local
    volumes:
      - ./localStorage:/app/binaryContentStorage
    โœ… ์ด ๋ถ€๋ถ„!
    environment:
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    ports:
      - 8081:8080
    depends_on:
      - db
  db:
    image: postgres:14
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgresql-data:/var/lib/postgresql/data
      - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql

volumes:
  postgresql-data:

 

PostgreSQL์—๋งŒ db๋ช…, user, password๋ฅผ ์„ค์ •ํ–ˆ์—ˆ๋Š”๋ฐ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ yaml์— DB ์ •๋ณด๋ฅผ ์จ์•ผ ํ•˜๋‹ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ์ตœ์ข… ์™„์„ฑ๋œ ๋‚˜์˜ docker-compose.yml ํŒŒ์ผ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

version: '3'
services:
  app:
    build: .
    image: discodeit:local
    volumes:
      - ./localStorage:/app/binaryContentStorage
    environment:
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: ${DB_NAME}
    ports:
      - 8081:8080
    depends_on:
      - db
  db:
    image: postgres:14
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgresql-data:/var/lib/postgresql/data
      - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql

volumes:
  postgresql-data:

์ถ”๊ฐ€: ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ enum ํƒ€์ž… ๋ฌธ์ œ

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” enum ํƒ€์ž…๊ณผ ๊ด€๋ จํ•ด SQL ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์—†๋Š”๋ฐ

enum ํƒ€์ž…์ด ์ปฌ๋Ÿผ์œผ๋กœ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ insert ์‹œ๋„ํ•˜๋‹ˆ๊นŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

2025-04-09 09:54:35.643 UTC [72] ERROR:  column "type" is of type channel_type but expression is of type character varying at character 88
2025-04-09 18:54:35 db-1   | 2025-04-09 09:54:35.643 UTC [72] HINT:  You will need to rewrite or cast the expression.
2025-04-09 18:54:35 db-1   | 2025-04-09 09:54:35.643 UTC [72] STATEMENT:  insert into channels (created_at,description,name,type,updated_at,id) values ($1,$2,$3,$4,$5,$6)

 

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” enum ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ
๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝํ—˜์„ ์ €๋ฒˆ์— ํ•ด๋ณด์•„์„œ
๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ ์ฝ”๋“œ์—์„œ ๋‘ ๊ฐœ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹จ๋‹ค.
@Enumerated(EnumType.STRING)๊ณผ @JdbcTypeCode(SqlTypes.NAMED_ENUM)์„ ๋‹จ๋‹ค.

์กฐ๊ธˆ ๋” ๋งˆ์Œ ํŽธํ•˜๊ฒŒ ๊ฐ€๋ณด์ž๋ฉด DB์—์„œ๋Š” ๊ทธ๋ƒฅ enum ์•ˆ ์“ฐ๊ณ  VARCHAR๋กœ ์“ฐ๋Š” ๊ฒŒ ๋‚˜์„ ์ˆ˜๋„..

@Entity
@Table(name = "channels")
@NoArgsConstructor
@Getter
public class Channel extends BaseUpdatableEntity {

  String name;
  String description;
  ๐Ÿ’ก ์ด ๋ถ€๋ถ„!
  @Enumerated(EnumType.STRING)
  @JdbcTypeCode(SqlTypes.NAMED_ENUM)
  ChannelType type;
๋ฐ˜์‘ํ˜•