본문 바로가기

편안한코딩생활/오류 해결 일지

스프링부트 한글 깨짐 오류(jpa data utf-8 encoding)

목차

    이 글은 개인프로젝트 - 스프링부트 with JPA로  jostory 프로젝트의   게시글 쓰기를 하다가 발생한 오류를 기록한 글이다.

    오류

    글쓰기를 하면 모든 한글이 다 이렇게 나옴(+나중에 보니 회원가입할때도 똑같이 한글 깨지더라)

    원인 추론

    1. summer note 관련 오류인가?

    이유 : 딱 그거 추가했을때부터 안되서

    라이브러리 끄고 시도해봄

    결과 : 아님

    2. db에 인코딩이 안됬나?

    utf-8로 잘되있었지만 혹시 몰라서 변경 후 다시 시도

    강제로 데이터를 넣었더니 한글이 아주 잘보임... db는 문제없음

    3. 파일 인코딩

     

    검색했더니 저 부분을 utf-8로 바꿔보란다..했는데 안됨

    4.yml 파일 수정

    server.servlet.encoding.force-response: true

    추가하기

    부트 2.7.0버전부터 한글 깨짐 오류가 있어서 저걸 yml파일에 추가하면 안깨진다 한다..

    나는 2.2.6이라 해당사항은 없었으나 일단 추가해봄

    결과: 안됨.

    5. 인텔리제이 vm파일 수정

    인텔리제이 vm파일 수정: html에 있는 다른 한글은 잘 나오기때문에 아닐 것 같긴 했는데,, 일단 시도

    -Dfile.encoding=UTF-8

    -Dconsole.encoding=UTF-8 추가

    안됨

    6. tomcat의 server.xml 수정

    Tomcat의 server.xml에 URIEncoding 옵션을 추가해 준다.
     
      <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

    나는 yml파일이니

    안됨..

     

    7. @columnDefinition 에 utf-8

    1. 컨트롤러, 서비스단에서 로그찍으면 한글 들어감

    2. DB에 강제로 한글데이터 인서트하면 들어감

    등의 테스트를 통해서 이건 JPA에 관련된 오류다,,, 서버에서 DB로 데이터가 들어갈 때 깨지는 것이다 ! 

    JPA ENCODING 등으로 검색해서 나온 결과:

    한글 데이터가 들어갈 컬럼에 모두  @columnDefinition 으로 인코딩

    참고:

     

    JPA Entity 생성시 Table Character set - UTF8 미설정 이슈

    🚀 들어가며 JPA의 ddl-auto로 생성된 테이블의 Charset이 서버에서 설정해준 인코딩인 utf8과 달랐다. 사실 테스트가 아닌 이상.. ddl-auto로 생성된 ddl을 사용하지 않으면 되는 일이지만 , 이런 이슈가

    redcoder.tistory.com

    하지만 안됨. 

    게다가 이거 해보느라고 DDL AUTO를 CREATE로 바꿨더니 entity의 FK때문에 제대로 DROP, CREATE가 안되는 현상 발생 

    => 여기서 JPA의 한계를 느낌 ...일괄적으로 만들어지니 한번 오류가 나면 수정이 어렵구나!

    8. 해결 : JPA 설정 고쳐주기

    https://stackoverflow.com/questions/38677740/spring-data-jpa-utf-8-encoding-not-working

     

    spring data jpa utf-8 encoding not working

    I use spring-data-jpa and mysql database. My tables character set is utf-8. Also I added ?useUnicode=yes&characterEncoding=utf8 to mysql url in application.properties file. Problem when I p...

    stackoverflow.com

     

     
    spring.datasource.url = jdbc:mysql://localhost:3306/gehive?useUnicode=yes&characterEncoding=UTF-8
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: cos
    password: cos1234
     
    url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul
    => url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul&characterEncoding=UTF-8

     

    인코딩 설정을 덧붙여서 해결!!!!1

    스키마 생성 전 DB를 인코딩 하고, JPA로 ENTITY 생성을 했어야 하는데, JPA가 일괄적으로 ENTITY를 생성하면서 인코딩 설정이 안된거다.. 그래서 URI에 따로 인코딩 설정을 덧붙여 줌으로써 해결!!!

    원인을 알아냈으므로 브랜치의 마지막 커밋시점으로 돌아가서, 부서진 나의 코드를 예쁘게 고치고 YML에 저 설정을 딱 덧붙여주면!?!?!?! 완벽해결!!

     

    THANKS TO : 최규하...

    => 팀프로젝트를 같이 했던 팀원...오류 해결을 즐긴다! 본투비 개발자.