작년 10월부터 회사에서 Mybatis를 사용하며 웹을 개발하고 있다.
Mybatis는 데이터베이스에 테이블을 생성해두고 java 파일에 쿼리를 작성하며 DB에 접근했기 때문에 DTO에서 테이블 간의 관계에 대해 큰 염두를 하지 않고 코딩했었다
하지만 최근 JPA를 공부하며 Entity에서 테이블 간 매핑 관계를 표현하는 방법을 공부하고 잊기전에 메모...
위의 테이블은 우리가 작성하는 velog.io의 게시글을 간단하게 표현한 테이블이다.
tbl_post: 게시글의 id, 제목, 내용으로 구성되어있다.
tbl_hashtag: 해시태그의 id, 해시태그가 속한 게시글의 id, 해시태그 값으로 구성되어있다.
@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 관계를 나타내는 부분이다.
참고로 연관관계 매서드라고해서 addHashTag를 만든 이유는
엔티티가 서로 참조 하고 있는 경우(1:1, N:1, N:M) 서로 값을 가져 올 수 있게 원자적으로 묶어주기 위해서이다.
Post 에서 HashTag의 값들을 가져오기 위해서, 또는 HashTag에서 Post값을 가져오기 위해서 만든 매서드라고 생각하면 된다.
@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;
JPA를 활용 한 1:N 매핑관계는 위처럼 나타 낼 수 있다.