스프링 부트에서 커스텀 프로퍼티 파일을 사용하면, application.properties 외에 추가로 설정 파일을 분리하여 환경 설정을 관리할 수 있습니다. 이를 통해 특정 기능별로 설정 파일을 관리하거나, 환경별 설정을 명확하게 구분할 수 있습니다.
우선, data.properties라는 파일을 src/main/resources 경로에 생성합니다. 이 파일에 사용자 정의 설정값을 추가합니다.
data.propertiesapp.name=My Custom Spring Boot App
app.description=This is a custom property file example.
app.version=1.0.0
@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 어노테이션: 각 설정값을 주입받아 클래스 필드에 저장합니다.@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.으로 시작하는 모든 프로퍼티를 필드에 매핑합니다.application.properties에서 추가 설정 (선택 사항)커스텀 파일을 명시적으로 추가하려면, application.properties에 spring.config.additional-location을 설정할 수 있습니다.
spring.config.additional-location=classpath:data.properties
이제 CustomProperties나 AppProperties 빈을 주입받아 필요한 곳에서 설정 값을 사용할 수 있습니다.
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 빈을 통해 설정값을 출력합니다.data.properties와 같이 사용자 정의 설정 파일을 src/main/resources에 생성합니다.@PropertySource 또는 @ConfigurationProperties 사용: 커스텀 프로퍼티 파일을 스프링 컨텍스트에 로드하여 설정값을 빈으로 주입합니다.이렇게 하면 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);
}
}
```
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);
}
}