장바구니를 구현하고자 할 때 어떤 방식으로 구현할까 고민을하던 도중 세션, 쿠키 아니면 DB를 사용해서 저장할 때 데이터를 저장하고 조회할 때 해당 데이터베이스를 조회해서 정보를 가져오는 방식을 고안했다.
고민을 진행하던 도중 나는 Redis
와 Cookie
방식을 사용해서 구현했다.
부제: 쿠키와 세션만으로도 충분히 구현 가능한 장바구니 기능에 레디스라는 Nosql을 사용한 이유
쿠키와 세션만으로도 장바구니 기능은 충분히 구현이 가능하다 그렇다면 나는 왜 레디스까지 도입을 하여 작업을 진행했을까?
[4. 정상 요청에 응답]
[5-1. 정상적으로 상품이 장바구니에 담겼다면 CART_NO이란 이름의 쿠키를 생성]
[5-2. 해당 쿠키에 담긴 UUID를 키값으로 레디스에도 저장]
전체 상품 목록을 list 형태로 넘겨 받아서 타임리프 문법을 통해 해당 리스트를 출력해주고 있을 때 선택한 상품의 특정 정보를 얻어내고 싶으면 어떻게 진행해야 할까?
<div th:each="product, productStat:${products}" class="align-content-center mb-0 mt-3 border-bottom">
<button th:if="${product.isSelled}"
th:attr="product-id=${product.productId}"
class="btn btn-yellow border-0 col-lg-6 col-sm-2 pb-2 mb-3 text-center text-light">
장바구니
</button>
th:attr="product-id=${product.productId}"
: 타임리프 문법으로 데이터를 지정할 때 사용한다. <script>
document.querySelectorAll("button[product-id]").forEach(button => {
button.addEventListener("click", function() {
const productId = this.getAttribute("product-id");
addToCart_singleSelect(productId);
console.log("Clicked button for Product ID: " + productId);
});
});
function addToCart_singleSelect(productId){
const url = "/cart";
const request = {
productId: productId,
quantity: 1,
isEbook : false
}
fetch(url, {
method:'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(request)
}).then((response)=> {
return response.json();
}).then(data => {
console.log(data.status)
if (data.status === 200){
confirmCartViewPage()
} else {
alert(data.data)
}
})
}
function confirmCartViewPage(){
let result;
result = confirm("해당 상품이 장바구니에 추가 되었습니다. 장바구니로 이동하시겠습니까?")
if (result){
window.location.href = "/cart";
} else{
console.log("계속 해당 페이지에 남아있기!~")
}
}
</script>
document.querySelectorAll("button[product-id]").forEach(button => { button.addEventListener("click", function(){}
: list로 이루어진 products에서 해당 버튼을 클릭했을 때 상품의 pk값을 가져오는 코드이다.
addToCart_singleSelect()
: productId를 넘겨받아 단일 상품 장바구니 추가 로직을 위한 fetch API를 사용합니다.
confirmCartViewPage()
: 장바구니에 상품이 성공적으로 담겼을 때 장바구니에 담긴 상품 목록을 출력해주는 페이지로 넘어가거나 그대로 페이지에 남아있을 수 있는 선택을 위한 창을 띄우는 기능을 합니다.
잘 봤습니다. 좋은 글 감사합니다.