앞선 글에서도 살펴봤지만, Cascade 옵션을 적용하려면, id 값으로 레코드를 제거하는 쿼리를 날리는게 아니라, Session의 delete(object) 메소드 호출을 해야 하는데. 기존의 컨트롤러는 삭제할 객체의 id 값을 가져오고, service.delete(id)를 호출하여 최종적으로는 id로 삭제하는 쿼리를 난리게 됩니다.

방법은 두 가지.

1. Cascade 옵셥을 사용할 녀석만 매번 OSAF가 제공할 기본 컨트롤러 코드를 다음과 같이 재정의하게 할 것인가.

//Employee.java

    @RequestMapping
    public String delete(int id) {
        service.delete(service.get(id));
        return CommonPages.CLOSE_RESEARCH;
    }

2. 아니면, 아예 OSAF 기본 컨트롤러 코드를 변경해서 기본적으로 Session.delete(Object)를 호출하게 할 것인가.

//BaseController.java

    @RequestMapping
    public String delete(int id){
        // This will not trigger additional query, because the deleting object is already exist in Session Context.
        // We'll use Session's delete(Object) method to apply cascade options.
        service.delete(service.get(id));
        return CommonPages.CLOSE_RESEARCH;
    }

두 번째 것을 선택했습니다. 이론적으로는 Session Context에 삭제할 객체가 담겨 있을테니, 추가적인 select 쿼리가 날아가지 않을 것 같아서 선택했고, 테스트를 통해 검증을 해본결과 예상이 맞았습니다. 어차피 같은 쿼리가 날아간다면, 좀더 유연하게 설정값을 가지고 Cascade를 적용할 수 있는 메소드를 사용하도록 OSAF 컨트롤러 코드를 변경했습니다.