[Spring] entity, entityManager에 대해서

오영선·2023년 2월 13일
0
post-thumbnail

백엔드를 연습하기 위해 헬스장 이용권 조회 웹사이트를 만들어 보는 과정에서, 팀원과 entityTest를 구현하다가 문득 의문점이 생겼다.

이전에 들었던 강의나 참고자료에서는 주로 Id, 그 외 속성값을 이용해 비교했던 것 같은데, 객체끼리 비교하면 어떻게 될까? 의구심이 들었고,
실제로 돌려보니 테스트가 성공했다. (findPass.equal(savePass) == true)

찾아보니 junit. assertEquals는 Java의 equals( ) 함수를 이용해 구현한 함수라고 한다. 그렇다면 객체 내의 값들이 똑같다면 true가 나오는 것이 당였했다.

같은 주소인지 비교하기 위해서는 assertSame을 사용하면 된다고 해서,

이렇게 구현해보았더니 마찬가지로 테스트가 성공했다.

여기서 내 생각과 달랐던 점이
"어? (실제)DB에 데이터를 저장 후 다시 findBy로 찾아내는 경우 다른 주소에 속성값들이 할당 되는 것이 아닌가?" 였다.
그래서 내가 생각한 결과는 <같지 않다> 가 나와야하는데, 그렇지 않았던 것이다.

(머릿속 예상 그림..)
save()함수를 통해 pass 를 저장하면 savedPass를 돌려주는데 이 둘은 전혀 다른 객체일 것이라고 생각했다.
아직도 공부할 것이 한참 남은 듯 하다.. ㄱㅡ

혹시 @DataJpaTest, @Test를 이용한탓에 Spring 내에서 임시 entity 저장소가 있는 것인가 생각이 들어, 실제 서버가 돌아가는 환경에서 구현을 해 보았다.


역시나 true를 출력하게 된다.

Spring의JPA는 entityManager라는 영속성 컨테이너를 통해 객체를 관리한다
JPA는 위의 녀석을 통해 데이터의 상태 변화를 감지하고 필요한 쿼리를 자동으로 수행시킨다.

영속성 컨텍스트(Persistence Context)

엔티티를 영구 저장하는 곳이다.

@Entity를 가진 엔티티는 id필드를 가지고 있다.
영속 상태의 엔티티가 되면 여러가지 장점이 있다.

  1. 1차캐시
    find()...를 호출하면 먼저 영속성 컨텍스트에 캐시된 데이터를 먼저 찾고, 없다면 DB에 접근하여 1차 캐시 데이터에 저장한다.
  2. 동일성
    Id가 같다면 같은 데이터로 취급한다.
    JPA를 통해 불러온 데이터는 모두 캐시 데이터에 저장되기 때문에, save한 pass와 findPass는 당연히 같은 값을 가지게 된다. (id값이 같기 때문)

0개의 댓글