상세 컨텐츠

본문 제목

[TIL#24] 가을에 시작한 Spring <Transactional / FetchType.LAZY or EAGER / cascade>

내배캠/Chapter3

by DK9 2023. 12. 12. 10:52

본문

1. Transactional

 추가적인 지식을 습득해서 정리를 한다.

  • Transactional 은 DB에서 사용되는 개념이다. A라는 기능 동작에 a라는 데이터가 필요한데 A 동작 수행 중 다른 누군가가 a를 a1로 변경한다면 정상적인 A동작에 문제가 생긴다. 이를 방지하기 위해 A라는 기능 동작 중에는 a에 누구도 접근하지 못하게 접근제어를 하는 것이 Transactional 이다.
     다르게 표현하면 A를 하나의 덩어리로 처리한다고 할 수 있다.

  • Transactional 에는 readonly 라는 기능이 있다. 일반적인 Transactional 은 Transaction 이 실행과 동시에 해당 정보들의 현상태 그대로 사진을 찍는다. 이를 '스냅샷'이라고 한다 그리고 Transaction 을 마칠 때의 정보들과 사진을 비교하여 변경점이 있다면 해당 부분을 체크하여 업데이트한다. 이것이 '더티 체킹'이다. 이 '더티 체킹'은 영속컨텍스트가 관리하는 엔티티에만 적용된다.
    readonly 
    는 이런 스냅샷과 더티체킹을 하지 않도록 Transantional을 설정한다. 하여 읽기 전용 모드로 바꾼다고 생각하고 있다.

2. FetchType.LAZY 와 FetchType.EAGER

지연 로딩과 즉시 로딩이다. 쉽게 말하면 "시작했어? 오케이 그럼 이따가 나 필요할 때 갈께~" 와 "시작했네? 야 일단 다 모여봐" 의 차이이다. 가장 쉬운 예시는 쿠팡 홈페이지다. 우리는 쿠팡에 들어가면 검색창에서 제품을 검색하고 사용한다. 그렇기에 처음 홈페이지에 들어가면 있는 검색창과 카테고리 등등 바로 뜨는 화면은 바로 필요하다. 때문에 FetchType.EAGER(=즉시 로딩) 으로 해놔야한다.

 

 하지만 스크롤을 끝까지 내리면 있는 자질구레한 것들까지 즉시 로딩이 필요할까? 필요하면 로딩해서 주는것이 효율적일 것이다. 이런 경우에 사용하는 것이 FetchType.LAZY(=지연 로딩) 이다.

 여기서 주의점은 Transactional과 관계이다. 지금까지 이해한 바로는 FetchType.LAZY 는 해당 기능을 시작한 시점과 정보를 불러오는 시점이 동일하지 않다. 기능을 시작한 시점의 정보와 불러오는 시점의 정보가 동일하지 않을 수도 있다는 말이다. 그렇기에 지연로딩 된 정보를 조회할 때(=필요할 때)는 단순 조회임에도 불구하고 Transactional필요로 한다. 하나의 덩어리로 기능을 수행해야하기 때문이라고 생각이 된다.

3. cascade

 cascade 는 종속이라는 뜻을 가지고 있다. 엔티티 간의 연관 관계를 설정할 때, 종속관계를 설정하는 기능을 가지고 있다.

  • cascade.REMOVE
    게시물과 댓글을 예시로 하면 댓글은 게시물 없이 생존하지 못한다. 즉 댓글은 게시물에게 종속되어있다. 우리는 이 개념을 컴퓨터에게 인식을 시켜줘야한다. 게시물과 댓글이 양방향 관계 맺게되면 게시물의 필드에 1:N관계의 댓글을 가지게 될 것이다.
    그럼 해당 댓글에 누가 주인인지 mappedBy = "게시물" 로 인식시켜 주고 뒤이어 cascade = CascadeType.REMOVE 를 작성한다. 그러면 게시물에 달린 댓글들은 게시물이 지워지면 같이 삭제된다. 게시물이 "야 댓글! 편하게 해라. 근데 이때만큼은 니 내랑 같이 해야한다." 라고 말하는 거라고 이해했다.

  • cascade.PERSIST
    위와 동일한 기반에서 게시물이 영속화 될 때, 댓글도 함께 영속성을 가지게 된다. "야 댓글! 알아서 놀다가 나 영속성 등록할 때 너도 같이 등록할거니까 알아둬~" 이런 느낌이다.

관련글 더보기