AI 웹 개발 : Cursor로 장바구니·결제 UI + UX 최적화 (초보자ㆍ비전공자 실무 강화) | 쇼핑몰 만들기 Part 5

“페이지를 만들 줄 안다”와 “서비스를 만든다”의 차이

앞선 Part 1부터 Part 4까지 우리는
쇼핑몰의 구조 기획 → 기본 레이아웃 → 상품 카드 UI → 검색·필터·페이징까지 구현해 보았습니다.

여기까지 왔다면 이런 생각이 드실 수 있습니다.

“이 정도면 쇼핑몰 거의 다 만든 거 아닌가요?”

하지만 실제 서비스 관점에서는 아직 결정적인 한 조각이 빠져 있습니다.
바로 장바구니와 결제 흐름입니다.

아무리 상품 리스트가 잘 보이고, 검색이 편리해도
사용자가 구매를 완료하지 못하면 쇼핑몰은 의미가 없습니다.

이번 Part 5는 단순한 UI 추가가 아니라,
‘페이지 모음’이 아닌 ‘하나의 서비스’로 완성하는 마지막 단계입니다.

AI와 협업하는 개발자를 AI로 시각화 한 이미지입니다.
본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
AI와 협업하는 개발자를 AI로 시각화 한 이미지입니다.
본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

이번 Part 5에서 완성할 것

이번 글에서는 다음을 목표로 합니다.

  • 장바구니 UI 구성
  • 상품 수량 변경 및 금액 계산
  • 장바구니 상태 유지 (새로고침 대응)
  • 결제 화면 UI 구성
  • 모바일 기준 UX 최적화

실제 결제 API 연동은 하지 않습니다.
이번 시리즈의 목적은 프론트엔드 구조 이해와 실무 감각 확보입니다.

[Cursor AI 바로가기]


먼저 짚고 가는 용어 설명 (초보자용)

장바구니(Cart)란?

사용자가 구매하고 싶은 상품을 임시로 담아두는 공간입니다.
실무에서는 단순 UI가 아니라, 상태 관리의 핵심 영역입니다.

UX(User Experience)란?

사용자가 서비스를 사용하면서 느끼는 편의성, 흐름, 직관성을 의미합니다.
버튼 위치, 클릭 반응, 입력 오류 안내 모두 UX에 포함됩니다.

LocalStorage란?

브라우저에 데이터를 임시 저장하는 공간입니다.
로그인 없이도 장바구니를 유지할 때 자주 사용됩니다.


구현 전략 — 왜 AI에게 “단계별로” 지시해야 할까?

Cursor 같은 AI 도구는 한 번에 많은 기능을 요청할수록 결과 품질이 떨어집니다.

실무 개발자들은 다음 순서로 작업합니다.

  1. UI 구조
  2. 기본 동작
  3. 상태 관리
  4. UX 개선

이번 Part 5도 동일한 흐름으로 진행합니다.
아래 프롬프트는 독자가 그대로 Cursor에 입력하면 되는 실사용 지시문입니다.


STEP 1. 장바구니 카드 UI 생성

쇼핑몰 장바구니 페이지용 카드 UI를 만들어줘.

조건:
- HTML과 CSS만 사용
- 상품 이미지, 상품명, 가격, 수량 조절 버튼(+,-), 삭제 버튼 포함
- 여러 상품이 반복 렌더링될 수 있도록 구조 설계
- 모바일 우선 반응형 레이아웃
- 클래스명은 직관적으로 작성

이 단계에서는 디자인과 구조만 확인합니다.
아직 기능은 필요하지 않습니다.

Cursor에 첫번째 프롬프트를 입력한 모습.
이해를 돕기 위해 제공하는 이미지로 직접 캡쳐하여 제공합니다. 
해당 이미지의 저작권은 블로그 주인 제로에게 있습니다.
Cursor에 첫번째 프롬프트를 입력한 모습.
이해를 돕기 위해 제공하는 이미지로 직접 캡쳐하여 제공합니다.
해당 이미지의 저작권은 블로그 주인 제로에게 있습니다.

STEP 1. 장바구니 카드 UI 생성 코드(일부발췌)

 <section class="cart-list">
      <!-- 1번 상품 카드 -->
      <article class="cart-item">
        <div class="cart-item-image-wrap">
          <img src="https://via.placeholder.com/300x300?text=Product+1"
               alt="화이트 스니커즈"
               class="cart-item-image" />
        </div>
        <div class="cart-item-info">
          <div class="cart-item-main">
            <h2 class="cart-item-name">화이트 베이직 스니커즈</h2>
            <div class="cart-item-price">59,000원</div>
            <div class="cart-item-sub-info">옵션: 260 / 화이트</div>
          </div>
          <div class="cart-item-bottom">
            <div class="quantity-control">
              <button class="quantity-button" type="button">-</button>
              <span class="quantity-value">1</span>
              <button class="quantity-button" type="button">+</button>
            </div>
            <button class="cart-item-delete-button" type="button">삭제</button>
          </div>
        </div>
      </article>
</section>

STEP 1. 장바구니 카드 UI 생성 코드 설명

  • 반복 구조: 서버 템플릿/JS를 사용하실 때는 article.cart-item 블록만 반복 렌더링하면 됩니다.
  • 클래스 네이밍:
  • 리스트 래퍼: cart-list
  • 개별 카드: cart-item
  • 이미지: cart-item-image-wrap, cart-item-image
  • 상품 정보: cart-item-info, cart-item-name, cart-item-price
  • 수량: quantity-control, quantity-button, quantity-value
  • 삭제 버튼: cart-item-delete-button

STEP 2. 수량 증가·감소 기능 추가

방금 만든 장바구니 카드 UI에
수량 증가(+), 감소(-) 버튼 기능을 JavaScript로 추가해줘.

조건:
- 수량은 1 이하로 내려가지 않도록 제한
- 버튼 클릭 시 수량이 즉시 화면에 반영
- ES6 문법 사용

여기서부터 “살아있는 화면”이 됩니다.
버튼이 반응하는지만 확인하시면 충분합니다.

Cursor에 두번째 프롬프트를 입력한 모습.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
Cursor에 두번째 프롬프트를 입력한 모습.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

STEP 2. 수량 증가·감소 기능 추가 코드(일부발췌)

// ES6 문법을 사용한 수량 조절 기능
    class CartManager {
      constructor() {
        this.init();
      }

      init() {
        // 모든 수량 증가 버튼에 이벤트 리스너 추가
        const increaseButtons = document.querySelectorAll('.quantity-increase');
        increaseButtons.forEach(button => {
          button.addEventListener('click', (e) => this.handleIncrease(e));
        });

        // 모든 수량 감소 버튼에 이벤트 리스너 추가
        const decreaseButtons = document.querySelectorAll('.quantity-decrease');
        decreaseButtons.forEach(button => {
          button.addEventListener('click', (e) => this.handleDecrease(e));
        });

        // 초기 합계 계산
        this.updateTotalPrice();
      }

STEP 2. 수량 증가·감소 기능 추가 코드 설명

  • 추가된 기능
    • 수량 증가/감소 버튼 동작
      • + 버튼: 수량 증가
      • – 버튼: 수량 감소 (최소 1로 제한)
    • ES6 클래스 기반 구조
      • CartManager 클래스로 기능 관리
      • 이벤트 리스너를 통한 버튼 처리
    • 실시간 업데이트
      • 수량 변경 시 즉시 화면 반영
      • 개별 상품 가격 자동 계산 및 표시
      • 전체 합계 자동 업데이트
    • 사용자 경험 개선
      • 수량이 1일 때 감소 버튼 비활성화
      • 버튼 호버 효과 추가
    • 주요 코드 구조
      • handleIncrease(): 수량 증가 처리
      • handleDecrease(): 수량 감소 처리 (1 미만 방지)
      • updateItemPrice(): 개별 상품 가격 업데이트
      • updateTotalPrice(): 전체 합계 계산 및 업데이트

    STEP 3. 총 결제 금액 자동 계산

    장바구니에 담긴 상품들의
    총 결제 금액을 자동으로 계산하는 기능을 추가해줘.
    
    조건:
    - 상품 가격 × 수량 기반 계산
    - 수량 변경 시 즉시 반영
    - 천 단위 콤마 표시
    

    이 단계는 실무에서 매우 중요합니다.
    숫자 로직이 들어가면서 서비스 느낌이 강해집니다.

    Cursor에 입력한 세번째 프롬프트.
이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
    Cursor에 입력한 세번째 프롬프트.
    이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

    STEP 3. 총 결제 금액 자동 계산 코드(일부 발췌)

    // 초기 상태: 모든 상품의 가격을 수량에 맞게 업데이트
            const cartItems = document.querySelectorAll('.cart-item');
            cartItems.forEach(item => {
              this.updateItemPrice(item);
            });
    

    STEP 3. 총 결제 금액 자동 계산 코드 설명

    1. 총 결제 금액 자동 계산
    • 총 결제 금액 자동 계산
      • 상품 가격 × 수량으로 계산
      • 수량 변경 시 즉시 반영
      • 천 단위 콤마 표시 (toLocaleString(‘ko-KR’))
      • UI 개선
        • “총 결제 금액” 섹션 추가
        • 결제 영역 스타일 개선 (배경색, 패딩, 그림자)
        • 초기 로드 시 자동 계산
          • 페이지 로드 시 모든 상품 가격과 총합 자동 계산
          • 개별 상품 가격도 수량을 반영해 표시

        STEP 4. 장바구니 상태 유지 (LocalStorage)

        현재 장바구니 상태를
        브라우저 LocalStorage에 저장하고 불러오는 기능을 추가해줘.
        
        조건:
        - 새로고침 시 장바구니 유지
        - 상품 추가/삭제/수량 변경 시 자동 저장
        

        이제 단순 연습용 페이지를 넘어
        실제 사용자 경험을 고려한 구조가 됩니다.

        Cursor에 입력한 네번째 프롬프트.
이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
        Cursor에 입력한 네번째 프롬프트.
        이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

        STEP 4. 장바구니 상태 유지 코드(일부 발췌)

        // LocalStorage에서 장바구니 데이터 불러오기
              loadCartFromStorage() {
                try {
                  const storedData = localStorage.getItem(this.storageKey);
                  if (storedData) {
                    this.cartItems = JSON.parse(storedData);
                  }
                } catch (error) {
                  console.error('장바구니 데이터 불러오기 실패:', error);
                  this.cartItems = [];
                }
              }
        

        STEP 4. 장바구니 상태 유지 코드 설명

          • LocalStorage 저장 / 불러오기
            • 페이지 로드 시 LocalStorage에서 장바구니 데이터 불러오기
            • 데이터가 없으면 기본 상품 3개로 초기화
            • 자동 저장
              • 수량 증가/감소 시 자동 저장
              • 상품 삭제 시 자동 저장
              • 모든 변경사항 즉시 LocalStorage에 반영
              • 새로고침 시 유지
                • 브라우저 새로고침 후에도 장바구니 상태 유지
                • 브라우저를 닫았다가 다시 열어도 유지
                • 삭제 기능
                  • 삭제 버튼 클릭 시 확인 후 상품 제거
                  • 삭제 후 자동 저장 및 UI 업데이트

                STEP 5. 결제 UI 화면 구성

                장바구니 하단에 결제 UI를 추가해줘.
                
                구성:
                - 주문 상품 요약
                - 배송 정보 입력 폼
                - 결제 버튼
                
                조건:
                - 필수 입력값 없으면 결제 버튼 비활성화
                - 실제 결제 연동은 하지 않음
                

                이 단계는 구매 흐름을 완성하는 핵심 UI입니다.

                Cursor에 입력한 다섯번째 프롬프트.
이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
                Cursor에 입력한 다섯번째 프롬프트.
                이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

                STEP 5. 결제 UI 화면 구성 코드 (일부 발췌)

                // 결제 폼 이벤트 리스너 설정
                      setupCheckoutFormListeners() {
                        // 필수 입력 필드에 이벤트 리스너 추가
                        const requiredFields = [
                          'receiverName',
                          'receiverPhone',
                          'postcode',
                          'address',
                          'detailAddress'
                        ];
                
                        requiredFields.forEach(fieldId => {
                          const field = document.getElementById(fieldId);
                          if (field) {
                            field.addEventListener('input', () => {
                              this.validateField(field);
                              this.updateCheckoutButton();
                            });
                            field.addEventListener('blur', () => {
                              this.validateField(field);
                              this.updateCheckoutButton();
                            });
                          }
                        });
                
                        // 결제 버튼 클릭 이벤트
                        const checkoutButton = document.getElementById('checkoutButton');
                        if (checkoutButton) {
                          checkoutButton.addEventListener('click', () => {
                            this.handleCheckout();
                          });
                        }
                      }
                

                STEP 5. 결제 UI 화면 구성 코드 설명

                  • 주문 상품 요약
                    • 장바구니 상품 목록 표시
                    • 상품명, 옵션, 수량, 가격 표시
                    • 장바구니 변경 시 자동 업데이트
                    • 배송 정보 입력 폼
                      • 받는 분 (필수)
                      • 연락처 (필수)
                      • 우편번호 (필수)
                      • 주소 (필수)
                      • 상세 주소 (필수)
                      • 배송 메모 (선택)
                      • 결제 버튼
                        • 필수 입력값이 모두 입력되면 활성화
                        • 클릭 시 결제 완료 알림 표시 (실제 결제 연동 없음)

                      STEP 6. UX 및 반응형 마무리

                      전체 장바구니 + 결제 UI를 기준으로
                      UX와 반응형을 개선해줘.
                      
                      조건:
                      - 모바일 터치 영역 확대
                      - 클릭 피드백 추가
                      - 입력 오류 안내 메시지
                      

                      여기까지 오면
                      “AI로 만든 연습용 페이지”가 아니라 “완성된 서비스 화면”이 됩니다.

                      Cursor에 입력한 여섯번째 프롬프트.
이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
                      Cursor에 입력한 여섯번째 프롬프트.
                      이해를 돕기 위해 제공하는 직접 캡쳐 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

                      STEP 6. UX 및 반응형 마무리 코드(일부 발췌)

                      // 모든 필수 필드 검증
                            validateAllFields() {
                              const requiredFields = [
                                'receiverName',
                                'receiverPhone',
                                'postcode',
                                'address',
                                'detailAddress'
                              ];
                      
                              let allValid = true;
                              requiredFields.forEach(fieldId => {
                                const field = document.getElementById(fieldId);
                                if (field) {
                                  const isValid = this.validateField(field);
                                  if (!isValid) {
                                    allValid = false;
                                  }
                                }
                              });
                      
                              return allValid;
                            }
                      

                      STEP 6. UX 및 반응형 마무리 코드 설명

                      • 모바일 터치 영역 확대
                        • 모든 버튼 최소 크기 44px 이상 (터치 가이드라인 준수)
                        • 수량 조절 버튼: 44px × 44px
                        • 삭제 버튼: 최소 높이 44px
                        • 결제 버튼: 최소 높이 56px (모바일 52px)
                        • 입력 필드: 최소 높이 44px
                      • 클릭 피드백 추가
                        • 버튼 클릭 시 scale 애니메이션 (0.95)
                        • 결제 버튼 리플 효과
                        • 카드 클릭 시 약한 scale 피드백
                        • 호버 시 그림자 효과 (데스크톱)
                        • 터치 디바이스에서 호버 효과 비활성화
                      • 입력 오류 안내 메세지
                        • 각 필드별 상세 오류 메시지 표시
                        • 실시간 검증 (입력 중)
                        • 필드별 검증 규칙:
                        • 받는 분: 2자 이상, 한글/영문만
                        • 연락처: 자동 하이픈 포맷팅, 형식 검증
                        • 우편번호: 5자리 숫자
                        • 주소/상세주소: 최소 길이 검증
                        • 오류 시 shake 애니메이션
                        • 성공 시 초록색 테두리 표시
                      • 추가 개선사항
                        • 연락처 자동 포맷팅 (010-1234-5678 형식)
                        • 결제 버튼 로딩 상태 표시
                        • 오류 필드로 자동 스크롤
                        • 포커스 시 그림자 효과
                        • 모바일 반응형 레이아웃 개선
                        • 애니메이션 전환 효과
                      최종적으로 완성한 장바구니 페이지
이해를 돕기 위해 제공하는 직접 캡쳐한 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
                      최종적으로 완성한 장바구니 페이지
                      이해를 돕기 위해 제공하는 직접 캡쳐한 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
                      최종적으로 완성한 배송정보 페이지
이해를 돕기 위해 제공하는 직접 캡쳐한 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
                      최종적으로 완성한 배송정보 페이지
                      이해를 돕기 위해 제공하는 직접 캡쳐한 이미지로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

                      Part 5 정리 — 그리고 시리즈를 마치며

                      이번 Part 5를 끝으로
                      [AI웹제작] 쇼핑몰 페이지 만들기 시리즈는 1차 완결입니다.

                      이 시리즈를 통해 얻으셨다면, 그것만으로도 충분히 가치 있습니다.

                      • AI를 ‘코드 생성기’가 아닌 개발 도구로 활용하는 방법
                      • 실무에 가까운 UI/UX 사고 방식
                      • 비전공자도 따라갈 수 있는 구조적 접근

                      이제 여러분은
                      “AI로 웹페이지를 만들어본 사람”이 아니라 “AI로 하나의 서비스를 완성해본 사람”입니다.

                      [제로의 GitHub 저장소 바로가기]

                      이전 편 다시보기

                      AI 웹 개발 : 부업용 쇼핑몰 페이지 구조 기획 (초보자·비전공자 실무 강화) | 쇼핑몰 만들기 Part 1
                      AI 웹 개발 : Cursor로 반응형 쇼핑몰 페이지 구현하기 (초보자·비전공자 실무 강화) | 쇼핑몰 만들기 Part 2
                      AI 웹 개발 : Cursor로 상품리스트 & 카드 UI 구현하기 (초보자·비전공자 실무 강화) | 쇼핑몰 만들기 Part 3
                      AI 웹 개발 : Cursor로 검색·필터·페이징 기능 구현하기 (초보자ㆍ비전공자 실무 강화) | 쇼핑몰 만들기 Part 4

                       AI 코딩 시리즈 다시보기

                      [HTML/CSS 입문] AI로 로그인 페이지 만들어보기 (GPT vs Cursor vs AntiGravity) | Part 1
                      [HTML/CSS 입문] AI로 반응형 로그인 페이지 개선하기 (GPT vs Cursor vs AntiGravity) | Part 2
                      [HTML/CSS 입문] AI로 반응형 로그인 페이지 확장하기 (GPT vs Cursor vs AntiGravity) | Part 3

                      [HTML/CSS 입문] AI로 로그인 페이지 레이아웃(탭 메뉴) 만들어보기(GPT vs Cursor vs AntiGravity) | Part 4
                      [HTML/CSS 입문] AI로 반응형 UI 만들어보기 (GPT vs Cursor vs AntiGravity) – Part 5
                      [HTML/CSS 입문] AI로 만드는 헤더·푸터·레이아웃 비교(Gpt vs Cursor vs AntiGravity) | Part 6

                      [HTML/CSS 입문] AI로 로그인 이후 ‘대시보드 UI’ 만들기 (GPT vs Cursor vs AntiGravity) | Part 7
                      [HTML/CSS 입문] AI로 대시보드 차트 UI 만들기(GPT vs Cursor vs AntiGravity) | Part 8
                      [HTML/CSS 입문] AI로 실시간 데이터·검색/필터·테이블/페이징 UI 만들기 (GPT vs Cursor vs AntiGravity) | Part 9
                      [HTML/CSS/JS 입문] AI로 만드는 ‘완성형 실무 대시보드’ (GPT vs Cursor vs AntiGravity) | Part 10

                      댓글 달기

                      이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

                      위로 스크롤