n8n으로 인스타그램 웹 크롤링부터 AI 분석, 이메일 발송까지 자동화하기
언더 뮤지션들을 홍보하는 목적으로 3차 프로젝트를 진행했고 마침내 끝이 났다.
3차 프로젝트를 진행하면서 사용자의 인스타그램 지표를 크롤링해 가져와 AI 분석을 수행하고, 분석 결과를 이메일로 발송하는 자동화 플로우를 구축했다.
실제 도메인 사이트 : https://www.musicpeak.site
내가 구축한 플로우에는 7개의 노드가 들어감. 각 노드별로 적어보겠심다
가장 첫 번째 노드는 Webhook이다.
사용자가 서비스에서 분석 요청을 하면 Spring Boot 백엔드는 먼저 분석 Job을 생성하고, n8n Webhook URL로 요청을 보낸다.
백엔드는 n8n에게 뒷 작업을 위임한다.
Webhook으로 전달하는 데이터는 대략 다음과 같은 형태이다.
{
"analysisJobId": 1,
"promotionId": 10,
"musicianId": 3,
"instagramUsername": "example_user",
"sinceDate": "2026-05-01",
"email": "test@example.com"
}
여기서 중요한 값은 analysisJobId이다.
이 값이 있어야 이후 단계에서 현재 분석 요청이 어떤 Job인지 추적할 수 있다.
Webhook
→ 백엔드에서 전달한 분석 요청 데이터 수신
→ 이후 노드에서 사용할 기본 데이터 확보
처음에는 단순히 username만 넘겨도 되지 않을까 생각했지만, 실제로는 분석 Job 상태 관리와 결과 저장을 위해 analysisJobId, promotionId, email 같은 값들이 함께 필요했다.
두 번째 노드는 RUNNING이다.
Webhook으로 요청을 받은 직후, 해당 분석 Job의 상태를 RUNNING으로 변경한다.
처음 사용자가 분석을 요청했을 때 Job 상태는 보통 PENDING으로 저장된다.
n8n 플로우가 시작되면 백엔드 API를 호출해서 상태를 RUNNING으로 바꾼다.
Webhook 요청 수신
→ analysisJobId 확인
→ 백엔드 상태 변경 API 호출
→ status = RUNNING
이 단계를 둔 이유는 프론트나 백엔드에서 현재 분석이 실제로 진행 중인지 확인할 수 있게 하기 위해서다.
만약 이 상태 변경이 없다면, 사용자는 분석 요청을 했지만 실제로 크롤링이 시작되었는지 알기 어렵다.
세 번째 노드는 Context이다.
이 노드에서는 이후 크롤링과 AI 분석에 필요한 데이터를 정리한다.
Webhook에서 받은 데이터가 그대로 모든 노드에서 쓰기 좋은 형태는 아니기 때문에, 필요한 값만 추출해서 하나의 Context로 구성했다.
이 Context 노드를 둔 이유는 뒤쪽 노드들이 복잡해지는 것을 막기 위해서다.
각 노드마다 Webhook 원본 데이터를 계속 찾아서 쓰면 표현식이 길어지고 유지보수가 어려워진다.
그래서 중간에 Context를 만들어두고, 이후 노드에서는 정리된 값을 기준으로 동작하도록 구성했다.
이렇게 해두면 Web Crawling 노드나 Save Crawling-result 노드에서 필요한 값을 쉽게 가져다 쓸 수 있다.
네 번째 노드는 Web Crawling이다.
이 단계에서는 인스타그램 사용자명을 기반으로 게시글 데이터를 수집한다.
n8n에서는 HTTP Request 노드 또는 크롤러 서버 호출 방식을 사용할 수 있는데, 이번 프로젝트에서는 크롤러를 별도로 두고 n8n에서 해당 크롤러 API를 호출하는 방식으로 구성했다.
이 단계가 전체 플로우에서 가장 무거운 작업이었다.
웹 크롤링은 외부 사이트 상태, 네트워크, 브라우저 실행 환경, 서버 메모리 등에 영향을 많이 받는다.
특히 Playwright나 Chromium 기반 크롤러를 사용할 경우 서버 리소스를 많이 사용한다.
그래서 크롤링은 백엔드 요청 흐름 안에서 직접 처리하기보다, n8n 플로우 안에서 별도 단계로 분리하는 것이 더 관리하기 좋았다.
다섯 번째 노드는 Conversion JSON이다.
이 단계에서 크롤링 결과를 백엔드와 AI 분석에서 사용하기 좋은 JSON 형태로 변환한다.
예를 들면 크롤러 결과를 다음과 같은 형태로 정리할 수 있다.
{
"analysisJobId": 1,
"promotionId": 10,
"instagramUsername": "example_user",
"posts": [
{
"caption": "신곡 발매 안내",
"mediaUrl": "https://...",
"permalink": "https://...",
"timestamp": "2026-05-01T12:00:00",
"likeCount": 120,
"commentCount": 15,
"shareCount": 4,
"profileVisitCount": 20
}
]
}
이 변환 단계를 따로 둔 이유는 역할을 분리하기 위해서다.
크롤러는 데이터를 수집하는 역할만 하고,n8n의 Conversion JSON 노드는 데이터를 사용하기 좋은 형태로 가공하는 역할을 한다.
이렇게 나누면 크롤러 응답 구조가 조금 바뀌더라도, 전체 플로우를 다 수정하지 않고 변환 노드만 수정하면 된다.
여섯 번째 노드는 Save Crawling-result이다.
Conversion JSON에서 정리한 데이터를 백엔드 API로 전달해 DB에 저장한다.
크롤링과 AI 분석을 완전히 하나의 덩어리로 묶지 않고, 중간 결과를 저장하는 구조로 만들었다.
이런 구조로 설계해섯 실패 지점을 더 명확하게 추적할 수 있었다.
마지막 노드는 AI Analysis + Send email이다.
이 단계에서는 저장된 크롤링 데이터를 기반으로 AI 분석을 수행하고, 분석 결과를 DB에 저장하고, 분석 결과를 사용자 이메일로 발송한다.
AI 분석에서는 단순히 게시글을 요약하는 것이 아니라, 음악 홍보 관점에서 개선점을 도출하도록 설계했다.
AI에게 요청할 때는 응답 형식을 명확히 지정했다.
이렇게 형식을 정해줘서 백엔드에서 분석 결과를 저장하거나, 이메일 본문에 넣을 때 다루기 쉬워졌다.
사용자가 진단을 받기 위해서는 홍보를 만들고 그 홍보를 진단받는다.

위에 진단 신청하기를 누르면 바로 n8n 플로우로 들어가지 않고 먼저 검증 크롤러가 크롤링한다. 사용자의 인스타 계정이 차단 계정인지, 비공개 계정인지, 실제 있는 계정인지 검증하고 검증된 사용자만 다음 n8n 플로우로 들어올 수 있다.


이번 프로젝트에서는 n8n을 활용해 인스타그램 웹 크롤링, AI 분석, 이메일 발송까지 이어지는 자동화 플로우를 구축했다.
처음에는 단순히 자동으로 이메일을 보내는 기능이라고 생각했지만, 실제로 구현해보니 중요한 것은 자동화 자체보다 각 단계의 책임을 나누고 실패 지점을 추적할 수 있게 만드는 것이었다.