๋ค์ด๊ฐ๋ฉด์
์ฝ๋์ ์คํ๋ฆฐํธ์์ ์งํํ ๋ฏธ์
์์
๋์ปค์ 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;
'๐ค ๋ฐฐํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํธ๋ฌ๋ธ์ํ ] ์คํ๋ง๋ถํธ ํ๋ก์ ํธ ๋์ปค๋ก ๋น๋ ์ค Unsupported class file major version 65 ์์ธ (1) | 2025.04.09 |
---|---|
[Docker] ์ด๋ฏธ์ง ๋ ์ด์ด ๊ตฌ์กฐ (0) | 2025.04.09 |
[๋ฐฐํฌ] ์ปจํ ์ด๋, ์ด๋ฏธ์ง ๊ฐ๋ (2) | 2025.04.08 |