프로젝트시 매번 쿼리를 날릴 때 어떤 방식으로 쿼리를 작성해야지 좀 더 효율적으로 할 수 있을 지 고민했는데 아래와 같은 기준으로 정해서 사용하면 될 것 같다.
1. 엔티티 Dto 변환 (요거는 내 생각에 권장아니고 무조건 필수임)
-> 엔티티를 외부에 노출 안하는게 좋은 코드작성
2. 필요하면 페치 조인으로 성능 최적화(대부분의 성능 이슈가 해결이 된다고 함)
-> 엔티티 매니저에서 creatQuery를 통해서 직접 작성
List<Test> tests = entityManager.createQuery("select t from Test t"
+" join fetch t.friend fr "
+" join fetch t.family fa", Test.class)
.getResultList();
3. 직접 Dto로 조회하는 방식으로 작성
-> 더 빠르게 Dto 형식으로 query를 날릴수 있지만 2번과 성능차이가 그렇게 크지 않아서 필요성을 잘 모르겠음
4. 네이티브 SQL 혹은 스프링 jdbc Template을 사용
사실상 실무에서도 2번 까지만 하면 대부분의 문제가 해결된다고 하니 숙지를 해두고 그래도 성능 이슈가 발생할 경우따로 패키지를 만들어서 직접 Dto로 조회할 경우(3번)와 아닐 경우(2번)로 클래스를 나눠서 코드를 작성하면 좋을것 같음.
프로젝트시 매번 쿼리를 날릴 때 어떤 방식으로 쿼리를 작성해야지 좀 더 효율적으로 할 수 있을 지 고민했는데 아래와 같은 기준으로 정해서 사용하면 될 것 같다.
1. 엔티티 Dto 변환 (요거는 내 생각에 권장아니고 무조건 필수임)
-> 엔티티를 외부에 노출 안하는게 좋은 코드작성
2. 필요하면 페치 조인으로 성능 최적화(대부분의 성능 이슈가 해결이 된다고 함)
-> 엔티티 매니저에서 creatQuery를 통해서 직접 작성
List<Test> tests = entityManager.createQuery("select t from Test t"
+" join fetch t.friend fr "
+" join fetch t.family fa", Test.class)
.getResultList();
3. 직접 Dto로 조회하는 방식으로 작성
-> 더 빠르게 Dto 형식으로 query를 날릴수 있지만 2번과 성능차이가 그렇게 크지 않아서 필요성을 잘 모르겠음
4. 네이티브 SQL 혹은 스프링 jdbc Template을 사용
사실상 실무에서도 2번 까지만 하면 대부분의 문제가 해결된다고 하니 숙지를 해두고 그래도 성능 이슈가 발생할 경우따로 패키지를 만들어서 직접 Dto로 조회할 경우(3번)와 아닐 경우(2번)로 클래스를 나눠서 코드를 작성하면 좋을것 같음.