Skip to main content
0

จัดการ Environment Variables ใน Spring Boot

ช่วงนี้กระแส 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

https://github.com/cdimascio/dotenv-java

2

แนะนำสำหรับคุณ

Close Menu

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า