Coding Planet

์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ - ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๋ณธ๋ฌธ

๐Ÿ“šํ”„๋กœ์ ํŠธ/๐Ÿ’ณ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ

์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ - ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง

jhj.sharon 2023. 6. 13. 14:14
๋ฐ˜์‘ํ˜•
์‡ผํ•‘๋ชฐ์€ ๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 
ํŠนํžˆ ์ƒํ’ˆ์„ ์ƒํ’ˆ์˜ ์ƒ‰, ๊ฐ€๊ฒฉ, ์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ์กฐ๊ฑด์— ์˜ํ•ด ํ•„ํ„ฐ๋งํ•  ๋•Œ๋Š” ์ถœ๋ ฅ๋˜๋Š” ์ƒํ’ˆ์€ ๋‹ค๋ฅด๋”๋ผ๋„ ๊ทธ ํ˜•์‹์€ ๋Œ€๋ถ€๋ถ„ ๋™์ผํ•˜๋‹ค. ์ƒํ’ˆ์˜ ์ƒ์„ธํŽ˜์ด์ง€๋„ ์„ธ๋ถ€ ์ •๋ณด๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ทธ ํ˜•์‹์€ ๋™์ผํ•˜๋‹ค. 
๋”ฐ๋ผ์„œ, ํ˜•์‹์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ธ๋ถ€๋‚ด์šฉ์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ • ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ url์„ ํ†ตํ•ด ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์ด๋‹ค.

 

1. ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์ด๋ž€?

  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง(Query String)์€ URL์˜ ์ผ๋ถ€๋กœ์จ ์›น ํŽ˜์ด์ง€๋กœ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.
  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์€ `?` ๋ฌธ์ž๋กœ URL์˜ ๊ฒฝ๋กœ์™€ ๊ตฌ๋ถ„๋˜๋ฉฐ, `key=value` ํ˜•์‹์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” `&` ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

 

url=http(ํ”„๋กœํ† ์ฝœ) + ๋„๋ฉ”์ผ + path + ์ฟผ๋ฆฌ์ŠคํŠธ๋ง

  • ์œ„์˜ URL์—์„œ `?` ์ดํ›„์˜ ๋ฌธ์ž์—ด์ธ `category=poster&type=photo`๊ฐ€ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์ด๋‹ค. 
  • ์ด ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์€ `category`์™€ `type` ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ๊ฐ’์€ `poster`์™€ `photo`์ด๋‹ค.
  • ์œ„ ์˜ˆ์‹œ์—์„œ productMain์€ 'path' ํ˜น์€ '๋ผ์šฐํŠธ'๋ผ๊ณ  ํ•œ๋‹ค. 
  • ์œ„์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ path๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

2. ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ์‚ฌ์šฉํ•˜๊ธฐ

์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€
๊ฐœ๋ณ„ ์ƒํ’ˆํŽ˜์ด์ง€

 

1) ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ์„ค์ •ํ•˜๊ธฐ

  • ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์‡ผํ•‘๋ชฐ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ์ƒํ’ˆ ๋ชฉ๋ก์—์„œ ์ƒํ’ˆ ์ด๋ฏธ์ง€ ์นด๋“œ ํด๋ฆญ์‹œ ๊ฐœ๋ณ„ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ์ฃผ์†Œ์ด๋‹ค.
  • ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ง์ ‘ ์ž…๋ ฅํ•ด๋„ ๋˜๊ณ  JavaScript์— ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ค˜๋„ ๋œ๋‹ค. ์ค‘์š”ํ•œ๊ฑด ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š๋ƒ๊ณ  ์•„๋‹ˆ๊ณ  '?' ํ˜•์‹์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.
      <div class="product-item" id="${itemObj.productId}">
        <div class="product-item-img">
           <a href="/stroke/product/productDetail?product_id=${itemObj.productId}">
            <img src="../${itemObj.productImage}" alt="">
          </a>
          <i class="${heartIconClass}" style="${heartIconStyle}"></i>
        </div>
 
        <div class="product-item-info">
          <span>${itemObj.productName}</span>
          <span>${itemObj.productArtist}</span>
          <span>${itemObj.productPrice}์›</span>
        </div>
      </div>

<a href="/stroke/product/productDetail?product_id=${itemObj.productId}">

 

  • ajax๋กœ ์„œ๋ฒ„์—์„œ ์ „์ฒด ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฐ์ฒด๋ฐฐ์—ด๋กœ ์ €์žฅํ•˜๊ณ  ์ƒํ’ˆ ์นด๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค (tmi)

 

 

 

2) ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ํ•ด๋‹น ๊ฐ’ ๋ฐ›์•„์˜ค๊ธฐ

 

		//์ œํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€ ์ด๋™
		   @GetMapping("/productDetail")
		    public String getProductDetailPage(@RequestParam("product_id")int productId, 
		    								   Model model) {
			// productId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ’ˆ ์ •๋ณด ์กฐํšŒ
		        Product product = service.getProductById(productId);

		        // ์กฐํšŒ๋œ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ๋กœ ์ „๋‹ฌ
		        model.addAttribute("product", product);

		        return "product/productDetail"; // productDetail.jsp์™€ ๊ฐ™์€ ๋ทฐ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
		    }
  • @RequestParam("product_id")int productId : ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์˜ ๊ฒฝ์šฐ RequestParam์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๋‹น๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ์„œ๋ฒ„์—์„œ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ View๋‹จ์œผ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์ค€๋‹ค.
        

 

 

3) JSP์—์„œ ํŽ˜์ด์ง€ ๊ตฌํ˜„ํ•˜๊ธฐ

        <!-- ์ƒํ’ˆ ํ—ค๋” ์˜์—ญ -->
       <div class="product-detailArea" >
        <!-- ์ƒํ’ˆ ์ธ๋„ค์ผ ์˜์—ญ -->
        <div class="product-imageArea" >
            <img class="target" src="${contextPath}/${product.productImage}"  data-zoom="2">
        </div>
        <!-- ์ƒํ’ˆ ์ •๋ณด ์˜์—ญ -->
        <div class="product-infoArea" >

            <div class="product-headingArea">
                <h2>${product.productName}</h2>
                <i class="fa-regular fa-heart"></i>
            </div>
            <div class="product-info-detail">
                <p class="writerName">${product.productArtist}</p>
                <button id="artist-page-btn" onclick="location.href='#' ">์ž‘๊ฐ€ํŽ˜์ด์ง€</button>
                <p class="product-content">${product.productContent}</p>
            </div>
            <hr>
            <div class="product-price">
                <table summary="๊ฐ€๊ฒฉํ…Œ์ด๋ธ”">
                    <tr>
                        <td class="td1">ํŒ๋งค๊ฐ€</td>
                        <td class="td2">${product.productPrice}์›</td>
                    </tr>
                </table>
                <hr>
            </div>
            <div class="min-order">

                <span >์ตœ์†Œ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ : 1๊ฐœ</span>
            </div>

            <div class="product-option">
                <table summary="๊ฐ€๊ฒฉํ…Œ์ด๋ธ”">
                    <tr>
                        <td class="td1">ํ•„์ˆ˜์˜ต์…˜</td>
                        <td class="td2">
                            <select name="option1" id="option1">
                                <c:if test="${not empty product.productOption1}">
                                    <c:set var="options" value="${fn:split(product.productOption1, '/')}"/>    
                                    <c:forEach items="${options}" var="option">
                                        <option value="${option}">${option}</option>
                                    </c:forEach>
                                </c:if>
                                <c:if test="${empty product.productOption1 and not empty product.productOption2}">
                                    <c:set var="options" value="${fn:split(product.productOption2, '/')}"/>    
                                    <c:forEach items="${options}" var="option">
                                        <option value="${option}">${option}</option>
                                    </c:forEach>
                                </c:if>
                            </select>

                        </td>

                    </tr>
                </table>
            </div>

 

๋ฐ˜์‘ํ˜•
Comments