Spring @Value 어노테이션

@Value 주석은 변수와 메소드 인자에 기본값을 할당하는 데 사용됩니다. 우리는 @Value 주석을 사용하여 스프링 환경 변수 및 시스템 변수를 읽을 수 있습니다. 스프링 @Value 주석은 SpEL도 지원합니다. 몇 가지 @Value 주석 사용 예를 살펴보겠습니다.

스프링 @Value – 기본값

우리는 @Value 주석을 사용하여 클래스 속성에 기본값을 할당할 수 있습니다.

@Value("Default DBConfiguration")
private String defaultName;

@Value 주석 인자는 문자열만 가능하지만 스프링은 지정된 유형으로 변환을 시도합니다. 아래 코드는 변수에 불리언 및 정수 값을 할당하여 정상적으로 작동합니다.

@Value("true")
private boolean defaultBoolean;

@Value("10")
private int defaultInt;

스프링 @Value – 스프링 환경 속성

@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;

키가 스프링 환경 속성에서 찾을 수 없는 경우 속성 값은 ${APP_NAME_NOT_FOUND}가 됩니다. 키가 스프링 환경 속성에서 누락된 경우 할당할 기본값을 할당할 수 있습니다.

@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;

스프링 @Value – 시스템 환경

스프링 환경이 채워지면 시스템 환경 변수를 모두 읽고 속성으로 저장합니다. 따라서 @Value 어노테이션을 사용하여 시스템 변수도 할당할 수 있습니다.

@Value("${java.home}")
private String javaHome;
	
@Value("${HOME}")
private String homeDir;

스프링 @Value – SpEL

@Value 어노테이션과 함께 스프링 표현 언어를 사용할 수도 있습니다. 따라서 SpEL을 사용하여 자바 홈 시스템 속성을 읽을 수도 있습니다.

@Value("#{systemProperties['java.home']}")
private String javaHome;

스프링 @Value 메서드와 함께

@Value 어노테이션이 메서드에서 발견되면, 스프링 컨텍스트는 모든 스프링 구성 및 빈이 로드될 때 호출합니다. 메서드에 여러 인수가 있는 경우, 각 인수 값은 메서드 어노테이션에서 매핑됩니다. 다른 인수에 대해 다른 값을 원하는 경우, 인수와 함께 직접 @Value 어노테이션을 사용할 수 있습니다.

@Value("Test")
public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test' 
@Value("Test")
public void printValues(String s, @Value("Data") String v){}
// s=Test, v=Data

스프링@Value 예제

간단한 스프링 애플리케이션을 만들어보겠습니다. 여기서 우리는 클래스 변수에 속성을 읽어서 할당할 것입니다. 메이븐 프로젝트를 생성하고 스프링 코어 종속성을 추가합니다.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

최종 프로젝트 구조는 아래 이미지와 같이 보일 것입니다. 각 구성 요소를 하나씩 살펴보겠습니다. 변수 값이 @Value 어노테이션을 통해 주입될 컴포넌트 클래스를 만듭니다.

package com.journaldev.spring;

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

public class DBConnection {

	@Value("${DB_DRIVER_CLASS}")
	private String driverClass;
	@Value("${DB_URL}")
	private String dbURL;
	@Value("${DB_USERNAME}")
	private String userName;
	@Value("${DB_PASSWORD}")
	private char[] password;

	public DBConnection() {
	}

	public void printDBConfigs() {
		System.out.println("Driver Class = " + driverClass);
		System.out.println("DB URL = " + dbURL);
		System.out.println("User Name = " + userName);

		// 생산 환경에서 아래 코드를 사용하지 마세요. :D
		System.out.println("Password = " + String.valueOf(password));
	}
}

이제 Configuration 클래스를 만들고 DBConnection 클래스에 대한 @Bean 메서드를 제공해야합니다.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound = true)
public class DBConfiguration {

	@Value("Default DBConfiguration")
	private String defaultName;

	@Value("true")
	private boolean defaultBoolean;

	@Value("10")
	private int defaultInt;

	@Value("${APP_NAME_NOT_FOUND:Default}")
	private String defaultAppName;

	// @Value("#{systemProperties['java.home']}")
	@Value("${java.home}")
	private String javaHome;

	@Value("${HOME}")
	private String homeDir;

	@Bean
	public DBConnection getDBConnection() {
		DBConnection dbConnection = new DBConnection();
		return dbConnection;
	}

	@Value("Test")
	public void printValues(String s, @Value("another variable") String v) {
		System.out.println("Input Argument 1 =" + s);
		System.out.println("Input Argument 2 =" + v);

		System.out.println("Home Directory = " + homeDir);
		System.out.println("Default Configuration Name = " + defaultName);
		System.out.println("Default App Name = " + defaultAppName);
		System.out.println("Java Home = " + javaHome);
		System.out.println("Boolean = " + defaultBoolean);
		System.out.println("Int = " + defaultInt);

	}

}

여기는 주요 클래스입니다. 여기서는 어노테이션 기반의 스프링 컨텍스트를 생성하고 있습니다.

package com.journaldev.spring;

import java.sql.SQLException;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringMainClass {

	public static void main(String[] args) throws SQLException {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.scan("com.journaldev.spring");
		context.refresh();
		System.out.println("Refreshing the spring context");
		DBConnection dbConnection = context.getBean(DBConnection.class);

		dbConnection.printDBConfigs();
		
		 // 스프링 컨텍스트를 닫습니다.
		context.close();
	}

}

클래스를 실행하면 다음과 같은 출력이 생성됩니다.

Input Argument 1 =Test
Input Argument 2 =another variable
Home Directory = /Users/pankaj
Default Configuration Name = Default DBConfiguration
Default App Name = Default
Java Home = /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Boolean = true
Int = 10
Refreshing the spring context
Driver Class = com.mysql.jdbc.Driver
DB URL = jdbc:mysql://localhost:3306/Test
User Name = journaldev
Password = journaldev

구성 클래스 printValues()가 사용자 요청을 처리할 준비가 될 때보다 먼저 호출되는 것에 유의하십시오. 이것으로 스프링 @Value 어노테이션 예제에 관한 설명이 끝났습니다. GitHub 저장소에서 예제 코드를 다운로드할 수 있습니다.

스프링 @Value 어노테이션 프로젝트

Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation