728x90
기존에는 아래 표처럼 user 1명이 제품을 찜하면 1행에 1개의 상품이 들어가도록 했다.
그렇게 findAll로 1번 유저 찾아오기로 찜목록을 확인했다.
1명의 uesr가 100개의 상품을 찜하면 100개의 행이 생긴다.
이처럼 이렇게 할 경우에는 DB차지가 심하다는 걸 깨달았다.
그래서 새롭게 알게되어 다른 방법으로 찜 상품 폴더를 만들어 보고자 한다.
아래처럼 1행에 1개의 상품을 넣는 것이 아니라, 배열을 만들어 찜 상품을 추가할 때는 product_id 필드만 수정하면 되는 방향으로 해보려고 한다.
user_id | product_id |
1 | 1 |
1 | 2 |
1 | 3 |
2 | 1 |
2 | 2 |
puroduct_id에 넣을 때, 배열을 만들어 [1, 2, 3] 이렇게 넣는다.
하지만 저장할 때는 Gson라이브러리를 사용해 Json형태로 저장하고자 한다.
그러면 찜목록에 추가할 때 product_id 필드만 수정해주면 된다.
저장할 때 배열을 Json형태로 변환하여 저장하고,
수정할 때 Json을 배열로 다시 바꾸어야 하는 부분이 번거롭다는 단점이 있지만, DB용량 차지는 확실하게 줄어든다는 장점이 있다.
user_id | product_id |
1 | "["1" , "2" , "3"]" |
2 | "["1" , "2" ]" |
Gson 라이브러리를 사용하여 Json으로 변경하였다.
implementation 'com.google.code.gson:gson:2.8.8'
// UserSerivce
// 상품 찜하기
public void toggleWishProduct(Long userId, RequestAddFolderProduct requestAddFolderProduct) {
WishProductFolderEntity folderEntity = wishProductFolderRepository.findByUserIdAndFolderName(userId, requestAddFolderProduct.getFolderName());
// 처음 찜하기를 눌렀을 경우, 배열을 만들어야함..
if(folderEntity.getProducts()==null) {
// 제품 ID를 저장할 리스트를 생성
List<Long> productIds = new ArrayList<>();
// 제품 ID를 리스트에 추가
productIds.add(requestAddFolderProduct.getProductId());
// Gson 객체 생성
Gson gson = new Gson();
// 리스트를 JSON 형식으로 변환하여 저장
String productIdsJson = gson.toJson(productIds);
folderEntity.setProducts(productIdsJson);
// 저장
wishProductFolderRepository.save(folderEntity);
} else {
// 기존의 제품 ID 문자열을 Gson을 사용하여 배열로 변환
Gson gson = new Gson();
Long[] existingProductIds = gson.fromJson(folderEntity.getProducts(), Long[].class);
// 요청된 제품 ID를 포함하고 있는지 확인
List<Long> productList = new ArrayList<>(Arrays.asList(existingProductIds));
Long requestedProductId = requestAddFolderProduct.getProductId();
if (productList.contains(requestedProductId)) {
// 제품이 이미 목록에 있으면 제거
productList.remove(requestedProductId);
} else {
// 제품이 목록에 없으면 추가
productList.add(requestedProductId);
}
// 리스트를 다시 JSON 형식의 문자열로 변환하여 저장
String updatedProductIdsJson = gson.toJson(productList);
folderEntity.setProducts(updatedProductIdsJson);
// 변경된 폴더 엔티티를 저장
wishProductFolderRepository.save(folderEntity);
}
}
아래 사진처럼 저장된다.
장점?
디비 용량을 적게 사용 가능 -> 디비 용량을 안늘리고, 필드만 늘려주면 된다.
회원 1명이 3개 폴더에 10개씩만 추가해도, 1명이 디비에서 30줄을 차지한다. 100줄.. 1000줄이 될 수 있다.
단점?
변환과정이 복잡하다
원래하던 방법은
장점? 변환과정이 없어서 로직이 간단하다
단점? 디비 용량을 많이 차지한다
'Project > Collabo Project' 카테고리의 다른 글
[Villion] 동시성 문제 해결 방안 (2) | 2024.07.19 |
---|---|
[Villion] MSA 구조 어떻게 해야 보기 좋을까..? (0) | 2024.07.12 |
[Villion] Docker를 실행 할 때 데이터 넣기 (0) | 2024.05.30 |
[Villion] 마이크로 서비스 간의 통신을 위해 Feign Client vs. Kafka 중 어떤 것을 사용할까? (0) | 2024.05.02 |
[동물전쟁] 아이템 합성 서비스(Kafka 사용) (1) | 2023.11.09 |