사용자에게 선호 향수와 비선호 향수를 복수형으로 입력받는다.
선호 테이블과 비선호 테이블 두 개로 분할해서 진행하니 데이터 중복이 발생했다.
유저명 | 선호제품 | 이미지 |
aa | 삼성 | 링크 |
aa | 엘지 | 링크 |
bb | 삼성 | 링크 |
유저명 | 비선호제품 | 이미지 |
aa | 애플 | 링크 |
bb | 엘지 | 링크 |
bb | 애플 | 링크 |
처음에는 제품 id 제품명 이미지를 칼럼으로 가진 제품 테이블과
제품 id 유저명 선호 여부를 칼럼으로 가진 선호 제품 테이블로 분할하려 했지만 이렇게 분할해도 유저가 다르다면 제품 id와 선호 여부가 중복이 발생하기 때문에 따로 분할 작업은 하지 않았다.
-조회에서 문제 발생
시간이 지나니 조회에서 문제가 발생했다.
조회 쿼리는 선호 제품 테이블을 기준으로 했기에 선호 제품에 등록되지 않고 비선호 제품에 제품을 등록한다면 검색이 불가능하다. 테이블 설계를 바꾸지 않고 문제를 해결하려면 선호 제품과 비선호 제품 모두 조회한 뒤 중복을 제거하고 다시 합쳐서 화면에 뿌려줘야 한다.
아무리 생각해도 너무 비효율적인 것 같아 테이블을 다시 분할하려고 한다.
FavoritePerfume과 UnFavorablePerfume에 들어가는 칼럼이 같기 때문에 BasePerfume에서 선언 후
@MappedSuperclass
@SuperBuilder
이 두 어노테이션을 활용해 처리했다. User의 경우 Oauth로 삽입돼서 건드리기 무서웠기에 별개로 존재한다.
이 형식을 다음과 같은 형식으로 변경할 생각이다.
정확한 대응관계는 설계하면서 설정할 것이다.
선호 향수 테이블은 향수 테이블의 향수 id와 유저 테이블의 유저 id를 외래 키로 받아 선호도를 넣어 처리하려고 했지만
어차피 id값을 받아서 향수 이름이나 유저네임을 받아야 하기 때문에 id값 말고 향수 이름과 유저네임을 받기로 했다.
-입력에 대한 의문
기존 입력은 사용자가 선호향수, 비선호향수를 복수로 입력을 한다. 수정한 테이블을 기존의 방식으로 바꾼다면 그림과 같이 진행될 것이다.
위와 같이 한 번의 로직으로 두 곳의 테이블에 데이터를 삽입해야한다. 이는 객체지향과 거리가 먼 느낌이다...
기존에는 사용자가 한번의 입력으로 선호도까지 추가됐지만 사용자가 입력을 두 번 하더라도 한 번의 입력에 한 번의 기능추가만 진행할 생각이다.
수정하자면 아래 그림과 같다.
위와 같이 사용자가 향수등록과 등록된 향수가 이미 존재한다면 등록은 생략할 수 있다.
등록된 향수 중 선호도를 조회해서 향수를 등록할 수 있다.
'프로젝트 > 향수' 카테고리의 다른 글
JPA외래키 설정시 데이터 입력 방향 (0) | 2022.02.16 |
---|---|
No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type (1) | 2021.09.02 |
no httpMessageConverter for (0) | 2021.08.25 |
should have [public, protected] no-arg constructor (0) | 2021.08.24 |
java.net.UnknownHostException (0) | 2021.08.18 |