[Debug]장바구니 Delete하는 과정에서 생긴 오류, SQLException처리, native Query문 작성 후 delete 성공[DELETE FROM ? WHERE ? AND ? 문 사용]
Programming/Debug

[Debug]장바구니 Delete하는 과정에서 생긴 오류, SQLException처리, native Query문 작성 후 delete 성공[DELETE FROM ? WHERE ? AND ? 문 사용]

문제점이 두 가지인데

 

1. 첫 번째로는 저렇게 bucketbucketId를 잡고 지워버리면 

아래처럼 싹 다 지워버립니다.

이렇게 하면 위처럼

 

(여기서 id는 BucketProducts table의 프라이머리 키인데)

이 프라이머리 id 값이 아래에 둘 다 들어가집니다.

 

delete from bucket_products where id =?

delefe from product where id =?

 

이렇게 둘 다 들어가면 문제가 뭐냐면 상품도 같이 지워진다는 겁니다. 

 

물론 외래 키를 product에 생성되지 않게 했지만, save 하는 과정에서 세션에 있는 user값이 외래 키가 되어서 들어가네요.

이 테이블이 user_id로 연결되어있는데, 

 

where id 조건을 만족시켜서 product를 지워버립니다.

(여기서 조건에 아마, user_id가 들어가 있음, user_id는 bucket_products가 들고 있기 때문에)

delefe from product where id =?

 


다른 방법을 사용해봤습니다.

 

bucket안에 product를 잡아서 그 상품만 지워 보는 것이죠.

다만, 이것도 논리적인 오류를 범하고 있습니다.

 

java.lang.NullPointerException: Cannot invoke "com.cos.unishop.domain.product.Product.getId()" because the return value of "com.cos.unishop.domain.bucket.BucketProducts.getProduct()" is null

 

오류로 혼나버렸네요..

그리고 애초에 Product IddeleteById를 사용할 수 없습니다.

 

deleteById에서의 idbucketProducts의 프라이머리 키로

from product where =? 에 들어가서 삭제되어버립니다.

내부에 있는 productuser_id를 가지고 있기 때문입니다.

 


deleteById(bucket);으로 그대로 지워버릴 때

두 번째 문제가 발생합니다.

2. Cannot delete or update a parent row: a foreign key constraint fails

(오류 로그를 저장하지 않아서 날아갔네요)

 

문제 해결을 다음 블로그를 참고하여 해결했습니다.

https://haenny.tistory.com/78

 

[Error] MySQL 에러 Cannot delete or update a parent row: a foreign key constraint fails

[Error] MySQL 에러 Cannot delete or update a parent row: a foreign key constraint fails 에러 로그 ### Cause: java.sql.SQLIntegrityConstraintViolationException: (conn=4502) Cannot delete or update..

haenny.tistory.com


bucket.js

 

생각을 오래 해본 결과

이 문제를 해결하기 위해서는 native query문을 직접 짜야합니다.

 

그래서 아래와 같이 직접 작성한 후

 

*지금 bucket에는 json으로 받은 bucket_product id 밖에 없습니다

그렇기 때문에 우리가 빈 껍데기 클래스를 만들어 줍니다.*

 

다음과 같이 컨트롤러를 구성합니다.

returnvoid인 이유는 returnString이거나 int인 경우 

위의 JS코드에서 분기를 만들어 주어,

each문을 돌다가 다른 분기로 넘어가게 됩니다.

 

그렇기 때문에 void로 구성을 하였습니다.

(English meaning, void: 빈, 진공, 무효의)

 

위의 쿼리문을 해석하자면 

product_id와 user_id를 잡아서

그 항목만 삭제를 하겠다 이겁니다.

 

다만 체크박스 형태로 여러 개를 삭제할 수 있는 이유는

위와 같이 코드를 작성했기 때문입니다.

(bucket.js 참고)

 

또한 한 명이 여러 종류의(1,2,3번..) 상품을 들고 있을 수도 있으며

다른 수많은 사람들이 그 상품을 들고 있을 수 있기 때문입니다.

(장바구니에)

 

그래서 

DELETE FROM bucket_products WHERE product_id= :id AND user_id = :userId

의 형태로 Query문을 작성했습니다.

 

이렇게 작성하면 해당 유저(user_id)가 선택한 상품(product_id) 값만 들어가서

그 값의 row만 삭제하겠다는 겁니다.

 

 

JS문법을 통해서, checkbox 된 것을 each로 돌려서

선택된 것만 삭제 request를 보내는 것입니다!!

 

이를 통해, 체크박스를 선택한 것들을 삭제할 수 있습니다.