Spring JPA의 1:N 관계 매핑

Yebali·2021년 3월 15일
0

약간의_Spring

목록 보기
9/30
post-thumbnail

작년 10월부터 회사에서 Mybatis를 사용하며 웹을 개발하고 있다.
Mybatis는 데이터베이스에 테이블을 생성해두고 java 파일에 쿼리를 작성하며 DB에 접근했기 때문에 DTO에서 테이블 간의 관계에 대해 큰 염두를 하지 않고 코딩했었다

하지만 최근 JPA를 공부하며 Entity에서 테이블 간 매핑 관계를 표현하는 방법을 공부하고 잊기전에 메모...

예시 테이블


위의 테이블은 우리가 작성하는 velog.io의 게시글을 간단하게 표현한 테이블이다.
tbl_post: 게시글의 id, 제목, 내용으로 구성되어있다.
tbl_hashtag: 해시태그의 id, 해시태그가 속한 게시글의 id, 해시태그 값으로 구성되어있다.

tbl_post의 Entity Class

전체 코드

@Entity
@Getter @Setter
@Table(name = "tbl_post")
public class Post {

    @Id @GeneratedValue
    @Column(name = "post_id")
    private Long id;

    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
    private List<HashTag> hashTags = new ArrayList<>();

    private String title;

    private String content;

    //==연간관계 매서드==//
    public void addHashTag(HashTag hashTag) {
        this.hashTags.add(hashTag);
        hashTag.setPost(this);
    }

    public static Post createPost(String product, String title, String content, HashTag... hashTags) {
        Post post = new Post();
        post.setTitle(title);
        post.setContent(content);
        for (HashTag hashTag : hashTags) {
            post.addHashTag(hashTag);
        }

        return post;
    }
}

자세히 살펴보자.

@OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
private List<HashTag> hashTags = new ArrayList<>();

tbl_hashtag의 Entity Class인 HashTag Class와 1:N 관계를 나타내는 부분이다.

  • @OneToMany -> 1:N 관계임을 명시 (Post가 1, HashTag가 N)
  • mappedBy = "post" -> HashTag class의 post와 매핑되는 값임을 나타낸다.
  • cascade = CascadeType.ALL -> HashTags가 영속(persist) 될 때 HashTag Entity도 함께 영속된다.

참고로 연관관계 매서드라고해서 addHashTag를 만든 이유는
엔티티가 서로 참조 하고 있는 경우(1:1, N:1, N:M) 서로 값을 가져 올 수 있게 원자적으로 묶어주기 위해서이다.
Post 에서 HashTag의 값들을 가져오기 위해서, 또는 HashTag에서 Post값을 가져오기 위해서 만든 매서드라고 생각하면 된다.

tbl_hashtag의 Entity Class

전체 코드

@Entity
@Getter @Setter
@Table(name = "tbl_hashtag")
public class HashTag {

    @Id @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Post post;

    private String tag;

    public static HashTag createHashTag(WhatsNew whatsNew, String tag) {
        HashTag hashTag = new HashTag();
        hashTag.setWhatsNew(whatsNew);
        hashTag.setTag(tag);

        return hashTag;
    }
}

매핑 관련 부분을 자세히 보면...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
  • @ManyToOne -> N:1 관계임을 명시 (HashTag가 N, Post가 1)
  • fetch = FetchType.LAZY -> HashTag를 조회 할 때 즉시 매핑된 Post값을 가져 오는 것이 아닌, HashTag에서 post값을 꺼낼 때 조회한다. 일종의 더티 체킹..?
  • @JoinColumn(name = "post_id") -> FK가 Post Class의 post_id(자바 변수 명은 id)임을 나타낸다.

JPA를 활용 한 1:N 매핑관계는 위처럼 나타 낼 수 있다.

profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글