n8n Webhook 테스트, curl로 요청 보내고 응답 받아보기

n8n을 로컬에 설치한 뒤, 바로 복잡한 자동화를 만들기보다는
가장 기본적인 흐름부터 테스트해보기로 했다.

이번에 해본 건 Webhook 테스트다.

n8n에서 Webhook 노드를 만들고,
터미널에서 curl로 요청을 보낸 뒤,
그 요청 데이터를 가공해서 다시 응답으로 받아보는 흐름이다.


테스트 목표

이번 테스트의 목표는 단순했다.

외부에서 HTTP 요청을 보낸다

n8n Webhook 노드가 요청을 받는다

Code 노드에서 데이터를 가공한다

Respond to Webhook 노드가 결과를 응답한다
 

최종적으로 만들고 싶은 구조는 아래와 같다.

Webhook → Code → Respond to Webhook
 

개발 코드로 보면 간단한 API 엔드포인트 하나를 만드는 것과 비슷하다.

예를 들어 Express로 작성하면 이런 느낌이다.

app.post("/blog-topic", (req, res) => {
const body = req.body;

const result = {
  title: `${body.keyword} 로컬 설치 후 테스트해본 후기`,
  category: body.category,
  level: body.level,
  description: `${body.keyword}을 처음 설치한 뒤 어떤 자동화를 테스트해보면 좋을지 정리해봤다.`
};

res.json(result);
});
 

이걸 n8n에서는 노드 기반으로 만들어보는 것이다.


Webhook 노드 만들기

먼저 n8n에서 새 워크플로우를 만들었다.

그리고 첫 번째 노드로 Webhook을 추가했다.

Webhook 노드 설정은 아래처럼 했다.

HTTP Method: POST
Path: blog-topic
Response Mode: Using Respond to Webhook Node
 

여기서 중요한 부분은 Response Mode다.

처음에는 이 설정을 제대로 보지 않고 진행했는데,
나중에 curl 응답이 원하는 형태로 나오지 않아서 다시 확인하게 됐다.

n8n에서 Webhook 결과를 바로 응답으로 받고 싶다면,
Webhook 노드의 응답 방식을 Respond to Webhook 노드와 연결해줘야 한다.


Code 노드 추가하기

Webhook 노드 다음에는 Code 노드를 추가했다.

처음에는 Python으로 해보려고 했다.

그런데 Docker로 띄운 n8n 환경에서는 아래와 같은 에러가 나왔다.

Python runner unavailable: Python 3 is missing from this system
 

n8n 화면에서 Python 옵션이 보이더라도,
실제 컨테이너 안에 Python 실행 환경이 없으면 사용할 수 없었다.

물론 Docker 이미지를 커스텀해서 Python을 설치할 수도 있겠지만,
이번 테스트 목적은 n8n의 기본 흐름을 확인하는 것이었다.

그래서 Code 노드는 JavaScript로 진행했다.

Code 노드에는 아래 코드를 넣었다.

 

const data = $json;
const body = data.body ?? data;

const keyword = body.keyword || "n8n";
const category = body.category || "automation";
const level = body.level || "beginner";

return [
  {
   json: {
   title: `${keyword} 로컬 설치 후 테스트해본 후기`,
   category,
   level,
   description: `${keyword}을 처음 설치한 뒤 어떤 자동화를 테스트해보면 좋을지 정리해봤다.`
   }
 }
];
 

이 코드는 Webhook으로 받은 요청 데이터에서
keyword, category, level 값을 꺼내고,
그 값을 이용해서 간단한 블로그 제목과 설명을 만들어준다.

여기서 사용한 $json은 이전 노드에서 넘어온 데이터를 의미한다.

Webhook으로 요청을 받으면 보통 데이터가 아래처럼 들어온다.

{
  "headers": {},
  "params": {},
  "query": {},
  "body": {
  "keyword": "n8n",
  "category": "automation",
  "level": "beginner"
  }
}

그래서 실제 요청 본문은 $json.body에서 꺼낼 수 있다.

다만 상황에 따라 데이터가 바로 $json에 들어올 수도 있어서
아래처럼 처리했다.

 
const body = data.body ?? data;
 

data.body가 있으면 그 값을 사용하고,
없으면 data 자체를 사용하도록 한 것이다.


Respond to Webhook 노드 추가하기

Code 노드 다음에는 Respond to Webhook 노드를 추가했다.

최종 구조는 아래처럼 되어야 한다.

Webhook → Code → Respond to Webhook
 

처음에는 Webhook과 Respond to Webhook만 연결해두고 테스트했는데,
그렇게 하면 Code 노드에서 만든 결과를 응답으로 받을 수 없다.

중간에 Code 노드가 있어야
요청 데이터를 가공하고, 그 결과를 응답으로 넘길 수 있다.

Respond to Webhook 노드에서는 Code 노드에서 넘어온 JSON을 그대로 응답하도록 설정했다.

Respond With: JSON
Response Body: First Incoming Item
 

버전에 따라 표현이 조금 다를 수 있지만,
핵심은 이전 노드에서 넘어온 JSON을 그대로 응답하는 것이다.


curl로 요청 보내기

이제 터미널에서 curl로 요청을 보내면 된다.

테스트할 때는 n8n Webhook 노드에서 Listen for test event를 먼저 눌러야 한다.

그 다음 터미널에서 아래 명령어를 실행한다.

 
curl -X POST http://localhost:5678/webhook-test/blog-topic -H "Content-Type: application/json" -d '{"keyword":"n8n","category":"automation","level":"beginner"}'
 

여기서 주소를 보면 /webhook-test/가 들어간다.

n8n에서 테스트 실행 중일 때는 webhook-test 주소를 사용한다.

http://localhost:5678/webhook-test/blog-topic
 

워크플로우를 Active 상태로 켜고 실제로 사용할 때는 보통 아래 주소를 사용한다.

http://localhost:5678/webhook/blog-topic
 

처음 테스트할 때는 webhook-test로 진행하면 된다.


 

Workflow was started만 나왔던 이유

테스트 중에 아래 응답이 나온 적도 있었다.

 
{
"message": "Workflow was started"
}
 

처음에는 워크플로우가 정상적으로 실행된 줄 알았다.

하지만 내가 원했던 것은 Code 노드에서 만든 JSON 응답이었다.

이 메시지는 요청은 받았지만,
뒤에 있는 노드의 결과를 기다려서 응답하지 않았다는 의미에 가깝다.

즉, Webhook 노드가 요청을 받고 바로 응답해버린 것이다.

이 문제를 해결하려면 Webhook 노드의 응답 방식을 바꿔야 한다.

Response Mode: Using Respond to Webhook Node
 

그리고 워크플로우 안에 실제로 Respond to Webhook 노드가 있어야 한다.

만약 이 설정만 바꾸고 Respond to Webhook 노드를 추가하지 않으면
아래와 같은 에러가 날 수 있다.

No Respond to Webhook node found in the workflow
 

이 경우에는 말 그대로 워크플로우 안에 Respond to Webhook 노드가 없다는 뜻이다.


최종 테스트 결과

최종적으로 아래 구조로 연결했다.

Webhook → Code → Respond to Webhook
 

그리고 curl 요청을 다시 보냈다.

curl -X POST http://localhost:5678/webhook-test/blog-topic -H "Content-Type: application/json" -d '{"keyword":"n8n","category":"automation","level":"beginner"}'
 
 

정상적으로 연결되면 아래와 같은 응답을 받을 수 있다.

{
  "title": "n8n 로컬 설치 후 테스트해본 후기",
  "category": "automation",
  "level": "beginner",
  "description": "n8n을 처음 설치한 뒤 어떤 자동화를 테스트해보면 좋을지 정리해봤다."
}
 

이 결과를 보고 나서야 흐름이 제대로 이해됐다.

n8n에서 Webhook 테스트를 할 때 중요한 건 단순히 Webhook 노드를 만드는 것이 아니었다.

Webhook으로 요청을 받고
Code에서 데이터를 가공하고
Respond to Webhook으로 응답을 반환한다
 

이 전체 흐름이 맞아야 원하는 결과를 받을 수 있었다.


마무리

n8n을 로컬에 설치한 뒤 Webhook 테스트를 해봤다.

처음에는 Webhook 노드 하나만 만들면 바로 응답을 받을 수 있을 줄 알았는데,
실제로는 응답 모드와 노드 연결 구조를 제대로 이해해야 했다.

특히 아래 세 가지를 기억하면 좋을 것 같다.

테스트 중에는 /webhook-test/ 주소를 사용한다
Code 결과를 응답하려면 Respond to Webhook 노드가 필요하다
Webhook 노드의 Response Mode를 Using Respond to Webhook Node로 설정해야 한다
 

작은 테스트였지만, n8n의 기본 구조를 이해하는 데는 충분했다.

다음에는 이 흐름을 조금 더 확장해서
블로그 키워드를 입력하면 제목 후보를 여러 개 생성하거나,
외부 API를 호출해서 결과를 가공하는 자동화도 만들어볼 수 있을 것 같다.

작업 기록과 샘플 코드는 GitHub에도 정리해두고 있어요.

GitHub 팔로우

Continue Reading

이전 글 / 다음 글