MapleStory Finger Point

๐Ÿ”˜ ํ”„๋กœ์ ํŠธ

[Project] ์ฃผ๋ฌธ ์˜ˆ์•ฝ ์‹œ์Šคํ…œ ๊ตฌํ˜„ [2] (์ฃผ๋ฌธ ๋“ฑ๋ก ๋ถ€๋ถ„)

HYEJU01 2025. 2. 7. 06:23
 

๋ชฉ์ฐจ

 

     

     

     

    ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋ฌธ์ œ์ž‘ ์†Œ์ƒ๊ณต์ธ๋“ค์„ ์œ„ํ•œ ์ฃผ๋ฌธ ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)

    https://github.com/hyejux/Neez\

     

    GitHub - hyejux/Neez: ์˜ˆ์•ฝ ์ด์   ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ, ๊ด€๋ฆฌ๋„ ์†์‰ฝ๊ฒŒ NEEZ ์—์„œ ๊ฒฝํ—˜ํ•ด๋ณด์„ธ์š”! ใ€Œ์ฃผ๋ฌธ ์ œ์ž‘ ์˜ˆ

    ์˜ˆ์•ฝ ์ด์   ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ, ๊ด€๋ฆฌ๋„ ์†์‰ฝ๊ฒŒ NEEZ ์—์„œ ๊ฒฝํ—˜ํ•ด๋ณด์„ธ์š”! ใ€Œ์ฃผ๋ฌธ ์ œ์ž‘ ์˜ˆ์•ฝ ์„œ๋น„์Šค "NEEZ "ใ€ - hyejux/Neez

    github.com

     

     


     

    [1ํƒ„]
    https://hyejux.tistory.com/828

     

    [ํ”„๋กœ์ ํŠธ/Spring Boot/Reactjs] ์ฃผ๋ฌธ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (์นดํ…Œ๊ณ ๋ฆฌ ๋ถ€๋ถ„)

    ๋ชฉ์ฐจ     ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋ฌธ์ œ์ž‘ ์†Œ์ƒ๊ณต์ธ๋“ค์„ ์œ„ํ•œ ์ฃผ๋ฌธ ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)https://github.com/hyejux/Neez GitHub - hyejux/Neez: ์˜ˆ์•ฝ

    hyejux.tistory.com

     

     

     

    ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

     

     


     

     

    1) ํŽ˜์ด์ง€ ๊ตฌ์ƒ

     

     

     

    ์ฃผ๋ฌธ ์˜ˆ์•ฝ ์ง„ํ–‰ ๊ณผ์ •์ด๋‹ค.

     

     

     

     

    ์ฃผ๋ฌธ์˜ˆ์•ฝ์„ ์ด๋Ÿฐ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ ...

     

     

     

     

    ์‚ฌ์šฉ์ž๋Š” ์˜ˆ์•ฝ๋ชฉ๋กํƒญ์—์„œ ์˜ˆ์•ฝ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

     

     

    ๊ด€๋ฆฌ์ž๋Š” ์˜ˆ์•ฝ๊ด€๋ฆฌ์—์„œ ๋“ค์–ด์˜จ ์ฃผ๋ฌธ๋“ค์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒ์„ธํŽ˜์ด์ง€์—์„œ๋Š” ๋” ์ž์„ธํ•œ ์ฃผ๋ฌธ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

     

    ์ƒํƒœ๊ฐ€ ํ™•์ •์œผ๋กœ ๋ฐ”๋€Œ๊ณ , ์‚ฌ์šฉ์žํ•œํ…Œ์„œ๋„ ํ™•์ •์œผ๋กœ ๋œฌ๋‹ค.

     

     

     

     

    ์ƒํƒœ๊ฐ€ ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ด์ œ ์ƒํƒœ๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•˜๊ณ , ์‚ฌ์šฉ์žํ•œํ…Œ์„œ๋Š” ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋ฒ„ํŠผ์ด ๋œฌ๋‹ค.

     

     

     

     

     

    ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌ๋ทฐ ๋ฒ„ํŠผ์€ ์‚ฌ๋ผ์ง.

     

     


     

    2) ๊ธฐ๋Šฅ ๊ตฌํ˜„ (DB/ ERD)

     

    ๋‹ด๋‹น ํŒŒํŠธ๋Š” ์˜ˆ์•ฝ, ์˜ˆ์•ฝํผ, ํ›„๊ธฐ ํŒŒํŠธ (์ด์™ธ ํŒŒํŠธ๋Š” ๋‹ค๋ฅธ ํŒ€์›๋ถ„์ด ๋งก์œผ์…จ๋‹ค)

     

     

    ์ฃผ๋ฌธ์ด ๋“ค์–ด๊ฐ€๊ฒŒ๋˜๋ฉด 

     

    `reservation` ํ…Œ์ด๋ธ” : ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€ํ‘œ ๊ฐ’๋“ค์„ ์ €์žฅํ•จ

     

     

    `reservation_form` ํ…Œ์ด๋ธ” : ์–ด๋–ค ์ฃผ๋ฌธ์„ ํ–ˆ๋Š”์ง€ ์นดํ…Œ๊ณ ๋ฆฌ + ์ฃผ๋ฌธ ๊ฐ’์„ ์ €์žฅํ•จ

     

    `reservation_no` ๋กœ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ๊ฐ€๊ณ 

    `main_category_id` , `middle_category_id` , `sub_category_id` ๋กœ ๊ฐ ์ฃผ๋ฌธ์— ๋งž๋Š” category ์•„์ด๋””๋ฅผ ์ €์žฅํ•œ๋‹ค.

     

     

     

     

     

     

     

     

     

     

     

     


     

    3) ๊ธฐ๋Šฅ ๊ตฌํ˜„ (์‚ฌ์šฉ์ž ์ฃผ๋ฌธ ๋“ฑ๋ก / ์กฐํšŒ)

     

     

     

    ์ฃผ๋ฌธํ™•์ธ์ฐฝ.jsx

     

      // ----------------------- ์ฃผ๋ฌธ๋“ฑ๋ก, ๊ฒฐ์ œ ๋ถ€๋ถ„ -----------------------
      const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(""); // ๊ฒฐ์ œ์ˆ˜๋‹จ
    
      const handleReservation = async (paymentMethod) => {
        let reservationNum = 0;
    
        const reservationStatus = paymentMethod === "bank_transfer" ? "์ž…๊ธˆ๋Œ€๊ธฐ" : "๋Œ€๊ธฐ";
    
        const reservationData = {
          reservationTime: slot,  // ์„ธ์…˜ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ด
          reservationSlotKey: reservationSlotKey,  // ์„ธ์…˜ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ด
          customerRequest: requestText,  // ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์š”์ฒญ์‚ฌํ•ญ
          reservationPrice: totalPrice,  // ์ด์•ก ์ •๋ณด
          storeNo: storeInfo.storeNo,
          reservationStatus: reservationStatus,
          userId: userId,
          userDeliveryType : pickupStatus
        };
    
        try {
          // 1. ์˜ˆ์•ฝ ์ •๋ณด ์ €์žฅ
          const response = await axios.post(`/userReservation/setReservationForm`, reservationData);
          reservationNum = response.data;
    
          console.log("์˜ˆ์•ฝ ๋ฒˆํ˜ธ: ", reservationNum);
    
          // 2. ์„ธ๋ถ€ ์˜ˆ์•ฝ ์ •๋ณด ์—…๋ฐ์ดํŠธ
          const updatedArray = formData.map(item => ({
            ...item,
            reservationNo: reservationNum
          }));
    
          await axios.post(`/userReservation/setReservationFormDetail`, updatedArray);
    
          // 3. ์Šฌ๋กฏ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
          await axios.post(`/userReservation/updateSlotStatus`, {
            categoryId: cateId,
            reservationDate: date,
            storeNo: sessionSestoreNo
          });
    
          console.log("์˜ˆ์•ฝ ์™„๋ฃŒ ๋ฐ ์Šฌ๋กฏ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต!");
    
          return reservationNum;
        } catch (error) {
          console.error("์˜ˆ์•ฝ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:", error);
          throw error;
        }
      };

     

    ์ฃผ๋ฌธ ๋“ฑ๋ก๊นŒ์ง€๋Š” ๋‚ด๊ฐ€ ๋‹ด๋‹นํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋„˜๊ฒจ๋“œ๋ ธ๊ณ 

    ๊ฒฐ์ œ ํŒŒํŠธ์™€ ์„ž์—ฌ์„œ ์œ„ ์ฝ”๋“œ๋Š” ๊ฒฐ์ œ ๋‹ด๋‹น ํŒ€์›๋ถ„์ด ์ž‘์„ฑํ•ด์ฃผ์‹  ์ฝ”๋“œ์ด๋‹ค.

     

    ๊ฒฐ์ œ ํ…Œ์ด๋ธ”์— ์˜ˆ์•ฝ๋ฒˆํ˜ธ ํ‚ค๋ฅผ ๋„ฃ์–ด์•ผํ•ด์„œ ๋จผ์ € ์˜ˆ์•ฝ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ 

    ์„ธ๋ถ€ ์˜ˆ์•ฝ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์‹ ๋“ฏ ํ•˜๋‹ค.

     

     

     

     

    reservation_form ํ…Œ์ด๋ธ”์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’

    [
        {
            "inputValue": "0",
            "servicePrice": 0,
            "categoryId": 33,
            "isRequired": true
        },
        {
            "1": [
                {
                    "serviceName": "๋ฉœ๋ก ",
                    "servicePrice": 600,
                    "categoryId": 36
                }
            ]
        },
        {
            "inputValue": "์ƒ์ผ ์ถ•ํ•˜ํ•ด",
            "servicePrice": 0,
            "categoryId": 39,
            "isRequired": false
        }
    ]

     

     

     

    ๋‚˜๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์š”์ฒญ์„ ๋ณด๋ƒˆ๊ณ  ์„œ๋ฒ„์—์„œ ๊ตฌ์กฐ๋งŒ ๋งž๊ฒŒ List ๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

     

     

     

     


    dto

     

    package com.example.HiMade.user.dto;
    
    import lombok.*;
    
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    @Setter
    @ToString
    @Builder
    
    public class UserReservationFormDTO {
    
      private int reservationFormKey;
      private int mainCategoryId;
      private int middleCategoryId;
      private int subCategoryId;
      private String middleCategoryValue;
      private int reservationNo;
    }

     

     

     

    serviceImpl

     

      @Transactional
      @Override
      public void setReservationFormDetail(List<UserReservationFormDTO> dto) {
        for (UserReservationFormDTO d : dto ){
          System.out.println("์‚ฝ์ž… ๊ฐ’" + d);
    
         int result = userReservationMapper.setReservationFormDetail(d);
          System.out.println(result);
        }
      }

     

     



    mapper.xml

        <insert id="setReservationForm" parameterType="UserReservationDTO" useGeneratedKeys="true" keyProperty="reservationNo">
            INSERT INTO reservation (reservation_status, reservation_time, reg_time, customer_request, reservation_price, user_id, reservation_slot_key, store_no, user_delivery_type)
            VALUES (#{reservationStatus}, #{reservationTime}, CURRENT_TIMESTAMP, #{customerRequest}, #{reservationPrice}, #{userId}, #{reservationSlotKey}, #{storeNo}, #{userDeliveryType})
            RETURNING reservation_no
        </insert>
    
        <insert id="setReservationFormDetail" parameterType="com.example.HiMade.user.dto.UserReservationFormDTO">
            insert into reservation_form (main_category_id, middle_category_id, sub_category_id, middle_category_value, reservation_no )
            values(#{mainCategoryId}, #{middleCategoryId}, #{subCategoryId}, #{middleCategoryValue}, #{reservationNo})
        </insert>

     

     

     

     

    ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ

     

     <select id="getMyReservationDetail" resultType="com.example.HiMade.user.dto.UserRD" parameterType="int">
            SELECT
            rf.reservation_no,
            rf.reservation_form_key,
            rf.middle_category_value,
            r.user_delivery_type,
            main_c.service_name AS main_category_name,
            main_c.service_price AS main_price,
            middle_c.service_name AS middle_category_name,
            middle_c.service_price AS middle_price,
            sub_c.service_name AS sub_category_name,
            sub_c.service_price AS sub_price,
            s.store_name AS store_name,
            s.account_bank AS account_bank,
            s.account_number AS account_number
            FROM
            reservation_form rf
            LEFT JOIN
            reservation r ON rf.reservation_no = r.reservation_no
            LEFT JOIN
            store s ON r.store_no = s.store_no
            LEFT JOIN
            category main_c ON rf.main_category_id = main_c.category_id
            LEFT JOIN
            category middle_c ON rf.middle_category_id = middle_c.category_id
            LEFT JOIN
            category sub_c ON rf.sub_category_id = sub_c.category_id
            WHERE
            r.reservation_no = #{id};
        </select>

     

     

     

    ์กฐํšŒ ๋ถ€๋ถ„์€ ๋ฌด์ง€์„ฑ JOIN ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ... ๊ฐ€์ง€๊ณ  ๋‚˜์™”๋‹ค. (๋ถ„๋ช… ๋” ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค..... )

     

     

     

     


    4) ํ›„๊ธฐ

     

    โœ… ์ฃผ๋ฌธ ํผ ์ €์žฅ๋ฐฉ์‹์„  main, middle, sub ๋กœ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์•„๋‹Œ, ์ข€ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ 

    ex) ์žฌ๊ท€์  ์ฟผ๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๊ธฐ, ํ•œ์ค„๋กœ ๋ฌถ์–ด์„œ ์ถœ๋ ฅํ•˜๊ธฐ ๋“ฑ