본문 바로가기
카테고리 없음

[Python]데이터 한글 깨짐 (feat. Mysql, Flask)

by HarryJang 2023. 7. 13.

목차

    개요

    입대 전까지 집중적으로 해야될 일이 많아서 과외를 좀 정리하게 되었다. 그 중 하나의 수업에는 고객님이 주신 질문에 대해서 답변을 드리려고 준비 중이었다. Remote access to db, web app deployment 등 여러 질문이 있었는데 my.cnf 파일을 못 찾아서 remote access를 시도하던 중에 막혀서 다른 문제들을 시작도 못했고, Mysql에서 데이터를 가져와 Flask로 출력할 때 한글이 깨지는 문제에 대한 답을 마지막을 찾고 끝나게 되었다. 이것도 결론적으로는 간단했지만 나름 시행 착오가 있어서 한 번 정리해보려 한다.

     

    우선 문제의 발단은 이러했다. 고객님께서 Mysql, Python,Flask 사용법을 배워가신 후 web app을 만드셨다. 테스트를 하실 때 한글 이름을 사용하셨는데, 그걸 fetch해서 가져와서 보니 한글이 깨져서 나오는 것이었다. 그러하여 내게 질문을 주셨고 그 때 부터 이 문제를 해결하기 위해 하나씩 살펴보았다.

     

    Mysql

    우선은 정확히 잘 모르겠어서 구글링을 해보니 Mysql에서 setting이 잘못되어 있을 수 있다는 것이다. utf8이 아니라 다른 언어 세팅으로 되어 있으면 한글이 깨질 수 있다는 것이다. 이를 해결하기 위해선 my.cnf파일에서 이것 저것을 추가하고 다시 mysql을 실행해서 db와 table의 세팅을 바꿔주면 된다는 거 였다. 우선 나는 remote access를 시도하면서 my.cnf 파일을 찾는데 많은 노력을 쏟았었고, 그럼에도 불구하고 찾지 못했기에 이 방법을 시도하기가 어려웠다. 그래서 내가 직접 해보지 못하고 고객님과 수업 중에 함께 진행해볼 수 밖에 없었는데, 고객님 컴퓨터에서도 my.ini(windows에서는 이 파일이 my.cnf와 같이 mysql의 configuration이 기록된 곳이다.)를 찾는데에 실패했다. 다음 수업까지 내가 구글링을 해서야 결국 my.ini파일을 찾을 수 있었다. 그러나 웬걸, my.ini파일을 바꾸고 process대로 해서 세팅을 바꿔도 결과는 그대로 였다. 여기서 문제가 Mysql에 있지 않다는 것을 알 수 있었고 이제 눈을 Python으로 돌리기 시작했다. reference: https://co-deok.tistory.com/66

     

    [MySQL] 한글 깨짐 문제 해결 UTF-8

    MySQL에 INSERT 작업을 하면 한글이 ???로 깨져서 저장이 되거나, incorrect string value: '\xE3\x84\xB4\xE3\x85\x87...' for column과 같이 INSERT가 안될때가 있습니다. 이런 경우는 주로 데이터베이스의 인코딩 타입

    co-deok.tistory.com

     

    Python

    우선 그전에 확실히 하기 위해 Mysql 에서 data를 가져왔더니 거기서는 한글이 깨지지 않고 그대로 출력이 됐다. 그 말인 즉슨, Mysql에는 문제가 없고 그것을 python으로 가져와서 web에 출력하기 전까지에 문제가 있다는 뜻이다. 여기서 확인도 안해보고 Mysql 과 Python을 연결해주는 connector에 문제가 있다고 생각하고 또 몇시간을 쏟아서 문제를 해결하려 했다. connection을 만들 때 charset을 utf8로 세팅해야한다는 구글링 결과로 이것저것 만지작 거렸으나 문제가 해결되지 않았다. 뒤늦게 fetch 해온 data를 출력해보니 한글로 출력이 되었고 문제는 charset을 뭐로 세팅 하느냐에 있지 않았다. ​ 

     

    Flask

    그래서 다시 코드를 훑어봤다. 그랬더니 flask 함수에서 output을 출력할 때 render_template을 하는 것이 아닌 Mysql data를 json 포멧으로 그저 return 하고 있는 것이었다. 설마 저게 문제인가 하고 output.html에 jinja2를 사용해서 변수를 넣을 수 있도록 한 다음 html에서 결과값이 출력되도록 하니 web에서도 한글이 출력되는 것 볼 수 있었다. ​ 

     

    배움

    결과적으로는 문제를 해결했지만 이 나름 간단한 문제에 생각보다 많은 시간을 소비했다. 이러면서 실력이 느는 거라는 생각이 있는 한 편 참 효율적으로 개발하지 않는다는 생각도 들었다. 끝에와서야 항상 다짐하는 것이지만 다음부터 개발하거나 디버깅을 할 때는 바로 손부터 움직이지 말고 생각을 하거나 diagram을 그려보고 전체적인 틀이 잡혔을 때 키보드에 손을 올려야겠다. 알면서도 잘 되지 않는다. 그래도 내가 천재가 아니라는 가정 하에 최소한 괜찮은 개발자가 되기 위해서는 이 습관을 잘 기르는 것이 중요할 것 같다.