[Day 26 | Spring] 커스텀 프로퍼티 파일 사용하기

y♡ding·2024년 11월 18일

데브코스 TIL - Spring

목록 보기
10/46

스프링 부트에서 커스텀 프로퍼티 파일을 사용하면, application.properties 외에 추가로 설정 파일을 분리하여 환경 설정을 관리할 수 있습니다. 이를 통해 특정 기능별로 설정 파일을 관리하거나, 환경별 설정을 명확하게 구분할 수 있습니다.

1. 커스텀 프로퍼티 파일 생성

우선, data.properties라는 파일을 src/main/resources 경로에 생성합니다. 이 파일에 사용자 정의 설정값을 추가합니다.

예시: data.properties

app.name=My Custom Spring Boot App
app.description=This is a custom property file example.
app.version=1.0.0

2. @PropertySource로 커스텀 프로퍼티 파일 로드

커스텀 프로퍼티 파일을 스프링 애플리케이션에 로드하기 위해 @PropertySource 어노테이션을 사용합니다. 이 어노테이션을 통해 data.properties 파일의 값을 스프링 환경에 추가할 수 있습니다.

예시: CustomProperties 클래스

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:data.properties")
public class CustomProperties {

    @Value("${app.name}")
    private String name;

    @Value("${app.description}")
    private String description;

    @Value("${app.version}")
    private String version;

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public String getVersion() {
        return version;
    }
}
  • @PropertySource("classpath:data.properties"): data.properties 파일을 스프링 컨텍스트에 로드합니다.
  • @Value 어노테이션: 각 설정값을 주입받아 클래스 필드에 저장합니다.

3. @ConfigurationProperties로 프로퍼티 바인딩

@Value 어노테이션 대신 @ConfigurationProperties를 사용해 설정값을 클래스에 자동으로 바인딩할 수 있습니다. 이 방법은 여러 설정 값을 한 번에 바인딩하기에 유리하며, prefix를 통해 관련된 설정값을 그룹화할 수 있습니다.

예시: AppProperties 클래스

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String name;
    private String description;
    private String version;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}
  • @ConfigurationProperties(prefix = "app"): data.properties 파일에서 app.으로 시작하는 모든 프로퍼티를 필드에 매핑합니다.
  • Getters와 Setters: 필드에 값을 주입하기 위해 필요합니다.

application.properties에서 추가 설정 (선택 사항)

커스텀 파일을 명시적으로 추가하려면, application.propertiesspring.config.additional-location을 설정할 수 있습니다.

spring.config.additional-location=classpath:data.properties

4. 커스텀 프로퍼티 값 사용하기

이제 CustomPropertiesAppProperties 빈을 주입받아 필요한 곳에서 설정 값을 사용할 수 있습니다.

예시: AppService 클래스

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AppService {

    private final AppProperties appProperties;

    @Autowired
    public AppService(AppProperties appProperties) {
        this.appProperties = appProperties;
    }

    public void printAppInfo() {
        System.out.println("Application Name: " + appProperties.getName());
        System.out.println("Application Description: " + appProperties.getDescription());
        System.out.println("Application Version: " + appProperties.getVersion());
    }
}
  • 주입된 AppProperties을 통해 설정값을 출력합니다.

요약

  1. 커스텀 프로퍼티 파일 생성: data.properties와 같이 사용자 정의 설정 파일을 src/main/resources에 생성합니다.
  2. @PropertySource 또는 @ConfigurationProperties 사용: 커스텀 프로퍼티 파일을 스프링 컨텍스트에 로드하여 설정값을 빈으로 주입합니다.
  3. 설정 값 사용: 주입된 빈을 통해 애플리케이션에서 설정 값을 사용합니다.

이렇게 하면 application.properties와 분리된 별도의 프로퍼티 파일을 통해 설정 값을 관리할 수 있으며, 커스텀 설정 파일을 사용하는 방법을 쉽게 확장할 수 있습니다.


예제 코드
1. Properties

```java
spring.application.name=boot02

my.name=tester
my.fullname=${my.name} lecture
my.secret=${random.value}
```

```java
package org.example.boot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication
public class Boot02Application implements CommandLineRunner {

    @Value("${my.name}")
    private  String name;
    @Value("${my.fullname}")
    private String fullName;
    @Value("${my.secret}")
    private String secret;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Boot02Application.class);
        //app.addListeners(new CustomListener1(), new CustomListener2());
        app.run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("name: " + name);
        System.out.println("fullMame: " + fullName);
        System.out.println("secret: " + secret);
    }
}

```
  1. Working With YAML

    spring:
        application:
          name: boot02
    
    my:
        name: tester
    my:
        fullname: ${my.name} lecture
        secret: ${random.value}

data.properties의 데이터 가져와 사용하기

user.fullname=hong gil dong
user.age=30
package org.example.boot.model;

import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;

// 데이터를 가지는 빈 만들기
@Getter
public class User {

    @Value("${user.fullname")
    private String fullname;
    @Value("${user.age")
    private int age;
}

//-

package org.example.boot.config;

import org.example.boot.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.beans.BeanProperty;

@Configuration
@PropertySource(value = "classpath=data.properties")
public class BeanConfig {

    // 데이터를 실질적으로 넣어주는 과정
    @Bean
    public User user() {
        return new User();
    }
}

//-
package org.example.boot;

import org.example.boot.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Boot02Application implements CommandLineRunner {

    @Value("${my.name}")
    private  String name;
    @Value("${my.fullname}")
    private String fullName;
    @Value("${my.secret}")
    private String secret;

    @Autowired
    private ApplicationContext ctx;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Boot02Application.class);
        //app.addListeners(new CustomListener1(), new CustomListener2());
        app.run(args);
    }

    @Override
    public void run(String... args) throws Exception {
       /* System.out.println("name: " + name);
        System.out.println("fullMame: " + fullName);
        System.out.println("secret: " + secret);*/

        User user = ctx.getBean("user", User.class);
        System.out.println(user.getFullname());
        System.out.println(user.getAge());
    }
}

생성자

package org.example.boot.model;

import lombok.AllArgsConstructor;
import lombok.ToString;

@AllArgsConstructor
@ToString
public class User2 {

    private String fullname;
    private int age;
}

//- 

package org.example.boot.config;

import org.example.boot.model.User;
import org.example.boot.model.User2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource(value = "classpath=data.properties")
public class BeanConfig {

    @Autowired
    private Environment env;

    @Bean
    public User2 user2() {
        return new User2(env.getProperty("user.fullname"), Integer.parseInt(env.getProperty("user.age")));
    }
}

//- 
package org.example.boot;

import org.example.boot.model.User;
import org.example.boot.model.User2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Boot02Application implements CommandLineRunner {

    @Value("${my.name}")
    private  String name;
    @Value("${my.fullname}")
    private String fullName;
    @Value("${my.secret}")
    private String secret;

    @Autowired
    private ApplicationContext ctx;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Boot02Application.class);
        //app.addListeners(new CustomListener1(), new CustomListener2());
        app.run(args);
    }

    @Override
    public void run(String... args) throws Exception {

        User2 user2 = ctx.getBean("user2", User2.class);
        System.out.println(user2);
    }
}

0개의 댓글