2014-11-26 2 views
1

새로운 모듈을 설계하고 있으며 다른 개체에 해당하는 서비스와 리포지토리 간의 통신이 "정확한지"알 필요가 있습니다. 예 : Object1과 Object2가 있습니다. Object1은 많은 Object2로 구성됩니다. 그리고이 코드를 가지고 :스프링 기본 : 서비스 저장소 간의 관계

@Repository 
public class Object1Repository{} 

@Repository 
public class Object2Repository{} 

@Service 
public class Object1ServiceImpl{ 

private Object1Repository obj1Repo; 
private Object2Repository obj2Repo; 

} 

@Service 
public class Object2ServiceImpl{ 
private Object2Repository obj1Repo; 
} 

Object1Service에서 직접 Object2Repository를 호출하는 것은 허용되는 습관입니까? 또는 Object1Service에서 Object2Service로 호출하여 해당 서비스에서 object2Repository에 대한 모든 호출을해야합니까?

내 서비스에서 object1을 조작하고있는 동안 object2의 특정 부분을로드해야하며 여러 저장소에 직접 호출하는 것이 좋은 해결책인지 알아야합니다.

이것은 내 책에없는 것으로, 일반적인 연습인지 아니면 아키텍처를 위반하는지 판단하기에 충분한 경험이 없습니다.

감사합니다.

답변

0

리포지토리/데이터 액세스 개체를 다시 사용할 수 있어야합니다. 여러 서비스가 동일한 리포지토리를 참조하도록하는 것이 좋습니다. 또한 무국적이어야하므로 여러 참조가 '아키텍처 파괴'가되어서는 안됩니다.

Object1Service에서 필요로하는 Object2Service의 메소드에 비즈니스 로직이있는 경우 해당 메소드를 호출해야하지만 그렇지 않으면 다른 서비스를 거치지 않고 직접 리포지토리를 호출하는 데 아무런 문제가 없습니다.

주목할 점은 트랜잭션 경계가있는 부분입니다. 두 서비스가 전달에 필요한 트랜잭션 방식이라면 쉽게 처리 할 수 ​​있습니다. 아무 문제없이 혼합 및 일치시킬 수 있습니다. 어떤 이유로 서비스 중 하나는 트랜잭션이지만 다른 하나는 그렇지 않고 일부 저장소는 트랜잭션이지만 다른 저장소는 그렇지 않은 경우, 어떤 종류의 트랜잭션 경계 설정을 수행해야하는지 확인해야합니다. 트랜잭션이되는 것을 지정하지 않는 서비스로부터 트랜잭션을 지정하지 않는 저장소를 호출하십시오.

또한 일반적으로 서비스는 특정 엔티티에 일대일 매핑하지 않아도되므로 서비스가 여러 도메인 개체로 확장되는 것이 일반적입니다. 서비스는 특정 유형의 사용자에 해당 할 수 있습니다.이 메소드는 세부 수준의 사용 사례 (사용자가 수행하는 저수준 작업, 각각 단일 작업 단위로 실행되기를 원할 것입니다)를 구현합니다. 리포지토리는 데이터베이스의 테이블을 기반으로 코드 생성기에서 어느 정도까지 확장 될 수 있지만 서비스의 구현은 반드시 기계적인 것만은 아니며 노출 될 필요가있는 비즈니스 논리에 따라 달라집니다.

+0

응답 해 주셔서 감사합니다. – MarcosTonina