@RequestParam 인코딩 이슈

wisdom·2022년 8월 25일
0

트러블슈팅

목록 보기
8/12

Troubleshooting

발생한 문제

https://insta-backend5.herokuapp.com/api/articles?hashtags=고양이

@ApiOperation(value = "게시글 등록")  ![[Pasted image 20220825175909.png]]
@PostMapping  
public CommonResponse<?> createArticles(ArticleRequestDto requestDto, MultipartFile[] articleImage, @RequestParam(value = "hashtags", defaultValue = "false") List<String> hashtags){  
    articleService.createArticle(requestDto, hashtags, articleImage);  
    return ApiUtils.success(201, null);  
}
  • 로컬에서는 인코딩 문제가 없었느나 배포 후에 서버에서 해당 이슈가 발생함
    - hashtag로 들어가는 '고양이' 입력 값이 깨지는 문제
    - 게시글 등록이 되지 않는 문제
    - 해시태그를 제거하면 게시글 등록이 정상적으로 되기 때문에 인코딩 이슈가 확실함을 확인함

원인

  • 클라이언트와 서버의 charset이 맞지 않아서 발생한 문제
    - charset: 컴퓨터에서 문자를 표현하기 위해, 각 문자를 정수값에 대응시켜 놓은 체계
    - ex) euc-kr, utf-8 ...

해결 과정

  • @requestparam 한글 깨짐 구글링
    - 우선 위와 같이 한글이 깨지는 오류는 정상적인 결과라고 한다.
    - 원칙적으로 URL에는 ASCII가 아닌 문자를 사용할 수 없기 때문이다.
    - hashtag=%EC%~ 처리는 브라우저 내부적으로 인코딩을 해주고 있다고 함.
  • @RequestParam issue with utf-8 구글링

해결

  • 현재 찾은 해결 방안으로는 2가지 방법이 존재한다. 자바 소스에 필터를 추가하는 방식과 스프링 설정에 추가하는 방식이다. 설정을 추가하는 방식이 좀 더 깔끔하고 확실한 해결 방법이라고 판단해 처음에는 필터를 추가했다가 제거하고 설정을 추가하는 방식으로 해결했다.

  • Application 파일에 인코딩 필터 추가

@Bean
public CharacterEncodingFilter characterEncodingFilter() {
    CharacterEncodingFilter characterEncodingFilter = new 
    CharacterEncodingFilter();
	characterEncodingFilter.setEncoding("UTF-8");
	characterEncodingFilter.setForceEncoding(true);
	return characterEncodingFilter;
}
  • application.yaml 파일에 설정 추가
server:  
  servlet:  
    encoding:  
      charset: UTF-8  
      enabled: true  
      force: true
  • charset: UTF-8
    - Charset of HTTP requests and resonses.
    - Added to the "Content-Type" header if not set explicitly.
  • enabled: true
    - Whether to enable http encoding support.
  • force: true
    - Whether to force the encoding to the configured charset on HTTP requests and responses.

결과

스프링 설정 추가

  • 필터 추가 후에도 아래와 같이 한글이 깨지는 현상이 있다.
    • 위에서 언급한 것대로 정상적인 현상
  • 데이터베이스에는 '강아지' 입력 값이 정상적으로 저장되고, 게시글 등록도 정상적으로 이루어진다.

  • 해시태그 포함 게시글 등록 정상적으로 동작함
  • 데이터베이스에 해시태그 저장
  • 해시태그 기준으로 조회하는 것도 정상적으로 동작함을 확인함

참고

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#application-properties.server.server.servlet.encoding.enabled

profile
문제를 정의하고, 문제를 해결하는

0개의 댓글