프로그래밍 공부

도메인이란 무엇인가?

개발을 진행함에 있어서 '도메인' 이라는 개념을 처음 들어본 사람은 없을 것이라고 생각한다. 

 

그러나, '도메인이 뭐라고 생각하세요?' 라고 물어보면 막상 대답하기 어려운 것이, 이렇게 적당히 알고 있기 때문에 넘어가는 개념들이라고 생각한다. (일단, 나는 그랬다.)

 

이프와 이야기하다가 해당 개념에 대한 나의 생각이 부족하다고 생각해서 도메인에 대한 정리를 해보려고 한다.

 

도메인이란?

먼저, 사전적 정의를 얘기해보자

A domain is a field of study that defines a set of common requirements, terminology, and functionality for any software program constructed to solve a problem in the area of computer programming, known as domain engineering.

컴퓨터 프로그래밍으로 문제를 해결하기 위해 만들 소프트웨어 프로그램을 위한 요구사항, 용어, 기능을 정의하는 학문 영역이 도메인 공학이다. - 위키백과

 

간단하게 말하자면, 해결하고자 하는 문제의 영역 = 도메인이라고 생각하면 된다.

SW 개발의 입장에서는 요구사항, 문제 영역 등이 해당될 수 있다. 예를 들어 쇼핑몰을 만든다고 했을 때, 게시글, 댓글, 결제, 정산 등이 도메인에 포함된다.

 

이러한 도메인은 상위 - 하위 도메인 관계로도 구성될 수 있다.

이때, 도메인을 설계함에 있어서 클래스 다이어그램이나, 상태 다이어그램과 같은 포함하여 다양한 방식을 사용할 수 있다. 다만, 이러한 방식보다 중요한 점은, 도메인 모델이 기본적으로 도메인 자체를 이해하기 위한 개념 모델이라는 것이다. 

 

더하여, 이러한 도메인을 어떻게 보는가, 그리고 어떻게 구성하는가는 개발자 스스로 경험치를 높여서 알아봐야 하는 것이라고 생각한다. 현재 개인적으로는 '요구사항을 분석하여 상위 도메인부터 하위 도메인으로 나누어 분석한다' 라고 정리한 상태이다.

 

 

도메인 모델 

이렇게 도출한 모델은 크게 엔티티(Entity)와 Value로 나뉜다.

 

1) Entity 

Entity는 실제, 객체라는 의미를 담고 있으며, 업무에 필요하고 유용한 정보를 저장 및 관리하기 위한 집합적인 것이라고 볼 수 있다.  가장 큰 특징은 식별자를 갖는 것이다.

Java에서는 eqauals()메서드와 hashCode()메서드를 구현한다면 각 객체를 식별할 수 있을 것이다.

 

+ 다른 권위자들의 정의

- 변별할 수 있는 사물 (Peter Chen, 1976)

- 정보를 저장할 수 있는 어떤것 (James Martin, 1989)

- 정보를 저장할 수 있는 사람, 장소, 물건, 사건 그리고 개념 등(Thomas Bruce, 1992)

 

2) Value

값 객체는 식별자를 가지지 않으며, 말 그대로 값 그 자체이다.

Entity의 경우 식별자로 구분되기 때문에 식별자에 들어가지 않는 데이터가 변경된다고 다른 객체가 되는 것은 아니다. 하지만, Value의 경우에는 식별자가 없으므로 하나의 데이터라도 변경되게 된다면 다른 객체가 된다. 따라서, 값객체는 불변하게 구현하는 것이 좋다. 즉, setter를 구현하지 않고, 생성자를 통해서만 넣을 수 있도록 구성한다.

 

 

두 개념간의 차이에 대한 설명은 (영어긴 하지만) 해당 글에 잘 설명되어있어서 간단한 요약정보만 가져오려고 한다.

  • Entity는 식별자를 가지나, 값 객체는 갖지 않는다.
  • 값 객체는 변경할 수 없으며 매번 새롭게 생성해야 하나, 엔티티는 변경 가능하다.
  • 값 객체는 항상 하나 또는 여러 엔터티에 속해야 하며 자체적으로는 DB에 들어갈 수 없다.
  • 값 객체는 데이터베이스에 자체 테이블이 없어야 한다.

 

 

 

 

추가 자료 - "객체지향의 설계와 사실" 저자이신 조영호 개발자님의 인터뷰 

더보기
조영호 님 : 도메인은 저희 입장에서 소프트웨어를 개발하는 대상 영역정도로 생각해도 무방합니다. 택시 앱을 만든다면 택시 기사님께 콜을 하고, 탑승하고, 요금을 지불하는 전 과정이 도메인이 됩니다. 물론 프로젝트를 할 때는 이 중에서 소프트웨어로 개발될 범위로 한정해서 범위를 좁하게 됩니다.

 이렇게 개발 대상과 범위를 간단히 도메인이라고 봐도 무방할 것 같습니다. 도메인 모델이란 도메인을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것이라고 보시면 됩니다. 이게 꼭 클래스 다이어그램의 형식으로 표현될 필요는 없지만 객체지향 프로그래밍을 하는 경우에는 일반적으로 클래스 다이어그램의 표기법을 사용해서 도메인 모델을 정리하는게 여러모로 유용합니다.

 이렇게 하는 이유는 객체지향 패러다임에서 사용하는 유사한 기법에 기반하는게 코드와 모델을 유사한 형태로 유지하는데 이롭기도 하고 일단 도메인 모델을 이해하면 그 모델을 기반으로 코드를 쉽게 이해하고 수정할 수 있기 때문이죠. 다른 패러다임인 경우에는 그 패러다임에서 구현하기 쉬운 형태로 작성하면 되겠죠.

 마지막에 아키텍처 상에서 말하는 도메인 모델은 마틴 파울러가 PEAA에서 언급한 것으로 도메인 레이어를 객체지향적으로 구현하는 패턴을 가리키는 용어입니다. 즉 패턴의 일종이고 원래의 도메인 모델과는 약간 거리가 있습니다.

 

참고자료

https://enterprisecraftsmanship.com/posts/entity-vs-value-object-the-ultimate-list-of-differences/

https://doing7.tistory.com/79