Profiles


প্রায় প্রতিটি Spring Boot প্রজেক্টেই আমাদের আলাদা Environment থাকে — যেমনঃ

- development (লোকাল ডেভেলপমেন্টের জন্য)

- staging (টেস্ট সার্ভার),

- production (লাইভ সার্ভার)

প্রত্যেক Environment-এ আলাদা আলাদা কনফিগারেশন দরকার হয় — যেমন Database URL, Logging level, API key ইত্যাদি। এখানেই Spring Profiles আমাদের জীবন সহজ করে দেয়।


Spring Profile কী?

Spring Profile basically একটি লজিক্যাল গ্রুপ, যেখানে তুমি environment অনুযায়ী ভিন্ন configuration define করতে পারো। Spring Boot runtime-এ নির্দিষ্ট করে দেয় কোন profile active থাকবে, এবং সেই অনুযায়ী configuration লোড হয়।


উদাহরণ ১: আলাদা Properties ফাইল ব্যবহার করা

তুমি আলাদা ফাইল তৈরি করতে পারো প্রতিটি environment এর জন্য 

src/main/resources/
├── application.yml
├── application-dev.yml
├── application-prod.yml


application.yml

spring:
  profiles:
    active: dev


application-dev.yml

server:
  port: 8081

spring:
  datasource:
    url: jdbc:h2:mem:devdb
    username: dev
    password: secret


application-prod.yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:postgresql://prod-db:5432/myapp
    username: prod_user
    password: strongpass


Runtime এ কী হয়:
যখন তুমি অ্যাপ চালাও, তখন spring.profiles.active হিসেবে যেটা সেট করা থাকবে (এখানে dev), সেই ফাইলটি active হয় এবং অন্যগুলো ignore হয়।


উদাহরণ ২: Command Line দিয়ে Profile পরিবর্তন করা

তুমি চাইলে runtime এ profile বদলে দিতে পারো, properties ফাইল না পাল্টিয়েই।

# development profile এ রান করতে
mvn spring-boot:run -Dspring-boot.run.profiles=dev

# production profile এ রান করতে
mvn spring-boot:run -Dspring-boot.run.profiles=prod


অথবা JAR ফাইল রান করার সময় 

java -jar app.jar --spring.profiles.active=prod


উদাহরণ ৩: @Profile অ্যানোটেশন ব্যবহার করে Bean conditionally লোড করা

public interface MessageService {
    String getMessage();
}
@Service
@Profile("dev")
public class DevMessageService implements MessageService {
    @Override
    public String getMessage() {
        return "Hello from Development Environment!";
    }
}
@Service
@Profile("prod")
public class ProdMessageService implements MessageService {
    @Override
    public String getMessage() {
        return "Hello from Production Environment!";
    }
}

এখন যদি spring.profiles.active=dev থাকে, তাহলে DevMessageService bean লোড হবে।
আর যদি prod, তাহলে ProdMessageService লোড হবে।


উদাহরণ ৪: Multi-profile Configuration

একাধিক প্রোফাইল একসাথে activate করা যায়

spring:
  profiles:
    active: dev,api

তাহলে Spring Boot একাধিক configuration একত্রে merge করে লোড করবে।
ধরা যাক তোমার আছে application-api.yml এবং application-dev.yml
তাহলে উভয় ফাইলের কনফিগ একসাথে merge হবে।


উদাহরণ ৫: Programmatically Active Profile সেট করা

তুমি চাওলে Java কোড থেকেই active profile সেট করতে পারো:

@SpringBootApplication
public class ProfileDemoApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(ProfileDemoApplication.class);
        app.setAdditionalProfiles("dev");
        app.run(args);
    }
}


উদাহরণ ৬: Profile-specific Logging

তুমি চাওলে আলাদা logging config রাখতে পারো environment অনুযায়ী:

logback-spring.xml
logback-dev.xml
logback-prod.xml

এগুলোও একইভাবে profile অনুযায়ী active হবে।