
MultiImageForm์ ์ด๊ธฐ ๊ตฌํ์ ์ด๋ฏธ์ง ํ์ผ์ ์ ํํ ๋๋ง๋ค ํ๋์ฉ Supabase Storage์ temporary ํด๋์ ์
๋ก๋ํ๊ณ URL์ ๊ฐ์ ธ์ค๊ณ , ์ญ์ ์์๋ ๋งค๋ฒ Storage์ ์ฆ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ์ต๋๋ค.
์ด ๋ก์ง์ ๊ฒ์๊ธ ์
๋ก๋ ์ ํ ๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ์ฌ ์๊ธธ Storage์์ ๋คํธ์ํฌ ํต์ ์ง์ฐ์ ์ค์ด๊ณ , ์ด๋ฏธ์ง ํ์ผ ๊ด๋ฆฌ ๋ก์ง์ ์ปดํฌ๋ํธ ๋จ์๋ก ์ง์คํํ๋ ค๋ ์๋์์ ๋น๋กฏ๋์์ต๋๋ค. ๋, house ํ
์ด๋ธ์๋ ์ด๋ฏธ์ง ์ด๋ฆ๋ง ์ ์ฅํ๊ณ ๋ค๋ฅธ ํ์ด์ง์์ ํด๋น ์ด๋ฏธ์ง ์ด๋ฆ์ ๊ฐ์ง๊ณ ๋ถ๋ฌ์ ๋ณด์ฌ์ฃผ๋๋ก ํ๊ธฐ ์ํด, ์
๋ก๋๋ ์ด๋ฏธ์ง๋ฅผ temporary ํด๋์ ๋ณด๊ดํ ๋ค ๊ฒ์๊ธ์ด ์ ์ถ๋๋ฉด ์ต์ข
์ ์ผ๋ก storage/images/houseId ํด๋๋ก ์ด๋์ํค๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ์ต๋๋ค.
๐
์ด๊ธฐ ๊ตฌํ๊ณผ ๊ด๋ จํด์๋ Multi Image Form(๋ค์ค ์ด๋ฏธ์ง ์ ๋ก๋) & supabase storage ๊ฒ์๊ธ์ ์ฐธ๊ณ ํ์ธ์.
๊ทธ๋ฌ๋, ์ด๋ฌํ ๋ฐฉ์์ ๋คํธ์ํฌ ์์กด์ฑ์ด ์ง๋์น๊ฒ ๋์์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค:
temporary ํด๋์ ์ด๋ฏธ ์
๋ก๋๋ ์ด๋ฏธ์ง๊ฐ ๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ์ถ๊ฐ์ ์ธ ํํฐ๋ง ๋ก์ง์ด ํ์ํ์ต๋๋ค.temporary ํด๋์์ houseId ํด๋๋ก ์ด๋ํ ๋ค temporary๋ฅผ ๋น์ฐ๋ ๊ณผ์ ์ ๋ถํ์ํ๊ฒ ๋ก์ง์ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ ์ง๋ณด์๋ฅผ ์ด๋ ต๊ฒ ํ์ต๋๋ค.์ด๋ฏธ์ง๋ฅผ Storage์ ์ฆ์ ์ ๋ก๋ํ์ง ์๊ณ ๋ก์ปฌ์์ ๊ด๋ฆฌํด ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ ๊ฑฐํ๊ณ , ๊ฒ์๊ธ ์ ์ถ ์ ์ต์ข ์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ Storage์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
์ค๋ณต๋ ์ด๋ฏธ์ง ์ด๋/์ญ์ ๋ก์ง์ ์ถ์ํํ๊ณ , ํจ์์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ ๋๋ค.
โ ๏ธ
๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๊ฐ ๊ธฐ๋ฅ์ ๋ช ํํ ๋๋ฌ๋ด๋๋ก ํจ์๋ช ๋ฐ ๋ณ์๋ช ์ ์์ ํ์ฌ, ๊ธฐ์กด ์ด๋ฆ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๊ธฐ์กด์๋ โ ย ์ด๋ฏธ์ง๋ฅผ Storage์ ์ ๋ก๋ํ ๋ค, โกย ํด๋น ํ์ผ์ Storage URL์ ๊ฐ์ ธ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ฌ์ฉํ์ต๋๋ค. ์ด ๋ฐฉ์์ ๊ฐ๋จํด ๋ณด์ด์ง๋ง, API ์์ฒญ์ด ๋ ๋ฒ ๋ฐ์ํ๋ฉด์ ๋ ๋๋ง ์๋๊ฐ ๋๋ ค์ง๊ณ , ์ฌ์ฉ์ ๊ฒฝํ(UX)์ด ์ ํ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.

์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ URL.createObjectURL๏ผ API๋ฅผ ํ์ฉํด ์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ์์ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
๐
URL.createObjectURL
- ํ์ผ ๋๋ Blob ๊ฐ์ฒด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ก์ปฌ URL์ ์์ฑํ๋ฉฐ, ์ด URL์ ํ์ผ์ ์์์ ์ผ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- Storage์ ์ ๋ก๋ํ์ง ์๊ณ ๋, ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ด๋ฏธ์ง๋ฅผ ์ฆ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ํ์ฉํ ์ ์์ต๋๋ค.
const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
const { files } = e.target;
if (!files) return;
// ์
๋ ฅ๋ฐ์ ๋ค์ค ์ด๋ฏธ์ง ํ์ผ๋ฐฐ์ด์ ๋๋ฉด์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ฌ์ฉํ url์ ์์ฑํฉ๋๋ค.
const fileArray = Array.from(files).map((file) => {
// ๊ณ ์ ๋ก์ปฌ URL์ ์์ฑํฉ๋๋ค.
const blobUrl = URL.createObjectURL(file);
// ์ด ๋, ์์ฑ๋๋ url์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ง๋๋ค. ์ด๋ฅผ ์ด๋ฏธ์ง์ ๊ณ ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฌ์ฉํฉ๋๋ค.
const imageUuid = blobUrl.split('/').pop() as string;
return {
file: new File([file], imageUuid, { type: file.type }),
preview: blobUrl,
name: imageUuid,
};
});
// ์ด๋ฏธ์ง์ file, url, name์ ๊ฐ๊ฐ ์ํ์ ์ ์ฉํฉ๋๋ค.
setImageFiles((prev) => [...prev, ...fileArray.map((item) => item.file)]);
setPreviewUrls((prev) => [...prev, ...fileArray.map((item) => item.preview)]);
form.setValue('house_img', [...form.getValues('house_img'), ...fileArray.map((item) => item.name)]);
};
Storage ์ ๋ก๋ ๋ฐ URL ๋ฐํ ๊ณผ์ ์ ์๋ตํ๊ณ , ์ด๋ฏธ์ง ํ์ผ์ ๋ฐ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ฒ๋ฆฌํด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์์ฑํ๊ณ ์ฆ์ ๋ ๋๋งํด UX๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
์ต์ข ์ ์ถ์์๋ง Storage์ ์ ๋ก๋ํ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ ์ต์ํํ์์ต๋๋ค.
createObjectURL์์ ์์ฑ๋ URL์ ์ผ๋ถ๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ์ง ์ด๋ฆ ์ค๋ณต ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ์ต๋๋ค.
๐
previewUrl ์ํ ์ ๊ฑฐ ๊ณ ๋ ค
- file์ ๋ฐ์์ ์ ์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ฏ๋ก
ImageFiles๋ฅผ file๋ฐฐ์ด์ด ์๋ file๊ณผ url์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ์ฌ ํ๋์ ์ํ๋ก ๊ด๋ฆฌํ๊ณ ์ ํ์ต๋๋ค.- ํ์ง๋ง,
previewUrl์ MultiImageForm ์ปดํฌ๋ํธ ๋ด์์๋ง ์ฌ์ฉ๋๋ ์ํ์ด๊ณ ,ImageFiles๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐprops๋ก ์ ๋ฌ๋ฐ์ผ๋ฏ๋ก ๋ถํ์ํ ์์กด์ฑ์ ์ถ๊ฐํ๋ค๊ณ ์๊ฐ๋์ด์ ๊ธฐ์กด์previewUrl๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๊ณ ์ํ๊ธฐ๋ก ํ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋๋ ๊ฒ์๊ธ ์์ฑ ๋ฐ ์์ ํจ์ ๋ด์์ ์ด๋ฏธ์ง ์ด๋ ๋ฐ ์ญ์ ๋ก์ง์ด ์ค๋ณต๋์ด ์์๊ณ , ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋๋ค.
๐
Trigger ๊ณ ๋ ค
- ๊ฒ์๊ธ ๋ฑ๋ก ํ ์์ฑ๋๋ ๊ฒ์๊ธid๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ธฐ ์ํด, Trigger๋ฅผ ํตํด ๊ฒ์๊ธ ์์ฑ ์ ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ด๋์ํค๋ ๋ฐฉ์์ ๊ฒํ ํ์ต๋๋ค.
- ํ์ง๋ง, Supabase์์๋ SQL ํจ์๋ก storage ๋ด๋ถ์ ํ์ผ์ ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ง ์๊ณ ์์๊ณ , ํ์๋ค๊ณผ ํ์ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ก์ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ๋ก ๋ถ๋ฆฌ๋๋ฉด ๋๋ฒ๊น ๋ฐ ์ ์ง๋ณด์ ๋ฉด์์ ๊ณผ๋ํ ์ถ์ํ๋ผ๋ ๊ฒฐ๋ก ์ ๋ค๋ค๋์ต๋๋ค.
- ๋ฐ๋ผ์, ํ๋ก ํธ์ค๋ ์ฝ๋์์ ์ฒ๋ฆฌํ๊ธฐ๋ก ํ์ต๋๋ค.
๊ด๋ จ ์์ ์ ํจ์๋ก ์ถ์ํํด ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ๋ก์ง์ ํตํฉํ์ฌ ๊ฒ์๊ธ ์์ฑ/์์ ๋ก์ง์์ ํธ์ถํ์ฌ ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค.
Storage์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ด๋ํ๊ณ ์ญ์ ํ๋ ๊ฐ Storage API์์ฒญ์ ์์ฑํ์ฌ ๋ก์ง ์์ฑ ์ ์ค๋ณตํ์ฌ ์์ฑํ์ง ์๋๋ก ํ์ต๋๋ค.
export const getImageList = async (path: string) => {
const { data, error } = await supabase.storage.from('images').list(path);
if (error)
throw new Error(
`์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์คํจํ์ต๋๋ค. ๊ฒฝ๋ก: ${path}, ์๋ฌ: ${error.message}`,
);
return data;
};
export const moveImage = async (source: string, destination: string) => {
const { error } = await supabase.storage
.from('images')
.move(source, destination);
if (error)
throw new Error(
`์ด๋ฏธ์ง ์ด๋ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์์ค: ${source}, ๋ชฉ์ ์ง: ${destination}, ์๋ฌ: ${error.message}`,
);
};
export const removeImage = async (path: string) => {
const { error } = await supabase.storage.from('images').remove([path]);
if (error)
throw new Error(
`์ด๋ฏธ์ง ์ญ์ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ฒฝ๋ก: ${path}, ์๋ฌ: ${error.message}`,
);
};
์์ฑํ API ์์ฒญ ํจ์๋ฅผ ์กฐํฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ์ด๋ํ๊ณ , ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ์ญ์ ํ๋ ํจ์๋ฅผ ์์ฑํ์ต๋๋ค. ์ด๋ฅผ ๊ฒ์๊ธ ์์ฑ/์์ ๋ก์ง์์ ํธ์ถํ์ฌ ์ฌ์ฉํฉ๋๋ค.
// ์ฌ์ฉ์๊ฐ ์๋ก ์
๋ก๋ํ ์ด๋ฏธ์ง ํ์ผ์ ๊ฒ์๊ธID ํด๋๋ก ์ด๋ํ๋ ํจ์์
๋๋ค.
const moveImagesToStorage = async (userId: string, houseId: string) => {
const tempPath = `house/${userId}/temp`;
const movePath = `house/${userId}/${houseId}`;
const images = await getImageList(tempPath);
const movePromises = images.map(async imgObj => {
moveImage(`${tempPath}/${imgObj.name}`, `${movePath}/${imgObj.name}`);
});
// Promise.all์ ์ฌ์ฉํด ๊ฐ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
await Promise.all(movePromises);
};
// ๊ฒ์๊ธ ์์ ์ ์ฌ์ฉ์๊ฐ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ, ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ ํจ์์
๋๋ค.
const deleteUnusedImagesFromStorage = async (
userId: string,
houseId: string,
images: string[],
) => {
const storageImages = await getImageList(`house/${userId}/${houseId}`);
const removedImages = storageImages.filter(img => !images.includes(img.name));
const removePromises = removedImages.map(async img => {
removeImage(`house/${userId}/${houseId}/${img}`);
});
// Promise.all์ ์ฌ์ฉํด ๊ฐ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
await Promise.all(removePromises);
};
export const useRegistHouse = () => {
const { mutate: registHouse, isPending: isRegisteringHouse } = useMutation({
mutationFn: ...,
onSuccess: async (houseId, variables) => {
// ๊ฒ์๊ธ ์์ฑ ์, ์ด๋ฏธ์ง๋ฅผ ์ด๋ํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
await moveImagesToStorage(variables.user_id, houseId);
},
});
return { registHouse, isRegisteringHouse };
};
export const useUpdateHouse = () => {
const { mutate: updateHouse, isPending: isUpdatingHouse } = useMutation({
mutationFn: ...,
onSuccess: async (_, { houseId, houseData }) => {
// ๊ฒ์๊ธ ์์ ์, ์ญ์ ๋ ์ด๋ฏธ์ง๋ฅผ ํํฐ๋งํ๊ณ ์๋ก ์ฌ๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์ด๋ํ๋๋ก ํฉ๋๋ค.
const totalImage = [houseData.representative_img, ...houseData.house_img];
await deleteUnusedImagesFromStorage(
houseData.user_id,
houseId,
totalImage,
);
await moveImagesToStorage(houseData.user_id, houseId);
},
});
return { updateHouse, isUpdatingHouse };
};
์ด๋ฏธ์ง๋ฅผ ์ด๋ ๋ฐ ์ญ์ ํ๋ API๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๊ฐ์ ํ์ต๋๋ค. Supabase Storage์ ์ํธ์์ฉ ํ๋ ํจ์์์ ์ด๋ฅผ ํธ์ถํ์ฌ ์ฝ๋์ ์๋๋ฅผ ๋ช ํํ ํํํ๋๋ก ํ์ต๋๋ค.
์ด ๋, ์ด๋ฏธ์ง ์ด๋ ๋ฐ ์ญ์ ์ Promise.all๏ผ์ ์ฌ์ฉํด ๋น๋๊ธฐ ์์
์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํด ์ฑ๋ฅ์ ํฅ์์์ผฐ์ต๋๋ค.
๊ฒ์๊ธ ์์ฑ ๋ฐ ์์ ์ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋๋ก ํด ๋ก์ง์ ๋จ์ํํ์ต๋๋ค.
๐
Promise.all
Promise.all์ ๋ํด์๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ Promise, Async/Await ๊ฒ์๊ธ์ ์ฐธ๊ณ ํ์ธ์.
๋ก์ปฌ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ฌ ๋คํธ์ํฌ ์ํ์ ์๊ด์์ด ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ด๋ฏธ์ง์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ฆ๊ฐ์ ์ผ๋ก ํ์๋๋๋ก ํ์ต๋๋ค.
๊ธฐ์กด์๋ Storage ์ ๋ก๋์ URL ๋ฐํ ๊ณผ์ ์์ ๋ ๋๋ง์ด ์ง์ฐ๋๋ ๋ฌธ์ ๊ฐ ์์๋๋ฐ, ์ด๋ฅผ ์์ ํ ์ ๊ฑฐํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์์ผฐ์ต๋๋ค.
์ด๋ฏธ์ง ํ์ผ์ ์ ๋ก๋ํ ๋ค URL์ ๊ฐ์ ธ์ค๋ ๊ธฐ์กด ๋ก์ง ๋์ , ์ต์ข ์ ์ถ ์ ํ ๋ฒ์ Storage๋ก ์ ๋ก๋ ํ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ ๊ฑฐํ์ต๋๋ค.
๊ฒ์๊ธ ์์ฑ์ ๊ธฐ์ค์ผ๋ก Storage์ ์์ฒญํ๋ ๋คํธ์ํฌ ์ค์ฌ, ๊ธฐ์กด ๋๋น ์์ฒญ ํ์ 50% ๊ฐ์์ ์๋ต ์๊ฐ ํ๊ท 30% ๊ฐ์๋ผ๋ ์ฑ๋ฅ ๊ฐ์ ํจ๊ณผ๋ฅผ ํ์ธํ์ต๋๋ค.
moveImage, removeImage, getImageList ๋ฑ Storage์ ์ํธ์์ฉํ๋ ๊ณตํต ๊ธฐ๋ฅ์ ๋ชจ๋ํํ์ฌ ํจ์๋ก ๋ถ๋ฆฌํด, ๋์ผ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋์ด ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
๊ฒ์๊ธ ์์ฑ๊ณผ ์์ ๋ก์ง์์ ์ค๋ณต๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ก์ง์ ํตํฉํด, ์ฝ๋์ ๋ช ํ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์์ต๋๋ค.
๊ธฐ์กด์ ๋ณต์กํ ํด๋ ์ด๋ ๋ฐ ์ ๋ฆฌ ๋ก์ง์ ๋จ์ํํ์ฌ, ์ฝ๋๋ฅผ ๋ ์ง๊ด์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ , Storage์์ ์ํธ์์ฉ์ ์ต์ํํด ๊ตฌ์กฐ์ ๋ช ํ์ฑ์ ํ๋ณดํ์ต๋๋ค.
Promise.all์ ํ์ฉํด ๋น๋๊ธฐ ์์
์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํด ์ฑ๋ฅ์ ๊ฐ์ ํ์ต๋๋ค.
์ด๋ฒ ๋ฆฌํฉํ ๋ง์ ํตํด ๋คํธ์ํฌ ์์ฒญ์ ์ต์ํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ก์ปฌ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋น๋๊ธฐ ์์ ์ต์ ํ๊ฐ ์ด๋ป๊ฒ ์ค์ํ ์ง ์ฒด๊ฐํ์ต๋๋ค.
๋คํธ์ํฌ ์์กด์ฑ์ด ํด ๊ฒฝ์ฐ ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ์ฌ์ฉ์ ๊ฒฝํ์ด ํฌ๊ฒ ์ข์ฐ๋๋ฏ๋ก, ์ธํฐ๋ท์ด ๋๋ฆฌ๊ฑฐ๋ ๋ถ์์ ํ ํ๊ฒฝ๋ ๊ณ ๋ คํด์ ๊ฐ๋ฐํด์ผ ํฉ๋๋ค. ๐๐ป ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์์ฒญํ์ง ์๊ณ , ๋ก์ปฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด์ ๋คํธ์ํฌ ์์กด์ฑ์ ๋ฎ์ถ ์ ์์ต๋๋ค. ๋ํ ์๋ฒ๋ก์ ์์ฒญ ํ์๋ ๊ณง ์๋ฒ ๋น์ฉ์ ๋๋ค. ์๋ฒ๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ์ค๊ณ ๋ฐฉ์์ผ๋ก ์๋ฒ ๋น์ฉ๋ ์ ๊ฐํ ์ ์์์ต๋๋ค.
๋ณต์กํ๋ ํด๋ ์ด๋ ๋ฐ ์ ๋ฆฌ ๋ก์ง์ ๋จ์ํํ๊ณ , ๋ถํ์ํ ์์ ์ ์ ๊ฑฐํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ ์ง ๋ณด์์ฑ์ ๋์์ต๋๋ค. ํ์๊ณผ ํ์ ์ ์ฝ๋์ ๋ํด ํ์ํ๊ธฐ ์ํด ์ฝ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์์ฑํ๋ ๊ฒ์ด ์ค์ํจ์ ๋ค์ ํ ๋ฒ ์ฒด๊ฐ ํ์ต๋๋ค.