티스토리 뷰
저번글에서 Spring Boot로 Configuration Properties 클래스를 만들어보았는데
이때 .properties 파일에서는 한글이 깨진현상이 나온적이 있는데 왜 발생이 되었고 어떻게 해결을 했는지 정리해보고자 한다.
한글깨짐현상
application.properties에 한글데이터를 넣었다.
테스트를 돌려보니 한글데이터가 깨져있는걸 확인할 수 있었다.
이 문제를 해결하기위해 @PropertySource라는 어노테이션을 이용해 encoding을 설정해줄수 있는데 한번적용해보았다.
@PropertySource 어노테이션 추가
해당 어노테이션을 추가해도 한글은 계속 깨졌다. 아마 어딘가에 encoding방식을 ISO_8859_1로 세팅하는곳이 있는것같다.
원인
Spring Boot에서 Properties 파일을 읽어드리는 PropertiesPropertySourceLoader.class를 찾아보았다. 해당 클래스에서 OriginTrackedPropertiesLoader의 load 라는 메서드를 호출하게 된다.
OriginTrackedPropertiesLoader.class의 load 메서드에서 private inner class인 CharacterReader의 인스턴스를 생성시점에 ISO_8859_1 encoding으로 고정이 되있는걸 확인할 수 있으며 확장포인트가 없다는걸 알 수 있다.
application.properties 파일의 default encoding값은 ISO_8859_1이며, application.yml은 UTF-8이다. UTF-8로 변경해도 런타임시 default encoding으로 동작되는것 같다.
해결 (PropertyFactoryBean 구현)
PropertyFactoryBean을 별도로 구현후 application.properties를 load해서 encoding값을 UTF-8로 설정해주었다.
정상적으로 한글이 깨지지않고 출력되었다.
참고로 현재 값을 @Value(#{member['key']})로 받아왔는데 ProperyFactoryBean 네임을 명시하지않고
바로 ${}로 가져오면 application.properties에 정의된 값을 가져오게 된다. 그렇게되면 한글이 깨질수 있어 별도로 Bean을 생성뒤 해당 Bean에서 가져오게끔 변경했다.
그리고 application.properties보단 application.yml 파일을 사용하게되면 저렇게 @Value로 하나씩 받지않고 Properties 클래스를 만들어 한번에 받을수 있으며 Profile을 하나의 파일로 관리할 수 있는 장점도 있다.
'Spring' 카테고리의 다른 글
[Spring] - 외장 Tomcat(war)로 배포할때 Java System 변수 추가 (0) | 2021.05.09 |
---|---|
[Spring] - Spring Boot 애플리케이션 war 배포 및 Tomcat Probe Manager 설정 (0) | 2021.05.08 |
[Spring] - Spring Boot Configuration Properties 클래스 만들기 (0) | 2021.05.06 |
[Spring] - Spring Security에서 사용자의 권한을 동적으로 처리하기 (0) | 2021.04.26 |
[Spring] - jasypt로 application.properties(yml) 데이터 암/복호화 (8) | 2021.04.18 |