배경
깃허브에서 코틀린 기반 스프링 프로젝트를 받아 실행을 했는데 다음과 같은 오류가 떴다.
java.lang.IllegalArgumentException: Could not resolve placeholder '' in value...
확인해본 결과 application.yml에 환경 변수로 지정된 것들을 코틀린에서 전혀 사용하지 못하고 있었다.
소스를 확인해본 결과 "\${app.name}" 다음과 같은 형태로 사용중이었으며 이상은 없었다.
해본 방법들
역시 첫번째 방법은 프로젝트 리빌드 후 기도 메타.
리빌드 방법은 인텔리제이 기준 상단 메뉴 - Build - Rebuild Project 를 클릭한다.
단축키로는
윈도우 : Ctrl + Shift + F9
맥 : command + Shift + F9 으로도 할 수 있다.
혹시 모르니 캐시 정리도 해주자.
캐시 정리는 File - Invalidate Caches... 에서 Restart버튼을 누른 후 인텔리제이를 재시작하면 된다. 그리고 프로젝트 빌드해준 후에 되는지 한번 확인해보자.
이클립스보다는 확실히 덜하던데 인텔리제이도 가끔 특정 부분이 안된다면 다음과 같이 재시작만으로 상당수 해결이 가능했다.
하지만 나의 경우는 안됐기 때문에 뭔가 고쳐야 될게 생겼구나! 를 직감했다.
그래서 다음으로 들여쓰기를 확인했다.
application.yml은 properties와는 다르게 들여쓰기를 통해 환경변수의 변수명을 지정한다.
가령 이메일 관련 환경변수명을 설정하고 싶다면
# 이메일 설정
mail:
host: smtp.gmail.com
port: 587
username: your-email@gmail.com
password: your-email-password
properties:
mail:
smtp:
auth: true
starttls:
enable: true
다음과 같이 레벨별로 들여쓰기를 확실하게 해주어야 소스 내에서 제대로 사용할 수가 있다. 그래서 이 부분에서 오타가 났거나 들여쓰기가 잘못된 부분이 있는지 확인할 필요가 있다.
이 부분도 잘 되어 있기에 넘어갔다.
그렇다면 다음은 해당 환경 변수를 사용하는 부분에서 오타가 없는지 확인할 차례였다.
코틀린에서는
@Component
class AppConfig {
@Value("\${app.name}")
lateinit var appName: String
@Value("\${db.username}")
lateinit var dbUsername: String
}
다음과 같은 형식으로 환경변수를 가져온다. 어노테이션 Value가 springframework.bean.factory 패키지 내에서 가져온 어노테이션인지 확인이 필요하다. 참고로 자바에서는 "${...}" 포맷으로 가져온다.
이 부분도 문제가 없었다.
내가 해결한 방법은 application.yml 안에 구분자 사용 부분에서 오류가 있었다.
먼저 application.yml 내부에서 로컬, 운영서버의 분리를 위한 구분자를 사용했다. 구분자는 "---" 과 같이 세개의 하이픈을 통해 구역을 나누는 목적으로 사용한다.
spring :
profiles :
active : dev
---
# dev 관련 환경변수...
---
# prod 관련 환경변수...
--- # 원래 구분자가 있어야 할 자리이지만 없어서 dev 서버에서 인식하지 못하는 오류가 발생!
# 설정 관련 환경변수...
다음과 같이 spring.profiles.active 를 통해 프로젝트 실행 시 기본적으로 세팅되는 서버의 환경변수를 설정해주게 되고 그 관련 값들을 구분자로 나눠주게 된다.
그런데 나는 마지막 구분자를 빠뜨려서 prod 관련 환경변수와 설정 관련 환경 변수가 붙어 있는 상황이 발생했다. 그래서 dev서버에서는 해당 환경변수를 인식하지 못했고 prod 로 바꿔서 실행을 하니 제대로 돌아갔던 것이었다.
그래서 빠져있는 구분자를 붙였더니 잘 인식을 하여 해결할 수 있었다.
느낀점
실무에서 로컬, 운영 혹은 로컬, 개발, 운영서버 별로 세팅해야 할 부분이 많이 생기게 되고 그 부분에서 구분자를 잘 신경써줘야 한다는 사실을 깨달았다.
댓글