cosmic-elevator blog

Home | About | Contacts | Archive

[vsi] 학교 전자책 털기 프로젝트

https://github.com/cosmic-elevator/vsi

Oxford Academics에서 출판한 Very Short Introduction (약칭 VSI) 의 웹사이트 파일을 epub 파일로 변환해주는 코드를 짰습니다. 처음으로 쓸만한 코드를 짜보았습니다. 비록 남의 코드를 포크해와서 완성한 것이지만, 그래도 뭔가 유용한 것을 만들었다는 점에서 감회가 남다릅니다. 컴퓨터공학과를 가겠다고 한참 떠들어댔지만, 저는 제대로 된 코딩을 해본 적이 많이 없습니다. 처음 진로를 정한 고등학교에서도 코딩을 많이 하지 않았습니다. 기껏해야 정보 시간에 짠 허접한 코드, 그리고 동아리 축제 부스에 전시하려고 만들었던 pygame 리듬게임 정도가 전부였습니다. 학교 프로젝트가 아닌 개인적으로 뭔가 쓸모있는 코드를 짜는 것은 이번이 처음입니다.

프로젝트를 고치게 된 계기

1학년 1학기 때 극심한 우울에 빠진 저는, 대학교를 자퇴할 계획을 세우게 됩니다. 학교에는 저보다 뛰어난 학생들이 차고 넘쳤고, 저는 그 속에서 절대 빛날 수 없다고 생각했습니다. 의욕이 죽은 것입니다. 수업, 학생, 교수 등 학교에 관한 모든 게 다 싫었습니다. 도서관만 제외하고 말입니다. 저희 학교의 도서관은 대학 도서관 중에서는 꽤 규모가 큰 편으로, 어마어마한 양의 장서를 보유하고 있습니다. 도서관을 좋아하는 사람으로서 이런 학교에 다니는 것은 큰 기쁨이었습니다. 구독하고 있는 전자책 사이트의 수도 많았습니다. 그 중에서는 제가 어떤 분야를 입문하고 싶을 때 가장 먼저 찾는 책 시리즈인 Very Short Introductions도 있었습니다. 자퇴는 하고 싶지만 학교 도서관에서 구독하고 있는 VSI는 읽고 싶었던 저는 한 가지 계획을 세우게 됩니다. VSI 사이트에 있는 책을 모조리 epub 파일로 만들어서 자퇴하기 전에 개인 소장하면 어떨까? 이런 삿된 생각으로 저는 VSI 사이트의 HTML 파일을 epub 파일로 바꿔주는 코드가 있을지 깃허브에 검색해보았습니다.

https://github.com/kdelwat/vsi

놀랍게도, kdelwat이라는 분이 6년 전에 짠 코드가 있었습니다. 아무래도 시간이 시간이다 보니 당연하게도 코드는 제대로 작동하지 않았습니다. 그 말은 즉슨, 제가 직접 오래된 코드를 작동하도록 고쳐야 한다는 뜻입니다. 프로젝트는 Golang으로 짜여 있었습니다. 저는 Golang을 써본 적이 아예 없어서 밑바닥부터 배워야 하나? 하면서 많이 걱정했는데 의외로 짜여진 코드 보면서 따라 치니까 뭔가 되긴 되더라고요 ㅎㅎ…

고친 부분들

먼저, AddCSS 오류를 고쳤습니다. 전 코드는 원본 웹사이트의 CSS 파일을 반복문을 돌면서 string으로 모두 합친 후 그 string 변수 자체를 AddCSS에 전달하는 식으로 동작하였습니다. 하지만 golang의 epub 패키지에 있는 AddCSS 함수는 인자로 CSS 파일의 이름을 받는 함수이므로, 이 부분에서 오류가 납니다. 변수 값을 저장할 파일을 만든 후 그 파일의 이름을 전달하는 방식으로 문제를 해결하였습니다.

코드가 굉장히 오래되어서 그런지 goquery selector에 전달하는 클래스 이름이 현재 사용되는 vsi 웹사이트의 이름과 사뭇 달라서, 그런 일부 코드를 수정해 주었습니다.

추가로 사소하게 거슬리는 요소들 (모든 사진 다운로드받기 버튼 등등) 이 epub 파일에 들어가지 않도록 정규표현식을 활용해서 없애 주었습니다. 지금 생각해 보면 goquery selector를 사용하는 편이 더 나았을 것 같습니다.

그러고 나서 다 끝난 줄 알았습니다. 이북리더기에 epub 파일을 보내서 테스트해보았습니다. 그런데 이상한 문제가 있었습니다. 몇몇 챕터에서 사진이 깨져 보였던 것입니다. 모든 사진이 깨져 있었다면 어떻게 해결해야 할지도 명확해지는데, 파일이 깨지는 기준도 모르니 이걸 어떻게 고쳐야 할지 막막했습니다. 일단 사진이 깨져 있는 챕터의 공통점을 찾기 위해 여러 책을 가지고 테스트를 했습니다.
쉽사리 결과가 나오지 않아서 절망하던 와중, 의외의 공통점을 발견했습니다. 그것은 바로 챕터 이름에 특수문자가 들어가는 챕터의 사진만 깨져 있더라!는 사실이었습니다.

이를 이해하기 위해서는 코드에서 epub 파일에 사진을 넣는 과정을 살펴봅시다. 우선 웹사이트 리소스에 있는 파일 이름을 찾은 다음, epub 파일에 AddImage를 이용하여 이미지를 넣습니다. 이때, 두 번째 인자에 빈 문자열을 넣으면 알아서 고유한 이름으로 저장시켜 줍니다. 원본 이미지 이름을 key, 새로운 이미지 이름을 value로 하는 맵에 저장하고, 그 맵을 이용해서 strings.Replace() 함수로 epub에 들어갈 HTML 파일에 있는 문자열을 새로운 이미지 이름으로 대치시켜 줍니다.
HTML 파일에서는 유니코드 기호를 ‘문자 참조’ 라는 형식으로 표현합니다. 따라서 HTML 파일에서 사용할 strings.Replace() 등의 함수에 따옴표 등의 기호를 생각 없이 넣는다면 문자열이 제대로 바뀌지 않을 것입니다. 다행히도 html.UnescapeString()이라는 함수가 html 패키지에 내장되어 있어서, 그를 활용해 허무할 정도로 간단히 문제를 해결하였습니다. (만일 처음 테스트를 할 때 챕터 이름에 따옴표가 들어가지 않는 책으로 했다면 영원히 문제를 찾지 못했을 겁니다…)

이를 모두 고치고 테스트해보면 정상적으로 epub 파일이 만들어집니다!

개선해야 할 점

일단은 작동만 하도록 코드를 고친 상태이기 때문에 개선해야 할 점이 아직 많이 남아 있습니다. 첫 번째는 웹사이트 파일 저장을 자동화하는 방법입니다. 지금 상태에서는 직접 번호를 붙여서 파일을 하나하나 손으로 다운로드해야 합니다. 이런 수고를 덜기 위해서 코딩을 하는 것 아니겠습니까? 코드 원작자님의 설명대로라면 로그인이 필요하기 때문에 어렵다고 하는데, 뭔가 방법이 있지 않을까요? 좀 더 편안한 사용을 위해 자동화할 방법을 강구해보아야 할 것 같습니다. 두 번째는 코드를 간소화하고 필요한 부분만 처리하는 것입니다. 지금 코드에는 사용하지 않는 CSS를 합치는 작업이나 HTML의 이미지 경로를 바꾸는 작업 등 불필요한 작업을 수행하고 있는 부분이 있습니다. 이 부분을 해결하면 좀 더 빠른 코드 실행이 가능할 것 같아 보입니다. 꾸준히 유지보수할 수 있도록 노력해 봐야겠습니다.

후기

무언가를 내 손으로 직접 고쳐서 쓸만하게 만든다는 일은 생각보다 즐거웠습니다. 앞으로 더 열심히 코딩해야겠다는 생각을 했습니다. 아, 그리고 1학기를 거쳐 생각해 본 결과 자퇴를 하지 않는 쪽으로 마음을 굳혔습니다. 조금만 더 버텨서 졸업장만이라도 따야 할 것 같습니다. 저는 여전히 도망치고 싶어하지만, 지금 도망치게 된다면 살면서 영원히 도망만 쳐야 할 것 같았습니다. 어떻게든 살아남아 보겠습니다.


Build with Jekyll and true minimal theme