프로젝트를 하던 중, 작은 트러블슈팅에 대해서 회고하는 글을 작성하고자 한다.
그 트러블은 바로 데이터가 화면에 표시되지 않는 아주 사소한 것이였다.
테이블-테이블을 매핑했었고, 테이블은 1:1로 매핑되어 @joinColumn을 하게 되면 자연스레 해당 테이블도 생성될거라 믿어 의심치 않았다.
하지만, a테이블이 생성되면 b테이블이 자동 생성되는건 jpa가 지원하는 기능이 아니다..
사람 손으로 직접 만들어 줘야하는 것이었던 것이다.
유저가 존재하면 유저의 누적점수는 필히 존재한다. ( 상식 )
그러나 java는 그렇게나 친절하지는 않아서 유저가 생성되면 누적점수도 같이 생성되고, 어떻게 생성되는지 써 주라고 한다.
@PostPersist
public void createPersonalScore() {
if (this.personalScore == null) {
this.personalScore = new CopyOfPersonalScore();
this.personalScore.setUser(this);
this.personalScore.setTotalPlays(0);
this.personalScore.setTotalScoreSum(0);
this.personalScore.setHighScore(0);
}
}
이렇게 작성하면 유저id와 1ㄷ1로 매핑되는 점수 테이블도 같이 생성되게 된다.
또한, 실수한 것이 있는데, Cascade와 같은 부분이다.
만약 cascade 설정을 하게 되어서, 회원이 삭제가 되면, 게임 내용도 삭제되는 것이다.
만약 프로그램이 더 발전하게 되면, 프로그램 내부에서 전적을 볼 수 있게 된다면, 프로그램 내부 전적 확인에서 한 회원탈퇴를 한 유저가 있다면 오류가 발생하고 말 것이다. 이점 또한 유의하여 조심해야 할 것이다.
또한 이전까지 모든 pk(fk)를 int로 설정하곤 했는데, BIGINT로 설정하는 것이 더 합리적이다. 일단 기본으로 Long 타입으로 설정하는 것이 context에 부합하기 때문이다.
chatgpt나 copilot이 그런 식으로 써서 그런건 안비밀이다.