객체 지향 프로그래밍에서 식별자와 행동의 분리

Identity and behaviour - Ismael Celis

작성자
발행일
2025년 07월 10일

핵심 요약

  • 1 객체 지향 프로그래밍에서 객체의 식별자와 행동은 종종 혼동되지만, 별개의 개념으로 이해하는 것이 유용합니다.
  • 2 행동은 객체의 상태에 따라 달라질 수 있으며, 이를 분리하여 모델링하면 더욱 유연하고 명확한 코드를 작성할 수 있습니다.
  • 3 Event Sourcing이나 함수형 프로그래밍과 같은 패러다임은 식별자와 행동의 본질적인 분리를 지원합니다.

도입

객체 지향 프로그래밍(OOP)에서 객체의 '식별자(identity)'와 '행동(behaviour)'은 종종 동일시되곤 합니다. 그러나 본 글은 이 두 개념을 분리하여 사고하는 것이 코드 모델링에 있어 더 큰 유연성과 명확성을 제공할 수 있음을 주장합니다. 일반적인 OOP 접근 방식에서는 특정 객체의 모든 행동이 그 객체의 정체성과 불가분의 관계를 맺는다고 가정하지만, 실제로는 객체의 상태에 따라 가능한 행동이 달라질 수 있습니다.

본 글은 ‘Pepper’라는 고양이의 예시를 통해 이러한 문제를 설명합니다. 초기에는 고양이의 모든 행동(놀기, 먹기, 자기)이 Cat 클래스 내에 통합되어 있지만, 고양이가 잠든 상태에서는 먹을 수 없다는 제약이 추가되면서 행동이 상태에 의존하게 됩니다. 기존의 모델을 유지하기 위해 Ruby의 State Machine과 같은 추상화를 사용하는 방법이 제시되지만, 이는 코드를 복잡하게 만들고 DSL(Domain Specific Language) 사용에 대한 의문을 제기합니다.

저자는 비즈니스 시스템에서 ‘식별자’는 시간의 흐름에 따른 변화를 추적하는 데 중요하며, 행동은 이러한 식별자가 특정 시점이나 상태에서 수행할 수 있는 작업이라고 강조합니다. 예를 들어, 전자상거래 시스템에서 ‘주문-123’의 식별자는 변하지 않지만, ‘장바구니’ 상태에서는 배송될 수 없고 ‘주문 완료’ 상태에서는 다시 주문될 수 없는 것처럼 행동은 상태에 따라 변화합니다. 이러한 식별자와 행동 간의 본질적인 불일치는 도메인을 구조 대신 시간의 관점에서 생각할 때 더욱 명확해집니다.

이러한 관점에서, 저자는 식별자와 행동을 별개의 개념으로 모델링하는 대안을 제시합니다. AwakeCatAsleepCat과 같이 상태에 따라 다른 클래스를 사용하여 행동을 캡슐화하는 방식입니다. 이는 단순한 예시지만, 식별자와 행동이 동일하다는 가정을 버리면 현실과 코드 간의 매핑에 대한 새로운 이해를 얻을 수 있음을 시사합니다.

또한, Event Sourcing 패러다임에서는 ‘스트림’이라는 식별자만이 존재하고, 모든 상태는 해당 식별자에 대한 이벤트 로그로부터 파생된다는 점에서 이러한 분리가 극대화됩니다. 함수형 프로그래밍(FP)에서도 상태와 행동이 명확하게 구분되어 있어 이러한 마찰이 발생하지 않습니다.

저자는 OOP 개발자들이 이러한 방식으로 생각하는 경향이 있는 이유를 ‘실제 세계와의 유추’라는 기본적인 가정과 ORM(Object-Relational Mapping) 패턴에 대한 의존성에서 찾습니다. ORM은 데이터 지속성과 행동을 결합하여 데이터베이스 레코드, ORM 클래스, 그리고 그 클래스가 구현하는 행동을 모두 동일한 것으로 여기게 만듭니다. 저자는 이러한 도구들이 유용함에도 불구하고, 문제를 코드로 변환할 때 내재된 큰 가정들을 간파할 필요가 있다고 결론짓습니다.

결론

본 글은 객체 지향 설계에서 식별자와 행동을 분리하는 것이 복잡성을 줄이고 유연성을 높이는 중요한 접근 방식임을 강조합니다. 기존의 일반적인 OOP 모델링 방식이 가진 한계를 지적하고, 상태에 따른 행동 변화를 보다 자연스럽게 표현할 수 있는 대안적 모델링 기법들을 제시합니다. 궁극적으로, 현실 세계를 코드로 완벽하게 모방하려는 시도에서 벗어나, 도메인의 본질적인 특성을 반영하는 설계 철학을 채택할 것을 제안합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!