๊ฐ๋ฐ ๊ธฐ๊ฐ : 2023. 07. 24 ~ 2023. 08. 10
> ์ ์ ์ฉ ๋ฐฐํฌ ์ฌ์ดํธ : ๋น์ฐํ์ง
> ๊ด๋ฆฌ์์ฉ ๋ฐฐํฌ ์ฌ์ดํธ : ๋น์ฐํ์ง ๊ด๋ฆฌ์์ฉ
> ์ ์ ๋ ํฌ์งํ ๋ฆฌ : ์ ์
> ๊ด๋ฆฌ์ ๋ ํฌ์งํ ๋ฆฌ : ๊ด๋ฆฌ์
> ๋ฐฑ์๋ ๋ ํฌ์งํ ๋ฆฌ : ๋ฐฑ์๋
๐ํ์ฌ nextJs ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ค์
๋๋ค.
๊ธฐ๊ฐ : 2023.11.20 ~ 2023.11.25์ผ
๐
๋ก๊ทธ์ธ ํ์ด์ง
|
ํ์๊ฐ์
ํ์ด์ง
|
---|
ํ๋กํ ์์ ํ์ด์ง
|
๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ์ด์ง
|
---|
ํ ํ์ด์ง
|
์ฐ์ฐจ ์ ์ฒญ ํ์ด์ง
|
---|
๋น์ง ์ ์ฒญ ํ์ด์ง
|
๋ด ์ผ์ ๋ณด๊ธฐ ํ์ด์ง
|
---|
๊ด๋ฆฌ์ ๋ก๊ทธ์ธ ํ์ด์ง
|
์ ์ ๋ฆฌ์คํธ ํ์ด์ง
|
---|
์ฐ์ฐจ ์์ฒญ ๋ฆฌ์คํธ ํ์ด์ง
|
์ฐ์ฐจ ๋ฆฌ์คํธ ํ์ด์ง
|
---|
๋น์ง ์์ฒญ ๋ฆฌ์คํธ ํ์ด์ง
|
๋น์ง ๋ฆฌ์คํธ ํ์ด์ง
|
---|
-> ๋ด๊ฐ ์ ํํ ๋ ์ง์ค ์ฐ์ฐจ ์ ์ฒญ ๋ ์ง๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋ํ ์์ธ ์ฒ๋ฆฌ
-> ์ฐ์ฐจ, ๋น์ง ๋ฐ์ดํฐ ํฉ์ณ์ ์ถ๋ ฅ
-> ์ค๋ณต ์ฝ๋ customhook ๋ง๋ค์ด์ ํด๊ฒฐ
-> profile contexts ์ ๊ฑฐํ recoil์ฌ์ฉํ์ฌ ๊ตฌํ
-> ์ ์ ์ ๋ณด์์ ๋จ์์ฐ์ฐจ๋ฅผ ํ์ํ ๋ userinfo api๋ฅผ ์ฌ์ฉํจ. header์์ ์ฌ์ฉ์ค์์๋ ๋ถ๊ตฌํ๊ณ ์ค๋ณตํด์ api์ฌ์ฉ. ๋ฐ๋ผ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ recoil์ ์ฌ์ฉํ์ฌ header์์ user์ ๋ณด์ ๋จ์์ฐ์ฐจ ๊ฐ์ store์ ์ ์ฅ
โ
๋ด๊ฐ ์ ์ฒญํ ์ฐ์ฐจ, ๋น์ง ์กฐํ
- ๊ฐ๊ฐ ์ฐ์ฐจ, ๋น์ง์ ๋ํ ์ปดํฌ๋ํธ ์์ฑํ, restApi ๋ฅผ ์ฌ์ฉํด ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ์กฐํ.
โ
๋ด๊ฐ ์ ์ฒญํ ์ฐ์ฐจ, ๋น์ง ์ทจ์
- ์ ํํ ์์ดํ
์ ๋ํ type
, id
๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ๊ณ , ์กฐ๊ฑด์์ ํตํ์ฌ type ์ ๋ง๋ ์ ํํ ์ญ์ ํจ์ ํธ์ถ. ํด๋น ์ญ์ ํจ์์ ์ ํํ ์์ดํ
id
๋ฅผ ์ ๋ฌํ ์๋ฒ ์ํ๊ฐ์ ๋ฐ๋ฅธ ์
๋ฐ์ดํธ ๋ฐ์ดํฐ ์กฐํ.
โ
๋ชจ๋ ์ ์ ์ ์ฐ์ฐจ, ๋น์ง ์ผ์ ์กฐํ
- ์ฒ์ ํ์ด์ง mount ์ ์์ฑํ customHook useCalendarData
์ ํตํด ๋ชจ๋ ์ ์ ๋ฐ์ดํฐ ์กฐํ.
-> Promise.all
์ ์ฌ์ฉํ์ฌ, ์บ๋ฆฐ๋์ ์ถ๋ ฅ๋์ผ ํ๋ ์ฐ์ฐจ, ๋น์ง์ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํจ. ๊ฐ๊ฐ์ Promise๋ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ํ Promise์ ์๋ฃ๋ฅผ ๋ค๋ฅธ Promise์ ๋๊ธฐํ์ง ์๊ณ ๋์์ ์คํ๋๊ฒํจ.
๋ฐ๋ผ, ๋น๋๊ธฐ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฑ๋ฅ ํฅ์์ด ๋จ.
โ ์ฐ์ฐจ, ๋น์ง์ restApi๋ฅผ ๋์์ ํธ์ถํ๋ ํ๋ ์ฝ๋์ ์ค๋ณต์ ์ต์ํ ํ๊ธฐ ์ํด customhook
์์ฑ (์๋ ๐useCalendarData.tsx ์ฝ๋ ์ฐธ๊ณ )
๐Refectoring๐
-> ์ํ๊ฐ์ ๋ฐ๋ฅธ ๋ฒํผ ์์ ์ ์ฉ
๐ป๊ตฌํ์ฝ๋
๐dutyContainer.tsx
(์ด์ ์ฝ๋ ์๋ต)
import { StatusBox, CancelBox } from '@/styles'
return(
<DutyListBox>
{datalist(dutyDataList).map(el => (
<DutyList key={el.id}>
<h2>๐ {extractDate(el.dutyDate)}</h2>
<StatusBox status={el.status}>
{convertStatusToText(el.status)}
</StatusBox>
<CancelBox
onClick={() => deleteButton('๋น์ง', el.id)}
status={el.status}>
{mainTexts.dutyCancel}
</CancelBox>
</DutyList>
))}
</DutyListBox>
)
๐styleCommon.tsx
export const StatusBox = styled.div<{ status: string }>`
width: 70px;
border-radius: 5px;
position: absolute;
right: 110px;
font-size: 12px;
padding: 9px;
padding-left: 13px;
color: #ffff;
background-color: ${({ status }) => {
switch (status) {
case 'PENDING':
return '#7752FE' // ์น์ธ ๋๊ธฐ ์ํ์ผ ๋ ๋ฐฐ๊ฒฝ์
case 'APPROVE':
return '#F6635C' // ์น์ธ ์๋ฃ ์ํ์ผ ๋ ๋ฐฐ๊ฒฝ์
case 'REJECT':
return '#B31312' // ์น์ธ ๊ฑฐ์ ์ํ์ผ ๋ ๋ฐฐ๊ฒฝ์
default:
return 'lightgray' // ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์
}
}};
`
export const CancelBox = styled(StatusBox)`
right: 20px;
background-color: #212a3e;
padding-left: 25px;
cursor: pointer;
`
โ ์ํ๊ฐ์ด ์ถ๋ ฅ๋๋ ๋ฒํผ, ์ทจ์ ๋ฒํผ ์ ์คํ์ผ์ ๊ณตํต ์ปดํฌ๋ํธํ ํ์์.
๋ฐ๋ผ, StatusBox๋ { status }์ ๊ฐ์ props๋ก ๋ฐ์ ์กฐ๊ฑด์์ผ๋ก ๊ทธ์ ๋ฐ๋ฅธ ๋ฒํผ ์์์ ์ง์ ํ์์. ์ดํ ํด๋น ์คํ์ผ ์ปดํฌ๋ํธ๋ฅผ import ํ์ฌ ์ฌ์ฉํจ.
โ ์คํ์ผ ๊ณตํต ์ปดํฌ๋ํธํ๋ก ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์๋ ์ฝ๊ฒ ๋ฐ์ํ ์ ์๊ณ , css-in-js์ ํน์ง์ ๊ฐ์ง styled-components ์ ์ฅ์ ์ ํ์ฉํ์ฌ ์ํ๊ฐ์ props๋ก ๋ฐ์์ ์ฌ์ฉํ ์ ์์์.
โ
๋ด๊ฐ ์ ์ฒญํ ๋น์ง, ์ฐ์ฐจ ์บ๋ฆฐ๋ ์กฐํ
-> ์บ๋ฆฐ๋ ์กฐํ customHook
์ ์ฌ์ฉํด ์กฐํ ๊ธฐ๋ฅ ๊ตฌํ.
-> customHook
์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋์ฑ ๊ฐ๊ฒฐํ๊ฒ ํ์๊ณ , ๊ฐ๋
์ฑ์ด ํฅ์๋๋๋ก ๊ตฌํ. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ 52์ค โ 19์ค๋ก ๊ฐ์ํจ. ์ดํ ์ด๊ธฐ ๋ก๋ฉ์๋ 4์ด -> 0.7์ด ๊ฐ์
๐ป์์ ํ ์ฝ๋
๐useCalendarData.tsx
export const useCalendarData = (
fetchDataFunction1: Promise<AxiosResponse>,
fetchDataFunction2: Promise<AxiosResponse>,
getMyTitle: (item: ItemUsername) => string,
CalDate: number
) => {
const [viewDrow, setViewDrow] = useState<Item[]>([
{
title: '',
start: '',
end: '',
status: '',
type: '',
username: ''
}
])
useEffect(() => {
Promise.all([fetchDataFunction1, fetchDataFunction2])
.then(([data1, data2]) => {
const processedData1 = data1.data.response.map(
item =>
({
title: getMyTitle(item),
start: new Date(item.startDate).toISOString(),
end: new Date(item.endDate).toISOString(),
type: 'ANNUAL',
status: ''
}) as Item
)
const processedData2 = data2.data.response.map(
item =>
({
...item,
title: getMyTitle(item),
date: new Date(item.dutyDate),
type: 'DUTY',
status: ''
}) as Item
)
const combinedData = [...processedData1, ...processedData2]
setViewDrow(combinedData)
})
.catch(error => {
console.error('error', error)
})
}, [CalDate])
return { viewDrow }
}
โ ์บ๋ฆฐ๋ ์ผ์ ์กฐํ customHook ์์ฑ
๐ Schedule.tsx
export const Schedule = () => {
const [CalDate, setCalDate] = useState<number>(2023)
const { viewDrow } = useCalendarData(
MyAnnualList(CalDate.toString()),
MyDutyList(CalDate.toString()),
getMyTitleWithStatus,
CalDate
)
return (
<Outermost>
<Rectangle>
<BarBox>
<ScheduleBarone>
<p>{commonTexts.annualText}</p>
</ScheduleBarone>
<ScheduleBartwo>
<p>{commonTexts.dutyText}</p>
</ScheduleBartwo>
</BarBox>
<CalendarCommon viewDrow={viewDrow}/>
</Rectangle>
</Outermost>
)
}
โ
์ฐ์ฐจ, ๋น์ง ์ ์ฒญ ๋ชจ๋ฌ
-> ํด๋ฆญํ ๋ฒํผ type์ setSelectedModal
์ ์ ์ฅํ์ฌ selectedModal
์
๋ฐ์ดํธ.
์กฐ๊ฑด์์ ํตํ์ฌ selectedModal === 'ANNUAL_MODALโ
์ผ์ ํด๋น ํ์
์ ๋ง๋ ๋ชจ๋ฌ ์ปดํฌ๋ํธ <AnnualModal/>
์ด ๋ํ๋ ์ ์๋๋ก ๊ตฌํ.
๐ป๊ตฌํ ์ฝ๋
(์๋ต)
const handleModalClick = info => {
let dateSelect = new Date(info.date)
dateSelect.setHours(9, 0, 0, 0)
if (dateSelect.getDay() === 0 || dateSelect.getDay() === 6) {
alert('ํ ์์ผ ๋๋ ์ผ์์ผ์ ์ ํํ ์ ์์ต๋๋ค.')
return false
}
const dupuleData = data.filter((item: DataItem) => {
if (item.type === 'ANNUAL') {
const startDay = item.start
const endDay = item.end
startDay.setHours(9, 0, 0, 0)
endDay.setHours(9, 0, 0, 0)
if (
dateSelect >= startDay &&
dateSelect <= endDay &&
item.username === username
) {
return item
}
} else {
const dutyDate = item.date
dutyDate.setHours(9, 0, 0, 0)
if (dateSelect === dutyDate && item.username === username) {
return item
}
}
return false
})
console.log(dupuleData)
if (dupuleData.length > 0) {
alert('์ด๋ฏธ ํด๋น ๋ ์ง์ ์ ์ฒญํ ์ฐ์ฐจ๊ฐ ์กด์ฌํฉ๋๋ค.')
return false
}
const today = new Date()
today.setHours(0, 0, 0, 0) //์๊ฐ ๋ถ ์ด ์ด๊ธฐํ
if (dateSelect < today) {
alert('์ค๋ ๋ ์ง ์ด์ ์ ์ ํํ ์ ์์ต๋๋ค.')
return
}
viewDrow.find(item => {
const start = new Date(item.start)
const end = new Date(item.end)
if (!start || !end) {
return false
}
const inRange =
dateSelect.getTime() >= start.getTime() &&
dateSelect.getTime() <= end.getTime()
return inRange
})
setSelectedModal(
selectedButton === 'ANNUAL' ? 'ANNUAL_MODAL' : 'DUTY_MODAL'
)
setSelectedDate(dateSelect)
return false
}
-> ์กฐ๊ฑด์์ ํตํ์ฌ 1๊ฐ์ด์์ ์ฐ์ฐจ, ๋น์ง์ด ์ ์ฒญ ๋์ด์์ผ๋ฉด "์ ์ฒญ ์ฐ์ฐจ ์กด์ฌ" ๋ผ๋ ์ํ๊ฐ์ ์ถ๋ ฅ.
-> ์ ์ฒญ restApi
๋ฅผ ํตํด ์ ํํ ๋ ์ง์ ์ฐ์ฐจ๋ฅผ ์ ์ฒญํ๋๋ก ๊ตฌํํ์์ผ๋ฉด ์ ์ฒญํ ๊ฒฐ๊ณผ๊ฐ ์
๋ฐ์ดํธ .
โ
์ฐ์ฐจ, ๋น์ง ์ ์ ๋ฐ์ดํฐ
-> ์ฐ์ฐจ, ๋น์ง ๋ฒํผ ํด๋ฆญ์ ๊ฐ type์ ๋ง๋ restApi ํธ์ถ.
๐ป๊ตฌํ ์ฝ๋
const searchData = () => {
if (calendarRef.current) {
if (selectedButton === 'ANNUAL') {
allAnnualList(CalDate.toString())
.then(data => {
const returnDatalist = data.data.response
const modifiedReturnDatalist = returnDatalist.map(item => ({
title: getTitleWithStatus(item),
username: item.username,
start: new Date(item.startDate),
end: new Date(item.endDate),
type: 'ANNUAL'
}))
setViewDrow(modifiedReturnDatalist)
setData(modifiedReturnDatalist)
})
.catch(error => {
console.error(error)
})
} else {
allDutyList(CalDate.toString())
.then(data => {
const returnDatalist = data.data.response
const modifiedReturnDatalist = returnDatalist.map(item => ({
...item,
title: getTitleWithStatus(item),
username: item.username,
date: new Date(item.dutyDate),
type: 'DUTY'
}))
setViewDrow(modifiedReturnDatalist)
setData(modifiedReturnDatalist)
})
.catch(error => {
console.error(error)
})
}
} else {
console.log('๋
๋๋ฅผ ์ฐพ์์ ์์ต๋๋ค.')
}
}
์์คํ | ์ด์ ํ | ๊นํ์ |
GitHub ํ์ฅ ์ด๊ธฐ ๊ฐ๋ฐ ์ธํ ํ๋กํ ์์ , ๋ก๊ทธ์ธ, ํ์๊ฐ์ , Header, ๋น๋ฐ๋ฒํธ ์ฌ์ค์ |
๊ด๋ฆฌ์ ํ์ด์ง (์ฐ์ฐจ/๋น์ง ์น์ธ ํ์ด์ง, ์ฐ์ฐจ/๋น์ง ์ ์ฒญ ํ์ด์ง, ๊ด๋ฆฌ์ - ์ ์ฒด ์ ์ / ํ์๊ฐ์ ์์ฒญ ๋ฆฌ์คํธ ํ์ด์ง ) |
์ฐ์ฐจ/๋น์ง ์ฌ์ฉ์ ํ์ด์ง (๋ฉ์ธํ์ด์ง(๋ด๊ฐ ์ ์ฒญํ ๋น์ง, ์ฐ์ฐจ ๋ ธ์ถ/ ์ ์ฒด ์ ์ ์ผ์ ๋ ธ์ถ/ ์ ์ฒญํ ์ฐ์ฐจ,๋น์ง ์ทจ์), ๋ด ์ผ์ ๋ณด๊ธฐ ํ์ด์ง, ์ฐ์ฐจ/๋น์ง ์ ์ฒญ ํ์ด์ง) |
-> ๊ทธ๋ผ์ด๋ ๋ฃฐ, ์ปค๋ฐ ์ปจ๋ฒค์ , api ๋ฌธ์ ๋ฑ ํ๋ก์ ํธ์์ ํ์ํ๊ฒ๋ค์ ๊ธฐ๋กํด๋์์ต๋๋ค.
-> develop branch ์์ฑ.
-> develop branch ์์ ๊ฐ์ ์ด๋ฆ์ branch ์์ฑ.
-> ๊ฐ์ branch ์์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋๋ฉด develop branch ๋ก PR ์์ฑ.
-> ๊นํ๋ธ ๋ด๋น์๊ฐ ์ฌ๋ผ์จ Pull request ํ์ธํ develop branch ๋ก merge.
-> ๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃํ ์ต์ข
์ ์ผ๋ก develop branch ๋ฅผ master branch ๋ก merge.
1๏ธโฃ ์ ์ /๊ด๋ฆฌ์ ๋ก๊ทธ์ธ ํ์ด์ง
- localStorageํ ํฐ๊ฐ์ ํตํด ๋ก๊ทธ์ธ ์ ์ ํ๋ณ / ๋น๋ก๊ทธ์ธ ์ ์ ๋ก๊ทธ์ธ ์ ์ ์ฉ ํ์ด์ง ์ง์ ์ฐจ๋จ / ๋ก๊ทธ์ธ ์ ์ ๋ก๊ทธ์ธ,ํ์๊ฐ์ ,๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋ฑ ๋น๋ก๊ทธ์ธ ์ ์ ์ฉ ํ์ด์ง ๋ถ๋ฆฌ
- ๊ด๋ฆฌ์๊ฐ ์น์ธ์ ํ์ ๊ฒฝ์ฐ์๋ง ํ์๊ฐ์ ํ ์์ด๋ ์ฌ์ฉ๊ฐ๋ฅ
2๏ธโฃ ํ์๊ฐ์ ํ์ด์ง
- ์ด๋ฉ์ผ ์ค๋ณต์ฒดํฌ API๋ฅผ ํตํด ์ด๋ฉ์ผ ์ค๋ณต์ฒดํฌ ํ ํ์๊ฐ์ ๊ฐ๋ฅ
- ๋น๋ฐ๋ฒํธ(์ ๊ท์์ ํตํ ์ ํจํ ๋น๋ฐ๋ฒํธ ํ๋ณ)
3๏ธโฃ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ์ด์ง
- ์ด๋ฉ์ผ ์ ๋ ฅ์ ์ด๋ฉ์ผ์ ํตํด ์์ ๋น๋ฐ๋ฒํธ ๋ฐ๊ธ
4๏ธโฃ ์ ์ฒด ํํ์ด์ง
- fullCalendar ์ฐ๋ํ ๋ชจ๋ , ์ฐ์ฐจ ๋น์ง ๋ฐ์ดํฐ ์กฐํ
- ์ ์ฒญ ๋ถ๋ฅ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ ์ ํ์
- ๋ด๊ฐ ์ ์ฒญํ ์ฐ์ฐจ ์ ์ฒญ ํํฉ ๋ฐ์ดํฐ ์กฐํ
- ๋ด๊ฐ ์ ์ฒญํ ๋น์ง ์ ์ฒญ ํํฉ ๋ฐ์ดํฐ ์กฐํ
- ์ฐ์ฐจ, ๋น์ง ์ ์ฒญ ์ทจ์ํ fullCalendar ์ ๋ฐ์ดํธ
- ์์ ๋ก ๋ค์ด๋ฐ๊ธฐ ํด๋ฆญ์ ๋ถ๋ฅ(์ฐ์ฐจ, ๋น์ง)์ ๋ฐ๋ผ ์์ ๋ค์ด๋ก๋
- ์ฐ์ฐจ/ ๋น์ง ๋ฒํผ ํด๋ฆญ์ ํ์ด์ง ์ด๋
5๏ธโฃ ํ๋กํ ์์ ํ์ด์ง
- ํ๋กํ ์ด๋ฏธ์ง ์์ /์ญ์
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ(์์ด ๋๋ฌธ์, ์์ด ์๋ฌธ์, ์ซ์, ํน์๋ฌธ์๋ฅผ ๋ชจ๋ ํฌํจ (8๊ธ์ ์ด์)) && ๋น๋ฐ๋ฒํธ ํ์ธ
6๏ธโฃ ๋ด ์ผ์ ๋ณด๊ธฐ ํ์ด์ง
- ํ์ฌ ์ ์ฒญํ ์ฐ์ฐจ, ๋น์ง ๋ฐ์ดํฐ ์กฐํ
7๏ธโฃ ์ฐ์ฐจ/๋น์ง ์ ์ฒญ ํ์ด์ง
- ์ฐ์ฐจ ์ ์ฒญ, ๋น์ง ์ ์ฒญ ๋ฒํผ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๋ค๋ฅด๊ฒ ์กฐํ
- ์ฐ์ฐจ,๋น์ง ์ ์ฒญ ๋ ์ง ํด๋ฆญ์ ์ฐ์ฐจ ์ ์ฒญ ๋ชจ๋ฌ ์์ฑ
- ๋ชจ๋ฌ์ฐฝ์์ ๋ ์ง ์ ํํ ๋ฑ๋ก์ ์กฐ๊ฑด๊ฐ์ ๋ฐ๋ผ ์ด๋ฏธ ์ ์ฒญ๋ ๋ ์ง ๋ฑ๋ก ๋ถ๊ฐ.
8๏ธโฃ ๊ด๋ฆฌ์ - ์ ์ฒด ์ ์ / ํ์๊ฐ์ ์์ฒญ ๋ฆฌ์คํธ ํ์ด์ง
-
ํ ํฐ ๊ฐ์ด ์์ผ๋ฉด ๋ก๊ทธ์ธํ์ด์ง๋ก ์ด๋
-
์ฌ์ฉ์ ์ธก ํ์๊ฐ์ ์์ฒญ ๋ฆฌ์คํธ๋ก ์ถ๋ ฅ
-
์ฌ์ฉ์ ์ธก ํ์๊ฐ์ ์ ๊ด๋ฆฌ์ ์น์ธ ๊ธฐ๋ฅ
-
์ ์ฒด ๊ฐ์ ๋ ์ ์ ๋ฆฌ์คํธ ์ถ๋ ฅ
- ์ ์ ๋ฆฌ์คํธ : ์ฑ๋ช , ์์ด๋, ์ ์ฌ์ผ, ์์ฌ ์ฐ์ฐจ
- ๋ฆฌ์คํธ๋ ์ ์ฌ์ผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
9๏ธโฃ ๊ด๋ฆฌ์ - ์ฐ์ฐจ/๋น์ง ์น์ธ ํ์ด์ง
-
์ฐ์ฐจ
- ์ฐ์ฐจ ๋ฆฌ์คํธ : ์ฑ๋ช , ์์ด๋ , ์ฌ์ , ์ ์ฒญ์ผ, ์์์ผ, ์ข ๋ฃ์ผ
- ๋ฆฌ์คํธ๋ ์์์ผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ถ๊ฐ์ ์ผ๋ก ์ ์ฒญ์ผ, ์์์ผ, ์ข ๋ฃ์ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
-
๋น์ง
- ๋น์ง ๋ฆฌ์คํธ : ์ฑ๋ช , ์์ด๋, ์ ์ฒญ์ผ, ๋น์ง์ผ
- ๋ฆฌ์คํธ๋ ๋น์ง์ผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ถ์ ์ผ๋ก ์ ์ฒญ์ผ, ๋น์ง์ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
-
๊ฒ์ ๊ธฐ๋ฅ
- ์ ์ฒด ๋ฆฌ์คํธ ๊ฒ์
- ์ฌ์ฉ์ ์ฑ๋ช ์ ํตํ ๊ฒ์
- ๋ , ์์ ํตํ๊ฒ์
๐ ๊ด๋ฆฌ์ - ์ฐ์ฐจ/๋น์ง ๋ฆฌ์คํธ ํ์ด์ง
-
์ฐ์ฐจ
- ์์ฒญ ๋ฆฌ์คํธ : ์ฑ๋ช , ์์ด๋, ์ ์ฒญ์ผ, ์์์ผ, ์ข ๋ฃ์ผ, ์น์ธ์ฌ๋ถ
- ๋ฆฌ์คํธ๋ ์ฌ์ฉ์๋ค์ด ์ ์ฒญํ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
- ์น์ธ์ฌ๋ถ์ ์น์ธ ๊ธฐ๋ฅ๊ณผ ๊ฑฐ์ ๊ธฐ๋ฅ
-
๋น์ง
- ์์ฒญ ๋ฆฌ์คํธ : ์ฑ๋ช , ์์ด๋, ์ ์ฒญ์ผ, ๋น์ง์ผ, ์น์ธ์ฌ๋ถ
-
๊ณตํต
- ์น์ธ์ ์ฌ์ฉ์์ธก์์ ์น์ธ ํ์ธ ๊ฐ๋ฅ
- ๊ฑฐ์ ์ ์ฌ์ฉ์์ธก์์ ๊ฑฐ์ ํ์ธ ๊ฐ๋ฅ