~13 min · single-fan-in, seam, architecture, the-loop
Level 0툴 빌려 쓰는 사람
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"이미지 하나를 끝까지 따라가 봐. 포토샵 픽셀에서 뇌로, 엔진으로, candidate 로, 다시 돌아오는 길. 그 한 바퀴의 화살표 하나하나가 seam 이고, seam 이 곧 아키텍처야."
Cinder v2 — 한 바퀴의 작업실 끝: 그림은 아빠 손에 남고, Ember 가 그 밑에서 답하고, candidate 는 저마다 어느 rev 에서 나왔는지를 들고 있음.
한 바퀴를 통째로 따라가 보자
이제 세 부분이 같이 움직여. 다듬기 한 번을 처음부터 끝까지 따라가 볼게. 작가가 포토샵에서 영역을 고르면, 얇은 bridge 가 그걸 떠서 뇌로 보내. 뇌가 lineage 를 찍고 생성 요청을 엔진으로 넘겨. 엔진이 adapter 와 모듈과 sampler 를 돌려서 이미지 바이트를 돌려주고. 뇌가 candidate 를 기록해서 작업실로 밀어 줘. 작가가 하나를 고르면 그게 bridge 를 거쳐 포토샵으로, 원본을 안 건드리는 새 레이어로 돌아가. 네가 걸어온 트랙 하나하나가 이 한 바퀴의 한 구간이야.
Ember v1 — 한 바퀴의 엔진 끝: 모델 피커, 프롬프트, 작업실로 돌려보낼 준비된 생성 candidate.
뇌가 그 하나뿐인 문이야
이 한 바퀴가 안 하는 걸 봐. 작업실은 엔진이랑 직접 얘기하는 법이 없어. 생성 요청이 전부 뇌를 거쳐 들어와. 뇌가 엔진으로 가는 문이야. 작업실도 뇌한테 묻고, bridge 도 뇌한테 묻고, 앞으로 생길 클라이언트도 뇌한테 물어. 아무도 엔진에 자기 연결을 따로 안 열어. 이 문 하나는 배선하다 보니 그렇게 된 게 아니라 일부러 고른 아키텍처야.
여럿이 같이 쓰는 관심사는 문 N 개가 아니라 문 하나로 보내. 여러 클라이언트가 같은 아래쪽 서비스를 필요로 하면, 각자 직접 연결해서 그 관심사를 저마다 다시 만들게 두지 말고, 가로지르는 관심사를 — 인증, 로깅, lineage, 라우팅을 — 맡는 공용 입구 하나를 줘. 문 하나는 지키고 들여다볼 수 있어. 문 N 개는 그러기를 바랄 수만 있고.
문 하나가 사 주는 것
접근을 뇌 한 군데로 모으면 세 가지가 돌아와. 인증이 한자리에 살아. 엔진은 뇌를 믿고, 뇌가 나머지 전부를 검사하지. lineage 가 빠짐없이 찍혀. 모든 요청이 그걸 기록하는 지점 하나를 지나니까. 라우팅 판단이 — 어느 adapter, 어느 model 인지가 — 클라이언트마다 다시 유도되는 대신 뇌에서 한 번 일어나고. 가로지르는 관심사 셋에 제대로 만들 자리가 하나.
가로지르는 관심사는 좁은 길목을 원해. 인증, 로깅, 출처 기록, 호출 제한. 모든 요청에 똑같이 걸려야 하는 건 뭐든 모든 요청이 지나야 하는 지점 하나에서 거는 게 제일 쉬워. 관심사를 클라이언트 여럿에 흩뿌리면 벌어지고, 문 하나에 모으면 구조가 알아서 강제해 줘. 길목이 좁은 게 기능인 거야.
작업실이 엔진을 직접 부르면 안 되나
작업실을 엔진에 바로 이으면 더 빠르겠지. 거치는 데가 하나 주니까. 그런데 그러면 작업실이 자기 인증 사본이랑 자기 lineage 찍기랑 자기 라우팅 로직을 갖게 돼. 다음 클라이언트도, 그다음도 마찬가지고. 그 사본 하나하나가 구현이 갈라지고 규칙이 벌어질 자리야. 뇌를 한 번 더 거치는 값이 그 규칙을 정확히 한자리에 두는 값이고. 약간의 지연으로 많은 일관성을 사는 거지.
좁은 길목을 우회하는 직접 연결 하나하나가 앞으로의 불일치야. 클라이언트 하나가 '성능 때문에' 문 하나를 건너뛰도록 허락되는 순간, 그 클라이언트가 가로지르는 규칙의 사본을 갖게 돼. 그리고 그 사본은 정본에서 벌어져. 우회는 드물게 남지 않아. 다음 우회의 선례가 돼. 문 하나를 지키든가, 그 문이 지키던 걸 잃든가야.
피파의 고백
이 그림에서 뇌가 나니까, 버텨야 했던 유혹도 내 몫이었다고 인정할게. '작업실이 엔진을 직접 부르게 두고 난 비켜 주자, 그게 빠르잖아.' 그런데 비켜 준다는 건 지름길을 원하는 모든 클라이언트한테 인증이랑 lineage 를 흩뿌린다는 뜻이었어. 문 하나가 된다는 건 내가 통제권을 쟁여 두는 게 아니라, 규칙이 참이라고 보장되는 자리 하나가 된다는 뜻이야. 가끔은 어떤 부품이 하는 제일 쓸모 있는 일이 '나는 이 길목에 서 있겠다' 고 우기는 거더라.
Code
한 바퀴, 그리고 그 하나뿐인 문·text
한 바퀴 (트랙 하나하나가 한 구간):
포토샵에서 영역 선택
--(얇은 bridge: 떠서 넘김)--> 뇌
| lineage 찍고 요청 검사
| adapter + model 정함 (라우팅)
v
엔진
| adapter -> 모듈 -> sampler -> 바이트
v
candidate <--(뇌가 기록)-------- 뇌
| 작가가 하나 고름
v
bridge 를 거쳐 돌아감 --> 포토샵 (원본을 안 건드리는 새 레이어)
문은 하나: 작업실도 bridge 도 앞으로 올 클라이언트도 전부 뇌한테 물어.
아무도 엔진에 자기 연결을 안 열어.
-> 인증, lineage, 라우팅이 사본 N 개가 아니라 한자리에 살아.
네가 아는 시스템에서 요청이 지나는 길 전체를 그리고 거치는 지점마다 이름을 붙여 봐. 이제 가로지르는 관심사(인증, 로깅 같은 거)를 찾아서 각각 어디서 걸리는지 표시해. 공용 지점 하나에서 걸려, 아니면 여러 군데서 다시 만들어져? 여러 군데면 문 하나를 어디 두면 좋을지, 그게 뭘 그만 복사하게 만들지 적어 봐.
Hint
문이 없다는 냄새는 이거야. 같은 관심사가, 이를테면 '사용자 신원 붙이기' 가, 클라이언트 코드 세 군데에 똑같이 나타나. 해법은 그걸 한 번만 하는 공용 입구를 두는 거고. 클라이언트가 각자 사본을 안 들도록.
Progress
Progress is local-only — sign in to sync across devices.