기능 구현 완료!

녹녹이라는 프로젝트를 생각하고 시작한건 2022년 개발일지 카테고리에 첫 글을 쓰면서였다. 그 뒤로 도메인도 사고 이것저것 하다가 늘 그렇듯 2-3달 지나서 방치해 두었었다. 바쁘다는 핑계로.. 그렇게 또 다시 반복되는 삶을 살고 이루지 못한 일들에 대한 아쉬움이 쌓여갈때 뭐라고 해야겠다는 생각이 들었다.

당시 녹녹과 같이 하고 싶었던 유니티 에셋만들기 목표를 최소한으로 줄여서 만들고 출시해 본 것이 2024년 10월 경.. 그리고 12월까지 몇가지 에셋을 더 만들어 출시했다. 조금씩 수익도 나오고 반응도 좋아졌지만 사이드 프로젝트로서의 한계가 명확해 녹녹 프로젝트를 다시 시작하기로 마음먹었다.

그래서 올해 1월부터 녹녹을 다시 만들기로 결정했는데 기존 폐쇄형 SNS아이디어를 데이트 앱으로 피봇해서 앱으로 만들다가 다시한번 프로필 앱으로 변경하게 된다.

플러터로 구현했다가 웹으로 옮기고 인프라/백엔드를 3-4번 갈아 엎은 다음 지금의 구조가 만들어졌다. Nuxt 와 클라우드 플레어 그리고 분리된 디비전용 서버, 통계서버, 레디스 서버. 대부분의 기능을 클라우드플레어를 이용하게 되었는데 자체호스팅/다른 서비스들을 다 돌아보면 내린 결론이었고 지금은 굉장히 만족하고 있다.

매일 작업한 것은 아니었지만 꾸준히 기능개발을 한 덕분에 어제 비로소 내가 생각한 MVP를 완성했다. 아직 많은 구멍이 있어서 출시를 할 수는 없지만 2-3주 정도의 시간이 지나면 초기 서비스를 오픈할 수 있을것 같다.

이 프로젝트를 시작하고 개인적으로도 많은 일들이 있었는데 그 와중에 이렇게 점 하나를 찍게 될 수 있다는게 너무 다행이다. 생각보다 길어지기는 했지만 직장에 다니고 집안일이나 여러 일들을 하는 와중에 성취한 것이라 성공 여부와 관계없이 성취감을 느끼게 된다.

이제 마무리의 시간이다. 다음주 부터 2주간 휴가라 8월말까지 마무리 할 수 있을지 9월까지 넘어갈지는 모르겠지만 이제 1-2달이면 서비스 런칭을 할 수 있다는 거다. 그리고 홍보도 하고 기능 개선도 하고 또 다른 일들이 시작되겠지. 마음속에는 비슷한 류의 다른 서비스들도 생각하고 있다. 한 번 해 보니 이런 부분에서 배우게 되는것도 아주 많다.

내가 중년 그리고 행복

믿기지 않을 정도로 빨리가는 시간 때문인지.. 아니면 내가 어렸을 때 생각했던 지금 내 나이의 모습이 상상과 달라서인지 내가 중년이라는게 실감이 나지 않는다.

정신 연령은 12세 정도에서 멈춘것 같고 여러가지 잡다한 지식만 늘다가 아이들 키우느라 혼빠지고 독일로 와서 엎치락뒤치락 하다보니 40대 그것도 중년이라니??

지금 생각하면 딱 한가지 크게 달라진게 있는데 행복해지고 싶다, 행복하게 살아야 겠다 같은 생각을 하지 않는 다는것이다. 애초에 행복은 가까이 있는 것이라 생각했지만 실제로 어떤건지 몰랐던 어린 시절에 비해 지금은 나를 행복하게 하는것이 무엇인지 명확히 알고 있기 때문이다.

내 행복은 정말 행운인것 같다. 20살에 정은이를 만나 서로의 조건과 아무 상관 없이 순수하게 사랑하고 가까워질 수 있는 가능성이 얼마나 될까? 25년을 같이 지내며 서로 닮아가고 같이 성장할 수 있는 가능성은? 아이들 셋 모두 건강하고 바르게 자라고 있을 가능성은? 다들 힘들어 한다는 아이들 사춘기에 매일 아이들한테 사랑한다는 소리를 들으며 살 가능성은?

나에게 이 모든 것들이 행복이다. 그리고 이 모든 것들이 나의 노력보다는 정말 운처럼 내 옆에 존재한다는 것이다. 마치 로또에 여러번 당첨된 기분이다.

나에게 이런 행운이 있다고 생각하면 다른 고민들은 모두 작아지기 마련이다. 내가 아무리 노력해도 가질 수 없는 것들은 가지고 있는데 나머지는 덤으로 느껴지는 것이다.

이직

이젠 마치 연례 행사처럼 이직을 하고 있다.

부두와 지금 회사 모두 1년1개월 재직 후 이직이다. 이 회사가 내 인생의 마지막 회사가 되기를 바랬는데 내 개인 프로젝트를 진행하기 무척 힘든 상황이었다.

새로운 기술을 배우는건 좋지만 개인프로젝트로 사용하는 기술이 아니라 늘 두 가지 이상의 기술을 사용해야 한다는것.

젊은 친구들이 열정과 패기로 인생을 갈아 넣자고 하는데 나는 현실적으로 그렇게 할 수 없다는 것.

시간이 갈수록 미국(혹은 예전의 한국)식 회사 문화를 강제하는 것.

등이 나에게 다가온 현실적 문제였다. 물론 의사결정이라던가 몇가지 다른 불편한 부분들도 있었지만 이직의 가장 큰 동기가 되지는 않았다.

새로운 회사는 내 개인 프로젝트 진행을 존중하고 무엇보다 근무시간에서 자유롭다는 장점이 있다. 비슷한 문화를 가진 회사에서 오퍼를 먼저 받았는데 연봉이 너무 차이가 나서 거절했다. 새로운 곳의 조건은 지금보다 살짝 좋아진 편이지만 그것 또한 아주 큰 의미는 없다.

내 프로젝트 진행을 위한 시간과 조건을 개선하는 것으로, 그리고 이것이 나의 동기를 더욱 강하게 해 줄것으로 믿는다.

이번 이직도 지난 회사에서의 인연으로 초대받다 시피 해서 들어가게 되었다. 이 전에 오퍼를 준 회사 또한 첫번째 메일에서 오퍼를 줄 정도로 인연의 효과는 강력했다. 지금 가는 회사에서도 한가지 기대가 있다면 이러한 인연을 더 만드는 것이다. 독일에 와서 8번째 회사인데 처음 두 번의 회사만 나 스스로 지원을 했고 다섯번은 모두 추천으로..한 번은 창업자 요청으로 합류했었다.

독일에 처음 와서 여기저기 이력서 내고 면접봤던 때를 생각하면 정말 격세지감이다.

느리지만 올바른 방향으로 가고 있다고 믿는다.

Before you ask…

If you want a meaningful answer to your question, you need to invest enough thought into crafting a good question. More often than not, you’ll discover the answer yourself through this process of careful consideration.

Asking questions out of mere curiosity or without sufficient reflection wastes everyone’s time and rarely yields the insights you’re seeking anyway.

True questioning is part of the journey toward finding your own answers, not a shortcut to rely on others.

또 다른 마일스톤

다음 큰 업무로 넘어가기전 찝찝했던 부분들과 지금 먼저 처리하면 나중에 편할것 같은 부분들을 모두 정리했다.

먼저 클라우드플레어 자동배포를 완료했다. jsonwebtoken 패키지가 클라우드플레어에서 지원하지 않아 조금 삽질.. 그래도 덕분에 넉스트러브 디스코드에서 여러 인사이트를 얻었다. 특히 인증관련해서 내가 수파베이스를 쓰는게 최선인지에 대해 고민하게 되었다. 프로젝트 정식 런칭 전에 이 고민에 대한 결론을 내려야 할것 같다.

프로필 편집 레이아웃을 적용하면 복잡도(사용성 측면에서)가 늘어날것 같아 고려하지 않고 있었는데, 기본적인 순서 변경만 지원하다 동적인 레이아웃을 최대한 편하게 지원하는 기능을 넣었다. 복잡도는 늘었지만 옵셔널한 기능이고, 이 기능 덕분에 오만가지 변화가 적용될 수 있다고 생각하니 구현하길 다행이라는 생각을 했다.

공개된 패키지로 쓰다가 원하는 기능 지원이 안되어 결국 새롭게 만들어야 했지만 일단 예상한대로 잘 동작한다. 이 기능 때문에 시간을 좀 많이 쓰고 답답했는데 오늘 완성이 되어 속이 다 시원..

이미지 크롭 기능을 빼고 원본을 사용하기로 했다. 레이아웃 기능이 추가 되면서 원본 사용시 이점이 더 크기 때문에.. 비디오는 처음부터 그렇게 하고 있어서 다행이었다. 덕분에 사이트는 더 가벼워지고 기능상으로도 편해졌다.

초기 위치 관련해 수정할 수 있도록 수정메뉴를 추가할 생각이다. 여기까지 하면 정말 다음 단계로 넘어가도 되는데.. 다음 빅 마일스톤은 소셜기능을 추가하는 것이다.

동영상이 느리네..로 시작된..

플러터가 애플/안드로이드 지원하는 일반적인 서비스 앱 만들기에 생산성이 아주 좋았다.

서버가 어느정도 정리되어 앱만 만들면 되겠다 생각해서 이미지와 동영상 포스팅 하는 기능을 만들었다. 동영상 트림 기능도 넣고 이미지 크롭이랑 편집 기능도 다른 패키지를 사용해 이쁘게 만들었다.

그리고 사용자 컨텐츠가 보이는 페이지도 만들고 모든 파일은 클라우드플레어R2에서 무료로 호스팅!

음..기능 자체는 잘 만들어졌는데 웹 버전으로 익스포트하니까 문제가 생겼다.

일단 초기 로딩이 너무 느려..플러터에 추가 패키지들까지..사용자가 받아야 할 초기 파일 용량이 약 10메가에 육박했다.
더 큰 문제는 동영상 편집 기능이 웹을 지원하지 않는것이었다. FFmpeg 패키지가 무겁고 플러터 정식 지원을 하지 않아 ios/Android 네이티브를 활용하는 것으로 했더니 웹에서는 동작을 하지 않는 것이었다.

그리고 미묘하게 반응성이 좋지 않은것도 맘에 걸렸다.

웹만 따로 만들어야 하나…고민, 웹은 뷰어만 만들고 어드민은 앱을 다운로드하게 유도할까 고민…여러 고민을 하다 웹을 먼저 앱을 나중에 만드는 것으로 결정했다. 만드는 서비스 특성상 접근성이 중요해서 비로그인 유저의 웹 접근을 포기할 수 없었기 때문이다.

1월중순부터 2달 반 정도를 만들어온 플러터 앱을 포기하기로 했다. 새로운 테크스택은 Nuxt.. Vue 는 좀 써봤는데 리엑트는 싫고 넉스트 한번 써보자는 생각으로 결정했다. 따라서 전에 node 로 만들었던 API서버도 옮겨야 했다.

그리고 지난 2주간(2주밖에 안되었다는게 믿기지 않지만), 백엔드 재구성에 기존 플러터 앱에서 지원하는 대부분의 기능들을 웹으로 다시 구현했다. 웹 기반의 동영상 편집기까지 구현해야 했고 간단한 이미지 크롭에 퍼포먼스가 안나오는 페이지들 개선, 동영상과 이미지 호스팅을 R2에서 유료 서비스로 이동, 내가 만든 Analytics 서버를 단순화 시키고 독립시키고 Umami를 이용한 사용자 통계 분석, 소셜로그인까지 모두 구현했다.

거기에 플러터로 만들 예정이었던 대시보드, 프로필 수정, 아카이브, 삭제등의 기능도 추가했고 디자인도 심플하게.. 모바일에서 비디오 플레이어 로딩이 너무 불안해서 이것저것 삽질을 하다 지금은 정말 초기로딩 시간 0.1초로 최적화된 결과물이 나왔다.

휴..간만에 즐거웠던 시간들이었다. 정말 오늘 커밋 히스토리를 보고 2주밖에 걸리지 않았다는것에 너무 놀랐는데 풀타임으로 한것도 아니고 주말에 놀고 약속도 있었는데 내가 생산성이 아직 좋구나 생각했다.

넉스트 사용하는 관계로 클라우드플레어로 배포해보려 했는데 알수없는 오류로 일단 멈췄지만 다시 도전해 보려고 한다. 나중에 어떻게 될 지 모르겠지만 정말 클라우드플레어가 갑이다. 어떤 서비스와 비교해도 성능과 가격에서 압도적이니 쓰지 않을수가 없다.

이제 남은 큰 업무들은
– 소셜
– 실시간
– 결제
– 보안
– 폴리싱

정도이다. 정말 기본 베이스가 다 완성된 기분이라 마일스톤 확보 차원에서 로그한번 남김.

Einbürgerungstest

그렇게 예약 잡기 어렵다는 Einbürgerungstest 예약을 2일만에 잡아냈다.

베를린은 이미 7월까지 예약이 다 차있다느니 브란덴부르크로 가서 예약을 해야 한다느니 VHS에 직접 가서 해야 한다느니.. 작년에 할 수 있을 때 해 놓을걸 후회하며 베를린 모든 VHS에 이메일을 보냈다. 추가로 브란덴부르크의 몇 도시에도 그리고 Leben in Deutschland 시험을 보는 기관에도 메일을 보냈다.

거의다 전부 안된다는 답장.. 나중에 다시 물어보라는 답장 등.. 나중에 물어보라는 날짜를 체크해 놓고 구글 크롭 탭에 귀화시험으로 그룹지어 매일/시간마다 새로고침 할 페이지들을 올려놓았다.

받은 답장중에 하나가 수요일 10시, 12시에 VHS페이지를 확인해 보라는 메세지가 있었는데 오늘 화요일이지만 혹시나 해서 VHS페이지를 뒤져보니 이게 웬열? 베를린 판코에 떡 하니 시험 3개가 등록! 하지만 신청은 오직 이메일로 그리고 선착순으로 받는다고 한다.

빛의 속도로 PDF를 다운받고 내용을 적기 시작한다. 나는 정은이것 까지 같이 신청해야 하니까 정은이 정보까지 2장 작성해서 각각 내 이메일과 정은이 이메일로 판코 VHS에 전송 그리고 오후에 딱 하고 접수 확인 이메일을 받게 되었다.

안타깝게도 시간은 다르지만 무려 5월에 치루는 시험 접수를 하게 되었다!

이 시험은 쉽다고 해서 시민권 신청하는 사람들이 젤 나중에 접수하려다 6개월씩 일정을 지연시키는 함정같은 시험인데 일단 이걸 접수했으니 절반은 온 기분이다.

나와 정은이한테 B1 언어시험이 가장 큰 고비겠지만 이건 뭐 시험도 자주 있고 돈이 문제니까..

이제 B1 준비를 시작할 때가 되었다. 독일 살이 11년만에 독일어 공부 시작..아주 많이 창피하지만 살다보니 그렇게 되었네..

자전거

올해 1월부터 꾸준히 자전거를 타고 있다.
편도 7키로미터에 30-35분정도 걸리는것 같다.
이걸 왕복 15키로정도.. 회사 출근할 때 마다 자전거를 탄 지 2달 반이되었다.

물론 주 5일 모두 타지는 않고 보통 3-4일 평균적으로 탄것 같은데 너무 오래간만에 운동을 해서 그런지 1월달은 조금 힘들었지만 지금은 많이 춥지도 않고 괜찮다.

자전거를 타면 자꾸만 속도를 내려고 하는데 그래봐야 신호에 걸리고 미친듯 속도내 봐야 5분정도 빨리 도착하는 관계로 요즘은 가능한 천천히 타려고 노력한다.

천천히 타면 비로소 주변의 경치가 보인다.

자전거를 타며 가장 좋은건 생각을 정리할 수 있다는 것이다. 하루종일 컴퓨터 앞에서 일하면 내가 어디로 가는지 무엇을 하는지 모르고 시간을 보내게 된다.

그 다음 좋은건 건강이다. 지금은 계단을 오르거나 걸을때 확실히 몸이 가벼워진것을 느낀다. 그렇다고 몸무게가 줄어든건 아니다. 자전거 타자마자 2키로정도가 늘어서 역대 최고 몸무게를 갱신하고 지금 그대로 유지중이다. 다리는 2월까지는 계속 통통 부어있었는데 지금은 좀 괜찮고 옆구리살은 느껴질 정도로 줄었으니 그냥 근육이 늘지 않았을까 생각한다.

무엇이든 3달을 하면 조금씩 버릇이되고 3년을 해야 몸에 완전히 익는다더니 3달이 다 되어가니 ‘타기 싫다’ 는 마음은 사라지고 그냥 별 생각없이 자전거를 타고 회사로 가게 된다.

애들도 키가 많이?커서 어른용 자전거 2대를 더 주문했다. 하도 키가 안커서 주니어 사이즈는 스킵하고 몇년간 자전거 없이 있었는데 이젠 좀 커도 탈 수 있겠지 생각하고 주문했다.

세일하는 놈들로 주문했는데 400유로씩 2대.. 요즘 환율 기준으로 계산하면 대당 60만원이 넘는 가격이다. 진작 사줬어야지 생각하면 별 생각이 없다.

독일에 와서 산 자전거만 지난 11년간 12대, 도둑맞은게 4대, 버린게 1대, 중고로 팔거나 준게 2대이다. 도둑맞은 3대는 보험으로 보상받고 보험계약 해지당했던 기억이 난다.

애들한테 사주는 마지막 자전거가 되겠지.. 지우는 이미 4년전부터 타고 있고.. 이제 모든것들이 이런식이다. 우리가 아이들을 낳기 전과 후에 상상도 못한 변화를 겪었듯, 아이들의 독립과 함께 또 한 번 큰 변화를 겪게 될 것이다.

모두가 함께 하는 마지막 여행이라던가.. 이제 하나 둘 둥지를 떠나 날아오를 때가 된거다. 물론 우리가 여전히 물심양면으로 지원해야겠지만 마음으론 이미 어른들이니까.

어제 지우 콘서트 구경하다 쉬는시간에 아들들한테 아빠 힘든데 일 관두고 쉬거나 조금 벌고 조금 일하면 어떨까 했더니, 시우는 농담으로 아빠 일 더해 그러고 호야는 당연히 조금 일하라고 한다. 아빠 일 조금하면 응팔에 덕선이네 집처럼 살아야 할지도 모른다고 하니 ‘그건 좀..’ 그러면서 대화를 거부했다.

그래..너희들한테 엄마아빠는 그런 존재일 것이다. 아무 논리도 아무 이유도 없이 그냥 그 자리에 그 역할로 있는 존재. 그래서 좋든 나쁘든 변화가 생기면 안되는 그런 존재 말이다.

나도 그랬다. 내 엄마아빠는 그렇게 영원히 그대로 일거라고. 지금은 할머니 할아버지가 되어 여기저기 아프고 약해졌지만 난 내 엄마아빠도 그렇게 그대로이면 좋겠다. 그러면 나도 어느 새 내 아이들 나이로 돌아가서, 무너지지 않을 그 튼튼한 벽에 기대, 바닥에 누워 아무 걱정 없이 뒹굴거릴 수 있을것 같다.

근데 모두들 미안..아빠는 회사 그만둘거야 꼭~ 니들 학비는 니들이 알아서 해~

인프라 셋업

백엔드로 노는게 생각보다 재밌다. 비용과 퍼포먼스를 고려해 여러 시도를 해 보고 다음과 같이 정착했다.

추후 로드밸런서로도 활용될 nginx 프록시 서버, node 로 만든 api 서버, 인증,디비,실시간 통신을 담당한 수파베이스 마지막으로 캐싱작업에 활용될 레디스 서버로 구성하였다.

도메인, 파일 호스팅은 클라우드 플레어에서 담당.

서비스 특성상 데이터가 공개되므로 트래픽과 디비콜을 줄이기 위해 데이터는 가능하면 레디스에 유지하고 실시간 업데이트는 수파베이스를 통해 공유, 디비 업데이트는 필요한 부분만 하도록 최소화 하는 방식이다.

서버들은 오라클에 1시피유+1기가램+50기가를 레디스 전용으로 돌리고 나머지 4시피유 24기가램 100기가에 모든걸 도커로 때려박았다.

인증/디비/실시간 통신 모두 지역별 배포를 포함해 수평 확장 방법도 대충 계획해 두었다. 제발 이걸 진지하게 고민할 만큼 서비스가 잘 되면 좋겠다.

기반 구조 스터디와 작업이 완료되었으니 이제 실제 기능 구현에 집중해야겠다!

사이드 프로젝트

게임이 아닌 서비스를 만들어보고 있다. 이것도 무려 5년전부터 기획했던 프로젝트이다.

아이디어를 5년 묵혀놓으니 그 형태가 이리저리 바뀌었다가 다시 원래 아이디어에서 다이어트 된 형태로 나왔다. 맘에든다. 쓸데없이 복잡하지 않고 심플하게 바뀐 아이디어에 목적도 분명하고 방향도 맞게 아이디어가 정리된 기분이다.

디테일한 부분들의 정리가 남아있지만 지난 한 달 동안 이것저것 프로토타입을 만들고 있는 중이다.

기술적으로도 굉장한 계획이 세워졌다가 하나씩 다이어트해서 현실적인 구현을 바라보고 있다. 내가 직접 모든것을 한다는 것은 즐겁고 성취감 넘치는 일일지 모르지만 서비스를 운영하고 키워나가기엔 현실적으로 불가능한 부분이 있다. 내가 만드는 하나의 프로덕트에 집중하기 위해 아쉽지만 다른 것들은 기존의 솔루션을 최대한 활용하기로 한다.

스케일이 확장되기 전에 비용이나 구조를 걱정하는건 바보같은 일임에 분명하지만 그렇다고 마구잡이로 만들다간 나중에 기회를 잃을 수 밖에 없다. 베스트프락티스가 아니어도 며칠정도 구조에 대해 고민해 보는건 나쁠게 없다. 최대한 다른 솔루션을 쓰고 최소한의 비용으로 향후 스케일 확장이 용이한 구조로 시작하게 되었다.

자잘한 비용들을 아낄 수 있는것도 좋지만 이정도 계획이면 마음의 평안을 찾을 수 있다는게 너무 좋다. 뭔가 이것저것 제한이 걸리고 비용이 발생한다는 생각은 개발에 집중을 못하게 해 주기 때문이다.

오라클 무료티어에 도커로 오픈소스 솔루션을 올리고 파일 트래픽은 클라우드플레어로 감당하기로 했다. 눈에 보일 비용 증가는 클라우드 플레어 스토리지인데 1테라에 월 15달라, 트래픽은 무제한이라는 조건이면 나쁘지 않다. 심지어 스토리지 비용이 다른 어떤 클라우드보다 싼것 같은데 선택의 여지가 없을 정도이다.

얼기설기 기본중에 기본 기능들은 구현이 끝났고 3월달은 베이스가 될 기능을 완성해 MVP를 선보일 MVP?를 만드는 것이 목표다. 즉 이번 버전은 다른 솔루션들과 큰 차이가 없지만, 큰 차이를 만들어 내기 위한 기본 준비작업을 하는것을 목표로 한다. 그러면 4월달에는 유니크한 기능에 집중할 수 있을것 같다.

인프라 설정과 설계도 끝났고, 기본 기능 구현도 완료 되었다. 어떤 결제 솔루션을 붙일지 아직 결정하진 않았지만 이건 옵션같은 부분이고.. 3월에 목표만큼 완성이 되면 애플개발자 프로그램에 다시 가입해 앱스토어에도 알파버전을 출시할 계획이다. 4월에 베타 5월 소프트런치를 하면 이 프로젝트가 수익성이 있을지 판가름 할 수 있을것 같다.

조금의 가능성이 보인다면 6월즈음에 회사를 그만두고 7월부터 더 집중해서 진행해 보고 싶은 욕심이 있다.

하지만 어디 첫술에 배부르랴..내가 재밌게 사용할 수 있는걸 1순위로 해서 만드는걸 즐기다 보면 좋은 결과가 있겠지!