
ช่วงนี้กระแส Java และ Spring Boot ยังคงมาแรง ฮิตกันสุด ๆ โดยเฉพาะในสายงานองค์กรใหญ่ ๆ โดยเฉพาะด้านการเงิน การธนาคารที่เราจะเห็นตามเว็บสมัครงานที่เปิดรับกันเพียบ ซึ่งความเจ๋งของ Java เรามักจะได้ยินกับวลีที่ว่า “Java เก่าแต่เก๋า” หรือ “โปรเจคระดับ Enterprise ยังใช้ Java อยู่” ซึ่งหนึ่งในเหตุผลที่มันเป็นที่นิยมนั้นก็คือเฟรมเวิร์กที่ช่วยในการทำเว็บแอปให้เป็นเรื่องง่าย ปลอดภัย และรองรับการสเกลอย่าง Spring Boot

สำหรับความเจ๋งของภาษา Java เก่าแต่เก๋ายังไง? ทางเราก็ได้มีเป็นคลิปเต็ม ๆ ไว้ สามารถไปตำกันได้ที่ลิงก์นี้ได้เลยยย https://www.youtube.com/watch?v=fYbfO3kxB1k
🤔 ทำไมต้องใช้ Environment Variables?
สำหรับในบทความนี้เราจะมาอยู่ในประเด็นที่สำคัญของการใช้งาน Spring Boot นั่นก็คือ การจัดการ Environment Variables หรือตัวแปร ค่าต่าง ๆ ที่เราไม่ควรฝังมันไว้กับโค้ด อย่างเช่น URL ของฐานข้อมูล API Keys พอร์ตที่แอปรันอยู่ ค่าต่าง ๆ ที่เปลี่ยนแปลงไปตาม environments ที่ใช้ (เช่น Dev, Staging, Production)
การเก็บค่าเหล่านี้ไว้ในไฟล์แยกหรือ environment variables ช่วยให้แอปของเรามีความปลอดภัยและยืดหยุ่นมากขึ้น แทนที่เราจะไปแก้ไขค่าต่าง ๆ ในโค้ดโดยตรง เราสามารถกำหนดค่าพวกนี้ภายนอกและให้แอปอ่านค่าจาก environment ได้เลย
🚀 วิธีใช้ Environment Variables ใน Spring Boot
ซึ่งวิธีในการใช้งาน Environment Variables ใน Spring Boot เราสามารถทำได้หลายวิธีไม่ว่าจะเป็น
การใช้ Environment Variables ในอยู่ในไฟล์ application.properties หรือ application.yml ซึ่งเป็นไฟล์ config หลักของ Spring Boot
server.port=${SERVER_PORT}
bot.owner=${BOT_OWNER}
JavaScriptโดย Spring Boot จะดึงค่า ${SERVER_PORT} และ ${DATABASE_URL} จาก Environment Variables ที่เรากำหนดใน OS หรือจากไฟล์คอนฟิกนอกอีกที
ตัวอย่างเราสามารถกำหนดค่าไว้ใน OS ด้วยคำสั่ง set (Windows) หรือ export (macOS)
ตอนอ่านค่าในโค้ด Spring Boot เราสามารถใช้ @Value เพื่อ Inject ค่าเข้าไปได้เช่น
@Value("${server.port}")
private String serverPort;
@Value("${bot.owner}")
private String botOwner;
JavaScriptหรือจะใช้ Environment Class เพื่ออ่านค่าก็ได้เช่นกัน
@Autowired
private Environment environment;
public void printConfig() {
String port = environment.getProperty("server.port");
String owner = environment.getProperty("bot.owner");
System.out.println("Server Port: " + port);
System.out.println("Bot Owner: " + owner);
}
JavaScriptแต่วิธีที่แอดใช้จะเป็นการใช้ ไลบรารี dotenv-java มาช่วย โดยเพิ่ม dependency เข้าไปใน pom.xml:
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
<version>3.2.0</version>
</dependency>
JavaScriptเสร็จแล้วเราก็จะใช้คำสั่ง Dotenv.configure().load() เพื่อโหลดค่าต่าง ๆ จากไฟล์ .env เข้ามาในระบบ และทำให้ Spring Boot สามารถเข้าถึงค่าต่าง ๆ ได้โดยไม่ต้องฝังไว้ในโค้ดโดยตรง ซึ่งช่วยให้การบริหารจัดการค่า config ง่ายขึ้น และทำให้แอปของเรามีความยืดหยุ่นมากขึ้นอีกด้วย
แล้วทำการสร้างไฟล์ .env ไว้ที่ root ของโปรเจกต์ หรือใน src/main/resources/ แล้วใส่ค่าต่าง ๆ ที่เราต้องการเก็บไว้ เช่น:
ส่วนของการอ่านค่า Environment Variables ในโค้ด เราจะทำการโหลดไฟล์ .env และดึงค่าจาก SERVER_PORT มาใช้เป็นค่าของ server.port ทำให้เราสามารถเปลี่ยนพอร์ตของแอปได้โดยไม่ต้องไปแก้โค้ดโดยตรง
ตัวอย่างโค้ดจากไฟล์ DemoApplication.java
package com.example.demo;
import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
// โหลดค่า Environment Variables จากไฟล์ .env
Dotenv dotenv = Dotenv.configure().load();
// กำหนดค่าให้กับ System Property เพื่อให้ Spring Boot อ่านค่าได้
System.setProperty("server.port", dotenv.get("SERVER_PORT"));
// เรียกใช้งาน Spring Boot
SpringApplication.run(DemoApplication.class, args);
}
}
JavaScriptจากโค้ดข้างต้น เราจะเห็นได้ว่ามีการ import io.github.cdimascio.dotenv.Dotenv; เพื่อใช้งานไลบรารี dotenv-java สำหรับโหลดค่าตัวแปรจากไฟล์ .env หลังจากนั้นใช้
Dotenv dotenv = Dotenv.configure().load();
JavaScriptเพื่อโหลดค่าทั้งหมดเข้าสู่แอป และสังเกตว่าจะมีการใช้
System.setProperty("server.port", dotenv.get("SERVER_PORT"));
JavaScriptเพื่อกำหนดค่า server.port ให้กับ Spring Boot โดยค่าจะถูกดึงมาจากไฟล์ .env ทำให้เราสามารถเปลี่ยนพอร์ตได้ง่าย ๆ โดยไม่ต้องแก้ไขโค้ดหลักของแอป
เพื่อให้เห็นภาพมากยิ่งขึ้น เรามาลองสร้าง Controller เพิ่มขึ้นอีกตัวหนึ่งเพื่อให้ API สามารถดึงค่าจาก Environment Variables แล้วส่งออกมาเป็น JSON
โค้ดตัวอย่างจากไฟล์ BotController.java
package com.example.demo.controller;
import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class BotController {
private final Dotenv dotenv;
public BotController() {
this.dotenv = Dotenv.configure()
.directory("src/main/resources/") // ระบุที่อยู่ของไฟล์ .env
.ignoreIfMalformed()
.ignoreIfMissing()
.load();
}
@GetMapping("/info")
public Map<String, String> getInfo() {
return Map.of(
"message", "บอทช่วยเหลือนักเรียนพร้อมทำงาน!",
"serverPort", dotenv.get("SERVER_PORT", "8080"),
"botOwner", dotenv.get("BOT_OWNER", "Unknown")
);
}
}
JavaScriptโค้ดนี้เป็น Controller ที่อ่านค่าจาก .env และ return กลับมาเป็น JSON ไปให้ client ถ้าตัวแปรใดไม่มีใน .env จะใช้ค่า default ที่เรากำหนดไว้แทน เช่น serverPort จะเป็น 8080 ถ้าไม่มีค่า SERVER_PORT ในไฟล์ .env
หลังจากที่เราได้เพิ่ม Controller แล้ว เราสามารถทดสอบ API ได้โดยการรันแอปพลิเคชัน Spring Boot และเรียก API ที่ localhost:9000/api/info
หากทุกอย่างถูกต้อง เราจะได้ JSON response ประมาณนี้
จากที่เราทำมาทั้งหมด จะเห็นได้ว่าการใช้ Environment Variables ช่วยให้เราสามารถแยกค่าต่าง ๆ ออกจากโค้ด ไม่ต้อง Hard Code ไปตรง ๆ ให้มีความเสี่ยงอีกต่อไป แถมยังใช้ dotenv-java ที่ทำให้เราสามารถใช้งานกับ Spring Boot ได้อย่างง่ายดายอีกด้วย
หากใครอยากเรียนรู้เทคนิคดี ๆ แบบนี้เพิ่มเติม สามารถอ่านต่อได้ที่
https://www.baeldung.com/spring-boot-properties-env-variables