200. 분할과 정복 (Divide and Conquer) - 소프트웨어 설계 모듈화 하향식 분해 병렬 처리 알고리즘 재귀 호출 복잡도 완화

핵심 인사이트: 책상 위에 A4 용지 10만 장이 어지럽게 쌓여있다. 이걸 나 혼자 가나다순으로 정리하려면 눈앞이 노래지고 평생이 걸려도 못 한다(복잡도의 압도). 그런데 천재가 나타났다. "야! 10만 장 쳐다보면서 혼자 울지 말고, 그걸 일단 5만 장씩 반으로 찢어! 또 그걸 2만 5천 장씩 찢고, 계속 찢어서 내 눈앞에 '딱 2장'만 남을 때까지 무식하게 계속 반 토막을 내버려!! 그럼 2장 중에 누가 앞인지 순서 맞추는 건 원숭이도 1초면 하잖아! 그렇게 쪼개진 바닥 단위에서 순서를 맞춘 다음에, 그걸 다시 거꾸로 테이프로 붙여가며 합쳐 올리면 결국 10만 장 정렬이 마법처럼 끝나있어!" 감당 못할 거대한 문제를 모기만 한 똥덩어리로 갈기갈기 찢어서 개박살 낸 뒤 조립하는 인류 최고의 문제 해결 철학, 분할과 정복이다.

Ⅰ. 소프트웨어 설계의 거대한 벽 (모놀리식의 한계)

  • 1,000만 줄짜리 코드가 하나의 거대한 통짜 파일(Main)에 다 욱여넣어져 있으면, 개발자가 이걸 한 번에 읽고 디버깅하는 것은 인간의 뇌 구조상 절대 불가능합니다.
  • 거대한 소프트웨어 시스템을 개발할 때, 전체를 한 번에 덤벼들어 풀려는 무모함을 버리고, 다루기 쉬운 조각으로 써는 철학이 필요했습니다.

Ⅱ. 분할과 정복 (Divide and Conquer)의 3단계 마법 🌟 핵심 🌟

알고리즘(합병 정렬 등)과 아키텍처 설계 모두에 적용되는 불변의 법칙입니다.

1단계: 분할 (Divide) - "더 이상 쪼개지지 않을 때까지 찢어라"

  • 거대한 덩어리(메인 시스템)를, 논리적으로 독립적인 의미를 가지는 여러 개의 작은 **서브 모듈(Sub-module)**로 계속해서 하향식(Top-Down)으로 쪼갭니다.
  • '은행 시스템' ➜ (계좌, 대출, 외환) ➜ 계좌를 다시 (입금, 출금, 조회) 모듈로 쪼개어, 각 모듈이 단 1개의 책임(결합도 낮고 응집도 높은 상태)만 가질 때까지 갈기갈기 찢습니다.

2단계: 정복 (Conquer) - "바닥에서 승부 보기"

  • 쪼개져 나온 '출금'이라는 아주 작고 단순한 모듈 하나만 떼놓고 봅니다.
  • 거대한 은행 시스템을 짤 땐 막막했지만, '출금' 하나만 짜는 건 신입 개발자 혼자서 하루면 코딩하고 테스트까지 완벽하게 잡아낼 수 있습니다. 이 **바닥의 작은 문제들을 각각 격리된 상태에서 독립적으로 해결(Conquer)**합니다.

3단계: 결합/합병 (Combine/Merge) - "블록 조립하기"

  • 바닥에서 완벽하게 에러 없이 구동되는 '입금', '출금', '조회' 모듈들을 위로 가져와서 하나의 큰 '계좌 모듈'이라는 레고 블록으로 **조립(Integration)**합니다.
  • 다시 계좌와 대출 블록을 조립하여 거대한 '은행 시스템'을 완성합니다. 작은 부품이 튼튼하니 전체 성(Castle)도 무너지지 않고 완벽하게 돌아갑니다.

Ⅲ. 소프트웨어 공학에 미친 파급 효과 🌟

이 철학이 낳은 위대한 자식들입니다.

  1. 모듈화 (Modularization): 분할과 정복을 소스 코드에 적용한 게 모듈화입니다. 코드를 잘게 쪼개어 197번 팬인/팬아웃, 191번 결합도/응집도를 최적화합니다.
  2. 애자일 (Agile) 스프린트: 개발 '일정'을 쪼갠 것입니다. 1년짜리 프로젝트를 한 번에 하는 게 아니라, 2주 단위의 짧은 폭발(Sprint)로 쪼개어(Divide) 하나씩 정복해 나갑니다.
  3. 마이크로서비스 (MSA): 거대한 서버 한 대를 1,000개의 작은 도커 컨테이너로 쪼개어 독립적으로 배포하는 현대 클라우드 아키텍처의 근본입니다.

Ⅳ. 주의점: 너무 쪼개면 망한다 (오버헤드의 늪)

  • 모듈을 너무 잘게, 1줄 단위로 미친 듯이 쪼개버리면?
  • 쪼개는 건 쉬운데, 나중에 그 10만 개의 쪼가리를 다시 합치고 서로 통신하게 만드는 '통합 비용(Integration Cost / 인터페이스 호출 오버헤드)'이 폭발하여 시스템이 뻗어버립니다. (적당한 덩어리 크기, 즉 '적정 응집도'를 찾는 것이 아키텍트의 몸값입니다.)

📢 섹션 요약 비유: 소프트웨어의 **분할과 정복(Divide and Conquer)**은 **'거대한 100층짜리 레고 성을 조립하는 방법'**입니다. 바닥에 레고 조각 100만 개가 산더미처럼 쌓여있는데, 이걸 혼자서 1층부터 100층까지 통째로 쌓아 올리려다간 중간에 무너져서 평생 완성하지 못합니다(모놀리식의 압도감). 분할과 정복의 지휘관은 100만 개의 조각을 부하 10명에게 10만 개씩 쪼개어 나눠줍니다(Divide). 부하들은 또 자기 팀원 10명에게 1만 개씩 나눠줍니다. 말단 직원은 고작 레고 10조각을 받아들고, 아주 여유롭게 실수 없이 '작은 창문' 하나를 뚝딱 조립합니다(Conquer). 이제 이 완벽한 창문들을 모아 지붕을 덮고(Merge), 지붕들을 모아 층을 올리면, 어느새 에러 하나 없는 100층짜리 거대한 성이 마법처럼 솟아오릅니다. 거대함이 주는 공포를 산산조각 내어 인간의 뇌가 통제할 수 있는 하찮은 부품 사이즈로 억눌러버리는 모든 아키텍처 설계의 가장 위대한 뼈대 철학입니다.