리포지토리 패턴-이를 이해하는 방법과 "복잡한"엔터티와 어떻게 작동합니까?
저장소 패턴을 이해하는 데 어려움을 겪고 있습니다.
저장소 패턴 과 같은 주제에, 대한 많은 의견이 있지만 저장소 와 같은 다른 항목 은 새로운 싱글 이거나 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
위의 예를 들어 보면 다음 단계를 수행해야한다는 것입니다.
toolSetDto
일치하지 않은 경우 가져 오기와 확인null
tool*Dto
소유 한 추가에 대해toolSetDto
a) 유효한 ID가있는 경우에 변환DTO
하여Entity
명명 새 데이터베이스 항목을 만듭니다.
b) 데이터베이스toolDescriptionDto
로 변환 / 저장하거나 새 항목을 만듭니다.- 위의 인스턴스
ToolSet
(엔티티)를 확인 하고 데이터베이스에 유지하도록 설정 한 후
이 모든 것이 너무 복잡해서 서비스 기능 (클라이언트 용 인터페이스)이 처리 할 수 없습니다.
내가 생각했던 것이 예를 들어 만드는 ToolSetRepository
것이지만 여기서 질문은
ToolSet
object-를 사용 엔티티 합니까, 아니면 object-를 사용DTO
합니까?- 어쨌든 : 다른 저장소 개체
*Repository
를 사용할 수 있습니까? 내가 저장할 때처럼ToolSet
하지만 난 저장해야Tool
하고ToolDescription
첫째 - 내가 사용하는 것이ToolRepository
및ToolDescriptionRepository
내부ToolSetRepository
?
그렇다면 : 리포지토리 패턴을 깨지 않는 이유는 무엇입니까? 이 패턴이 기본적으로 서비스와 내 ORM 프레임 워크 사이의 계층 인 경우*Repository
종속성 이유 때문에 다른 클래스 에 종속성을 추가하는 것이 "올바른 느낌"이 아닙니다 .
나는 왜이 문제에 대해 고개를 돌릴 수 없는지 모르겠습니다. 그렇게 복잡하게 들리지 는 않지만 여전히 Spring Data
. 이 만드는 방법을 정말 보지 않기 때문에 나를 괴롭히는 또 다른 것은 아무것도 쉽게. 특히 저는 이미 Hibernate를 사용하고 있기 때문에 이점이 보이지 않습니다 (하지만 다른 질문 일 수도 있습니다).
그래서 .. 나는 이것이 긴 질문이라는 것을 알고 있지만 이미 며칠 동안 연구를했습니다. 이 패턴을 통해 볼 수 없기 때문에 지금 작업중인 기존 코드가 엉망이되기 시작합니다.
리포지토리 패턴의 매우 간단한 예제를 구현하는 것 이상으로 끝나지 않는 대부분의 기사와 튜토리얼보다 누군가가 나에게 더 큰 그림을 줄 수 있기를 바랍니다.
저장소 의 간단한 원리 를 이해하기 위해 내 "입문자 용 저장소" 게시물 을 읽을 수 있습니다 . 문제는 DTO로 작업하고 있으며 해당 시나리오에서 실제로 저장소 패턴을 사용하지 않고 DAO를 사용하고 있다는 것입니다.
저장소와 dao의 주요 차이점은 저장소가 호출 계층에서 이해하는 객체 만 반환 한다는 것 입니다. 대부분의 경우 저장소는 비즈니스 계층에서 사용되므로 비즈니스 개체를 반환합니다. dao는 전체 비즈니스 객체 일 수도 있고 아닐 수도있는 데이터를 반환합니다. 즉, 데이터가 유효한 비즈니스 개념이 아닙니다.
비즈니스 객체가 데이터 구조 일 뿐이라면 모델링 문제, 즉 잘못된 디자인이 있다는 힌트가 될 수 있습니다. 저장소는 '풍부한'또는 적어도 적절하게 캡슐화 된 객체를 사용하면 더 의미가 있습니다. 데이터 구조를로드 / 저장하는 중이라면 저장소가 필요하지 않을 수도 있습니다. orm이면 충분합니다.
다른 객체 (집계)로 구성된 비즈니스 객체를 다루고 있고 그 객체가 일관성을 유지 하기 위해 모든 부분을 필요로하는 경우 (집계 루트) 저장소 패턴은 모든 지속성 세부 정보를 추상화하므로 최상의 솔루션입니다. . 앱은 '제품'만 요청하고 저장소는 개체를 복원하는 데 필요한 테이블 또는 쿼리 수에 관계없이 전체적으로 반환합니다.
코드 샘플에 따르면 '실제'비즈니스 객체가 없습니다. Hibernate에서 사용하는 데이터 구조가 있습니다. 비즈니스 오브젝트는 비즈니스 개념 및 사용 사례를 기반으로 설계되었습니다. 저장소를 사용하면 BL이 해당 객체가 지속되는 방식에 신경 쓰지 않도록 할 수 있습니다. 어떤 의미에서 리포지토리는 객체와 지속될 모델 사이의 '변환기 / 매퍼'역할을합니다. 기본적으로 리포지토리는 지속성 데이터에 필요한 개체를 '축소'합니다.
비즈니스 오브젝트는 아니다 entity.It는 ORM 수있는 기술적 인 관점에서,하지만 물건 지속성 디자인 POV에서, 하나의 모델 사업의 물건을 다른 모델. 많은 경우 이들은 직접적으로 호환되지 않습니다.
가장 큰 실수는 스토리지 요구와 사고 방식에 따라 비즈니스 객체를 디자인하는 것입니다. 그리고 많은 개발자들이 믿는 것과는 반대로 ORM 목적은 비즈니스 객체를 유지하는 것이 아닙니다. 그 목적은 rdbms 위에 'oop'데이터베이스를 시뮬레이션하는 것입니다. ORM 매핑은 앱 개체 (비즈니스 개체를 처리 할 때 더 적음)와 테이블간에가 아니라 db 개체와 테이블간에 이루어집니다.
'ProgramingTip' 카테고리의 다른 글
“geom_histogram”을 사용할 때“unit (tic_pos.c,”mm“) : 'x'및 'units'의 길이가 0보다 커야합니다. (0) | 2020.11.18 |
---|---|
JavaScript 유형 타입 시스템은 고전적인 클래스 시스템을 모방하는 것 이상으로 무엇을 할 수 있습니까? (0) | 2020.11.18 |
Eclipse 프로젝트에서 사용 된 미사용 항아리 찾기 (0) | 2020.11.18 |
HTML 속성 이름에 허용되는 문자는 무엇입니까? (0) | 2020.11.18 |
C # 변수 범위 지정 : 'x'는 'x'에 다른 의미를 부여 할 수 없습니다. (0) | 2020.11.18 |