노트

병렬 수정 (팽창-수축)

Parallel Change

설계#refactoring · 연결된 개념 11개

쉽게 말하면

병렬 수정은 다리를 새로 놓을 때 옛 다리를 바로 부수지 않는 방식이에요. 새 다리를 다 짓고 차들을 하나씩 옮긴 뒤에 옛 다리를 허무니까, 공사 중에도 길이 끊기지 않아요.

비유가 깨지는 곳 실제로는 옮기는 단계가 여럿으로 나뉘어요. 쓰기를 두 곳에 같이 하고 데이터를 옮긴 뒤 읽기를 바꾸는데, 각 단계가 따로 배포 가능해서 중간에 멈춰도 안전해요.

호환되지 않는 변경을 한 번에 하지 않고, 새 것을 추가하고(팽창, Expand) 옛 것과 함께 쓰다가 옛 것을 걷어 내는(수축, Contract) 단계로 나눠 하는 방법. 각 단계가 배포 가능한 상태라 중간에 멈춰도 안전하다.

데이터베이스 컬럼 이름을 바꾸는 예:

  1. 새 컬럼을 추가한다
  2. 쓰기를 두 컬럼에 모두 하고, 기존 데이터를 새 컬럼으로 옮긴다
  3. 읽기를 새 컬럼으로 바꾼다
  4. 옛 컬럼을 쓰는 코드를 없앤 뒤 옛 컬럼을 지운다
  • 함수 이름이나 API(Application Programming Interface) 시그니처를 바꿀 때도 같다. 새 함수를 만들고 옛 함수가 새 함수를 부르게 둔 채 호출부를 하나씩 옮긴다(함수 선언 바꾸기)
  • 켄트 벡의 New Interface, Old Implementation(한국어판 "새로운 인터페이스로 기존 루틴 부르기". 새 인터페이스를 만들고 안에서 옛 구현을 부른다)도 같은 생각이다(정리(Tidying))
  • 공개 API라면 옛 버전에 의존하는 사용자가 생각보다 많다는 점을 염두에 둔다(하이럼의 법칙)
  • 마이그레이션 중 스키마와 코드가 어긋나는 문제는 스키마 드리프트, 커밋 단위로 나누는 요령은 커밋 메시지와 원자적 커밋 참고
  • 변경 비용을 되돌릴 수 있는 작은 조각으로 쪼갠다는 점에서 가역성 이야기와 닿아 있다

출처: martinfowler.com: Parallel Change 다닐루 사투(Danilo Sato) · 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 변수 추출하기

    복잡한 표현식의 일부에 이름을 붙여 지역 변수로 빼는 리팩터링. 변수를 추출하고 싶다는 건 그 표현식에 이름을 붙이고 싶다는 뜻이다.

  • 문장 슬라이드하기

    관련된 코드끼리 가까이 모이도록 문장의 위치를 옮기는 리팩터링. 그 자체로도 읽기 쉬워지지만, 대개 함수 추출의 준비 단계로 쓴다.

  • 임시 변수를 질의 함수로 바꾸기

    계산 결과를 담아 두던 임시 변수를 그 값을 돌려주는 함수로 바꾸는 리팩터링. 긴 함수를 쪼개기 전 단계로 특히 쓸모 있다.

  • 함수·필드 옮기기

    함수나 필드를 더 자연스러운 맥락(모듈·클래스)으로 옮기는 리팩터링. 좋은 설계의 핵심인 모듈성(Modularity), 즉 어딘가를 고칠 때 관련된 작은 부분만 이해하면 되게 하는 능력을 키운다.

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

보기 옵션