4.1 JPA를 이용한 리포지터리 구현

객체 기반의 도메인 모델과 관계형 데이터 모델 간의 매핑을 처리하는 기술로 ORM 만한 것이 없다.

4.1.1 모듈위치

리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 DIP로 인해 인프라스트럭처 영역에 속한다.

팀 표준에 따라 리포지터리 구현 클래스를 domain.impl과 같은 패키지에 위치 시킬 때도 있는데 이것은 인터페이스와 구현체를 분리하기 위한 것 뿐 좋은 설계 원칙을 따르는 것은 아니다.

가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치 시켜서 인프라스트럭처에 대한 의존을 낮춰야 한다.

Untitled

4.1.2 리포지터리 기본 기능 구현

리포지터리가 제공하는 기본 기능은 다음 두가지이다.

//애그리거트 조회,저장 레포지터리 인터페이스
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);
	}
}