안녕하세요!
JPA 강의를 듣고, 저만의 새로운 DB 설계로 처음부터 끝까지 개발 중에 있습니다.
비즈니스 로직은 Controller나 Repository보다는 Service나 Entity에 구현하는 것이 좋다고 여겨지는데요,
모든 비즈니스 로직을 Entity에 구현하려고 시도하던 중 문제에 부딪혔습니다.
매우 간단한 CRUD 비즈니스 로직을 Entity에 구현하는 것에는 문제가 없었습니다.
예를 들어 Entity A와 Entity B 간에 1:N 연관 관계라고 할 때, Entity A가 참조하는 Entity B들로 구성된 List의 모든 목록을 Read하는 비즈니스 로직은, A라는 클래스에 메서드로서 구현하면 간단하게 해결됩니다.
그런데 만약, Entity B들로 구성된 List 전체가 아닌 일부를 Read할 때, 즉 SQL로 치면 where절로 필터링해서 Read 해야 하는 경우에 고민에 빠지게 됩니다.
방법 1) Service에 비즈니스 로직을 구현하고, Service가 Repository의 메서드를 호출한다. 그럼 Repository는 where 절이 포함된 JPQL 쿼리를 통해 List의 일부를 Read한다.
방법 2) Entity에 비즈니스 로직을 구현하고, JPA가 자동으로 쿼리를 생성해서 List 전체를 Read한 다음에, 그 List에 대하여 응용 레벨에서 반복문과 조건문을 통해 필터링하여 사용한다.
방법 2는 방법 1에 비해 (데이터의 개수가 커질수록 더욱) 성능이 느려진다는 단점이 있고, 불필요한 데이터까지 불러오게 됩니다.
혹시 Entity에 비즈니스 로직을 구현하고도 '방법 2'와 같은 낭비 없이 불러올 수 있는 방법이 있을까요?
그런 방법이 없다면, 이런 경우엔 어쩔 수 없이 Entity가 아닌 Service에 비즈니스 로직을 구현하는 수밖에 없나요?
질문 받아주셔서 감사합니다!
안녕하세요. Jason Yoo님
결론부터 말씀드리면 1번이 맞습니다.
데이터를 최대한 필터링해서 조회하는 것은 리포지토리의 역할입니다.
감사합니다.
답글
답변 감사합니다.
그럼 이렇게 정리하면 될까요?
- Spring Data JPA가 제공하는 인터페이스에 해당하는 쿼리들을 적극 활용함으로서 반복되고 지루한 SQL 작성 노가다를 피한다.
- Spring Data JPA에서 제공하지 않는 쿼리는 변경 감지를 통해 자동 생성되는 SQL들을 활용하고, 객체 지향적으로 코딩한다.
- Spring Data JPA과 변경 감지로도 해결되지 않는 복잡한 쿼리들은 QueryDSL이나 JPA Criteria, JPQL로 직접 하드 코딩한다.
바쁘신 와중에 답변 감사드립니다.
답글
김영한
2021.08.25이상하게 답글에 대한 메일이 안와서 확인이 늦었습니다.
네 생각하신 부분이 맞습니다.
감사합니다.