관리 메뉴

KorSA

JPA 사용 도중 DB에 값이 있는데도 findById()가 empty라면.. 본문

Development Experience/Web

JPA 사용 도중 DB에 값이 있는데도 findById()가 empty라면..

Praiv. 2021. 3. 29. 16:43
320x100

Spring에서 JPA를 이용해 DB의 값을 꺼내오던 도중

분명히 있는 값인데도 Repository의 findById()를 호출하면 Optional.Empty를 반환하는 현상을 마주하였다.

 

그래서 findById() 직전에 findAll()을 먼저 호출해보았다.

그랬더니 findAll()의 결과값이 제대로 나왔고 findById()에서도 DB에 있던 값이 잘 리턴되었다.

흠... JPA 뉴비의 관점에선 영속성에 문제가 있는 건가 싶었다.

그런데 이 함수들을 호출하기 직전에 내가 persist()를 한 것도 아니었으니

DB와 1차 캐시간의 싱크가 어긋나진 않았을 거 같은데..

 

구글느님께 물어보니 이 현상은 영속성보단 DB의 연관관계 쪽에 원인이 있었다.

 

나의 프로그램은 A객체가 자식으로 B객체를 가지고 있고,

예전에 다른 작업을 하다가 A객체를 DELETE했던 적이 있었다. 

내가 B객체를 찾기 위해 findById()를 했던 시점에 부모인 A객체는 이미 DB상에 존재하지 않는 상태였던 것이다.

그래서 findById()는 B객체를 만들다가 A객체가 없는 것을 보고 Optional.Empty를 리턴한 것이었다.

 

728x90
728x90
Comments