티스토리 뷰
[2016년 4월 7일]에 개인 페이스북에 올렸던 글(https://www.facebook.com/yearnning/posts/991001780975369)을 재작성한 글입니다.
몇몇 학교에서는 식단정보가 HWP파일로 올라오고 있습니다.
처음에 HWP파일로 올려주는 학교가 몇 개 되지 않아 HWP파일로 올리는 학교들은 배제하기로 결정했습니다.
하지만, 곧 HWP파일로 식단정보가 올라오는 학교들도 처리할 필요가 있었습니다.
HWP파일 외의 형식의 파싱 방법에 대해서는 아래 포스팅을 통해 확인하실 수 있습니다.
하지만, HWP 파일의 경우에는 조금 문제가 있습니다.
우선, 텍스트로 파싱하는 것은 매우 힘든 작업입니다.
텍스트로 파싱하기 위해서는 HWP 파일 포맷에 대한 이해가 필요합니다.
이 일은 굉장히 방대한 일이고, 자사가 집중할 분야는 아니라고 생각했습니다.
그렇기 때문에, HWP 파일을 결국 이미지로 바꿔서 보여줘야 하는데,
이 방법 역시 어떻게 시작해야 할지 전혀 감이 오질 않았습니다.
그래서 먼저 오픈소스를 검색해보기를 시작했습니다.
밥대생 크롤링 서버는 현재 Python3로 작성되어 구동되고 있습니다.
밥대생이 크롤링하는 사이트의 경우 대부분 한글이 많이 포함되어있는 사이트들이기 때문에,
크롤링에서 Python2보다는 Python3를 이용하는 것이 장기적으로 훨씬 더 유리합니다.
(물론, 이에 대해서는 이견이 있을 수 있습니다.)
그래서 Python으로 작성된 오픈소스들을 먼저 검토했습니다.
물론, 다른 언어로 작성된 오픈 소스를 찾아볼 수도 있었겠지만,
아무래도 현재 사용하고 있는 언어를 사용하는 것이 더 맞다고 판단했습니다.
또, 다른 언어나 다른 프레임워크에서 사용하는 오픈소스를 사용할 경우
integration에 문제가 있을 수도 있기 때문에
최대한 사용을 자제하는 것이 맞다고 판단했습니다.
다른 프레임워크를 배우는 데 걸리는 러닝 코스트도 있을 것이고,
관리하는 데에 들어가는 코스트도 있을 것이기 때문입니다.
검색 끝에 PyHWP라는 오픈소스를 찾았습니다.
한글파일을 Python언어로 처리할 수 있는 라이브러리입니다.
text를 추출할 수도 있고, html형태로 변환할 수도 있습니다.
하지만, 이 오픈소스는 Python2 밖에 지원을 하지 않습니다.
두 프로젝트를 다른 virtual environment상에서 돌아가게 만들면,
못 쓸 것도 없지만, 바람직한 방식은 아니라고 생각했습니다.
그래서 다른 방식을 생각했습니다.
"굳이 서버에서 처리해서 보여줘야할 필요는 없지 않을까?"
그래서 프론트엔드(안드로이드)에서 처리하기로 결정했습니다.
서버에서는 HWP파일 url만 파싱하고,
이를 처리해서 보여주는 작업은 충분히 프론트엔드에서 가능할 것이라 생각했습니다.
어짜피 HWP파일 말고도 다른 파일 형식들도 앱에서 열어서 보여줄 일이 있을 것이라 예상했고,
그 일을 하는 김에 HWP파일부터 프론트엔드에서 시작하기로 결정했습니다.
파일 url이나 저장한 후의 uri를 HWP 뷰어 앱으로 넘기기로 했습니다.
그래서, 안드로이드에서 쓸만한 HWP 뷰어 앱을 찾는 것이 중요했습니다.
그래서 쓸만한 것을 찾은 것이 다음 3가지 앱이었습니다.
2. 사이냅뷰어
3. 폴라리스 오피스
1은 공식 앱입니다. 하지만, 1은 용량이 너무 큽니다. 용량이 200MB나 됩니다.
학식 정보 확인을 하기 위해서 밥대생 유저에게 200MB나 되는 앱을 깔게 강요할 수는 없었습니다.
2는 intent로 minetype을 "application/hwp" 로 셋팅하고 넘겼는데 제대로 작동하지 않았습니다.
3은 앱의 완성도가 높았지만, 앱 사용을 위해서는 폴라리스 오피스 로그인이 필요했습니다.
사용자에게 식단정보 확인을 위해서 외부 앱 로그인까지 요구할 수는 없었고,
아무래도 공식 앱이 더 안정적일 것으로 판단해 1을 사용하기로 결정했습니다.
정말 식단 정보 확인이 필요한 사람이면, 200MB는 감수할 수 있지 않을까? 라는 가설을 세우면서 말이죠.
하지만, 한컴오피스 앱에 문제가 있었습니다.
2개 식당을 대상으로 테스트 해보았는데,
한 식당은 잘 나왔는데 다른 한 식당은 제대로 나오지 않았습니다.
(2016년 4월 7일 기준. 지금은 오류가 해결되었을 수 있습니다.)
앱이 강제 종료되었습니다. 잘못된 파일형식이라면서 한컴 오피스 앱이 아예 열리지 않았습니다.
공식 앱에서 파일이 열리지 않는다니!
사실 놀랐습니다. 혹시나 하는 마음에 똑같은 파일을 폴라리스 오피스 앱을 통해 열어보니 제대로 열렸습니다.
뭔가 예외처리가 공식 앱에서 잘 안되어 있는 느낌이었습니다.
제대로 동작하는 앱이 폴라리스 오피스밖에 없으니,
자사에는 선택권이 없었습니다.
유저에게 폴라리스 오피스 로그인을 시켜서라도
폴라리스 오피스를 이용하게 만들어야 했습니다.
Intent를 잘 활용해서 폴라리스 오피스와의 integration을 성공적으로 마칠 수 있었습니다.
유저가 밥대생 앱에서 HWP파일을 확인하기 위해서는
그냥 앱 내에 "자세히보기" 버튼만 클릭하기만 하면 됐습니다.
(물론 처음 눌렀을 경우에는 외부 앱을 다운 받고, 그 앱에 로그인하는 과정을 거쳐야 하긴 하지만...)
"이제 최적화를 해볼까?"
기존에는 빠른 개발을 위해,
유저가 "자세히보기" 버튼을 누를 때마다 서버에서 파일을 다운 받고,
이 파일의 uri를 외부 앱으로 넘겼었습니다.
그렇기 때문에 "자세히보기"를 할 때마다 데이터를 쓰고 있었던 것입니다.
밥대생 타겟 유저의 특성상 데이터는 상당히 민감한 이슈입니다.
데이터 사용량을 줄일 필요가 있었습니다.
그래서, 관련 오픈소스를 알아보기 시작했습니다.
물론, Andorid 내장 Download Manager를 사용할 수도 있었겠지만,
이 보다는 이를 wrapping한 다른 라이브러리를 사용하는 것이
더 안정적인 개발이 가능할 것이라 믿었습니다.
그래서 선택한 것이 ThinDownloadManager였는데,
학교 홈페이이제 https 인증서 오류가 있어서
다운에 계속해서 실패했습니다.
그래서, 우리 크롤링 서버에서 인증서를 무시하고
해당 한글파일을 다운 받은 뒤에,
이를 아마존 S3에 다시 업로드해 해당 파일을
앱 내에서 다운 받는 방식으로 바꾸었더니 제대로 동작했습니다.
이런 과정을 통해, HWP파일로 올라온 식단정보를
밥대생에서 보여줄 수 있게 되었습니다.
관련 글 :