Spring - @Value

간단한 설명

프로젝트를 진행하다 보면 시크릿 키와 같이 외부에 노출해서는 안되는 값들을 사용할 때가 있습니다.

만약 코드 내부에 시크릿 키를 저장하고 사용할 경우 외부에 노출될 위험이 커집니다.

이럴 경우 application.properties 와 같은 파일에 보안이 필요한 값들을 넣어 두고 .gitignore 로 등록하여 외부에 노출이 되지 않게 하며 필요할 때 꺼내 쓰면 외부에 노출될 위험이 줄어듭니다.

 

이렇게 application.properties 에 보안이 필요한 값들을 꺼내오는 어노테이션이 바로 @Value 입니다.

사용

@Value 를 사용하기 전에 우리는 보안이 필요한 값을 저장할 수 있는 파일을 만들어야 합니다.

Spring 에서는 애플리케이션에서 사용하는 설정 값을 외부 파일인 test.properties 에 저장을 하거나 applicationContext.xml 에 저장해야 합니다.

어디다가 저장할 지는 선택사항 입니다. 또한 test 라는 이름은 개발자 마음대로 이름을 바꿔줄 수 있습니다.

 

2가지 방법

값을 가져오는 방법에는 2가지 방법이 있습니다.

 

1. PropertyPlaceholderConfigurer  - 가장 기본적인 방법

2. SpEL ( Spring Expression Language ) - 수학 연산, 문자열 조작등 다양한 작업에 더 유리

 

PropertyPlaceholderConfigurer

test.properties

my.value = "123";

 

Java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyConfig {
    
    @Value("${my.value}")
    private String value; // String value = "123";

    public int getConvertedValue() {
        // 수동으로 문자열을 숫자로 변환
        return Integer.parseInt(value);
    }

    public String getValue() {
        return value;
    }
}

// 추가적으로 기본값 제공 가능
@Value("#{my.value: default value}") // my.value 에 값이 없으면 default value 출력

 

SpEL ( Spring Expression Language )

SpEL 을 통한 능동 변환

 

application.properties

my.value = 123;

 

Java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyConfigWithSpEL {

    // SpEL을 사용하여 값을 읽으면서 바로 변환
    @Value("#{${my.value} * 2}")
    private int doubledValue;

    public int getDoubledValue() {
        return doubledValue;
    }
}

 

properties 를 이용

test.properties 에 값을 저장하고 사용하는 경우 Spring XML 설정을 사용하여 <util:properties> 를 활용해 프로퍼티 파일을 Bean 에 등록하고, SpEL 을 사용하여 해당 값을 참조할 수 있습니다.

 

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/util 
           http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- properties 빈 등록 -->
    <util:properties id="properties" location="classpath:test.properties"/>
</beans>

 

test.properties

db.driver=sampleDriverClass
db.url=jdbc:mysql://localhost:3306/mydb

db.username=root
db.password=password

 

test.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Test {

    // #{빈id['프로퍼티Key']}
    @Value("#{properties['db.driver']}")
    private String driver;

    @Value("#{properties['db.url']}")
    private String url;

    @Value("#{properties['db.username']}")
    private String username;

    @Value("#{properties['db.password']}")
    private String password;

    public void printProperties() {
        System.out.println("Driver: " + driver);
        System.out.println("URL: " + url);
        System.out.println("Username: " + username);
        System.out.println("Password: " + password);
    }
}

 

주의할 점

우리는 @Component 어노테이션을 통해서 객체를 스프링 빈으로 등록할 수 있습니다.

@Controller, @Service, @Repository 또한 모두 @Component 어노테이션을 포함하고 있기 때문에 스프링 빈으로 등록할 수 있습니다. @Value 어노테이션은 앞서 말한 어노테이션을 스프링 빈으로 등록을 하고 의존 관계를 주입할 때 동작합니다. 따라서 @Value 는 항상 @Component 어노테이션과 함께 사용합니다.

 

'Spring' 카테고리의 다른 글

Spring Bean 을 등록하는 3가지 방법  (1) 2024.12.19
스프링 빈(Bean) 이란?  (1) 2024.12.16
Spring - 경로 변수  (0) 2024.12.12
[Spring MVC] - QueryString  (0) 2024.12.12