본문으로 건너뛰기
최서희Frontend Engineer
← 블로그

Projects

[인턴 일지] 노코드/로우코드로 만든 뉴스레터 자동화: 회사 과제로 시작해 MVP까지

· 16분 읽기

0) 서론

스마트팩토리 기업 인턴 기간 동안, 회사로부터 노코드·로우코드 툴을 리서치하고 실제 적용 사례를 구현하라는 과제를 부여받았습니다. 기존 코드 중심 개발보다 빠르고 효율적인 자동화를 검증하는 목적이었고, 주제는 뉴스레터 제작·발송 프로세스의 완전 자동화였습니다. 목표는 정보 수집 → 요약 → 템플릿 생성 → 이메일 발송까지 이어지는 엔드투엔드 파이프라인을 노/로우코드 중심으로 구축하는 것이었습니다.


1) 기술 선정 배경: 작게 시작해 크게 확장 (그라데이션 모델)

<table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft"><tbody><tr><td><b>단계</b></td><td>목표</td><td><b>핵심 스택</b></td><td>비고</td></tr><tr><td><b>S</b> (소규모/MVP)</td><td>아이디어 검증/파일럿</td><td><b>Activepieces</b> + <b>Gmail SMTP</b> + <b>클라우드 LLM</b></td><td>서버 無, 30분 내 가동</td></tr><tr><td><b>M</b> (중규모/팀)</td><td>안정적 팀 운영/가시성</td><td><b>Airtable(대시보드)</b> + <b>Listmonk</b> + <b>AWS SES</b></td><td>세그먼트/캠페인/지표</td></tr><tr><td><b>L</b> (대규모/조직)</td><td>비용·보안·전달성 극대화</td><td><b>셀프호스팅(AP·Listmonk)</b> + <b>SES(전용 도메인)</b> + <b>하이브리드 LLM(Ollama)</b></td><td>DMARC/바운스 웹훅/RBAC</td></tr></tbody></table>

현재는 S 단계를 채택해 빠르게 작동시키는 데 초점을 두고, 사용량과 요구가 커지면 M → L로 단계적 전환이 가능하도록 설계했습니다.


2) 개발 흐름 (Development Flow)

본 프로젝트는 두 가지 흐름으로 나뉩니다.

  • 구독 저장 플로우: 구독 폼 → AP Webhook → Google Sheets(Audience) 저장 → JSON 응답
  • 자동 뉴스레터 발송 플로우: 매일 스케줄 → 수집/정제/요약 → HTML → Gmail 발송 → Articles 로그 적재

장점

  • 무료/저비용, 서버 없이 신속 구축
  • 운영 절차 단순

제약

  • Gmail 일일 500통 한도
  • 대규모 발송/전달성 관리 어려움 → M/L 단계에서는 AWS SES + 전용 도메인 도입으로 해결

① 구독 저장 플로우

[구독 폼 (HTML, GitHub Pages)]
          │
          ▼
[AP Webhook (Trigger)]
          │
          ▼
[Code Step: 입력 검증/중복 확인]
          │
          ▼
[Google Sheets: Audience 저장]
          │
          ▼
[JSON 응답 (201/200/400)]

구독 저장 플로우
구독 저장 플로우

1-1. 준비물

  • Google Sheets 문서
    • Audience 시트 생성
    • 1행 헤더: Email | Name | Tags | Status
    • (선택) CreatedAt | UpdatedAt
  • Activepieces
    • Webhook(Trigger) 플로우 생성
    • Google Sheets OAuth 연결
  • 정적 폼 페이지 (예: GitHub Pages)
    • 입력: email(필수), name/tags(선택)
    • 허니팟(봇 차단용) 필드 1개
    • AP Webhook URL로 POST

1-2. AP 스텝 구성

  1. Trigger: Webhook (Catch Webhook)
  2. Code – validate_input
    • Request Body 정규화
    • 허니팟 감지 → 400 반환
    • 이메일 형식 검증 → 400 반환
    • 이름/태그 정리, Status 강제(Pending/Test/Active 등)
    • 출력: {ok, email, name, tags, status}
  3. Google Sheets – Find Rows (Audience)
    • Column: Email
    • Exact match: ON, Starting Row: 2
  4. 분기(Execute If)
    • A) ok=false → Return Response 400 (CORS 헤더 포함)
    • B) ok=true & 기존 행 없음 → Insert Row(Audience) → Return Response 201
    • C) 기존 존재 → Return Response 200
  5. (선택) Code – now_kst → CreatedAt/UpdatedAt 매핑

1-3. 검증 포인트

  • 첫 호출: 201 + Audience 1행 추가
  • 중복 호출: 200 + 변경 없음
  • 잘못된 메일: 400
  • CORS 에러 시 → Return Response에 Access-Control-Allow-Origin:* 등 헤더 추가

② 자동 뉴스레터 발송 플로우

[스케줄러 (매일 07:30 KST)]
          │
          ▼
[RSS 수집 (병렬)]
          │
          ▼
[Dedup / Clean (URL 파라미터 제거)]
          │
          ▼
[LLM 요약 (TL;DR + 불릿 5~8개)]
          │
          ▼
[HTML 템플릿 생성]
          │
          ▼
[Gmail SMTP 발송 → Audience 대상자]
          │
          ▼
[Google Sheets: Articles 로그 저장]

자동 뉴스레터 발송 플로우
자동 뉴스레터 발송 플로우

2-1. 준비물

  • Gmail: 2단계 인증 + 앱 비밀번호(16자리)
  • OpenAI API 키
  • Google Sheets: Audience, Articles 시트
    • Articles 헤더: RecordedAt | Title | URL | Feed | TLDR | Bullets

2-2. AP 스텝 구성 (권장 순서)

  1. Trigger – Schedule: 매일 07:30 (Asia/Seoul)
  2. Code – 01_config
    • feeds, subject, llm(model/temp/maxTokens), timezone 등 환경값 반환
  3. Code – 02_collect
    • 다수 RSS 병렬 수집, <item|entry> 파싱
    • title/link/pubDate/description/feed 표준화
    • pubDate 최신순 정렬, maxItems로 슬라이스
  4. Code – 03_clean
    • utm_*, gclid, fbclid 제거(URLSearchParams)
    • HTML 텍스트화(script/style 제거)
  5. Code – 04_llm
    • 프롬프트: TL;DR 1문장 + 불릿 5–8개
    • 설정: temperature 0.2, max_tokens 800~900, timeout 20s, retries 2
    • 출력: {title, url, summary, feed} 배열
  6. Code – 05_build_html
    • TL;DR 1줄 + 불릿(•) HTML 렌더링
    • 제목/날짜/원문보기 링크 포함
    • 출력: subject, html
  7. Google Sheets – Find Rows (Audience)
    • Starting Row: 2, Number of Rows: 충분히 크게
  8. Code – filter_recipients
    • Status 허용 집합(Active, Test 등)
    • segment 태그 필터(선택)
    • 이메일 유효성/중복 제거
    • 출력: emails[]
  9. Loop – Send Email (SMTP: Gmail)
    • Loop list: emails
    • To: {{loop.value}}
    • Subject: {{steps.05_build_html.json.subject}}
    • BodyType: HTML
    • Body: {{steps.05_build_html.json.html}}
  10. Google Sheets – Find Rows (Articles)
    • 기존 URL 목록 로드 (디듑용)
  11. Code – build_article_rows
    • LLM 요약 → Articles 행 변환
    • 기존 URL과 디듑 → rows(2D) 출력
  12. Code – to_csv
    • rows(2D) → CSV 문자열 변환 (줄바꿈/더블쿼트 이스케이프)
  13. Google Sheets – Insert Multiple Rows
    • Rows Input Format: CSV
    • CSV: {{steps.to_csv.json.csv}} 입력

2-3. 검증 포인트

  • filter_recipients.count > 0 → 실제 메일 수신 (스팸함 포함 확인)
  • 첫날 Articles는 [0 items] 가능 (처음 보는 URL만 이후 적재)
  • to_csv 첫 줄은 반드시:
  • RecordedAt,Title,URL,Feed,TLDR,Bullets
  • Insert 이후 시트 A2~에 데이터 생성

3) 운영/전달성 가이드

  • 제목 35–60자, 본문 800–1200자
  • 추적 파라미터 제거: utm_* / gclid / fbclid
  • 간단한 수신 고지/거부 문구 포함
  • 루프 발송 권장(주소 노출 방지/개인화/부분 실패 격리)
  • 초반엔 Status=Test 샘플 소수 발송 → 평판 형성 후 확대

4) 문제 해결(트러블슈팅)

<table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft"><tbody><tr><td>증상</td><td>원인</td><td>해결</td></tr><tr><td>404 Not Found</td><td>Webhook URL 오타/플로우 OFF</td><td>URL 재복사, 플로우 ON</td></tr><tr><td>400 Invalid email</td><td>Body 미매핑/검증 실패</td><td>Inputs에서 payload=(Webhook) Body 매핑</td></tr><tr><td>CORS 에러</td><td>응답 헤더 누락</td><td>Return Response에 Access-Control-Allow-Origin:* 등 3헤더</td></tr><tr><td>계속 새 행 추가</td><td>Find Rows 설정 불일치</td><td>Column=Email, Exact=ON, Starting Row=2, 헤더 철자 동일</td></tr><tr><td>No recipients defined</td><td>Send Email의 To 비어있음</td><td>루프는 {{loop.value}}, 일괄은 emails.join(",")</td></tr><tr><td>Invalid Opening Quote</td><td>CSV 자리에 JSON 입력</td><td><b>CSV 칸</b>에 {{steps.to_csv.json.csv}}만</td></tr><tr><td>summaries/items not iterable</td><td>타입 미스매치</td><td>해당 스텝 입력 토큰 재매핑(정규화 코드 사용)</td></tr></tbody></table>


5) 확장 로드맵 (M → L)

  • M: Airtable Interfaces(대시보드) + Listmonk + SES – 비개발자도 시간/피드/세그먼트 변경, 캠페인/지표 관리
  • L: Self-host(AP·Listmonk), SES 전용 도메인 + SPF/DKIM/DMARC, 바운스/불만 웹훅, RBAC/감사로그 – LLM은 클라우드 + 로컬(Ollama) 병행(민감 데이터/비용 최적화)

6) 결과

대시보드
대시보드

이메일 결과 화면
이메일 결과 화면


7) 느낀점

로우코드 툴을 사용하면서 단점과 장점을 동시에 체감할 수 있었다.

우선, 단순히 빠르고 쉽게 해결될 줄 알았지만 실제로는 툴의 구조가 오히려 복잡하게 느껴졌고, 결국 코드를 병행해야 했기 때문에 익숙해지기까지 시간이 걸렸다. 또한 더 많은 기능을 활용하려면 유료 구독이 필요하다는 점에서, 장기적으로는 직접 코드를 개발하는 편이 더 적합하다는 생각도 들었다.

그럼에도 불구하고 분명한 장점도 있었다. 본격적으로 개발에 들어가기 전 초기 설계 도구로 활용하기에 충분히 가치가 있었고, 제공되는 확장 프로그램이나 외부 서비스 연동을 손쉽게 사용할 수 있어 편리했다. 특히 빠르게 MVP를 구현하거나, 개발자가 아닌 직군도 쉽게 활용할 수 있을 만큼 진입장벽이 낮다는 점이 인상 깊었다. 무엇보다도 정해진 기한 안에 빠르게 결과물을 만들어야 할 때 로우코드 툴은 큰 강점이 될 수 있다는 것을 느꼈다.

결과적으로, 로우코드 툴은 장기적·복잡한 개발보다는 단기적인 프로토타이핑, 아이디어 검증, 그리고 빠른 기한 내 결과물이 필요한 상황에 더욱 적합하다는 점을 직접 경험할 수 있었다.


  1. 참고 자료 및 문서

RSS 란 무엇인가

[RSS 란 무엇인가

RSS 서비스에 대해 이해하기 블로그나 뉴스, 기사 등의 페이지에서 쉽게 볼 수 있는 아이콘이 있습니다....

blog.naver.com](https://m.blog.naver.com/patchwork_corp/222485364227)

로우코드 플랫폼 탑 5 분석 - 소개, 장/단점, 가격 등 총정리

[로우코드 플랫폼 탑 5 분석 - 소개, 장/단점, 가격 등 총정리

로우코드 플랫폼 으로 잘 알려진 리툴(Retool), MS 파워앱스 (MS Power Apps), 아웃시스템즈 (OutSystems), 서비스 나우(ServiceNow) 그리고 웨이브온(Waveon) 에 대해서 각각 소개와 장점, 단점 그리고 가격에 대

www.waveon.io](https://www.waveon.io/blog/top-5-lowcode-platform)

내가 구독하는 IT 관련 RSS 목록 정리

[내가 구독하는 IT 관련 RSS 목록 정리

0. 서론 구글에 검색하다 보면 심심치 않게 기업에서 자체적으로 기술 블로그를 운영하는데 현업의 경험을 바탕으로 작성되는 정보다 보니 하나같이 흥미롭다고 느낀다. 매번 올라오는 양질의

taking.kr](https://taking.kr/korea-it-technology-blog-list-with-rss/)

로우코드/노코드를 통한 워크플로우 자동화 솔루션

[로우코드/노코드를 통한 워크플로우 자동화 솔루션

반복적인 업무를 줄이는 워크플로우 자동화! 로우코드/노코드로 손쉽게 자동화 하는 방법을 알아봅시다.

medium.com](https://medium.com/bizsol/%EB%A1%9C%EC%9A%B0%EC%BD%94%EB%93%9C-%EB%85%B8%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-%EC%9E%90%EB%8F%99%ED%99%94-%EC%86%94%EB%A3%A8%EC%85%98-a4987e3d7792)

https://takeofujii.net/ko/activepieces/

[Activepieces 사용법: 초보자도 코드 없이 자동화할 수 있는 Zapier보다 낫다! 업무를 획기적으로 효율

이 글에서는 Activepieces의 사용법을 알기 쉽게 소개합니다. 처음 사용하는 사람도 코드 없이 자동화를 만들 수 있는 이 툴을 통해 업무를 획기적으로 효율화할 수 있습니다.

takeofujii.net](https://takeofujii.net/ko/activepieces/)

댓글

GitHub 계정으로 댓글을 남길 수 있어요.