Spring boot 프로젝트에서 여러개의 property 혹은 yml을 추가하며 겪은 문제와 해결방법을 공유해 보겠습니다.
프로젝트에 OAuth와 MailSender를 사용하기 위해 yml를 작성하던 중 Github에 올라가선 안될 ClientId
나 Password
를 숨기기 위해 yml을 분리하는 방법을 사용했습니다.
공개해도 괜찮은 설정은 application.yml
에 작성하고 숨겨야 할 부분은 google.yml
, mail.yml
에 작성한 뒤 .gitignore
에 추가했습니다.
이렇게 분리한 yml 파일은 다른 블로그들을 참고해 SpringApplicationBuilder
의 properties()
메소드를 통해 등록해 주었습니다.
String APPLICATION = "spring.config.location=classpath:/application.yml";
String GOOGLE = "spring.config.location=classpath:/google.yml";
String MAIL = "spring.config.location=classpath:/mail.yml";
public static void main(String[] args) {
new SpringApplicationBuilder(RecruitJogbo.class)
.properties(APPLICATION, GOOGLE, MAIL)
.run(args);
}
분명히 블로그에 있는 코드를 따라 작성한 것 같은데 yml이 정상적으로 적용되지 않아 MailSender 빈을 등록할 수 없거나 OAuth에서 Http url must not be null
에러가 발생했습니다.
무엇이 문제인지 확인하기 위해 properties()
메소드를 살펴보니
public SpringApplicationBuilder properties(String... defaultProperties) {
return properties(getMapFromKeyValuePairs(defaultProperties));
}
private Map<String, Object> getMapFromKeyValuePairs(String[] properties) {
Map<String, Object> map = new HashMap<>();
for (String property : properties) {
int index = lowestIndexOf(property, ":", "=");
String key = (index > 0) ? property.substring(0, index) : property;
String value = (index > 0) ? property.substring(index + 1) : "";
map.put(key, value);
}
return map;
}
HashMap을 통해 입력한 yml을 추가하고 있었습니다. 이 때 application, mail, google 3개의 property 모두 'spring.config.location'
라는 같은 키 값을 가져 가장 마지막에 put()
이 실행된 mail.yml 만 적용된 것을 볼 수 있습니다.
디버깅을 통해 확인한 getMapFromKeyValuePairs()
의 반환값
[이미지 수정중]
키 값 'spring.config.location'
에 3개의 yml 파일을 모두 추가하기 위해 properties()
의 argument를 다음과 같이 'spring.config.location='
뒤에 ','
로 추가해줍니다.
private static final String PROPERTIES =
"spring.config.location="
+"classpath:/application.yml"
+",classpath:/google.yml"
+",classpath:/mail.yml";
public static void main(String[] args) {
new SpringApplicationBuilder(RecruitJogbo.class)
.properties(PROPERTIES)
.run(args);
}
똑같이 실행 후 getMapFromKeyValuePairs()
의 반환값을 확인해 보면 3개의 yml 파일이 추가된 것을 볼 수 있고 코드도 정상 동작하는 것을 확인할 수 있습니다.
이렇게 저장된 property가 어떻게 사용되는지까지는 확인하지 못했지만 여러개의 property를 추가하는 방법에 대해 알 수 있었습니다.
이번 포스트에서는 Spring boot 프로젝트에서 RabbitMQ를 사용하는 간단한 방법을 알아보겠습니다. Consumer 코드와 Producer 코드는 GitHub에 있습니다. 먼저 RabbitMQ 서버를 실행해야 하는데 Docker를 사용하면 쉽게 서버를 구성할 수 있습니다. 프로젝트 루트 폴더에 docker-compose.yml 파일을 생성하고 다...
Entity나 DTO를 검증하기 위해 @NotBlank, @Email 등 javax.validation.constraints.* validation을 사용하다 보면 아래와 같이 필드에 Enum 타입을 String으로 입력받는 경우가 있습니다. 이러한 경우 Enum 타입도 함께 validation 하는 방법을 정리해 보았습니다. Reference...
Spring boot 프로젝트에서 여러개의 property 혹은 yml을 추가하며 겪은 문제와 해결방법을 공유해 보겠습니다. 프로젝트에 OAuth와 MailSender를 사용하기 위해 yml를 작성하던 중 Github에 올라가선 안될 ClientId나 Password를 숨기기 위해 yml을 분리하는 방법을 사용했습니다. 공개해도 괜찮은 설정은 appli...
Spring을 사용하면 입력값을 받을 때 @Valid를 사용해서 쉽게 검증을 할 수 있는데 기본적으로 반환하는 에러 메시지는 너무 길고 복잡해 필요에 따라 처리하는 방법을 알아보았습니다. 우선 간단한 POST 요청을 처리하는 과정을 살펴보겠습니다. 훨씬 간결해진 메시지를 볼 수 있습니다. 물론 이렇게 바꾸는 것이 정답이 아니니 필요에 따라 반환하는 ...
최근 세션 대신 사용자 인증에 주로 사용되는 JWT와 OAuth. 그 중 JWT에 대해 아주 기본적인 내용까지만 알아보도록 하겠습니다. 혹시 틀린 내용이 있다면 지적 부탁드립니다. JWT 란? Json Web Token의 줄임말로 JWT 라이브러리인 JJWT의 Docs에서는 다음과 같이 정의하고 있습니다. JWT is a means of t...