← 최신 논문
💻 computer science

Beyond Objects

이 논문은 시스템 기능을 문제 도메인의 개체에 직접 매핑하는 핵심적인 객체 지향 원칙이 본질적으로 결함이 있으며 파편화를 초래한다고 주장하며, 대신 객체 지향을 포기하고 도메인 개체를 기능 모듈로부터 분리하는 접근 방식을 제안한다.

원저자: Daniel Jackson

게시일 2026-06-26
📖 4 분 읽기☕ 가벼운 읽기

원저자: Daniel Jackson

원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기

핵심 아이디어: "하나의 크기로 모두에게 맞추려는" 실수

집을 짓고 있다고 상상해 보세요. 지난 50년 동안 소프트웨어 구축의 표준 규칙은 다음과 같았습니다: "집 안의 모든 방은 그곳에 사는 사람이 관리해야 한다."

소프트웨어 세계에서 이것을 **객체 지향 프로그래밍(OOP)**이라고 부릅니다. 만약 현실 세계에 "사용자(User)"가 있다면, 코드에서도 "사용자 객체"를 만들어야 한다는 아이디어입니다. 이 객체는 해당 사용자에 대한 모든 데이터(이름, 비밀번호)를 보유함과 동시에, 그와 관련된 모든 작업(로그인, 리뷰 작성, 테이블 예약 등)을 수행해야 합니다.

다니엘 잭슨(Daniel Jackson)은 이 규칙이 함정이라고 주장합니다. 이 방식은 논리적으로 보이지만, 실제로는 소프트웨어를 엉망진창으로 꼬이게 만듭니다. 그는 모든 업무를 "사람(객체)" 안에 억지로 밀어 넣는 것을 멈추고, 대신 "누가 하는가(개인)"가 아니라 **"무엇이 일어나고 있는가(행위)"**를 기준으로 소프트웨어를 조직해야 한다고 제안합니다.


문제점: "맥가이버 칼" vs "특화된 도구"

잭슨은 모든 업무를 단 하나의 "사용자 객체"에 강요하는 것이 두 가지 주요 골칫거리를 유발한다고 말합니다.

1. "맥가이버 칼" 문제 (혼재, Conflation)

사용자 객체가 맥가이버 칼이라고 상상해 보세요. 여기에는 칼날, 드라이버, 코르크 따개, 이쑤시개가 들어 있습니다.

  • 문제점: 만약 코르크 따개(사용자의 비밀번호 처리)를 사용하고 싶다면, 무거운 칼 전체를 들고 다녀야 합니다. 만약 칼날(리뷰 시스템의 버그)을 고치고 싶다면, 실수로 코르크 따개를 망가뜨릴 수도 있습니다.
  • 소프트웨어에서의 의미: "사용자" 객체는 사용자의 비밀번호, 리뷰 내역, 알림 설정, 예약 로직을 모두 하나의 거대한 파일에 담게 됩니다. 리뷰 작동 방식을 바꾸고 싶을 때마다 비밀번호 코드를 뒤져야 합니다. 이는 지저분하고 수정하기 어렵습니다.

2. "너무 많은 손" 문제 (파편화, Fragmentation)

"테이블 예약"과 같은 작업을 생각해 봅시다.

  • 문제점: 이 일을 누가 해야 할까요? 사용자일까요? 레스토랑일까요? 테이블일까요? 아니면 예약 건 자체일까요?
  • 소프트웨어에서의 의미: "업무를 해당 객체에 할당한다"는 규칙 때문에 코드가 분산됩니다. "사용자" 객체는 자신의 예약 여부를 확인하고, "레스토랑" 객체는 테이블이 비었는지 확인하며, "예약" 객체는 티켓을 생성합니다.
  • 결과: 단 하나의 예약을 완료하기 위해 컴퓨터는 서로 다른 세 개의 방에 있는 세 명의 사람을 움직이게 하고 서로 대화하게 만들어야 합니다. 만약 한 사람이 다른 사람에게 말을 전달하는 것을 잊는다면 시스템은 깨집니다. 이를 파편화라고 부릅니다.

비유: 레스토랑 예약

잭슨은 레스토랑을 통해 이를 설명합니다.

기존 방식 (객체 지향):
당신에게는 "사용자" 객체와 "레스토랑" 객체가 있습니다.

  • 앨리스가 테이블을 예약하려고 할 때, 그녀는 자신의 "사용자" 객체에게 요청합니다.
  • 사용자 객체는 "레스토랑" 객체에게 테이블이 비었는지 묻습니다.
  • 레스토랑 객체는 "슬롯(Slot)" 객체에게 묻습니다.
  • 그 후 "예약" 객체가 생성됩니다.
  • 엉망인 점: 만약 "앨리스가 동시에 두 개의 테이블을 예약할 수 없다"라는 규칙을 추가하고 싶다면, 사용자 객체, 레스토랑 객체, 예약 객체를 모두 업데이트해야 합니다. 이들은 모두 서로 얽혀 있습니다.

새로운 방식 (컨셉, Concepts):
"이것의 소유권이 누구에게 있는가?"라고 묻는 대신, "이 규칙들의 집합은 무엇에 관한 것인가?"라고 묻습니다.
잭슨은 소프트웨어를 **컨셉(Concepts)**으로 조직할 것을 제안합니다. 컨셉을 회사의 전문 팀이나 부서라고 생각하세요. 개인이 아닙니다.

  • 컨셉 1: "예약하기 (Reserving)"
    • 이 팀은 약속을 이행하는 것에 관한 모든 규칙을 처리합니다. 이 팀은 사용자가 누구인지 신경 쓰지 않습니다. 오직 예약이라는 행위 자체에만 집중하며, 누가 무엇을 예약했는지에 대한 목록을 보유합니다.
  • 컨셉 2: "가용성 (Availability)"
    • 이 팀은 테이블이 열려 있는지 확인하는 행위를 처리합니다. 누가 예약하는지는 상관하지 않고, 오직 *시간대(slots)*에만 집중합니다.
  • 컨셉 3: "사용자 인증 (User Authentication)"
    • 이 팀은 단순히 그 사람이 본인이 맞는지 확인합니다.

이들이 협력하는 방식:
사용자 객체가 레스토랑 객체를 호출하는 대신, 이 "컨셉"들은 동기화(Synchronizations)(마치 교통 신호등처럼)를 통해 서로 소통합니다.

  • 규칙: "**요청(Request)**이 들어오면, **가용성(Availability)**이 '예'라고 답하고, **인증(Authentication)**이 '가라'고 하면, **예약하기(Reserving)**가 예약을 진행할 수 있다."

왜 이 방식이 더 나은가

  1. 엉킨 매듭이 없음: "예약하기" 팀은 비밀번호를 확인하는 방법을 알 필요가 없습니다. "인증" 팀은 테이블을 확인하는 법을 알 필요가 없습니다. 이들은 분리되어 있습니다.
  2. "누구의 것인가?"라는 논쟁이 없음: 취소 버튼이 사용자의 것인지 예약의 것인지 다툴 필요가 없습니다. 그냥 예약의 상태를 관리하는 컨셉에 취소 로직을 넣으면 됩니다.
  3. 더 명확한 지도: 코드를 볼 때, "누가 무엇을 소유하는가"라는 혼란스러운 지도 대신, 실제 비즈니스 규칙(예약하기, 가용성)을 명확하게 볼 수 있습니다.

"객체" vs "컨셉"

  • 객체: 모든 것이 되려고 노력하는 작은 기계 (데이터 + 로직 + 정체성). 마치 한 사람이 요리사, 웨이터, 계산원을 동시에 하려고 애쓰는 것과 같습니다.
  • 컨셉: 특정 업무관계를 처리하는 모듈. 전문화된 부서와 같습니다. "요리 부서"는 요리를 담당하고, "웨이터 부서"는 서빙을 담당합니다. 이들은 서로 협력하지만, 한 사람 속으로 합쳐지지는 않습니다.

결론

잭슨은 우리가 기존의 모든 소프트웨어를 버려야 한다고 말하는 것이 아닙니다. 그는 객체 지향 프로그래밍의 핵심 규칙인 **"모든 업무를 그것이 속한 사람에게 할당하라"**는 생각이 바로 문제의 근원이라고 말합니다.

컨셉으로 전환함으로써, 우리는 소프트웨어가 사람들의 집합체처럼 보이도록 강요하는 것을 멈춥니다. 대신, 소프트웨어를 규칙과 관계의 집합으로 조직합니다. 이를 통해 코드는 더 읽기 쉬워지고, 수정하기 쉬워지며, 작은 것을 바꿀 때 시스템이 망가질 가능성도 줄어듭니다.

이는 더 오래되고 단순한 사고방식(관계형 데이터베이스와 같은)으로의 회귀인 동시에, 현대적 소프트웨어의 요구에 맞게 업데이트된 방식입니다. 이를 통해 우리는 덜 취약하고 더 논리적인 시스템을 구축할 수 있습니다.

연구 분야의 논문에 파묻히고 계신가요?

연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.

Digest 사용해 보기 →