JPA란?

자, 우선 CascadeType에 대해 공부하기에 앞서 jpa란 무엇이며 과연 왜 많은 회사들에서 사랑하는지에 대해 알아보자.
JPA는 자바를 기반으로 데이터를 다룬다고 생각을 하면 된다.
나는 이전에 sql을 찍먹 해보았는데, 그때 쿼리문을 따로 공부하느라 애먹었던 기억이 난다.
그러나 JPA는 자바라는 언어를 사용하기 때문에 언어가 가지고 있는 장점을 활용할 수 있는 것과 더불어 자바를 경험한 적 있는 개발자라면 좀 더 직관적으로 코드를 배우고 만질 수 있다.

장점

  • 자바의 장점 계승
    자바는 객체 지향 언어이다.
    그래서 과거의 언어에 비해 유지보수가 쉽다.
    JPA역시 마찬가지이다.
  • 경제적
    sql문을 사용하기 위해 반복되는 코드들이 줄어들며, CRUD를 위해 작성하던 코드들을 한결 간단하게 작성할 수 있다.

    간단한 curd작성

  • 저장
    jpa.persist(member)
    
  • 조회
    Member member = jpa.find(memberId)
    
  • 수정
    member.setName("이름")
    
  • 삭제
    jpa.remove(member)
    

    CascadeType이란?

    우선 Cascade는 물이 위에서 흐르면 아래에게도 영향을 주듯 관계성 있는 엔티티들에게 동일한 동작을 부여해주는 기능이다.
    여기에서 엔티티란 일종의 테이블을 의미하는 것으로 JPA가 관리하는 클래스 이름(예를 들어 질문과 답변 클래스)를 의미한다.

    종류

  • ALL
    어떤 관계성 있는 엔티티들을 연쇄적으로 동일한 작업을 수행할지에 대한 여부를 정해주는 역할을 한다.
    모든 작업을 포함해주기 때문에, 제거도 함께 일어나고 새로고침 역시 자식과 부모가 함께 작동하게 된다.
    따라서 자식과 부모를 굳이 연관짓지 않아도 되는 경우에도 함께 작동하는 과정에서 성능 저하 이슈가 발생할 수도 있다.
  • PERSIST
    연관된 엔티티가 생성된다면, 데이터의 영속성을 유지하기 위하여 변경된 부분이나 새로 생성된 부분에 한하여 함께 저장하는 역할을 해준다.
    만약 이미 영속성 컨텍스트에 포함된 엔티티에 대해서 PERSIST를 수행하려고 시도한다면, 추가적인 작업은 실행되지 않는다.
  • MERGE
    엔티티를 병합할 때에 하위에 있는 엔티티들(연관된) 모두 병합해주는 역할을 한다.
  • DETACH
    부모에서 위 기능을 실행하면, 연관된 하위 엔티티들도 영속성 컨텍스트에서 엔티티가 제거되게 된다.
    따라서 변경사항을 반영하지 않게 되는 것이다.
  • REFRESH
    말 그대로 새로고침의 역할을 한다.
    영속성 컨텍스트의 상태를 다시 로드하고, 혹시나 변경 사항이 있다면 데이터 베이스를 업데이트해준다.
  • Remove
    부모가 삭제되면 자식도 삭제된다.
    예를 들어 질문 게시물이 부모 엔티티라면, 여기에서 remove를 실행시 답변 게시물도 삭제되는 것이다.
    즉 자식의 생명주기를 부모가 관리하는 것이나 마찬가지인 셈이다.

    유의점

    하나의 부모에 여러 개의 자식을 둘 때에 문제가 생길 수 있다.
    이는 많은 프로그래머들이 초보에게 else를 남발하지 말라는 조언을 해주는 이유와 비슷하다.
    기본적으로 자식과 부모의 관계를 맺고, 부모가 자식에게 영향을 주는 Cascade의 특성상 자식이 많아진다면 개발자가 생각하지 못한 오류가 많이 발생할 수 있기 때문이다.
    심지어 삭제의 경우 부모 엔티티가 자식의 생명주기를 조정하는 꼴이기 때문에 더욱 더 조심해야한다.

댓글남기기