persist 후 detach 했는데 데이터가 INSERT된다?
이번에 JPA를 좀 공부해보면서 detach의 동작에 대해 이해하기 위해 테스트용 코드를 작성해봤다.
위와 같이 엔티티 클래스를 만들고 서비스 클래스에서 새로운 엔티티를 만들어 persist() 후 detach()를 호출했다.
위와 같이 서비스 클래스를 만들고 컨트롤러에서 /test GET 호출을 하면 MemberSerivceImpl의 test()가 호출되도록 개발했다.
내가 예상한 결과는 persist() 후 detach()해서 영속성 컨텍스트에서 엔티티를 관리하지 않고, transaction commit 전에 detach 했기 때문에 /test GET 호출 후 DB에 Member 데이터가 들어가지 않았을 것으로 생각했다. 그런데 확인해보니 DB에 데이터가 들어갔다.
예상한 것과 다른 결과가 나왔다. em.detach(member)를 em.clear()로도 바꿔보았는데 결과는 동일했다. 검색해봐도 원인을 찾지 못해 inflearn에서 김영한님께 질문을 했다. 답변을 받고 이유를 알 수 있었다.
즉, persist() 실행시에는 @Id 값이 꼭 필요하다. 때문에 auto increment 전략을 사용한 경우 persist를 호출하는 시점에 id값을 얻기 위해 INSERT 쿼리가 실행된다는 것이다.
auto increment 전략을 제거하고 직접 id 값을 넣어준 뒤 코드를 실행해보니 데이터가 DB에 들어가지 않은 것을 확인할 수 있었다.