olrlobt

[Spring boot] @Value 어노테이션으로 application.properties의 값 가져오기 본문

Spring/Spring

[Spring boot] @Value 어노테이션으로 application.properties의 값 가져오기

olrlobt 2023. 3. 27. 20:32

@Value

Spring boot에서 제공하는 어노테이션 중 하나로, 빈(Bean) 생성 시점에 값을 주입하기 위해 사용된다.

 

주로 개발하면서 application.properties에 설정한 값들을 가져오기 위하여 사용되고,

개발하는 동안 변경이 자주 되는 경로와 같은 값들을 @Value로 가져와서 사용하기도 한다.

 


사용법

1. application.properties 작성

## 서버 포트
server.port=80


## 임의 경로 변수
ffmpeg.location=C:/ffmpeg/bin/ffmpeg.exe
ffprobe.location=C:/ffmpeg/bin/ffprobe.exe

## 임의 문자 변수
ffmpeg.text.hh=hi

 

Spring에서의 주요 설정, 파일경로와 같은 것들은 application.properties에서 위처럼  Key = Value  형식으로 관리된다.

나는 예시로 서버포트와 경로변수, 문자변수를 작성해 보았다.

 

 

2. Class에 Bean 주입

@Value는 앞서 설명한 바와 같이, 빈(Bean) 생성 시점에 값을 주입하기 위해서 사용된다. 따라서 사용할 Class에 Bean 주입은 필수 적이다.

 

Spring boot에서 Bean을 주입할 수 있는 대표적인 어노테이션은 다음과 같다.

 

  1. @Component: 스프링의 기본적인 빈 생성 어노테이션으로, 빈을 생성할 클래스에 붙인다.
  2. @Service:  비즈니스 로직이 포함된 클래스에 붙인다.
  3. @Repository:  데이터베이스와 관련된 작업을 수행하는 클래스에 붙인다.

이 외에도 @Controller, @RestController, @Configuration를 이용하여 주입할 수 있다.

 

 

 

또한 클래스 생성 시 new로 생성하게 될 경우, 스프링 컨테이너에서 관리되지 않기 때문에 @Value값이 지정되지 않는다. 따라서 @Autowired 어노테이션을 이용하여, 다른 Bean과의 의존성을 자동으로 주입해야 한다.

// 잘못된 선언 new
VideoFileUtils videoFileUtils = new VideoFileUtils();
		
videoFileUtils.media_player_time(file);
// 의존성 자동 주입
@Autowired
private VideoFileUtils videoFileUtils;

 

 

 

3. @Value로 변수 값 주입

@Value("${server.port}")
private String port;

@Value 어노테이션에서 값을 받아올 때는 위와 같이 사용한다.

application.properties에서 작성한 변수 부분을 "${}"로 감싸서 사용한다.

 

이때 주의할 사항은 static 변수에는 주입이 되지 않는다.

 

 

위 예시를 보면, 앞서 설정한 경로와 텍스트, 서버 포트가 잘 주입이 되어 있다.

 

하지만, ffprobePath의 경우 static으로 선언이 되어 있다.

 

 

이를 출력해 보면,

 

static으로 선언한 값을 제외하고는 정상적으로 출력되는 것을 확인할 수 있다.

 


@ConfigurationProperties

@ConfigurationProperties 어노테이션을 이용하면, application.properties 파일에서 정의한 속성값들을 자바 클래스에 매핑하여 사용할 수 있다.

 

application.properties

myapp.service.name=My Service

 

MyProperties.java

@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyProperties {

  private String serviceName;

  public String getServiceName() {
    return serviceName;
  }

  public void setServiceName(String serviceName) {
    this.serviceName = serviceName;
  }
}

 

위와 같이 application.properties에 선언한 key의 prefix를

MyProperties 클래스에서 @ConfigurationProperties 어노테이션을 이용하여 매핑해 주고 있다.

 

따라서, getServiceName() 메서드를 호출하게 되면 application.properties에 정의한 값의 Value를 가져오게 된다.

 

결과

My Service

 

 

 

'Spring > Spring' 카테고리의 다른 글

[Spring] 스프링 컨테이너와 스프링 빈(Bean) 등록  (0) 2023.05.25
Comments