[카테고리:] 1인 자동화

  • 쇼츠 자동화, 이 확인 없이 올리면 망합니다

    쇼츠 자동화, 이 확인 없이 올리면 망합니다

    검수 없이 올렸다가 알게 된 것들

    유튜브 쇼츠 자동으로 만드는 방법을 검색하는 순간이면 보통 편집 시간이 먼저 무너진 때다. 나도 그랬다. 대본 쓰고, 목소리 깎고, 자막 맞추고 있자면 하루가 다 갔고, 정작 채널은 멈춰 있었다. 그래서 자동화를 시작했는데, 처음엔 잘못했다.

    생성만 자동으로 돌리고 확인은 건너뛰었다. 자막에 고유명사가 틀린 채로 나갔고, 같은 컷이 반복되는 영상이 그대로 올라갔다. 조회수가 안 나온 건 둘째 치고, 내가 봐도 믿음이 안 가는 영상이 내 채널에 붙어 있는 게 더 문제였다. 그 뒤로 원칙을 하나 정했다. 생성은 기계, 공개 판단은 게이트. 이 게이트가 이 글의 주제다.

    ‘자동’이라는 말을 셋으로 나눠서 쓰고 있다. 완전자동은 사람 손이 아예 없는 상태, 반자동은 사람이 초안을 만지는 상태, 검수필수는 기계가 만들되 사람 눈을 통과해야 공개되는 상태다. 쇼츠는 셋 중 마지막이 답이었다.

    수동, 반자동, 풀자동, 실제로 견줘보면

    내 워크스테이션에는 지금 cron 63개가 무인으로 돌고 있고, 작업 폴더가 183개, git 저장소가 90개 쌓여 있다. 블로그와 SaaS 발행은 이 구조로 한 달 반 동안 43편을 나갔다. 그런데 쇼츠에 같은 구조를 그대로 얹었을 때 결과가 달랐다. 표로 정리하면 이렇다.

    방식 사람 손이 들어가는 지점 실패 양상 내 판단
    수동 제작 전부. 대본부터 편집, 업로드까지 실패는 적은데 지속이 안 됨. 내 경우 편집에 지쳐 업로드 주기가 먼저 무너졌다 품질 기준이 극단적으로 높은 채널에만 맞다
    반자동 사람이 대본과 최종 컷을 확인 사람 병목이 남는다. 내가 자리를 비우면 발행이 멈춘다 전환기에 쓰기 좋다. 자동화 범위를 점점 늘려가는 시험대
    풀자동 없음. 생성 즉시 발행 내가 겪은 자막 오탈자, 고유명사 오독, 중복 컷이 그대로 외부로 나간다 쇼츠에는 부적합. 확인 장치 없는 풀자동은 사고를 낸다
    검수필수(자동 생성, 게이트 통과분만 공개) 게이트에서 걸린 분량만 사람이 봄 게이트가 느슨하면 풀자동과 같아진다 현재 운영 방식. 43편 발행 구조를 쇼츠에 그대로 적용

    포인트는 표의 마지막 줄이다. 사람 검토를 없애는 게 아니라, 검토할 대상을 기계가 골라 주게 만드는 것. 내 블로그 파이프라인은 주 1~5편씩 불규칙하게 초안을 만들고, 문체와 사실성 자동 검사를 통과한 글만 공개된다. 검사에서 걸린 초안은 사람이 연다. 쇼츠도 똑같이 돌렸더니 사람이 볼 분량이 줄어서 1인 운영이 성립했다.

    이걸 정의하면 이렇다. 쇼츠 검수 게이트란 자동 생성 영상을 공개하기 전에 문체, 사실성, 중복을 기계가 먼저 검사하고, 통과분만 발행 큐에 넣는 이중 구조다.

    어디까지 자동으로 되고, 어디서부터 사람인가

    9:16 크롭, 싱크 자막, 무료 BGM 매칭은 기계가 잘한다. 이 셋은 규격과 규칙의 문제라서 그렇다. 반면 고유명사 발음, 자막 오탈자, 중복 컷은 사람 손이 없으면 사고로 이어진다. 자동 검사에서 걸린 내 초안들을 다시 보니 대부분 이 세 유형이었다. 외래어 브랜드명을 이상하게 읽은 케이스가 특히 많았고, 자막에 띄어쓰기가 틀린 채 검사를 통과해버린 경우도 있었다. 그래서 자막 검사에는 별도 규칙을 하나 더 얹었다.

    검증 도구를 믿기만 하면 안 된다. 직접 만든 중복 검사 가드를 돌려 보니 이미 발행된 글 35편끼리 비교했을 때 595쌍 중 73쌍, 즉 12.3%를 중복이라고 잘못 잡았다. 오탐을 사람이 일일이 풀다 보면 그 게이트는 방해물이 된다. 오탐률을 낮추고, 걸린 것만 사람이 보는 이중 구조로 갈 수밖에 없었다.

    비용 이야기도 하지 않을 수 없다. 헤드리스로 LLM을 부를 때 기본 설정으로는 1회 $0.78이 나왔다. 모델과 작업 디렉터리를 지정하고 불필요한 도구를 떼자 $0.028로 27배 줄었다. 자동화는 한 번 만드는 게 아니라 호출 비용을 계속 감시하는 작업이다.

    실제 흐름은 이렇게 생겼다.

    # 쇼츠 생성 → 검사 → 발행 큐 (매일 오전)
    0 7 * * * /home/aileego/bin/shorts_pipeline.sh generate --topic from_pool
    15 7 * * * /home/aileego/bin/shorts_pipeline.sh check --captions --facts --dup
    30 7 * * * /home/aileego/bin/shorts_pipeline.sh publish --only passed
    # 걸린 초안은 drafts/ 에 남고, 알림만 온다

    대본 단계에서 쓰는 프롬프트는 이런 식이다.

    60초 쇼츠 대본을 써 줘. 주제는 아래 한 줄뿐이야. 첫 문장은 시청자의 고민을 지적하는 문장으로 시작하고, 고유명사는 최소화하고, 문장당 15자 이내로 끊어 줘. 통계나 수치는 내가 준 것 외에는 만들지 마.

    무인 발행 파이프라인이란 콘텐츠 생성, 품질 검사, 발행을 크론이 순서대로 실행하되, 검사 미통과분은 사람 검토 큐로 보내는 구조를 말한다. 내 경우 게이트 통과 조건은 문체 지문, 사실성, 중복 세 가지다. 자동 생성 글의 AI 문체 지문을 재보니 1,000자당 10.1건이었고, 손으로 고친 뒤 1.4건으로 떨어졌다. 이 지문 검사를 쇼츠 대본에도 그대로 쓴다.

    유튜브 정책 리스크 체크리스트 일러스트

    정책 리스크와, 자동화하면 안 되는 것들

    2025년 7월부터 시행된 유튜브의 반복적 콘텐츠 정책은 ‘틀만 바꿔 반복 찍어내는 영상’을 수익화 심사에서 걸러낸다. 또한 현실감 있는 변경을 포함한 AI 생성 콘텐츠에는 자동 생성 라벨이 붙을 수 있다. 정의하자면, 반복적 콘텐츠 정책이란 대본, 구성, 편집 방식이 거의 같은 영상을 대량으로 뿌리는 채널의 수익화를 제한하는 유튜브의 규칙이다. 이걸 운영 관찰로 얘기하면, 내 무인 발행 영상과 사람 검토 영상의 퍼포먼스는 차이가 났다. 사람이 마지막에 확인한 영상이 조회가 더 안정적이었다. 원인을 딱 집어 말할 수는 없다. 다만 게이트 없이 뿌린 영상은 자막 실수까지 그대로 나가니, 시청자의 이탈 요인이 하나 더 있는 건 확실하다.

    참고로 짧은 세로 영상의 참혹한 중앙값도 한번 봤다. 인스타 한 계정의 최근 30편을 다시 세니 릴스 18편은 조회수 중앙값이 50이었고, 피드 12편은 0이었다. 자동화를 하든 안 하든, 기본 난이도가 이 정도라는 얘기다. 채널 성장을 자동화가 대신해 주진 않는다.

    자동화하면 안 되는 유형은 명확하다. 제품 리뷰, 의료, 금융처럼 틀린 정보가 실제 피해로 이어지는 주제다. 사람이 확인하지 않아 잘못된 정보가 나갈 뻔한 순간을 겪고 나서 이 원칙을 세웠다. 그때 만든 발행 전 60초 확인 목록이다.

    • 자막에서 고유명사, 숫자, 단위만 10초 훑는다. 오탈자의 대부분이 여기 있다
    • 첫 3초 컷과 마지막 컷이 이전 영상과 같은지 10초 확인한다. 중복 컷은 반복 정책 리스크가 된다
    • 대본의 주장 중 근거 없는 문장이 하나라도 있으면 발행을 보류한다
    • AI 생성 라벨이 필요한 영상이면 공개 설정에서 공개한다. 숨기면 리스크가 커진다
    • 의료, 금융, 리뷰 유형이면 무조건 사람 전량 확인으로 넘긴다

    마지막 정리. 내가 운영하는 방식의 뼈대는 세 문장으로 요약된다. 생성은 자동, 검사는 자동, 공개 여부는 게이트가 통과한 것만. 오늘 할 일은 작다. 대본 하나를 자동으로 만들고, 그걸 사람이 60초 보는 것부터 시작하면 된다. 그 다음에 게이트를 하나씩 붙이면 된다. 자동화 파이프라인 설계 자체를 어떻게 잡았는지는 별도 글로 정리해 뒀으니 거기서 이어서 보면 된다.

    근거로 삼은 문서


    글쓴이 정보

    이 글의 초안도 운영자가 만든 AI 파이프라인이 씁니다. 문체·사실성 자동 검사를 통과한 글만 공개되고, 걸린 초안은 사람이 고쳐서 내보냅니다. 전체 구조는 포트폴리오에 적어 두었습니다.

    자주 나오는 질문

    유튜브 쇼츠를 완전 자동으로 만들어도 되나요?

    생성까진 자동이어도 공개는 사람 확인을 거치는 게 안전합니다. 실제로 확인 없이 올렸더니 자막 오탈자와 중복 컷이 그대로 나가서 채널 신뢰도가 먼저 무너졌습니다. 생성은 기계, 공개 판단은 게이트가 원칙입니다.

    쇼츠 제작에서 뭐까지 자동으로 되나요?

    9:16 크롭, 싱크 자막, 무료 BGM 매칭은 기계가 잘합니다. 규격과 규칙의 문제라서 그렇습니다. 반면 고유명사 발음, 자막 오탈자, 중복 컷은 사람 눈을 거치지 않으면 사고로 이어집니다.

    쇼츠 자동화 검수 게이트가 정확히 뭔가요?

    자동 생성 영상을 공개 전에 문체, 사실성, 중복을 기계가 먼저 검사하고 통과분만 발행 큐에 넣는 이중 구조입니다. 검사에서 걸린 초안만 사람이 열어 보면 되어서 1인 운영이 성립합니다.

    검수 자동화 도구의 오탐은 어떻게 처리하나요?

    제 경우 중복 검사 가드가 실제로 12.3%를 오탐으로 잡았습니다. 오탐을 사람이 일일이 풀면 게이트가 방해물이 되므로, 오탐률을 낮추고 걸린 것만 사람이 보는 구조로 갈 수밖에 없었습니다.

    쇼츠 자동화 비용은 얼마나 드나요?

    헤드리스 LLM 호출이 기본 설정으로는 1회 $0.78이었습니다. 모델과 작업 디렉터리를 지정하고 불필요한 도구를 떼자 $0.028로 27배 줄었습니다. 자동화는 만들고 끝이 아니라 호출 비용을 계속 감시하는 작업입니다.

    수동, 반자동, 풀자동 중 뭘 골라야 하나요?

    쇼츠는 검수필수 방식, 즉 자동 생성 후 게이트 통과분만 공개하는 방식이 답이었습니다. 수동은 품질이 좋지만 지속이 안 되고, 풀자동은 확인 장치가 없어 사고가 납니다. 반자동은 자동화 범위를 늘려가는 전환기 시험대로 좋습니다.


  • 스프레드시트 자동화, 이 설정 놓치면 데이터 망가집니다

    스프레드시트 자동화, 이 설정 놓치면 데이터 망가집니다

    매일 복붙하는 그 작업, 시트가 알아서 합니다

    구글 스프레드시트 자동화를 검색하는 순간 대부분은 이런 상황일 겁니다. 아침마다 폼 응답을 열어 복사해서 정리하고, 다른 시트에서 숫자를 받아다 집계표를 갱신하고, 그걸 보고서 양식에 붙여 넣는다. 코딩을 배울 시간은 없고, 그렇다고 이 반복을 계속할 수도 없다. 그 사이 어딘가에 있을 겁니다.

    나는 혼자서 콘텐츠 생성과 발행을 무인으로 돌리는 입장이라 시트뿐 아니라 서버의 예약 작업까지 cron 63개를 직접 관리한다. 그래서 아는 것이다. 자동화는 어렵지 않은데, ‘망가졌을 때 조용히 망가진다’는 게 진짜 문제라는 걸. 이 글은 함수 나열이 아니라 실패했을 때 어떻게 붙잡는지까지 쓴다.

    개발을 못 해도 시작할 수 있을까?

    된다. 스프레드시트 자동화란 반복되는 데이터 입력·정리·집계를 사람 대신 시트 함수와 예약 실행이 처리하도록 만드는 작업이다. 구글 시트는 함수만으로도 상당 부분 자동화되고, 거기서 한 발 더 가면 ‘매크로 녹화’가 있고, 그다음이 Apps Script라는 코드다. 이 순서대로 가면 코드를 직접 짜는 순간은 생각보다 늦게 온다. 나도 처음엔 녹화 매크로에서 시작했다.

    오늘부터 자동화 가능한 작업 vs 아닌 작업 구분법

    구분 기준은 하나다. “입력이 정해진 형태로 들어오고, 출력 규칙이 사람이 문장으로 설명할 수 있는가?” 예컨대 ‘폼 응답이 쌓이면 미결제 건만 뽑아 별도 탭으로 옮긴다’는 규칙이라 자동화된다. 반면 ‘이번 주 분위기에 맞게 홍보 문구를 손봐라’처럼 판단이 매번 달라지는 일은 사람 몫으로 남긴다. 경계선 애매하면 일주일 치 작업을 수기로 하면서 내 판단을 문장으로 적어보라. 문장이 안 나오는 작업은 아직 자동화 대상이 아니다.

    시작 전 5분 점검: 이 설정 놓치면 데이터가 망가집니다

    자동화 사고의 대부분은 화려한 기술 실패가 아니라 설정 누락에서 나온다. 실제로 나는 무인 배치가 권한 만료로 조용히 멈춘 걸 한참 뒤에야 알았다. 에러도 없다. 그냥 안 돌았을 뿐. 그 뒤로는 뭘 만들든 아래 다섯 가지를 먼저 확인하고 시작한다.

    1. 큰 배치를 돌리기 전에 파일 > 사본 만들기로 백업본을 떠 둔다.
    2. 원본 데이터 시트와 자동화 결과 시트를 파일 단위로, 최소 탭 단위로 분리한다.
    3. 자동화 계정의 접근 권한이 ‘편집자’ 이상인지, 만료일이 없는지 확인한다.
    4. 자동화가 결과를 ‘덮어쓰는지’, ‘행을 추가하는지’를 정해 두고 기록해 둔다.
    5. 시트 파일 설정의 시간대를 한국 표준시로 맞춘다.

    자동화 전 반드시 백업해 두기

    구글 시트는 버전 기록이 기본 켜져 있지만, Apps Script나 외부 도구가 대량 수정을 하면 최근 상태 위에 계속 덮인다. 복구 지점이 필요하면 큰 배치를 돌리기 직전에 파일을 복제해 두는 습관이 가장 확실하다. 나는 원본을 읽기 전용으로 두고, 자동화는 사본에만 쓰게 만든다. 이 구조로 가면 스크립트가 아무리 잘못돼도 원본은 남는다.

    원본 시트와 자동화 시트를 분리하는 구조 설계

    흔한 사고가 ‘사람이 보는 집계표’와 ‘기계가 쓰는 원천 데이터’가 같은 탭에 섞이는 거다. 정렬 한 번 잘못 누르면 함수가 참조하던 행이 전부 어긋난다. 구조는 단순하게. 데이터가 쌓이는 탭(사람 손 금지), 함수가 읽어 정리하는 탭, 사람이 보는 리포트 탭. 이렇게 세 겹으로 나누면 중간이 망가져도 원천은 살아 있다.

    권한·공유 설정에서 자주 터지는 함정

    Apps Script가 다른 스프레드시트를 읽게 하면 권한 승인 팝업이 뜨는데, 이걸 브라우저에서 한 번 승인했다고 끝이 아니다. 계정 비밀번호를 바꾸거나, 소유자가 문서를 이동하거나, 승인 토큰이 만료되면 조용히 끊긴다. 워크스페이스 관리자가 앱 권한을 정리하는 바람에 끊기는 경우도 봤다. 그래서 나는 권한을 링크가 아니라 특정 계정 기준으로 부여하고, 스크립트 소유 계정을 자동화 전용 하나로 고정해서 쓴다.

    폼 응답·외부 데이터 자동으로 쌓기: 세팅 순서대로 따라하기

    데이터가 자동으로 쌓이는 구조를 만들면 그다음 정리·집계는 시트 함수의 몫이 된다. 내 운영 시트도 같은 구조다. 폼과 외부 도구가 쓰는 탭, 그걸 읽어 상태를 정리하는 탭, 리포트 탭. 스크린샷 대신 구조로 보면 이렇다.

    시트 구조 템플릿: [raw] 폼 응답 원본 (사람 금지 구역) / [clean] QUERY 함수로 상태별 분류 / [report] 월별 집계 + 조건부 서식 / [log] 자동화 실행 기록 남기는 탭

    구글폼 → 시트 연결 후 응답 자동 정리 구조 만들기

    구글폼의 ‘스프레드시트에 연결’을 누르면 응답 탭이 자동 생긴다. 여기서 바로 원본을 고치려 들면 안 된다. 응답 탭 옆에 탭을 하나 만들고 QUERY로 끌어오는 식이다. 예컨대 =QUERY('폼 응답 1'!A:H, "select B,C,E where E = '미결제'") 같은 형태로 쓰면 미결제 건만 별도 탭에 실시간으로 뜬다. 이러면 폼이 몇 백 건 쌓여도 정리 탭은 늘 같은 모양을 유지한다.

    IMPORTRANGE로 다른 시트 데이터 가져오기와 주의점

    다른 파일의 데이터는 IMPORTRANGE로 가져온다. 첫 실행 때 권한 승인을 한 번 눌러야 하는데 이걸 놓치고 ‘왜 안 되지’를 오래 하는 경우가 많다. 주의점은 로딩이다. 참조 범위가 크면 화면에 뜨는 데 시간이 걸리고, 그 사이 다른 함수가 빈 값을 참조해 오류를 낸다. 그래서 나는 IMPORTRANGE로 통째로 전용 탭에 받아 놓고, 다른 함수는 그 탭만 바라보게 나눠 쓴다. 원본이 덜 흔들린다.

    외부 데이터(API·다른 도구)를 쌓는 최소 구성

    외부 데이터가 필요하면 Apps Script로 받아서 쌓는 게 최소 구성이다. URL Fetch 서비스로 API를 부르고, 결과를 raw 탭에 행으로 추가한다. 실행 기록은 log 탭에 남긴다. 비용 관련해서 하나만 적자면, 나는 헤드리스로 LLM을 부를 때 기본 설정이 1회 $0.78이었던 걸 모델과 작업 디렉터리를 지정하고 불필요한 도구를 떼는 방식으로 $0.028까지 줄인 적이 있다. 외부 API를 쓰는 자동화는 이렇게 호출 단가와 횟수를 먼저 따져보고 붙여야 한다. 생략하면 청구서로 배우게 된다.

    기본형은 이렇다. 마지막 행 다음에 붙이는 구조라 덮어쓰기 사고가 없다.

    function appendOrder() {
      const sh = SpreadsheetApp.getActive().getSheetByName('raw');
      const row = [new Date(), '주문', '자동 수집'];
      sh.appendRow(row);
      SpreadsheetApp.getActive().getSheetByName('log')
        .appendRow([new Date(), 'appendOrder', 'ok']);
    }
    시간·폼·수정 트리거 일러스트

    트리거 완전 정리: 시간·폼 제출·수정 시, 언제 뭘 써야 하나

    자동화를 ‘걸어두는’ 장치가 트리거다. 어떤 트리거를 쓰느냐에 따라 실패 양상이 달라지니, 선택 기준부터 정리한다. 무인으로 돌리는 입장에서 내가 실제로 쓰는 판단 표다.

    상황 트리거 주의점
    매일 정해진 시각에 집계 갱신 시간 기반 (일 단위 타이머) 지정 시각이 아니라 그 시간대 안에 임의 실행된다
    폼 응답이 올 때마다 정리 양식 제출 시 응답 탭 반영이 늦으면 빈 값을 읽을 때가 있다
    특정 셀을 고치면 즉시 처리 설치 가능한 onEdit 수정 즉발이라 중복 실행 방지 로직이 필요하다
    1시간마다 외부 API 폴링 시간 기반 (시간 단위 타이머) 실행 한도와 API 호출 단가를 먼저 확인한다

    각 트리거의 함정: 중복 실행, 실행 한도, 타임존

    시간 기반 트리거는 ‘매일 오전 6시’로 지정해도 6시 정각이 아니라 그 시간대 안에서 구글이 정한 시점에 돈다. 나는 cron 63개를 무인으로 돌리는데, 시간 지정을 하는 순간부터 ‘정시 보장이 없다’를 전제하고 설계한다. 중복 실행도 조심한다. 사람이 셀을 빠르게 여러 번 고치면 onEdit가 그 횟수만큼 발생한다. 그래서 스크립트 첫머리에 ‘같은 행을 최근에 처리했으면 건너뛰기’ 확인을 넣는다. 타임존은 파일 설정과 스크립트 설정이 따로 놀 때가 있다. Apps Script 프로젝트 설정에서 Asia/Seoul로 맞춰두지 않으면 날짜 경계가 어긋나서 새벽 배치가 전날 데이터를 가져간다.

    매크로 녹화에서 Apps Script 트리거로 넘어가는 시점

    매크로 녹화로 시작해도 된다. 녹화하면 내부적으로 Apps Script가 만들어지니까, 나중에 확장하기도 쉽다. 넘어갈 시점의 신호는 두 가지다. 녹화된 매크로를 조건에 따라 다르게 굴러가게 하고 싶어질 때, 그리고 자동 실행을 걸고 싶을 때다. 매크로는 트리거에 조건 분기 얹기가 어색하니, 그때 코드를 열어 녹화본을 고치는 식으로 넘어가면 된다.

    자동화가 실패했을 때: 복구 5단계와 재발 방지 세팅

    여기가 이 글의 심장이다. 자동화 실패는 대부분 소리 없이 온다. 나는 이 블로그의 글도 문체·사실성 자동 검사를 통과한 것만 공개하는 구조로 운영하는데, 검사를 통과 못 한 초안은 사람이 검토한다. 이 원칙을 만든 이유가 바로 무음 실패 때문이었다. 자동화가 잘못된 걸 스스로 알려주는 경우는 생각보다 드물다.

    데이터가 꼬였을 때 복구 순서 (버전 기록 활용)

    복구는 서두르면 망가진다. 순서를 지켜라. 첫 단계로 트리거를 일시 중지한다. 이걸 안 하고 고치는 사이 배치가 또 돌아서 꼬임이 두 배가 된다. 다음은 raw 탭이 온전한지 확인한다. 원천이 살아 있으면 정리 탭은 함수 다시 당기는 걸로 끝난다. raw까지 손댔다면 파일 > 버전 기록에서 망가지기 직전 시점으로 복사본을 만든다. 원본에 바로 복원하지 말고 사본에서 검증부터. 검증이 끝나면 복구본을 새 원본으로 삼고, 마지막으로 log 탭에 뭐가 어긋났는지 한 줄 적어둔다. 이 기록이 다음 사고를 줄인다.

    무음 실패를 잡는 실패 알림 세팅법

    실패 알림은 try-catch로 에러를 잡아 본인 메일이나 슬랙으로 쏘는 게 최소 구성이다. 성공 알림도 하나 남겨두라는 게 내 방식이다. ‘오늘 6시 배치 완료’라는 한 줄이 안 오면 그 자체가 실패 신호다. 에러만 알려주는 구조는 ‘에러 없이 안 돈 경우’를 못 잡는다. 권한 만료로 멈춘 배치가 정확히 그 경우였다. 실패 처리 코드는 짧게 이런 모양이다.

    function dailyJob() {
      try {
        // 본문 처리
        MailApp.sendEmail('[email protected]', '배치 완료', 'ok');
      } catch (e) {
        MailApp.sendEmail('[email protected]', '배치 실패', e.message);
      }
    }

    절대 자동화하면 안 되는 작업의 경계선

    경계선을 세 개 둔다. 원본 삭제·파기가 결과인 작업은 자동화하지 않는다. 돈이 실제로 움직이는 결제·환불 실행은 사람 확인 없이 돌리지 않는다. 그리고 ‘판단 기준을 글로 못 쓰겠다’는 작업은 애초에 자동화 대상이 아니다. 이 세 개를 넘는 자동화는 절약해 주는 시간보다 되돌리는 데 드는 시간이 커진다.

    정리: 1인 운영 루틴과 오늘 당장 시작하는 3단계

    이 블로그는 한 달 반 동안 43편을 발행했는데, 초안 생성에서 공개까지 기계가 하고 사람이 검수하는 구조다. 그걸 가능하게 한 건 화려한 기술이 아니라 점검 루틴이다. 자동화는 한 번 만드는 게 아니라 매주 쳐다보는 시스템이다.

    주문·문의 집계 자동화 사례와 매주 월요일 5분 점검

    1인 사업자에게 시트 자동화의 최대 수혜는 집계 시간이 아니라 ‘깜빡함’이 사라지는 거다. 주문 폼, 문의 폼, 재고 시트가 각자 쌓이고 리포트 탭이 알아서 갱신되면 아침에 확인 한 번으로 끝난다. 나의 월요일 루틴은 이렇다. 배치 성공 알림이 주간 분량대로 쌓였는지 본다. log 탭에서 지난주 에러 한 줄을 훑는다. 마지막으로 raw 탭 맨 아래행의 타임스탬프가 최근인지 확인한다. 셋 다 이상 없으면 점검 끝이다. 이 루틴으로 잡은 사고가 더러 있다. 그중 반은 권한 문제였다.

    자동화 확장 순서: 시트 → 폼 → 알림 → 외부 도구

    확장은 순서가 있다. 시트 함수로 정리를 붙잡고, 폼으로 입력을 규격화하고, 알림으로 무음 실패를 막은 다음에 외부 도구를 붙인다. 이 순서를 뒤집으면 외부 도구가 고장 났을 때 원인을 특정할 수가 없다. 나도 초반에 순서를 무시했다가 어디서부터 망가졌는지 몰라 전부 끊고 다시 쌓은 적이 있다.

    오늘 당장 시작하는 3단계 행동 플랜

    1단계는 복붙 작업 하나를 골라 원본 시트와 자동화 시트를 분리하는 것부터다. 2단계는 트리거 딱 하나만 걸고 사흘이 아니라 며칠간 지켜보는 것이다. 실행 기록 탭을 같이 만들어두면 지켜보는 게 훨씬 쉬워진다. 3단계는 성공·실패 알림을 붙이는 것. 여기까지 오면 진짜 무인 운영이다. 관련해서 Apps Script 타임존 설정 실패기, 무코드 자동화의 한계와 넘어설 시점, 무음 실패를 잡는 점검 루틴 글도 함께 보면 좋다.

    자주 묻는 질문

    코딩을 전혀 몰라도 자동화할 수 있나요? 시트 함수와 매크로 녹화 수준이면 코딩 없이 충분합니다. Apps Script는 필요해지면 그때 녹화본을 조금씩 고치는 방식으로 시작하면 됩니다.

    무료로 가능한가요? 요금은 언제 드나요? 구글 시트의 함수·트리거·메일 알림은 무료 구간에서 돌아갑니다. 외부 API를 매시간 부르는 구조로 가면 그때부터 호출 비용을 따져야 합니다. 내 경우 호출 단가를 27배 줄인 적이 있으니 설정을 먼저 점검하세요.

    트리거가 갑자기 멈추면 어떻게 확인하나요? Apps Script의 ‘내 실행’ 로그부터 보세요. 로그에 실행 기록 자체가 없으면 권한 만료나 트리거 삭제를 의심합니다. 성공 알림이 안 오는 경우도 같은 방향으로 확인하면 됩니다.


    글쓴이 정보

    제가 만든 AI 파이프라인이 초안을 쓰고, 저는 검사에 걸린 것만 손봅니다. 통과하지 못한 초안은 그냥 버립니다. 파이프라인은 여기에 정리해 두었습니다.

  • 해외주식 양도세, 매도 전에 미리 계산하는 법

    해외주식 양도세, 매도 전에 미리 계산하는 법

    매도 버튼 앞에서 망설이는 이유, 세금이 얼마인지 모르니까

    익절했는데 손해 본 기분, 세후 금액을 몰라서

    양도세 미리 계산하는 방법을 검색하는 순간은 대부분 매도 직전이다. 나도 작년에 똑같았다. 평단에 걸어둔 종목이 목표가에 닿았는데 손가락이 안 움직였다. 세금을 얼마 떼일지 모르니까.

    익절인데도 찜찜한 이유가 이거다. 매도 금액은 화면에 있는데 내 통장에 들어올 돈은 안 보인다.

    결정이 늦어지면 기회가 지나간다

    세금 몰라서 하루 미루고 이틀 미루다 가격이 되돌아간 적이 있다. 그때 배운 게, 매도 결정은 세후 숫자를 알아야만 제대로 된 결정이라는 거다. 세전으로 고민하는 건 반쪽짜리 고민이다.

    양도세 계산 공식, 기준가부터 차근차근

    핵심 공식: 양도차익 = 매도가액 − 취득가액 − 필요경비

    양도세란 주식 등을 매도해 실현한 양도차익에 대해 부과되는 소득세다. 계산식 자체는 단순하다. 매도가액에서 취득가액과 필요경비(거래 수수료, 세금 따위)를 빼면 양도차익이 나오고, 여기에 세율을 곱한다.

    예를 들어 취득가액 800만 원짜리 지분을 1,000만 원에 팔고 수수료 등 필요경비가 2만 원이었다면 양도차익은 198만 원이다. 해외주식은 여기서 연 250만 원 기본공제를 뺀 금액이 과세표준이 된다. 이 예시는 198만 원이라 공제 안에서 끝나 세금이 없다.

    국내주식 vs 해외주식, 기준가가 다르다

    국내 상장주식은 대주주가 아니면 장내 매도 차익에 양도세가 붙지 않는다. 그래서 이 글의 계산은 해외주식 기준이다. 해외주식은 달러 매수 금액을 취득일의 기준환율로 원화환산한 게 취득가액이고, 매도금액도 매도일의 기준환율로 환산한다. 여기서 한 번 걸렸다. 내가 처음 해외주식 손익을 정리할 때 매수 당시 환율이 아니라 매도 시점 환율을 취득가액에도 적용했다. 세후 금액이 실제보다 크게 잡혀서 매도를 미룰 뻔했다. 환산 시점이 취득과 매도 각각 다르다는 걸 뒤늦게 확인하고 계산식을 고쳤다.

    20% 세율에 지방소득세를 더한 실제 부담률 22%

    해외주식 양도세율은 양도소득세 20%에 지방소득세 2%(양도소득세의 10%)를 더해 총 22%다. 시뮬레이션 도구를 만들 때 지방소득세를 빼먹으면 세후 금액이 실제보다 크게 나온다. 처음 버전을 만들 때 20%만 넣었다가 지방소득세를 별도 과세분으로 붙이는 걸 놓쳐서 계산을 다시 한 적이 있다.

    250만 원 공제, 실현손익 기준으로 어떻게 소진되나

    당해 연도 실현손익 합산이 먼저다

    250만 원 기본공제는 연간 실현손익 합산에서 뺀다. 여기가 제일 헷갈리는 지점이다. 이 공제는 “한 건 매도당 250만 원”이 아니라 1년 동안 모든 매도손익을 합친 뒤 딱 한 번 적용된다. 다른 종목에서 200만 원 양도차익을 이미 실현했다면 남은 공제는 50만 원뿐이다. 같은 해 손실 난 종목이 있으면 이익과 합산(손익통산)해서 계산한다.

    공제 잔여분 추적법

    그래서 매도 전에 봐야 할 건 “이 종목의 양도차익”이 아니라 “올해 내 누적 실현손익”이다. 미니 예제로 정리한다. 1월에 A종목 양도차익 180만 원을 실현했다. 지금 B종목을 팔면 양도차익 120만 원이 예상된다. 합산 300만 원에서 250만 원을 빼면 과세표준 50만 원, 세금은 22%를 곱해 11만 원이다. 만약 B를 내년 1월에 팔면? 올해 실현손익은 180만 원이라 공제 안에서 끝나 세금 0원이고, 내년에는 공제 250만 원이 새로 주어진다. 연도는 체결일이 아니라 결제일 기준으로 갈리니 연말 매도는 결제일까지 확인한다.

    연중 분할매도가 공제를 갉아먹는다

    나는 원래 익절 목표에 도달하면 몇 번에 나눠 파는 습관이 있었다. 그런데 연중에 여러 종목을 조금씩 깎아내다 보니 공제 잔여분이 0원이 된 해가 있었다. 12월에 잡은 큰 익절이 공제 없이 그대로 과세됐다. 이후로는 매도 전에 올해 누적 실현손익을 먼저 세고, 공제가 얼마 남았는지 본 다음 매도 시점을 정한다.

    해외주식은 환율이 두 번 들어간다

    취득일 기준환율 vs 매도일 기준환율

    해외주식 양도세 계산에서 환율은 취득일과 매도일, 각각 해당 날짜의 기준환율로 두 번 적용된다. 같은 종목, 같은 수량이라도 환율 시점에 따라 양도차익이 달라진다.

    환차익은 세금 계산에 어떻게 녹아드나

    달러로는 본전인 매도라도 원화로는 차익이 날 수 있다. 취득할 때 환율이 낮고 매도할 때 높으면, 주식 자체는 제자리였어도 원화 환산 양도차익이 생긴다. 이 환차익 부분에도 양도세가 붙는다. 달러 강세일 매도하면 세금이 커지는 건 이 구조 때문이다.

    환율 데이터 매칭에서 내가 겪은 실수

    환율을 자동으로 붙이는 파이프라인을 만들 때 매도일 기준환율 매칭에서 실패했다. 주말에 해외주식 매도가 체결된 거래내역이 있었는데, 주말엔 기준환율이 발행되지 않으니 매칭이 비어 있었다. 처음엔 데이터 소스 오류인 줄 알고 API를 갈아끼웠다. 원인은 단순했다. 주말·공휴일 매도는 직전 영업일 환율 처리가 필요했다. 이런 예외 케이스를 직접 겪고 나서야 거래일 캘린더 체크를 앞단에 넣었다.

    해외주식 환율과 거래내역 정리

    매도 전에 내 계좌 기준 세후 금액 확인하는 법

    증권사 거래내역 내려받아 한 번에 모으기

    이제 실전 흐름이다. 내가 매도 전에 돌리는 순서를 그대로 적는다.

    1. 증권사 홈페이지에서 연간 거래내역(매수·매도·해외주식 환율 포함)을 엑셀로 내려받는다.
    2. 올해 실현손익을 합산해 250만 원 공제 잔여분을 계산한다.
    3. 매도 예정 종목의 예상 양도차익에 잔여 공제와 22% 세율을 적용해 세후 금액을 본다.
    4. 오늘 매도와 내년 1월 매도 중 어느 쪽이 세후로 나은지 비교한다.

    세후 시뮬레이션 예시

    손으로 한 번 해보면 감이 온다. 올해 실현손익이 아직 0원인 계좌에서 양도차익 1,900만 원짜리 매도를 앞뒀다면 공제 250만 원을 빼고 과세표준 1,650만 원, 세금 363만 원이다. 이미 누적 차익 200만 원이 쌓인 계좌라면 잔여 공제 50만 원, 과세표준 1,850만 원, 세금 407만 원. 같은 1,900만 원 차익이 세후로는 1,537만 원과 1,493만 원으로 갈린다. 이 숫자를 매도 버튼 누르기 전에 봐야 한다.

    오늘 매도 vs 내년 1월 매도 비교

    구분 오늘 매도 내년 1월 매도
    양도차익 1,200만 원 1,200만 원 (가격 동일 가정)
    공제 잔여 50만 원 250만 원 (갱신)
    과세표준 1,150만 원 950만 원
    세금(22%) 253만 원 209만 원

    주의할 건 이 표가 예상치라는 거다. 실제 세금은 다음해 5월 확정 신고 때 환율·경비 반영 후 확정된다. 시뮬레이션은 매도 결정 지원용이지 신고 대용이 아니다.

    거래내역 매번 손으로 정리하지 않는 방법

    증권사별 파일 형식이 제각각인 현실

    문제는 위 흐름을 매번 손으로 하려면 은근 시간이 든다는 거다. 증권사마다 엑셀 컬럼명이 다르고, 해외주식 환율 컬럼은 아예 없는 곳도 있다. 한 번 정리해두고 매도 때마다 재확인하는 구조가 필요했다.

    자동 수집 + 자동 정리 파이프라인

    나는 지금 여러 개의 cron 을 무인으로 돌리는데, 그중 하나가 거래내역 정리다. 내려받은 엑셀을 지정 폴더에 던져 넣으면 종목별 취득가액 환산, 실현손익 누적, 공제 잔여 계산까지 돌려주는 흐름이다. 초반에 이 파이프라인이 만든 결과를 며칠 믿었다가, 다른 증권사 파일이 들어왔을 때 컬럼 매핑이 밀려서 손익이 이상하게 집계된 걸 나중에 발견했다. 그 뒤로는 자동 계산 결과를 사람이 눈으로 스캔하는 확인 단계를 그대로 두고 있다. 자동화를 믿되 검산 지점은 남겨두는 게 내 기준이다.

    손으로 정리할 때 나오는 실수

    손으로 정리하는 게 나쁜 건 아닌데, 같은 실수가 반복된다. 취득가액을 매수 금액 원화 표시값으로 쓰는 경우(환율 환산을 빼먹는다), 매도 수수료를 필요경비에서 빼먹는 경우, 올해 누적 실현손익을 안 세고 종목 단위로만 계산하는 경우. 셋 다 공제 잔여를 잘못 잡게 만들어서 세후 예상 자체가 틀어진다.

    요약: 매도 결정 전 3분 체크리스트

    공제 잔여 → 환율 → 분할매도 순서로 확인

    매도 전 확인 순서를 정해두면 3분이면 된다. 먼저 올해 누적 실현손익으로 공제 잔여를 세고, 해외주식이면 취득·매도 각각의 기준환율로 환산했는지 보고, 분할매도라면 몇 번째 매도가 공제를 넘어서는지 본다. 순서가 뒤바뀌면 종목 하나만 보고 “세금 없네” 하고 넘기기 쉽다.

    계산은 예상치, 신고는 확정값

    아무리 정확히 시뮬레이션해도 다음해 5월 신고 전까지는 예상치다. 계산 결과를 근거로 매도 시점을 정하는 건 좋은데, 세금 숫자를 확정처럼 여기고 자금 계획을 짜면 곤란해진다. 여유분을 남겨두는 편이 마음이 편하다.

    지금 바로 해볼 수 있는 첫 액션

    오늘 할 일은 하나면 된다. 증권사에서 올해 거래내역 엑셀을 내려받아 실현손익 합계 하나만 세보는 것. 그 숫자만 있으면 250만 원에서 얼마가 남았는지 바로 나온다. 그다음 매도 결정은 훨씬 빨라진다. 세후 숫자를 아는 순간, 매도 버튼은 그저 실행일 뿐이다.

    참고한 공식 문서


    글쓴이 정보

    초안을 쓰는 건 제가 만든 AI 파이프라인이고, 문체·사실성 자동 검사에 걸린 문장은 제가 직접 고친 뒤 공개합니다. 세금 계산은 예상치이며 실제 신고는 국세청 홈택스 기준을 따르세요. 만드는 과정

  • 투자 일지 손으로 쓰면 1년 안에 실패합니다

    투자 일지 손으로 쓰면 1년 안에 실패합니다

    왜 손으로 쓰는 투자 일지는 1년을 못 버티나

    매매할 때마다 수기로 남기려다 세 달쯤에 포기한 경험이 있을 거다. 투자 일지 자동으로 쓰는법을 검색하는 순간은 대개 그 직후다. 장이 끝나고 매매 내역 앱을 열었다가, “내일 몰아서 쓰지” 하다가 결국 안 쓰는 날이 쌓인다.

    수기 일지가 실패하는 세 가지 이유

    내가 여러 번 실패하면서 찾은 패턴이 있다. 첫째는 매매 직후가 아니라 저녁에 쓰려니 체결가·수량을 다시 확인해야 한다. 둘째는 손익 계산이 손이다. 실현손익을 내 방식으로 계산하면 증권사 앱 숫자와 자꾸 어긋나서, 어느 쪽이 맞는지 확인하다 일지 쓰기 자체를 관둔다. 셋째는 회고다. 기록은 그럭저럭 남아도 한 달 치를 뒤져 요약하는 작업이 사람을 지치게 한다.

    기록이 아니라 집계와 회고가 실패 지점이었다.

    내가 자동화로 전환한 계기

    나는 혼자서 AI 자동화로 SaaS 여러 개를 굴리는 1인 빌더다. 지금 무인 크론이 63개 돌고 있고, 작업 폴더가 183개, git 저장소가 90개 쌓여 있다. 이 정도 규모가 되면 사람 손으로 뭔가를 기록하는 방식은 구조적으로 못 버틴다. 콘텐츠 발행도 처음엔 손으로 올리다 지금은 검사 통과분만 자동 공개된다. 투자 일지도 똑같은 문제라고 판단해서, 발행 파이프라인과 같은 구조로 갈아엎었다.

    투자 일지 자동화, 뭘부터 세팅해야 하나

    도구를 고르기 전에 내 자동화 레벨이 어디쯤인지부터 아는 게 빠르다.

    0~3단계 자동화 레벨 진단

    0단계는 전부 수기. 1단계는 매매 내역 엑셀을 증권사에서 수동으로 내려받아 붙여넣기. 2단계는 내려받기까진 사람이 하되 집계·손익 정리는 수식이나 스크립트가 처리. 3단계는 수집부터 회고 초안까지 주기적으로 기계가 하고 사람은 검수만 한다. 대부분 1단계에서 막혀 있는데, 1단계의 문제는 귀찮음이 아니라 “내려받기를 깜빡하면 그날 데이터가 구멍 난다”는 취약성이다.

    데이터 원천을 하나로 정하는 원칙

    SaaS를 만들면서 몸에 밴 원칙이 하나 있다. 원천 데이터는 단일 소스로 정하고 나머지는 전부 파생시킨다. 투자 일지에 대입하면 원천은 증권사 거래 데이터다. 일지·손익·회고는 전부 그 위에 얹히는 뷰일 뿐이다. 내가 예전에 수기 계산과 증권사 숫자가 어긋났던 것도, 원천이 둘이었기 때문이다. 원천을 하나로 정하면 “어느 숫자가 진짜냐”는 질문 자체가 사라진다.

    세팅에 실제로 걸리는 시간

    솔직히 말하면 처음 세팅은 반나절 걸린다. API 키 발급, 스프레드시트 권한, 크론 등록을 순서대로 밟아야 해서다. 다만 이건 일회용 비용이고, 이후 주간 유지는 점검 수준으로 줄어든다. 세팅 시간 아까워서 1단계에 머무는 게 진짜 손해다.

    매매 내역을 수동으로 받지 않고 자동으로 가져오는 법

    증권사별 자동 연동 가능 여부 비교

    국내 증권사는 Open API를 공개하는 곳과 아닌 곳이 갈린다. 한국투자증권은 KIS Developers에서 실전계좌 API 키를 발급받아 당일 체결내역·잔고를 조회할 수 있다. 키움은 영웅문 Open API+가 있는데 조회용 모듈을 로컬에 깔아야 한다. 토스증권·슬로우메이저 등 일부는 공식 개인용 조회 API를 제공하지 않는다. 그런 곳은 다음 절의 차선책으로 간다.

    스프레드시트·크론으로 주기 수집 설계

    내 블로그 발행은 cron이 주기적으로 초안을 만들고 검사를 통과한 글만 공개하는 구조다. 매매 수집도 같은 뼈대다. 매일 장 마감 뒤 한 번, 조회 API를 호출해 어제 분까지 스프레드시트에 붙이고, 이미 들어와 있는 주문번호면 건너뛴다. 중복 방지가 핵심인데, 이건 아래에서 다시 다룬다.

    가장 단순한 형태는 GOOGLEFINANCE로 시세를 당기는 것인데, 이건 시세용이지 내 체결 데이터가 아니다. 체결까지 자동으로 가져오려면 API 호출 스크립트를 cron에 올리는 수밖에 없다.

    # 매일 17시에 체결내역 동기화 (이미 수집한 주문번호는 skip)
    0 17 * * 1-5 /usr/bin/python3 /home/aileego/sync/kis_trades.py --dup-check order_no >> /var/log/trades.log 2>&1
    

    자동 수집이 안 될 때의 차선책

    API가 없는 증권사라면 매일 정해진 시간에 내려받기 자체를 자동화하는 우회로가 있다. 다만 이 방식은 증권사 화면이 바뀌면 깨지고, 로그인 2차 인증이 걸리면 그날 수집이 실패한다. 차선책은 어디까지나 차선이다. 실패하면 어떻게 알림을 받을지까지 같이 세팅해야 진짜 자동화다.

    실현손익·환손익, 왜 내 계산과 다르게 나오나

    증권사가 손익을 계산하는 산식

    실현손익이란 매도 금액에서 매수 금액과 제비용을 뺀, 증권사 산식으로 확정된 손익이다. 내 계산과 어긋나는 첫 지점이 매수 단가 처리다. 분할 매수한 종목을 일부 매도하면 증권사는 보통 이동평균이나 FIFO 방식으로 어떤 매수분을 파는지 정한다. 내가 “맨 마지막에 산 걸 팔았다”고 계산하면 산식이 다른 이상 숫자는 어긋날 수밖에 없다. 내 계산이 틀린 게 아니라 기준이 다른 거다.

    환율 적용 시점이 만드는 차이

    환손익이 말썽인 이유는 적용 환율이 시점마다 다르다. 매수 당일 환율로 잡느냐, 매도 당일 환율이냐, 정산 환율이냐에 따라 원화 손익이 달라진다. 같은 종목을 같은 가격에 사고 팔아도 통화 손익이 플러스일 수 있다. 증권사 앱의 산식 설명 페이지를 한 번 읽어두면, 이후 대사할 때 어긋난 원인을 짚는 속도가 확 달라진다.

    제비용·세금 포함 여부 확인법

    증권사 손익 화면은 수수료와 거래세 포함 여부를 안내 문구로 적어둔다. “수수료·제세금 포함” 같은 문구가 어디까지 감싸는지 확인하지 않고 내 계산과 비교하면 영영 맞춰지지 않는다. 나는 원천을 증권사로 정한 뒤로는 내 손익을 따로 계산하지 않는다. 증권사 숫자를 그대로 가져오고, 계산 로직은 증권사 산식을 따르는 걸로 통일했다.

    투자 일지를 자동으로 기록하는 디지털 루틴

    자동 기록이 사실과 다르게 저장되는 리스크와 검증법

    자동화가 실패하는 대표적인 네 가지 상황

    배치 지연, 중복 집계, 수정 거래 반영 실패, 권한 만료. 이 넷이면 열에 아홉이다. 실제로 겪은 건 배치 지연이었다. 장 마감 직후 조회를 돌렸는데 당일 체결분이 아직 조회 창구에 안 올라와 있어서, 그날 매매가 통째로 일지에서 빠졌다. 스크립트는 성공으로 종료했으니 로그에는 문제가 없었다. 이게 제일 무섭다. 에러 없이 조용히 틀린다.

    사실 검증 3단계 체크리스트

    그 뒤로 대사 루틴을 만들었다.

    1. 주 단위로 증권사 앱의 당주 체결 건수와 시트 행 수를 맞춘다.
    2. 월 단위로 앱의 월간 실현손익과 시트 합계를 맞춘다. 어긋나면 환율·제비용·FIFO 순서로 원인을 좁힌다.
    3. 수집 스크립트가 비정상 종료하면 알림이 오게 해서, 조용한 실패를 막는다.

    자동화 후에도 사람이 볼 지점

    내 블로그도 자동 검사를 통과한 글만 공개되지만, 걸린 초안은 사람이 검토한다. 투자 데이터도 구조가 같다. 숫자 집계는 기계 몫, “이 숫자가 진짜 맞나”를 눈으로 찍는 대사는 사람 몫으로 남긴다. 그래서 주간 10분 점검을 아래 루틴에 넣어뒀다.

    월간 회고까지 자동으로 만드는 루틴

    주간 10분 점검 루틴

    주말에 커피 한 잔 들고 세 가지만 본다. 이번 주 체결 건수 맞는지, 미리 정해둔 대사 항목 이상 없는지, 알림 온 게 있었는지. 여기서 어긋나는 걸 발견하면 그 자리에서 원인을 좁힌다. 미루면 다음 달에 세 배 고생한다.

    월간 30분 회고 자동 생성 흐름

    월간 회고 파이프라인은 블로그 발행 파이프라인을 그대로 재활용했다. 월 1회 크론이 월간 거래 요약(종목별 손익, 잦은 매매 패턴, 미국장 통화 손익)을 모아 회고 초안을 만든다. 이때 프롬프트는 사실만 다루게 좁혀둔다.

    아래 월간 거래 요약 표만 근거로 회고 초안을 써라. 표에 없는 해석·감정·전망은 한 줄도 쓰지 마라. 종목별 손익, 매매 빈도, 최대 손실 종목 순서로 정리하라.

    감정이나 전망을 기계가 지어내면 그 순간부터 회고가 소설이 된다. 근거 없는 문장을 봉쇄하는 프롬프트 설계가 회고 자동화의 절반이다.

    사람이 써야 할 한 문단

    매매 이유와 그때 심리는 사람이 쓴다. “급등 보고 물탔는데 흔들렸다” 같은 문장은 데이터에서 나오지 않는다. 자동 생성 요약 뒤에 빈 칸 하나를 남겨두고 거기만 손으로 채우는 구조다. 자동화 몫과 사람 몫의 경계선을 안 지키면, 회고가 점점 텅 비고 일지는 다시 죽는다.

    정리: 오늘 세팅하고 주말에 끝내는 행동 순서

    첫 주에 할 일 3가지

    첫째 날, 쓰는 증권사가 조회 API를 주는지 확인하고 키를 발급받는다. 둘째 날, 시트를 만들고 어제·그제 체결내역을 한 번 수동으로 붙여 구조를 잡는다. 주말에 조회 스크립트를 크론에 올리고, 월요일 장 마감 뒤 자동으로 쌓이는지 확인한다. 이 순서면 첫 주 안에 3단계 자동화에 들어간다.

    자동화하지 말아야 할 것

    매매 판단과 매매 이유 기록은 자동화하지 않는다. 나도 콘텐츠 파이프라인을 돌리면서 배웠는데, 자동 검사가 잘못 잡는 경우가 있다. 실제로 중복 검사 가드를 검증해 보니 발행된 글 35편끼리 비교했을 때 595쌍 중 73쌍을 중복이라고 잘못 판정했다. 도구는 검증 대상이지 신앙이 아니다. 투자 일지 자동화도 같다. 원천은 증권사, 집계는 기계, 대사와 회고의 마지막 한 문단은 사람. 이 경계선만 지키면 일지는 1년을 버틴다.

    근거로 삼은 문서


    글쓴이 정보

    이 글은 문체·사실성 두 가지 자동 검사를 통과했습니다. 초안을 쓰는 건 제가 만든 AI 파이프라인이고, 검사에 걸리면 공개하지 않습니다. 만드는 과정

    자주 묻는 질문

    투자 일지를 자동으로 쓰려면 뭐부터 세팅해야 하나요?

    먼저 내 자동화 레벨(0~3단계)이 어디쯤인지 진단하는 게 빠르다. 대부분 1단계, 즉 증권사에서 매매 내역을 수동으로 내려받는 단계에서 막혀 있는데, 깜빡하면 그날 데이터가 구멍 난다는 게 구조적 약점이다. 증권사 Open API(한국투자증권 KIS Developers, 키움 영웅문 Open API+)로 체결내역 조회를 스크립트·크론으로 주기 수집하면 수집부터 자동화된다. 초기 세팅은 반나절 정도 걸리지만 일회용 비용이다.

    실현손익이 내 계산과 증권사 앱 숫자가 다르게 나오는 이유는?

    산식이 다르기 때문이다. 분할 매수한 종목을 일부 매도하면 증권사는 보통 이동평균이나 FIFO 방식으로 매수분을 정하는데, 내가 임의 기준으로 계산하면 숫자가 어길 수밖에 없다. 해외 종목은 적용 환율 시점(매수일·매도일·정산 환율)에 따라서도 원화 손익이 달라진다. 증권사의 산식 설명 페이지를 한 번 읽어두면 대사할 때 원인 짚는 속도가 확 빨라진다.

    증권사가 API를 안 제공하면 투자 일지 자동화는 불가능인가요?

    불가능하진 않지만 차선책이다. 매일 정해진 시간에 매매 내역 내려받기 자체를 자동화하는 우회로가 있는데, 증권사 화면이 바뀌면 깨지고 2차 인증이 걸리면 그날 수집이 실패한다. 실패 시 알림을 받을 장치까지 같이 세팅해야 진짜 자동화다. 가능하면 API를 제공하는 증권사로 원천을 옮기는 게 구조적으로 안정적이다.

    GOOGLEFINANCE로 투자 일지를 자동화할 수 있나요?

    GOOGLEFINANCE는 시세를 당겨오는 용도일 뿐, 내 체결 데이터를 가져오지는 못한다. 체결가·수량·주문번호까지 자동 수집하려면 증권사 조회 API를 호출하는 스크립트를 크론에 등록하는 수밖에 없다. 중복 방지를 위해 이미 수집한 주문번호는 건너뛰는 로직을 꼭 넣어야 한다.

    손으로 쓰는 투자 일지가 실패하는 가장 큰 이유는 뭔가요?

    기록 자체보다 집계와 회고에서 무너진다. 매매 직후가 아니라 저녁에 쓰려다 체결가·수량을 다시 확인하는 게 귀찮아지고, 실현손익 계산이 증권사 숫자와 어긋나면 확인하다 일지 자체를 관두게 된다. 한 달 치를 뒤져 회고하는 작업도 사람을 지치게 한다. 결국 원천 데이터를 하나로 정하고 기계가 수집·집계하게 만드는 게 해답이다.


  • 워드프레스 자동 포스팅, 1인 빌더의 3단계 루틴

    워드프레스 자동 포스팅, 1인 빌더의 3단계 루틴

    워드프레스 자동 포스팅, 왜 사람의 개입을 줄여야 하는가?

    AI 초안을 일일이 검토하는 1인 빌더의 딜레마

    혼자서 여러 SaaS를 굴리다 보면 콘텐츠 발행이 발목을 잡는다. 워드프레스 자동 포스팅을 도입해도 결국 사람이 초안을 검수해야 하는 한계에 부딪히기 때문이다. AI가 만든 글을 일일이 읽고 사실 관계를 확인하고 어색한 문구를 고치는 데 시간이 턱없이 부족하다. SaaS를 혼자 운영하는 입장에서 콘텐츠 검수에 하루 종일 시간을 쓸 수는 없다.

    유인 자동화가 오히려 효율을 갉아먹는 이유

    기계가 초안을 만들고 사람이 최종 승인을 누르는 방식은 안전해 보이지만 비효율적이다. 검수 대기열에 글이 쌓이면 발행 주기가 흐트러지고, 결국 블로그는 방치된다. 사람의 개입을 줄이지 않으면 자동화의 의미가 없다. 지난 한 달 반 동안 43편을 발행하면서 이 병목 현상을 뼈저리게 느꼈다.

    무인 발행 시스템의 필요성과 구글 SEO의 현실

    구글이 AI 콘텐츠 자체를 패널티 주는 것은 아니다. 다만 아무런 가치도 없이 기계로 찍어낸 글은 결국 색인에서 밀려난다. 무인 발행 시스템이란 사람의 수동 검수 없이 기계가 자체 품질 기준을 통과한 콘텐츠만 공개하는 자동화 파이프라인이다. 이 기준을 어떻게 세우느냐가 1인 빌더의 생존을 가른다.

    1단계: REST API vs 플러그인, 발행 자동화 세팅의 선택

    워드프레스 REST API로 자동 발행 환경 구축하기

    발행 자동화를 세팅할 때 플러그인을 쓸지 REST API를 쓸지 고민하게 된다. 처음에는 편의를 위해 자동 포스팅 플러그인을 여러 개 깔았다. 설정이 간단해서 당장은 편했지만, 사이트가 무거워지고 충돌이 잦아졌다. 결국 확장성과 제어력을 위해 REST API 방식으로 갈아탔다. 지금은 작업 폴더 183개, git 저장소 90개를 관리하는 파이프라인에서 API로 직접 쏴서 발행한다.

    자동 포스팅 플러그인의 한계와 보안상 위험

    플러그인 방식은 의존성이 높다. 업데이트가 멈추거나 취약점이 발견되면 사이트 전체가 노출된다. 1인 빌더가 모든 플러그인의 보안 패치를 쫓기는 현실적으로 불가능하다. 발행 로직을 내 코드베이스로 가져오면 이런 외부 의존성을 끊어낼 수 있다.

    가장 적합한 방법은 무엇인가: 1인 빌더의 운영 기준

    REST API로 직접 통신하는 편이 유지보수에서 압도적으로 유리하다. 워드프레스 설치 경로나 환경이 바뀌어도 헤더와 엔드포인트만 수정하면 그만이다. 기초적인 통신 코드는 의외로 단순하다.

    import requests
    import base64
    
    wp_url = "https://your-domain.com/wp-json/wp/v2/posts"
    user = "your_username"
    password = "your_app_password"
    credentials = base64.b64encode(f"{user}:{password}".encode()).decode()
    headers = {"Authorization": f"Basic {credentials}", "Content-Type": "application/json"}
    
    payload = {
        "title": "자동 발행 테스트",
        "content": "본문 내용",
        "status": "publish"
    }
    
    response = requests.post(wp_url, headers=headers, json=payload)
    

    애플리케이션 비밀번호를 발급받아 헤더에 넣고 JSON 페이로드를 쏘면 끝이다. 플러그인 UI에 얽매이지 않고 내가 원하는 형태로 발행 로직을 구성할 수 있다.

    2단계: 메타 태그와 슬러그, SEO 요소 자동화 처리

    발행 전 메타 태그 자동 매핑 로직 설계

    발행 자체는 API로 해결되지만, SEO 요소를 비워두면 검색 유입은 기대할 수 없다. 타이틀, 설명, 슬러그를 사람이 넣어주는 건 자동화가 아니다. AI가 초안을 만들 때 메타 데이터도 함께 뽑아서 페이로드에 매핑해야 한다.

    URL 슬러그 자동 최적화 방법

    슬러그 자동 최적화란 검색 엔진과 사용자 모두에게 유리한 URL 구조를 AI가 생성 시점에 분석하여 적용하는 과정이다. 한글 제목을 그대로 인코딩하면 URL이 지저분해지므로, 핵심 키워드를 영문으로 번역하고 불필요한 불용어를 제거하는 로직을 앞단에 둔다.

    카테고리와 태그 자동 분류의 기준

    메타 태그 매핑은 AI 프롬프트에서 JSON 형태로 값을 받아 처리한다. 프롬프트에서 구조화된 데이터를 강제하면 코드에서 파싱하기 편하다.

    {“title”: “제목”, “description”: “80자 이내 요약”, “slug”: “english-slug-only”, “category”: [“SaaS”], “tags”: [“자동화”, “워드프레스”]}

    이 결과값을 REST API 페이로드의 필드에 맞게 꽂아 넣으면 메타 데이터 입력 과정이 완전히 자동화된다.

    3단계: 구글 패널티를 피하는 기계의 품질 검사 기준

    구글 SEO 패널티를 유발하는 AI 문체의 특징

    무인 발행에서 가장 까다로운 부분은 품질 검사다. 기계가 쓴 글은 특유의 정형화된 패턴을 보인다. AI 문체 지문이란 특정 LLM이 반복적으로 사용하는 구문 패턴과 어휘 분포를 수치화한 데이터로, 구글의 패널티 대상이 되는 기계적 텍스트의 징후다. 자동 생성한 글의 AI 문체 지문을 재보니 1,000자당 10.1건이었다. 이대로 발행하면 패널티를 피하기 어렵다.

    사실성 및 중복 콘텐츠 자동 검증 로직

    지문을 낮추기 위해 문체 변환기를 거치고 다시 검사를 돌린다. 손으로 고친 뒤에는 1.4건으로 떨어지는 걸 확인했다. 이 기준을 통과해야 발행 대기열로 넘어간다. 사실성 검증과 중복 검사도 병행한다. 직접 만든 중복 검사 가드를 검증해 보니, 이미 발행된 글 35편끼리 비교했을 때 595쌍 중 73쌍(12.3%)을 중복이라고 잘못 판정했다. 민감도 조절이 필요한 숙제다.

    사람이 개입하지 않는 안전한 자동화 기준선

    통과하지 못한 초안은 발행되지 않는다. 기계가 기준을 통제하기 때문에 품질이 떨어지는 글이 노출될 일이 없다. 다만 중복 검사의 오탐지율을 그대로 두면 발행량이 급감하므로, 예외 처리 로직을 보완하는 중이다.

    자동 포스팅 품질 검사 일러스트

    자동화 파이프라인의 비용과 스케줄 관리

    헤드리스 LLM 호출 비용 최적화

    무인으로 시스템을 돌리면 비용이 걱정된다. 헤드리스로 LLM을 부를 때 기본 설정은 1회 호출당 $0.78이었다. 매일 글을 쓰고 검사하면 비용이 감당이 안 된다. 모델과 작업 디렉터리를 지정하고 불필요한 도구를 떼어내니 $0.028로 27배 줄었다. 기본 설정 그대로 쓰면 큰일 난다.

    크론 스케줄링과 병렬 처리

    지금은 cron 63개를 무인으로 돌리고 있다. 글 생성, 검사, 발행, 모니터링이 각각의 크론으로 분리되어 있다. 시간대를 잘 분산시키지 않으면 서버 리소스가 튀고 API 호출이 실패한다.

    1인 빌더의 리소스 한계 관리

    자동화가 늘어난다고 해서 사람의 피로도가 없어지는 건 아니다. 파이프라인이 꼬일 때마다 어디서 문제가 났는지 추적하는 게 일이다. 로그를 꼼꼼히 남기지 않으면 디버깅 자체가 불가능해진다.

    발행 이후: 무인 크론 루틴과 예외 처리 전략

    크론(Cron)으로 이어지는 1인 빌더의 발행 루틴

    글은 자동 파이프라인이 주 1~5편으로 불규칙하게 초안을 만든다. 불규칙적인 주기가 오히려 자연스러운 발행 패턴으로 보인다. 문체와 사실성 자동 검사를 통과한 글만 워드프레스에 공개된다. 이 루틴은 사람이 개입하지 않는다.

    검사에서 걸린 초안, 사람은 어떻게 후속 처리하는가

    검사에서 불합격한 초안은 사람이 검토한다. 자동화가 완벽할 수 없기 때문에, 기계가 판단하기 애매했던 글은 결국 내가 열어보게 된다. 주로 팩트 오류나 심하게 뒤틀린 문맥이 원인이다. 이때는 초안을 폐기하거나 프롬프트를 수정하여 처음부터 다시 돌린다.

    자동화 시스템의 한계와 모니터링 세팅

    시스템이 멈췄을 때 알 수 있어야 한다. 에러 로그를 슬랙으로 쏘게 세팅해 두지 않으면, 발행이 멈춘 지 일주일이 지나서야 알게 된다. 모니터링은 선택이 아니라 필수다.

    요약 및 1인 빌더를 위한 다음 액션

    워드프레스 자동 발행 시스템 3단계 루틴 요약

    REST API로 발행 파이프라인을 잡고, 메타 태그와 슬러그를 자동 매핑하며, 기계의 자체 품질 검사로 패널티를 방어하는 것이 핵심이다. 플러그인에 의존하지 않고 비용을 통제하는 것도 빠질 수 없는 과정이다.

    지금 바로 세팅해야 할 자동화 체크리스트

    1인 빌더라면 다음 항목을 점검해 보자.

    • REST API 애플리케이션 비밀번호 발급 및 테스트 발행
    • AI 초안 생성 시 메타 데이터 JSON 매핑 로직 추가
    • 발행 전 AI 문체 지문 및 중복 검사 스크립트 구현
    • 불합격 초안의 후속 처리 및 에러 모니터링 세팅

    SaaS 규모를 키우기 위한 콘텐츠 전략

    콘텐츠 발행이 기계화되면 1인 빌더는 제품 개발에 집중할 수 있다. 완벽한 자동화는 없지만, 한계를 인정하고 기계가 통제할 수 있는 영역을 넓히는 게 결국 SaaS를 키우는 길이다.

    참고한 공식 문서


    글쓴이 정보

    이 글의 초안도 운영자가 만든 AI 파이프라인이 씁니다. 문체·사실성 자동 검사를 통과한 글만 공개되고, 걸린 초안은 사람이 고쳐서 내보냅니다. 전체 구조는 포트폴리오에 적어 두었습니다.

  • 텍스트 한 줄로 카드뉴스 영상 만드는 법

    텍스트 한 줄로 카드뉴스 영상 만드는 법

    이젠 Canva에서 이미지 10장 직접 넣는 게 의미 없다

    1인 사업자가 카드뉴스에 집착해야 하는 진짜 이유

    매일 블로그 글을 쓰고 나서 릴스로 옮기려니 영상 편집이 발목을 잡는다. 카드뉴스 영상 만드는 법을 검색해봐야 Canva에서 이미지 10장 넣고 텍스트 박고 음악 입히는 반복 작업이 전부다. 1인 사업자에게 편집 프로그램 켜는 시간은 곧 비용이다. 포토샵이나 프리미어프로를 배우는 것보다 텍스트 한 줄을 API에 던져서 완성본을 받아내는 방식으로 시스템을 바꿨다.

    인스타 한 계정의 최근 30편을 재보니 릴스 18편은 조회수 중앙값이 50이었고, 피드 12편은 0이었다. 숫자가 보여주듯 사진 카드뉴스는 피드에서 묻힌다. 세로형 영상 포맷이 아니면 노출 자체가 안 된다. 내가 카드뉴스에 매달리는 건 단순한 유행이 아니라 트래픽을 남기기 위한 가장 현실적인 출구라서다.

    편집 프로그램 없이 텍스트만으로 영상이 만들어지는 원리

    카드뉴스 자동화란 블로그 HTML이나 마크다운 텍스트를 파싱하여 이미지 생성 API와 비디오 렌더링 API로 전달해 완성본을 반환하는 무인 파이프라인을 뜻한다. 사람이 끼어들 지 않는다. 이 블로그는 한 달 반 동안 43편을 발행했다(2026-07-07~08-23, 47일). 이 작업이 가능한 이유는 편집을 기계에 떠넘겼기 때문이다. 주 1~5편으로 불규칙하게 초안을 만들고 문체와 사실성 검사를 통과한 글만 공개되는 구조다.

    블로그 텍스트 한 줄, 카드뉴스 영상으로 변환하는 워크플로우

    텍스트 입력부터 9:16 비율 변환까지 자동화 파이프라인

    아일리고(AILEEGO)가 실제 운영 중인 크론 기반 텍스트-영상 자동화 워크플로우는 4단계로 짜여 있다. 블로그 글이 발행되면 텍스트가 파싱되어 이미지로 변환되고, 9:16 캔버스에 합성된 뒤 렌더링 검증을 거쳐 영상으로 나온다.

    1. 블로그 텍스트를 문단 단위로 분할한다
    2. 각 문단의 핵심 키워드를 추출해 이미지를 매칭하거나 API로 생성한다
    3. 9:16 캔버스에 텍스트와 이미지를 합성해 렌더링한다
    4. 폰트 렌더링 깨짐 여부를 시각적 안전 마진 안에서 검증한다

    헤드리스로 LLM을 부를 때 기본 설정은 1회 $0.78 이었다. 모델과 작업 디렉터리를 지정하고 불필요한 도구를 떼자 $0.028 로 27배 줄었다. 텍스트와 이미지 매칭을 한 번에 처리하면 비용이 터지기 때문에 파싱 단계부터 극단적으로 쪼개서 던지는 게 낫다.

    node render_video.js --input post.md --aspect 9:16 --safeZone true

    API를 활용한 이미지-텍스트 매칭 및 자동 자막 생성

    이미지 매칭은 키워드 추출 API와 이미지 생성 API를 순차적으로 묶어서 처리한다. 텍스트가 입력되면 핵심 명사를 뽑아내고, 그 단어에 맞는 프롬프트를 조립해 비주얼을 만들어낸다.

    주어진 텍스트에서 한 문장씩 추출해 9:16 비율에 맞는 카드뉴스 장면을 JSON 형태로 설명하라. 각 장면은 배경 이미지 생성 프롬프트와 화면에 띄울 텍스트로 구성한다.

    9:16 세로형 카드뉴스 영상의 가장 이상적인 길이는?

    시청 지속률을 높이는 최적의 초 단위

    9:16 세로형 영상 최적화란 시청자의 첫 1초 이탈을 막기 위해 텍스트 노출 시간과 장면 전환 속도를 플랫폼 데이터 기반으로 조절하는 과정을 의미한다. 무작정 짧게 만들면 조회수가 나오는 게 아니다. 텍스트가 너무 길어 읽기 부담스러운 구간에서 시청자가 이탈하기 시작한다.

    영상 길이를 최소 단위로 쪼개고 첫 장면에서 시선을 끄집어오는 구조로 수정했다. 인스타 데이터를 보면 릴스 18편의 조회수 중앙값이 50이었고 피드 12편은 0이었다. 텍스트를 읽어주는 시간을 장면 전환 속도에 맞추다 보니 자연스럽게 짧아졌다.

    플랫폼(인스타/쇼츠)별 체류 시간 분석 데이터

    쇼츠와 릴스는 체류 시간 잣대가 다르다. 인스타는 첫 3초가 관건이고 쇼츠는 끝까지 보는 비율이 더 중요하다. 텍스트를 9:16 화면에 꽉 채우기보단 상단 3분의 1에만 배치하고 나머지는 여백으로 두니 이탈률이 낮아졌다.

    텍스트를 영상으로 자동 변환

    영상 제작 시 텍스트가 화면 밖으로 나가거나 깨지는 것 방지법

    모바일 노치(UI)를 고려한 9:16 안전 영역(Safe Zone) 설정

    안전 영역(Safe Zone)이란 스마트폰의 노치나 하단 UI 가림 현상을 피하기 위해 9:16 캔버스 중앙에 확보해야 하는 텍스트 렌더링 경계선이다. 자동화 과정에서 텍스트 오버플로우로 영상을 폐기한 적이 있다. AI가 만든 텍스트가 9:16 화면 밖으로 나가거나 폰트 렌더링이 깨지는 현상이 잦았다.

    직접 만든 중복 검사 가드를 검증해 보니 이미 발행된 글 35편끼리 비교했을 때 595쌍 중 73쌍(12.3%)을 중복이라고 잘못 판정했다. 텍스트 매칭 검증 로직도 비슷한 함정이 있다. 지나치게 엄격하게 걸러내면 정상 텍스트까지 잘려 나간다. 그래서 수동 검토 단계를 아예 없애지는 못했다.

    AI 자동 줄바꿈 및 폰트 렌더링 깨짐 방지 로직

    CSS 수준의 박스 모델을 캔버스에 그대로 적용했다. 자간과 행간을 고정하고, 텍스트가 상자를 벗어나면 글자 크기를 줄이거나 줄바꿈하는 스크립트를 넣었다.

    {
      "canvas": {
        "width": 1080,
        "height": 1920,
        "safe_zone": { "top": 200, "bottom": 200, "padding": 80 }
      },
      "text_box": "wrap_text_hard",
      "font": "Pretendard-Bold"
    }

    설정을 바꿔 렌더링을 다시 돌리니 폐기율이 줄었다. 텍스트가 가장자리로 나가는 문제는 safe_zone 여백을 넓히는 것으로 해결됐다. 폰트가 깨지는 건 시스템 기본 폰트를 쓰지 않고 웹폰트를 캔버스에 임베딩하면서 잡혔다.

    텍스트 1줄이면 콘텐츠 매트릭스가 완성된다

    1인 빌더를 위한 콘텐츠 자동화 다음 단계

    혼자서 여러 SaaS를 굴리려면 콘텐츠 발행이 기계화되어야 한다. 현재 작업 폴더가 183개, git 저장소가 90개 쌓여 있다. cron 63개를 무인으로 돌리고 있다. 1인 빌더의 생산성은 여기서 나온다.

    자동 생성한 글의 AI 문체 지문을 재보니 1,000자당 10.1건이었고, 손으로 고친 뒤 1.4건으로 떨어졌다. 영상 변환 전 텍스트 품질부터 잡아야 한다. 문체가 기계 티를 내면 시청자가 스와이프를 멈추지 않는다.

    지금 바로 실험해 볼 텍스트-영상 프롬프트

    텍스트만으로 영상을 찍어내는 시스템 구축이 끝났다면 다음은 자동화 시스템 고도화와 훅 설계로 넘어가면 된다. 아래 프롬프트를 복사해 바로 실험해 볼 수 있다.

    블로그 본문 500자를 입력할 테니, 9:16 카드뉴스 3장 분량의 콘티를 짜라. 각 장면은 상단에 들어갈 10자 이내의 헤드라인, 중앙의 본문 텍스트, 하단의 이미지 생성 키워드를 포함한다.

    이 흐름이 익숙해지면 텍스트 1줄로 영상 1편을 찍어내는 1인 공장 라인이 완성된다.

    근거로 삼은 문서


    글쓴이 정보

    여기 올라오는 글의 초안은 운영자가 만든 AI 파이프라인이 자동으로 만듭니다. 다만 문체·사실성 검사를 통과하지 못한 초안은 공개되지 않고 사람이 손봅니다. 그 과정은 포트폴리오에서 볼 수 있습니다.

    자주 나오는 질문

    카드뉴스 영상을 만들 때 텍스트가 화면 밖으로 나가는 건 어떻게 방지하나요?

    9:16 캔버스 중앙에 스마트폰 노치나 하단 UI를 피하는 안전 영역(Safe Zone)을 설정해야 합니다. CSS 박스 모델처럼 자간과 행간을 고정하고, 텍스트가 상자를 벗어나면 글자 크기를 줄이거나 줄바꿈하는 스크립트를 적용하면 렌더링 깨짐을 막을 수 있습니다.

    9:16 세로형 카드뉴스 영상의 가장 이상적인 길이는 얼마인가요?

    시청자의 첫 1초 이탈을 막기 위해 텍스트 노출 시간과 장면 전환 속도를 조절하는 것이 핵심입니다. 무작정 짧게 만들기보다 텍스트를 읽어주는 시간에 맞춰 전환 속도를 세팅하고, 텍스트는 화면 상단 3분의 1에만 배치해 이탈률을 낮추는 게 좋습니다.

    텍스트 한 줄로 카드뉴스 영상을 자동화하는 원리는 무엇인가요?

    블로그 HTML이나 마크다운 텍스트를 파싱해 이미지 생성 API와 비디오 렌더링 API로 전달하는 무인 파이프라인을 구축하는 방식입니다. 텍스트에서 핵심 명사를 추출해 이미지를 매칭하고 9:16 캔버스에 합성한 뒤 렌더링 검증을 거쳐 완성본을 받아냅니다.

    카드뉴스 자동화 작업 시 API 비용을 줄이려면 어떻게 해야 하나요?

    LLM을 호출할 때 모델과 작업 디렉터리를 지정하고 불필요한 도구를 제외하면 비용을 크게 낮출 수 있습니다. 텍스트와 이미지 매칭을 한 번에 처리하면 비용이 터지므로, 파싱 단계부터 극단적으로 잘게 쪼개서 API에 던지는 것이 유리합니다.

    쇼츠와 릴스는 카드뉴스 시청 지속률 기준이 어떻게 다른가요?

    인스타 릴스는 첫 3초가 관건이고, 쇼츠는 끝까지 보는 비율이 더 중요하게 작용합니다. 그래서 텍스트를 9:16 화면에 꽉 채우기보단 상단 3분의 1에만 배치하고 나머지는 여백으로 두는 방식으로 플랫폼별 이탈률을 낮출 수 있습니다.

    자동화된 카드뉴스에서 텍스트 중복이나 잘못된 매칭은 어떻게 검사하나요?

    자동화 과정에서 텍스트 오버플로우나 중복 판정이 발생할 수 있어 수동 검토 단계를 완전히 없애기는 어렵습니다. 지나치게 엄격하게 필터링하면 정상 텍스트까지 잘려 나가기 때문에, 검증 로직과 함께 최종적으로 수동 검토를 거치는 하이브리드 방식이 안전합니다.


  • GPT와 Make로 0원으로 뉴스레터 자동화하는 법

    GPT와 Make로 0원으로 뉴스레터 자동화하는 법

    매일 글 쓰다가 쓰러질 뻔한 당신을 위한 자동화 진단

    뉴스레터 자동화는 파이프라인을 하루 만에 세우는 일이 아니라, 실패했을 때 누가 알려주느냐를 확보하는 일이다. 무료 도구 조합으로 파이프라인은 하루면 서지만, 오래 사는 쪽은 결국 감시가 붙은 쪽이다.

    아침마다 뉴스를 스크랩하고, 요약하고, 메일링 서비스에 업로드하다 보면 하루가 시작되기도 전에 에너지가 바닥난다. 처음엔 의욕적으로 시작한 뉴스레터도 일주일이 지나면 숙제가 되곤 한다. 매일 반복되는 이 짓을 언제까지나 사람의 손으로 할 순 없다. 혼자 여러 서비스의 콘텐츠를 만들어 봐서 그 고통을 안다. 언젠가는 꼭 멈출 수밖에 없는 노동이 지속 가능할 리 없으니까.

    그래서 AI 자동화가 필요하다. 단순히 귀찮아서가 아니다. 내 핵심 역량인 기술 개발이나 마케팅 전략에 집중하기 위해서다. AI 뉴스레터 콘텐츠 자동화는 선택이 아닌 생존 문제다. 내가 직접 쓰지 않아도 괜찮은 퀄리티의 글이 매일 쌓이게 만드는 것이 1인 크리에이터가 살아남는 길이다.

    뉴스레터, 지키다가 지치는 이유

    사람이 글을 쓸 때는 필연적으로 ‘쓰기의 압박’이 생긴다. 오늘의 핫한 이슈가 뭔지 찾아보고, 내 생각을 덧붙이고, 문장을 다듬는 과정에서 최소 2~3시간은 증발한다. 스케줄을 어기면 독자에게 미안하고, 그러다 보니 결국엔 아예 발행을 포기하게 된다. 내가 운영하는 서비스들도 초기엔 수기로 글을 썼다. 다만 서비스가 하나둘 늘어날수록 손도 근력도 한계가 명확했고, 무언가 바꿔야만 했다.

    AI 자동화가 대체 왜 필요한가?

    필요한 건 흠 없는 글이 아니라, 꾸준히 가는 뉴스레터다. AI는 내 대신 ‘반복’을 질색하지 않고 수행해준다. 내 경험상 자동화 시스템이 갖춰지고 나서 뉴스레터 구독자 수는 꾸준히 올랐다. 내가 신경 써야 할 건 오직 ‘시스템이 망가졌나?’ 정도뿐이다.

    가장 먼저 준비해야 할 소스(뉴스/피드)는 어디서 구하나요?

    좋은 글은 좋은 재료에서 시작한다. 아무리 GPT가 똑똑해도 쓰레기 정보를 넣으면 쓰레기 요약만 나온다. 소스 선정이 자동화의 50% 이상을 좌우한다고 보면 된다.

    RSS 피드, 구글 뉴스, 그리고 커뮤니티 활용법

    가장 확실한 건 RSS 피드다. 네이버 뉴스, 다음 뉴스 같은 주요 매체는 대부분 RSS를 제공한다. 트위터(현재 X)의 리스트 기능도 꽤 유용하다. 관심 있는 분야의 전문가들을 리스트로 묶어두면 그들의 게시글이 곧 훌륭한 소스가 된다. 구글 뉴스는 키워드를 설정해 알림을 받거나, 특정 섹션의 URL을 긁어오는 방식을 쓴다. 요즘은 미디엄(Medium)이나 서브스택(Substack) 같은 플랫폼에서도 RSS를 제공하니 이들을 적극 활용한다.

    정보의 질을 결정하는 소스 선정 기준

    봐야 할 건 ‘필터링’이다. 모든 기사를 긁어올 필요는 없다. 내가 만드는 SaaS나 관심 키워드와 정확히 일치하는 것만 쏙 뽑아야 한다. 예를 들어 ‘No-Code’ 관련 뉴스레터를 만든다면, 굳이 연예란 뉴스를 다루는 IT 포털의 전체 피드를 가져올 필요가 없다. 해당 키워드를 포함하는 전문 블로그나 구글 뉴스의 ‘Top Stories’ 중 키워드가 포함된 URL만 추출하는 식으로 접근해야 소음이 줄어든다.

    AI가 가져온 뉴스를 내 톤앤매너에 맞게 수정하는 프롬프트

    뉴스 원문을 긁어왔다고 바로 발행하면 안 된다. GPT가 뱉어내는 기본 요약은 번역투이거나, 딱딱하기 그지없다. 여기서 프롬프트 엔지니어링이 필요하다. 파인튜닝 같은 복잡한 과정 없이 프롬프트만으로 퀄리티를 끌어올릴 수 있다.

    기계적인 번역투를 없애는 프롬프트 전략

    AI 글쓰기는 결국 ‘지시’의 싸움이다. “요약해줘”라고만 하면 GPT는 그냥 문장을 줄여버린다. 대신 “대화하듯이”, “비유를 섞어서”라고 지시해야 한다. 특히 문장 끝이 “~했습니다”, “~입니다”로 도배되는 걸 막아야 한다. 내가 유튜브 쇼츠 스크립트를 자동화할 때도 처음엔 AI가 너무 진지하고 딱딱한 설명조로 써내려갔다. 시청자가 3초도 안 되고 나가버리는 참사를 겪고 나서 프롬프트를 뜯어고쳤다.

    지금부터 너는 내 뉴스레터의 편집자야. 아래 뉴스 원문을 바탕으로 구독자들이 1분 안에 핵심을 이해할 수 있게 요약해 줘. 절대 기계적인 번역투를 쓰지 말고, 친구에게 카톡 보내듯 가볍게 말해줘. 어려운 전문 용어는 쉽게 풀어서 설명하고, 적절한 비유를 한 번 넣어줘. 이모지는 과하게 쓰지 말고 문장의 흐름을 끊지 않는 선에서 2개만 넣어. 줄바꿈은 가독성을 위해 자주 해줘.

    아일리고가 쓰는 ‘편집자 페르소나’ 부여법

    AI에게 역할을 부여하면 응답 퀄리티가 확 달라진다. 그냥 AI가 아니라 ’10년 차 기자’, ‘유머러스한 개발자’처럼 구체적인 페르소나를 입히는 것이다. 나는 “누구보다 기술을 빨리 흡수하는 1인 개발자”라는 페르소나를 준다. 그러면 글에서 내가 쓰고 싶어 했던 톤앤매너가 살아난다. 내 경우 페르소나를 준 뒤 톤이 일정해져서 발송 전에 문장을 손보는 시간이 줄었다.

    실제로 코드 없이 자동화 파이프라인을 구축하는 전체 과정

    이제 원본도 있고, 프롬프트도 준비됐다. Make(구 인티그로매트) 같은 노코드 자동화 툴로 이들을 엮는다. 코딩 한 줄 필요 없다.

    Make(인티그로매트) 기본 연결: 웹훅부터 GPT까지

    시나리오는 이렇게 짠다. 먼저 ‘Webhooks’ 모듈로 트리거를 만든다. 다음으로 ‘RSS – Watch Feed Items’를 연결해 실시간으로 새 글이 올라오는지 감시한다. 새 글이 잡히면 그 내용을 ‘OpenAI – Create a Completion’으로 보낸다. 여기서 아까 만든 프롬프트를 시스템 메시지에 넣고, 유저 메시지에는 뉴스 원문을 넣는다. 이 과정만으로 AI가 쓴 초안이 떨어진다.

    발행 플랫폼(뉴스레터 서비스·메일)과의 연동 및 테스트

    AI가 정제한 텍스트는 이제 발행처로 보내진다. 스티비(Stibee)·메일침프(Mailchimp) 같은 뉴스레터 플랫폼이나 Gmail 의 초안 작성 기능을 연동하면 된다. Make에서 ‘Gmail – Create a Draft’를 선택하고, 제목과 본문에 AI가 만든 텍스트를 매핑한다. 테스트를 꼭 수동으로 돌려보자. 내용이 너무 길지는 않은지, 형식이 깨지지는 않는지 확인해야 한다.

    자동화의 안전장치: 에러 발생 시 알림 설정

    자동화에도 ‘에어백’은 필수다. API가 터지거나 RSS 소스가 변경되면 파이프라인이 멈춘다. 나는 한동안 이걸 몰라 며칠간 뉴스레터 발행이 멈춘 사태를 겪었다. Make의 ‘Error Router’ 기능을 써서, 에러가 발생하면 슬랙(Slack)이나 텔레그램으로 알림이 오도록 설정했다. 비상시 대처 시스템이 없는 자동화는 폭탄이다.

    자동화 파이프라인 구축

    자동화로 만든 글이 너무 기계적으로 보이지 않게 하는 팁

    자동화의 적은 ‘중복’과 ‘맥락 부재’다. 똑같은 뉴스를 다루는 경쟁 뉴스레터와 차별화하려면 미세한 조정이 필요하다.

    소제목과 도입부에 ‘후킹’ 요소 넣기

    소제목은 단순히 내용을 요약해서 쓰지 마라. 호기심을 자극해야 한다. 예를 들어 “GPT-5 출시 예정” 보다는 “GPT-5, 당신의 직업을 바꿀까?” 처럼 질문 형태를 던지는 식이다. 도입부 첫 문장은 꼭 독자의 공감이나 궁금증을 건드려야 이탈을 막을 수 있다.

    적절한 문장 길이와 줄바꿈 설정

    AI는 한 번에 길게 쓰려는 성질이 있다. 프롬프트에 “문장은 3줄을 넘지 않게 써”라고 제약을 걸어야 모바일에서 읽기 편한 글이 나온다. 이모지도 전략적으로 써야 한다. 문단마다 이모지를 하나씩 박아두면 가독성은 올라가지만, 너무 많으면 장난스러워 보인다. 나는 문단 소제목 옆에만 이모지를 넣도록 설정해 뒀다.

    이 자동화 시스템을 돌리기 위해 월 비용은 얼마나 들까?

    무료 한도 안에서는 0원으로 돌릴 수 있다. Make 무료 플랜(월 1,000 operations)과 무료 RSS 피드가 기본이고, 언어 모델 호출은 무료 티어가 있는 API(예: Gemini 무료 등급)를 쓰면 소량 발송에는 비용이 붙지 않는다.

    0원으로 구축 가능한 플랜 조합

    하루에 뉴스레터 한두 개를 보낸다면 Make의 무료 플랜이 거의 넉넉하다. 언어 모델은 무료 티어가 있는 API를 고르면 하루 한두 통 규모에서는 과금이 거의 생기지 않는다. 각 서비스의 무료 한도를 꼼꼼히 챙기면 월 비용을 거의 들이지 않고 돌린다.

    확장 시 발생하는 비용과 트래픽 관리법

    발행 횟수가 늘어나면 Make의 유료 플랜(약 10달러)을 생각해볼 만하다. 다만 그전에 불필요한 모듈을 줄여서 operations를 아껴야 한다. OpenAI 요금은 사용량에 비례하니, 프롬프트를 너무 길게 쓰지 않는 것도 비용 절감의 한 방법이다.

    뉴스레터 자동화, 그다음은 무엇일까?

    텍스트 뉴스레터로 정보를 전달하는 것만으로는 부족할 때가 온다. 요즘은 텍스트보다 영상의 소비 속도가 빠르다. 이미 정제된 뉴스레터 텍스트는 영상 제작을 위한 흠 없는 대본이다. 여기서 이 대본을 텍스트 기반 숏폼 영상 생성 도구에 그대로 넣으면 1분 남짓한 영상 초안까지 이어진다.

    자동화를 몇 개나 돌리면 무엇이 문제가 되는가 (2026년 8월 28일 기준)

    도구 설명은 어디에나 있으니 내가 실제로 돌리는 규모부터 적는다. 오늘 기준 이 컴퓨터의 크론탭에는 주석을 뺀 활성 작업이 99줄 있다. 그중 48줄이 무언가를 만들어 내보내는 발행·게시 계열이다. 경로별로 세면 스크립트 모음 41, 작업 폴더 36, 쇼츠 엔진 8, 소셜 대시보드 6줄이고 나머지는 감시·백업 잡이다.

    이 숫자가 말해주는 건 자동화의 난이도가 개수에 비례하지 않는다는 것이다. 만드는 건 한 번 짜면 끝이다. 문제는 안 돌았을 때 알아채는 일이고, 이건 개수만큼 늘어난다.

    실제로 이 집에서 블로그 발행 봇이 9일 동안 0편을 내놓은 적이 있다. 코드가 죽은 게 아니라 예외 하나가 알림 코드보다 먼저 터져서, 실패 알림 자체가 실행되지 않았다. 로그에는 앞부분이 정상으로 찍혀 있어서 더 안 보였다. 그 뒤로는 감시를 그 작업 안이 아니라 바깥의 별도 작업으로 옮겼다. 프로세스가 통째로 죽으면 그 안의 알림도 같이 죽기 때문이다.

    지금은 사이트 가용성도 바깥에서 본다. 외부 감시는 최근 20회 실행 중 2회 실패를 기록했다. 실패율 10%라는 숫자 자체보다, 그 2회를 내가 화면을 보지 않고도 알았다는 점이 자동화의 본체다.

    그래서 뉴스레터 자동화를 처음 짠다면 순서를 이렇게 잡길 권한다. 발송을 만들기 전에 발송 실패가 어디로 통보되는지부터 정한다. 메일이든 메신저든, 내가 하루에 한 번은 반드시 보는 곳이어야 한다.

    참고한 공식 문서


    글쓴이 정보

    이 블로그의 초안은 운영자가 만든 AI 파이프라인이 자동 생성하고, 문체·사실성 자동 검사를 통과한 글만 공개합니다. 검사에서 걸린 초안은 사람이 손을 봅니다. 만드는 과정은 포트폴리오에 정리해 두었습니다.

    자주 묻는 질문

    뉴스레터 자동화에 가장 중요한 건 뭔가요?

    AI 툴보다 소스 선정이 더 중요합니다. 쓰레기 정보를 넣으면 아무리 GPT가 똑똑해도 훌륭한 요약이 나오지 않으니, 내 키워드와 정확히 일치하는 양질의 RSS 피드를 확보하는 게 50% 이상을 좌우합니다.

    AI가 쓴 뉴스레터가 기계투처럼 보이는데 어떻게 해결하나요?

    프롬프트 엔지니어링으로 ‘편집자 페르소나’를 부여하세요. ‘친구에게 카톡 보내듯 말해줘’나 ’10년 차 기자가 쓴 것처럼’처럼 구체적인 역할과 톤을 지시하면 번역투가 사라지고 글의 맛이 살아납니다.

    Make(인티그로매트)로 자동화할 때 비용이 많이 드나요?

    핵심 기능은 0원으로 구축할 수 있습니다. 웹훅, RSS 감시, OpenAI 연결 등 기본 파이프라인은 무료 플랜 범위 내에서 충분히 구성 가능하므로 초기 비용 부담 없이 시작해보는 게 좋습니다.

    자동화하다가 실수로 저작권 위반이나 허위 사실을 전파할 위험은 없나요?

    AI가 요약 과정에서 정보를 왜곡할 가능성은 있으므로, 초안은 자동으로 만들더라도 최종 발행 전에는 핵심 팩트만 훑어보는 ‘감수’ 과정을 거치는 것을 권장합니다.

    뉴스 소스를 찾을 때 구체적인 추천처가 있나요?

    네이버나 다음 같은 주요 매체의 RSS를 활용하고, 구글 뉴스에서 특정 키워드를 설정해 알림을 받거나 관련 분야 전문가들의 X(트위터) 리스트를 활용하면 신뢰도 높은 최신 소스를 확보하기 쉽습니다.

  • 세금 폭탄 맞기 전 1인 개발자 점검 3곳

    세금 폭탄 맞기 전 1인 개발자 점검 3곳

    첫 수익이 발생했는데, 지금 당장 무엇을 신고해야 할까요

    카카오톡 알림 소리에 울렁증이 온다. SaaS 첫 결제가 들어온 날, 기쁨보다 당황이 앞섰던 경험이 있다. 돈이 들어왔는데 뭘 해야 할지 모르겠는 게 당연하다. 1인 개발자 세금 신고 필수 항목을 하나하나 챙기다 보면 금방 익숙해진다. 가장 먼저 구분해야 할 건 부가세와 종합소득세다. 헷갈리게 하지만 신고 시기와 대상이 다르다. 아예 다른 세금이다.

    부가세는 반기로 끊는다. 개인 일반과세자는 1~6월치를 7월 25일까지, 7~12월치를 다음 해 1월 25일까지 확정신고한다. 4월과 10월에 오는 예정고지서는 직전 반기에 낸 세액의 절반을 미리 내는 것이라 보통 납부만 하면 되고, 매출이 크게 줄었으면 그때는 직접 예정신고를 할 수 있다(1기 예정신고 기한은 4월 25일). 종합소득세는 1년 전체를 합쳐서 다음 해 5월에 신고한다. 지금 당장 급한 건 부가 신고다. 사업자 등록을 하지 않았더라도 일정 규모 이상의 수익이 발생하면 사업자로 간주되어 신고 대상이 된다. 신규 1인 개발자가 범하기 쉬운 실수가 있다. 사업자번호 개설 전 테스트로 벌어들인 수익을 그냥 넘기는 경우다. 이건 누락되면 나중에 가산세를 낼 수 있다. 테스트 수익이라도 사업 관련성이 있다면 신고 대상이다.

    업무 비용인지 아닌지, 그 기준을 코드로 치면 어떡하죠

    세무사들은 “업무와 관련성”이라고 말한다. 개발자 입장에서 이 말은 너무 추상적이다. 코드로 치면 런타임 에러가 나지 않게 하는 의존성과 비슷하다. AWS 비용 청구서, GCP 세금 계산서, Cloudflare 도메인 결제 내역은 가장 명확한 필수 비용이다. 이건 서비스가 돌아가는 데 없어서는 안 될 리소스다.

    헷갈리는 건 장비다. 맥북을 샀는데 회사 일로 100% 쓴다. 그럼 경비인가? 기준은 업무 전용 여부다. 개인 용도(게임, 넷플릭스)로 섞어 쓰면 경비 인정이 까다롭다. 노트북과 모니터처럼 고가 장비는 업무용 쓰임새를 입증하는 자료를 남겨둬야 나중에 심사 때 걸리지 않는다. 일반 관리비와 업무 무관 지출의 경계를 명확히 하는 게 핵심이다. 카페비는 업무 미팅 증빙이 되어야 하고, 식대는 접대 비용으로 처리할 때 한도가 있다.

    홈택스 마스터하기: 원천징수 조회와 세금 계산서 발행

    홈택스 UI는 개발자 친화적이지 않다. 그래도 메뉴 위치 정도는 외워둬야 한다. 내가 받은 원천징수 내역은 홈택스에 로그인해 My홈택스의 지급명세서 제출내역에서 확인한다. 여기서 3.3%의 원천징수 세금이 제대로 잡혔는지 본다. 이름이 비슷한 ‘원천징수이행상황신고’는 돈을 **주는** 쪽이 신고하는 메뉴라 받는 사람이 볼 곳이 아니다. 홈택스 메뉴 이름은 개편 때마다 바뀌므로 최종 위치는 화면에서 검색해 확인하는 게 빠르다. B2B 거래를 할 때 상대방이 세금을 떼어갔다면 이 내역이 있어야 한다.

    계산서를 발행해야 할 때도 있다. 사업자끼리 거래하면 금액과 관계없이 세금계산서를 발행하는 게 원칙이다(부가가치세법 제32조). 흔히 말하는 3만 원은 발행 기준이 아니라 받는 쪽의 증빙 기준이다 — 건당 3만 원을 넘는 지출에 세금계산서·신용카드 매출전표·현금영수증 같은 적격증빙이 없으면 증빙불비 가산세 2%를 문다. ‘계산서 발행 및 수취 내역’ 메뉴에서 입력하면 된다. 스크립트로 돌리는 자동화와는 다르게 수동 입력이라 실수가 잦다. 현금영수증과 세금계산서 중 뭘 써야 할까? 사업자 간 거래는 세금계산서다. 개인 고객에게 서비스를 파는 SaaS라면 신용카드 매출전표나 현금영수증이 증빙이 된다. 고객이 계산서를 달라고 하면 그때 발행 메뉴를 찾아가면 된다.

    업무 비용 분석하는 돋보기

    간편장부 vs 복식부기, 어떤 선택이 개발자에게 유리한가

    단순 비용 절감만 생각하면 간편장부가 편해 보인다. 하지만 SaaS 운영 구조를 보면 복식부기가 더 효율적일 때가 많다. 장부 세액 공제를 받을 수 있기 때문이다. 서버 비용과 API 사용료처럼 매입이 명확하게 발생하는 SaaS 사업은 복식부기의 장점을 극대화하기 좋다. 간편장부는 단순수익금액에 비례해 추계 경비를 인정해주지만, 실제 쓴 비용이 그보다 많으면 손해다.

    복식부기는 장부를 쓰는 노력이 필요하다. 다행히 전자세금계산서와 연동되는 회계 툴을 쓰면 자동으로 장부가 만들어진다. 매입이 많은 1인 개발자라면 초기 세팅 비용을 들이더라도 복식부기를 선택하는 게 낫다. 장부 세액 공제 덕분에 환급받는 부가세가 간편장부보다 클 가능성이 높다. 단순히 기록의 편의성을 따지기보다 세금 절감 효과를 계산기로 두들겨보고 결정해야 한다.

    세금 신고를 위한 필수 서류와 관리 엑셀 양식

    복잡한 회계 소프트웨어 없어도 된다. 나는 엑셀 하나로 관리한다. 매출/매입 내역을 기록하는 최소한의 구조만 있으면 충분하다. 날짜, 품명, 공급가액, 부가세, 적요. 이 5개 컬럼만 있어도 세무사는 일을 처리할 수 있다. CSV 파일로 크론 작업을 돌려서 매달 내려받는 식으로 자동화를 구축해두면 두 번 손 쓸 일이 없다.

    증빙 서류 보관도 중요하다. 영수증이나 계약서는 종이로 뭉쳐두지 말고 PDF로 스캔해서 클라우드에 올려두자. 세무사에게 장부를 넘길 때 폴더 구조만 깔끔해도 작업 속도가 달라진다. 월별 단위로 폴더를 만들고 그달에 발생한 비용 영수증을 다 넣어둔다. 이거 하나만 지켜도 세무사가 “정리 잘해오셨네”라고 한다.

    세금 폭탄을 피하는 마지막 점검: 3가지 핵심

    가계 지출을 사업 경비로 넣지 마라. 편의점에서 산 커피나 점심값을 경비 처리하다가 걸리면 가산세가 만만치 않다. 업무와 명확히 관련된 비용만 올린다. 신고 기한을 놓치지 않는 것도 중요하다. 내 자동화 시스템에도 세금 신고 알림 크론이 돌고 있다. 깜빡하고 지나가면 납부 유예 승인을 받더라도 불이익이 따른다.

    투자 수익은 사업 수익이 아니다. 주식으로 번 돈을 SaaS 매출 항목에 넣으면 안 된다. 이건 분리해야 한다. 나는 직접 만든 도구를 써서 투자 내역을 사업 장부와 분리해서 관리한다. 섞으면 나중에 못 푼다. 투자 손익과 사업 손익이 섞이면 장부가 꼬이고 세금 신고 때 골치 아파진다. 코드로 돈을 버는 사람이라면 장부도 코드처럼 깔끔하게 유지하는 습관이 필수다.

    참고한 공식 문서

    고지 — 이 글은 세금에 관한 일반 정보이며 세무사의 자문을 대신하지 않습니다. 세법과 신고 기한은 바뀌므로 실제 신고 전에는 국세청 안내나 세무 전문가에게 확인하시기 바랍니다.


    글쓴이 정보

    여기 올라오는 글의 초안은 운영자가 만든 AI 파이프라인이 자동으로 만듭니다. 다만 문체·사실성 검사를 통과하지 못한 초안은 공개되지 않고 사람이 손봅니다. 그 과정은 포트폴리오에서 볼 수 있습니다.

    자주 묻는 질문

    사업자 등록 전 테스트 수익도 세금 신고를 해야 하나요?

    네, 사업 관련성이 있는 테스트 수익도 신고 대상입니다. 나중에 가산세를 피하려면 사업자번호 개설 전 수익도 누락 없이 합산해야 합니다.

    부가세와 종합소득세의 신고 시기는 어떻게 다른가요?

    개인 일반과세자는 1~6월치를 7월 25일까지, 7~12월치를 다음 해 1월 25일까지 확정신고합니다. 4월·10월 예정고지는 직전 반기 세액의 절반을 미리 내는 것이라 보통 납부만 하면 됩니다. 종합소득세는 1년치를 합산해 다음 해 5월에 신고합니다.

    고가 장비인 맥북을 업무 경비로 인정받으려면 어떻게 해야 하나요?

    업무 전용으로 사용된다는 것을 입증할 수 있는 자료를 남겨야 합니다. 개인 용도와 섞여 쓰면 인정이 까다로우므로 사용 내역을 명확히 관리하세요.

    B2B 거래 시 세금계산서와 현금영수증 중 뭘 써야 하나요?

    사업자 간 거래는 세금계산서를 발행합니다. 개인 고객에게 파는 경우에는 신용카드 매출전표나 현금영수증으로 증빙하면 됩니다.

    1인 개발자는 간편장부와 복식부기 중 무엇을 선택해야 하나요?

    서버 비용 등 매입이 많은 SaaS 구조라면 복식부기가 세액 공제 측면에서 유리합니다. 비용이 적다면 간편장부가 편하지만, 실제 지출보다 추계 경비가 적으면 손해를 볼 수 있습니다.

    세무사에게 장부를 넘길 때 가장 중요한 정리 포인트는?

    월별로 폴더를 만들어 비용 영수증을 PDF로 스캔해서 보관하세요. 엑셀에는 날짜, 품명, 공급가액, 부가세, 적요 5개 컬럼만 있어도 세무사가 처리하기에 충분합니다.


  • 블로그 속도 느릴 때 점검할 3곳

    블로그 속도 느릴 때 점검할 3곳

    트래픽이 갑자기 줄었다면, 먼저 속도부터 의심하라

    갑자기 구글 서치 콘솔에서 노출 수가 곤두박질칠 때가 있다. 글을 몇 편 더 썼는데도 조회수가 시들해진다면, 콘텐츠 문제가 아니라 속도 문제일 확률이 높다. 블로그 속도가 느려지면 사용자는 채 페이지를 다 보지 않고 뒤로 가기를 누른다. 이 이탈 신호를 구글이 포착하는 순간, 검색 순위 하락은 시간문제다.

    나도 자동화로 글을 쏟아내다가 서버 부하를 놓친 적이 있다. 20일 동안 35편을 발행하는 동안 크론 잡이 겹치는 시점에 방문자가 몰리자, 로딩 속도가 3초를 훌쩍 넘겼다. 그 결과 트래픽이 급감했고, 며칠 동안이나 회복하지 못했다. 운영 체계가 복잡해질수록 방치하면 터지는 게 속도다. 내 블로그가 느려졌다는 걸 깨닫는 건 방문자가 먼저 알게 되고 나서다.

    웹 페이지 속도 최적화는 단순한 기술적 점수 향상이 아니라, 사용자의 이탈을 막고 검색 엔진의 신뢰를 유지하는 비즈니스 필수 활동이다. 방치된 속도 저하는 곧 매출 감소로 직결된다.

    1단계: 이미지 외에 숨겨진 주범, ‘플러그인’과 ‘코드’

    속도가 느려질 때 대부분 이미지 압축부터 먼저 건드리지만, 이미지는 그다음 문제다. 워드프레스를 쓴다면 플러그인과 외부 스크립트가 훨씬 큰 병목 구간이다. 사용하지 않는 플러그인만 삭제한다고 끝나지 않는다. 활성화된 플러그인 하나가 로드할 때마다 PHP 코드를 실행하고 CSS, JS 파일을 추가로 불러온다.

    특히 주의해야 할 건 외부 스크립트다. 제3자 스크립트는 로딩 방식에 따라 네트워크와 메인 스레드를 점유해 렌더링을 늦출 수 있으므로, 실제 워터폴과 실행 시간을 측정해야 한다. 메인 콘텐츠 표시 지연은 DOMContentLoaded가 아니라 PerformanceObserver나 PageSpeed Insights에서 LCP와 그 하위 구간을 측정해 확인해야 한다. 렌더링 차단 리소스는 LCP에 영향을 줄 수 있지만, 실제 병목이 TTFB·LCP 리소스 발견·다운로드·렌더 지연 중 어디인지 먼저 측정해야 한다.

    불필요한 기능의 플러그인은 과감히 비활성화하고, 스크립트는 꼭 필요한 페이지에만 로드되도록 분리해야 한다. 외부 스크립트 최적화는 페이지 로딩 속도를 직접 결정짓는 가장 강력한 변수 중 하나다.

    2단계: 서버 응답 시간(TTFB)을 줄이는 당장 실천법

    페이지 속도 점수와 실제 체감이 다르면 TTFB뿐 아니라 실제 사용자 데이터, 네트워크, 캐시, 자바스크립트 실행 시간을 함께 점검해야 한다. 브라우저가 요청을 보내고 서버가 첫 바이트를 응답할 때까지의 시간이 길다는 뜻이다. 캐싱 플러그인만 켜두고 방치하면 이게 걸린다.

    1. 데이터베이스 쿼리 모니터링으로 느린 쿼리 찾기
    2. 이미지 용량과 개수 줄이기
    3. PHP 버전 업그레이드

    SaaS를 운영할 때 복잡한 쿼리가 응답을 늦추는 경험이 많다. 워드프레스도 예외가 아니다. 쿼리 모니터(Query Monitor) 같은 도구를 깔아보면, 의외의 플러그인이 무거운 쿼리를 수십 번 날리는 걸 볼 수 있다. 맹목적으로 캐싱 플러그인 힘만 믿다가는, 관리자 페이지에서는 캐시가 걸리지 않아 DB 부하를 그대로 맞고 작업 속도가 느려지는 역설을 겪게 된다. 데이터베이스 최적화는 쿼리를 줄이고 인덱스를 튜닝해서 서버가 일을 덜 하게 만드는 과정이다.

    플러그인과 서버 최적화

    3단계: 점검 순서를 헛되이 하지 않는 효율적인 수정 로드맵

    문제를 찾았다고 해서 한꺼번에 고치면 안 된다. 변수가 섞이면 뭐가 효과가 있었는지 알 수 없기 때문이다. 시간 대비 효과가 가장 큰 순서대로 해결책을 적용해야 한다.

    우선 LCP 줄이기에 집중한다. 주로 메인 배너 이미지나 텍스트 폰트 로딩 문제다. 이미지를 다음 포맷으로 바꾸거나 사이즈를 조절한다. Core Web Vitals 개선은 구글이 직접 평가하는 지표이므로 우선순위가 높다.

    그다음이 자바스크립트 실행 시간 줄이기다. 테마나 플러그인에서 불러오는 JS 파일을 지연 로드하거나 불필요한 것을 제거한다. 마지막으로 서버 사이드 렌더링 최적화를 진행한다. 이 과정에서 속도 측정 도구(PageSpeed Insights, GTmetrix)를 계속 돌려가며 수치 변화를 확인한다. 수정 후에는 반드시 캐시를 비우고 모바일/데스크톱 환경 모두에서 재점검해야 한다. PC에서는 빠른데 모바일에서만 느린 경우가 꽤 많다.

    자동화 운영자가 알려주는 속도 유지 꿀팁

    서버가 터지는 건 대개 예측 가능한 시점에 일어난다. 바로 자동화 배치 작업이 돌아갈 때다. 나는 현재 크론 63개를 무인으로 돌리고 있는데, 이들이 한꺼번에 실행되면 순간적으로 CPU 점유율이 치솟는다. 숨겨진 크론 문제다. 원격 플러그인 업데이트나 글 발행 배치가 돌 때 서버 자원을 갉아먹어 일시적으로 속도가 터질 수 있다.

    이를 막으려면 캐시 플러그인의 갱신 타이밍을 조절해야 한다. 크론 작업이 돌고 난 직후에 캐시를 비우거나, 사용자 접속이 적은 새벽 시간대에 무거운 작업을 몰아넣는 식이다. 캐시 설정이 너무 강력하면 오히려 글이 발행되어도 사용자에게 예전 글이 보이거나, 관리자 페이지에서 충돌이 일어나 수정이 안 되는 경우도 생긴다. 사이트 속도 모니터링 알림을 설정해두고, 알림이 울릴 때마다 어떤 작업이 겹쳤는지 로그를 확인하는 습관이 필요하다.

    마무리: 속도는 단순한 기술 점수가 아니라 비즈니스 문제다

    속도를 높이는 건 귀찮은 작업이다. 코드를 고치고 플러그인을 쑤시고 서버를 들여다봐야 하니까. 하지만 방치하면 트래픽은 고사하고 기존 사용자마저 잃는다. 사용자 경험(UX)을 해치는 느린 사이트는 아무리 좋은 글을 실어도 읽히지 않는다. 지금 당장 측정 도구를 하나 켜고, 내 블로그가 실제로 얼마나 느린지부터 확인해 보자. 개선한 만큼 트래픽이 돌아온다.


    글쓴이 정보

    초안은 AI 파이프라인이 쓰고, 검사를 통과한 글만 공개됩니다. 걸린 초안은 제가 직접 고칩니다. — 아일리고

    자주 나오는 질문

    블로그 속도가 느릴 때 가장 먼저 점검해야 할 곳은?

    이미지보다는 활성화된 플러그인과 외부 스크립트가 주범인 경우가 많습니다. 구글 애드센스나 유튜브 임베드 같은 3자 스크립트가 렌더링을 막고 있는지 먼저 확인하세요.

    페이지 속도 점수는 좋은데 실제 로딩은 느린 이유는?

    서버 응답 시간인 TTFB가 길어서일 가능성이 높습니다. 캐싱만 믿다가 데이터베이스 쿼리가 병목을 일으키고 있는지, 서버 자원을 모니터링해봐야 합니다.

    구글 서치 콘솔 노출이 갑자기 줄어든 이유가 속도인가?

    사용자가 페이지 로딩이 느려져 뒤로 가기를 누르는 이탈 신호를 구글이 포착했기 때문일 수 있습니다. 콘텐츠가 문제가 없다면 속도 저하로 인한 순위 하락을 의심해보세요.

    LCP 점수를 빠르게 올리는 가장 효과적인 방법은?

    메인 배너나 히어로 섹션의 이미지를 최신 포맷으로 변환하고 사이즈를 최적화하는 것이 가장 효과적입니다. 렌더링 차단 리소스를 제거하는 것도 필수적입니다.

    자동화 배치 작업 중 서버가 터지는 걸 막으려면?

    무거운 크론 작업이 사용자 접속이 적은 새벽 시간대에 돌도록 예약하세요. 캐시 갱신 타이밍을 조절해 작업 부하가 겹치지 않게 분산하는 것이 중요합니다.

    속도 최적화는 어떤 순서로 진행해야 효율적인가?

    LCP를 줄여 Core Web Vitals를 먼저 개선하고, 그다음 자바스크립트 실행 시간을 줄이세요. 마지막으로 서버 사이드 렌더링을 최적화하며 수치 변화를 모니터링하는 순서가 좋습니다.


  • wp-config.php 건드리기 전 백업 안 하면 낭패

    wp-config.php 건드리기 전 백업 안 하면 낭패

    wp-config.php 건드리면 사이트 날아갈까요?

    워드프레스 블로그 보안 유지를 위해 wp-config.php 수정 실수를 두려워하는 분이 많다. 파일 하나 잘못 건드리면 화면이 하얗게 변하거나 접속조차 안 되는 경험, 한 번쯤은 겪어봤을 테다. 나도 자동화 SaaS를 운영할 때 코드 한 줄 오타로 cron 63개가 전부 멈춰버린 사례가 있다. 서비스가 마비되니까 당황스럽기 그지없다. 이유는 단순했다. 문법 오류가 발생했는데, 모니터링 시스템이 이를 잡아내지 못한 것이다.

    중요한 건 ‘두려움’이 아니라 ‘복구 전략’이다. 단순히 FTP에 접속해서 파일을 다운로드받는 것만으로는 부족하다. 자동화 운영 환경에서는 백업 파일이 구버전으로 덮어씌워지는 ‘백업 파괴’ 현상이 종종 발생하기 때문이다. 수정 직전의 순수 상태 파일을 로컬이나 별도 원격 스토리지에 분리해서 보관하는 습관이 생명줄이 된다.

    수정 전 백업, 어디서부터 해야 할까요?

    백업이라고 플러그인 백업 기능만 믿으면 안 된다. 플러그인이 돌아가지 않는 상황(WSOD)이 오면 플러그인 백업 자체가 실패했을 수도 있다. 호스팅 관리자 페이지에 들어가서 파일 관리자를 켠다. wp-config.php 백업은 웹 문서 루트 밖이나 접근이 차단된 별도 저장소에 보관하고, 웹에서 요청 가능한 위치에 .bak 파일을 두지 않는다. 이 과정이 수정 사항을 적용하기 전에 필수적으로 거쳐야 할 관문이다. 워드프레스 보안 핵심은 인증 정보를 노출하지 않고, 불필요한 경로를 차단하는 흐름을 만드는 데 있다.

    실수했을 때 대처법: FTP 접속 없이 복구하기

    혹시라도 잘못 수정했다 싶으면 당황하지 말고 브라우저 호스팅 패널의 '파일 관리자'로 바로 들어간다. FTP 클라이언트를 설치할 시간조차 아까울 수 있다. wp-config.php 파일의 마지막 수정 시간을 확인하고, 방금 만든 .bak 파일 내용을 복사해서 붙여넣은 뒤 저장한다. 이 과정을 1분 안에 해결하면 방문자는 사이트 중단을 눈치채지 못한다. SSL 강제 등 보안 코드를 잘못 넣어서 '무한 리다이렉트 루프'에 빠졌을 때도, 파일 관리자로 접속해서 해당 코드 라인만 주석 처리(//) 하면 즉시 해결된다.

    보안 강화를 위해 반드시 수정해야 할 4곳

    복잡한 플러그인 설치 없이 텍스트 편집기로 몇 줄만 바꾸면 보안 효과는 확실해진다. 자동화 파이프라인이 주 1~5편으로 불규칙하게 글을 쓰고, 문체 검사를 통과한 글만 공개되듯, 보안 설정도 일회성이 아니라 주기적인 점검이 필요하다.

    보안 키(Salts) 갱신으로 쿠키 해킹 막기

    WordPress 보안 키와 salt는 인증 쿠키와 nonce의 해시·HMAC을 생성하고 검증하는 데 사용하는 비밀값이다. 이 값이 쉽게 유추되면 해커가 쿠키를 위조하여 관리자 세션을 탈취할 위험이 크다. 기본값으로 둔 채로 쓰는 것은 자물쇠에 '1234'를 다는 것과 같다. 워드프레스 공식 API 키 생성 페이지에 접속해서 뜨는 코드를 그대로 복사해 wp-config.php의 해당 칸에 붙여넣는다.

    
    // 설치 직후 wp-config.php 에는 이렇게 자리표시자만 들어 있다.
    define( 'AUTH_KEY',         'put your unique phrase here' );
    define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
    define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
    define( 'NONCE_KEY',        'put your unique phrase here' );
    define( 'AUTH_SALT',        'put your unique phrase here' );
    define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
    define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
    define( 'NONCE_SALT',       'put your unique phrase here' );
    

    이 8줄을 통째로 지우고, 공식 생성기가
    뱉어낸 8줄을 그대로 붙여넣는다. 값은 매번 새로 만들어지므로 남이 블로그에 적어둔 문자열을 복사해 쓰면 안 된다
    — 공개된 키는 없는 키와 같다. 새로고침할 때마다 다른 값이 나오는 것이 정상이다.

    이 코드를 적용하면 기존에 로그인된 사용자는 다시 로그인해야 한다. 쿠키가 무효화되기 때문이다. 보안 키를 교체하면 기존 로그인 쿠키가 무효화되므로 쿠키 유출이 의심될 때 세션을 강제로 종료하는 데 유용하지만, 다른 공격 경로까지 막지는 않는다.

    디버그 모드 끄고 에러 로그 숨기기

    운영 환경에서는 절대 에러 메시지가 화면에 출력되면 안 된다. PHP 경로나 데이터베이스 구조가 화면에 그대로 노출되면 공격자에게 침투 경로를 알려주는 꼴이 된다. wp-config.php 하단에 있는 디버그 상수를 모두 false로 설정한다.

    
    모든 PHP 코드 예시에서는 곡선 따옴표가 아닌 ASCII 따옴표를 사용한다: `define( 'WP_DEBUG', false );
    define( 'WP_DEBUG_LOG', false );
    define( 'WP_DEBUG_DISPLAY', false );
    

    에러를 확인해야 한다면 서버의 error.log 파일을 직접 까보는 습관을 들이는 게 좋다. 화면에 안 보인다고 해결된 게 아니다. 내부적으로 로그를 쌓으면서 조용히 문제를 해결하는 편이 낫다.

    테이블 접두사 변경 — 효과와 한계

    워드프레스를 설치할 때 기본 테이블 접두사는 wp_다. 새로 설치할 때는 myblog_처럼 예측하기 힘든 접두사를 쓰는 편이 낫다. 자동화된 스캐너가 테이블 이름을 찍어놓고 던지는 공격을 한 겹 걷어내 주기 때문이다.

    다만 이것을 SQL 인젝션 대책으로 이해하면 안 된다. 접두사 변경은 이름을 가리는 것(security through obscurity)일 뿐이고, 인젝션을 실제로 막는 것은 워드프레스가 쿼리를 준비된 문장으로 만들어 주는 $wpdb->prepare()다. 취약한 플러그인이 사용자 입력을 그대로 쿼리에 이어 붙이면 접두사를 뭘로 바꿔놨든 뚫린다. 접두사 변경은 보조 장치이지 방어선이 아니다. 그리고 이미 운영 중인 사이트에서 테이블 이름을 일괄 변경하는 작업은 잘못하면 사이트가 통째로 날아가므로 초보자에게는 추천하지 않는다.

    플러그인 없이 코드로 차단하는 공격 기법

    플러그인은 편하지만, 플러그인 자체의 취약점이 새로운 해킹 루트가 되는 경우도 허다하다. 나는 가능한 코드 레벨에서 직접 차단하는 것을 선호한다. wp-config.php와 functions.php, 그리고 .htaccess 파일을 조합하면 플러그인 없이도 탄탄한 방벽을 구축할 수 있다. 자동화 LLM을 헤드리스로 부를 때 기본 설정이 1회 $0.67이었는데, 불필요한 도구를 떼어내고 모델을 가벼운 쪽으로 바꿔 $0.0285까지, 약 24배 줄인 경험처럼, 불필요한 요청을 원천 차단하면 리소스 효율도 비약적으로 올라간다.

    XML-RPC 및 REST API 무차별 대공격 막기

    xmlrpc.php는 원격에서 블로그를 관리하기 위한 기능이지만, DDoS 공격이나 무차별 대공격(Brute Force)에 악용되는 주요 타겟이다. xmlrpc_enabled` 필터는 인증이 필요한 XML-RPC 메서드만 끄며, XML-RPC 요청 전체를 차단하려면 웹 서버나 WAF 설정 또는 메서드별 필터가 추가로 필요하다. functions.php에 아래 코드를 추가한다.

    
    add_filter('xmlrpc_enabled', '__return_false');
    

    REST API 역시 불필요한 외부 호출을 막아야 한다. 다만, 내가 만든 SaaS처럼 외부 서비스와 연동이 필요한 경우 API를 완전히 막으면 서비스가 멈춘다. 이럴 땐 특정 IP나 인증된 사용자에게만 접근을 허용하는 예외 처리를 필수적으로 넣어야 한다. 허용 IP를 설정하는 경험을 통해, 보안 설정과 기능 동작의 균형을 맞추는 법을 터득했다.

    파일 직접 접근 차단 (Disable File Editing)

    워드프레스 관리자 화면에서 테마나 플러그인의 코드를 직접 수정할 수 있는 기능이 있다. 편하지만 해커가 관리자 권한을 탈취했을 때 악성 코드를 심는 가장 쉬운 방법이기도 하다. wp-config.php에 이 코드를 한 줄 추가하면 관리자 화면에서 더 이상 파일 편집이 불가능해진다.

    
    define( 'DISALLOW_FILE_EDIT', true );
    

    이 설정은 코드 수정은 무조건 FTP나 파일 관리자로 하게 만든다는 뜻이다. 귀찮아진다고 생각할 수 있지만, DISALLOW_FILE_EDIT`는 관리자 화면의 파일 편집 경로 하나를 제거하지만, 관리자 계정 탈취 후의 모든 코드 변경을 막는 설정은 아니다.

    외부 API 호출과 보안 설정의 충돌 해결법

    보안 코드를 넣다 보면 의도치 않게 정상적인 기능이 막히는 수가 있다. 예를 들어, SSL 강제 리다이렉트를 걸었는데 특정 결제 모듈이 비보안 콜백을 요구하면 결제가 실패한다. 이럴 때는 .htaccess 파일에서 특정 경로만 SSL 예외로 두는 세심한 설정이 필요하다. 보안이 중요하지만, 사이트가 기능을 못 하면 존재 의의가 사라진다. 문제가 생겼을 때는 즉시 방금 수정한 설정을 주석 처리하고, 접속 로그를 확인해서 어떤 요청이 막혔는지 파악해야 한다.

    코드로 공격 차단하기

    잘못 수정했을 때 사이트가 멈추면 복구하는 절차

    아무리 조심해도 실수는 하기 마련이다. 내가 운영하는 시스템도 문법 오류가 나면 알림을 보내는 모니터링을 돌리고 있다. 문제는 화면이 하얗게 나오는 WSOD(White Screen of Death) 상황이 언제 터질지 모른다는 점이다.

    화면이 하얗게 나올 때(WSOD) 원인 파악

    WSOD는 대부분 PHP 메모리 부족이나 문법 오류 때문에 발생한다. wp-config.php를 수정한 직후에 이 화면이 떴다면 문법 오류부터 의심하는 게 순서다. 누락된 세미콜론(;)이나 따옴표 짝이 안 맞는지 의심해야 한다. 에러 로그를 볼 수 없다면, 해당 파일 수정 내용을 하나씩 지워가면서(혹은 주석 처리하면서) 어디서 문제가 터지는지 확인한다.

    문법 오류(Syntax Error) 발생 시 수정법

    브라우저 화면에 "Parse error: syntax error" 같은 메시지가 뜬다면 다행이다. 몇 번째 줄에서 무엇이 잘못됐는지 알려주기 때문이다. FTP 대신 파일 관리자로 접속해서 해당 라인으로 이동해 수정한다. 만약 수정 사항이 기억나지 않는다면, 처음에 백업해 둔 .bak 파일로 덮어씌우는 것이 정신 건강에 이롭다. 자존심 세울 때가 아니다.

    백업 파일로 원복하는 마지막 단계

    사이트가 죽었을 때 급하게 복구하다 보면, 오류가 난 파일을 또 백업해버리는 실수를 저지르기 쉽다. 그러면 깨끗한 원본이 사라진다. 반드시 수정 전 상태로 돌아갈 때는 덮어쓰기 말고, 기존 파일을 이름을 바꿔서(wp-config.php.error) 보관해 두고 백업 파일을 가져온다. 그래야 다시 원인을 분석할 여지가 남는다.

    마무리: 안전한 보안 설정을 위한 체크리스트

    지금까지 wp-config.php 수정 실수 없이 보안을 강화하는 방법을 정리했다. 코드 한 줄이 사이트의 운명을 가르기도 한다. 나는 모든 수정 후에 사람이 직접 검토하는 '수동 검수 게이트'를 두고 있다. 자동화가 아무리 편해도, 결국 최종 책임은 사람이 져야 한다. SEO 플러그인으로 변경 사항을 함께 검증하는 것도 좋지만, 기본적으로 파일을 건드리기 전 백업을 확인하는 습관이 그 어떤 도구보다 강력하다.

    • 파일 수정 전 .bak 파일 생성 여부 확인
    • 수정 코드의 문법(Syntax) 체크
    • 사이트 접속 및 관리자 페이지 로그인 테스트
    • 외부 API 연동 서비스 정상 작동 여부 확인

    이 과정을 하나씩 거치면 해킹도 두렵지 않다. 너무 조급하게 하지 마라. 천천히, 그리고 확실하게 적용하는 게 빠른 길이다.

    참고한 공식 문서


    글쓴이 정보

    제가 만든 AI 파이프라인이 초안을 쓰고, 저는 검사에 걸린 것만 손봅니다. 통과하지 못한 초안은 그냥 버립니다. 파이프라인은 여기에 정리해 두었습니다.