5

이 질문은 Grails 애플리케이션에서의 작업에서 비롯된 것이지만 레이어로 개발 된 거의 모든 웹 애플리케이션에 적용됩니다. 다음은 간단한 예입니다.서비스 계층 메서드는 인스턴스 또는 ID를 사용해야합니까?

class OrderService { 

    // Option 1 
    def shipOrder(Order order) { 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

    // Option 2 
    def shipOrder(long orderId) { 
     def order = Order.get(orderId) 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

} 

이러한 옵션 중 하나가 다른 옵션보다 우수하다고 기록되어 있습니까?

+1

항상 이러한 종류의 질문과 마찬가지로, 그것은 다릅니다. 이것은 SO를위한 좋은 질문이 아니며 닫힐 가능성이 높습니다. – Gregg

+0

흠, 몰랐습니다. 의견에 덜 의존하도록 질문을 조금 변경했습니다. –

답변

9

종종 비관적 잠금을 사용하려는 경우가 있으므로 Order.get(orderId)에서 Order.lock(orderId)으로 변경하기 쉽기 때문에 ID를 선호하는 경향이 있습니다. 잠금은 트랜잭션에서 발생해야하므로 첫 번째 접근법을 사용하면 독서 후에 잠글 수 있으므로 중간에 작은 업데이트 위험이 발생할 수 있습니다.

때때로 서비스 외부에서 인스턴스를로드해야하는 경우가 있습니다. 컨트롤러에 존재 여부를 테스트 할 수 있으므로 두 번째 방법은 데이터베이스 호출을 낭비하는 것처럼 느낄 수 있습니다. 그러나 호출을 exists() 호출로 변경하고 전체 인스턴스를로드하기보다는 ID가 있는지 여부 만 확인하여 호출 할 수 있는지 확인할 수 있습니다.

null ID를 허용하는 것이 의미가 없기 때문에 메서드 서명에 long orderId을 사용해야합니다.

+0

+1 유스 케이스의 절대 사후. 특히'exists()'라고 말하면 직장에서 많이 볼 수 있습니다. :) – dmahapatro

+1

흥미 롭습니다. 나는 exist()에 대해 몰랐다. –

+0

나도 마찬가지입니다. 또한, Groovy가 길고 길게 (Java와 다르게) 취급하는 것을 들었습니다. 이제는 오랫동안 null이 될 수 없다는 사실을 확인했습니다. 위의 코드를 변경했습니다. 감사! –

관련 문제