안녕하세요. 죽지 않고 돌아왔습니다.
오늘은 jpa 지식이 부족한 채로 사용한 자의 최후 그리고 설계의 중요성에 대해 알아보려고 합니다.
처음에는 토이 프로젝트를 게시판, 댓글 정도로 생각하고 설계를 했는데 욕심이 생겨서 이것 저것 만들어보고 싶어졌습니다. 그래서 좋아요 기능도 넣고 친구 추가 기능도 넣었습니다.
그래서 대충 설계를 하고 바로 기능을 추가하려고 했습니다.
친구란? 친구 요청을 보내면 상대방이 받아야 이뤄질 수 있는 관계입니다.
그래서 요청을 보내는 db를 만들고 member 테이블에 List 형태로 친구를 저장하고자 했습니다.
Friend 엔티티는 이렇게 짰고,
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@Entity
public class Friend {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "give_id")
private Member giveMember;
@ManyToOne
@JoinColumn(name = "take_id")
private Member takeMember;
}
Member 엔티티는 이렇게 짰습니다.
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String uuid;
private String password;
private String name;
private List<Member> friends = new ArrayList<>();
}
그런데 List 에서 에러가 나서 에러 메시지를 구글링하여 @ElementCollection 어노테이션도 추가해보고 @OneToMany도 추가해보았지만 duplicate entry '1' for key 이런 에러가 뜨며 친구 리스트에 하나 이상의 멤버가 들어가지 않았습니다.
JPA를 잘 알고 사용한 게 아닌 것을 깨달았고 그렇기에 어떻게 해결해야할 지 감이 잘 오지 않았습니다.
그래서 db부터 다시 짜보자고 생각했습니다.
아까 짜둔 Friend 테이블은 FriendRequest 테이블로 이름을 바꿔 친구 요청 건을 저장하고 Friend 테이블을 만들어서 리스트로 저장하고자 한 것을 테이블에 하나씩 저장했습니다.
그렇게 만든 Friend 엔티티입니다.
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@Entity
public class Friend {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne
@JoinColumn(name = "friend_id")
private Member friend;
}
결과적으로 친구 아이디를 검색 후, 친구 요청 버튼을 누르면
친구 요청 건을 확인할 수 있습니다.
친구 추가 버튼을 누르면 친구 목록에서 친구가 된 것을 확인할 수 있습니다.
이번 토이 프로젝트를 통해 jpa 공부를 더 열심히 해봐야겠다고 느꼈습니다.