서비스 facades는 일반적으로 stateless 세션 빈으로 구현됩니다. 즉, 리턴 할 수있는 엔티티는 즉시 분리됩니다. 따라서 서비스 facade 비즈니스 메소드의 결과로 반환 된 엔티티 중 일부는 열심히 가져 오는 것이 없으므로 서비스 클라이언트가 내부에 액세스 할 수 없으므로 모든 내부를 열심히 가져와야한다고 생각합니다. 나는 이것이 올바른지, 그리고 특정 상황에서 더 적절할 수있는 다른 방법이 있을지 여부를 알고 싶다. 서비스 facades, 분리 된 엔티티 및 eager fetching
는답변
예를 실질적으로 맞아, 실체는 바로 그들이 만들거나 데이터베이스에서 가져온 회기 빈 메소드에서 반환로 분리되어 감사드립니다. 이는 클라이언트 계층에 지연로드 된 관련 엔티티에 액세스 할 수있는 방법이 없음을 의미합니다. 필자의 직업에서 두 가지 공통 시나리오가 있다고 말할 수 있습니다. 엔티티 및 엔터프라이즈 bean으로 구현 된 비즈니스 티어의 데이터 모델이 클라이언트 티어에서 사용되는 데이터 모델과 완전히 다릅니다. 이 경우 가장 좋은 솔루션은 get 및 set 메소드를 사용하여 일반 Java 객체 인 DTO (데이터 전송 객체)를 만들고 두 레이어간에 데이터를 전송하는 데 사용하는 것입니다. 이 접근법의 가장 큰 단점은 DTO 작성이 길고 지루하고 오류가 발생하기 쉬운 작업이며 비즈니스 논리를 구현하지 않고 순수 bean이거나 로직을 두 계층에 모두 복제해야한다는 것입니다. 특히 두 계층의 데이터 모델이 같고 동작을 재사용하는 경우에 특히 그렇습니다. 이렇게하면 비즈니스 및 클라이언트 계층에서 공유 할 엔터티가있는 고유 한 데이터 모델을 구축하는 두 번째 접근 방식으로 이어지고 코드 작성 및 논리 재사용이 적습니다. 그러나 하나의 레이어에서 다른 레이어로 분리 된 엔티티를 전달하려면 두 가지 선택 만 할 수 있습니다. 즉, 모든 관계를 열심히 선언하거나, 엔티티가 강하게 상호 연결되어 있거나, 게으른 채로 쓰거나, 쓸 수 없을 정도로 많은 객체를 메모리에로드 할 위험이 있습니다. 돌아 가기 전에 필요한 모든 필드를로드하기 위해 Facade 메소드를 신중하게 사용하십시오. 필자는 최근 엔티티 연결 그래프가 거의 완벽한 현실 세계 프로젝트에 직면 해 있습니다. 이로 인해 게으른 관계로드를 선호하고 필요한 많은 관련 항목을 채우기 위해 너무 많은 코드 줄을 작성하는 것을 피할 수있었습니다. 서비스 facade 메소드에서 반환 된 각 엔티티, 우리는 DTO에 의지하고 클라이언트 유스 케이스의 각 클래스에 대해 모델 중 하나를 모델링하고 일반 메소드를 사용하여 엔티티를 해당 DTO로 자동 변환합니다.
종합적인 답변을 주셔서 감사합니다. Facade 메소드에서 관련 엔티티를로드하는 것은 관련 엔티티를 "얻는 것"만큼 간단 할 수 있습니다. 그리고 일반적인 변환 방법에 대해 좀 더 자세히 설명해 주시겠습니까? –
네, get 메소드를 호출하면되지만 어쨌든 성가신 일이며 불분명하고 코드가 흐트러 질 수 있습니다. 일반적인 변환 방법에 관해서는, 당신이 직접 코드를 작성할 수 있습니다. 예를 들어, 해당 엔티티 클래스의 객체를 매개 변수로 사용하여'new new DTO (obj)'로 간단히 리턴하는 생성자로 DTO를 생성 할 수 있습니다. 너무 많은 엔터티가 있고보다 유연하고 구성 가능한 솔루션을 목표로한다면 [ModelMapper] (http://modelmapper.org/)와 같은 매핑 라이브러리를 사용할 수 있습니다. – remigio