NDM

[JPA] Hibernate 6 : Save() 메소드 Deprecated 본문

JPA

[JPA] Hibernate 6 : Save() 메소드 Deprecated

ndm.jr 2022. 6. 11. 21:08

아직은 5버전이지만, Hibernate 6버전부터 Save()메소드가 Deprecated된다.

 

https://docs.jboss.org/hibernate/orm/6.0/javadocs/org/hibernate/Session.html#save(java.lang.Object)

 

Session (Hibernate JavaDocs)

Make a transient instance persistent and mark it for later insertion in the database. This operation cascades to associated instances if the association is mapped with CascadeType.PERSIST. For entities with a generated id, persist() ultimately results in g

docs.jboss.org

 


 

https://ndm-tech.tistory.com/6

 

[JPA] Spring Data Jpa의 Save와 Update

목차 update와 DirtyChecking Save의 동작방식 - persist와 merge 예제로 알아보자 merge 후에는 Persistence Context가 관리할까? Optional타입으로 find했다면, Persistence Context에는 Optional객체가 관리될..

ndm-tech.tistory.com

에서 Save의 동작 방식에 관해서는 소개한 바 있다.

 

다시 한번 핵심을 요약하자면

  • JPA에서 "저장" 이란, "DB에 저장하는것" 이 아닌 "영속성 컨텍스트에 영속화 시키는 것" 이다.
    • 영속성 컨텍스트에 영속화 된 데이터가 flush시점에 DB에 저장되는 구조이다.
  • Save()는 신규 데이터냐 아니냐에 따라 persist()로 동작할 수 있고, merge()로 동작할 수도 있다.
  • EntityManager의 merge메소드는 다음의 단점으로 인해 직접적인 사용이 권장되지 않는다.
    • DirtyChecking이라는 분명한 대안이 존재한다.
    • 전체 컬럼을 update치기 때문에, 실수로 데이터가 null로 들어온다면 수정 계획에 없었던 데이터도 null처리가 될 수 있다.
    • EntityManager를 직접적으로 호출해야 한다.

 


 

Save()를 굳이 Deprecated 시켜야만 하는가? 에 대해서는 나도 잘 모르겠다.

하지만 Hibernate측이 Save()를 왜 Deprecated 시키는 것인가? 에 대해서는 이러한 이유를 짐작해본다.

 

  1. Save()의 내부 구조를 모르고 사용하는 개발자가 많다.
    • 나아가서는 영속성 컨텍스트와 그 구조, 동작 원리에 대해 충분한 이해를 하고 있지 않은 상태로 사용한다.
  2. EntityManager의 라이프사이클과 관련된 메소드를 충분히 숙지하고 사용해야 한다.
  3. Spring Data Jpa는 단지 JPA의 메소드를 편하게 제공하기 위한 것일 뿐이다. JPA의 직접적인 메소드에 대한 이해는 필수적이며, Spring Data Jpa의 메소드를 분석해보고 어느 메소드를 사용할 것일지를 곰곰히 따져봐야 한다.