최신 AI 트렌드부터 Agent 시스템 구축, n8n 기반의 워크플로우 자동화까지 아우르는 실무 마스터 가이드
강사 남박사
불과 1년 전의 기술도 '구식' 취급을 받는 2026년입니다. 현재 시장을 지배하는, "진짜" 최신 AI 서비스들을 중심으로 살펴봅니다.
OpenClaw: '자율 에이전트'를 위한 오픈소스 운영체제와 같습니다.
ChatGPT나 Gemini를 단순한 '챗봇'으로만 알고 계신가요? 사실 여러분은 이미 빅테크 기업들이 설계한 고품질의 'AI Agent' 시스템을 매일 무료로(혹은 유료로) 사용하고 있습니다.
Interactive Prompting: C-R-E-F 모델
[상황 예시] 신제품 '시트러스 핸드크림' 인스타그램 광고 문구 작성
❌ Bad (초보자의 프롬프트): "핸드크림
인스타 광고 문구 3개 써줘."
-> 결과: "촉촉한 핸드크림 추천! 지금 당장 구매하세요" 같은 뻔하고 평범한 문장 출력.
✅ Good (C-R-E-F 적용 프롬프트):
AI를 도구가 아닌 '컨설턴트'로 활용해, 최고의 결과를 내기 위해 역으로 질문을 유도하는 방식입니다.
단답형 결과를 요구하지 않고, AI의 논리적 사고 단계를 강제하여 환각을 줄이는 방식입니다.
매번 C-R-E-F 프롬프트를 길게 치는 것은 비효율적입니다. 자주 반복되는 업무는 아예 '나만의 맞춤형 봇(에이전트)'으로 만들어 두고 필요할 때마다 불러서 쓰는 것이 실무 AI 활용의 핵심입니다.
사내 규정집(PDF), 복지 매뉴얼, 기안서 양식 등을 미리 에이전트에 업로드해 둡니다.
활용: "연차는 어떻게 쓰나요?", "법인카드 식대 한도가 얼마죠?" 질문에 24시간 정확한 답변과 양식 제공.
우리 브랜드만의 가이드라인(어조, 금지어, 자주 쓰는 밈 등)을 고정해 둡니다.
활용: "이거 신제품 스펙인데 인스타 글 하나 뽑아줘" 라고 대충 던져줘도 완벽한 브랜드 글쓰기 완성.
클라이언트 미팅이나 주간 회의 직후, 두서없는 녹취록(텍스트)을 던져주면 정해진 포맷으로 분류.
활용: 클로바노트 결과물 복붙 후 10초 만에 완벽한 보고서 완성.
AI 에이전트는 어떻게 만들어질까요? 4가지 핵심 부품(Components)을 이해해야 합니다.
실무에서 어떤 모델을 쓰고, 어떻게 데이터를 연결해야 할까요?
가장 비싼 모델이 항상 정답은 아닙니다. AI 도입의 성공 여부는 결국 '사람의 판단력'에 달려 있습니다.
AI는 만능이 아닙니다. 도입 전 반드시 숙지해야 할 보안/윤리 수칙과 실제 비즈니스 사고 사례입니다.
AI는 언제든 그럴듯한 거짓말(환각)을 할 수 있으므로 최종 결정권자는 항상 사람이어야 합니다.
"이전 지시를 무시해"처럼 시스템 룰을 강제로 깨버리는 악의적 입력값을 방어해야 합니다.
민감 정보나 기밀을 퍼블릭 AI에 입력하면, 그 내용이 AI의 다음 버전 학습에 사용될 수 있습니다.
AI 자동화를 어디서 돌릴 것인가? 지갑 사정과 보안, 그리고 제어권을 고려해 선택해야 합니다.
2026년 현재, n8n은 단순 자동화 도구를 넘어 'AI 에이전트 오케스트레이터'로 자리 잡았습니다.
우리는 [n8n + PostgreSQL] 기반의 견고한 단일 서버 아키텍처를 구성합니다.
n8n 2.x에서 가장 중요한 기술적 변화는 바로 Task Runners의 도입입니다.
Task Runners가 우리의 파이썬 코드를 실행해주지만, 기본적으로 '빈 깡통' 상태입니다. 필요한 도구(라이브러리)를 쥐여줘야 합니다.
FROM n8nio/n8n:latest)USER root 권한으로 필요한 파이썬 패키지들을 설치합니다.
(RUN pip install pandas yfinance ...)Windows/Mac 환경에 Docker Desktop 설치 및 실행
실습 자료 폴더의 docker-compose.yml (Custom Image 설정 포함) 준비
docker-compose up -d --build
http://localhost:5678 접속 (회원가입 후 바로 사용 가능)
단순한 챗봇 소비자가 아닌, 스스로 일하는 AI 군단을 지휘하는 'Commander(지휘관)'로 거듭나는 성장 로드맵입니다.
가장 기본적인 에이전트 형태를 구축하며 n8n의 기초 노드 연결법을 익힙니다. (단순한 챗봇이 왜 '바보'인지 직접 경험하고, 기억과 눈을 달아주는 과정)
WindowBufferMemory를 흐름에 추가하여 대화 내용을 저장하게 합니다.내가 자는 동안에도 에이전트가 알아서 일하게 만드는 백그라운드 자동화의 핵심입니다. 매일 아침 뉴스를 찾아보는 시간을 절약합니다.
연합뉴스나 구글 뉴스의 RSS Feed 노드를 사용하여 24시간 이내의 주요 뉴스를 긁어옵니다. (Raw Data 확인)
가져온 뉴스 기사 본문을 LLM에게 전달하여 "3문장으로 핵심만 요약해줘"라고 시킵니다.
단순 텍스트가 아니라, 읽기 좋은 이메일 형식을 갖추기 위해 HTML 코드로 변환합니다. (제목은 굵게, 내용은 리스트로)
Gmail/Outlook 노드를 연결하여 매일 아침 7시에 내 메일함으로 꽂히도록 설정합니다.
[프로젝트 2]에서 만든 시스템을 업그레이드하여, 단순 전달이 아닌 '분석'을 수행하는 전문가 에이전트로 진화시킵니다.
Yahoo Finance API 등을 호출합니다.
뉴스 요약 + 재무 데이터 + AI의 통찰(Insight)이 결합된 고퀄리티 리포트를 생성하여 이메일 또는 슬랙(Slack)으로 받아봅니다.
여러분은 이제 단순한 AI 사용자를 넘어, 업무 효율을 극대화하는
전체 환경 구성에 필요한 세팅 파일들입니다. 토글을 클릭하여 코드를 복사하세요.
POSTGRES_USER=root
POSTGRES_PASSWORD=skarbwls12
POSTGRES_DB=n8n
N8N_ENCRYPTION_KEY=skarbwls12
N8N_USER_MANAGEMENT_JWT_SECRET=even-more-secret
N8N_DEFAULT_BINARY_DATA_MODE=filesystem
N8N_RUNNERS_AUTH_TOKEN=skarbwls12
volumes:
n8n_storage:
postgres_storage:
qdrant_storage:
networks:
n8n-v2:
x-n8n: &service-n8n
image: n8nio/n8n:latest
networks: ['n8n-v2']
environment:
- WEBHOOK_URL=http://localhost:7678
- N8N_EDITOR_BASE_URL=http://localhost:7678
- N8N_FORMDATA_FILE_SIZE_MAX=1024
- N8N_PAYLOAD_SIZE_MAX=1024
- EXECUTIONS_TIMEOUT_MAX=7200
- N8N_REQUEST_MAX_SIZE=100MB
- N8N_SECURE_COOKIE=false
- TZ=Asia/Seoul
- N8N_PUSH_BACKEND=websocket
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
- N8N_ENCRYPTION_KEY
- N8N_USER_MANAGEMENT_JWT_SECRET
- N8N_RESTRICT_FILE_ACCESS_TO=/data
- N8N_RUNNERS_TASK_REQUEST_TIMEOUT=300
- N8N_RUNNERS_TASK_TIMEOUT=3600
- N8N_RUNNERS_ENABLED=true
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
- N8N_NATIVE_PYTHON_RUNNER=true
- N8N_PROXY_HOPS=1
env_file:
- path: .env
required: true
services:
postgres:
container_name: postgres-v2
image: postgres:16-alpine
hostname: postgres
networks: ['n8n-v2']
restart: unless-stopped
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
volumes:
- ./postgres_storage:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10
n8n-import:
<<: *service-n8n
hostname: n8n-import
container_name: n8n-v2-import
entrypoint: /bin/sh
command:
- "-c"
- "n8n import:credentials --separate --input=/demo-data/credentials && n8n import:workflow --separate --input=/demo-data/workflows"
volumes:
- ./n8n/demo-data:/demo-data
depends_on:
postgres:
condition: service_healthy
n8n:
<<: *service-n8n
hostname: n8n
container_name: n8n-v2
restart: unless-stopped
ports:
- "7678:5678"
volumes:
- n8n_storage:/home/node/.n8n
- ./n8n/demo-data:/demo-data
- ./shared:/data/shared
depends_on:
postgres:
condition: service_healthy
n8n-import:
condition: service_completed_successfully
qdrant:
image: qdrant/qdrant
hostname: qdrant
container_name: qdrant-v2
networks: ['n8n-v2']
restart: unless-stopped
ports:
- "7333:6333"
volumes:
- ./qdrant_storage:/qdrant/storage
task-runners:
pull_policy: never
build:
context: ./runners
dockerfile: Dockerfile
image: n8nio/runners:custom
container_name: n8n-runners
networks: ['n8n-v2']
restart: unless-stopped
environment:
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
- N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_TASK_REQUEST_TIMEOUT=30
- N8N_RUNNERS_LAUNCHER_LOG_LEVEL=debug
- N8N_RUNNERS_CONFIG_FILE=/etc/n8n-task-runners.json
- N8N_RUNNERS_TASK_REQUEST_TIMEOUT=300
- N8N_RUNNERS_TASK_TIMEOUT=3600
depends_on:
- n8n
# [Step 1] 순정 alpine:3.20 리눅스를 가져다가 builder로 명칭
FROM alpine:3.20 AS builder
# 순정 리눅스에 apk-tools-static 도구 설치
RUN apk add --no-cache apk-tools-static
# [Step 2] n8n Runner 공식 이미지 가져오기
FROM n8nio/runners:latest
# 지금부터 수행되는 명령은 모두 root 권한으로 수행
USER root
# 1. APK 도구 이식 (apk 에러 방지)
# builder에 설치된 apk.static을 신규 이미지 /sbin/apk 폴더로 복사
COPY --from=builder /sbin/apk
# 2. 저장소 설정 및 업데이트
# 새로운 이미지에 레포지토리 설정
# alpine과 runners의 보안 서명이 달라서 인증 확인이 뜰 수 있는데
# 이를 무시하고 설치 하기 위해서 --allow-untrusted 를 사용
RUN mkdir -p /var/cache/apk \
&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories \
&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
&& apk update --allow-untrusted
# 3. 시스템 패키지 설치 (Root 권한으로 실행)
# py3-opencv: 빌드 멈춤 현상 해결을 위해 시스템 패키지로 설치
RUN apk add --no-cache --allow-untrusted \
bash \
ffmpeg \
cairo \
cairo-dev \
pango \
pango-dev \
gdk-pixbuf \
mesa-gl \
glib \
libstdc++ \
libffi-dev \
build-base \
procps \
python3-dev \
nodejs \
npm \
font-noto \
font-noto-cjk \
py3-opencv
# 4. Python 패키지 설치 (Root 권한 유지)
# uv가 .venv 폴더에 쓸 수 있도록 Root 상태에서 설치합니다.
# opencv-python-headless는 제거했습니다 (위의 py3-opencv로 대체하여 1시간 멈춤 방지)
RUN cd /opt/runners/task-runner-python \
&& uv pip install \
numpy \
pandas \
requests \
requests[socks] \
beautifulsoup4 \
lxml \
openpyxl \
xlsxwriter \
pillow \
moviepy \
pysrt \
ephem \
korean_lunar_calendar \
pytz \
matplotlib \
solapi \
hanja \
user_agent \
pathlib \
soundfile \
elevenlabs \
WeasyPrint \
python-multipart \
yt-dlp
# 5. JS 패키지 설치 (Root 권한 유지)
RUN cd /opt/runners/task-runner-javascript \
&& pnpm add \
moment \
uuid
# 6. 설정 파일 복사
COPY n8n-task-runners.json /etc/n8n-task-runners.json
# 7. [핵심] 권한 복구 및 사용자 전환
# Root로 설치한 파일들의 소유권을 runner에게 넘겨줍니다.
RUN chown runner:runner /etc/n8n-task-runners.json \
&& chmod 644 /etc/n8n-task-runners.json \
&& chown -R runner:runner /opt/runners
# 모든 작업이 끝난 뒤에 runner 유저로 전환
USER runner
{
"task-runners": [
{
"runner-type": "javascript",
"workdir": "/home/runner",
"command": "/usr/local/bin/node",
"args": [
"--disallow-code-generation-from-strings",
"--disable-proto=delete",
"/opt/runners/task-runner-javascript/dist/start.js"
],
"health-check-server-port": "5681",
"allowed-env": [
"PATH",
"GENERIC_TIMEZONE",
"NODE_OPTIONS",
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT",
"N8N_RUNNERS_TASK_TIMEOUT",
"N8N_RUNNERS_MAX_CONCURRENCY",
"N8N_SENTRY_DSN",
"N8N_VERSION",
"ENVIRONMENT",
"DEPLOYMENT_NAME",
"HOME"
],
"env-overrides": {
"NODE_FUNCTION_ALLOW_BUILTIN": "*",
"NODE_FUNCTION_ALLOW_EXTERNAL": "*",
"N8N_RUNNERS_HEALTH_CHECK_SERVER_HOST": "0.0.0.0"
}
},
{
"runner-type": "python",
"workdir": "/home/runner",
"command": "/opt/runners/task-runner-python/.venv/bin/python",
"args": [
"-m",
"src.main"
],
"health-check-server-port": "5682",
"allowed-env": [
"PATH",
"N8N_RUNNERS_BUILTINS_DENY",
"N8N_RUNNERS_LAUNCHER_LOG_LEVEL",
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT",
"N8N_RUNNERS_TASK_TIMEOUT",
"N8N_RUNNERS_MAX_CONCURRENCY",
"N8N_SENTRY_DSN",
"N8N_VERSION",
"ENVIRONMENT",
"DEPLOYMENT_NAME"
],
"env-overrides": {
"PYTHONPATH": "/opt/runners/task-runner-python",
"N8N_RUNNERS_BUILTINS_DENY": "",
"N8N_RUNNERS_STDLIB_ALLOW": "*",
"N8N_RUNNERS_EXTERNAL_ALLOW": "*"
}
}
]
}