앱을 한 열 몇 개쯤 만들고 나니까 만드는 일 자체는 이제 좀 손에 익었어요. 화면 짜고, 기능 붙이고, 시뮬레이터에서 눌러보고, 안 되는 데 고치고. 그 흐름이 예전만큼 무섭지 않아요. 그런데 이상하게도, 그렇게 만든 걸 진짜로 앱스토어에 올리는 마지막 한 칸이 매번 똑같이 진땀이 나요. 다 만들어 놓고, 빌드까지 다 뽑아 놓고, 이제 그걸 애플 쪽으로 쏘아 올리는 그 한 번의 동작. 그 직전이 제일 무서워요.
왜 그런가 한참 생각해 봤는데, 만드는 동안엔 뭐가 안 되면 안 되는 대로 화면이 거기 있잖아요. 빨간 줄이 떠도 내 손이 닿는 자리에서 떠요. 그런데 업로드는 달라요. 내 손을 떠나서 애플 서버 어딘가로 파일이 넘어가는 거고, 거기서 한참 진행되다가 마지막에 튕겨내는 식이거든요. 다 올라간 줄 알고 안심하고 있는데 끝에 가서 빨간 창이 뜨면, 그 막막함이 좀 종류가 달라요. 화면 안에서 나는 에러가 아니라, 저 멀리 어딘가에서 거절당해서 돌아온 느낌이라.
같은 번호로는 안 올라간다는 걸 몰랐어요
제일 처음 당한 건 버전 숫자 문제였어요. 앱을 조금 고쳐서 새로 빌드를 뽑고, 그걸 올리려고 했더니 빨간 창이 뜨면서 영문으로 길게 뭐라고 적혀 있었어요. 중간에 코드 같은 숫자가 박혀 있었고요. 그 줄을 처음 봤을 땐 진짜로 무슨 소린지 하나도 몰랐어요. 분명히 다 만들었고 빌드도 멀쩡히 됐는데 왜 안 받아주지, 하면서 모니터 앞에서 한참 멍하니 있었어요. 그날도 평일 저녁이었고, 아이 재우고 나와서 이제 올리고 자야지 했던 참이었거든요. 그 한 칸에서 막혀서 한 시간을 날렸어요.
캡처를 떠서 클로드 코드한테 던졌어요. 늘 하던 대로요. 이거 무슨 말이야 하고. 풀어준 설명은 이랬어요. 앱에는 사람들 눈에 보이는 버전 번호가 있고, 그 안쪽에 빌드 번호라는 게 또 따로 있다고요. 그런데 이미 앱스토어에 한 번 올라가 있는 버전이랑 똑같은 번호로 새 빌드를 올리려고 하면, 애플이 이건 전에 받은 거랑 같은 번호잖아, 더 높은 걸 줘 하면서 안 받아준다는 거였어요. 알고 보니 안쪽 빌드 번호만 슬쩍 올리는 걸로는 안 되고, 앞에 보이는 그 버전을 올려야 하는 자리가 따로 있었던 거예요. 1.0.0이 이미 올라가 있으면 다음엔 1.0.1로 해야 하는데, 저는 그 안쪽 작은 숫자만 만지작거리고 있었던 거죠.
이걸 알고 나니까 어이가 없으면서도 좀 허탈했어요. 코딩이 틀려서도 아니고, 기능이 안 돼서도 아니고, 그냥 숫자 하나 안 올려서 한 시간을 헤맨 거잖아요. 그런데 그게 처음엔 정말 안 보여요. 빨간 창에 적힌 영문이랑 코드 숫자만 보고 있으면 뭔가 대단히 심각한 게 망가진 줄 알거든요. 막상 풀어 보면 별것 아닌데, 그 별것 아닌 걸 알아내기까지가 매번 한참이에요.
생각해 보면 처음 출시할 때는 버전이라는 게 1.0.0 하나밖에 없으니까 이 문제를 겪을 일이 없었어요. 그런데 한 번 올라가 있는 앱을 고쳐서 다시 올리는 순간부터 이게 따라붙는 거예요. 그러니까 앱을 처음 내보낼 때가 아니라, 두 번째로 손봐서 올릴 때 처음 만나는 빨간 창이었던 거죠. 만들 줄 알게 됐다고 안심한 다음에 새로 당하는 종류의 막힘이라 더 당황스러웠던 거 같아요. 이젠 좀 됐겠지 싶은 자리에서 또 처음 보는 줄이 뜨니까요.
컴퓨터 안 가짜 폰의 찌꺼기가 섞여요
또 한 번은 좀 다른 식으로 튕겼어요. 빌드를 올렸는데 마지막에 지원하지 않는 형식 같은 말이 뜨면서 거부됐어요. 이번엔 버전 숫자도 제대로 올렸는데도요. 그 줄도 처음엔 도통 알 수가 없었어요. 분명 잘 돌아가던 앱인데 형식이 왜 문제지, 싶었죠.
이건 좀 사연이 복잡했어요. 앱을 만들 때 저는 보통 컴퓨터 안에 떠 있는 가짜 폰, 그러니까 시뮬레이터에 앱을 띄워놓고 하나씩 눌러보면서 작업하거든요. 화면이 진짜로 돌아가는지 눈으로 봐야 안심이 되니까요. 그런데 그렇게 시뮬레이터용으로 한 번 빌드를 뽑고 나면, 그 작업의 찌꺼기 같은 게 폴더 어딘가에 남는 모양이에요. 그 상태에서 곧바로 진짜 출시용 빌드를 뽑으면, 그 가짜 폰용 찌꺼기가 출시 빌드에 슬쩍 섞여 들어간다고요. 그러면 애플이 이 안에 우리가 안 받는 형식이 들어 있네 하면서 통째로 거부하는 거였어요.
이것도 클로드 코드가 풀어줬어요. 해결은 의외로 간단했어요. 그냥 깨끗이 청소를 한 번 하고, 처음부터 다시 빌드를 뽑으면 됐어요. 청소라고 하니까 거창하지만, 명령어 한 줄로 그동안 쌓인 임시 파일들을 싹 비우는 거예요. 그 다음에 출시용으로만 다시 빌드를 뽑으면 가짜 폰 찌꺼기 없이 깨끗한 게 나오고요. 그 사실을 알고 나서는, 출시 빌드를 뽑기 전엔 시뮬레이터 작업이랑 섞지 말아야 한다는 걸 몸으로 알게 됐어요. 작업하던 흐름이랑 출시하는 흐름은 한 번 갈라줘야 한다는 거요.
그날도 결국 청소하고 다시 뽑고 올리고 하면서 밤이 깊었어요. 거실 불은 다 꺼져 있고 모니터 빛만 책상에 떨어져 있는데, 빌드가 다시 도는 그 사오 분을 의자에 기대서 기다리고 있었어요. 빌드 한 번 도는 시간이 짧지가 않아서, 그 사이에 이번엔 받아주려나 하는 마음이랑 또 다른 줄이 뜨면 어쩌지 하는 마음이 같이 왔다 갔다 했어요.
매번 검색하고, 통째로 붙여넣고 물어보던 밤들
그때그때 떠오르는 그 빨간 창들을 저는 매번 검색했어요. 영문이랑 코드 숫자를 그대로 베껴서 인터넷에 쳐보고, 비슷한 글이 있나 한참 뒤지고. 그러다 잘 안 풀리면 결국 클로드 코드한테 캡처를 통째로 던지고 이거 뭐냐 하고 물었어요. 카카오 로그인 풀던 밤이나, 첫 빌드 폰에 넣던 밤이나, 결이 다 비슷했어요. 처음 보는 단어가 한 줄 안에 박혀 있으면 그 단어부터 알아내야 다음 한 발이 떨어지는 거. 출시 단계의 빨간 창들도 똑같았어요. 다만 이쪽은 내 손이 아니라 저 멀리에서 거부당하고 돌아온 거라 더 답답했을 뿐이에요.
그 밤들을 몇 번 보내고 나서 든 생각이 있어요. 출시라는 건 코딩 실력이 아니구나, 하는 거요. 코드를 잘 짜고 못 짜고의 문제가 아니라, 정해진 칸들을 빠짐없이 통과시키는 일에 더 가까웠어요. 버전 숫자 올렸나, 출시용으로 깨끗이 뽑았나, 가짜 폰 찌꺼기 안 섞였나. 이런 걸 하나씩 점검해서 다 맞으면 통과고, 하나라도 어긋나면 마지막에 튕기는 거예요. 그래서 만드는 것보다 올리는 게 더 무서웠던 거 같아요. 만드는 건 내가 아는 만큼 하는 일인데, 올리는 건 내가 모르는 칸을 하나라도 빠뜨리면 안 되는 일이라.
그래서 이 거부 사례들도 그 실수노트에 한 줄씩 박아 뒀어요. 같은 빨간 창을 또 만났을 때 처음부터 다시 헤매지 않으려고요. 버전이 같으면 앞 숫자를 올린다, 출시 빌드 전엔 청소를 한 번 한다. 이런 식으로 짧게. 그렇게 모아 둔 거부 코드별 대처법은 지금도 출시 직전에 한 번씩 들춰 봐요. 지금은 그 두 가지 거부를 만나면 노트 보고 거의 삼십 초 만에 처리해요. 처음엔 한 시간씩 모니터 앞에서 멍하니 있던 게, 이제는 아 이거 그거네 하고 넘어가요.
그런데 솔직히 말하면, 노트에 적어 두고 삼십 초 만에 처리할 줄 알게 된 지금도 업로드 버튼을 누르는 그 직전은 여전히 좀 떨려요. 이번엔 또 무슨 처음 보는 줄이 뜰까, 하는 마음이 매번 있어요. 노트에 적힌 거야 적힌 거고, 노트에 없는 새로운 빨간 창은 또 언제든 뜰 수 있으니까요. 열 몇 개를 올려 봤는데도 그 직전의 마음은 별로 안 무뎌졌어요. 어쩌면 그게 안 무뎌지는 게 다행인지도 모르겠어요. 매번 한 번 더 화면을 위에서 아래까지 훑어보게 되니까요.

