๋ชฉ์ฐจ
ํด๋น ํ๋ก์ ํธ๋ ์ฃผ๋ฌธ์ ์ ์์๊ณต์ธ๋ค์ ์ํ ์ฃผ๋ฌธ ํ๋ซํผ ํ๋ก์ ํธ์ ๋๋ค.
ํ๋ก์ ํธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊นํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์ :)
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) ์ฌ๊ท์ ์ฟผ๋ฆฌ ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ๋ณด๊ธฐ, ํ์ค๋ก ๋ฌถ์ด์ ์ถ๋ ฅํ๊ธฐ ๋ฑ