티스토리 뷰

공부/Spring

[Spring] Annotation - @value

J-Sik 2021. 12. 7. 00:41

@value 어노테이션은 무엇인가요? 🤔


@Value annotation은 설정파일(.properties, .yml)에 설정한 내용을 주입시켜주는 어노테이션입니다.

 

 

@value는 왜 쓰는 것인가요? 🤔


DB 연결에 필요한 정보(계정 정보)나 노출되기 민감한 값들을 하드 코딩하게 된다면, 여러 가지 이슈에 휘말릴 수 있다. (깃허브 같이 공유 레퍼지토리에 그대로 코드와 함께 유출될 것이다.) 또한 개발 시엔 로컬에 맞는 환경으로 세팅을 했지만, 클라우드 서버에 올린다거나 배포 환경으로 전환될 때, 직접 해당 코드를 수정해야 하는 번거로움이 있다. 이러한 이슈들을 막기 위해 민감한 정보나, 메타정보들은 파일로 따로 빼두어 관리하게 된다. (수정과 관리가 용이하기 때문)

 

이러한 이유로 따로 빼둔 설정 파일을 필요한 곳에 주입시켜주는 어노테이션이 @value 다.

 

 

@value는 어떻게 써야 하나요? 


@value를 쓰는 방법은 간단하다. @value 안에 파라미터로 EL형식의 키 값을 넣어주면, 불러올 수 있다.

@value("${프로퍼티 키값}")의 형태로 입력하게 되면, 해당 변수에 값이 주입하게 된다. 말로는 잘 이해가 가지 않으니 예제를 함께 보자. 설정 파일에 admin.name 이란 키값으로 jsik이라는 값을 저장해 두었다고 가정하자. 이를 불러오는 코드는 아래와 같다. 

 

@RestController
public class ValueController {

    @Value("${admin.name}") 
    private String adminName;

   //... 이하 코드 생략
   
}

 

그러나 위 코드만 가지고는 admin.name의 값을 가져올 수 없다.(장난하냐 🤬 )

왜냐하면 @value은 주입을 시켜주는 친구지 찾아주는 친구가 아니다. 즉, 해당 어노테이션한테 '이런 설정 파일에 admin.name 키값이 있네?'라는 것을 알려주기 위한 사전 작업이 필요하다. 여러 방법들이 있지만, 그중 몇 개를 소개하려고 한다.

 

1) xml 방식 

해당 servlet-context를 이용하여, 설정 파일을 등록하는 것이다.

<!-- servlet-context.xml-->

<context:property-placeholder location="classpath:sample.properties" />

여러 개 라면, location에 , (쉼표) 형식으로 추가하면, EL 표현식을 이용하여 사용 가능하다. 

 

2) @PropertySource("classpath:REALPATH") 이용

다른 어노테이션을 이용하여, 보다 직관적으로 설정할 수도 있다.

@RestController
@PropertySource("classpath:sample.properties")
public class ValueController {

    @Value("${admin.name}") 
    private String adminName;

   //... 이하 코드 생략
   
}

 

※위의 두 가지 겨우 모두 classpath는 src/main/resource/이다. 이 점을 참고하여 경로를 써주면 된다.

 

 

p.s) 파라미터로 EL 뿐만 아니라 SpEL도 쓸 수 있다고 한다. 아래의 블로거님들이 잘 정리해두었으니 참고할 것.

💡 https://atoz-develop.tistory.com/entry/Spring-SpEL-Spring-Expression-Language

💡 https://mangkyu.tistory.com/167

 

 

c.f) .properties 파일의 형식 📄

프로퍼티파일은 " KEY=VALUE " 형식으로 정의된다. 아래의 설정 파일은 위 예제에서 사용한 설정 파일이다.

 

#
#	sample.properties 
#
# 	properties 파일의 주석은 샵을 이용한다
admin.name=jsik

 

Plus ) 💡💡CAUTION💡💡

 당연한 말이지만, 어노테이션이든 빈이든 값을 주입받았다고, 해서 절때로 생성자에서 쓰지말자~~~. (머리론 알고 손으론 왜 안되는지 보고있었음....) 백날 해봐야 null이다. 생성자에 쓰고 싶으면, 해당 클래스를 bean으로 뽑는게 맘편하다!  

 

References]

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함