레이어드가 위아래로 쌓는 구조였다면, 파이프라인은 옆으로 늘어놓는 구조다.
자로 재보면 다시 기술로 쪼갠 덩어리 하나다. 10장과 같은 칸인데 생김새는 완전히 다르다.
관은 나르고, 필터는 일한다
구성 요소가 딱 두 개다.
관(pipe)은 필터와 필터 사이를 잇는 통로다. 한 방향으로만 흐르고, 하는 일은 데이터를 다음으로 넘기는 것뿐이다.
필터(filter)가 실제 일을 한다. 조건은 세 가지다. 혼자서 돌아갈 것, 밖의 것을 기억하지 않을 것, 한 가지 일만 할 것.
그리고 필터는 역할에 따라 네 종류로 나뉜다.
만드는 놈 시작점. 내보내기만 한다
바꾸는 놈 받아서 모양을 바꿔 내보낸다 (map)
거르는 놈 조건에 맞는 것만 내보낸다 (filter)
받는 놈 종착점. 저장하거나 화면에 뿌린다가운데 둘이 map, filter랑 똑같아 보이는 건 우연이 아니다. 함수 조합해서 쓰던 걸 아키텍처 크기로 키워놓은 것에 가깝다.
한 방향이라는 약속
이 구조의 핵심은 흐름이 한쪽으로만 간다는 것이다. 필터는 자기 앞뒤에 누가 있는지 모르고, 알 필요도 없다. 들어온 것만 보고 나갈 것만 낸다.
이 덕분에 얻는 게 크다. 순서만 바꿔 끼우거나, 중간에 하나 밀어 넣거나, 빼버려도 나머지가 안 깨진다. 테스트도 편하다. 밖의 상태를 안 보니까 그냥 함수 테스트랑 똑같다.
잃는 것도 분명하다. 되돌아가는 흐름, 조건 따라 갈라지는 흐름, 여러 갈래로 퍼졌다 다시 모이는 흐름은 표현하기 어색하다. 억지로 넣으면 방금 말한 장점이 바로 사라진다.
데이터와 클라우드
데이터는 관을 타고 흐른다. 따로 저장해야 하면 보통 맨 끝 필터에서 DB에 넣는다. 중간 필터들이 각자 DB를 붙잡기 시작하면 밖의 것을 기억하지 않는다는 조건이 깨지고, 그 순간 순서 바꿔 끼우기가 불가능해진다.
클라우드 궁합은 의외로 좋다. 필터가 아무것도 기억하지 않으니 서버리스 함수 하나에 필터 하나를 얹기 쉽다.
다만 그건 필터를 따로따로 배포했을 때 이야기고, 책이 말하는 기본형은 어디까지나 한 덩어리다. 그래서 따로 배포하기나 필요한 만큼 늘리기 항목은 점수가 낮다.
자주 생기는 문제
길어지면 시간이 쌓인다. 필터 하나가 5밀리초여도 스무 개면 100밀리초고, 요청마다 도는 파이프라인이면 바로 체감된다.
중간에 하나 죽으면 뒤가 전부 멈춘다. 한 방향이라 돌아갈 길이 없다.
그리고 얼마나 잘게 나눌지가 계속 고민거리다. 너무 잘게 나누면 아무 일도 안 하는 필터가 늘어나는데, 이건 10장에서 본 싱크홀과 똑같은 증상이다. 너무 크게 잡으면 필터 하나가 사실상 파이프라인 전체가 된다.
지켜야 할 것
규칙 자체는 단순한데 자주 깨진다. 밖의 것을 기억하지 말 것, 한 가지만 할 것, 옆 필터의 존재를 모를 것.
특히 마지막이 위험하다. 앞 필터가 뭘 넣어줬겠거니 하고 짠 필터가 하나 생기면 순서를 못 바꾸게 되고, 그때부터 파이프라인은 그냥 함수 여러 개를 길게 부르는 코드가 된다.
팀은 대체로 기술 기준으로 나뉜다. 필터가 처리 단계라서 도메인 팀에 나눠주기가 애매하다.
이 스타일의 장단점
좋은 쪽 단순하다, 싸다, 부품처럼 갈아 끼운다, 테스트가 쉽다
약한 쪽 따로 배포, 필요한 만큼 늘리기, 일부 장애 버티기레이어드와 비교하면 코드 정리 상태와 테스트가 확실히 낫다. 필터가 작고 독립적이라 경계가 저절로 생기기 때문이다. 대신 한 덩어리라서 생기는 약점은 똑같이 남는다.
잘 맞는 자리는 분명하다. 데이터 옮기고 가공하는 일, 로그나 이벤트 처리, 빌드 도구처럼 흐름이 한 방향이고 단계가 뚜렷한 일. 반대로 사용자가 이리저리 누르고 흐름이 계속 튀는 앱에는 안 맞는다.
정리
파이프라인은 흐름이 한 방향으로 정해진 일에 아주 강하다. 그 대신 갈라지는 흐름과 되돌아가는 흐름을 포기한다.
그래서 판단 기준도 단순했다. 우리 일이 정말 한 방향으로 흐르는가. 그렇다면 이만큼 싸고 갈아 끼우기 쉬운 구조가 없고, 아니라면 굳이 관에 밀어 넣을 이유가 없다.
레퍼런스
- Mark Richards, Neal Ford, Fundamentals of Software Architecture, 2nd Edition — Chapter 12, Pipeline Architecture Style