source

저장소 패턴 - "복잡한" 엔티티와 어떻게 연동되는가?

ittop 2023. 2. 26. 10:30
반응형

저장소 패턴 - "복잡한" 엔티티와 어떻게 연동되는가?

저장소 패턴을 이해하는 데 어려움이 있습니다.

올바른 저장소 패턴과 같은 주제에 대해 많은 의견이 있지만 저장소 같은 다른 항목도 새로운 Singleton이거나 저장소 사용또는 Spring JPA Data + Hibernate + MySQL + MAVEN을 사용합니다.

많은 기사에 실리는 만큼 어려운 일이 아닐 수 있기 때문에 나는 이 내용을 읽는 것이 지겨워지고 있다.

나는 이렇게 본다:제가 원하는 것은 다음과 같습니다.

         ------------------------------------------------------------------------
         |                            Server                                    |
         ------------------------------------------------------------------------
         |                    |                        |                        |
Client <-|-> Service Layer  <-|->  Repository Layer  <-|-> ORM / Database Layer |
         |                    |                        |                        |  
         ------------------------------------------------------------------------

Service Layer이 걸리다*DTO하다.Repository Layer기본적으로 실체가 어떻게 저장될 수 있는지 아는 "그 사람"에 불과합니다.

예를 들어 일부 툴이 구성되어 있다고 가정합니다(이것은 의사 코드일 뿐입니다).

@Entity
class ToolSet {
  @Id
  public Long id;
  @OneToOne
  public Tool tool1;
  @OneToOne
  public Tool tool2;
}

@Entity
class Tool {
  @Id
  public Long id;
  @OneToMany
  public ToolDescription toolDescription;
}

@Entity
class ToolDescription {
  @Id
  public Long id;
  @NotNull
  @OneToOne
  public Language language

  public String name;
  public String details;
}

못하는 이야.ToolSetDTO오브젝트를 지정합니다.

한 바로는 이렇게 쓸 수요.ToolSetRepositoryToolSetRepository.save(ToolSetDTO toolSetDto)'저장 방법'을 설명하다ToolSetDTO 거의 이 다 하지 않아요.*DTO, ★★★★★★★★★★★★★★★★.Entity★★★★★★ 。

서 것은, 만약 의 것을 알 수 있다는 이다.ToolSet위의 예에서는 다음 단계를 수행해야 합니다.

  1. toolSetDto.null
  2. 「」에 tool*Dto by toolSetDto
    경우 a) ID에서 합니다.DTO로로 합니다.Entity 않으면 새로운 엔트리를 .
    b)toolDescriptionDto새 엔트리를.
  3. 후, 인스톨을 실시합니다.ToolSet합니다.

이 모든 것은 서비스 기능(클라이언트용 인터페이스)에 단순히 이것을 처리하도록 하기에는 너무 복잡합니다.

하고 있던 것은 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아...ToolSetRepository서의

  • a a a a a a a a a a a a a?ToolSet 엔티티 중 어느 하는가.DTO 오브젝트?
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★.*Repository다른 저장소 개체를 사용할 수 있습니까?예를 들어 내가 저장하고 싶을 때ToolSet는 저장해야 .Tool ★★★★★★★★★★★★★★★★★」ToolDescription첫 번째 - 사용하시겠습니까?ToolRepository ★★★★★★★★★★★★★★★★★」ToolDescriptionRepository에 inside inside inside ToolSetRepository무슨 일입니까?
    이 경우: 저장소 패턴이 깨지지 않는 이유는 무엇입니까?내 다른 ORM에 를 추가하는 *Repository이치노

내가 왜 이걸 이해할 수 없는지 모르겠어.그렇게 복잡하게 들리진 않지만 여전히 도움의 손길이 있습니다Spring Data또 하나 마음에 걸리는 건 이게 어떻게 쉬운지 모르겠다는 거예요.특히, 이미 휴지 상태를 사용하고 있기 때문에, 메리트를 알 수 없습니다(하지만, 다른 질문일 수도 있습니다).

그래서.. 이게 긴 질문인건 알지만 난 이미 며칠간의 조사를 했어.지금 작업 중인 기존 코드가 있는데 이 패턴을 볼 수 없기 때문에 엉망이 되기 시작합니다.

Repository Pattern의 매우 간단한 예를 구현하는 것만으로 끝나지 않는 대부분의 기사나 튜토리얼보다 더 큰 그림을 얻을 수 있기를 바랍니다.

저의 "더미를 위한 저장소" 게시물을 읽고 저장소의 간단한 원리를 이해할 수 있습니다.문제는 DTO를 사용하는데, 이 시나리오에서는 실제로 저장소 패턴을 사용하는 것이 아니라 DAO를 사용하는 것입니다.

저장소와 dao의 주요 차이점은 저장소는 호출 계층에서 인식되는 개체만 반환한다는 것입니다.대부분의 경우 저장소는 비즈니스 계층에서 사용되므로 비즈니스 개체를 반환합니다.dao는 전체 비즈니스 개체일 수도 있고 아닐 수도 있는 데이터를 반환합니다. 즉, 데이터가 올바른 비즈니스 개념이 아닙니다.

비즈니스 객체가 단순한 데이터 구조일 경우 모델링 문제(예: 설계 불량)가 있음을 암시할 수 있습니다.저장소는 '풍부한' 개체 또는 최소한 적절하게 캡슐화된 개체로 더욱 적합합니다.데이터 구조만 로드/저장하는 경우 저장소는 필요하지 않을 수 있습니다.

다른 오브젝트(애그리게이트)로 구성된 비즈니스 오브젝트를 취급하는 경우 일관성(애그리게이트 루트)을 유지하기 위해 해당 오브젝트에 모든 부분이 필요한 경우 저장소 패턴이 모든 지속성 세부사항을 추상화하기 때문에 최적의 솔루션입니다.앱에서 '제품'을 요청하면 개체를 복원하는 데 필요한 테이블이나 쿼리의 수에 관계없이 저장소에서 '제품' 전체를 반환합니다.

코드 샘플에 따르면 '실제' 비즈니스 개체가 없습니다.Hibernate에서 사용하는 데이터 구조가 있습니다.비즈니스 오브젝트는 비즈니스 개념과 사용 사례에 따라 설계됩니다.저장소를 통해 BL은 해당 객체가 유지되는 방법에 대해 신경 쓰지 않을 수 있습니다.어떤 면에서 저장소는 개체와 지속할 모델 사이에서 '컨버터/매퍼' 역할을 합니다.기본적으로 는 지속성 데이터에 필요한 오브젝트를 '축소'합니다.

비즈니스 개체가 ORM 엔티티가 아닙니다.기술적인 관점에서는 생각할 수 있습니다만, 설계상의 관점에서는, 비즈니스상의 것을 다른 모델의 영속적인 것으로 합니다.대부분의 경우 이들은 직접 호환되지 않습니다.

가장 큰 실수는 스토리지 요구와 사고방식에 따라 비즈니스 객체를 설계하는 것입니다.많은 개발자들이 생각하는 것과 달리 ORM의 목적은 비즈니스 객체를 지속하는 것이 아닙니다.목적은 rdbms 위에 있는 'oop' 데이터베이스를 시뮬레이션하는 것입니다.ORM 매핑은 앱 개체(비즈니스 개체를 다룰 때는 더 적음)와 테이블이 아니라 db 개체와 테이블 간에 이루어집니다.

언급URL : https://stackoverflow.com/questions/31305199/repository-pattern-how-to-understand-it-and-how-does-it-work-with-complex-en

반응형