그렇다고 굵직한것만 보고 넘어갈 수는 없어.


이 딜레마를 어떻게 해야함????



그냥 예방접종 맞는다는 느낌으로 세세한걸 봐야하나?


볼때는 진심이다.


마치 영원히 기억할것처럼...



예를들자면


em.find 로 엔티티를 가져온다음에


em.createQuery("select * from ~~~"); 를 적용하면 어떻게 될거같아??


일단 여기서 첫번째로 드는 의문은


두번째 쿼리는 1차캐시로부터 데이터를 가져오느냐 그렇지 않느냐 임.


두번쨰 쿼리는 데이터를 1차캐쉬로부터 가져오지 않아.

2차캐쉬가 있더라도 데이터를 2차캐쉬로부터도 가져오지 않아.

쿼리를 명시하면 데이터는 db로부터 가져와.


그러면 두번쨰로 드는 의문이 생겨.

db데이터가 다르면??


첫번째 find는 2차캐시 및 영속성컨텍스트에서 데이터를 가져왔고

두번째 쿼리는 db에서 가져왔으니 둘은 다른건가?? 둘을 다르게 저장할 수 있는가??


팩트는 이러함. 두번쨰 쿼리가 db에서 가져와서 데이터 값이 다르지?? 그러면 두번째 값을 fetch는 하되

그것을 파기하고 영속성컨텍스트의 값으로 대체함.


즉, 두개의 find는 같은 엔티티를 가리킴. 동일성 동등성 전부 보장되는 상태로.


기억했지?


자 그러면 이제 실제 복잡한 상황을 디버깅 할 때에는 저런 자그마한 공리들을 모아서 해결해야돼.


자 여기서는 ~~이러이러 하니까 이렇게 작동하고, 그 작동을 바탕으로 ~~가 일어났으니까 저건 이렇게 되고~~ 이렇게.



근데, 그 공리들 기억날까???


다음에 다시 또 문제해결해야될 떄가 있으면


또다시


em.find 하고 나서

db데이터가 변경된 이후

em.createQuery("select ~~") 하면 어떻게 되지???


이걸 또 다시 테스트해봐야할거라고....



근데 그렇다고 테스트를 안해볼 수는 없잖아??