도메인 객체와 엔티티 객체 분리 시 객체 그래프 탐색 관련 질문
안녕하세요. 김영한 선생님의 강의를 참 잘 보고 있는 학생입니다.
SQL 중심적인 개발의 문제점 편에서, 객체지향 프로그래밍에서 객체는 자유롭게 객체 그래프를 탐색할 수 있어야하지만 SQL로 개발하는 경우에는 처음 실행하는 SQL에 따라 탐색 범위가 결정된다는 문제가 있다고 말씀하셨습니다.
그리고 엄격한 도메인 주도 설계의 관점에서는 '도메인 객체'와 '엔티티 객체'를 분리해야 한다고 알고 있습니다. 비즈니스 로직을 다루는 도메인 객체가 JPA라고 하는 기술에 의존하는 것은 영 즐거운 일은 아니기 때문이죠..
그렇기 때문에 도메인 객체와 엔티티 객체를 분리하게 된다면 Repository 계층에서 예를 들어 findById를 했을 경우 엔티티 객체를 도메인 객체로 매핑해서 돌려주어야 합니다.
그런데 이럴 경우, 기존의 SQL로 개발하는 경우와 비슷한 문제가 발생하게 되는 것 같습니다. 매핑을 어디까지해서 돌려주어야 하느냐는 점이죠.

Member를 조회했을 때, 객체 그래프 안에 있는 Category까지 싹싹 다 조회해와서 매핑을 해주기도 곤란한 노릇이고, MemberWithTeam, MemberWithOrderAndOrderItem... 와 같은 객체를 따로 따로 만드는 것도 요상해보입니다. 그렇다고 객체 그래프를 다 끊어놓자니 그것도 객체지향적이지 않은 것 같아보이구요..
이런 상황에서는 어떤 식으로 도메인 객체를 설계하는지, 엔티티 객체의 매핑은 어떤 방법으로 이루어지는지가 너무 궁금합니다.
답변 1
3
안녕하세요. Octoping님
모든 아키텍처에는 트레이드 오프가 있습니다.
특히 도메인 객체와 엔티티 객체를 분리하는 것은 매우 큰 트레이드 오프가 있습니다.
장점: 구현을 JPA 대신에 다른 것으로 변경할 때 이점을 얻을 수 있습니다.
단점: JPA가 제공하는 지연로딩을 포함한 수 많은 기능을 사용할 수 없습니다.
이런 트레이드 오프를 생각하고 본인의 프로젝트에 맞는 방법을 적용하는 것이 필요합니다.
제 경험상 대부분의 프로젝트에서 이 둘을 분리하면 얻는 것 보다 잃는 것이 훨씬 많습니다. 특히 생산성 측면에서 비슷한 코드를 계속 작성해야 하고, 또 JPA가 제공하는 수 많은 기능들을 사용할 수 없습니다.
프로젝트에서 엔티티가 아주 단순하고, 구현을 변경해야 할 가능성이 높다면 그때는 분리하는 것의 이점을 얻을 수 있습니다.
도움이 되셨길 바래요.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
22
2
inheritance startegy 선택시 고려사항
0
22
1
Entity 동등성 비교
0
18
1
실무 조언 관련 질문입니다.
0
46
1
H2데이터베이스 파일 생성
0
56
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
52
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
51
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
93
2
UnsupportedOperationException 발생
0
86
3
H2 Database 연결이 안됩니다.
0
92
2
연관관계 매핑 질문드립니다.
0
85
2
h2데이터베이스 실행오류
0
107
2
persistence.xml
0
106
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
65
1
JPA 프록시
0
94
1
Native Query와 MyBatis
0
68
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
85
1
임베디드 타입 예시 코드 관련 질문
0
114
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
94
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
143
1





