on
Domain 과 Entity 를 분리해보자.
Domain 과 Entity 를 분리해보자.
자바 스프링 + JPA 건 마이바티스를 하다보면 이런 문제점이 생긴다.
첫번째로, Entity Class 에 너무 많은 로직을 넣어서 뚱뚱해지는 Entity Class
뭐 당연히 이 Entity 가 잘못설계되었거나, DB 가 잘못 설계 되었을 수 있다고 이야기 할 수 있으나
현업의 코드에는 이런 부분들이 상당하다.
나중에는 어떤 상태값을 변경하는지 알수 없을 정도로 복잡해지는데
이는 응집도는 높다고 말할 수 있지만, 필요한 코드를 찾는데 상당히 오래걸리게 되는 일들이 발생한다.
우리가 비즈니스에서 필요한건 어떤 도메인 문제를 해결하는 객체인지를 아는 것이 중요하다.
이번 글에서는 Domain 계층에 Domain 로직을 만들고 Entity 는 Persistence Layer 에서만 운용되도록 해볼것이다.
아래 코드를 한번 보자.
@Entity public class Account { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private int money; public void deposit(int money) { this.money += money; } public int withdraw(int money) { this.money -= money; return money; } public int getMoney() { return money; } }
deposit, withdraw 등 하나씩 Entity 에 Method 가 생기기 시작한다.
지금은 많이 없지만, 만약 관리해야할 데이터가 진짜 많다면 더 많은 메소드가 존재할 것이다.
그리고 위의 Class 를 봤을때 한가지 문제가 또 존재하는데
money 라는 것은 현실 세계의 "돈" 과 매칭되는 속성인데, int 타입으로는 "돈" 이라는 오브젝트를 표현하기 힘들다.
우리의 DB 에는 물론 DB Type 에 맞춰 int 로 저장해야 하지만,
실상 우리의 비즈니스 로직에서는 Money(0~엄청 큰 숫자) 로 이용된다.
따라서 우리는 이럴때 Value Object 를 이용하고는 한다.
하지만, DB 와 직접적인 관계를 맺는 Persistence Layer 는 건드리지 않고
Domain Layer 에 새로운 Domain Entity 를 추가해보려고 한다.
일단 돈을 나타내는 객체로 쓰일 Money 를 간단하게만 만들어 놓자.
그리고 이제 Domain Entity 를 만들어보자.
아까 int 로 money 를 표현할때보다 훨씬 더 표현력이 풍부해졌다.
또한 이제는 Domain Layer 에 Domain Logic 이 존재하게 되었다.
즉, 이제는 Entity 영역에서의 Domain Logic 을 지워줘도 된다.
이제 간단하게 서비스를 하나 만들어보자.
1. 유저가 돈을 입금다.
2. 유저 개인 계좌에 돈이 입금된다.
일단 도메인 엔티티를 엔티티로 변환해줄 port 를 하나 만들어보자.
이제 port package 에 가서 Persistence 객체로 변환해주는 포트를 만들어주자
이렇게 하고 나면 아래와 같이 Service 코드가 간단하게 작성될 것이다.
Service 는 추상화된 인터페이스 계층에 의존하고 있고
의존성 역전을 통해서 외부에서 의존성이 주입된다.
따라서 Domain Logic 은 고립되게 되고 나가거나 들어오는 통로는 오로지 Port 뿐이다.
작성하며..
예시가 너무 작은 Entity 라 감이 안올수도 있지만
실제 현업코드나 비즈니스 로직이 복잡한 Entity 를 Domain 별로 객체를 만들어서 Domain Logic 에서 사용한다면
꽤 괜찮은 결과를 낼 수 있다고 생각한다.
다만 모든 Entity 에 하는 것은 그렇게 좋은 방향인지는 잘 모르겠지만
도메인 로직이 도배된 뚱뚱한 Entity Class 라면 Domain Entity 로 분리시켜 이용해보는것도 좋다고 생각한다.
예시는 딱 어느정도 감을 잡을 수 있을 정도로만 작성했다. (약간의 대충도 죄송합니다.. ㅠㅠ)
따라서 너무 예시를 따라하기 보다는 감을 잡고 아래 책을 읽거나 코드를 작성해보길 바란다.
참고한 책
http://www.yes24.com/Product/Goods/105138479
from http://devroach.tistory.com/65 by ccl(A) rewrite - 2021-12-17 02:02:03