최근 블로그를 거의 못했다. 이유는 개인 프로젝트를 출시 하느라 바빴기 때문이다. 오랜만에 올리는 블로그 포스팅으로 개인 앱을 출시하면서 있었던 일들을 써보고자 한다.
개발자가 되고 나서 취미로 일본어 공부를 시작했다. 내 동생은 일본에 친구가 많아서 종종 일본 여행을 다니곤 했는데 나도 같이 가고 싶었다. 동생에게는 현지인 친구들이 많아 상관 없었지만 나는 최소한의 일본어는 할 줄 알아야 한다고 생각했다.
첫 출근과 동시에 종로에 있는 일본어 학원에 다니기 시작했다. 첫 날은 대표님과 미팅이 있어서 수업에 40분 지각했던 기억이 난다. 새로운 언어를 배우는 것은 생각보다 재미있는 일이었다. 아니다. 정확히 말하면 “새로운 언어를 배우는 척”하는 것은 무척 재미있는 일이었다. 일본어는 나에게 완전히 새로운 언어는 아니었다. 나는 고등학교 때 일본어 2까지 배운 적이 있었다. 심지어 내신 100점을 전교에서 유일하게 맞았을 정도로 잘했다. (물론 99% 까먹은 상태였다.)
그런 나에게 일본어 회화 왕초보반은 마치 유치원을 다시 다니는 느낌이었다. 히라가나 부터 가르쳐주시는데 나는 선생님이 내는 문제를 척척 맞추고 단어 시험도 100% 만점이었다. 기본적인 회화는 내 상대가 되지 못했다. 아주 우수한 성적으로 첫 1달을 즐겁게 다녔다.
2달째 되니까 시제를 배우면서 슬슬 밑천이 드러나 버렸다. 아아… 일본어에서 이런게 있었나? 시제 같은 고급(?) 문법은 내 머리 속에서 사라진지 오래였다. (고등학교 졸업한지 10년이 넘었다.) 심지어 재수할 때는 수능 일본어에 처참히 패해 (회화 위주의 내신만 하던 나에게 문법 문제가 훨씬 복잡한 수능 일본어는 무리…) 아랍어로 도망쳐 버린 과거가 생각났다.
열심히 하는 수 밖에 없었다. 단어장에는 심지어 한자가 나오기 시작했다. 학원 선생님의 배려로 한자 쓰기(!!!)까지 시험에 나오지는 않았지만 읽는 것 만으로도 부담스러웠다.
쿠팡에서 링카드를 샀다. 명함 만한 종이 한 쪽에 구멍이 뚫려 링으로 엮어서 다닐 수 있는 것이었다. 노트에 적어서 공부하면 잘 안외워지는 단어만 반복해서 공부할 수 없기 때문에 영어 공부를 할 때도 단어는 항상 링카드에 적어서 외우고 다녔다.
이런 식의 카드에 적어서 열심히 외웠다.
링 카드와 함께 다시 나는 날아올랐다. 버스에서 작은 링카드를 틈틈히 들고 다니면서 외웠다. 다시 좋은 성적을 거두는 학생이 될 수 있었다.
하지만 그것도 다시 1달 뿐이었다. 3개월 차로 접어드니 한자가 나오기 시작했다. 물론 2개월 차에도 한자는 있었지만 아무리 복잡해도 食정도 였다. 하지만 3개월 차부터 나오는 한자는 차원이 달랐다. 농담이 아니고 단어를 외우는 시간 보다 한자를 쓰는 시간이 더 걸렸다.
나는 개발자였다. 개발자는 “세상의 문제를 컴퓨터로 해결하는 사람”이지 않는가? 수신제가치국평천하(?)라고 자기 자신의 문제도 해결 못하면서 어떻게 세상의 문제를 해결하려고 하는가? 앱을 만들어야겠다 다짐했다.
위 포스팅에 처음 내가 단어장을 만들게 된 계기를 상세히 적었다.
처음에는 일단 내가 사용해야 하니까 디자인, 코드 퀄리티 이런거 다 집어치웠다. 일단 되는게 중요했다. 빨리 매일매일 한자를 쓰느라 쥐날 것 같은 팔을 해방시키는 것이 목표였다. 아주 기본적인 MVVM과 서비스 레이어만 분리하고서 만들어 나갔다.
파이어베이스를 DB로 두고 단어 추가는 맥으로 공부는 아이폰으로 하는 구조였다. 링카드에 비해 100배는 편했다. 너무너무 잘 쓰고 있었다. 혼자 공부하는데 필요한 다양한 기능들을 하나하나 추가하면서 개발도 많이 는 것 같다. 물론 여전히 코드는 엉망이었다. 모조리 싱글톤을 쓰고 전역에 선언한 것도 많았다. 말로만 들었던 기술 부채가 쌓이고 있었다.
슬슬 앱은 링카드가 할 수 있는 모든 것을 하고도 좀 더 많은 기능들을 제공하기 시작했다. 그 즈음되서 앱이 기능적으로 충분하다고 생각했던 나는 코드가 눈에 들어오기 시작했다. 그래 나도 이제 1년이 넘은 개발자인데 깃허브에 이런 코드를 올리고 있을 수는 없지. 일단 아는대로 최대한 깔끔한 MVVM으로 바꾸고 중복된 코드는 하나로 합쳤다. DI도 최대한 적용하려고 노력했다. 이 과정에서 깨끗한 코드, 좋은 아키텍쳐를 추구하기 위해서 많은 공부를 했다.
회사에는 iOS 개발자가 총 3명 있었는데 (나 포함) 그 중 가장 선임이었던 사람이 매번 회사 프로젝트를 TCA로 바꿔야 한다고 하고 다녔다. 그 사람 덕분에 RIBs를 비롯한 좀 더 선진(?) 아키텍쳐에 대해 배울 수 있었다. 좋은 아키텍쳐에 대해서 고민을 하고 있던 나는 TCA가 떠올랐다.
TCA는 SwiftUI 앱을 위해서 만들어진 아키텍쳐로 SwiftUI의 @State 혹은 @StateObject 때문에 발생한 문제를 쉽게 해결해줄 수 있었다. 당시 나는 상위 View에서 하위 View의 @State 변수를 통제할 수 없어서 답답해하고 있었는데 TCA에서는 그것을 쉽게할 수 있었던 것이다. 눈이 번쩍 뜨였다.
어쩌면 충동적으로 TCA를 공부하고 바로 적용하기 시작했다. 많은 우여곡절이 있었지만 앱의 모든 부분에 TCA를 적용할 수 있었다.
언젠가 출시할 생각을 가지고 있기는 했지만 기본적으로는 혼자서 잘 쓰는 것에 만족하고 있었다. TCA를 적용한 이후에 앱은 눈부시게(?) 발전해서 나름 쓸만한 앱이라고 생각하고 있었다. 당초에 일본어를 취미로 시작했던 나는 점점 욕심이 생겨 JLPT N1에 도전하고 있었고 그러기 위해서는 한자 공부가 필수 였기에 단어를 저장할 때마다 한자를 추출해주는 기능까지 개발해서 유용하게 쓰고 있었다.
앱 스토어에 올라온 일본어 단어장은 대부분 초보자들을 위한 것이 많아서 한자 기능은 차별점이 될 것이라고 생각했다.
출시를 하려면 일단은 디자인부터 바꿔야 했다. 아래에서 보듯이 나만 쓰는 앱이기 때문에 디자인은 처참했다. 나는 똥손이었다. 가장 치명적인 것은 색에 대한 감각이 제로였다. 대학 시절 컴퓨터를 잘한다는 이유로 PPT 담당을 한 적이 있었는데 PPT를 온통 원색으로 채우는 바람에 욕을 먹었다. 그 다음 PPT는 전부 파스텔톤으로 채우는 바람에 욕을 먹었다.
색을 쓰면 망할 것이 분명했다. Black & White를 컨셉으로 잡고 앱을 나름대로 디자인하기 시작했다. 원래는 Figma를 써보려고 했지만 배우는데 시간이 너무 오래 걸릴 것 같아서 일단은 그냥 아이패드에 스케치하고 코드를 짰다.
나름 열심히 한 다음에 친구들에게 피드백을 받았는데 한 친구는 “디자인만 적용하면 괜찮겠는데”라고 했다. 그 친구와는 연락을 잘 안하게 되었다.
기왕 출시하는 것 500원이라도 벌고 싶었다. 왜 블로그를 돌아다니다 보면 출시한 앱으로 커피 한잔씩 사먹는다는 후기가 많지 않은가? 하지만 유료 앱으로 내기에는 자신이 없었다. 아직 유료화 할만한 컨텐츠는 부족하다는 생각이 들었기 때문이다. 광고를 붙이기로 했다. 구글 애드몹을 달았다. (참고로 현재까지 3달러 벌었다. 100달러부터 출금이 가능하다고 한다.)
출시를 하려니까 혼자 쓸 때는 필요 없었던 기능들을 만들어야 했다. 예를 들어 데이터 수정 기능, 나는 만약에 저장된 단어가 틀리면 파이어베이스 콘솔, 나중에는 iCloud 콘솔에 직접(?!) 접속해서 수정하곤 했는데 다른 사용자에게 이렇게 수정하게 할 수는 없었다.
각종 에러 핸들링을 추가하는 것도 마찬가지였다. 예를 들어 단어, 뜻 중에 하나의 필드가 비어 있으면 단어 저장이 안되도록 했는데 사용자에게는 저장이 안되는 이유를 alert로 보여주어야 했다.
가장 중요한 것은 “로그인”을 구현하는 것이었는데 나름 출시 일정이 있었던 나는 이런 복잡한(?) 기능을 구현할 시간이 없었다. 따라서 CoreData로 DB를 교체하고 이를 CloudKit을 사용해서 동기화 할 수 있도록 했다. 이러면 로그인 같은 계정 관련 기능을 추가할 필요가 없었다.
출시 하기 전에 일본어 공부를 하는 친구에게 Test Flight를 통해서 피드백을 받았다. 그 친구는 일본어 공부를 한지는 얼마 안되어서 일본어 키보드 사용에 익숙하지 않았다. 일본어를 핸드폰으로 입력하는 것이 어려워서 사용이 꺼려진다고 했다.
원래는 이 앱은 맥으로 입력하고 아이폰으로 공부하는 컨셉을 가지고 있어서 나는 거기까지는 미처 생각하지 못했다. Vision Kit을 이용해서 OCR 기능을 추가해서 사진으로 단어를 추가할 수 있도록 했다.
그 외에 스크린 샷, 개인정보 처리방침 등등 자잘한 과정들을 거쳐서 드디어 출시하게 되었다.
어제 JLPT 시험이 끝났다. 덕분에 시간적 여유가 나서 다시 블로그를 할 여유도 생기고 좋다. 앞으로 수험 생활만큼 계속 빡세게 일본어 공부를 할 생각은 없지만 꾸준히 일본어 공부를 할 생각이다. 내 사용 경험을 바탕으로 이 앱을 계속 발전시켜나가고 싶기 때문이다.
나는 속성(?)으로 일본어 공부를 했기 때문에 한자를 보면 읽을 줄은 아는데 쓰지는 못한다. 언젠가는 한자도 척척 쓰는 실력을 가지고 싶다. 아이패드와 애플 펜슬을 활용해서 한자 쓰기를 공부할 수 있는 기능을 최우선적으로 추가하고 싶다.
요즘 언어 교육 앱들은 전부 인공지능을 내세우고 있다. 나도 AI를 활용해서 단순히 사용자가 입력한 데이터 뿐만 아니라 새로운 데이터를 제공할 수 있는 앱을 만들고 싶다.
내가 iOS 개발자가 된 이유 중에 하나는 애플 생태계에 반했기 때문이다. 내 앱도 다양한 생태계에서 활용할 수 있는 앱으로 발전시키고 싶다. 그 시작 중 하나가 애플 워치에서도 앱을 지원하는 것이다. 지옥철에서도 일본어 단어를 공부하는 갓생을 사는 사람들을 위해 이 앱을 바치고 싶다.
블로그에 이런 신변잡기적인 글을 쓰는 것은 처음인 것 같다. 일기에 한번 정리한다고 쓰다가 포스팅을 하면 좋겠다 싶어서 중간중간 소제목과 이모지를 달고 포스팅 형식으로 바꾸어 보았다. 때문에 반말이다. 매번 존댓말로 (컨셉입니다) 포스팅을 했는데 말이다.
어쨌든 앱 출시와 JLPT 공부로 블로그를 잠시 쉬었다는 변명 겸 앞으로의 다짐을 남기기 위해 이 글을 썼다.
안녕하세요!!! 어플 너무너무 잘 사용하고 있습니다. 다만 한가지 여쭙고자 문의드리는데요, 혹시 단어 삭제를 어떻게 하면 될까요? 삭제가 잘 되지 않아 안내된 방법대로 해봤는데도 클릭해도 아무 변화가 없어서요.
일본어 공부 이제 시작하려는데 본인이 정리한 단어를 저장할 수 있는 어플이 많이 없어서 찾고있었거든요. 예문(혹은 비고)를 직접 추가할 수 있는 기능을 추가해주신다면 너무 좋을 것 같아요! 감사합니다!