인프런 워밍업 클럽 - 백엔드 스터디 [3주차]

미니프로젝트를 하다보니, 강의 마지막 부분에 대한 이해가 부족하다고 느꼈다.

그래서, 이번엔 강의 마지막에 나온 연결 관계에 대해 한번 정리하고자 한다.

 

User entity에 UserLoanHistory를 추가해 주었다.

User와 UserLoanHistory는 1:N 관계이다.

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<UserLoanHistory> userLoanHistories = new ArrayList<>();

cascade 설정은 CascadeType.ALL 로 user에서 변경이 발생할 경우 UserLoanHistory에도 반영한다.

강의시간에도 이야기하였지만, CasCade옵션의 경우 원하는 로직에 따라 신중하게 사용해야한다.

예컨대, 어떤 사용자가 책을 빌린 다음에 반납하지 않고 회원 탈퇴를 할 경우를 가정해 보자.

Cascade 옵션으로 user데이터가 사라질때 대출 기록까지 삭제할 경우 사라진 책을 찾기 어렵게 된다.

그래서, 만약 포스팅 글에 달린 댓글 처럼 완벽한 종속 관계가 아닐 경우엔 cascade 옵션을 사용할 때 고민을 많이 해야한다.

(참고한 사이트 : https://tecoble.techcourse.co.kr/post/2023-08-14-JPA-Cascade/)

 

orphanremoval은 연결 관계를 끊으면 참고하고 있는 자식 객체를 삭제하는 기능이다.

이 경우는 User 객체에서 대출히스토리와의 관계를 끊으면 대출히스토리가 삭제된다.

User는 그대로 있고, 히스토리와의 관계를 끊음으로서 자식을 삭제하는 옵션이다.

이거는 아래 사이트를 보면서 이해를 했다고는 생각했는데, 직접 실습을 해보면서 좀더 해봐야 겠다.

(참고한 사이트 : https://tecoble.techcourse.co.kr/post/2021-08-15-jpa-cascadetype-remove-vs-orphanremoval-true/)

 

UserLoanHistory에 연결관계를 설정한 코드이다.

@JoinColumn(nullable = false)
@ManyToOne
private User user;

many to one으로 한명이 여러개의 대출 기록을 가질수 있다고 이해하면 될 것 같다.

nullable = false 옵션을 하면 UserLoanHistory이 User를 보고 있는데, 대출 기록은 모든 user에 매핑이 된다는 의미다.

즉 inner join이 가능하다.

강의 들을때도 그랬고 지금도이지만, 이렇게 연결했을 때 자동으로 Primary key를 FK로 설정을 하는게 맞는지

헷갈린다.

인터넷에서 찾아봤을 때는, 아래와 같이 명시적으로 외래키를 지정해 줄수 있는 것 같다.

강의 시간에 관련해서 나왔었는지 다시 복습할 계획이다.

image

그리고, 그 다음에 헷갈리는 부분은

public void loanBook(String bookName){
    this.userLoanHistories.add(new UserLoanHistory(this, bookName));
}

this.userLoanHistories 를 할 때.

User 객체가 정해지면 (사용자가 정해지면) 사용자의 PK (따로 외래키를 설정했을 경우엔 FK)를 가지고 대출 이력을 쭉 가져와서 객체 리스트를 만들고 거기에 새로운 대출 이력 객체를 넣어주는 것이 맞는지 정확하게 이해가 되지 않았다.

강의 중에는 암묵적? 묵시적으로 진행되는 부분이라 하셨는데, 연관 관계에 대해 좀 더 개념을 이해해야 활용을 잘 할 수 있을 것 같다.

 

 

오늘은 객체의 연관 관계에 대해 고민하였다. 아직 모든게 명확한 상태는 좀만 더 공부하면 마저 이해할 수 있을 것 같다.

 

 

 

 

 

 

 

 

 

 

댓글을 작성해보세요.