노트

믹스인

Mixin

프런트엔드#js#pattern · 연결된 개념 5개

쉽게 말하면

믹스인은 기본 아이스크림에 토핑을 골라 섞듯, 여러 클래스가 쓸 기능 묶음을 따로 만들어 두고 상속 계층과 상관없이 섞어 넣는 방식이에요. 단일 상속 언어에서도 기능을 여러 곳에서 가져올 수 있어요.

비유가 깨지는 곳 토핑과 달리 이름이 겹치면 나중에 섞은 쪽이 조용히 덮어써요. 어떤 메서드가 어디서 왔는지 추적하기 어려워서 React도 믹스인을 버리고 고차 컴포넌트와 훅으로 옮겨 갔어요.

믹스인(Mixin)은 여러 클래스나 객체가 공유할 기능 묶음을 따로 정의해 두고, 상속 계층과 상관없이 섞어 넣는 재사용 방식이다. JavaScript에서는 "부모 클래스를 받아 기능을 더한 새 클래스를 돌려주는 함수"로 자주 구현한다.

const Serializable = Base => class extends Base {
  serialize() { return JSON.stringify(this) }
}
const Validatable = Base => class extends Base {
  validate() { return Object.values(this).every(v => v != null) }
}
class User extends Serializable(Validatable(Object)) {}   // 둘을 섞어 넣는다
  • 단일 상속만 있는 언어에서 다중 상속(Multiple Inheritance)의 일부 효과를 낸다. 객체에는 Object.assign(target, mixin)으로 메서드를 복사해 넣는 방식도 있다
  • 주의: 어떤 메서드가 어느 믹스인에서 왔는지 추적하기 어렵고, 이름이 겹치면 나중에 섞은 쪽이 조용히 덮어쓴다. 다중 상속에서 파이썬이 MRO(Method Resolution Order)로 정하는 메서드 탐색 순서 문제와 같은 계열이다
  • React는 예전 createClass 시절 믹스인을 지원했지만 이런 문제(암묵적 의존, 이름 충돌, 눈덩이처럼 커지는 복잡도) 때문에 고차 컴포넌트(Higher-Order Component)와 훅으로 옮겨 갔다
  • 데코레이터와 비교: 믹스인은 클래스 정의 단계에서 기능을 섞고, 데코레이터 패턴은 객체를 감싸 실행 시점에 기능을 더한다
  • 상속을 늘리기보다 필요한 객체를 포함해 위임하는 편이 단순할 때가 많다(상속보다 위임)

출처 책은 『자바스크립트 + 리액트 디자인 패턴』.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 템플릿 메서드 패턴

    알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 의존성 역전 원칙

    고수준 모듈(업무 규칙)이 저수준 모듈(데이터베이스(DB), HTTP(Hypertext Transfer Protocol) 클라이언트 같은 세부 구현)에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다는 원칙. 의존 방향이 "업무 → 세부"에서 "세부 → 추상화 ← 업무"로 뒤집힌다.

  • 멱등성

    멱등성(idempotency)은 같은 연산을 한 번 하든 여러 번 하든 결과가 같다는 성질이다. 네트워크는 실패하고 메시지는 중복되므로, 재시도가 안전하려면 받는 쪽이 멱등해야 한다.

  • 내부 가변성과 메모이제이션

    내부 가변성(Interior Mutability)은 객체나 함수의 참조는 그대로인데 안에 숨은 상태가 바뀌는 성질이다. React의 메모이제이션은 "입력이 다른 참조인가"만 보기 때문에, 참조가 같으면 내용이 바뀌어도 바뀌지 않았다고 판단한다. React 공식 문서는 이를 "겉모습은 같은데 몰래 내용물을 바꾸는 상자"에 비유한다.

보기 옵션