인프런 커뮤니티 질문&답변

jungjin1.kim님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

domain과 repository 구현 상세를 분리하고자 할 때 entity 디자인

20.11.11 18:17 작성

·

1.7K

4

안녕하세요. 김영한 강사님 애청자(?) 입니다.ㅎ

JPA를 이용한 시스템 설계를 할 때 궁금한 점이 있어서 질문을 남깁니다.

1. DDD에 따르면 도메인 레벨에서 핵심 비즈니스 로직을 구현하라고 되어있습니다.

그런데 핵심 비즈니스 로직은 대부분이 JPA의 Entity일 가능성이 큰데 이렇게 되면

인프라 기술인 JPA에 의존성을 가지게 됩니다. 아무래도 설계는 줄건 주고 받을 건 받은

트레이드 오프 관계이다 보니 상황에 맞게끔 해야하겠지만 저는 자꾸 도메인에서 Entity를

빼고 싶은 마음이 자꾸 듭니다.  어디쪽이 더 실무에 들어맞는지 궁금합니다.

2. 1번에서 유래된 질문인데 도메인과 인프라 기술을 프로젝트로 분리시켜서 사용할 때 입니다.

같은 도메인(비즈니스 로직)을 사용하더라도 JPA를 사용 가능한 사이트가 있고, 그렇지 않은 사이트가 있기 때문에

분리한 케이스인데, 이렇게 설계하다보니 도메인 계층은 객체지향적으로 설계가 잘 됩니다만, 

Repository 쪽은 Entity가 트랜잭션 스크립트 처럼 데이터만 수정하는 꼴이되버립니다.

이건 어쩔 수 없는 건가요? 

 이전에 비슷한 질문을 드린적이 있는데, 도메인 객체를 엔티티를 변환하고, 엔티티를 도메인 객체로

변환하는 방법에 대해서 여쭤봤으나 너무 어렵게 생각한다고 답변하셨습니다.

이런 경우는 상호간 변환하는 로직이 필요하지 않을까라는 생각이 드는데 강사님 의견이 궁금합니다.

3. 그래서 비즈니스 객체에 Entity를 주입해서 데이터를 활용한 뒤에 다시 Entity에 결과를 집어 넣는

방법으로 해보려고 했으나 Entity는 저장되지만 비즈니스 객체의 필드에 있는 데이터를 저장하기에는

너무 비효율적인것 같습니다. 왜냐하면 비즈니스 객체를 저장하기 위해 비즈니스 객체의 결과를 서비스 계층에 

올려서 Repository를 활용해서 저장할 수 있지만 엔티티는 비즈니스 객체 내에서 저장하고, 비즈니스 객체는

서비스 계층에서 저장행위를 한다는것 자체가 일관성이 없어보입니다.

이 부분도 의견 부탁드립니다.!!

좋은 강의 항상 감사합니다. 강사님 JPA 강의는 모두 다 들었는데 역시 최고입니다.

감사합니다.

답변 1

11

김영한님의 프로필 이미지
김영한
지식공유자

2020. 11. 12. 00:32

안녕하세요. jungjin1.kim님

설계에 대한 좋은 고민이 많으시네요^^

1. 인프라 기술인 JPA에 의존성을 가지게 된다는 부분은 혹시 어떤 점 때문에 그런가요? JPA 애노테이션 때문에 그런지요? 그러면 엔티티 객체를 JPA 에노테이션을 전부 제거하고, xml을 통해서 JPA 설정을 매핑할 수 있는 방법도 있습니다. 이렇게 되면 객체 관점에서 JPA 의존이 전부 빠진 것 처럼 보이겠지요.

하지만 모두 그 방법을 사용하지 않는 것에는 이유가 있겠지요. 마찬가지로 스프링도 과거에는 애노테이션 없이 순수하게 xml로만 매핑했습니다. 코드에 스프링이라는 단어 자체가 보이지 않았지요. 하지만 애노테이션을 사용하면, xml 매핑에 들어가는 공수대비 너무 편리하기 때문에 실용적인 관점에서 애노테이션 정도는 사용하는 방향으로 개발하는 것이 좋다 생각합니다. 이 부분은 스프링을 전부 xml로 설정하고 jpa도 전부 xml로 매핑을 해보면, 그 고통?을 이해할 수 있습니다.

이런 관점에서 질문 전체를 통과하는 답을 드리자면, 엔티티와 도메인 객체를 따로 분리하지 말고, 엔티티 자체를 도메인 객체로 사용하시는 것이 좋습니다. xml로 매핑하면 정말 겉으로 보기에는 순수한, 의존성 없는 코드를 얻으실 수 있겠지만, 애노테이션 정도는 실용적인 관점에서 가지고 가는 것이지요.

2. 제가 질문을 정확히 이해하지 못했습니다. 설계 부분이어서 좀 더 구체적인 예시를 들어주시면 좋을 것 같아요. 특히 다음 부분을 잘 이해를 못했습니다.

"같은 도메인(비즈니스 로직)을 사용하더라도 JPA를 사용 가능한 사이트가 있고, 그렇지 않은 사이트가 있기 때문에 분리한 케이스인데, 이렇게 설계하다보니 도메인 계층은 객체지향적으로 설계가 잘 됩니다만, Repository 쪽은 Entity가 트랜잭션 스크립트 처럼 데이터만 수정하는 꼴이되버립니다." 

3. 여기서도 제가 질문을 정확히 이해하지 못했습니다. 말씀하시는 비즈니스 객체가 무언지 예시를 들어주셔야 할 것 같아요. 그리고 어떻게 했을 때 비효율 적이었는지 구체적인 코드로 설명을 해주시면 좋을 것 같아요.

감사합니다.