시간이 지날수록 Domain나 Entity에 대해 많이 들어왔는데 이 둘을 확실히 구별못하는 것 같아서 개념 정리를 해보려고 한다.

Domain

컴퓨터 프로그래밍 분야에서 문제를 풀기위해 설계된 어떤 소프트웨어 프로그램 에 대한 기능성을 정의하는 연구의 한 영역.

위키피디아의 사전적 의미를 적은 것인데 나름대로 쇼핑몰이라는 소프트웨어 프로그램에 비유하여 이해하기 쉽게 풀어보았다.

예를 들어 한 쇼핑몰이 있고 고객이 상품을 구매하는 기능성을 정의하고자 한다. 그리고 이 기능은 아래와 같은 큰 순서로 진행된다.

  • 상품을 등록한다.
  • 고객이 상품을 구매한다.
  • 고객은 여러개의 상품을 한번에 구매할 수 있다.

"상품 구매"라는 기능을 정의해보니 여러개의 영역으로 나눌 수 있을 것 같다.

즉 내가 개발하는 기능에 필요한 객체들을 도출해낸 것을 도메인이라고 생각하면 될 것 같다.

이러한 도메인의 개념을 Entity와 VO(Value Object)로 나눌 수 있다.

Entity

엔티티는 학교다닐 때 Database 관련 수업에서 자주 들었던 용어이다. 지금까지 이해하기로는 하나의 레코드와 일치하는 객체라고 이해해왔다. DB때와 객체지향언어에서 차이라면 DB에서 레코드는 데이터의 구조체일뿐이지만 객체지향언어에서의 Entity는 데이터 뿐만아니라 행위를 가질 수 있다는게 가장 큰 차이점 인 것 같다. 어쨌든 DB에서나 객체지향언어에서나 Entity란 식별자를 가지고 있어야 한다는 것이다. 식별자를 제외한 데이터가 바뀔지라도 변경 전 데이터가 변경 후 데이터가 같다는 것.

VO(Value Object)

엔티티와 달리 VO는 식별자없이 그저 값만 가지고 있다는 것이 특징이다. 식별자가 없기 때문에 데이터가 바뀌어 버리면 다른 객체가 되어버린다는 것이다.

class User {
    private String userId;
    private String name;
    private int age;
    private Phone phone;
}

class Phone {
    private int phone1;
    private int phone2;
    private int phone3;
    private Telecom telecom;
}

enum Telecom {
    KT,LG,SK
}

위에서 user entity는 식별자를 가지고 있고 식별자를 제외한 age나 name이 바뀌어도 처음 그 객체와 같다. 그러나 Phone클래스 같은 경우 데이터가 바뀌어 버리면 처음의 Phone과는 다른 객체가 되어버린다. 그래서 보통 VO클래스는 변경불가능한 객체로 디자인한다

참고 자료

http://multifrontgarden.tistory.com/186https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EA%B3%B5%ED%95%99)

results matching ""

    No results matching ""