DevLog ๐ถ
[์ฐ์ํํ ํฌ์ฝ์ค] ์ฐํ ์ฝ 5๊ธฐ ๋ฐฑ์๋ ํฉ๊ฒฉ, ํฉ๊ฒฉ๊น์ง์ ๊ธฐ๋ก ๋ณธ๋ฌธ
[์ฐ์ํํ ํฌ์ฝ์ค] ์ฐํ ์ฝ 5๊ธฐ ๋ฐฑ์๋ ํฉ๊ฒฉ, ํฉ๊ฒฉ๊น์ง์ ๊ธฐ๋ก
dolmeng2 2023. 1. 7. 22:13- ์ฌ์ค ์ฐํ ์ฝ ํฉ๊ฒฉ ๋ฐํ๋ ๊ฝค ์ ์ ๋ฌ์ง๋ง, ๋ฏธ๋ฃจ๋ค๊ฐ ๊ฒจ์ฐ ํ๊ณ ๋ก์ ์์ฑํ๋ค.
์ฐํ ์ฝ ํฉ๊ฒฉ์ด๋ผ๋... ๋ค์ ๋ด๋ ๊ฐ๊ฒฉ์ค๋ฌ์ด ๋ฉ์ผ์ด๋ค. ๐ฅน
์ฐํ ์ฝ ์์ํ๋ฉด ๋ธ๋ก๊ทธ ์์ฑ์ ์ต๊ด์ ๋ค์ผ ์์ ์ด์ด์, ์์ ์ ์ ๊ฐ๋จํ๊ฒ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณค๋์ง ๊ธฐ๋กํด๋ณด๊ณ ์ ํ๋ค.
| 1. ์๊ธฐ์๊ฐ์
- ์ฌ์ค ์ฐํ ์ฝ๋ ์๊ธฐ์๊ฐ์๊ฐ ๊ฝค๋ ์ค์ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค.
'๋ด๊ฐ ์ผ๋ง๋ ์ฑ์ฅํ ์ ์๋ ์ฌ๋์ธ๊ฐ?'์ ์ด์ ์ ๋๊ณ , ์ ๊ณต ์ง์๋ณด๋ค๋ ๋ด ์ง์ํ ๊ฒฝํ์ ๋ด์ผ๋ ค๊ณ ๋ง์ด ๋ ธ๋ ฅํ๋ค.
1. ๊ณ ๋ฑํ๊ต/๋ํ๊ต ์ ๊ณต์ ํฌํจํ์ฌ ํ๋ก๊ทธ๋๋ฐ ๊ต์ก ์ด๋ ฅ์ ์์ฑํด์ฃผ์ธ์.
- ํ์ฌ ์ฌํ ์ค์ธ ๋ํ๊ต์, ๋ํ๊ต ๋ด์์ ์งํํ ์๋ชจ์ (๋ฐฑ์๋ ๊ด๋ จ X), ๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ๊ด๋ จ ๊ณต๋ถ ์ค์ด๋ผ๊ณ ์์ฑํ๋ค.
๊ตณ์ด ๊ธ๋ก ํ์ด์ฐ์ง ์๊ณ , ๊ทธ๋ฅ 3์ค๋ก ์งค๋งํ๊ฒ ์์ฑํ๋ค.
2. ํ๋ก๊ทธ๋๋ฐ ํ์ต ๊ณผ์ ์?
- ํฌ๊ฒ 2๊ฐ๋ก ๋๋์ด์ ์์ฑํ์๋ค.
1๋ฒ์ ์๋ฐ๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ์ฝ์ ๊ฒ์์ ๋ง๋ค์๋ ๋ด์ฉ์ ์์ฃผ๋ก, ์๋ฐ ๊ฐ๋ ์ ์ด๋ค ์์ผ๋ก ํ์ฉํ์๋์ง๋ฅผ ์์ฑํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด์ ํ๋ก๊ทธ๋๋ฐ์ ๊ด์ฌ์ ๊ฐ์ง ๊ณ๊ธฐ๋ก ์ด๋์๋ค.
2๋ฒ์ ํ์ต ํ๋ก์ธ์ค์ ๋ํด์ ์์ฑํ์๋ค. 1๋ฒ์ด๋ ์ด์ด์ง๊ฒ ์์ฑํ๊ธฐ ์ํด์ '๋ด๊ฐ ์ด๋ค ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ถ์๊ฐ'๋ฅผ ์์ฃผ๋ก ๊ธ์ ์์ฑํ์๋๋ฐ, ๊ทธ๋ฌ๋ฉด์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ด๋ค ์์ผ๋ก ์งํํ๊ณ ์๋์ง๋ฅผ ์์ฑํ๋ค.
๋ ๊ฐ์ 1์ผ 1์ปค๋ฐ์ ํ๋ ๋ด์ฉ์ ์์ฑํ์ผ๋ฉฐ, ๋ญ ์ปค๋ฐํ๋ฉด์ ์ด๋ค ์์ผ๋ก ๊ณต๋ถ๋ฅผ ํ๋์ง...๋ฅผ ์ ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
3. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋๋ ค๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
- ์ด 3๊ฐ๋ก ๋๋์ด์ ์์ฑํ๋ค.
1๋ฒ์ ๋ฐฑ์๋ ๊ฐ๋ฐ ์ ์ ์ง๋ก๋ก ์ก์๋ '๋จธ์ ๋ฌ๋ ์์ง๋์ด'์ ๋ํ ๊ณ๊ธฐ๋ฅผ ๋ด์์ผ๋ฉฐ, ์์ด์ ์ผ๋ก '๊ฐ๋ฐ' ์์ฒด์ ์ด์ฉ๋ค๊ฐ ํฅ๋ฏธ๋ฅผ ๊ฐ์ง๊ฒ ๋์๋์ง ์์ฑํ์๋ค. ์ฌ์ค ์ด ๋ถ๋ถ์์ ์ง๋ก๋ฅผ ๋ฐ๊ฟจ๋ค๋ ๋ถ๋ถ์ด ์คํ๋ ค ๋๊ธฐ ์๋ ์ฌ๋์ผ๋ก ๋ณด์ฌ์ง๊น๋ด ๊ฑฑ์ ํ๋๋ฐ, ๊ทธ๋ ๊ฒ๋ ์ ๋ด์ฃผ์ ๊ฒ ๊ฐ์์ ๋คํ...
2๋ฒ์ ๋จธ์ ๋ฌ๋ ์์ง๋์ด์์ ์ ์น ๊ฐ๋ฐ์๋ฅผ ์ ํํ๋์ง์ ๋ํ ๋ด์ฉ์ ์ ์๊ณ , 3๋ฒ์ ์น ๊ฐ๋ฐ์๋ฅผ ์ ํํ๋ฉด์ ์ด๋ค ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ง๋ฅผ ์์ฑํ๋ฉฐ ๋ด๊ฐ ํ๋ ํ๋ก์ ํธ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์์ฑํ์๋ค.
๊ฐ์ฅ ํฐ ์ฃผ์ ๋ก '์ฌ์ฉ์๋ค์ ์ํ ์๋น์ค ๊ฐ๋ฐ'์ ์ก๊ณ , ์ด์ ๋ํด์ ํ์ด๋๊ฐ๋ฉฐ ์์ฑํ์๋ค.
4. ๋ง์์ด ๋๋ฆฌ๋ ๋ฌด์์ธ๊ฐ์ ๊ธด์๊ฐ ๋์ ๋ชฐ์ ํด๋ณธ ๊ฒฝํ์ด ์๋์?
- ์ฌ์ค ๊ฐ์ฅ ๋ง์ด ๊ณ ๋ฏผํ ์ฃผ์ ์ด๋ค. 10๊ฐ์ ๋์ ๋ชฐ์ ํด๋ณธ ๊ฒฝํ... ์๋ง ์ด ๋ถ๋ถ์ ๋ค๋ค ๋ง์ค์ผ ๊ฒ ๊ฐ๋ค.
์ฒ์์๋ 1์ผ 1์ปค๋ฐ์ ์์ฑํ ๊น ํ๋ค๊ฐ, ๋ฑํ ๋ชฐ์ ํ ๊ฒฝํ์ด๋ผ๊ณ ๋๊ธฐ๋ ๊ทธ๋ ๊ณ ,
๊ทธ๋ ๋ค๊ณ ํ๋ก์ ํธ ๊ฒฝํ์ ์ฐ๊ธฐ์๋ 10๊ฐ์ ์ด์ ํด๋ณธ ์ ์ด ์์ด์ (๋จ๊ธฐ ํ๋ก์ ํธ...)
ํ๊ต ๋ค๋๋ฉด์ ์งํํ๋ ๋์๋ฆฌ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์ผ๋ค. ๋คํํ๋ ๋์๋ฆฌ๋ฅผ 2๋ ์ ๋ ์งํํด์...ใ
๊ตณ์ด ๊ฐ๋ฐ์ ๊ด๋ จ๋ ์ด์ผ๊ธฐ๋ฅผ ์ฐ์ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค. ์คํ๋ ค ์ฆ๋ช ํ ์ ์๋ ๋ด์ฉ์ ์์ฑํ๋ ๊ฒ ์ ์ผ ์ข์ ๊ฒ ๊ฐ๋ค.
๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋์๋ฆฌ๋ฅผ ์งํํ๋ฉด์ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ์ ๊ธ์ ๋ช ๊ฐ ์์ฑํ์์ด์, ๊ทธ๊ฑธ ์ฆ๋น ์๋ฃ๋ก ๋ฃ์๋ค.
5. ์ฐ์ํํ ํฌ์ฝ์ค์ ์ฐธ์ฌํ๋ ค๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
- ์ฌ๊ธฐ์๋ ํ ์ฝํก ์ด์ผ๊ธฐ๋ฅผ ์์ฑํ๊ณ , ํ์ ์ ๊ดํ ์ด์ผ๊ธฐ๋ฅผ ์์ฑํ์๋ค.
์ฌ์ค ์ฐํ ์ฝ์์ ๊ฐ์ฅ ๊ฒฝํํ๊ณ ์ถ์ ๊ฒ ์ฒด๊ณ์กํ ํ ํ๋ก์ ํธ์ ์ฝ๋ ๋ฆฌ๋ทฐ, ํ์ ์ด์๊ธฐ ๋๋ฌธ์ ๋งํ์์ด ์์ฑํ ์ ์์๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์ฝํก... ๊ผญ ํด๋ณด๊ณ ์ถ๋ค. ใ ใ ใ ใ ์ฌ์ฌ ๊ฐ๋!
+ ์ฆ๋น ์๋ฃ ์์ฑ
- ์ฆ๋น ์๋ฃ๋ ๋ ธ์ ์ ์ ๋ฆฌํด์ ์ฌ๋ ธ๋ค.
2๋ฒ์์ ๋ง๋ค์๋ ์ฝ์ ๊ฒ์์ ๋ํ ์ด์ผ๊ธฐ์ ๊นํ๋ธ ๋งํฌ, ๊ทธ๋ฆฌ๊ณ ๋์๋ฆฌ ํ๋ํ๋ฉด์ ์์ฑํ์๋ ๊ธ์ ์ฒจ๋ถํ์๋ค.
์ฌ์ค ์ฆ๋น ์๋ฃ๋ ๋ณธ์ธ์ ๊ฒฝํ์ ๋ด๋ ๊ฒ ๊ฐ์ฅ ์ค์ํด์...
์๊ธฐ์๊ฐ์์์๋ ์ฌ๋งํ๋ฉด '์ฆ๋ช ํ ์ ์๋ ๊ฒฝํ'์ ๋ด์๋ด๋ ๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ ๊ฐ๋ค.
์ฆ๋น ์๋ฃ๋ฅผ ์์ฑํ๋ฉด์ ์ต๋ํ ๊ธฐ์ ์ ์ธ ๋ด์ฉ์ ๋นผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
๋ด๊ฐ ์ ๊ณต์๊ณ , ๊ทธ๋์ ์ด์ ๋์ ์ง์์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฑธ ๋ณด์ฌ์ฃผ๋ ๊ฑด ์คํ๋ ค ์ญํจ๊ณผ์ผ ๊ฒ ๊ฐ์์,
์ต๋ํ ๋ด๋ฐฑํ๊ฒ ๋ด๊ฐ ์ปค๋ฒํ ์ ์๋ ์ง์ ์ ๋๋ก๋ง ์์ฑํ์๋ค.
(์ ์ด์ ๋ด์ธ์ธ๋งํ ์ง์๋ ์์)
| 2. 4์ฃผ๊ฐ์ ํ๋ฆฌ์ฝ์ค
- ์ด๋ฒ ์ฐํ ์ฝ๋ ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์งํํ์ง ์์๊ธฐ ๋๋ฌธ์, ์๋ฅ ์ ์๋ฅผ ์งํํ ๋ชจ๋๊ฐ ํ๋ฆฌ์ฝ์ค์ ์ฐธ์ฌํ ์ ์์๋ค.
ํ๋ฆฌ์ฝ์ค๋ ๋ฐ๋ก ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ์๊ธฐ ๋๋ฌธ์ ์๋๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์...!
โ 1์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค
โ 2์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค
โ 3์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค
โ 4์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค
- ์ด์ฉ๋ค ๋ณด๋ 4์ฃผ์ฐจ ํ๋ฆฌ์ฝ์ค ๊ธ์ ์์ฑ์ ๋ชปํ๋ค... ใ (๋น์์ ๋๋ฌด ๋ฐ๋นด๋ค...)
| 4์ฃผ์ฐจ ์ฝ๋
4์ฃผ์ฐจ ๋ฏธ์ ์ ๋ํด ๊ฐ๋จํ ํ๊ณ ํ์๋ฉด, '๋ค๋ฆฌ ๊ฑด๋๊ธฐ' ๊ฒ์์ด์๋ค.
ํ์คํ 1~3์ฃผ์ฐจ์ ๋นํด์ ๊ฐ์ฅ ๊น๋ค๋ก์ด ๋ฏธ์ ์ด์๋ ๊ฒ ๊ฐ์๋ฐ, ํนํ ๋ค๋ฆฌ ๋งต์ ์ถ๋ ฅํ๋ ๊ฒ ๊ฐ์ฅ ๊น๋ค๋ก์ ๋ค...ใ
์ด๋ฒ์๋ ๊ตฌํ ๊ธฐ๋ฅ ๋ฌธ์๋ฅผ ์ ๋๋ก ์์ฑํ๋ ค๊ณ ๋ง์ด ๋ ธ๋ ฅํ๋ค.
์ด๋ฐ ์์ผ๋ก ๊ตฌํํ ๋ฉ์๋ ๋ค์๋ ํจ๊ป ์์ฑํด๋์๋ค :D
์ฌ์ค ์ฝ๋๊ฐ ๋ง์์ ์ ๋๋ ๋ถ๋ถ์ด ๋๋ฌด ๋ง์์... ๊ฐ๋จํ ํ๊ณ ๋ก๋ง ์บก์ณ!
- ๊ฐ์ฅ ์ ๊ฒฝ ์ด ๋ถ๋ถ์ enum ํด๋์ค์ ํ ์คํธ ์ฝ๋์ ๋ํ ๋ถ๋ถ์ด์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด๋ต๊ฒ ์ฌ์ฉํ๋ ๊ฒ.
getter๋ก ๋ฐ์์ค์ง ์๊ณ , ์ต๋ํ ํด๋น ๊ฐ์ฒด์๊ฒ ์ฌ์ง๋ฌธํ๋ ํํ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
ํ์ง๋ง ์์ง๊น์ง๋ ๋ชจ๋ฅด๊ฒ ๋ ๊ฑด ํ ์คํธ ์ฝ๋ ์์ฑ๋ฒ... ์ฌ์ ํ ๋๋ฌด ์ด๋ ต๋ค ;ใ ; ๊ฐ์ธ์ ์ผ๋ก ์ฐํ ์ฝ ๋ค์ด๊ฐ์ ๊ฐ์ฅ ๋ฐฐ์ฐ๊ณ ์ถ์ ๋ถ๋ถ ์ค ํ๋!
| 3. ์ต์ข ์ฝ๋ฉ ํ ์คํธ
- ์ต์ข ์ฝํ ๋์์ ๋ฉ์ผ์ด ๊ต์ฅํ ๋ฆ๊ฒ ์๋ ๊ธฐ์ต์ด ์๋ค.
์ฌ์ค ์ฐํ ์ฝ ์ฌ๋๋ ๊ตฌ๊ฒฝํ๊ณ , ์ฐํ ์ฝ ๋จํก๋ฐฉ๋ ๊ตฌ๊ฒฝ ๋ง์ด ํ๋๋ฐ ๋ค๋ค ์ ๋ง ์ด์ฌํ ์ค๋นํ์๋ ๊ฒ ๊ฐ์์ ์์ ์ด ์์๋ค.
๋น์ ์์ฒญ ๋ฐ๋นด๋ ์๊ธฐ์ฌ์ ํฌ๊ฒ ์ค๋น๋ ๋ชปํ๊ณ , ๊ทธ๋ฅ 4๊ธฐ ์ต์ข ๊ณผ์ ๋ง ํ์ด๋ณด์๋ค...
๊ทผ๋ฐ 4๊ธฐ ์ต์ข ์ฝํ ๊ฐ ์๊ฐ๋ณด๋ค ๋ ์ด๋ ค์์ (ํ์ด๋งค์นญ) 5์๊ฐ ์์ ๊ตฌํ์ ๋ฌด์จ...ใ ๊ฑฐ์ ์ผ์ฃผ์ผ ์ก๊ณ ๊ตฌํํ๋ค.
๊ทธ๋๋ ์ฐํ ์ฝ ๋์ค์ปค์ ๊ตฌ๊ฒฝํ๋ฉด์, validation ๊ณผ์ ์์ supplier๋ฅผ ํ์ฉํ์ ๋ถ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์
์ด๊ฑฐ๋ ๊ผญ ์ต์ข ์ฝํ ๋ ์จ๋จน์ด์ผ์ง! ํ๋ฉด์ ๊ธฐ๋กํด๋์๋ค. (์ค์ ๋ก ์จ๋จน์. ๊ฐ์ฌํฉ๋๋ค...)
- ์ถ๊ฐ์ ์ผ๋ก ์ต์ข ์ฝํ ๋ 2๋ฐฐ์๋ก ๋ฝ์ ๊ฒ ๊ฐ๋ค. ์ค์ ๋ก ์ต์ข ์ฝ๋ฉํ ์คํธ PR์ ํ์ธํด๋ณด๋๊น 197์ด๋ค.
โ ์ต์ข ์ฝํ ์ฝ๋
- ์ต์ข ์ฝ๋ฉ ํ ์คํธ๋ '์ ์ฌ ๋ฉ๋ด ์ถ์ฒ' ํ๋ก๊ทธ๋จ ๊ตฌํํ๊ธฐ์๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ 4๊ธฐ ์ต์ข ๊ณผ์ ๋ณด๋ค๋ ์ฌ์ ๋ค๊ณ ์๊ฐ๋๋ค. (๋ง์ด๋ค ๊ทธ๋ ๊ฒ ๋ง์ํ์๋ ๊ฒ ๊ฐ์๊ณ .)
์ฌ์ค ์ด๋ ๊ฒ ๋งํ์ง๋ง ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ตฌํ์ ์ํ ์ข ๋ฃ 30๋ถ ์ ์ ๊ฒจ์ฐ ํ๋ค.
์ฝํ ๋ณด๋ฉด์ ๋ชฉํ๋ฅผ ํฌ๊ฒ 4๊ฐ์ง๋ก ์ก์๋ค.
1. ๊ธฐ๋ฅ ๊ตฌํ์ ์ฐ์ ์ผ๋ก ํ๊ธฐ
2. ํ ์คํธ ์ฝ๋๋ ์๊ฐ์ด ๋จ์ผ๋ฉด ํ๊ธฐ
3. ๊ธฐ๋ฅ ๊ตฌํ ๋ฌธ์ ์์ฑํ๊ณ , ์ปค๋ฐ ๊ผฌ๋ฐ๊ผฌ๋ฐํ๊ธฐ!
4. Supplier ์ฌ์ฉํ๊ธฐ (์ด๊ฑฐ๋ ๊ทธ๋ฅ ๋ด ์์ ๋ชฉํ)
- ์ ์ด์ ํ ์คํธ ์ฝ๋์ ์ ๋ง ์์ ์ด ์์๊ธฐ ๋๋ฌธ์, ์ฒ์๋ถํฐ ๊ทธ๋ฅ ํฌ๊ธฐํ๋ ํจ๋ก ๊ฐ์ง๊ณ ๊ฐ๋ค.
์ฌ์ค ํ ์คํธ ์ฝ๋์ ์๋ ๋ชฉ์ ์ ๊ธฐ๋ฅ ๊ตฌํ์ด ๋๋ ๋๋ง๋ค ์์ฑํ๋ฉด์ ๋ฐ๋ก ์์ ํ๋๋ก ํด์ผ ๋๋ ๊ฑด๋ฐ,
๋๋ ํ ์คํธ ์ฝ๋๊น์ง ์ค๊ฐ์ค๊ฐ ์์ฑํ๋ค๋ฉด ๋ถ๋ช ์ํ์์ ๋จ์ด์ก์ ๊ฒ ๊ฐ๋ค... ใ ใ
๋คํํ๋ ๊ตฌํ ์๋ฃ ํ 30๋ถ ์ ๋ ๋จ์์, ๊ทธ๋ ์งค๋งํ๊ฒ validation์ ๊ดํ ๋ถ๋ถ๋ง ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
์ฌ๋ด์ด์ง๋ง... ์ํ ๋น์ผ์ ๋ชธ์ด ๋๋ฌด๋๋ฌด ์ํ์ ๊ฑฐ์ ์ํ์ ๋ชป ๋ณด๋ฌ ๊ฐ ๋ปํ๋ค. ์ํ๋ ๊ฑฐ์ ์ ์ ๋ ฅ์ผ๋ก ๋ดค๋ค... ๐ฅน
5์๊ฐ์ ์๊ฐ๋ณด๋ค ๊ธธ๋ฉด์ ์งง์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ค ๋ฐฅ์ ๊ผญ ๋จน๊ณ ๊ฐ์๊ธธ ์ถ์ฒํฉ๋๋ค...
์๋ฌดํผ! ์ํ ๋๋ฅผ ์ฒ์ฒํ ํ๊ณ ํด๋ณด๋ฉด, ๊ฐ์ฅ ๋จผ์ ๊ธฐ๋ฅ ๋ฌธ์ ์์ฑ๋ถํฐ ์์ํ๋ค.
- ํ๋ฆฌ์ฝ์ค ๋์ฒ๋ผ ๋ค์ํ๊ฒ ์์ฑํ ์๊ฐ์ ์ ํ๊ณ , ๊ทธ๋ฅ ๋ฑ ๊ธฐ๋ฅ๋ง ์์ฑํ๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด ๋จ๊ณ์ 2~30๋ถ์ ํฌ์ํ๋ ๊ฑธ ์ถ์ฒํ๊ณ ์ถ๋ค.
์ฝ๋ ์์ฒด๋ ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ์์ฑํ๋ฉด ์ฝ๊ฒ ํ๋ฆ์ ์ก์ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฌด์กฐ๊ฑด ๊ผญ! ์์ฑํ์๊ธฐ๋ฅผ...
ํนํ, ์์ธ ์ฒ๋ฆฌ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค ๋ณด๋ฉด ์ถ๊ฐ์ ์ผ๋ก ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ด ๋๋ง๋ค ์์ ํด์ฃผ๋ฉด ์ข๋ค.
(์ด์์๋ ๋ฌธ์๋ฅผ ๋ง๋ค์ ๐)
โ๏ธ ํจํค์ง ๊ตฌ์กฐ
- ์ฌ๋งํ๋ฉด mvc ๊ตฌ์กฐ๋ก ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฑธ ์ถ์ฒ!
- ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ฌธ์ ์์ฑ ํ์, ๊ฐ์ฅ ๋จผ์ ์์ ๋ถ๋ถ์ ์ ์ํ๋ค.
์์ธ๋ก ์ฝ์์ ์ถ๋ ฅ๋ ๋ฉ์์ง์ ๋ํด ์๊ตฌ์ฌํญ ๋ณด๋ฉด์ ์น ์ ๋ฆฌํด๋๋ฉด, ๋์ค์ ์ถ๋ ฅํ ๋ ๋นผ๋จน์ง ์์์ ์ข๋ค.
๊ทธ๋ฆฌ๊ณ enum ํ์ฉํ๊ณ ์ถ์ด์ enum์ผ๋ก ์์ฑํ๊ธด ํ๋๋ฐ, ์ด๊ฑด ์ทจํฅ ์ฐจ์ด์ผ ๊ฒ ๊ฐ๋ค.
- ์ปจํธ๋กค๋ฌ๋ 2๊ฐ๋ก ๋๋์๋๋ฐ (์ฒ์ ๊ฑฐ๋ ๊ทธ๋ฅ ์์์ฉ interface) ๋น์ฆ๋์ค ๋ก์ง ํ๋ฆ์ ์ถ์ฒ ์ปจํธ๋กค๋ฌ์ ๋ด์๋ค.
๋ฉ๋ด ์ปจํธ๋กค๋ฌ๋ ๋ฌธ์ ์์ ์ ์ํ ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ฉ๋ด๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ฒด๋ก ๋ง๋ค์ด๋๋ ์ฉ์ผ๋ก ์ฌ์ฉํ์๋ค.
์ฌ๊ธฐ์ ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ฉ๋ด๋ฅผ ๊ทธ๋ฅ ์์๋ก ๋ค ์์ฑํด๋๊น ๊ณ ๋ฏผํ์๋๋ฐ,
์๋ 4๊ธฐ ์ต์ข ์ฝํ ์ ํ์ผ ์ ์ถ๋ ฅ์ด ์๊ฐ๋์ ํ์ผ ํํ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค.
์๋ง ์ฝ๋ ์ฌ์ฌํด์ฃผ์๋ ๋ถ๋ ์ด ๋ถ๋ถ์ ์ข๊ฒ ๋ด์ฃผ์์ง ์์์๊น ์ถ์...!
public class ResourceReader {
public List<String> readResource(String path) {
List<String> resources = new ArrayList<>();
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
String resourceName = null;
while ((resourceName = bufferedReader.readLine()) != null) {
resources.add(resourceName);
}
return resources;
} catch (IOException e) {
return null;
}
}
}
- ํ์ผ์ ์ด๋ฐ ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
<MenuController.java>
public class MenuController implements Controller {
private final MenuService menuService;
private final ResourceReader resourceReader = new ResourceReader();
public MenuController(MenuService menuService) {
this.menuService = menuService;
}
/**
* ์นดํ
๊ณ ๋ฆฌ๋ณ ๋ฉ๋ด์ ๋ํด ์ฌ์ ์ ์ ์ํด๋๋ค.
*/
@Override
public void process() {
for (Category category : Category.values()) {
List<String> menuNames = Category.getCategoryWithMenus(category, resourceReader);
menuService.saveCategoryAndMenus(category, menuNames);
}
}
}
- ๊ทธ๋ฆฌ๊ณ , ์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฑด MenuController์์ ์ ์ธํ MenuService๋ฅผ RecommendController์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ? ์ด์ ์ด๋ค.
์ด๋ป๊ฒ ์๊ฐํด๋ณด๋ฉด ์คํ๋ง์์ ๋น ๋ฑ๋ก๊ณผ๋ ์ฐ๊ด๋์ด ์๋ ๋ถ๋ถ์ธ๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ํ๋๋ง ๋ง๋ค์ด์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
public RecommendController() {
MenuController menuController = new MenuController(menuService);
menuController.process();
}
- ๊ทธ๋์, RecommendController์ ์์ฑ์์์ MenuController์ ์์ฑ์์ menuService๋ฅผ ์ฃผ์ ํด์ฃผ์๋ค.
์ฌ์ค ์ด๊ธฐ์๋ ์ด๊ฑธ ์๊ฐ ๋ชปํ๊ณ ๊ตฌํํด์ ์๊พธ ๋ฉ๋ด ๊ฐ์ฒด๋ค์ด null์ด ๋จ๋ ๋ฌธ์ ๋ก ์์ฒญ ๋นํฉํ๋๋ฐ, ์ฐจ๋ถํ๊ฒ ์๊ฐํด๋ณด๋๊น ๋น์ฐํ ๊ฑฐ์๋ค...ใ
์๊ฐ์ด ๋๋ค๋ฉด ์ฌ์ค ์ ์ฒด์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด ์ ์ฅ์ ์ญํ ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์๋๋ฐ,
๊ตฌํํ๋๋ฐ ๋ฐ๋น ์ ์ด์ ๋๊น์ง๋ฐ์ ๋ชปํ๋ค..........
๊ทธ๋๋ ์๋ง ์ด ๋ถ๋ถ๋ ์ฝ๋ ์ฑ์ ํด์ฃผ์๋ ๋ถ๋ค์ด ๋๊ฒ ์ข๊ฒ ๋ณธ ํฌ์ธํธ๊ฐ ์๋๊น ์ถ๋ค!
public class InputService {
private final InputView inputView = new InputView();
private final OutputView outputView = new OutputView();
/**
* ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ์ฌ์
๋ ฅ์ ๋ฐ๋ ๋ฉ์๋.
*/
public <T> T getUserInput(Supplier<T> inputReader) {
try {
return inputReader.get();
} catch (IllegalArgumentException e) {
outputView.printMessage(e.getMessage());
return getUserInput(inputReader);
}
}
public <T, R> R getUserInputWithParam(Function<T, R> inputReader, T param) {
try {
return inputReader.apply(param);
} catch (IllegalArgumentException e) {
outputView.printMessage(e.getMessage());
return getUserInputWithParam(inputReader, param);
}
}
public List<String> getCoachNames() {
outputView.printMessage(GET_COACH_NAME.getValue());
return inputView.getCoachNames();
}
public List<String> getNotEatFoods(String coachName) {
outputView.printMessage(String.format(GET_NOT_EAT_MENU.getValue(), coachName));
return inputView.getNotEatFoods();
}
}
- ๊ทธ๋ฆฌ๊ณ ๋ ๋ง์์ ๋๋ ๋ถ๋ถ์ธ ์ ๋ ฅ ์๋น์ค ๋ถ๋ถ์ด๋ค.
ํผ์๋ง์ ์์ ๋ชฉํ(?)์๋ Supplier์, ์ถ๊ฐ์ ์ผ๋ก Function๊น์ง ํ์ฉํ ์ ์ด๋ค.
์ฌ์ค Function์ ์ธํฐ๋ท์ ๋์์ ์ข ๋ฐ์์ง๋ง...ใ ์๋ฌดํผ!
์ ๋ค๋ฆญ์ ํ์ฉํ ๋๋ถ์ ์ฌ์ฉ์ํํ ์ ๋ ฅ์ ๋ฐ๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๊ท๋ฅผ ํตํด ์ฌ์ ๋ ฅ๋ฐ์ ์ ์๋๋ก ๋ง๋ค์๋ค.
public enum Category {
JAPAN("์ผ์", "src/main/resources/japan-menu.md", 1),
KOREA("ํ์", "src/main/resources/korea-menu.md", 2),
CHINA("์ค์", "src/main/resources/china-menu.md", 3),
ASIAN("์์์", "src/main/resources/asian-menu.md", 4),
WESTERN("์์", "src/main/resources/western-menu.md", 5);
private final String name;
private final String filePath;
private final Integer index;
public static List<String> getCategoryWithMenus(Category category, ResourceReader resourceReader) {
return resourceReader.readResource(category.filePath);
}
public static Category getCategoryByIdx(int index) {
return Arrays.stream(Category.values())
.filter(category -> index == category.index)
.findFirst()
.orElseThrow();
}
public static String getCategoryNames(List<Category> categories) {
List<String> categoryNames = categories.stream().map(category -> category.name).collect(Collectors.toList());
return "[ ์นดํ
๊ณ ๋ฆฌ | " + String.join(" | ", categoryNames) + " ]\n";
}
Category(String name, String filePath, Integer index) {
this.name = name;
this.filePath = filePath;
this.index = index;
}
}
- ๊ทธ๋ฆฌ๊ณ , ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ์ต๋ํ '๊ฐ์ฒด์๊ฒ ์ง๋ฌธํ์'๋ฅผ ๋ ์ฌ๋ ธ๋ค.
static์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ ๊ฑด๊ฐ ์ถ๊ธฐ๋ ํ์ง๋ง... ๋๋ถ์ getter์์ด ์ง์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ด์ ๋ฟ๋ฏํ๋ค.
์ฌ๊ธฐ์๋ ํ์ผ์ ๋ด์ฉ์ ๊ฐ์ฒด๋ก ๋ง๋ค๊ธฐ ์ํด์, ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ฒด๋ก๋ถํฐ ์ง๋ฌธํด์ ์ป์ด์ค๋๋ก ์งํํ๊ณ ,
์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ์ถ๋ ฅํ ๋๋ ๋ด๋ถ์์ ๋ณ์๋ฅผ .์ผ๋ก ์ ๊ทผํด์ ์ป์ด์ฌ ์ ์๋๋ก ๋ง๋ค์๋ค.
public void recommend(DayWeek dayWeek, List<Coach> coaches) {
Category findCategory = categoryService.getRecommendCategory();
findCategory = checkCategoryAlreadySave(findCategory);
for (Coach coach : coaches) {
recommendResultService.saveCategoryResult(dayWeek, findCategory);
String recommendMenu = menuService.getRecommendMenu(findCategory);
recommendMenu = checkMenuAlreadyRecommend(findCategory, coach, recommendMenu);
recommendMenu = checkMenuNotEatFood(findCategory, coach, recommendMenu);
recommendResultService.createAndSaveResult(coach, dayWeek, recommendMenu);
}
}
- ์ถ์ฒ ์๋น์ค์ ์๋ ๋ฉ์๋ ์ค ํ๋์ด๋ค. ์ฌ์ค ๊ตฌํ์ ๋ฆ๊ฒ ๋ง๋ฌด๋ฆฌํ ๊ฒ๋ ๋ฌธ์ ๋ฅผ ์๋ชป ์ดํดํด์์๋ค.
- ์ฝ์น๋ค์ ์, ํ, ์, ๋ชฉ, ๊ธ์์ผ์ ์ ์ฌ ์์ฌ๋ฅผ ๊ฐ์ด ํ๋ค.
- ๋ฉ๋ด๋ฅผ ์ถ์ฒํ๋ ๊ณผ์ ์ ์๋์ ๊ฐ์ด ์ด๋ค์ง๋ค.
1) ์์์ผ์ ์ถ์ฒํ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ฌด์์๋ก ์ ํ๋ค.
2) ๊ฐ ์ฝ์น๊ฐ ์์์ผ์ ๋จน์ ๋ฉ๋ด๋ฅผ ์ถ์ฒํ๋ค.
3) ํ, ์, ๋ชฉ, ๊ธ์์ผ์ ๋ํด i, ii ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์ฌ๊ธฐ ๋ณด๋ฉด, ์กฐ๊ฑด ์์ฒด๊ฐ 1. ์์ผ๋ณ๋ก, 2. ๊ฐ ์์ผ๋ง๋ค ์ฝ์น๋ณ๋ก ์ด๋ ๊ฒ ํด์ผ ๋๋๋ฐ,
๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฐ ์ฝ์น๋ณ๋ก -> ์์ผ๋ณ๋ก ๋ฉ๋ด๋ฅผ ์ถ์ฒํ๋ค ๋ณด๋๊น ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
์ด๊ฑฐ๋ฅผ ์ํ ๋๋๊ธฐ 40๋ถ ์ ์ ์์์ ์ง์ง ํ๊ฒ์ง๊ฒ ์์ ํ๋ค... ใ ใ ใ ใ (๋ฌธ์ ๋ฅผ ์ ์ฝ์!)
๋ง์ฝ ํ ์คํธ ์ฝ๋์์ 10์ด ์ด์ ๊ฑธ๋ ธ๋ค๋ ์ง, ํ์์์์ด ๋ด๋ค๋ฉด... ๋๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์๋ชป ์ดํดํด์ ์๋ชป๋ ๊ตฌํ ๋๋ฌธ์
mock.when.thenReturn ๊ณผ์ ์์ ์ ๋ต์ธ ์คํ ํ์๋ณด๋ค ๋ ์คํ๋๋ค ๋ณด๋ ๊ณ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ์ผ ๊ฒ์ด๋ค.
(์ด ๋ถ๋ถ์ ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ์์๋ ๊ฒผ์๋ ๋ฌธ์ ์์ด์ ๋คํํ ์ก์๋ผ ์ ์์๋ค... ใ ใ )
public class RecommendResultRepository {
private final Map<DayWeek, Category> categoryResultStorage = new ConcurrentHashMap<>();
private final Map<Coach, List<RecommendResult>> menuResultStorage = new ConcurrentHashMap<>();
public void saveCategoryResult(DayWeek dayWeek, Category category) {
categoryResultStorage.put(dayWeek, category);
}
public void saveMenuResult(Coach coach, RecommendResult recommendResult) {
List<RecommendResult> results = menuResultStorage.getOrDefault(coach, new ArrayList<>());
results.add(recommendResult);
menuResultStorage.put(coach, results);
}
public List<Category> findCategoryByDayWeek() {
List<Category> categories = new ArrayList<>();
for (DayWeek dayWeek : DayWeek.values()) {
Category categoryResult = categoryResultStorage.get(dayWeek);
categories.add(categoryResult);
}
return categories;
}
public List<RecommendResult> findRecommendResultByCoach(Coach coach) {
return menuResultStorage.get(coach);
}
}
- ๋ง์ง๋ง์ผ๋ก ๋ ํ์งํ ๋ฆฌ ๋ถ๋ถ ์ฝ๋์ด๋ค.
DB ์ ์ฅ์๋ฅผ ์๊ฐํ๋ฉด์ Map์ ํ์ฉํ ๊ฐ์ ์คํ ๋ฆฌ์ง๋ฅผ ๋ง๋ค์๊ณ , ํน์ ๋ชฐ๋ผ์ ๋์์ฑ ์ด์ ๋๋ฌธ์ ConcurrentHashMap์ผ๋ก ๊ตฌํํ๋ค.
๋ด๋ 6๊ธฐ ์ฝํ ์์๋ ์ด๋ฐ ์์ผ๋ก repository๋ฅผ ํ์ฉํด์ ๊ฐ์ ์ ์ฅ์ํจ ๋ค์ ๊บผ๋ด๋ ๋ฌธ์ ๊ฐ ๋์ค์ง ์์๊น ์ถ๋ค...!
(4๊ธฐ์์๋ ์ด๋ฐ ์์ ๋ฌธ์ ์๋๋ฐ, ์ด๋ฐ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ ๋ณผ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ๋ค ใ ใ )
| ์ฌ๋ด (๋ณ๋ด์ฉ ์์)
์๋ฌดํผ, ์ฝ๋ ํ๊ณ ๋ ์ด ์ ๋๋ก ๋ง๋ฌด๋ฆฌ ์ง๊ณ ์ ํ๋ค.
์ง๊ธ ๋ค์ ๋ณด๋ ๋ถ์กฑํ ๋ถ๋ถ์ ์ฝ๋๊ฐ ๋ง์ง๋ง, 5์๊ฐ ์ด์ฌํ ๊ตฌํํ ๊ฑธ๋ก ์ด์ ๋๋ฉด ๋ง์กฑ...!
์ฌ์ค ๊ฐ์ธ์ ์ผ๋ก ์ฐํ ์ฝ๋ฅผ ํ๋ ๊ฒ ๋ง๋ ๊ฒ์ธ์ง, ๊ทธ๋ฅ ์ทจ์ ์ค๋น๋ฅผ ๋ ํด์ผ ๋ ์ง,
์๋๋ฉด ์ธํด์ ์งํํ๋ ํ์ฌ์ ์ ๊ท์ง์ ๊ฐ์ง ์ ๋ง ์์ฒญ ๋งค์ฐ ๊ณ ๋ฏผ์ ๋ง์ด ํ์๋๋ฐ...
์ฃผ๋ณ ์ฌ๋๋คํํ ๋ฌผ์ด๋ดค์ ๋๋ ๋๋ฌด ๊ฐ๋ ธ๋ค. ์ง๊ธ ๋ด๊ฐ ์ฐํ ์ฝ๋ฅผ ํ๋ ๊ฑด ๋ฆ์ ๊ฑด๊ฐ ์ถ๊ธฐ๋ ํ๊ณ ...
ํ์ง๋ง ์ธํด์ ํ๋ฉด์ ์งง์ ๊ณต๋ถ ๊ธฐ๊ฐ์์ ์ค๋ ์ง์์ ๋ถ์กฑํจ, ๊ทธ๋ฆฌ๊ณ ์ฒด๊ณํ๋ ํ์ ์ ๊ฒฝํํด๋ณด์ง ๋ชปํ ์ ์ด ํฌ๊ฒ ๋ค๊ฐ์๋ค.
๋ฐฑ์๋ + ์๋ฐ ๊ณต๋ถ๋ฅผ 2022๋ 2~3์๋ถํฐ ์์ํ๊ณ , 7์๊น์ง ๋น ์ง ๊ณต๋ถํ๋ค ๋ณด๋ ๊ฒจ์ฐ ๊ณต๋ถ ๊ธฐ๊ฐ์ด 5๊ฐ์์ธ ์ ์ด์๋ค.
์คํ๋ง์ด๋ , JPA์ด๋ , ์๋ฐ์ด๋ ์ง์์ด ๋๋ฌด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ค๋ฌด์์๋ ๊ณ์ ๋งํ ์๋ฐ์ ์์๊ณ ,
์ฌ๋ฌ ๋ช ์ ์ธ์์ด์ ํ์ ์ ์ฒด๊ณ์ ์ผ๋ก ํ์ ์ ์งํํ๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ณธ ์ ์ด ๋ณ๋ก ์์ด์ ๊ทธ๋ฐ ์ ์ด ์์ฌ์๋ค.
๋ฌด์๋ณด๋ค ๋ด ์์ ์ ์ค๋ ฅ์ ๋๋ฌด ๋ง์กฑํ ์ ์์๋ค. ๋๋... ์ํ๊ณ ์ถ์ด...!!!!!!
ํนํ, ์ต์ข ์ฝํ ๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ๋ณด๋ฉด์ ์ํ์ฅ์์ ๋ค๋ค ์ด์ฌํ ์ฝ๋ฉํ๋ ๋ชจ์ต์ ๋ณด๊ณ ๋ ์์ ๋ ๊ฐ์ฑํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ 1๋ ์ ๊ณต๋ถํ๋ ๊ธฐ๊ฐ์ด๋ผ๊ณ ์๊ฐํ๋ฉด์, ์ฐํ ์ฝ๋ฅผ ์ ํํ๋ค.
์๋ง ํํํ์ง๋ ์์ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ํํํ์ง ์๋๋ก ์ฐํ ์ฝ๋ ์ ๋ง ์ด์ฌํ ์ฐธ์ฌํ ๊ฑฐ๋๊น!
๊ฐ์ ๋ฐ์ ๊ท์ฌ์ด ๋ณผํ๊ณผ ์ฑ ์ผ๋ก ํฌ์คํ ๋ง๋ฌด๋ฆฌ :D (์์ง ์๊น์์ ๋ชป ์)
์ผ๋ฅธ ์ฐํ ์ฝ ํ๊ณ ์ถ๋ค...... ๊ฐ์ ๊ณต๋ถ ์ด์ฌํ ํ๊ณ , ๋ ๋์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํด๋๊ฐ๊ณ ์ถ๋ค!
2023๋ ์ ์ง์์ด ๊ฝ ์ฑ์์ง ์ํ๋ก ๋ง๋ฌด๋ฆฌํ ์ ์๊ธธ... ๐