Project/Collabo Project

[Villion] 찜한 상품 폴더 만들기(Gson 사용)

sesam 2024. 6. 25. 01:51
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줄이 될 수 있다.

단점?

변환과정이 복잡하다

 

 

원래하던 방법은

장점? 변환과정이 없어서 로직이 간단하다

단점? 디비 용량을 많이 차지한다