Skip to main content

8장. 컨트롤넷과 컴포지션 제어

이미지 생성에서 실력이 늘었다는 건 프롬프트를 더 화려하게 쓰는 일이 아니다. 원하는 구도, 원하는 인물, 원하는 스타일을 반복해서 다시 만들 수 있게 되는 일이다. 이 장에서 다루는 ControlNet, IP-Adapter, Regional Prompting, LoRA 스택은 바로 그 지점에서 빛난다. 프롬프트가 무엇을 그릴지 말한다면, 이 도구들은 어디에, 어떤 모습으로, 얼마나 일관되게 그릴지를 맡는다. 우연히 한 장 잘 뽑는 단계에서, 의도한 결과를 생산하는 단계로 넘어가는 문턱이 바로 여기다.1

PART 3 / 8장. 컨트롤넷과 컴포지션 제어

8.1 ControlNet 기본 — Canny, Depth, OpenPose

ControlNet은 참조 이미지를 구조화된 힌트로 바꿔 확산 모델에 주입하는 장치다. 쉽게 말해, "이 포즈를 따라", "이 깊이감을 유지해", "이 윤곽을 지켜"라고 모델에게 따로 메모를 붙여 주는 셈이다. ComfyUI에서의 기본 흐름도 명확하다. Load Image로 참조를 불러오고, 전처리기에서 엣지·깊이·포즈 같은 특징을 뽑은 뒤, Load ControlNet과 Apply ControlNet을 거쳐 그 조건을 샘플러에 연결한다. 코어 노드만으로 가능한 경우도 있지만, 실무에서는 다양한 전처리기를 쓰기 위해 Auxiliary Preprocessors 계열 노드를 함께 설치하는 경우가 많다.12

처음에는 ControlNet을 "그림을 베끼는 도구"로 오해하기 쉽다. 하지만 실제로는 픽셀을 복사하는 것이 아니라 구조를 전달한다. 그래서 같은 포즈를 유지하면서도 의상, 배경, 렌즈 느낌, 색조는 프롬프트와 베이스 모델에 따라 충분히 달라질 수 있다. 이 차이를 이해하면 ControlNet은 제약이 아니라 자유를 지탱하는 골조가 된다.

제어 방식무엇을 잡아 주는가특히 잘 맞는 장면흔한 실수
Canny강한 윤곽선과 형태상품 사진, 건축, 로고 주변 레이아웃, 강한 실루엣강도를 너무 높여 결과가 딱딱하고 "따라 그린" 느낌이 남
Depth앞뒤 거리와 입체감실내, 풍경, 제품 배치, 카메라 원근 유지깊이 맵 품질이 낮아 물체 경계가 뭉개짐
OpenPose인체 골격과 포즈패션, 액션 장면, 댄스, 여러 인물이 있는 구도손·얼굴 디테일을 과신해 어색한 관절이 남

Canny는 선에 민감하다. 제품 촬영이나 건물 외곽처럼 구조가 분명한 피사체에 강하다. 참조 사진의 구도를 유지하면서 전혀 다른 재질감으로 바꾸고 싶을 때 특히 유용하다. 반면 선 정보가 너무 많이 들어가면 모델이 숨을 못 쉰다. 결과가 예쁘긴 한데 묘하게 경직돼 보인다면 대개 Canny를 너무 꽉 잡은 것이다.

Depth는 공간을 붙잡는다. 사람과 배경이 얼마나 떨어져 있는지, 전경과 후경이 어떻게 겹치는지, 사물이 어느 정도 돌출돼 보이는지를 유지하기 좋다. 그래서 인테리어 시안, 상품을 포함한 라이프스타일 컷, 넓은 풍경처럼 2D보다 3D 감각이 중요한 작업에 잘 맞는다. 좋은 Depth 워크플로우는 정답을 강요하기보다 장면의 뼈대를 잡아 준다.

OpenPose는 몸의 문법을 유지한다. 팔이 어디로 뻗는지, 다리가 어떤 축으로 서는지, 상반신이 얼마나 비틀어졌는지를 정리해 준다. 패션 룩북, 캐릭터 시트, 웹툰 포즈 가이드, 군무 장면처럼 포즈가 곧 콘텐츠 품질인 작업에서 거의 필수다. 다만 포즈가 맞는다고 손이 자동으로 예뻐지는 것은 아니다. 손과 얼굴은 별도 보정, 추가 생성, 혹은 후반 편집을 염두에 두는 편이 안전하다.

실무에서 가장 많이 건드리게 되는 값은 strength, start_percent, end_percent다.1

  • strength는 ControlNet의 목소리 크기다. 0.5 전후는 균형형, 0.7~0.8은 강한 고정, 0.9 이상은 품질과 유연성을 깎아 먹을 수 있는 강압형이라고 생각하면 된다.

  • start_percent는 언제부터 개입할지 정한다. 초반부터 잡으면 구조가 잘 고정되고, 늦게 시작하면 프롬프트 자율성이 조금 더 살아난다.

  • end_percent는 언제까지 붙잡을지 정한다. 너무 끝까지 잡으면 결과가 뻣뻣해지고, 너무 일찍 놓으면 후반에 형태가 흐트러질 수 있다.

좋은 출발점은 의외로 소박하다. Canny는 0.5~0.6, Depth는 0.5~0.7, OpenPose는 0.6~0.8 정도에서 시작해 보고, 결과가 말을 안 들으면 조금씩 올린다. 반대로 지나치게 말 잘 들으면 조금 낮춘다. AI 이미지 생성에서 가장 위험한 순간은 "잘 통제된다"는 이유로 통제를 과식시키는 순간이다.

또 하나 꼭 기억할 점이 있다. ControlNet은 베이스 체크포인트와 계열이 맞아야 한다. SD1.5용, SDXL용, 특정 아키텍처 전용 모델은 서로 바꿔 끼우면 대개 제대로 작동하지 않는다. 워크플로우가 멀쩡해 보이는데 결과만 이상하다면, 첫 번째로 의심할 것은 노드가 아니라 모델 호환성이다.3

그리고 여러 ControlNet을 함께 쓸 수도 있다. 예를 들어 OpenPose로 자세를 고정하고, Canny로 화면 구조를 보정하는 식이다. 이때 핵심은 "각각을 세게"가 아니라 "합쳐서 적당히"다. 제어를 여러 겹 쌓을수록 총 제어량이 커지므로, 개별 강도는 낮추는 편이 안정적이다.13

8.2 IP-Adapter로 스타일·얼굴 일관성 유지

ControlNet이 구조 감독이라면, IP-Adapter는 참조 감각 코치에 가깝다. 참조 이미지의 분위기, 대상성, 얼굴 인상, 때로는 전반적 구성 감각을 뽑아 생성에 주입한다. 개발자 커뮤니티에서는 종종 "1장짜리 LoRA처럼 느껴진다"고 설명하는데, 실제 사용감도 꽤 비슷하다.4

둘의 차이는 명확하다. ControlNet은 "이 선과 포즈를 따라"라고 말하고, IP-Adapter는 "이 사람 느낌, 이 스타일 감각, 이 참조의 시각적 정체성을 기억해"라고 말한다. 그래서 같은 참조 이미지를 넣어도 ControlNet 결과는 구조를 닮고, IP-Adapter 결과는 분위기나 인상을 닮는다. 둘을 섞으면 "같은 캐릭터가 같은 자세로 다른 장면에 등장하는" 종류의 작업이 가능해진다. 바로 프로덕션이 좋아하는 종류의 마법이다.

ComfyUI에서 IP-Adapter를 쓰려면 보통 CLIP Vision 모델과 IP-Adapter 전용 모델을 함께 준비해야 한다. SD1.5, SDXL 등 베이스 계열에 맞는 모델을 써야 하고, FaceID 계열은 insightface 같은 추가 의존성이 필요하거나 전용 LoRA를 함께 요구하는 경우도 있다.4 즉, 모델 하나만 넣으면 끝인 세계는 아니다. 하지만 한 번 세팅하면 얻는 효율은 크다.

실무에서 자주 쓰는 방향은 크게 세 가지다.

  • 스타일 참조: 브랜드 무드보드, 일러스트 색감, 특정 질감의 재현

  • 얼굴·인물 일관성: 같은 사람처럼 보이는 컷 시리즈 제작

  • 구성 보조: 구도 감각은 빌리되 내용은 새로 생성

스타일 유지 용도라면 IP-Adapter는 여전히 강력하다. 다만 2026년 기준으로는 스타일 전송만 놓고 보면 전용 이미지 편집 모델이나 스타일 전용 API가 더 강한 경우도 많다. 그럼에도 ComfyUI 안에서 로컬 그래프 하나로 묶어 쓰고, 다른 제어 수단과 동시에 조합할 수 있다는 점에서 IP-Adapter의 가치는 여전하다.5

운용 감각도 중요하다. 가중치를 너무 높이면 참조 이미지의 좋은 점뿐 아니라 나쁜 습관까지 따라온다. 예를 들어 얼굴 참조를 너무 세게 걸면 표정이 굳고, 스타일 참조를 너무 세게 걸면 화면 전체가 한 톤으로 눌릴 수 있다. 보통은 0.4~0.7 정도에서 시작해, 얼굴 일관성이 정말 중요할 때만 조금 더 올리는 편이 낫다. IP-Adapter는 비슷하게 만들기의 도구이지, 복사하기의 도구가 아니기 때문이다.

프로덕션 관점에서 특히 좋은 조합은 이렇다. 인물의 자세는 OpenPose로 고정하고, 얼굴 인상은 IP-Adapter Face 계열로 잡고, 전체 색감은 약한 스타일 LoRA나 스타일 참조로 미세 조정한다. 그러면 포즈, 얼굴, 무드가 서로 역할을 나눠 먹는다. 한 도구에게 모든 책임을 지우지 않는 설계가 오래 버틴다.

8.3 Regional Prompter로 화면 분할 제어

프롬프트 하나로 화면 전체를 통제하는 데는 분명 한계가 있다. "왼쪽에는 붉은 재킷의 여성, 오른쪽에는 검은 수트의 남성, 배경은 비 오는 네온 거리"라고 길게 써도 모델은 종종 의상을 서로 바꿔 입히고, 배경 색을 인물 피부에 묻힌다. 이럴 때 필요한 것이 Regional Prompting이다.

개념은 단순하다. 화면을 여러 영역으로 나누고, 각 영역마다 다른 조건을 건다. 왼쪽과 오른쪽을 나눌 수도 있고, 인물과 배경을 나눌 수도 있으며, 얼굴·의상·배경처럼 더 세밀하게 쪼갤 수도 있다. 커뮤니티에서는 이를 위한 다양한 Regional Prompter 워크플로우와 지역 기반 IP-Adapter 조합이 활발히 공유돼 왔다.6

Regional Prompting을 이해하는 가장 쉬운 방법은 한 장 안에 작은 스튜디오를 여러 개 만든다고 생각하는 것이다. 각 스튜디오는 자기 구역에서만 지시를 듣는다. 그러면 전체 프롬프트가 서로 싸우는 일이 줄어든다.

실제 워크플로우는 대체로 다음 순서로 흘러간다. 먼저 마스크나 영역 정보를 만든다. 그다음 각 영역에 들어갈 프롬프트 또는 조건을 준비한다. 필요하면 특정 영역에만 IP-Adapter나 LoRA, 혹은 추가 컨트롤을 건다. 마지막으로 이 조건들을 합쳐 한 장의 이미지로 샘플링한다. 노드 이름은 패키지마다 다르지만, 정신모델은 거의 같다.

이 기법이 특히 빛나는 장면은 세 가지다.

  • 투샷·군상 장면에서 인물별 의상과 역할을 분리하고 싶을 때

  • 전경 상품과 후경 배경의 스타일을 다르게 가져가고 싶을 때

  • 캐릭터 얼굴은 안정적으로 유지하면서 의상이나 배경만 과감하게 바꾸고 싶을 때

Regional Prompting이 실패하는 이유도 대개 명확하다. 첫째, 영역이 너무 날카롭게 갈려 경계선이 생긴다. 둘째, 영역별 프롬프트가 서로 모순된다. 셋째, 지역 조건과 전역 조건이 같은 속성을 서로 다르게 요구한다. 이를 줄이려면 마스크 경계를 조금 겹치게 만들고, 전역 프롬프트에는 공통 세계관만 남기며, 지역 프롬프트에는 차이점만 적는 편이 좋다.

예를 들어 패션 에디토리얼 컷을 만든다고 해 보자. 전역 프롬프트에는 cinematic fashion editorial, rainy night, high contrast lighting 같은 공통 무드를 넣는다. 왼쪽 영역에는 red leather jacket, short bob haircut을, 오른쪽 영역에는 black tailored suit, slick hair를 넣는다. 여기에 배경 영역만 별도의 스타일 참조를 걸면, 두 인물은 서로 섞이지 않고 같은 잡지 화보 안에 서 있게 된다. 이때 ControlNet까지 함께 쓰면, 단지 멋진 그림이 아니라 레이아웃이 통제된 결과물이 나온다.

8.4 LoRA 스택과 가중치 튜닝

LoRA는 베이스 모델에 특정 스타일, 인물성, 소품, 질감, 조명 성향을 덧씌우는 가벼운 어댑터다. 한 개만 써도 유용하지만, 실무에서는 여러 개를 섞어 써야 할 때가 많다. ComfyUI의 가장 기본적인 방법은 Load LoRA 노드를 체인으로 연결하는 것이다. 공식 문서도 이 직렬 연결 방식을 기본 예제로 안내한다.7

하지만 프로젝트가 커지면 노드가 금세 늘어난다. 그래서 여러 LoRA를 한 번에 관리하는 Stacker 계열 커스텀 노드가 널리 쓰인다. 이런 노드는 여러 LoRA를 목록으로 쌓고, 각각의 활성화 여부와 강도를 한곳에서 조절하게 해 준다.8 작은 편의처럼 보여도, A/B 테스트와 배치 생성에서는 엄청난 차이를 만든다.

여기서 중요한 것은 무조건 많이 쌓는 것이 아니라 역할을 분리하는 것이다. 좋은 LoRA 스택은 보통 다음처럼 책임이 나뉜다.

역할권장 시작값설명
스타일 LoRAmodel 0.4~0.7 / clip 0.3~0.6화면의 붓질, 색조, 렌더링 경향을 만든다
캐릭터 LoRAmodel 0.7~1.0 / clip 0.5~0.8얼굴과 정체성을 붙잡는다
소품·디테일 LoRAmodel 0.2~0.5 / clip 0.2~0.5의상, 무기, 효과, 특정 장식 요소를 얹는다

strength_model과 strength_clip을 따로 조절할 수 있다면, 먼저 clip을 의심하는 습관이 좋다. 프롬프트 의미가 지나치게 딱딱해지거나 LoRA 트리거가 화면 전체를 점령하면, model보다 clip을 조금 낮추는 편이 더 자연스럽게 풀리는 경우가 많다. 반대로 눈에 띄는 시각 변화가 부족한데 트리거는 잘 먹는다면 model을 조금 올려 볼 차례다.

LoRA를 여러 개 쓸 때는 세 가지 원칙이 안전하다.

  • 하나씩 단독 테스트한 뒤 쌓는다. 성격을 모르는 LoRA 세 개를 한 번에 넣으면 범인을 찾을 수 없다.

  • 같은 계열의 베이스에 맞는지 확인한다. SD1.5용, SDXL용, FLUX 계열은 섞어 쓰는 순간 문제가 시작된다.

  • 시드는 고정하고 가중치 하나만 바꾸며 비교한다. 그래야 무엇이 결과를 바꿨는지 말할 수 있다.

가장 흔한 실수는 스타일 LoRA를 너무 세게 걸어 캐릭터 LoRA를 삼켜 버리는 것이다. 그다음으로 흔한 실수는 소품 LoRA가 화면 곳곳에 증식하는 현상이다. 멋진 칼 LoRA를 넣었더니 벽에도 칼, 구름에도 칼, 심지어 머리카락에도 칼 기운이 흐르는 식이다. 이럴 때는 대개 소품 LoRA를 낮추고, 프롬프트에서 해당 개념의 반복 빈도도 줄여야 한다.

LoRA 스택은 단독으로도 강하지만, ControlNet과 만나면 진짜 실력이 나온다. OpenPose로 포즈를 잠그고, 캐릭터 LoRA로 인물성을 유지하고, 스타일 LoRA로 세계관을 통일하면 시리즈 제작이 쉬워진다. 결과가 "이번에도 비슷하게 나왔으면 좋겠다"가 아니라 "이번에도 이렇게 나와야 한다"로 바뀌는 순간이다.

의도를 결과로 바꾸는 실전 조합

이 장의 도구들은 각각도 강하지만, 프로덕션에서는 조합으로 힘을 발휘한다. 아래 세 가지 조합은 거의 모든 실전 작업의 기본형으로 쓸 수 있다.

  • 캐릭터 일관성 일러스트: OpenPose로 자세를 고정하고, 캐릭터 LoRA로 얼굴과 의상을 붙잡은 뒤, IP-Adapter로 참조 인상의 편차를 줄인다. 같은 주인공의 장면집을 만들 때 강하다.

  • 상품·광고 키비주얼: Canny나 Depth로 제품 위치와 원근을 잡고, Regional Prompting으로 전경 상품과 후경 배경을 나눠 제어한다. 여기에 약한 스타일 참조를 더하면 브랜드 무드가 통일된다.

  • 에디토리얼·썸네일 배치 작업: 전역 프롬프트로 전체 톤을 잡고, 지역 프롬프트로 제목 영역·인물 영역·배경 영역을 분리한다. 필요한 곳에만 LoRA를 얹으면 과도한 스타일 오염 없이 반복 생산이 가능하다.

결국 핵심은 한 문장으로 정리된다. 구조는 ControlNet이, 인상은 IP-Adapter가, 지역 차등은 Regional Prompting이, 세계관의 질감은 LoRA가 맡는다는 것이다. 이 역할 분담이 선명해질수록 결과는 덜 흔들리고, 수정은 빨라지고, 재생산성은 올라간다. 좋은 결과를 우연이 아니라 의도로 만드는 순간은, 멋진 프롬프트를 쓴 날이 아니라 제어 수단의 책임을 올바르게 나눈 날에 온다.

참고

1ComfyUI ControlNet Usage Example

2ControlNet 튜토리얼: ComfyUI에서 ControlNet을 사용하여 정확한 이미지 제어 생성하기

3guided_composition README

4ComfyUI IPAdapter plus

5The Complete Style Transfer Handbook: All in ComfyUI

6ComfyUi Regional Prompter Workflow

7ComfyUI Multiple LoRAs Example

8LoRA Stacker

책 목록

프로덕션 ComfyUI: 이미지에서 영상까지, 노드로 완성하는 AI 콘텐츠 파이프라인

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기