코딩과 매일매일♥/Game_Crew

[Game_Crew_V2] 테이블 설계

코딩러버 2024. 3. 1. 15:52
728x90
이번에 JPA에 대한 강의들을 듣고 그동안 내가 쓰던 코드들이 성능상 많이 좋지 않았고, 또한 기술에 대한 이해가 부족하여 어떠한 기능들을 왜 사용하는지 잘 몰랐음을 깨달았다. 이력서를 넣는 것은 잠시 멈추고, 최근에 진행했던 [Game Crew] 프로젝트를 전체적으로 리팩터링 하여 성능을 최적화해보고자 한다.

프로젝트의 규모가 크지 않고, 거의 전체적인 부분을 손대야 할 것 같아 복습하는 마음으로 처음부터 다시 만들어 가보고자 한다. 이러한 이유로 프로젝트 명을 [Game Crew V2]라고 한다.

 


ERD

  • [멤버] - [게시물] : 멤버는 여러 개의 게시물을 가질 수 있다. (1 : N)
  • [멤버] - [평가기록] : 멤버는 여러 번 평가를 받을 수 있다. (1 : N)
  • [멤버] - [참가인원] - [게시물] : 멤버는 여러 게시물에 참가 신청을 할 수 있고, 하나의 게시물에 여러 멤버가 참가 신청을 할 수 있다. 때문에 중간 테이블을 명시하여 (N : M)을 (1 : N) 관계로 풀어냈다.
  • [멤버] - [평점] : 각 멤버는 하나의 총평점만을 가진다. (1 : 1)
  • [게시물] - [게시물 사진] : 하나의 게시물은 여러 개의 사진을 가질 수 있다.(1 : N)
  • (+ 평점 테이블의 평가 받은 멤버 삭제)

나는 모든 테이블을 1 : 1이나 1 : N으로 풀어냈으며 모두 단방향으로 연관관계를 맺고 나중에 필요시 양방향으로 설정하고자 한다.

 

  • 1대1의 관계에서 [멤버]를 주 테이블로 하고 보조 테이블인 [평점]이 멤버의 기본키를 외래키로 가진다.
  • 연관관계의 주인은 보통 외래키를 가진 테이블로 한다.
  • (연관관계 주인은 주 테이블이라는 말이 아니다. 연관관계를 설정하고 관리하는 책임을 갖는 테이블을 가리킨다.)

 

원래는 vachar나 bigint 등을 사용하나 편의상 String, Long과 같은 타입으로 기입하였다. JPA가 Entity 클래스를 기반으로 데이터베이스 테이블을 자동으로 생성해 주기 때문에 큰 상관이 없다 생각된다. (erd에서 설계한 테이블을 sql 쿼리로 바꿔주는 기능이 있는데 그게 필요하다면 알맞게 바꿔줘야 함.)


Entity 설계 (+ 지연로딩)

@Entity
@Getter
@NoArgsConstructor
public class Post extends Auditing {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "post_id")
    private Long id;

    private String title;
    private String content;
    private GameType gameType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    private int totalNumber; //모집 인원 수
    private int currentNumber = 0; //현재 인원 수

    private int postViewCount = 0;
}
  • @ManyTo X 의 경우 LAZY(지연로딩)로 설정해주었다. 이렇게 지연로딩을 해주면 Post를 조회할 때 Member까지 조인해서 가져오지 않고, proxy 객체로 조회한다. 즉시로딩을 사용하면 n+1 문제로 성능이 굉장히 떨어질 수 있다.
  • @Entity에 @Getter만 사용한다. 데이터를 Set해야 할때는 생성자를 이용하거나 해서 해결한다.
  • 지금보니 erd에 빠뜨렸는데 게시물이 생성된 시간을 기록해야 한다. 이 부분은 다른 테이블에서도 중복으로 사용할 수 있어 Auditing이라는 클래스를 만들고 상속받는다.