fetch join 시 alias를 사용해서 필터링하는게 왜 안되는걸까요?
보통 이에 대한 답변으로 디비상태와 객체상태의 일관성이 깨지게 됨을 보통 얘기합니다.
alias를 사용해서 필터링해버리면 실제 디비에 있는 데이터보다 적은 개수가 나오게 되니까요.
근데 어차피 그 필터링된 결과만을 결과로 리턴해주어야한다면
사용해도 괜찮을 것 같은데
디비상태와 객체상태의 일관성이 깨지는게 왜 문제가될까요?
사실은 유지관리/캐싱 문제보단 2차 캐시와 관련되어 버그가 생길 수 있기 때문에 지양해야합니다.
예를들어서
team과 member가 일대다 연관이고
team을 select해온다는 sql이 있다고 가정합니다.
1. select * from team fetch join member where member.name = 'member1' //디비에 있는 일부 데이터 불러옴
2. select * from team fetch join member //디비에있는 모든 데이터 불러옴
하나의 트랜잭션에서 1의 sql을 호출한 뒤에 2를 호출하면
디비에 쿼리를 날려서 내용을 얻어오긴 하지만, 이미 team_id에 해당하는 객체가 영속성 컨텍스트에 존재해서 가져온 내용을 버립니다.
그래서 추후에 문제가생길 수 있습니다.
개발자는 모든 데이터를 불러올것이라고 생각했는데 필터링된 member를 가진 객체가 불러와지기 때문입니다.