본문 바로가기

개발

isassignablefrom vs instance (T-001)

반응형

하이버네이트 TypeDescritor를 제작할 때 특이했던 부분이라 이렇게 포스팅합니다

 

TypeDescritor에서 unwrap시에는 isassignablefrom을 사용하고, wrap할때는 instance를 이용합니다(예시)

이때 unwrap은 자바 객체를 데이터로 변활 할 때 사용되고, wrap은 그 반대의 경우 사용됩니다

 

인터넷 서칭 결과 instance는 컴파일 타임에, isassignablefrom은 런타임에 동적으로 사용 될 수 있다고 합니다

아무튼 예시의 소스코드에서는 메소드 파라미터로 class를 받는지, 아닌지에 따라 용도를 구분하는 것 처럼 보였습니다

 

하지만...

 

까짓거 뭐 레포지토리에 save 한번 호출해서 객체를 데이터로 매핑 한번 해주고, find 한번 호출해서 데이터를 객체로 매핑

이때 wrap, unwrap에 브레이킹 포인트 한번 걸어서 디버깅해서 뭐가 넘어오는지 살펴보면 끝날 줄 알았습니다...

 

unwrap은 그러니까 레포지토리의 save 호출 할 때는 예상한대로 동작을 하지만, find 호출시에는 전혀 예상과 다르게 동작하고 있었습니다

왜 wrap이 호출 되지 않는가... 왜... why...

 

해결

 

원인은 바로... 1차 캐시 그러니까 영속성 컨텍스트에 지금 조회하고자 하는 엔티티가 들어있어 디비에 접근하지 않았기 때문입니다...

    @PersistenceContext
    private EntityManager entityManager;

이런식으로 엔티티 매니저를 주입받고, clear 메소드를 호출하여 캐시를 비워주면 정상적으로 wrap 메소드가 호출되게 됩니다

 

결론

 

wrap 메소드에서는 파라미터로 인티저값을 받아서(객체) isinstance 메소드를 사용하고,

unwrap 메소드에서는 파라미터로 class를 받아서 isassingablefrom 메소드를 사용합니다

 

참고 문헌

 

두 메소드의 차이

https://stackoverflow.com/questions/19664009/classisinstance-vs-classisassignablefrom

class 공식 문서

https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

제너릭 메소드

https://devlog-wjdrbs96.tistory.com/201

반응형