[태그:] SNS자동발행

  • [파마비아] 잘 되던 기능이 사실은 운이었다 — SNS 자동 발행이 실패한 날

    오전엔 됐는데 오후엔 안 됐다 🤔

    오늘 오전에 SNS 자동 발행 기능 테스트를 했어요. 스레드랑 인스타그램에 예약 발행이 잘 되더라고요. ‘오, 완벽하네!’라고 생각하면서 다른 일을 했죠.

    그런데 오후에 똑같은 코드로 다시 발행을 시도했는데 갑자기 둘 다 실패했어요. 스레드는 ‘요청한 자원이 없다’는 에러를, 인스타그램은 ‘미디어 ID를 쓸 수 없다’는 메시지를 보냈죠. 뭐가 달라진 걸까요? 코드는 그대로인데요.

    문제는 ‘2단계 발행 구조’였다 📝

    원인을 찾아보니까 스레드와 인스타그램은 글을 올릴 때 두 단계를 거친다는 걸 제대로 이해 못 하고 있었더라고요.

    • 1단계: 먼저 ‘컨테이너’라는 걸 만들어요. 글 내용이랑 사진을 업로드하고 준비하는 단계죠.
    • 2단계: 컨테이너가 준비되면 그걸 실제로 게시해요.

    저는 1단계를 시작한 직후에 바로 2단계를 눌러버린 거예요. 그러니까 컨테이너가 아직 준비도 안 됐는데 ‘게시해!’라고 명령한 셈이죠. 당연히 실패할 수밖에요.

    그럼 오전엔 왜 됐을까? 🍀

    이게 핵심이에요. 오전에 성공한 건 제 실력이 아니라 그냥 타이밍이 좋았던 거였어요.

    스레드는 아예 대기 로직이 없었고, 인스타그램은 대기는 했지만 ‘준비 완료’ 직후에도 가끔 실패할 수 있다는 걸 몰라서 재시도 기능이 없었어요. 그러니까 서버가 빨리 처리해주면 성공하고, 조금만 느려도 실패하는 구조였던 거죠.

    성공률이 100%가 아니라 ‘대체로 성공’ 정도였던 건데, 사용자 입장에선 실패해도 모르니까 저도 문제를 몰랐던 거예요. 무서운 일이죠.

    어떻게 고쳤을까? 🔧

    이제 제대로 고쳤어요. 방법은 간단했어요.

    • 컨테이너를 만든 뒤 상태를 계속 확인해요.
    • 준비될 때까지 기다린 다음에 게시 버튼을 누르죠.
    • 그래도 실패하면? 몇 초 간격으로 최대 세 번까지 재시도해요.

    단, 토큰이 잘못됐거나 권한이 없는 것 같은 ‘진짜 실패’는 재시도하지 않아요. 그런 건 계속 시도해봤자 똑같이 실패하니까 바로 알림을 보내는 게 낫더라고요. 무의미한 재시도는 문제를 숨길 뿐이에요.

    배운 것 💡

    ‘되는 걸 봤다’와 ‘항상 된다’는 완전히 다른 말이에요. 특히 남의 서버를 거치는 기능은 성공하는 걸 한두 번 본 것만으로 검증했다고 착각하기 쉬워요.

    오늘처럼 타이밍 운으로 성공하는 경우도 있고, 서버 상태에 따라 결과가 달라지는 경우도 있죠. 한 번 성공했다고 안심하지 말고, 실패 상황도 꼭 가정해보고 대비해야 한다는 걸 다시 한번 느꼈어요.

    1인 개발자로 서비스 운영하다 보면 이런 일이 종종 생기더라고요. 여러분도 혹시 ‘잘 되고 있다고 믿는’ 기능이 있다면 한 번쯤 의심해보세요. 저처럼 운이 좋아서 된 건 아닌지요 😅

  • 자동 업데이트가 자동이 아니었다 — 하루 동안 메운 빈 곳들

    오늘은 새로운 기능을 만들기보다, 이미 ‘된다’고 생각했던 것들의 빈 곳을 메운 하루였습니다. 서비스를 운영하다 보면 이런 날이 꼭 필요하더라고요. 겉으로는 잘 돌아가는 것 같아도, 막상 들여다보면 ‘어? 이게 왜 이렇게 되어 있지?’ 싶은 부분들이 보이거든요.

    1. 자동 업데이트가 사실은 반자동이었다 🔄

    가장 먼저 손본 건 자동 업데이트였습니다. 사용자분들께 ‘자동 업데이트’라고 안내했는데, 알고 보니 새 버전이 나와도 사용자가 직접 배너를 눌러야 적용되는 구조였어요. 이건 반자동이지, 자동이 아니잖아요.

    왜 문제였나요?
    사용자 입장에서는 배너를 놓치거나 무시하면 계속 구버전을 쓰게 됩니다. 버그 수정이나 개선 사항이 반영 안 되는 거죠.

    어떻게 고쳤나요?
    앱을 켜는 순간 자동으로 업데이트를 받아서 교체하고 재시작하도록 바꿨습니다. 다만 작업 중에 갑자기 재시작되면 곤란하니까, 앱을 켠 직후에만 자동으로 진행하도록 했어요. 그리고 한 가지 더—교체가 실패한 버전은 기록해뒀다가, 다음에 켤 때 다시 시도하지 않게 했습니다. 무한 루프에 빠지는 걸 막기 위해서요.

    2. SNS에 블로그 링크가 안 들어가고 있었다 🔗

    두 번째는 SNS 자동 발행 문제였습니다. 스레드, 페이스북, 인스타그램에는 글이 잘 나가는데, 정작 원문 블로그 링크가 빠져 있었어요. 유입 경로가 아예 없던 셈이죠.

    왜 문제였나요?
    SNS 글만 보고 끝나면 블로그 방문자는 늘지 않습니다. 더 자세한 내용이 궁금한 사람도 찾아올 방법이 없고요.

    어떻게 고쳤나요?
    블로그를 먼저 발행해서 주소를 받은 다음, 그 주소를 스레드·페이스북·인스타 글 끝에 자동으로 붙이도록 순서를 바꿨습니다. 예약 발행도 마찬가지인데요, 블로그가 아직 안 올라간 상태면 실패시키지 않고 1분 뒤에 다시 시도하도록 했어요.

    3. 발행 직전에 잡은 버그 🐛

    발행 테스트 중에 아찔한 걸 하나 발견했습니다. 링크가 없을 때 ‘자세한 내용은 여기 👉 {link}’ 같은 자리표시자가 그대로 올라갈 뻔했어요. 실제 계정에 나가기 전에 잡아서 정말 다행이었습니다.

    4. 비용 새는 구멍을 막았다 💸

    네 번째는 비용 관리였습니다. AI 글 생성 기능이 있는데, 데스크톱 앱과 예약 발행에서는 사용량 차감이 안 되고 있었어요.

    왜 문제였나요?
    사용자는 무료로 쓰고, 저는 API 비용만 계속 나가는 구조였습니다. 이건 지속 가능하지 않죠.

    어떻게 고쳤나요?
    두 곳 모두 크레딧 차감 로직을 붙였고, 잔액이 없으면 AI를 부르기 전에 미리 막도록 했습니다. 다만 예약 발행은 AI 없이도 기본 변환으로라도 나가게 해뒀어요.

    5. 앱에서 스레드·인스타 등록이 안 됐다 📱

    다섯 번째, 웹에서는 스레드와 인스타그램 계정을 등록할 수 있는데 앱에는 ‘준비 중’이라는 표시가 그대로 남아 있었습니다. 기능은 이미 다 만들어졌는데 문만 안 열어둔 셈이었어요. 오늘 열어뒀습니다.

    6. 크레딧 사용 로그를 만들었다 📊

    마지막으로 관리자 화면에 크레딧 사용 로그를 추가했습니다. 누가 언제 무엇으로 얼마를 썼는지 안 보이면, 정산도 문의 대응도 제대로 할 수 없거든요. 사용자 화면에도 본인 사용 내역을 볼 수 있게 붙여뒀습니다.

    마무리 ✨

    오늘 하루는 화려한 신기능보다, 이미 ‘된다’고 생각했던 것들의 빈 곳을 메운 날이었습니다. 자동 업데이트는 진짜 자동이 되었고, SNS 글에는 블로그 링크가 붙었고, 비용 누수는 막았고, 숨겨뒀던 기능은 열었고, 사용 내역은 보이게 만들었어요.

    서비스 운영이란 게 이런 거구나 싶습니다. 새로운 걸 계속 만드는 것도 중요하지만, 이미 만든 것들이 제대로 돌아가는지 점검하고 다듬는 시간도 꼭 필요하더라고요. 오늘 같은 날이 쌓여야 서비스가 탄탄해지는 것 같습니다 😊