스프링부트 1 을 사용하던 엔터프라이즈 앱을 MSA 적용 작업을 통해 여러 앱으로 분리하면서 스프링부트 2로 업그레이드를 진행했습니다.
이 과정에서 다른 회사와 API 연동하고 있던 부분에서 인코딩 문제가 발생했습니다.
소스 이전을 진행하면서 빼먹은 부분이 있어서였죠.
이슈가 발생한 회사측에서 원인으로 얘기한 것은 응답 헤더의 Content-Type에 utf-8 인코딩 설정이 빠져있다는 것이었습니다.
그래서 확인해보니 스프링부트 1 기반 앱에서는 아래와 같은 설정이 있었습니다.
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
그리고 테스트 결과 응답헤더의 Content-Type에 application/json;charset=utf-8 이라고 되어있는 것을 확인할 수 있었습니다.
하지만 신규 앱에서는 charset 정보가 빠져있었습니다.
그래서 위 설정을 그대로 스프링부트 2 기반의 신규로 개발한 앱쪽에 넣으려 했더니 앱 기동 시 오류가 발생했습니다.
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'characterEncodingFilter', defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.class], could not be registered. A bean with that name has already been defined in com.yanolja.affiliate.out.api.AffiliateOutApiApplication and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
이미 동일한 이름의 빈이 존재하니 오버라이드 할 수 있도록 설정을 변경하라는 얘기였죠.
근데 생각해보니 굳이 이렇게 해야하나 라는 생각이 들어 좀 찾아보니,
자바 소스에 저렇게 추가하지 않고 스프링 설정 만으로도 헤더의 인코딩 설정은 가능했습니다.
바로 server.servlet.encoding.charset 설정을 추가해주면 되었습니다.
하위 버전에서는 이 설정이 spring.http.encoding.charset 으로 사용되었었습니다.
자바 소스에서 characterEncodingFilter 빈 생성로직을 제거하고, application.yml 파일에 아래와 같이 설정을 추가합니다.
server:
servlet:
encoding:
charset: UTF-8
그리고 앱을 재부팅 해주면 응답헤더의 Content-Type 값이 application/json;charset=utf-8 으로 변경된 것을 확인할 수 있습니다.
만약 값이 바뀌지 않는다면 server.servlet.encoding.force-response 또는 server.servlet.encoding.force 설정값을 true로 설정해서 다시 해보시기 바랍니다.
참고문서: docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#server.servlet.encoding.charset
[Git] 특정 기간동안 author 별 커밋 건수 확인하기 (0) | 2022.05.17 |
---|---|
AWS Elasticsearch ISM을 활용한 인덱스 자동삭제 (0) | 2021.04.21 |
[5분 코딩] Spring4 + JCache (feat. Ehcache) (0) | 2020.12.17 |
스프링 순환참조 문제 해결하기 (How to avoid circular reference) (0) | 2020.12.11 |
스프링 의존성 주입(DI) (0) | 2020.12.10 |