간단한 설명
프로젝트를 진행하다 보면 시크릿 키와 같이 외부에 노출해서는 안되는 값들을 사용할 때가 있습니다.
만약 코드 내부에 시크릿 키를 저장하고 사용할 경우 외부에 노출될 위험이 커집니다.
이럴 경우 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 |