n8n 워드프레스 자동화: 완벽 실전 구축 가이드

어제도 밤늦게까지 블로그 글 발행 버튼을 누르다 문득 이런 생각이 들었습니다. ‘이 단순 반복 작업을 매일 내가 손으로 해야 하나?’ 매번 새로운 정보를 찾고, 정리하고, 워드프레스에 업로드하는 일련의 과정은 분명 가치 있지만, 물리적인 시간의 한계에 부딪히는 순간, 깊은 회의감이 밀려오는 건 저뿐만이 아닐 겁니다. 특히 1인 창업가나 바쁜 개발자에게 콘텐츠 발행은 늘 숙제처럼 따라붙는 부담이죠.

그래서 저는 몇 년 전부터 이 지루하고 반복적인 작업을 어떻게 하면 ‘스마트하게’ 자동화할 수 있을까 고민해왔습니다. 그리고 그 해답 중 하나로 n8n 워드프레스 자동화 파이프라인을 구축하며 놀라운 효율을 경험했습니다. 특히 SearXNG를 결합했을 때, 콘텐츠 ‘발굴’부터 ‘발행’까지 거의 완벽한 무인 시스템을 만들 수 있다는 것을 깨달았죠. 오늘은 제가 직접 구축하며 얻은 노하우와 실전 팁을 아낌없이 공유해드리려 합니다.

n8n과 SearXNG, 왜 이 조합이 강력할까요?

n8n은 ‘코드 없는’ 또는 ‘로우 코드’ 방식으로 다양한 애플리케이션과 서비스를 연결하여 워크플로우를 자동화할 수 있게 해주는 강력한 툴입니다. 마치 디지털 레고 블록처럼, 각 기능을 담당하는 ‘노드’들을 연결하기만 하면 복잡한 자동화 로직을 쉽게 구현할 수 있죠. 반면 SearXNG는 여러 검색 엔진의 결과를 한데 모아 보여주는 오픈소스 메타 검색 엔진입니다. 개인 정보 보호에 강점을 가지며, 무엇보다 API를 통해 검색 결과를 쉽게 가져올 수 있다는 것이 핵심입니다.

이 둘의 조합이 강력한 이유는 명확합니다. SearXNG가 특정 주제에 대한 최신 정보를 ‘발굴’하는 촉매 역할을 하고, n8n이 그 발굴된 정보를 가공하여 워드프레스에 ‘자동 발행’하는 파이프라인을 구축하는 것이죠. 기존에는 구글 시트나 노션에 콘텐츠를 미리 정리해두고 n8n이 읽어와 발행하는 방식이 일반적이었지만 (참고: n8n 워드프레스 자동발행 구축 완벽 가이드), SearXNG를 통해 콘텐츠 ‘소싱’ 단계까지 자동화의 영역을 확장할 수 있게 됩니다.

자동 포스팅 파이프라인의 핵심 아키텍처 이해하기

이 파이프라인의 핵심은 다음과 같은 흐름으로 작동합니다.

  1. 트리거 (Trigger): 특정 시간 (예: 매일 새벽 3시) 또는 특정 이벤트 (예: 새로운 키워드 목록 업데이트) 발생.
  2. 정보 검색 (SearXNG): n8n이 SearXNG API를 호출하여 미리 정의된 키워드나 주제에 대한 최신 검색 결과 수집.
  3. 데이터 가공 및 정제 (n8n): 수집된 검색 결과에서 제목, 본문 내용 (예: 요약, 특정 섹션 추출), 관련 링크, 이미지 URL 등 필요한 데이터를 추출하고 워드프레스 포스팅 형식에 맞게 가공.
  4. 콘텐츠 생성 (Optional, AI/LLM): 필요하다면, 가공된 데이터를 기반으로 AI/LLM을 활용하여 초안 콘텐츠를 생성하거나 기존 내용을 보강. (이 글에서는 SearXNG 데이터 가공에 집중합니다.)
  5. 워드프레스 발행 (WordPress REST API 또는 WP Webhooks): 가공된 데이터를 워드프레스 REST API나 WP Webhooks 플러그인(참고: n8n 자동화 파이프라인 전체 구조)을 통해 전송하여 새 글 발행, 카테고리/태그 설정, 썸네일 업로드까지 자동 처리.
  6. 후처리 (Post-processing): 발행된 글의 링크를 X(구 트위터) 등 소셜 미디어에 자동으로 공유 (참고: n8n 기반의 구체적인 워크플로우 설계).

이 모든 과정은 n8n 워크플로우 하나로 유기적으로 연결되어 돌아갑니다.

n8n과 SearXNG로 워드프레스 무인 자동 포스팅 파이프라인 구축 5단계

n8n 워드프레스 자동화 아키텍처 및 흐름도

자, 이제 실제 구축 과정으로 들어가 보겠습니다. 저는 온프레미스 환경에 n8n과 SearXNG를 Docker로 설치했다고 가정하고 진행하겠습니다.

1단계: n8n 및 SearXNG 인스턴스 준비

가장 먼저 n8n과 SearXNG 인스턴스가 동작해야 합니다. Docker Compose를 사용하면 쉽게 설치할 수 있습니다.

# docker-compose.yml 예시
version: '3.8'

services:
  n8n:
    image: n8n:latest
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=${N8N_HOST}
      - N8N_PORT=5678
      - WEBHOOK_URL=${WEBHOOK_URL} # 외부에서 접근 가능한 n8n URL
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=${N8N_USER}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n

  searxng:
    image: searxng/searxng:latest
    restart: always
    ports:
      - "8080:8080"
    environment:
      - SEARXNG_BASE_URL=http://localhost:8080/
    volumes:
      - searxng_data:/etc/searxng

volumes:
  n8n_data:
  searxng_data:

위 docker-compose.yml 파일을 작성하고 docker-compose up -d 명령어로 실행합니다. N8N_HOST, WEBHOOK_URL, N8N_USER, N8N_PASSWORD 등은 실제 환경에 맞게 .env 파일이나 환경 변수로 설정해주세요.

2단계: SearXNG API를 이용한 정보 수집 워크플로우 구성

n8n 대시보드에 접속하여 새로운 워크플로우를 만듭니다.

  1. Start 노드 (Cron):

    • Trigger 노드에서 Cron을 선택합니다.
    • Mode를 Every X로 설정하고 Hours를 12로 설정하여 하루 두 번 실행되도록 합니다. (원하는 주기로 설정)
    • 이것이 바로 “트리거 설정이 핵심”이라는 첫 번째 팩트의 구현입니다.
  2. HTTP Request 노드 (SearXNG API 호출):

    • HTTP Request 노드를 추가합니다.
    • Method: GET
    • URL: http://localhost:8080/search?q={{ $json.keyword }}&format=json (여기서 localhost:8080은 SearXNG 인스턴스 주소이며, {{ $json.keyword }}는 이전 노드에서 전달받을 키워드입니다.)
    • Query Parameters: q와 format을 직접 URL에 넣거나, Query Parameters 섹션에 q = {{ $json.keyword }}와 format = json으로 분리해서 추가할 수 있습니다.
    • 이때, Set 노드를 HTTP Request 노드 앞에 추가하여 keyword 값을 정의할 수 있습니다. (예: Set 노드에서 Key를 keyword, Value를 n8n 워드프레스 자동화로 설정)
    • Response Format: JSON으로 설정합니다.
[
  {
    "nodes": [
      {
        "parameters": {
          "mode": "everyX",
          "value": {
            "hours": 12
          }
        },
        "name": "Cron Trigger",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [250, 300]
      },
      {
        "parameters": {
          "values": {
            "string": [
              {
                "name": "keyword",
                "value": "n8n 워드프레스 자동화"
              }
            ]
          }
        },
        "name": "Set Keyword",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [450, 300]
      },
      {
        "parameters": {
          "url": "http://localhost:8080/search",
          "options": {
            "jsonParameters": true,
            "queryParameters": [
              {
                "name": "q",
                "value": "={{ $json.keyword }}"
              },
              {
                "name": "format",
                "value": "json"
              }
            ]
          }
        },
        "name": "SearXNG Search",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 3,
        "position": [650, 300]
      }
    ],
    "connections": {
      "Cron Trigger": [
        [
          {
            "node": "Set Keyword",
            "type": "main"
          }
        ]
      ],
      "Set Keyword": [
        [
          {
            "node": "SearXNG Search",
            "type": "main"
          }
        ]
      ]
    }
  }
]

3단계: 검색 결과 데이터 가공 및 정제

SearXNG에서 받은 JSON 응답은 여러 검색 결과와 메타데이터를 포함합니다. 워드프레스 포스팅에 필요한 핵심 정보만 추출해야 합니다.

  1. Item Lists 노드:

    • SearXNG Search 노드에서 받은 JSON 데이터는 보통 results 배열 안에 실제 검색 결과가 있습니다.
    • Item Lists 노드를 추가하고 Field to Split Out을 data.results로 설정하여 각 검색 결과를 개별 아이템으로 분리합니다.
  2. Set 노드 (데이터 추출):

    • 각 아이템에서 title, url, content (요약) 등을 추출하여 새로운 JSON 객체로 만듭니다.
    • 예시:
      • title: {{ $json.title }}
      • url: {{ $json.url }}
      • summary: {{ $json.content }} (SearXNG 결과에 따라 필드 이름은 달라질 수 있습니다.)
      • thumbnail_url: {{ $json.thumbnail }} (썸네일이 있다면 추출)
[
  {
    "nodes": [
      // ... (previous nodes)
      {
        "parameters": {
          "fieldToSplitOut": "data.results"
        },
        "name": "Split Search Results",
        "type": "n8n-nodes-base.itemLists",
        "typeVersion": 1,
        "position": [850, 300]
      },
      {
        "parameters": {
          "values": {
            "string": [
              {
                "name": "title",
                "value": "={{ $json.title }}"
              },
              {
                "name": "source_url",
                "value": "={{ $json.url }}"
              },
              {
                "name": "post_content",
                "value": "={{ $json.content || $json.description || '내용 없음' }}"
              },
              {
                "name": "image_url",
                "value": "={{ $json.thumbnail || '' }}"
              }
            ]
          }
        },
        "name": "Extract Post Data",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [1050, 300]
      }
    ],
    "connections": {
      // ... (previous connections)
      "SearXNG Search": [
        [
          {
            "node": "Split Search Results",
            "type": "main"
          }
        ]
      ],
      "Split Search Results": [
        [
          {
            "node": "Extract Post Data",
            "type": "main"
          }
        ]
      ]
    }
  }
]

💡 핵심 실무 팁: 데이터 정제 및 필터링
SearXNG 결과는 때로 불필요하거나 중복된 정보, 혹은 너무 짧은 내용이 포함될 수 있습니다. IF 노드나 Code 노드를 활용하여 post_content의 길이가 특정 값 이하인 아이템을 필터링하거나, 중복된 source_url을 제거하는 로직을 추가하면 발행되는 글의 품질을 높일 수 있습니다. 정규식을 활용해 본문에서 특정 HTML 태그를 제거하는 것도 좋은 방법입니다.

4단계: 워드프레스 REST API를 이용한 자동 포스팅

이제 추출하고 가공한 데이터를 워드프레스에 발행할 차례입니다. n8n은 워드프레스 전용 노드를 제공합니다.

  1. WordPress 노드:
    • WordPress 노드를 추가합니다.
    • Credentials에서 워드프레스 REST API 인증 정보를 설정합니다. (Application Passwords 사용 권장)
    • Operation: Create
    • Resource: Post
    • Title: {{ $json.title }}
    • Content: {{ $json.post_content }}
    • Status: publish (또는 draft로 설정 후 수동 검토)
    • Categories, Tags: 적절한 카테고리 ID나 태그 이름을 매핑합니다.
    • Featured Image: Upload Binary Data를 선택하고, Binary Property에 image_binary를 설정합니다. (아래 썸네일 처리 단계에서 이진 데이터를 만

댓글 남기기