ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 본인 ENTITY와 연관관계를 맺고 싶을때
    Stack/Jpa 2023. 5. 1. 08:11

    0. 개요

    JPA에서 다른 ENTITY가 아닌 본인 ENTITY와 연관관계를 맺고 싶다면 어떻게 해야할까?

     

     

    1. ENTITY설계

     

    기본적인 ENTITY를 설계 하였다.

     

    조건을 보겠다. 게시글이라는 ENTITY가 있으며, 연관게시글이란 요소가 추가 되어야 한다.

     

    연관게시글은 POST와 동일하며, 다른 ENTITY로 설계하기에는 논리적으로 애매하다.

     

    이러한 요구조건이 있다면, 어떻게 설계하는것이 좋을까?

    @Getter
    @Setter
    @NoArgsConstructor
    @Entity
    public class Post extends Timestamped {
    
        // mysql auto-increment
        @Id
        @Column(name = "post_id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        /* * 게시판은 게시글의 ID, 제목, 본문, 생성날짜로 구성되며 제목과 본문은 각각 텍스트 입니다.
         * 게시글은 연관 게시글이라는 항목을 가지고 있으며, 연관게시글은 게시글과 내용이 유사한 게시글 입니다.
         * 하나의 게시글은 여러개의 연관게시글을 가질 수 있으며, 하나도 없을 수 있습니다.*/
    
        @Column(nullable = false) // 제한사항에 title이 없는 경우에 대해서는 명시되지 않았음
        private String title;
    
        @Column(nullable = false)// 제한사항에 content이 없는 경우에 대해서는 명시되지 않았음
        private String content;
    
        //연관 게시글이 추가 되어야함.
        //one post to many related

     

    2. @ONETOMANY

    다른 ENTITY에 하듯이 @ONETOMANY 연관관계를 맺으면 일단 해결된다.

    @Getter
    @Setter
    @NoArgsConstructor
    @Entity
    public class Post extends Timestamped {
    	// --- 생략
    
        //연관 게시글이 추가 되어야함.
        //one post to many related
    
        @OneToMany
        private List<Post> relatedList = new ArrayList<>();
        
        }

    우선적으로 해결된 것 같지만, 이 방법은 RDBMS에서는 LIST 관계를 포함할 수 있는 방법은 오로지 TABLE을 생성하는 것이므로 TABLE이 생성된다.

    그래서.,. TABLE을 확인해보면 별로 좋지 못한 방법인것을 확인 할 수 있다.

     

    지저분하게 TABLE이 생성된다
    COLUM값 마저도 지저분하다..

    또한, ENTITY가 없기에 코드 가독성이나 명시적 혹은 상징적 의미에서도 불분명한 방법이라고 느껴진다(이건 나의 생각)

     

    어차피, TABLE이 생성 된다면, 가독성과 상징성을 높일 수 있는 방법을 떠올려보자.

     

    3. @JOINTABLE

     

    바로 @JOINTABLE을 사용 하는 것이다.

     

    @OneToMany
    @JoinTable(
            name = "related_posts",
            joinColumns = @JoinColumn(name = "post_id"),
            inverseJoinColumns = @JoinColumn(name = "related_post_id")
    )
    private List<Post> relatedList = new ArrayList<>();

     

    이런식으로 TABLE을 설정해주면 깔끔한 결과를 얻을 수 있다.

     

    깔끔하다 ...! 😎

     

     

    @JOINTABLE은 본디 ENTITY와 ENTITY간의 참조 관계를 TABLE로 만들고 관리하려는 목적이 크다..

     

    하지만 이런식으로도 사용 할 수 있다...

     

    아주 세련되고 우아한 방법이라고 생각한다

     

     

    참고

    @JoinTable 속성

    옵션설명

    name 조인 테이블 명
    joinColumns 현재 엔티티를 참조하는 외래키
    inverseJoinColumns 반대방향 엔티티를 참조하는 외래키

     

Designed by Tistory.