일반적으로 객체, 시스템의 특정, 속성, 설정 등을 작성하기 위해 application.properties / application.yml 파일을 사용합니다.
공통으로 사용될 내용들을 작성하기도 하지만, IP 등과 같은 중요 정보를 노출하지 않도록 보안적인 측면도 있습니다.
Properties
// application.properties
## 서버 포트
server.port=1004
## 로그
logging.config=classpath:logback-spring.xml
logging.level.root=INFO
logging.level.com.aroundview=DEBUG
## 데이터베이스
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:sqlserver://https://li-yo.tistory.com:1004;databaseName=LIYO;encrypt=true;trustServerCertificate=true;
spring.datasource.username=liyo
spring.datasource.password=liyoPassword
spring.datasource.hikari.idle-timeout=10000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.validation-timeout=10000
spring.datasource.hikari.max-lifetime=300000
spring.datasource.hikari.connection-test-query=SELECT 1
위 코드는 **프로퍼티 파일** 형식으로 기본 설정 중 일부를 작성하였습니다. **Key = Value** 형식으로 작성합니다.
불필요한 공백이 들어가지 않도록 주의가 필요합니다.
아직 정확한 원인을 찾아내지는 못 하였습니다만,
가끔 끝에 공백이 들어가 빌드에 문제가 생긴 사례가 있습니다.
툴이나 클린 여부 캐시 등의 원인이 있을 것으로 예상되오나 사전 방지 차원에서 주의하는 것이 좋겠습니다. ㅎ ㅎ
YAML
// application.yml
server:
port: 1004
logging:
config: classpath:logback-spring.xml
level:
root: INFO
com.aroundview: DEBUG
spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:sqlserver://https://li-yo.tistory.com:1004;databaseName=LIYO;encrypt=true;trustServerCertificate=true;
username: liyo
password: liyoPassword
hikari:
idle-timeout: 10000
connection-timeout: 10000
validation-timeout: 10000
max-lifetime: 300000
connection-test-query: SELECT 1
위 코드는 얌(YAML) 형식입니다.
계층적 구조를 지원하며, 중첩된 설정을 쉽게 표현할 수 있습니다.
들여 쓰기를 통해 부모-자식 관계가 명확하게 보이며, 가독성이 좋고 시각적으로 이해하기 쉽습니다.
# application.properties
app.name=Liyo
app.version=1.0.0
위의 프로퍼티 설정 내용을 기반으로 각 클래스에서 **properties** 값을 가져와서 사용할 수 있는 설정들을 정리해 보겠습니다.
1. ⭐@Value⭐ 어노테이션 사용
@Value
어노테이션은 Spring에서 properties 파일에 정의된 값을 간단하게 주입할 때 사용됩니다.
빈(Bean) 생성시점에 값을 주입하여 받아오며, 사용할 클래스(Class)에 빈(Bean) 주입이 있어야 값을 가져올 수 있습니다.
@Conponent, #Controller, @Service, @Configuration 어노테이션을 사용하는 클래스에서 자주 사용됩니다.
SpringBoot 에서 빈을 주입할 수 있는 어노테이션은 관련은 아래 게시물에 정리해 두었습니다.
@Value("${app.name}")
private String appName;
@Value("${app.version}")
private String appVersion;
위와 같은 형태로 properties 에서 작성한 key 부분을 ${}
로 감싸줍니다.
주의할 점은 static 변수에는 Properties 의 값을 가져올 수 없습니다. Global 로 사용할 경우 전용 설정이 따로 필요합니다.,.
이 때문에 고생 좀 했습니다.. ㅠㅠ 추후에 관련 정보를 다루도록 하겠습니다.
@Value("${app.name}")
private static String appName;
위와 같이 static 변수로는 사용할 수 없으니 반드시 확인합니다!
2. ⭐@ConfigurationProperties ⭐ 어노테이션 사용
@ConfigurationProperties
어노테이션은 여러 설정 값을 한 번에 바인딩할 때 유용합니다.
특히 복잡한 구조의 설정 값을 매핑할 때 유리합니다.
//application.propertire
spring.mqtt.brokerUrl=tcp://li-yo.tistory.com:1883
spring.mqtt.port=1833
spring.mqtt.subtopic=LIYO/V1/ABC/+/OUTBOX
spring.mqtt.pubtopic=LIYO/V1/ABC/+/INBOX
spring.mqtt.qos=1
spring.mqtt.password=litoPassword
spring.mqtt.apikey =liyoApikey
spring.mqtt.apiurl =https://li-yo.tistory.com:1004
package com.liyo.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import lombok.Data;
@ConfigurationProperties(prefix = "spring.mqtt")
@Component
@Data
public class MqttProperties {
private String brokerUrl;
private int port;
private int qos;
private String subtopic;
private String apikey;
private String apiurl;
}
MQTT 관련 링크 서버를 만들 때 사용했던 컴포넌트 클래스를 예시로 가져왔습니다.
위와 같이 (prefix = "") 를 통해 properties 의 값을 가져올 수 있습니다.
3. 클래스(Class)에 빈(Bean) 주입
2번에서 생성한 Properties 에 담긴 값들을 전용으로 관리하는 컴포넌트 클래스를 생성하고, 사용할 클래스에 빈으로 주입하여 Properties 의 값을 가져올 수 있습니다.
해당 컴포넌트 클래스를 사용할 다른 클래스에서 빈으로 주입해줍니다.
@Log4j2
@Configuration
public class MqttConfig {
@Autowired
MqttProperties mqttProperties;
@Autowired 어노테이션을 사용해서 다른 Bean 과의 의존성을 자동으로 주입하여 사용하는 코드입니다.
MqttProperties mqttProperties = new MqttProperties();
주의해야 할 점은 클래스 생성 시에 new로 새로 생성하게 되면 스프링 컨테이너에서 관리되지 않아 @Vaule 값이 지정되지 않습니다. 초기화가 되기 때문이죠!
반드시 @Autowired 어노테이션을 사용해서 다른 Bean 과의 의존성을 자동으로 주도록 합니다!
4. ⭐@PropertySource⭐ 어노테이션 사용
@PropertySource
어노테이션은 특정 설정파일을 명시적으로 로드할 때 사용합니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:config.properties")
public class LiyoConfig {
@Value("${app.name}")
private String appName;
@Value("${app.version}")
private String appVersion;
// getters and setters
public String getAppName() {
return appName;
}
public String getAppVersion() {
return appVersion;
}
}
가독성을 위해서 비슷한 설정값을 모아둔 전용 프로퍼티 파일을 생성할 경우,
혹은 특정 서비스에서만 해당 프로퍼티를 사용하는 경우 사용할 수 있습니다.
5. ⭐Environment⭐ 객체 사용
Spring의 Environment
객체를 사용해서 설정 파일의 값을 직접 가져올 수 있습니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class LiyoProperties {
@Autowired
private Environment env;
public String getAppName() {
return env.getProperty("app.name");
}
public String getAppVersion() {
return env.getProperty("app.version");
}
}
6. ⭐@EnableConfigurationProperties⭐ 어노테이션 사용
~@EnableConfigurationProperties` 어노테이션을 사용하여 특정 클래스의 @ConfigurationProperties를 활성화할 수 있습니다.
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@ConfigurationProperties(prefix = "app")
class LiyoProperties {
private String name;
private String version;
// getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
@Configuration
@EnableConfigurationProperties(LiyoProperties.class)
public class LiyoConfig {
}
요약
Spring Boot에서 properties 파일의 값을 가져오는 방법은 다양합니다.
각 방법은 상황에 따라 다르게 사용될 수 있으며, 다음과 같은 어노테이션 및 기술을 사용합니다:
- @Value
- @ConfigurationProperties
- @PropertySource
- Environment
- @Autowired
- @EnableConfigurationProperties
이들 방법을 적절히 조합하여 애플리케이션의 설정을 유연하고 관리하기 쉽게 만들 수 있습니다.
'Java > Spring' 카테고리의 다른 글
[Spring/SpringBoot] 빈(Bean) 생성하는데 사용되는 어노테이션 정리 (0) | 2024.07.31 |
---|