본문 바로가기

개발

[Mysql] orphanRemoval vs CascadeType.REMOVE

match_id로 Riot API에 검색을하고 DB에 저장을 해당 게임의 정보를 저장해야한다. 한 게임에 10명의 플레이어가 있고 한 플레이어당 저장해야하는 정보가 20개가 넘는다.  만약 하나의 Entity에 모두 저장하려면 플레이어 외에 게임 정보를 포함해 200개 이상의 컬럼이 필요해진다. 그래서 Game과 Player의 테이블을 분리했다.

 

Game

@Entity
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Game {

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

    private String mode;

    private String matchId;

    private Long duration;

    @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, orphanRemoval = true)
    @Builder.Default
    private List<Player> players = new ArrayList<>();
}

Game 테이블에있는 red,  blue 리스트는 api를 요청하면 blue 팀 먼저, 그 다음 red팀이 나와서 필요할까 싶지만, 우선은 만들었고 이 후에 필요없다 생각되면 삭제할 예정이다.

 

 

Player

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Player {
    @Id
    @Column(name = "player_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JoinColumn(name = "game_id")
    @ManyToOne(optional = false)
    private Game game;
    private String summonerName;
    private String championName;
    private String individualPosition;
    private Long champLevel;
    private Long kills;
    private Long deaths;
    private Long assists;
    private Long totalDamageDealtToChampions;
    private Long totalDamageTaken;
    private Long goldEarned;
    private Long item0;
    private Long item1;
    private Long item2;
    private Long item3;
    private Long item4;
    private Long item5;
    private Long item6;
    private Long wardsPlaced;
    private Long wardsKilled;
}

 game_id로 game을 삭제할 때, player도 삭제해야한다.

 

orphanRemoval vs CascadeType.REMOVE
  • 부모 엔티티가 삭제되면 자식 엔티티도 전부 삭제되는 것은 동일하지만 원인이 다름
    • orphanRemoval = true 옵션은 부모 엔티티가 사라지면서 자식 엔티티와의 참조(연결)가 끊어져서 삭제됨
    • CascadeType.REMOVE 옵션은 원래 엔티티가 삭제될 때 연관된 엔티티를 전부 삭제하는 옵션
  • orphanRemoval 옵션은 Collections 에서 자식 엔티티를 삭제하는 걸로 DB 에서도 삭제 가능하지만 cascade 는 불가능