ProgramingTip

리포지토리 패턴-이를 이해하는 방법과 "복잡한"엔터티와 어떻게 작동합니까?

bestdevel 2020. 11. 18. 09:32
반응형

리포지토리 패턴-이를 이해하는 방법과 "복잡한"엔터티와 어떻게 작동합니까?


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

저장소 패턴 과 같은 주제에, 대한 많은 의견이 있지만 저장소 와 같은 다른 항목 은 새로운 싱글 이거나 DAO를 사용하지 마십시오 저장소 사용를 하거나 스프링 JPA 데이터 + 최대 절전 모드 + MySQL의 + MAVEN을 사용하십시오 . 리포지토리는 DAO 개체와 시청합니다.

나는 그렇게 많은 기사에 표시되는 것이 그렇게 어렵 기 때문에 나는 그것이 지쳤습니다.

나는 그것을 다음과 같이 본다 : 내가 원하는 것은 다음과 같은 것 같다 :

         ------------------------------------------------------------------------
         |                            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클라이언트로부터 물건을 얻는다 .

내가 그것을 알 수있는 ToolSetRepository방법으로 지금까지 내가 쓸 수있는 방법으로 ToolSetRepository.save(ToolSetDTO toolSetDto)"라는 저장 방법을 알고 A"를 ToolSetDTO. 거의 모든 튜토리얼 그러나은 통과하지 않습니다 *DTO하지만를 Entity대신.

여기서 나를 괴롭히는 것은 ToolSet위의 예를 들어 보면 다음 단계를 수행해야한다는 것입니다.

  1. toolSetDto일치하지 않은 경우 가져 오기와 확인null
  2. tool*Dto소유 한 추가에 대해 toolSetDto
    a) 유효한 ID가있는 경우에 변환 DTO하여 Entity명명 새 데이터베이스 항목을 만듭니다.
    b) 데이터베이스 toolDescriptionDto로 변환 / 저장하거나 새 항목을 만듭니다.
  3. 위의 인스턴스 ToolSet(엔티티)를 확인 하고 데이터베이스에 유지하도록 설정 한 후

이 모든 것이 너무 복잡해서 서비스 기능 (클라이언트 용 인터페이스)이 처리 할 수 ​​없습니다.

내가 생각했던 것이 예를 들어 만드는 ToolSetRepository것이지만 여기서 질문은

  • ToolSetobject-를 사용 엔티티 합니까, 아니면 object-를 사용 DTO합니까?
  • 어쨌든 : 다른 저장소 개체 *Repository사용할있습니까? 내가 저장할 때처럼 ToolSet하지만 난 저장해야 Tool하고 ToolDescription첫째 - 내가 사용하는 것이 ToolRepositoryToolDescriptionRepository내부 ToolSetRepository?
    그렇다면 : 리포지토리 패턴을 깨지 않는 이유는 무엇입니까? 이 패턴이 기본적으로 서비스와 내 ORM 프레임 워크 사이의 계층 인 경우 *Repository종속성 이유 때문에 다른 클래스 에 종속성을 추가하는 것이 "올바른 느낌"이 아닙니다 .

나는 왜이 문제에 대해 고개를 돌릴 수 없는지 모르겠습니다. 그렇게 복잡하게 들리지 않지만 여전히 Spring Data. 이 만드는 방법을 정말 보지 않기 때문에 나를 괴롭히는 또 다른 것은 아무것도 쉽게. 특히 저는 이미 Hibernate를 사용하고 있기 때문에 이점이 보이지 않습니다 (하지만 다른 질문 일 수도 있습니다).

그래서 .. 나는 이것이 긴 질문이라는 것을 알고 있지만 이미 며칠 동안 연구를했습니다. 이 패턴을 통해 볼 수 없기 때문에 지금 작업중인 기존 코드가 엉망이되기 시작합니다.

리포지토리 패턴의 매우 간단한 예제를 구현하는 것 이상으로 끝나지 않는 대부분의 기사와 튜토리얼보다 누군가가 나에게 더 큰 그림을 줄 수 있기를 바랍니다.


저장소 의 간단한 원리 를 이해하기 위해 내 "입문자 용 저장소" 게시물읽을 수 있습니다 . 문제는 DTO로 작업하고 있으며 해당 시나리오에서 실제로 저장소 패턴을 사용하지 않고 DAO를 사용하고 있다는 것입니다.

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

비즈니스 객체가 데이터 구조 일 뿐이라면 모델링 문제, 즉 잘못된 디자인이 있다는 힌트가 될 수 있습니다. 저장소는 '풍부한'또는 적어도 적절하게 캡슐화 된 객체를 사용하면 더 의미가 있습니다. 데이터 구조를로드 / 저장하는 중이라면 저장소가 필요하지 않을 수도 있습니다. orm이면 충분합니다.

다른 객체 (집계)로 구성된 비즈니스 객체를 다루고 있고 그 객체가 일관성을 유지 하기 위해 모든 부분을 필요로하는 경우 (집계 루트) 저장소 패턴은 모든 지속성 세부 정보를 추상화하므로 최상의 솔루션입니다. . 앱은 '제품'만 요청하고 저장소는 개체를 복원하는 데 필요한 테이블 또는 쿼리 수에 관계없이 전체적으로 반환합니다.

코드 샘플에 따르면 '실제'비즈니스 객체가 없습니다. Hibernate에서 사용하는 데이터 구조가 있습니다. 비즈니스 오브젝트는 비즈니스 개념 및 사용 사례를 기반으로 설계되었습니다. 저장소를 사용하면 BL이 해당 객체가 지속되는 방식에 신경 쓰지 않도록 할 수 있습니다. 어떤 의미에서 리포지토리는 객체와 지속될 모델 사이의 '변환기 / 매퍼'역할을합니다. 기본적으로 리포지토리는 지속성 데이터에 필요한 개체를 '축소'합니다.

비즈니스 오브젝트는 아니다 entity.It는 ORM 수있는 기술적 인 관점에서,하지만 물건 지속성 디자인 POV에서, 하나의 모델 사업의 물건을 다른 모델. 많은 경우 이들은 직접적으로 호환되지 않습니다.

가장 큰 실수는 스토리지 요구와 사고 방식에 따라 비즈니스 객체를 디자인하는 것입니다. 그리고 많은 개발자들이 믿는 것과는 반대로 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

반응형