Project MySelectShop - JPA (2)

박영준·2022년 12월 5일
0

Java

목록 보기
23/112

폴더 설계

요구사항 분석

  1. 배경
    1. 회원들 중 페이지네이션 기능만으로는 원하는 관심상품을 쉽게 찾기 어렵다는 애로사항이 많이 접수됨
    2. 폴더 별로 관심상품을 저장/관리할 수 있는 기능을 추가하기로 함
  2. 요구사항
    1. 폴더 생성
      1. 회원별 폴더를 추가할 수 있다.
      2. 폴더를 추가할 때 1개~N개를 한번에 추가할 수 있다.
    2. 관심상품에 폴더 설정
      1. 관심상품에 폴더는 N개 설정할 수 있다.
      2. 관심상품이 등록되는 시점에는 어느 폴더에도 저장되지 않는다.
      3. 관심상품 별로 1번에서 생성한 폴더를 선택하여 추가할 수 있다.
    3. 폴더 별 조회
      1. 회원은 폴더 별로 관심상품 조회가 가능하다.
      2. 조회 방법
        1. '전체' 클릭 시: 폴더와 상관 없이 회원이 저장한 전체 관심상품들을 조회 가능하다.
        2. '폴더명' 클릭 시: 폴더별 저장된 관심상품들을 조회 가능하다.

'폴더' 테이블 설계

  • 폴더 테이블에 필요한 정보
    1. 폴더명 : 회원이 등록한 폴더 이름을 저장
    2. 회원ID : 폴더를 등록한 회원의 ID 를 저장
      • A 회원이 생성한 폴더는 A 회원에게만 보여야 함
      • 회원과 폴더의 관계
        • '회원과 폴더'의 관계는 '회원과 관심상품' 관계와 동일

기존 관계 설정 방법의 문제점

  • 폴더가 가지고 있는 userId 가 "회원의 Id 값"이라는 사실은 "개발을 진행한 사람"만 알 수 있음
  • 객체 (Folder Entity 클래스)와 DB 모두에서 회원과 상품이 어떤 관계인지를 알 수 없음
  • 회원 → 폴더 조회
    // 1. 로그인한 회원 (user1) 의 id 를 조회	//무조건 조회가 한 번 필요했음
    Long userId = user1.getId();
  • 폴더 → 회원 조회
    // 1. folder1 의 userId 를 조회
    Long userId = folder1.getUserId();	//무조건 조회가 한 번 필요했음
    // 2. userId 로 저장된 회원 조회
    User user = userRepository.findById(userId);

JPA 연관관계를 이용한 폴더 테이블 설계

회원 Entity 관점

  • 회원 1명이 여러 개의 폴더를 가질 수 있음
    - "@OneToMany": One = User, Many = folders
    public class User {
        @OneToMany
        private List<Folder> folders;
    }
    //회원이 가진 폴더들을 조회
    //위의 folders 를 getFolders() 로 한번에 조회 가능
    List<Folder> folders = user.getFolders();

폴더 Entity 관점

  • 폴더 여러 개를 회원 1명이 가질 수 있음
    - "@ManyToOne": Folder = Many, user = One
    public class Folder{
        @ManyToOne
        private User user;
    }
    //폴더를 소유한 회원을 조회
    //위의 user 를 getUser() 로 한번에 조회 가능
    folder.getUser();

객체의 관계를 맺어주면, DB 의 관계 설정 맺어줌

폴더를 소유한 회원 id 가 아닌 객체를 저장

외래키를 통한 관계 형성

JPA 연관관계 Column 설정방법

//name: 외래키 명
//nullable: 외래키 null 허용 여부
	//false (default) --> 폴더는 회원에 의해서만 만들어짐. user 값이 필수
    //true --> 공용폴더의 경우, 폴더의 user 객체를 null 로 설정하기로 함
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;

폴더 생성 및 조회 구현

요구사항

  1. 회원별 폴더를 추가할 수 있다.
  2. 폴더를 추가할 때 1개~N개를 한번에 추가할 수 있다.
  3. 회원별 저장한 폴더들이 조회 되어야 한다.

API 설계

관심상품에 폴더 추가 구현

요구사항

  1. 관심상품에 폴더를 0개 ~ N개 설정할 수 있다.
  2. 관심상품이 등록되는 시점에는 어느 폴더에도 저장되지 않는다.
  3. 관심상품 별로 기 생성 했던 폴더를 선택하여 추가할 수 있다.
  • 폴더 전체 조회 및 선택
  • 폴더와 상품의 연관 관계는?
    • 상품 1개에 여러개의 폴더 저장 가능
    • 폴더 1개에 여러개의 상품 저장 가능
    • 결론적으로
      • 상품 : 폴더 = N : N

API

폴더 별 관심상품 조회 구현

요구사항

  1. 회원은 폴더 별로 관심상품 조회가 가능하다.
  2. 조회 방법
    1. '폴더별': 폴더별 저장된 관심상품들을 조회 가능하다.
    2. '전체': 폴더와 상관 없이 회원이 저장한 전체 관심상품들을 조회 가능하다.

API

중복 폴더 생성 이슈 해결하기

VOC(고객의 소리)

  1. 중복 폴더명 생성 이슈
    1. 문제점: 현재 폴더명이 중복해서 생성되고 있습니다!
    2. 해결방법: 생성할 폴더명이 입력으로 들어왔을 때, DB 에 동일 폴더명이 없는 경우에만 생성
    3. 수정할 파일
      1. FolderService.java
      2. FolderRepository.java

숙제

VOC(고객의 소리)

  1. 같은 폴더 내에 상품 중복 생성 이슈
    1. 문제점: 현재 같은 폴더내에 상품이 중복 생성된다.
    2. 해결방법: 상품에 폴더를 등록할 때 기존에 등록된 폴더인지 확인한다.
    3. 수정할 파일
      1. ProductService.java
      2. ProductRepository.java
profile
개발자로 거듭나기!

0개의 댓글