Name | Version |
---|---|
Spring Boot | 3.1.2 |
java | 17 |
PostgreSQL | 15 |
IDE | IntelliJ |
프로젝트를 시작하며 가장 먼저 떠오른 것은 properties File의 분리였다.
그 이유는 외부 API Key를 발급받아 사용할 예정이었고, GitHub에 프로젝트 코드를 올릴 생각이었기 때문이다.
그래서 Spring Boot에서는 어떻게 파일을 분리하여 사용하는지에 대하여 알아보니 Profile을 사용하여 분리가 가능하다는 사실을 알게 되었다
spring:
profiles:
active: # 활성화 시킬 profile - 로 구분
- local
include: # application-[name] 파일 내용을 포함시키기
- db
- oauth
group: # 그룹화 시켜 가져오기 위한 설정, profile 값 중 key와 일치할 경우 가져오기.
local:
- db-local
dev:
- db-dev
prod:
- db-prod
TestCode를 작성할 때, IDE로 설정을 변경하거나 yaml파일을 매번 변경하지 않고 @ActiveProfiles Annotation을 사용한다.
@ActiveProfiles("profile")
// Profiles라는 이름이기에 여러 값을 사용할 수 있을 것 같아 공식문서를 찾아보니
@ActiveProfiles({"profile1", "profile2"})
// 위와 같은형태로 사용이 가능하였다.
이후 .gitignore에 application-*.yaml를 추가하여 주었다.
# application-db.yaml
--- # Local
spring:
config:
activate:
on-profile: "db-local"
jpa:
show-sql: true
database-platform: postgresql
hibernate:
ddl-auto: create
datasource:
url: jdbc:postgresql://localhost:5432/ShoppingMall
username: username
password: userpw
driver-class-name: org.postgresql.Driver
logging:
level:
com.zaxxer.hikari: TRACE
com.zaxxer.hikari.HikariConfig: DEBUG
--- # Dev
이 상태로 일단 실행부터 해보았다.
에러가 발생하였다.
에러문을 통해 검색 해보자 properties.hibernate.dialect 를 추가 해줘야 했다.
jpa:
show-sql: true
database-platform: postgresql
hibernate:
ddl-auto: create
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
Diarect(방언)는 Jpa가 db에 맞는 문법을 만들기 위해 필요한 설정이다.
너무나도 당연한 이야기지만 각 DB마다 query문의 차이가 있기에 Jpa가 어떤 문법을 따라야 하는지 정의가 필요했다.
하지만 여기서 한 가지 의문이 들었다.
이전에는 database-platform, dialect와 같은 설정을 한 경험이 없었다.
그래서 알아보니 Spring Boot의 경우 내부에서 dialect를 자동으로 설정하고 있었다.
jpa:
show-sql: true
hibernate:
ddl-auto: create
그래서 위와 같은 코드로 수정을 해보자 정상 작동 하였다.
(- 추가 2023-08-02 21:31:06 -)
DataSource 자동 구성에서 DriverClassName을 찾아서 넣어주기에 driver-class-name의 값을 주지 않아도 된다.
Profile에 대해 알아보던 중 설정을 .env파일로 관리할 수 있다는 사실을 알게 되었다.
# .env
POSTGRESQL_USERID = "UserId"
POSTGRESQL_USERPW = "UserPw"
POSTGRESQL_URL = "url"
# application-db.yaml
datasource:
url: ${POSTGRES_URL}
username: ${POSTGRES_ID}
password: ${POSTGRES_PW}
IntelliJ의 경우 IDE에서 직접 환경변수를 설정해줄 수 있지만 .env로 정의 한다면 혹여 다른 언어에서도 같은 설정을 원할 경우 .env만 옮기면 끝이므로 사용하기로 결정하였다.