객체 기반의 도메인 모델과 관계형 데이터 모델 간의 매핑을 처리하는 기술로 ORM 만한 것이 없다.
리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 DIP로 인해 인프라스트럭처 영역에 속한다.
팀 표준에 따라 리포지터리 구현 클래스를 domain.impl과 같은 패키지에 위치 시킬 때도 있는데 이것은 인터페이스와 구현체를 분리하기 위한 것 뿐 좋은 설계 원칙을 따르는 것은 아니다.
가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치 시켜서 인프라스트럭처에 대한 의존을 낮춰야 한다.
리포지터리가 제공하는 기본 기능은 다음 두가지이다.
//애그리거트 조회,저장 레포지터리 인터페이스
public interface OrderRepository {
Order findById(OrderNo no);
void save(Order order);
}
findById()는 ID에 해당하는 애그리거트가 존재하면 Order를 리턴하고 존재하지 않으면 NULL을 리턴한다. NULL을 사용하고 싶지 않다면 다음과 같이 Optional을 사용해도 된다.
Optional <Order> findById(OrderNo no);
JPA의 EntityManger를 이용해서 기능을 구현한다.
@Repository
public class JpaOrderRepository implements OrderRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public Order findById(OrderNo id) {
return entityManager.find(Order.class, id);
}
@Override
public void save(Order order) {
entityManager.persist(order);
}
}