35 - Profiles และ Environment Variables
เป้าหมายของบท
Section titled “เป้าหมายของบท”บทนี้จะจัดระเบียบ configuration ให้รองรับหลาย environment เช่น local, test และ production
หลังจบบทนี้ผู้อ่านควรเข้าใจ:
- Spring profile คืออะไร
- แยก
application-dev.propertiesและapplication-prod.propertiesอย่างไร - ใช้ environment variable อย่างไร
- ค่า secret อะไรไม่ควร commit ลง Git
- run app ด้วย profile ที่ต้องการอย่างไร
โครงสร้างไฟล์ config
Section titled “โครงสร้างไฟล์ config”src/main/resources/ application.properties application-dev.properties application-test.properties application-prod.propertiesไฟล์กลาง application.properties ควรเก็บค่าที่ใช้ร่วมกัน
ไฟล์ profile เฉพาะเก็บค่าที่ต่างกันตาม environment
application.properties
Section titled “application.properties”spring.application.name=backend-apispring.profiles.active=${SPRING_PROFILES_ACTIVE:dev}
spring.jpa.open-in-view=falsespring.flyway.enabled=truespring.flyway.locations=classpath:db/migration
app.jwt.expiration-seconds=${JWT_EXPIRATION_SECONDS:86400}app.jwt.issuer=${JWT_ISSUER:backend-api}ค่า default profile เป็น dev เพื่อให้ local รันง่าย
application-dev.properties
Section titled “application-dev.properties”spring.datasource.url=${DB_URL:jdbc:postgresql://localhost:5432/secure_admin}spring.datasource.username=${DB_USERNAME:postgres}spring.datasource.password=${DB_PASSWORD:admin123}
spring.jpa.hibernate.ddl-auto=validatespring.jpa.show-sql=true
logging.level.com.example.backendapi=DEBUG
app.jwt.secret=${JWT_SECRET:0123456789012345678901234567890123456789012345678901234567890123}dev อาจมี default เพื่อให้เริ่มง่าย แต่ production ไม่ควรมี secret default
application-prod.properties
Section titled “application-prod.properties”spring.datasource.url=${DB_URL}spring.datasource.username=${DB_USERNAME}spring.datasource.password=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validatespring.jpa.show-sql=false
logging.level.com.example.backendapi=INFOlogging.level.org.springframework.security=WARN
app.jwt.secret=${JWT_SECRET}ถ้า production ไม่มี JWT_SECRET หรือ database config app ควร start ไม่สำเร็จ ดีกว่ารันด้วยค่า default ที่ไม่ปลอดภัย
run ด้วย profile
Section titled “run ด้วย profile”PowerShell:
$env:SPRING_PROFILES_ACTIVE="prod"java -jar build/libs/backend-api-0.0.1-SNAPSHOT.jarหรือ:
java -jar build/libs/backend-api-0.0.1-SNAPSHOT.jar --spring.profiles.active=prodค่าอะไรควรเป็น environment variable
Section titled “ค่าอะไรควรเป็น environment variable”- database URL
- database username/password
- JWT secret
- external API keys
- mail credentials
- cloud credentials
ห้าม commit ค่าเหล่านี้ลง Git
แบบฝึกหัดท้ายบท
Section titled “แบบฝึกหัดท้ายบท”- สร้าง
application-dev.properties - สร้าง
application-prod.properties - ย้าย database config ไปไว้ใน profile
- ย้าย JWT secret ไปใช้ environment variable
- รัน app ด้วย profile
dev - รัน app ด้วย profile
prodโดยส่ง env vars ให้ครบ