🏆토이 프로젝트에서 생긴 일

[Spring] JPA 공부를 열심히 해야 하는 이유 (친구 추가 기능 설계)

2023. 9. 29. 22:47
반응형

 

안녕하세요. 죽지 않고 돌아왔습니다.

 

오늘은 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 공부를 더 열심히 해봐야겠다고 느꼈습니다. 

반응형
저작자표시 (새창열림)

'🏆토이 프로젝트에서 생긴 일' 카테고리의 다른 글

[Spring] Spring Security 를 사용하여 OAuth2 와 JWT를 구현해보자  (1) 2023.12.08
[Spring] 에러를 해결해보자 - org.springframework.beans.factory.beandefinitionstoreexception: failed to parse configuration class  (0) 2023.11.09
[Spring] mustache에서 어떤 버튼이 클릭 되었는지 아는 방법 (target 인식)  (1) 2023.09.30
[Spring] /board로 이동하면 댓글을 어떻게 보여주지? (스프링 댓글 구현)  (2) 2023.09.25
'🏆토이 프로젝트에서 생긴 일' 카테고리의 다른 글
  • [Spring] Spring Security 를 사용하여 OAuth2 와 JWT를 구현해보자
  • [Spring] 에러를 해결해보자 - org.springframework.beans.factory.beandefinitionstoreexception: failed to parse configuration class
  • [Spring] mustache에서 어떤 버튼이 클릭 되었는지 아는 방법 (target 인식)
  • [Spring] /board로 이동하면 댓글을 어떻게 보여주지? (스프링 댓글 구현)
pkyung
pkyung
성장하는 중pkyung 님의 블로그입니다.
pkyung
성장하는 중
pkyung
전체
오늘
어제
  • 분류 전체보기
    • 🏆토이 프로젝트에서 생긴 일
    • 🤿백엔드 내실 채우기
    • 🍫카카오 테크 캠퍼스 2기 BE
    • 🍀spring
      • 스프링 입문
      • 스프링 핵심원리 기본
      • 스프링 jpa
      • 🐛debug
    • 🔒보안
    • 🌎infra
      • docker
      • kubernetes
      • cloud
    • 🌐web
      • HTTP 웹 기본 지식
    • 🔑알고리즘
      • baekjoon
      • programming language
    • 🎞️프로젝트
      • android
      • flutter
    • 📚수업
      • 교양과목
    • 💾database
    • ⚙settings
    • 2023 여름 모각코 - 절개와지조
    • 2024 겨울 모각코 - 내 장점은 algorit..

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • mysql
  • 자바
  • 파이썬
  • 코드리뷰
  • Security
  • 백준
  • 스프링
  • 자바문자열
  • 카카오테크캠퍼스
  • nginx
  • JPA
  • Java
  • 김영한
  • 스프링기본
  • 소수
  • 객체지향의사실과오해
  • 객체지향
  • 스프링부트
  • 카테캠
  • 스택
  • Docker
  • sql
  • spring
  • python
  • BFS
  • HTTP
  • 데이터베이스
  • springboot
  • 문자열
  • be

최근 댓글

최근 글

hELLO · Designed By 정상우.
pkyung
[Spring] JPA 공부를 열심히 해야 하는 이유 (친구 추가 기능 설계)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.