1. JPA를 이용한 리포지터리 구현

2. 리포지터리 기본 기능 구현

public interface OrderRepository {
	public Order findById(OrderNo no);
	public void save(Order order);
}

→ 인터페이스는 애그리거트 루트를 기준으로 작성한다.

@Repository
public class JpaOrderRepository implements OrderRepository {
	@PersistenceContext
	private EntityManaver entityManager;

	@Override
	public Order findById(OrderNo id){
		return entityManager.find(Order.class,id);
	}
	@Override
	public void save(Order order) {
		entityManager.persist(order);
	}
}
public class ChangeOrderService {
	@Transactional
	public void changeShippingInfo(OrderNo no, ShippingInfo newShippingInfo) {
		Order order = orderRepository.findById(no);
		if (order == null) throw new OrderNotFoundException();
		order.chagneShippingInfo(newShippingInfo);
	}
...
}

→ changeShippingInfo() 메서드는 스프링 프레임워크의 트랜잭션 관리 기능을 통해 트랜잭션 범위에서 실행된다.

→ 메서드 실행이 끝나면 트랜잭션을 커밋하는데, 이때 JPA는 트랜잭션 범위에서 변경된 객체의 데이터를 DB에 반영하기 위해 자동으로 UPDATE 쿼리를 실행한다.