Spring boot/위니아에이드 클론코딩 프로젝트

[위니아에이드] 팀 프로젝트 - 파일명 들고 와서 처리하기

코딩딩코 2022. 10. 20.

관리자 페이지에서 제품 삭제를 구현하는 중 한 가지의 문제점이 생겼습니다.

상위 카테고리를 삭제한다면 하위 카테고리도 함께 삭제 되어야 합니다.

삭제는 어렵지 않게 구현을 했지만 해당 카테고리, 하위 제품에 등록되어있는 이미지는 어떻게 처리를 해야 할지 고민을 했습니다.

 

삭제를 하는 것이 맞기 때문에 삭제 되어지는 카테고리, 제품들의 이미지 이름을 전부 가져와서

각각 이미지가 저장 되어있는 경로를 맞추어 이미지 삭제를 진행해야만 했습니다.

 

처음 시도한 것은 DB에서 값을 가져올 때 MyBatis의 ResultMap과 Collection을 이용해서 하나의 객체의 필드에

List를 만들어 데이터를 넣어서 중복제거와 null값을 제거하는 로직을 구현해 이미지 제거를 진행하고자 했습니다.

 

SELECT
	wpm.product_main_image,
	wpd.product_detail_image,
	pmc.product_main_category_image
FROM
	winia_product_mst wpm
	LEFT OUTER JOIN winia_product_dtl wpd ON(wpd.product_category_code = wpm.product_category_code)
	LEFT OUTER JOIN product_main_category pmc ON(pmc.product_category_code = wpm.product_category_code)
WHERE
	wpm.product_category_code = 12675;

쿼리 문과 가져오는 데이터의 조회 값입니다.

 

image = managerRepository.findFileImageListToDelete(keyCode);
        
    List<String> test = image.getProduct_detail_image().stream()
            .map(ProductDetailImage::getProduct_detail_image)
            .distinct()
            .filter(fileImage -> fileImage != null)
            .collect(Collectors.toList());

    List<String> test1 = image.getProduct_detail_image().stream()
            .map(ProductDetailImage::getProduct_main_image)
            .distinct()
            .filter(fileImage -> fileImage != null)
            .collect(Collectors.toList());

DB에 접근해서 image 변수 안에 데이터가 들어가 있고 product_detail_image List를 Stream으로 변환시켜

map을 통해 String값을 가져오고 distinct로 중복을 제거하고 filter를 통해 null이 아닌 것만 가공시킨 다음에

최종적으로 collect를 통해 List <String>으로 새롭게 받아왔습니다.

결과는 아래의 이미지와 같이 중복이 제거되었고 필요한 부분만 가져올 수 있었습니다.

이제 각각의 경로에 맞게끔 이미지를 제거해주면 끝입니다.

 

하지만 DB에서 모든 것을 처리해서 가져오는 방법이 궁금했고 강사님께 여쭤봤습니다.

혼자서 시도했던 UNION 방법이 있었지만 product_main_category_image는 다른 경로에 있었기 때문에

그것을 구분 지어주는 무엇인가 필요했기에 UNION으로는 부족하다 생각을 했었지만 해결 방법은 너무나도 간단했습니다.

UNION으로 각각의 값들을 가져오고 정수든 문자열이든 하나의 플래그 값을 주어서

플래그 값에 따라 이미지 경로를 설정해주어 삭제하면 된다고 말씀해주셨습니다.

 

SELECT
	product_main_category_image,
	1
FROM
	product_main_category
WHERE
	product_category_code = 12675

UNION

SELECT
	product_main_image,
	2
FROM
	winia_product_mst
WHERE
	product_category_code = 12675
	
UNION

SELECT
	product_detail_image,
	2
FROM
	winia_product_dtl
WHERE
	product_category_code = 12675;

결과입니다. 1과 2로 구분을 지어주어 경로를 따로 설정해주면 됩니다.

중복도 없고 따로 로직을 구현할 필요가 없어져 코드가 훨씬 깔끔해졌습니다.

 

 

처음 DB에 접근해서 데이터를 가져올 때 가능하면 데이터를 내가 원하는 데이터로 처리를 하고

가져와서 부족한 부분은 따로 로직을 구현해서 클라이언트로 넘기는 방법을 계속해서 고민하고 있지만

UNION만 생각해보고 플래그 값을 주어서 구분을 짓는다는 생각은 못 해봤습니다.

쿼리문을 작성하는데 많이 미숙하다고 느낌과 동시에 조금 더 발전을 했다고 생각을 했습니다.

댓글