[QnA 게시판] 연관관계 매핑, 영속성 전이

Updated:

Categories:

Tags: , ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

게시판 구현하면서 연관관계 매핑이랑 영속성 전이에 대해 헷갈리는 개념이 있어서 한 번 더 정리를 해야될 것 같았다.

내가 구현한 QnA 게시판은 말 그대로 질문과 답변을 주 목적인 게시판이고, 아래 그림과 같이 설계했다.

연관관계 매핑할 때 꼭 기억하기

  1. 연관관계는 항상 다 에 해당하는 엔티티가 주인이 되도록 설계하는 것을 지향하고,단방향을 우선으로 설정 후 , 필요시에만 양방향으로 구현하도록 한다.
  2. 주인 쪽에 사용하는 주요 애너테이션, 속성
    • @JoinColumn : 외래키를 맵핑할 때 사용
    • optional : 기본값이 true, false로 설정시 연관된 엔티티가 항상 있어야 함.
    • fetch : 4번에서 설명
    • cascade : 영속성 전이 기능 - 아래에서 설명 예정
  3. 주인이 아닌 쪽에 필요한 속성
    • mappedBy : 연관관계의 주인필드를 선택한다. (@OneToMany 또는 주인이 아닌 @OneToOne의 옆에 사용)
    • fetch
    • cascade
  4. FetchType
    • FetchType.EAGER
      • 즉시 로딩 : 주 엔티티가 로딩될 때 연관된 엔티티를 즉시 로딩합니다.
      • OneToOne, ManyToOne 에서는 FetchType.EAGER가 기본 값
      • OneToOne 양방향일 경우에는 한쪽에서만 설정할 수도 있지만 명확성을 위해 양쪽 모두 설정하는 것이 좋다
    • FetchType.Lazy
      • 지연 로딩 : 주인 엔티티가 처음 조회될 때 연관된 엔티티는 로딩되지 않고 연관도니 엔티티가 실제로 접근할 때 로딩된다
      • OneToMany, ManyToMany 는 FetchType.Lazy가 기본 값

영속성 전이

  • 종속적인 관계일 때 엔티티를 함께 처리해주는 역할을 한다. (연관관계 매핑과는 상관이 없고 상속에서 사용되는 듯 하다.)
  • 영속성 전이는 OneToOne, ManyToOne, OneToMany 관계에서만 사용할 수 있다.
    • but, 영속성 전이는 엔티티가 영속화 될 때 연관된 엔티티에게 영속성이 전파 될 뿐 연관관계 매핑과는 관련이 없다.
  • 연관관계 주인이 아닌 반대쪽의 애너테이션 옆에 괄호 내에 ( cascade = cascadeType. ~~)으로 지정 가능하다
  • Type은 총 6개 있고 여러 속성을 한번에 지정할 수 도 있다.

  • cascade는 LifeCycle이 같거나 종속적일 경우에 필요하다.. ( 엔티티 간 서로의 상태가 서로에게 영향을 주는 경우에 상태를 전파해주어야 할 때 넣어주면 된다.)

  • 근데 CasCadeType.ALL을 쓰면 다 해결되는데 필요할 경우 ALL만 써도 되지 않나??라고 생각했는데 특정 경우에서는 삭제는 영속성이 필요없거나 새로고침은 별도일 경우도 종종 있다고 한다. 고로 특정 전이만 필요한 경우에는 필요한 옵션만 지정해서 사용해야 불필요한 전이를 방지 할 수 있다!

Question 과 Member와의 관계

  • 한 명의 회원은 여러 개의 게시글을 가질 수 있고 하나의 게시글은 하나의 회원에만 귀속 되기 때문에 Question이 다, Member가 1로 맵핑했다.
  • 다에 해당하는 Question으로 주인으로 설정했기 때문에 Member 객체를 가지고 있고

  • 일에 해당하는 Member는 Question을 List로 가지며, mappedBy로 주인을 지정했다.

Like와의 관계

  • 한 명의 회원은 여러 개의 좋아요를 클릭 할 수 있고, 하나의 좋아요는 하나의 회원에게만 귀속된다. 회원이 1, 좋아요가 다로 맵핑된다.
  • 한 개의 게시글은 여러 개의 좋아요를 받을 수 있고, 하나의 좋아요는 하나의 게시글에만 귀속 된다. 게시글이 1, 좋아요가 다로 맵핑된다.

  • 일단 단방향으로 맵핑 후 추가로 필요가 있으면 양방향으로 구현하려고 했으나, 딱히 다른 엔티티에서 Like를 사용할 필요가 없어서 다대일 단방향으로만 구현했다.
  • Like가 주인에 해당하기 때문에 Member와 Question은 객체로 가지고 있다.

  • 질문 글의 좋아요에만 좋아요의 개수를 가지고 있는 필드가 필요해서 별개로 likeCount를 삽입.

Question 과 Answer와의 관계

  • 질문은 회원이 답변은 Admin이 작성하기 때문에 일대일로 구현했다.
  • Question 이 메인이라 Question을 연관관계 주인으로 만들었고

  • Answer는 Question에 종속적이기 때문에 Question이 생겨야 Answer이 생기고 Question을 지우면 Answer도 함께 지워지도록 하기 위해서 영속성 전이를 해주었다.

  • 만약 영속성 전이를 해주지 않으면??
    • 질문을 저장할 때 연관된 답변도 별도로 저장해야 한다.
    • 질문을 삭제할 때 연관된 답변도 별도로 삭제해야 한다.

Project 카테고리 내 다른 글 보러가기

Leave a comment