아래와 같이, application.yml 파일에 daemon.send_number라는 Property를 정의하고
Java 클래스에서 @Value 애노테이션을 사용해서 smsSendNumber 변수를 선언했다.
application.yml
daemon:
send_number: 0317263623 #네이버 사내정보서비스 대표전화번호
SmsSender.java
public class SmsSender {
@Value("${daemon.send_number}")
private String smsSendNumber;
//...
log.info("MEX API sender: {}", smsSendNumber);
}
위의 코드에서 당연히 smsSendNumber 변수에 0317263623 라는 값이 들어가야 하는데
예상과 달리 아래와 같이 이상한 값이 들어가서 출력됐다.
/** 스프링 실행되고 로그찍었을 때 나온 값 */
MEX API sender: 54355859
이에 스택오버플로우에서 같은 현상으로 등록된 질문을 찾았다.
You did not specify which version YAML your document has, and it looks like your parser defaults to version 1.1 (or version 1.1 compatibility). This causes values starting with 0 followed by digits to be interpreted as octal, and value of 011200 (octal) is 4736 (decimal), the value of 011600 (octal) is 4992.
In YAML 1.2, octal integer values should start with Oo and therefore 011200 will be the integer 11200
무슨 말이냐면,
YAML 1.1 버전에서는 0으로 시작되는 숫자를 8진법(octal)으로 인식하고 이를 다시 10진수(decimal)로 바꾸어 변수에 할당한 것이다.
따라서 YAML 1.1버전에서 0으로 시작하는 숫자값을 사용하기 위해서는 작은 따옴표(')로 감싸주어야 한다.
그러면 해당 값을 숫자가 아닌 문자열로 인식하게 된다.
'0317263623' <- 이렇게
반면에 YAML 1.2 버전부터는 Oo(대문자 알파벳 O + 숫자 0)로 시작하는 값을 8진법으로 인식한다.
그래서 작은 따옴표 없이 0으로 시작해도 괜찮지만 application.yml 파일 최상단에 버전을 명시해야 한다.
※ 버전 표기법: %YAML 1.2
# yaml 1.1 (버전표기 불필요)
service:
b: '011600'
c: '011200'
%YAML 1.2 # yaml 1.2 (버전표기 필요)
---
service:
b: 011600
c: 011200
[참고] https://stackoverflow.com/questions/42828311/value-from-application-yml-returns-wrong-value
'생계유지형 개발자 > Spring Framework' 카테고리의 다른 글
[Spring5] Spring MVC vs WebFlux (0) | 2021.03.23 |
---|---|
[MyBatis] 계층형 결과 리스트 생성 (resultMap, collection 활용) (0) | 2021.02.25 |
[Spring5] WebFlux + Thymeleaf + Kotlin (0) | 2021.02.02 |
[Spring] proprteis 파일 한글 깨짐 (0) | 2020.07.15 |
[spring] 매번 까먹는 JUnit4 테스트케이스 클래스 생성 (0) | 2019.12.19 |