들어가며
개발자는 다양한 업무를 수행한다. 하지만 그중에서 가장 중요한 일은 무엇일까? 필자는 모델링이라 생각한다. 필자는 꽤 다양한 서비스와 시스템을 설계해왔고, 그 과정에서 많은 문제를 겪기도 했다. 개발자가 많은 시간을 소요하는 문제는 어떤 것일까? 필자의 경험에 따르면 탑 3에 드는 문제는 다음과 같다.
- 요구사항을 잘못 해석하여 재작성
- 요구사항 변경으로 인한 기존 코드 분석과 재작성
- 디버깅을 위한 코드 분석
내 경험에 비롯하여 말하자면, 극단적인 면이 있을지 몰라도 모든 문제는 잘못된 모델링이 원인이라고 생각한다. 잘못된 모델링은 유지보수에 어려움을 유발한다. 반대로 잘된 모델링은 문제를 해결하는 데 큰 도움이 된다.
사실 모델링은 옛날부터 중요하게 다뤄졌고 지금까지도 많은 개발자가 중요하다 말한다. 그런데 갑자기 모델링을 정리하는 이유가 뭘까? 최근 여러 업체에서 AI가 가능한 직종은 신규 채용을 하지 않는다는 소식이 들려온다. 앞으로 이런 소식이 더 등장할 것을 생각하면 AI 시대에 어떻게 경쟁력을 가질지 고민해야 한다. 필자는 AI 시대에도 살아남기 위한 최고의 전략 중 하나를 모델링 능력이라 생각한다. 모델링은 문제 해결을 위해 문제 자체를 재정의하는 요령이며 이것이야말로 AI에게 '일을 잘 시킬 수 있는 핵심'이기 때문이다. 모델링은 고전이지만 오히려 AI시대에 핵심이 될 수 있다.
이번 글에서는 모델링이란 무엇인지, 왜 중요한지에 대해 알아볼 것이다. 그리고 이후엔 이 시리즈를 통해 유용한 모델링 패턴을 소개할 것이다.
모델링에 대한 오해
모델링이라고 하면 흔히 UML 다이어그램을 그리거나, 데이터베이스 테이블을 설계하는 일만을 떠올리기 쉽다. 또는 거창한 아키텍처 설계, 시스템 구조도를 만드는 일로 오해되기도 한다.

하지만 모델링은 그보다 훨씬 더 넓고 깊은 개념이다. 모델링은 문제를 바라보는 관점을 정리하고, 그 관점을 코드로 표현 가능한 형태로 구조화하는 일이다. 모델링은 특정한 기술이나 산출물에 국한되지 않는다. 다음과 같은 것들도 모두 모델링이다.
- API 응답을 어떤 구조로 만들 것인가를 고민하는 것
- 하나의 함수가 어떤 책임을 가져야 하는지 결정하는 것
- 상태를 어떻게 표현할 것인지, 그 흐름을 어디서 제어할 것인지 정하는 것
- 복잡한 조건을 명확한 규칙으로 치환하는 것
- 여러 개념을 어디까지 하나로 묶고, 어디서 나눌지를 판단하는 것
모델링은 어쩌다 가끔 하는 작업이 아니다. 오히려 하루에도 수십 번씩 반복되는 작업이라 할 수 있다. 단지 우리가 그것을 '모델링'이라는 단어로 인 식하지 못하고 있을 뿐이다.
코드 레벨에서의 모델링은 마치 객체지향 프로그래밍과 유사하게 보인다. 하지만 엄밀하게 같은 것은 아니며 코드 작성에 대한 방법론인 객체지향 프로그래밍과 달리 모델링은 문제 해석에 대한 사고 방식과 그에 따른 구현이라고 보는 것이 더 적절하다.
모델은 곧 추상화와 구조화다
모델은 단순히 데이터를 담는 그릇이 아니다. 그것은 우리가 문제를 어떻게 바라보고 해석할 것인가에 대한 표현이며, 설계이며, 설명서다. 즉, 모델이란 개발자 시선에서 해결할 문제를 추상화하고 구조화한 결과물이다.
추상화와 구조화가 뭘까? 먼저 추상화는 복잡한 객체에서 본질적인 특징을 뽑아내는 일이다. 모든 것을 담는 것이 아니라, 목적에 따라 무엇을 담고 무엇을 버릴지 선택하는 것이다. 그리고 목적을 달성하기 위해선 여러 관점으로 볼 수 있는 능력이 중요하다.

예를 들어, '사용자(User)'라는 개념을 모델링한다고 해보자. 어떤 시스템은 이메일만 알면 충분하다. 어떤 시스템은 나이, 성별, 구매 이력까지 알아야 한다. 같은 '사용자'라는 말도 관심사가 다르면 다른 모습으로 추상화된다. 이처럼 추상화는 우리가 무엇을 중요하게 여기는지, 어떤 문제를 풀고자 하는지를 반영한다. 다시 말해, 모델은 문제를 바라보는 관점의 결과물이다.
구조화는 추상화된 개념들을 어떻게 구성할지에 대한 결 정이다. 어떤 속성은 하나의 객체로 분리되고, 어떤 책임은 메서드로 들어가며, 어떤 요소들은 서로 관계를 맺는다. 즉, 어떠한 시스템에 대한 구성을 정의하는 것이라 할 수 있다. 좋은 구조화는 복잡한 것들을 겹치지 않게 나누고, 빈틈없이 연결한다. 이를 통해 유지보수를 쉽게 만들고, 시스템을 이해하기 쉽게 만든다.
한 가지 예시로 '피자 주문 시스템'을 모델링한다고 가정해보자.
- 시스템의 목적이 재고 관리라면,
모델은 피자의 구성 재료(치즈, 도우, 소스 등), 각 재료의 수량, 유통기한 등을 중심으로 구성될 것이다. - 시스템의 목적이 마케팅이라면,
모델은 고객의 주문 이력, 선호 토핑, 할인 쿠폰 사용 내역 등으로 중심이 이동할 것이다. - 시스템의 목적이 배달 최적화라면,
주소 정보, 배달 소요 시간, 라이더 위치와 스케줄이 주요 모델링 대상이 될 것이다. - 혹은 이 모든 것을 다뤄야 한다면,
각각의 추상화 영역을 나눠 서로 협력하게끔 구조화할 수 있다.
이처럼 같은 ‘피자 주문 시스템’이라는 문제도, 관심사에 따라 전혀 다른 모델이 나온다. 모델은 현실을 그대로 흉내 내기보다는, 관점을 담은 해석에 가깝다.
좋은 모델이란 무엇인가?
좋은 모델이란 단순히 잘 짜인 클래스나 예쁜 다이어그램을 의미하지 않는다. 그 모델이 문제를 얼마나 효과적으로, 그리고 정확하게 표현하느냐가 핵심이다. 다음은 좋은 모델을 구성하는 네 가지 기준이다.