4장. 첫 번째 워크플로우 만들기
4장. 첫 번째 워크플로우 만들기
ComfyUI는 설명을 오래 듣는 것보다, 한 번 끝까지 만들어 보는 편이 훨씬 빨리 익는다. 캔버스가 낯설고 선이 복잡해 보여도 괜찮다. 첫 워크플로우는 거대한 시스템을 배우는 시간이 아니라, 입력 → 생성 → 저장이라는 가장 기본적인 리듬을 몸에 익히는 시간이다.
이번에는 가장 단순하면서도 중요한 완성형 그래프를 직접 손으로 조립해 본다. 목표는 거창하지 않다. 프롬프트를 넣고, 모델을 고르고, KSampler를 통과시켜, 결과 이미지를 저장하는 것. 여기까지 한 번 제대로 해보면 이후의 Img2Img, Inpaint, FLUX, 비디오 워크플로우도 훨씬 덜 무섭게 보이기 시작한다.

4.1 캔버스 기본 조작과 Nodes 2.0 인터페이스
처음 ComfyUI를 열면 가장 먼저 익혀야 할 것은 노드 이름이 아니라 화면 감각이다. 캔버스는 도화지이면서 동시에 배관도다. 왼쪽에서 오른쪽으로 데이터가 흐른다고 생각하면 훨씬 편하다.
보통 시작은 기본 워크플로우를 불러오는 것부터다. 최근 ComfyUI에서는 워크플로우 패널에서 예제 템플릿을 열 수 있고, PNG 이미지에 들어 있는 워크플로우 메타데이터나 JSON 파일을 다시 불러오는 방식도 지원한다.1 즉, 텅 빈 캔버스에서 시작할 수도 있지만, 이미 만들어진 예제를 열어 구조를 읽는 것도 아주 좋은 학습법이다.
처음 익혀야 할 조작은 몇 가지뿐이다.
캔버스 이동: 빈 공간을 드래그해서 시야를 옮긴다.
확대/축소: 마우스 휠로 줌 인·아웃한다.
노드 추가: 캔버스를 더블클릭한 뒤 노드 이름을 검색한다.5
연결하기: 한 노드의 출력 단자를 잡아 다른 노드의 입력 단자로 끌어 놓는다.
실행하기:
Ctrl + Enter로 현재 그래프를 큐에 넣는다.5
여기서 중요한 감각이 하나 있다. ComfyUI는 메뉴를 외우는 도구가 아니라 검색해서 조립하는 도구다. 노드 이름을 정확히 몰라도 된다. checkpoint, text encode, ksampler, vae, save 정도만 검색해도 첫 그래프는 충분히 만들 수 있다.
작업 속도를 올려 주는 단축키도 초반부터 손에 익히면 좋다. Ctrl + S는 저장, Ctrl + O는 불러오기, Ctrl + B는 우회(Bypass), Ctrl + M은 음소거(Mute), Ctrl + D는 기본 그래프 불러오기다.5 전부 다 외울 필요는 없지만, Ctrl + Enter와 Ctrl + S 둘만 익혀도 체감이 크다.
초보자는 종종 캔버스를 "복잡한 인터페이스"로 본다. 하지만 조금만 익숙해지면 생각이 바뀐다. 캔버스는 사실 UI가 아니라 과정을 눈으로 보게 해 주는 지도다. 한 번 길이 보이면, 오히려 버튼이 숨겨진 전통적인 툴보다 덜 답답하다.
4.2 가장 기본적인 Text-to-Image 그래프 분해 분석
가장 기본적인 Text-to-Image 워크플로우는 생각보다 짧다. 정말 핵심만 남기면 다음 여섯 덩어리로 끝난다.1
Load Checkpoint
├─ MODEL ─────────────┐
├─ CLIP ──> Positive ─┤
├─ CLIP ──> Negative ─┤
└─ VAE ───────────────┐
│
Empty Latent Image ─> KSampler ─> VAE Decode ─> Save Image이 그래프를 사람 말로 바꾸면 이렇다.
먼저 Load Checkpoint가 생성에 필요한 기본 모델 세트를 불러온다. 그다음 CLIP Text Encode 두 개가 각각 긍정 프롬프트와 부정 프롬프트를 읽는다. Empty Latent Image는 아직 아무것도 그려지지 않은 빈 생성 공간을 만든다. KSampler는 이 모든 입력을 받아 실제 생성 과정을 수행한다. 그리고 VAE Decode가 결과를 사람이 보는 이미지로 바꾼 뒤 Save Image가 저장한다.
처음에는 아래 순서대로 그대로 따라 하면 된다.
1단계: 모델 불러오기
Load Checkpoint 노드를 추가하고, 설치한 체크포인트를 선택한다. 만약 드롭다운이 비어 있거나 null처럼 보이면 모델이 올바른 폴더에 없거나 새로고침이 안 된 경우가 많다. 이때는 모델 경로를 확인하고, 다시 불러오거나 재시작하면 해결되는 경우가 많다.1
2단계: 긍정 프롬프트 만들기
CLIP Text Encode 노드를 추가한 뒤, Load Checkpoint의 CLIP 출력을 연결한다. 여기에 만들고 싶은 장면을 쓴다.
예를 들면 이렇게 시작해 볼 수 있다.
a cinematic photo of a small cafe on a rainy evening, warm window light, detailed street reflections, realistic
처음부터 시집처럼 쓸 필요는 없다. 장면, 조명, 질감 정도만 또렷하게 적어도 충분하다.
3단계: 부정 프롬프트 만들기
같은 CLIP Text Encode 노드를 하나 더 만들어 부정 프롬프트용으로 쓴다. 여기에도 같은 CLIP 출력을 연결한다.
예를 들면 다음처럼 넣을 수 있다.
blurry, low quality, deformed, extra fingers, watermark, text
부정 프롬프트는 "이건 빼 달라"는 메모다. 처음에는 너무 길게 쓰지 말고, 흔한 실패 요소만 넣어도 충분하다.
4단계: 빈 캔버스 만들기
Empty Latent Image 노드에서 해상도를 정한다. 시작은 512×512나 768×768처럼 가볍게 두는 편이 좋다. 배치 크기는 1로 둔다. 첫 워크플로우에서 중요한 것은 속도보다 확실한 성공 경험이다.
5단계: 생성의 심장 연결하기
KSampler에 네 가지를 연결한다.
Load Checkpoint의MODEL→KSampler의model긍정 프롬프트 출력 →
KSampler의positive부정 프롬프트 출력 →
KSampler의negativeEmpty Latent Image출력 →KSampler의latent_image
여기까지 연결되면, 그래프는 이미 거의 완성된 것이다.
6단계: 사람이 보는 이미지로 바꾸기
VAE Decode 노드를 추가한 뒤 두 줄을 연결한다.
KSampler의 출력 →VAE Decode의samplesLoad Checkpoint의VAE→VAE Decode의vae
그다음 Save Image 노드를 추가하고, VAE Decode의 이미지 출력을 Save Image에 연결한다.
이제 Ctrl + Enter를 누르면 첫 이미지가 생성된다.5
처음 생성이 끝나는 순간이 중요하다. 여기서 "아, ComfyUI는 결국 연결이구나"라는 감이 온다. 노드 수가 많아 보였을 뿐, 실제 핵심 흐름은 놀랄 만큼 단순하다.
4.3 KSampler 파라미터 — Steps, CFG, Sampler, Scheduler 실전 가이드
첫 워크플로우에서 가장 자주 만지게 되는 노드는 단연 KSampler다. 공식 문서 기준으로 이 노드는 모델, 프롬프트 조건, 라텐트 이미지를 받아 다단계 디노이징을 수행한다.2 쉽게 말하면, 이 노드가 실제로 그림을 그린다.
처음에는 KSampler가 무섭게 보이지만, 사실 초보자가 당장 이해해야 할 값은 네 가지면 충분하다. steps, cfg, sampler_name, scheduler다. denoise는 지금처럼 순수 Text-to-Image에서는 보통 1.0으로 두면 된다.2
아래 표는 초반에 가장 실용적인 감각을 잡기 위한 출발점이다.
| 항목 | 초보자 시작값 | 무엇을 바꾸는가 | 너무 낮으면 | 너무 높거나 과하면 |
|---|---|---|---|---|
| Steps | 24~30 | 다듬는 횟수 | 덜 익은 그림처럼 보일 수 있음 | 시간만 늘고 이득은 적어짐 |
| CFG | 6.5~8 | 프롬프트를 얼마나 강하게 따를지 | 프롬프트를 잘 안 듣는 느낌 | 부자연스럽고 과한 결과가 나올 수 있음 |
| Sampler | DPM++ 2M 또는 Euler 계열 | 디노이징 방식 | 모델 특성이 덜 살아날 수 있음 | 절대적 우열은 없음 |
| Scheduler | karras | 스텝 배분 방식 | 디테일이 밋밋할 수 있음 | 특별한 이유 없으면 굳이 바꿀 필요 적음 |
공식 문서와 실전 가이드 모두 steps는 보통 20~50 사이에서, cfg는 대체로 6.5~8.5 안쪽에서 시작하는 접근을 권한다.23 이 범위를 벗어난다고 반드시 실패하는 것은 아니지만, 초반에는 안정권에서 감을 잡는 편이 훨씬 낫다.
각 파라미터를 아주 쉽게 정리하면 이렇다.
Steps: 얼마나 오래 다듬을 것인가
스텝 수는 말 그대로 정제 횟수다. 너무 적으면 이미지가 덜 완성된 느낌이 나고, 너무 많으면 시간만 오래 걸리거나 오히려 결과가 탁해질 수 있다.23
첫 이미지에서는 24~30 정도가 무난하다. "더 정교하게"라는 욕심 때문에 처음부터 60, 80, 100을 넣고 싶어질 수 있는데, 대부분의 경우 그만큼의 보상은 돌아오지 않는다. GPU만 힘들다.
CFG: 프롬프트를 얼마나 고집할 것인가
CFG는 프롬프트 충실도를 조절하는 손잡이다. 낮으면 모델이 좀 더 자유롭게 해석하고, 높으면 사용자의 지시를 강하게 따른다.23
처음에는 7 전후로 두면 된다. 너무 높이면 "말은 잘 듣는데 결과가 어색한" 그림이 나오기 쉽다. 마치 감독이 배우에게 매 대사마다 과하게 지시하는 상황과 비슷하다. 움직임은 정확한데 연기가 부자연스러운 것이다.
Sampler: 어떤 방식으로 그릴 것인가
샘플러는 디노이징 알고리즘의 성격 차이다. 공식·커뮤니티 문서 모두 결과가 꽤 달라질 수 있다고 본다.23 중요한 것은 "최고의 단 하나"를 찾는 것이 아니라, 내 모델과 작업 목적에 맞는 기본값을 확보하는 것이다.
처음에는 이렇게 기억하면 충분하다.
DPM++ 2M 계열: 비교적 안정적이고 디테일이 잘 나오는 편
Euler 계열: 빠르고 감각적인 결과를 내기 쉬운 편
그 외 샘플러: 나중에 비교 실험하면서 취향을 찾으면 된다
Scheduler: 디노이징 리듬의 배분
스케줄러는 각 스텝에서 노이즈를 어떻게 분배하며 줄일지를 정한다.23 설명은 어렵지만, 초반 실전 규칙은 단순하다. 특별한 이유가 없으면 karras부터 써라. 많은 경우 안정적인 출발점이 된다.3
첫 이미지용 추천 스타팅 프리셋
아무 설정도 감이 안 오면 아래처럼 시작하면 된다.
Steps: 28
CFG: 7
Sampler: DPM++ 2M
Scheduler: karras
Denoise: 1.0
이 값은 "정답"이 아니라 출발점이다. ComfyUI 실력은 완벽한 값을 외우는 데서 생기지 않는다. 같은 프롬프트와 같은 시드를 놓고, 값 하나를 바꿔가며 결과 차이를 읽는 데서 생긴다.
4.4 Seed 컨트롤과 재현성 확보
생성을 몇 번 하다 보면 어느 순간 이런 일이 벌어진다. "방금 나온 그림 정말 좋았는데, 다시 누르니까 전혀 다른 게 나왔네?" 바로 이때 필요한 것이 seed다.
시드는 시작 노이즈를 결정하는 숫자다. 같은 모델, 같은 프롬프트, 같은 설정, 같은 시드라면 보통 같은 결과를 다시 얻을 수 있다.23 즉, 시드는 랜덤의 반대가 아니라 랜덤을 다시 호출하는 주소에 가깝다.
쉽게 말하면 시드는 복권 번호가 아니라 요리 레시피의 출발 번호표다. 좋은 결과가 나왔을 때 시드를 기록해 두면, 나중에 같은 장면을 다시 불러와 CFG나 샘플러만 바꾸며 비교할 수 있다. 이게 바로 프로덕션에서 말하는 재현성이다.
여기서 함께 봐야 할 값이 control_after_generate다. 이름은 조금 길지만 역할은 간단하다. 생성 후 시드를 어떻게 다룰지 정하는 옵션이다.3
주로 쓰는 방식은 다음 셋이다.
fixed: 계속 같은 시드 유지
increment: 한 장 생성할 때마다 시드를 1씩 증가
randomize: 매번 랜덤 시드 사용
실전에서는 용도가 분명하다.
비교 실험을 할 때는 fixed
CFG를 7에서 9로 올렸을 때 무엇이 달라지는지 보고 싶다면 시드를 고정해야 한다. 그래야 바뀐 것이 설정 때문인지, 랜덤성 때문인지 구분할 수 있다.
변주를 만들 때는 increment
같은 콘셉트에서 여러 후보를 뽑고 싶다면 increment가 좋다. 기본 구조는 비슷하게 유지하면서도 조금씩 다른 변형을 얻기 쉽다.3
아이디어 스케치를 할 때는 randomize
초반 탐색 단계라면 랜덤이 재미있다. 다만 마음에 드는 장면이 나왔을 때는 즉시 시드를 저장해 두는 습관이 필요하다. 안 그러면 멋진 결과가 "어디선가 잠깐 나타났다가 사라진 유령 이미지"가 된다.
실무 팁을 하나 더 보태면, 좋은 그림이 나오면 프롬프트보다 먼저 시드부터 적어 두는 편이 안전하다. 프롬프트는 기억나도 시드는 잊기 쉽다.
4.5 워크플로우를 PNG/JSON으로 저장·공유하기
ComfyUI의 진짜 강점은 이미지를 만드는 데만 있지 않다. 만드는 과정을 함께 저장할 수 있다는 점이 매우 크다. 이 기능 덕분에 ComfyUI는 단순 생성기가 아니라 워크플로우 도구가 된다.
워크플로우 저장 방식은 크게 두 가지다.4
하나는 JSON 파일이다. 노드 구성과 설정 정보를 직접 저장하는 방식이다. 깔끔하고 명시적이며, 팀 단위로 관리하기 좋다. 다른 하나는 PNG 이미지 안에 워크플로우 메타데이터를 함께 담는 방식이다. 즉, 결과 이미지를 저장해 두면 그 안에 그래프 정보도 같이 들어가는 셈이다.4
이 차이를 이해하면 공유 전략이 달라진다.
PNG 저장: 가장 직관적인 방식
생성된 결과 이미지를 저장하고, 나중에 그 PNG를 다시 ComfyUI에 드래그하면 당시 워크플로우를 복원할 수 있다.14 초보자에게는 이 방식이 가장 편하다. 그림과 레시피를 함께 들고 다니는 셈이기 때문이다.
다만 주의할 점이 있다. PNG 메타데이터는 일부 메신저나 압축 과정에서 손실될 수 있다.4 즉, 이미지 파일은 남았는데 워크플로우 정보는 사라질 수 있다. 친구에게 보냈더니 그림만 남고 그래프는 날아가는, 약간 허무한 상황이 벌어질 수 있다.
JSON 저장: 공유와 버전 관리에 강한 방식
Workflows 메뉴를 통해 JSON으로 내보내면, 그래프 구조를 더 직접적으로 보관할 수 있다.14 팀 작업, 버전 관리, 템플릿 재사용에는 이 방식이 더 유리하다.
단점도 있다. ComfyUI와 커스텀 노드 생태계가 빠르게 바뀌기 때문에, 오래된 JSON이 최신 환경에서 바로 작동하지 않을 수도 있다.4 그래도 프로덕션 관점에서는 JSON을 함께 보관하는 편이 훨씬 안전하다.
그래서 실제로는 이렇게 저장하는 편이 좋다.
결과물 확인용으로 PNG 저장
복원과 협업용으로 JSON도 함께 저장
중요한 작업은 모델명, 시드, 핵심 파라미터를 별도로 메모
이 습관 하나만으로 "잘 나온 결과를 다시 못 만드는 사고"를 꽤 많이 줄일 수 있다.
4.6 다른 사람의 워크플로우 불러오기와 누락 노드 해결법
ComfyUI를 배우는 가장 빠른 길 중 하나는 남이 만든 워크플로우를 열어 보는 것이다. 다만 처음엔 높은 확률로 한 번쯤 막힌다. 노드가 비어 있거나, 모델이 없거나, 빨간 박스가 뜨거나, 실행이 안 된다. 이건 초보라서가 아니라, ComfyUI 생태계가 원래 그렇게 생겼기 때문이다.
워크플로우를 불러오는 방법 자체는 간단하다. PNG를 캔버스에 드래그하거나, JSON 파일을 열면 된다.14 문제는 불러온 다음이다.
가장 흔한 문제는 세 가지다.
1) 모델이 없다
Load Checkpoint에 원하는 모델이 안 보이거나 null처럼 뜨면, 대개 모델 파일이 해당 폴더에 없거나 ComfyUI가 아직 인식하지 못한 상태다. 공식 문서도 이런 경우 설치 위치를 확인하고 새로고침 또는 재시작을 권한다.1
해결은 단순하다.
체크포인트가 올바른 폴더에 있는지 확인한다.
LoRA, VAE, 업스케일러도 각자 맞는 폴더에 있는지 본다.
ComfyUI를 새로고침하거나 재시작한다.
2) 커스텀 노드가 없다
다른 사람이 만든 워크플로우는 기본 노드만 쓰지 않는 경우가 많다. 이때는 노드 이름 옆에 누락 표시가 뜨거나, 그래프 일부가 비어 보일 수 있다. 이런 경우에는 대개 해당 커스텀 노드 팩을 설치해야 한다. 2장에서 다룬 ComfyUI Manager가 여기서 빛난다.
처음에는 겁먹지 말고 이렇게 대응하면 된다.
누락된 노드 이름을 확인한다.
Manager에서 해당 노드를 검색해 설치한다.
설치 후 ComfyUI를 재시작한다.
다시 열어서 연결이 정상인지 확인한다.
핵심은, 누락 노드는 실패가 아니라 의존성 부족이라는 점이다.
3) 연결은 됐는데 결과가 이상하다
이 경우는 가장 골치 아파 보이지만, 의외로 원인은 단순할 때가 많다. 예를 들어 모델과 VAE 조합이 맞지 않거나, 원래 작성자가 특정 커스텀 모델을 전제로 만든 그래프일 수 있다. 또는 시드가 고정돼 있어 매번 비슷한 실패 결과만 반복하는 경우도 있다.
이럴 때는 욕심내지 말고 한 번 구조를 축소해 보는 것이 좋다. 낯선 워크플로우를 받았으면 처음부터 전부 이해하려 하지 말고, 다음 질문부터 던져 보자.
입력은 텍스트만 쓰는가, 이미지도 쓰는가?
생성 핵심 노드는 결국 무엇인가? 보통 KSampler인가, 다른 샘플러인가?
출력 직전 단계는 무엇인가? VAE Decode인가, 비디오 저장 노드인가?
내가 없는 것은 모델인가, 노드인가, 둘 다인가?
이렇게 보면 복잡한 그래프도 훨씬 덜 위협적이다. 거대한 워크플로우도 결국은 기본 Text-to-Image 그래프 위에 제어 장치가 여러 개 얹힌 것뿐이다.
마지막으로 가장 중요한 조언을 하나 남기자. 처음에는 남의 워크플로우를 해석하는 것보다, 내 첫 기본 그래프를 저장해 두고 그것을 복제해서 키워 가는 편이 훨씬 빠르다. 기본 그래프가 몸에 들어오면, 복잡한 그래프를 봐도 길을 잃지 않는다.
첫 완성형 워크플로우 체크리스트
마무리로, 첫 생성이 잘 되는지 빠르게 점검할 수 있는 최소 체크리스트를 남긴다.
체크포인트가 정상적으로 선택되어 있다.
긍정 프롬프트와 부정 프롬프트가 각각 연결되어 있다.
Empty Latent Image해상도가 무리하지 않는 값이다.KSampler가model,positive,negative,latent_image를 모두 받고 있다.VAE Decode가 샘플과 VAE를 모두 받고 있다.Save Image까지 연결되어 있다.시드와 설정을 저장할 준비가 되어 있다.
이 체크리스트만 통과하면, 이미 ComfyUI의 가장 중요한 관문 하나를 넘은 것이다. 이제부터는 "그림이 나오느냐"가 아니라 "원하는 방식으로 반복해서 나오게 하느냐"가 다음 과제가 된다. 그리고 그 순간부터 ComfyUI는 장난감이 아니라 도구가 된다.
참고
1Getting Started with AI Image Generation
2Ksampler - ComfyUI Built-in Node Documentation
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.