JSP

카카오톡 결제 API를 사용하여 작은 결제 프로젝트 만들어보기 - 2

보배 진 2025. 12. 3. 18:37

 

 

 

 

 

 

JSP 분석

각 JSP가 어떤 데이터를 request attribute로 받는지 확인

index.jsp ➡ 결제 버튼 / 상품 선택

paymentSuccess.jsp ➡ 결제 완료 페이지

orderHistory.jsp ➡ 주문 내역 출력

paymentFail.jsp ➡ 주문 실패 페이지

 

 




index.jsp 

<body>
    <h2>테스트 상품 결제</h2>
    
    <!-- 결제 내역 버튼 -->
    <div class="history-wrapper">
        <a href="${pageContext.request.contextPath}/OrderHistory.do" class="history-button">결제 내역 보기</a>
    </div>
    
    <!-- 상품 목록 가로 배치 -->
    <div class="products-wrapper">
        <div class="product-card">
            <img src="images/kiki.jpg" alt="오리">
            <div class="product-name">오리</div>
            <div class="product-price">₩4,500</div>
            <form action="https://jaxon-implorable-jocelynn.ngrok-free.dev/payMent/KakaoPayReady.do" method="post">
                <input type="hidden" name="pid" value="P001">
                <button type="submit" class="pay-button">구매하기</button>
            </form>
        </div>

        <div class="product-card">
            <img src="images/kiki2.jpg" alt="병아리">
            <div class="product-name">병아리</div>
            <div class="product-price">₩5,000</div>
            <form action="https://jaxon-implorable-jocelynn.ngrok-free.dev/payMent/KakaoPayReady.do" method="post">
                <input type="hidden" name="pid" value="P002">
                <button type="submit" class="pay-button">구매하기</button>
            </form>
        </div>
        (상품추가는 반복)
    </div>
</body>
</html>

 

index 페이지에서는

테스트 상품 결제 페이지로

사용자가 상품을 보고 결제 버튼을 눌러 카카오페이로 결제할 수 있음

 

JSP EL ${pageContext.request.contextPath} 사용

프로젝트 컨텍스트 경로 자동 적용

클릭시 OrderHistoryAction이 호출되고, 주문내역 페이지로 이동

 

 

 

▪ 상품 목록

가로 배치 카드 형태로 각 상품 표시

각 카드에는 :

1. 이미지, 2 이름, 3 가격, 4 결제 버튼

form action ➡ KakaoPayReady.do 

서버 측 KakaoPayReadyAction 호출

pid 전송 ➡ 어떤 상품 결제인지 서버에서 확인

 

 

 

특징 

각 상품마다 별도의 form

hidden input으로 pid를 보내서 서버에서 ProductDAO 조회 가능

 

 

▪ 결제 흐름

1. 사용자가 구매하기 버튼 클릭

2. form POST ➡ /KakaoPayReady.do 호출

3. 서버에서 pid 확인 ➡ ProductDAO에서 상품 정보 조회

4. 카카오페이 준비 API  호출(결제 요청)

5. 사용자 카카오페이 화면 ➡ 결제 완료

6. KakaoPayApproveAction ➡ 결제 승인 후 OrderDTO 생성, DB 저장

 

 


 

 

 

 

 

 

orderHistory.jsp

<body>
    <h2>주문 내역</h2>
    <a href="${pageContext.request.contextPath}/index.jsp" class="home-button">메인페이지</a>
    <div class="order-list">
        <c:forEach var="o" items="${order}">
            <div class="order-item">
                <img src="${pageContext.request.contextPath}/${o.imgURL}" alt="${o.productName}">
                <div class="order-info">
                    <p><strong>상품명:</strong> ${o.productName}</p>
                    <p><strong>금액:</strong> ${o.orderPrice}원</p>
                    <p><strong>주문일:</strong> ${o.orderDate}</p>
                </div>
            </div>
        </c:forEach>
    </div>
</body>
</html>

 

주문 내역 페이지 (orderHistory.jsp)

사용자가 이전에 구매한 주문 내역을 확인할 수 있도록 구현

MVC 패턴에서 View 역할 수행

 

 

 

${pageContext.request.contextPath} 

프로젝트 컨텍스트 경로 동적으로 적용

 

 

 

▪ 주문 목록 반복

<div class="order-list">
    <c:forEach var="o" items="${order}">
        <div class="order-item">
            ...
        </div>
    </c:forEach>
</div>

<c:forEach> → JSTL(JSP Standard Tag Library) 반복문

items="${order}" → Controller(Action)에서 전달한 request.setAttribute("order", orderList)

var="o" → 반복 시 각 OrderDTO 객체를 o로 참조

 

즉, 모든 주문(OrderDTO 객체)을 순회하며 HTML 출력

 

 

 

 

개별 주문 아이템 출력

<img src="${pageContext.request.contextPath}/${o.imgURL}" alt="${o.productName}">
<div class="order-info">
    <p><strong>상품명:</strong> ${o.productName}</p>
    <p><strong>금액:</strong> ${o.orderPrice}원</p>
    <p><strong>주문일:</strong> ${o.orderDate}</p>
</div>

 

<img> → 주문한 상품 이미지 표시

alt → 이미지 대체 텍스트

 

${o.productName}, ${o.orderPrice}, ${o.orderDate} → OrderDTO 필드 사용

 

 

 

▪ 데이터 흐름

1. 사용자가 주문 내역 보기 버튼 클릭 ➡ OrderHistoryAction 호출

2. Action에서 DAO에서 주문 리스트 조회 → orderList

3. request.setAttribute("order", orderList)로 JSP에 전달

4. JSP에서 <c:forEach>로 반복 → 각 주문 출력

즉, Controller → Model → View 흐름 그대로 반영

 

 

 

 

 

 


 

paymentSuccess.jsp

<body>
    <div class="success-card">
        <h2>결제가 완료되었습니다!</h2>
        <p>주문번호: ${sessionScope.tid}</p>
        <p>감사합니다.</p>
        <a href="${pageContext.request.contextPath}/index.jsp" class="home-button">메인페이지</a>
    </div>
</body>
</html>

 

결제 성공 페이지

사용자가 결제를 완료했음을 확인

결제 완료 후 주문번호 표시 및 메인페이지 이동 버튼 제공

 

 

<div class="success-card">

카드 형태로 결제 성공 메시지 시각화

 

 

<p>주문번호: ${sessionScope.tid}</p>

${sessionScope.tid} → 세션에서 TID를 꺼내어 출력

KakaoPayApproveAction에서 결제 승인 후 session.setAttribute("tid", tid)로 저장했을 경우 사용 가능

 

 

${pageContext.request.contextPath}/index.jsp → 프로젝트 컨텍스트 자동 적용

${pageContext} : JSP에서 페이지 관련 정보를 담고 있는 내장 객체

request : 현재 클라이언트 요청 정보를 가진 HttpServletRequest 객체

contextPath : 웹 애플리케이션 컨텍스트 경로 반환

▶ JSP EL을 통해 프로젝트 컨텍스트 경로 + index.jsp

 

 

 


 

 

 

paymentFail.jsp

<body>
    <div class="fail-card">
        <h2>결제에 실패했습니다.</h2>
        <a href="<%= request.getContextPath() %>/payMent/OrderHistory.do">주문 내역 보기</a>
        <a href="${pageContext.request.contextPath}/index.jsp" class="home-button">메인페이지</a>
    </div>
</body>
</html>

 

 

 


 

web.xml

FrontController mapping 확인

CharacterEncodingFilter 있는지

KakaoPay redirect_url 설정 영향 확인

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>payMent</display-name>
    
	<servlet>
		<servlet-name>FrontController</servlet-name>
		<display-name>FrontController</display-name>
		<description></description>
		<servlet-class>controller.common.FrontController</servlet-class>
	</servlet>

	<!-- FrontController URL 패턴 매핑 -->
    <servlet-mapping>
        <servlet-name>FrontController</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.xhtml</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.xhtml</welcome-file>
	</welcome-file-list>
</web-app>

 

FrontController 패턴 핵심 : 모든 요청을 하나의 서블릿에서 처리

기존처럼 개별 서블릿을 다 등록할 필요 없음

 

 

 


 

 

 

🔥 우선순위 순서 요약

  1. FrontController.java
  2. ActionFactory.java
  3. 각 Action (Ready → Approve → History)
  4. Dao (OrderDAO / ProductDAO)
  5. DTO
  6. JSP
  7. web.xml