Tag: SNS자동발행

  • [파마비아] SNS 자동 발행 도구의 한계를 찾아 개선한 과정

    [파마비아] SNS 자동 발행 도구의 한계를 찾아 개선한 과정

    같은 배경만 반복되던 인스타그램 피드

    자동화 도구를 처음 만들 때는 당장 글이 올라가는 것만 중요했다. 쇼핑몰 사장님의 계정을 열어보니 보라색 그라데이션 카드가 스무 개 이상 쌓여 있었다. 콘텐츠가 달라도 디자인은 죽 같았다.

    다른 기능 개선과 버그 수정에 집중하다 보니 배경 문제는 미루고 미뤘다. 미루는 게 결국 방치가 됐다.

    이미지 배경을 글에 맞춰 생성하는 방식

    스무 가지 배경을 새로 추가했다. 편지지 질감, 꽃잎, 단풍잎, 눈 내리는 풍경, 크리스마스 장식, 대리석, 카페 테이블, 슬레이트 돌 같은 것들이다.

    글 제목마다 다른 배경이 지정된다. 같은 글은 같은 카드로, 다른 글은 다른 배경으로 나간다. 미리보기에서 보는 게 그대로 발행된다.

    밝은 배경에 검은 글씨는 읽기 어렵다. 이미지 중앙 영역의 명도를 재서 글자 색을 자동으로 조정하도록 만들었다.

    페이스북·스레드에 자동으로 이미지 추가하기

    처음엔 페이스북과 스레드에는 텍스트만 올렸다. 두 채널 모두 사진이 붙은 글이 더 많이 노출되는데도 그랬다.

    ‘사진 없으면 카드 자동 생성’ 옵션을 추가했다. 이미지를 따로 만들지 않아도 서버가 직접 카드를 그려서 올라간다. AI를 쓰지 않아서 크레딧도 차감되지 않는다.

    크레딧 계산을 단순하게 정하기

    처음엔 AI 토큰 사용량으로 계산했다. 실제 차감액을 모르고 누를 수밖에 없었다.

    화면에 ‘SNS 8크레딧’이라 표시했는데 실제로는 56~98이 빠졌다. 블로그 예약 발행은 100이라고 했지만 돈을 안 받고 있었다.

    이제 원고 생성 100, 블로그 재작성 50, SNS 재작성 30으로 통일했다. 글의 길이와 상관없이 같은 크레딧이 나간다. 원문 그대로 올리면 0이다.

    예약 발행 시 미리 글을 만들어두기

    전엔 발행 시각이 되어야 글을 생성했다. 예약 목록에서 어떤 내용이 나갈지 볼 수 없었다.

    지금은 예약을 걸면 30초 안에 채널별 최종 글이 완성된다. 발행 내역에서 내용을 확인하고 직접 수정할 수도 있다. 이 단계에선 크레딧이 나가지 않는다. 지시 한 줄을 추가해서 다시 생성하는 것도 가능하다.

    부수 효과가 생겼다. 발행 시각에 AI를 호출하지 않으니 그때문에 막혀서 원문 그대로 올라가는 실수가 없어졌다.

    발행 중 절전 모드에 빠진 예약이 갇히는 문제

    테스트 중에 구멍을 찾았다.

    컴퓨터 두 대를 동시에 켜도 글이 중복으로 올라가지 않는지 확인했다. 예약 건은 한 대만 가져가고 나머지는 물러나는 방식이다.

    그런데 발행 중인 컴퓨터가 절전 모드로 들어가면 그 예약이 갇혔다. 다시 시도되지도 않고 알림도 오지 않았다. 한 시간 뒤 자동으로 풀리도록 수정했다.

    실제 사용에서 계속 드러나는 결함

    직접 쓰면서야 문제가 눈에 띈다. 테스트만 해서는 절대 못 본다. 다음 주에도 뭔가 고칠 게 하나쯤 나올 것 같다.

  • [파마비아] 잘 되던 기능이 사실은 운이었다 — 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 글에는 블로그 링크가 붙었고, 비용 누수는 막았고, 숨겨뒀던 기능은 열었고, 사용 내역은 보이게 만들었어요.

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