생계유지형 개발자/Spring Framework

[spring] application.yml에 정의한 값이 상수이며 0으로 시작할 때 @Value 형변환 오류

이 가을 2020. 1. 3. 19:23

아래와 같이, 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