본문 바로가기
Java/Spring

[Spring/SpringBoot] application 설정 값 가져오기

by 리요_ 2024. 8. 1.
반응형

일반적으로 객체, 시스템의 특정, 속성, 설정 등을 작성하기 위해 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 에서 빈을 주입할 수 있는 어노테이션은 관련은 아래 게시물에 정리해 두었습니다.

https://li-yo.tistory.com/entry/SpringSpringBoot-%EB%B9%88Bean-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94%EB%8D%B0-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%A0%95%EB%A6%AC

 

[Spring/SpringBoot] 빈(Bean) 생성하는데 사용되는 어노테이션 정리

스프링 및 스프링 부트에서 빈을 생성하는 데 사용되는 주요 어노테이션을 간략하게 정리해보았습니다.1. @Configuration@Configuration 어노테이션은 Java 기반의 설정을 통해 빈(Bean) 을 정의할 때 사용

li-yo.tistory.com

 

@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⭐ 객체 사용

SpringEnvironment 객체를 사용해서 설정 파일의 값을 직접 가져올 수 있습니다.

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

이들 방법을 적절히 조합하여 애플리케이션의 설정을 유연하고 관리하기 쉽게 만들 수 있습니다.

반응형