리포지터리의 기본 기능
인터페이스 형식
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 쿼리를 실행한다.