ORM 기법은 조회 기능에 적합하지 않아 상태 변경 모델과 조회 모델을 분리해야 한다.
보통 조회 기능을 구현할 때 여러 애그리거트의 데이터가 필요한 경우가 많다.
하지만 조회 화면 특성상 조회 속도가 빠를수록 좋기 때문에 구현 방법을 고민해야 한다.
식별자를 이용해 애그리거트를 참조하는 방식을 사용하면 즉시 로딩 방식과 같은 JPA의 쿼리 관련 최적화 기능을 사용할 수 없다.
직접 참조하는 방식으로 연결해도 조회 화면 특성에 따라 같은 연관도 즉시 로딩이나 지연 로딩으로 처리해야 하기 때문이다.
이런 문제가 발생하는 이유는 시스템 상태를 변경할 때와 조회할 때 단일 도메인 모델을 사용하기 때문이다.
ORM 기법은 도메인 상태 변경 기능을 구현하는 데는 적합하지만 여러 애그리거트에서 데이터를 가져와 출력하는 기능을 구현하기에는 고려할 게 많아 구현을 복잡하게 만드는 원인이 된다.
구현 복잡도를 낮추기 위해 상태 변경 모델과 조회 모델을 분리하는 것이다.
지금까지 개발을 하며 복잡한 쿼리나 여러 도메인의 데이터를 이용하는 조회 기능을 구현할 때 객체로서 연관을 만들어 구현하는 것은 힘들다는 것을 느꼈다.
QueryDSL과 같은 라이브러리를 통해 구현할 때 VO 객체를 만들어 상태 변경 모델과 조회 모델을 분리했었다.
때문에 단일 모델의 단점과 모델 분리의 장점 모두 잘 와닿았다.