CRUD 실습

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

rexondex 2024. 9. 30. 18:31
현재 DB에 있는 테이블들
현재 스프링부트 엔터티 클래스들

 

두 테이블과 엔터티를 비교해 보면 추상 클래스인 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 테이블

 

이 POSTTAG 테이블의 속성도 데이터베이스에 동일하게 설정되어 있습니다.

다른 테이블의 경우도 마찬가지로, DB의 테이블 열 갯수 및 속성명과 JPA 엔터티의 필드 수 및 이름을 동일하게 설정했습니다. 그리고 @OneToMany / @ManyToOne 을 이용해 관계설정을 한 결과,

이전 게시글과 같이 OAuth 를 적용하여 테스트 했을 때 URI ' /main '으로 이동한 후에 JPA가 쿼리를 생성하여 DB에 있는 정보를 성공적으로 가져온 것을 확인해 볼 수 있었습니다.

엔터티와 테이블을 설정하며 느낀 점은, JPA 필드와 DB 테이블 속성을 되도록 일치하도록 설정하는 것이 위험요소가 가장 적을 것 같았고, 테이블을 계획할 때 데이터의 범위와 용도에 맞게 독립적으로 설계하는 것이 바람직하다는 생각이 크게 들었습니다.

이 테이블에 JPA가 자동으로 쿼리를 생성할텐데, 그렇다면 엔터티 정보가 들어오기 위해서 구조가 잘 짜여진 테이블이 있어야하는구나 생각했습니다.

 

아직 필요한 테이블과 엔터티가 더 많이 있으므로 익숙해지면 유용하게 사용할 수 있을 것 같습니다.