처음 앱을 만들기 시작했을 때 머릿속에 그렸던 그림은 단순했어요. AI한테 화면 이렇게 만들어 줘, 데이터 이렇게 저장해 줘 시키고 나면 마지막에 로그인 버튼 하나 붙여서 마무리하는 거. 카카오 버튼 누르면 카카오로 들어가고, 구글 버튼 누르면 구글로, 아이폰에서는 애플 버튼이 뜨고. 사용자 입장에선 한 번 누르면 끝나는 일이니까 만드는 쪽도 비슷한 무게일 줄 알았죠. 길어 봐야 하루 정도면 끝나겠지 했고요. 그게 얼마나 큰 착각이었는지는 첫 앱을 거의 다 만들어 놓고 로그인을 붙이려는 단계에 들어가서야 알았어요.
기도모임 앱을 만들면서 핵심 화면들은 빠르게 올라왔어요. 기도제목 올리고, 다른 분들 제목 보고, 누가 누구를 위해 기도하고 있는지 체크하고. 그쪽은 클로드 코드한테 한 줄씩 시키면 진짜로 잘 만들어 주더라고요. 그래서 이제 마지막으로 입구만 만들면 된다고 생각하고 로그인부터 들여다본 게 어느 평일 저녁이었어요. 그 평일 저녁이 사흘이 될 줄은 몰랐고요.
카카오에서 처음 들어본 단어들
가장 먼저 손댄 게 카카오였어요. 한국 앱이고, 어차피 쓰는 사람 대부분이 카카오톡을 쓸 테니까 자연스러운 첫 선택이었죠. 카카오 디벨로퍼스 페이지에 들어가서 안내문대로 따라가는데, 화면이 한 번씩 넘어갈 때마다 처음 듣는 단어가 하나씩 늘었어요. 네이티브 앱 키, REST API 키, JavaScript 키. 각각이 뭐가 다른지가 한참 헷갈렸어요. 그러다 나중에는 IAM이라는 단어까지 나왔어요. 클로드 코드가 카카오 로그인 쓰려면 IAM 권한도 같이 설정해 줘야 해요 라고 알려주는데, 그게 무슨 말인지가 잘 안 들어왔어요. 그때까지 IAM이 어디서 나오는 단어인지조차 몰랐거든요.
자세히 보니까 카카오 로그인은 카카오 쪽 콘솔에서 키 받고 끝이 아니더라고요. 우리 앱이 사용자 정보를 카카오한테 받아 올 때 그 통로 역할을 하는 서버 같은 게 있는데, 그쪽에도 누가 권한이 있다는 걸 따로 설정해 줘야 한다는 거였어요. 그게 IAM이라더라고요. 한쪽 콘솔에서 잘 해놨는데 다른 쪽 콘솔에서 권한이 비어 있으면 카카오 로그인을 누르는 순간 INTERNAL 이라는 짧고 무뚝뚝한 에러 한 줄이 떠요. 왜 안 됐는지를 그 한 줄 가지고는 알 수가 없었어요. 그 단어 한 줄로 첫 밤이 통째로 갔어요.
그 와중에 또 한 번 발이 걸렸던 게, 처음엔 첫 앱에서 쓰던 카카오 앱 키를 그대로 두 번째 앱에서도 쓰면 되지 않나 싶어서 한 번 그렇게 해본 적이 있어요. 결과가 어이없었어요. 두 번째 앱에서 카카오 로그인을 누르니까 첫 앱이 열렸어요. 카카오 콜백이 둘을 구분하지 못하고 먼저 인식된 쪽으로 던져버린 거였죠. 그날 이후로 새 앱을 만들 때마다 카카오 앱은 카카오 쪽에서 하나씩 새로 발급받는 게 그냥 규칙이 됐어요.
카카오는 그 외에도 풀어야 할 매듭이 좀 있었는데, 그 INTERNAL 에러를 붙잡고 보낸 사흘째 새벽 장면은 따로 한 편을 쓸 만한 분량이라 거기서 풀어 봤어요. 그때 헤맨 끝에 정리해 둔 카카오 로그인 디버깅 순서도 같이 적어 뒀고요. 여기선 이 정도로 줄일게요.
구글에서 갑자기 등장한 SHA
카카오를 어찌어찌 통과시키고 다음으로 손을 댄 게 구글이었어요. 구글은 카카오보다는 친절해 보이더라고요. 파이어베이스 콘솔에 들어가서 구글 로그인 켜는 버튼 하나 누르고 나오는 안내가 길지 않았거든요. 그래서 이건 좀 쉽게 끝나겠다 싶었죠. 안드로이드 에뮬레이터를 띄워서 로그인 버튼을 눌러봤는데, 화면이 잠깐 깜빡하더니 그냥 닫혔어요. 에러 메시지도 거의 안 떴어요. 아무 일도 안 일어난 것처럼 그냥 원래 화면으로 돌아왔어요. 이게 더 무서워요. 빨간 줄이 떠 있으면 그 줄을 가지고 뭘 해보기라도 하는데, 아무 반응 없이 닫혀버리면 어디서부터 들여다봐야 할지 감이 안 와요.
그쯤에서 SHA라는 글자를 처음 만났어요. 클로드 코드한테 물어보니까 구글 로그인 안드로이드에서 쓰려면 SHA 지문을 콘솔에 등록해 둬야 해요 하더라고요. SHA가 뭔지부터 한 번 더 물어봐야 했어요. 우리 앱이 누구 손으로 만들어진 빌드인지를 표시하는 지문 같은 거라는데, 그게 디버그용으로 빌드할 때하고 실제 출시용으로 서명할 때 각각 다르다는 게 그 다음 함정이었어요. 그러니까 같은 앱이라도 내 컴퓨터에서 테스트할 때 쓰는 지문이 있고, 마켓에 올리려고 서명한 빌드에 쓰는 지문이 또 있어요. 두 개를 다 콘솔에 등록해 둬야 해요. 그것도 SHA-1, SHA-256 이라고 형식이 두 종류예요. 합쳐서 네 줄이고요.
여기서 끝났으면 차라리 깔끔했을 거예요. 한참 뒤에, 첫 앱을 플레이마켓에 정식으로 올리고 나서 며칠 지났을 때, 안드로이드 폰을 쓰는 분한테서 구글 로그인이 안 된다는 연락이 왔어요. 제 폰에선 잘 됐거든요. 한참 들여다보고서야 깨달았어요. 플레이스토어가 앱을 사용자한테 내려줄 때 구글이 자기네 키로 한 번 더 서명을 해서 내려준다는 거였어요. 그러니까 제가 등록해 둔 출시용 지문하고, 사용자 손에 들어간 빌드의 지문이 서로 다른 거죠. 그 구글이 다시 서명한 키의 지문을 또 따로 가져와서 콘솔에 등록해 둬야 한다는 사실을 그때 처음 알았어요. 솔직히 왜 이걸 굳이 둘로 나눠놓은 거지 하는 의문은 지금도 풀리지 않아요. 그냥 그렇게 해야 된다고 받아들이고 있어요.
애플에서는 같은 칸을 세 번 체크해야 했어요
애플은 또 결이 달랐어요. 카카오와 구글이 콘솔 화면에서 뭔가를 입력하는 일이었다면, 애플은 엑스코드라는 프로그램 안의 어떤 칸을 체크하는 일이었어요. 그때까지 엑스코드 자체를 거의 안 열어봤어요. 빌드는 클로드 코드가 백그라운드에서 다 돌려줬거든요. 그러다 처음으로 애플 로그인 쓰려면 캐퍼빌리티에서 그 항목을 켜야 해요 라는 안내를 받고 엑스코드를 정식으로 열었는데, 화면 어디에 가서 뭘 누르라는 건지가 한 번에 안 들어왔어요.
그때부터 매번 화면을 캡처해서 클로드한테 던지기 시작했어요. 지금 이 화면에서 어디를 눌러야 하느냐, 이 항목 옆에 있는 + 표시를 누르면 뭐가 나오느냐, 이 체크박스를 켜는 게 맞느냐. 두세 번 캡처해서 주고받으면 한 줄짜리 답이 돌아왔어요. 한 칸을 체크하고 나면 끝인 줄 알았는데, 거기서 또 한 번 발이 걸렸어요.
애플 쪽은 같은 권한 정보를 한 군데가 아니라 여러 군데에서 동시에 맞춰줘야 해요. 엑스코드 안의 캐퍼빌리티에서 체크해 둔 거랑, 그 옆에 따로 있는 엔타이틀먼트라는 파일에 적혀 있는 줄이랑, 빌드 설정 어딘가 깊숙이에 있는 항목이 다 같이 가야 작동해요. 한쪽만 체크하고 다른 쪽은 비어 있으면, 캐퍼빌리티에선 분명히 켜져 있는데 실제로 앱에선 권한이 없어요. 처음엔 그게 너무 이상했어요. 한 군데에서 켰는데 왜 다른 데서 다시 비어 있냐고요. 이게 같이 가야 하는 칸이라는 걸 알게 되기까지가 또 시간이 걸렸어요. 클로드 코드한테 한 번 풀게 했더니, 자기가 직접 그 세 군데를 다 손봐 주더라고요. 그 다음부터는 비슷한 문제 만나면 셋 다 같이 봐 줘 라고 부탁하는 게 습관이 됐어요. 그러고 나서도 가끔 새 앱에서 한쪽이 빠진 채로 빌드가 나가서 헤맨 적이 있어요. 알고 나서도 빠뜨려요.
알림 권한도 비슷한 함정이 있어요. 사실 저는 로그인보다 알림 권한 체크하는 데서 시간을 더 썼어요. 똑같이 캐퍼빌리티에 들어가서 켜야 하는데, 그게 어디 있는지, 켜고 나서도 왜 실기기에서 안 오는지를 푸느라 또 며칠이 갔어요. 그러다 알림이 9시간 늦게 오는 사건까지 터졌는데, 그건 그것대로 한 편 분량이라 여기선 줄일게요.
사흘이 그렇게 갔어요
세 개 다 붙이는 데 사흘이 걸렸어요. 평일 저녁이 끝나면 새벽 한 시까지 콘솔과 엑스코드를 왔다 갔다 했고, 그러고도 안 풀리면 다음 날 출근길에 다시 그 화면을 머릿속에서 돌려봤어요. 사흘째 새벽쯤에 카카오 로그인이 처음으로 깔끔히 돌고, 그 다음 날 저녁에 구글이 풀리고, 그 다음 밤에 애플까지 정리됐어요. 마지막에 세 버튼이 다 멀쩡히 동작하는 걸 본 순간이 묘했어요. 화면상으로는 그냥 동그란 버튼 세 개가 나란히 떠 있는 풍경인데, 그 뒤에 콘솔이 세 개고, 키가 여러 개고, 엔타이틀먼트가 따로 있고, SHA 네 줄이 등록돼 있고, IAM 권한이 어딘가 켜져 있다는 걸 그제서야 실감했어요.
그러면서 깨달은 게 하나 있어요. 코드 자체로는 로그인 붙이는 게 진짜 몇 줄이에요. 클로드 코드한테 시키면 그 몇 줄은 정말 금방 짜요. 정작 시간이 가는 곳은 그 몇 줄을 동작시키기 위해 회사 세 곳의 콘솔과 발급 절차를 통과시켜 두는 일이에요. 어느 칸에 무엇을 적어 두지 않으면 그 코드가 영원히 안 도는 거죠. AI는 코드를 잘 짜지만, 카카오 디벨로퍼스 콘솔에 제 대신 로그인해서 키를 받아 주지는 않아요. IAM 권한을 자기 손으로 켜 주지도 않고요. 엑스코드에서 마우스로 체크박스를 클릭하는 것도, 결국 제 손이 해야 해요. 그 사이사이의 사람 손이 들어가는 절차들이 진짜 장벽이었어요.
그래서 그 사흘 동안 풀어낸 답을 전부 글로벌 메모리 파일이라는 곳에 차곡차곡 적어 두기 시작했어요. 카카오에서 INTERNAL 에러가 떴을 때 어디를 봐야 하는지, 구글 로그인이 출시 후에 안 될 때는 어떤 SHA를 추가해야 하는지, 애플 로그인이 캐퍼빌리티에는 켜져 있는데 안 도는 것 같으면 어느 세 군데를 같이 봐야 하는지. 한 줄짜리 메모들이 쌓였어요. 두 번째 앱부터 그 효과가 진짜 컸어요. 같은 함정에 두 번 빠지지 않게 해주거든요. 두 번째 앱에서는 같은 일이 사흘이 아니라 반나절에 끝났어요.
코딩보다 절차가 더 무겁다는 걸 그때 처음 알았어요. AI한테 시키면 다 되는 줄 알았던 환상이 그 사흘에 좀 깨졌고요. 환상이 깨진 자리에 그 메모 파일이 들어찼어요. 이 메모가 나중에 CLAUDE.md라는 잔소리 파일로 자라는데, 그 얘기는 한참 뒤에 따로 적었어요. 어쩌면 이 시기에 만든 진짜 결과물은 첫 앱 하나가 아니라, 그 옆에 같이 자란 그 메모일지도 모르겠어요.

