JPA 엔터티와 테이블 관계 설정하기 [탐구/기록]


두 테이블과 엔터티를 비교해 보면 추상 클래스인 BaseTimeEntity를 제외하고 정확히 테이블만큼의 엔터티를 생성했습니다. ( BaseTimeEntity 는 엔터티 클래스의 createAt , updateAt 속성 데이터를 생성하기 위한 추상 클래스입니다 )
( Post / PostTag / Tag ) 에서 PostTag 테이블을 연결고리로 다대다 관계를 설정하였으므로 이 세 테이블을 중심으로 살펴보겠습니다.
@NoArgsConstructor
@Data
@Entity
@Table(name = "post")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long postId;
@Column
private String postTitle;
@Column
private String postContent;
@Column
private LocalDateTime createdAt;
@Column
private LocalDateTime updatedAt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "memberId")
private Member member;
@OneToMany(mappedBy = "post")
private List<PostTag> postTags = new ArrayList<>();
}
Post 엔터티입니다. memberId 칼럼에 대해서는 Member 테이블의 member 객체의 memberId 를 조인하여 가져오게 설정되어 있습니다.
@NoArgsConstructor
@Data
@Entity
@Table(name = "tag")
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long tagId;
@Column
private String tagName;
@OneToMany(mappedBy = "tag")
private List<PostTag> postTags = new ArrayList<>();
}
Tag 엔터티입니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) 는 오라클에서 기본 키가 순차적으로 자동 생성되는 시퀀스인 경우에 설정합니다.
@NoArgsConstructor
@Data
@Entity
@Table(name = "posttag")
public class PostTag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
@ManyToOne
@JoinColumn(name = "tag_id")
private Tag tag;
}
두 테이블의 중간지점인 PostTag 테이블입니다.
@ManyToOne 을 두개 사용하여 Post 와 Tag 를 둘다 가리키고 있습니다.

이 POSTTAG 테이블의 속성도 데이터베이스에 동일하게 설정되어 있습니다.
다른 테이블의 경우도 마찬가지로, DB의 테이블 열 갯수 및 속성명과 JPA 엔터티의 필드 수 및 이름을 동일하게 설정했습니다. 그리고 @OneToMany / @ManyToOne 을 이용해 관계설정을 한 결과,
이전 게시글과 같이 OAuth 를 적용하여 테스트 했을 때 URI ' /main '으로 이동한 후에 JPA가 쿼리를 생성하여 DB에 있는 정보를 성공적으로 가져온 것을 확인해 볼 수 있었습니다.
엔터티와 테이블을 설정하며 느낀 점은, JPA 필드와 DB 테이블 속성을 되도록 일치하도록 설정하는 것이 위험요소가 가장 적을 것 같았고, 테이블을 계획할 때 데이터의 범위와 용도에 맞게 독립적으로 설계하는 것이 바람직하다는 생각이 크게 들었습니다.
이 테이블에 JPA가 자동으로 쿼리를 생성할텐데, 그렇다면 엔터티 정보가 들어오기 위해서 구조가 잘 짜여진 테이블이 있어야하는구나 생각했습니다.
아직 필요한 테이블과 엔터티가 더 많이 있으므로 익숙해지면 유용하게 사용할 수 있을 것 같습니다.