2009-09-16 4 views
1

본인은 DTO 및 법인 (예 : PersonDTO 및 Person)을 보유하고 있습니다. 나는 DTOC를 입력 받아 내부적으로 PersonService를 호출하는 PersionApplciation을 가진 DDD를 사용하여 복제본을 만들었습니다. PersonService에서 나는 PersonFactory를 사용하는 Person의 인스턴스를 얻는다. (DTO로부터 값을 설정하고 Person 엔티티에 값을 설정한다.) Person의 인스턴스를 얻은 후에 personRepository의 add 메소드를 호출하여 레코드를 DB에 저장한다. 다시 묻는 방법에서는 personApplication에 DTO를 반환해야합니다. 이를 위해 personService에서 접근법을 사용합니다. Person 엔터티를로드하고 personDTO를 채우고 personDTO를 personService로 반환하고 PersonService가 personApplication으로 DTO를 반환하는 PersonRepository를 호출합니다.저장소에 DTO가있을 수 있습니까?

내가하고있는 방식이 옳은가 틀린가요?

답변

1

디자인이 거의 100 % 맞지 않거나 100 % 잘못 설정되는 경우는 드뭅니다. 디자인에 대한 질문을하고, 의사 결정에 도전하고, 논리적 인 방어를 통해 추론하도록 강요하는 것이 좋습니다.

예를 들어 PersonDTO가 불필요하다고 생각합니다. 두 작업 모두에 대해 Person 엔티티를 사용하면 안되는 이유는 무엇입니까? 거의 모든 데이터 필드가 DTO 객체와 동일합니다. Person을 변경하면 두 개의 클래스를 업데이트해야합니다.

DDD는 또한 팩토리 및 저장소 논리에 가장 적합한 위치가 Entity 클래스 자체 내에 있음을 제안합니다. 예를 들어 Person 객체에는 데이터베이스에 변경 사항을 유지하는 save()라는 인스턴스 메서드가있을 수 있습니다. 이러한 지속성에 대한 논쟁은 일반적으로 많은 작업 (ORM에 대한 모든 생각) 이었으므로 (합법적으로) 분리되어야합니다. JPA, JCR 및 Hibernate, NHibernate, TopLink 등과 같은 프레임 워크와 같은 현대적인 지속성 API는 Entity의 지속성을 한 줄짜리로 만듭니다. 마찬가지로 Factory를 정적 (클래스) 팩토리 메소드로 만들면 Factory를 Person Entity로 가져올 수 있습니다. 이러한 변경은 선택 사항이지만 사람은 스스로를 구축하고 유지하는 방법을 알아야한다는 아이디어가 있습니다.

마지막으로 서비스 계층을 갖는 것은 다소 논쟁의 여지가 있습니다. 당신은 마틴 파울러 (Martine Fowler)와 같이 서비스 계층을 사용하지 않는 OOD 위대한 사람들이 있습니다 (이 논리는 도메인에 속합니다). 그러나 동시에 선택하는 사람들을 방어합니다. 서비스 레이어가 트랜잭션 레이어와 API 내보내기 레이어로 유용하다는 것을 알았습니다. 서비스 API를 RMI 또는 웹 서비스로 여는 것이 좋습니다.

관련 문제