[하이버네이트] 쿼리를 수정할 것이냐 모델을 수정할 것이냐...
이전에 올렸던 글에서 고민했던 것을 오늘에서야 처리했습니다.
SQL로 원하는 데이터를 가져올 것이냐(성윤이 제안).. 모델을 수정해서 로직으로 모델의 값들을 변경할 것이냐(내 생각) 중에서 결국은 제 생각을 따르기로 했습니다.
일단 시도는 SQL을 시도했습니다. 그러나 바로 단점이 생기더군요.
- 비슷한 쿼리가 있었는데 그것도 고쳐야 합니다. 비슷한 문장이 중복되는 쿼리가 여러 개 생기겠더군요.
이 문제는 DetachedCriteria를 사용해서 어느 정도 손불 수 있는 문제입니다.
- 쿼리 중에 비슷한 부분을 DetachedCriteria로 분리해두고 재사용하면 되거든요.
하지만 기술적인 문제가 기다리고 있었습니다.
- Criteria.setProject()에 넘겨주는 Proejction과 Criteria.setResultTransformer()가 예상한대로 동작하질 않았습니다.
c.setProjection(Projections.projectionList()
.add(Projections.property("id").as("id"))
);
c.setResultTransformer(new AliasToBeanResultTransformer(Study.class));
이건 잘 맵핑 해주는데..
c.setProjection(Projections.projectionList()
.add(Projections.property("id").as("id"))
.add(Projections.property("name").as("name"))
);
c.setResultTransformer(new AliasToBeanResultTransformer(Study.class));
이렇게 하나 이상의 Projection이 추가되면 c.list()를 호출할 때 타입 캐스팅 에러가 발생합니다. 이걸 결국은 해결하지 못해서;;
마음 편하게 모델을 수정하기로 했습니다.
- 모델에 필요한 필드를 추가하고..
- xxxService에서 모임이나 멤버가 추가/삭제 될 때 로직을 추가하고.
- 테스트로 호가인하고.
끝~
이렇게 간단한 것을 쿼리 길게 작성하고, 쿼리 분리하고, DTO 만들고, 컨트롤러, 서비스, DAO 다 고치고;; 하는 것 보단 편한 것 같습니다.