Clean Code - 2
๐ ๋ ์ํ๊ธฐ
ใํด๋ฆฐ์ฝ๋ใ 5 ~ 8์ฅ ๋ ์ ํ๊ธฐ
- 5์ฅ. ํ์ ๋ง์ถ๊ธฐ
- 6์ฅ. ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ
- 7์ฅ. ์ค๋ฅ ์ฒ๋ฆฌ
- 8์ฅ. ๊ฒฝ๊ณ
1์ฃผ์ผ์ 4์ฅ์ฉ ์ฝ๊ธฐ๊ฐ ๋ชฉํ์ด๋ฉฐ ์ฝ์ ํ๊ธฐ๋ฅผ ๋ธ๋ก๊ทธ์ ํ๊ธฐ๋ก ์ ๋ฆฌ๊น์ง ํด๋ณด๋ คํ๋ค.
์ด๋ฒ์ฃผ๋ 5์ฅ ใํ์ ๋ง์ถ๊ธฐใ ~ 8์ฅ ใ๊ฒฝ๊ณใ ๊น์ง ์ฝ์ ํ๊ธฐ๋ฅผ ๊ฐ๋ตํ ๋จ๊ฒจ๋ณด์๋ค.
5. ํ์ ๋ง์ถ๊ธฐ
์ฃผ์ ํ ํฝ์ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ํ์์ ๊น๋ํ๊ฒ ๋ง์ถฐ ์ฝ๋๋ฅผ ์ง์ผํ๋ค๋ ๋ด์ฉ์ด๋ค.
"ํ์์ ๋ต์ ์๋ค. ํ์ผ๋ก ์ผํ๋ค๋ฉด ํ์ด ํฉ์ํด ๋ชจ๋๊ฐ ๋ฐ๋ฅผ ์ ์๋ ํ์์ ์ ํ๊ณ ์ค์ฒํด์ผํ๋ค."
์ ์ ์ผ๋ก ๋์ํ๋ค. ๊ทธ๋์ผ ์ํํธ์จ์ด๊ฐ ์ผ๊ด์ ์ธ ์คํ์ผ์ ๋ณด์ธ๋ค.
์ด๋ฒ ์ฅ์์๋ โํ ๊ธธ์ดโ, โ๋น ํ ๊ตฌ๋ถโ, โ๋ค์ฌ์ฐ๊ธฐโ ๋ฑ ์ฝ๋ ์ปจ๋ฒค์ (๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ผ์ข ์ ์ฝ๋ฉ ์คํ์ผ ๊ท์ฝ)์ ์ฃผ๋ก ์ธ๊ธํ๋ค.
์ฌ์ค ์ด ๋ถ๋ถ์ ์์ฆ์ IDE์์ ์ ๊ณตํ๋ ์ต์คํ ์ (์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์์ ESLint, Prettier ๋ฑ๋ฑ)์ ์ค์ ํ์ผ์ ๊ณต์ ํ๋ ๊ฒ ๋ง์ผ๋ก ํ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ง์ถ ์ ์๋ ๋ฑ ๋๋ฌด๋ ํธ๋ฆฌํ ๋๊ตฌ๋ค์ด ์ ๊ณต๋๊ณ ์๋ค.
์ด๋ฏธ ์ค์ฒํ๊ณ ์๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๊ฒ ์ฝ๊ณ ๋์ด๊ฐ๋ค.
6. ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ
์ด ์ฅ์์๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์๋ง์ ํด๋์ค๋ฅผ ๊ตฌ์ฑํ ๋ ์ ์ฐจ์งํฅ์ ์ธ ์ฝ๋์ ๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ฐจ์ด์ ์ ์ธ๊ธํ๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํ์ผ ํจ์ ์๋ ค์ฃผ๋ฉฐ, ํญ์ ๋ณต์กํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ ๋ต์ด ์๋์ ์ธ๊ธํ๋ค.
๋๋ก๋ ๋จ์ํ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ๊ฐ์ฅ ์ ํฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๊ตฌ๋ถํ ์ค ์์์ผํ๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๋ค.
"๋ถ๋ณ ์๋ ํ๋ก๊ทธ๋๋จธ๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๋ ์๊ฐ์ด ๋ฏธ์ ์์ ์ ์๋ค. ๋๋ก๋ ๋จ์ํ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ๊ฐ์ฅ ์ ํฉํ ์ํฉ๋ ์๋ค."
๋ฐ๋ผ์ ์์คํ ์ ๊ตฌํํ ๋, ์๋ฃ์ด ์๋ฃ ํ์ ์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ(๊ฐ์ฒด๊ฐ ์ ํฉ)์ด ํ์ํ ์ง, ์๋ก์ด ๋์์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ(์๋ฃ ๊ตฌ์กฐ์ ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ์ ํฉ)์ด ํ์ํ์ง ํ๋จ ํ ์ต์ ์ธ ํด๊ฒฐ์ฑ ์ ์ ํํด์ผํ๋ค๊ณ ์ธ๊ธํ๋ค.
์ฑ
์ ์ฝ๋ ๋์ค ํ์ฌ ๋ด๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ๊ณ ์๋ ์๋ฃ ๊ตฌ์กฐ(DTO)์ ๋ํ ์ธ๊ธ์ด ์์ด ๋ฐ๊ฐ์์.. ์ ๋ฆฌ๋ฅผ ํ๋ฒ ํ๊ณ ๋ค์์ฅ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋ค.
6-1. ์๋ฃ ์ ๋ฌ ๊ฐ์ฒด (DTO)
์๋ฃ ๊ตฌ์กฐ์ฒด๋ ๋ณ์๋ง ์๊ณ ํจ์๊ฐ ์๋ ํน์ง์ด ์๋ ํด๋์ค๋ฅผ ์ผ์ปซ๋๋ค.
์๋ฃ ๊ตฌ์กฐ์ฒด๋ ๋ชฉ์ ์ด ๋ถ๋ช ํ๋ฏ๋ก ์๋ฃ ์ ๋ฌ ๊ฐ์ฒด(Data Transfer Object, DTO)๋ผ ํ๋ค.
- DTO๋ ๊ฐ๊ณต๋์ง ์์ ์ ๋ณด๋ฅผ ์ฝ๋์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋จ๊ณ์์ ๊ฐ์ฅ ์ฒ์์ผ๋ก ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
7. ์ค๋ฅ ์ฒ๋ฆฌ
์ด ์ฅ์์ ๊ธฐ์ต์ ๋จ๋ ๋ฌธ๊ตฌ๋ฅผ ๊ผฝ์๋ฉด ์๋์ ๋ฌธ์ฅ์ ๊ผฝ์ ๊ฒ ๊ฐ๋ค.
"๋ญ๊ฐ ์ ๋ชป๋ ๊ฐ๋ฅ์ฑ์ ๋ ์กด์ฌํ๋ค."
์ฑ ์๋ ์์ธ๋ฅผ ์ง์ํ์ง ์๋ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์ธ์ด๋ถํฐ ์ค๋ช ์ ์ด์ด๊ฐ์ง๋ง, ํ์ฌ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ ์๋นํ ๋ค์ํด์ก์ผ๋ฉฐ ๋ด๊ฐ ์ฐ๊ณ ์๋ NestJS ํ๋ ์์ํฌ์์๋ ์์ธ๋ฅผ ๋ด์ฅ ๋ ์ด์ด(ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ์๋์ผ๋ก ํด๋น ๋ ์ด์ด์์ ์ฒ๋ฆฌ๋จ)๋ก ๊ตฌ๋ถํ์ฌ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฅผํ๊ณ ์๋ค.
์ฐธ๊ณ : NestJS xception-filters
์๋ฌ๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถ์ํค์ง ์๊ฒ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊ฐ๋ฐ์์๊ฒ ๋น์ฐํ ์์์ด๋ผ ์๊ฐํ๋ค.
์ด ์ฑ ์์ ๋ํ ์๋ฌ๋ try-catch๋ฌธ ์ฒ๋ผ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํด ๋ ์์ ์ธ ์ฌ์์ผ๋ก ๊ณ ๋ คํด์ผ ํผํผํ๊ณ ๊นจ๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์์ ๋ค์ํ๋ฒ ๊ฐ์กฐํ๋ค.
8. ๊ฒฝ๊ณ
์ฑํฐ ์ ๋ชฉ๋ง ๋ณด๊ณ ๋ ๋ฌด์จ ๋ด์ฉ์ธ์ง ๊ฐ์ด ์ ์์กํ๋ค. (๊ฒฝ๊ณ..?)
์ฝ๊ณ ๋๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ์ธ๋ถ ์ฝ๋๋ฅผ ์ฐ๋ฆฌ ์ฝ๋์ ๋ น์ฌ๋ด๋ ๊ณผ์ ์ค ์ฃผ์ํด์ผ ํ ์ ์ ์ธ๊ธํ๋ค.
"์ธ๋ถ ์ฝ๋๋ฅผ ์ตํ๊ธฐ๋ ์ด๋ ต๋ค. ์ธ๋ถ ์ฝ๋๋ฅผ ํตํฉํ๊ธฐ๋ ๋์ฑ ์ด๋ ต๋ค. ๋ ๊ฐ์ง๋ฅผ ๋์์ ํ๊ธฐ๋ ๋๋ฐฐ ์ด์ ์ด๋ ต๋ค."
์ฆ, ์ด ์ฑํฐ๋ฅผ ์ฝ๊ณ ๋๋์ ์ โ์ธ๋ถ ์ฝ๋(ํจํค์ง ๋ฑ)๋ ํต์ ํ๊ธฐ ์ด๋ ต๋ค.โ๋ผ๋ ๊ฒฐ๋ก ์ด๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ํต์ ํ ์ ์๋ ์์ญ์ ๊ตฌ๋ถํด์ผํ๋ฉฐ ๊ฒฝ๊ณ์ ์์นํ๋ ์ฝ๋๋ ๊น๋ํ ๋ถ๋ฆฌํด์ผํ๋ค.
์ฐ๋ฆฌ๋ ์ธ๋ถ ํจํค์ง๋ฅผ ์ธ์ธํ๊ฒ ๋ชจ๋ ์์์ผ ํ ํ์๋ ์๋ค.
ํต์ ๊ฐ ๋ถ๊ฐ๋ฅํ ์ธ๋ถ ํจํค์ง๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋ณด๋ค๋ ์ฐ๋ฆฌ ์ฝ๋์ ์์กดํด์ ์์คํ ์ ์ค๊ณํด์ผํ๋ค ๊ฐ์กฐํ๋ค.