@Value는 스프링 프레임워크에서 프로퍼티의 값을 필드, 메서드, 생성자 파라미터에 주입할 때 사용하는 어노테이션입니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class DatabaseConfig {
@Value("${database.url}")
private String url;
@Value("${database.username}")
private String username;
@Value("${database.password}")
private String password;
// getter, setter, 기타 메서드...
}
application.properties 또는 application.yml 파일의 값을 주입할 수 있습니다.@Value("${app.timeout:30}")
private int timeout;
여기서 app.timeout 프로퍼티가 정의되지 않았다면 기본값 30이 사용됩니다.
@Value("#{systemProperties['user.home']}")
private String userHome;
@Value("#{serverConfig.url}")
private String url;
@Value("#{2 * 4}")
private int calculatedValue;
@Value("${JAVA_HOME}")
private String javaHome;
@Value는 개별 프로퍼티를 주입할 때 유용하지만, 관련된 여러 프로퍼티를 하나의 클래스로 바인딩할 때는 @ConfigurationProperties가 더 적합할 수 있습니다.
// @Value 사용
@Component
public class AppConfig {
@Value("${app.name}")
private String appName;
@Value("${app.description}")
private String appDescription;
}
// @ConfigurationProperties 사용
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String description;
// getter, setter
}
@Value와 프로파일을 함께 사용하여 환경별로 다른 값을 설정할 수 있습니다:
@Value("${message:Default Hello}")
private String message;
그리고 application-dev.properties와 application-prod.properties 파일에서 각각 다른 값을 설정할 수 있습니다.
@Value를 사용하여 컬렉션 타입의 값도 주입할 수 있습니다:
@Value("${server.ports}")
private List<Integer> serverPorts;
이 경우 application.properties에서 다음과 같이 정의할 수 있습니다:
server.ports=8080,8081,8082
@Value로 주입된 값을 테스트할 때는 @TestPropertySource를 사용할 수 있습니다:
@SpringBootTest
@TestPropertySource(properties = {
"database.url=jdbc:h2:mem:testdb",
"database.username=sa",
"database.password="
})
class DatabaseConfigTest {
@Autowired
private DatabaseConfig databaseConfig;
@Test
void testDatabaseProperties() {
assertEquals("jdbc:h2:mem:testdb", databaseConfig.getUrl());
assertEquals("sa", databaseConfig.getUsername());
assertEquals("", databaseConfig.getPassword());
}
}
@Value를 사용할 때 순환 참조가 발생하지 않도록 주의해야 합니다.@Value는 빈 생성 시점에 값을 주입하므로, 지연 초기화가 필요한 경우 다른 방법을 고려해야 합니다.null이 주입될 수 있으므로, 필요하다면 기본값을 설정하거나 null 체크를 해야 합니다.@Value 어노테이션은 스프링 애플리케이션에서 외부 설정 값을 쉽게 주입할 수 있게 해주는 강력한 도구입니다. 이를 통해 애플리케이션의 구성을 외부화하고, 다양한 환경에서 유연하게 동작하도록 만들 수 있습니다. 그러나 너무 많은 @Value 사용은 코드를 복잡하게 만들 수 있으므로, 적절한 상황에서 사용하는 것이 중요합니다.
@Configuration
@ConfigurationProperties
@Profile
@PropertySource
@Environment