πŸ’» Programming

SpringBoot 2 http response utf-8 μ„€μ •ν•˜κΈ°

μΌ€μ΄μΉ˜ 2021. 3. 11. 17:23

μŠ€ν”„λ§λΆ€νŠΈ 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