# ์ํคํ ์ฒ(Architecture)
- ๊ฑด๋ฌผ์ ๋ผ๋๋ฟ ์๋๋ผ ํน์ฑ์ ๊ฒฐ์ ์ง๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ผ์ปซ๋ ๋ง(๋ชจ๋ ๊ธฐ์ ๋ถ์ผ์ ์ ์ฉํ ์ ์๊ณ ์ข ๋ฅ๋ ๋ค์ํจ)
- ๋ํ ํ๋ก์ ํธ๊ฐ ๋ณต์ก์ฑ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ๊ฐ๋ฐํ ์ํํธ์จ์ด์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์๊ฐ
- ์ํํธ์จ์ด์ ๊ตฌ์กฐ๋ฅผ์ด๋ฃจ๋๊ฐ ๊ตฌ์ฑ์์๋ฅผ ์ฐพ์
- ๊ฐ ๊ตฌ์ฑ์์ ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ฅผ ์ค์
- ์ผ์ ํ ๊ท์น์ ๋ฐ๋ฆ
- ์ํํธ์จ์ด ์ํคํ ์ฒ : ์์ ์์ค์์ ์ํํธ์จ์ด ๊ตฌ์ฑ์์๋ค ๊ฐ์ ๊ด๊ณ๋ก ๊ตฌ์ฑ๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ํ๋...
# ์ํํธ์จ์ด ์ํคํ ์ฒ์ ์ญํ
- ์ฌ๋ฌ ์ดํด๊ด๊ณ์ ๊ฐ์ ๊ณตํต์ ์์ฌ์ํต ์๋จ(์ด๋์ ๋์ what๊ณผ how๊ฐ ๋ค ๋ด๊ฒจ์ ธ ์๋ค! ๊ณ ๊ฐ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๊ฐ๊ณ ์๋์ง..)
- ์์คํ ํ์ง ์์ฑ์ ์ฌ์ฉ๋๋ ์ต์ ๊ธฐ์ค (์ํํธ์จ์ด ํ์ง ์์ฑ 8๊ฐ์ง๋ฅผ ์ฌ์ฉํด์ ์ํคํ ์ฒ๊ฐ ์ด๋ค ์ ๋์ ์์ค์ธ์ง, ์ ์ง๋ณด์ & ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค๋๋ก ํจ..)
- ๋ณ๊ฒฝ์ ๋ํ ์์ธ ํ์ ๋ฐ ์ ์ฐํ ๋์ฒ๊ฐ ๊ฐ๋ฅ
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์ ํ๋ณด ์๋จ
# ์ํคํ ์ฒ ์ค๊ณ ์ ๊ณ ๋ ค ์ฌํญ
- ๋ชจ๋ ์ดํด๊ด๊ณ์ ์ฌ์ด์ ์์ฌ์ํต ๋๊ตฌ๋ก ํ์ฉํ ์ ์์ด์ผ ํจ
- ๊ตฌํ์ ๋ํ ์ ์ฝ ์ฌํญ(๊ฐ๋ฐ ๋น์ฉ, ๊ธฐ๊ฐ, ์กฐ์ง์ ์ญ๋ ๋ฑ)์ ์ ์ํด์ผ ํจ
- ๋ชจ๋ ์ดํด๊ด๊ณ์์ ํ์ง์๊ตฌ์ฌํญ์ ๋ฐ์ํด ์ฐ์ ์์์ ๋ฐ๋ผ ์์คํ ํ์ง ์์ฑ์๊ฒฐ์ ํด์ผ ํจ (์ฑ๋ฅ ์ฌ์ฉ์ฑ, ๋ณด์์ฑ, ์์ ์ฑ, ๊ฒ์ฆ ๊ฐ๋ฅ์ฑ, ๋ณ๊ฒฝ ์ฉ์ด์ฑ ๋ฑ)
- ํน์ ๋ฌธ์ ์์ญ์ ์ ํฉํ ์ํํธ์จ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ํ์คํํ๊ณ ํจํดํํด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณํด์ผ ํจ
# ์ํคํ ์ฒ ํ์ง ์์ฑ : ์์คํ ํ์ง ์์ฑ
- ๊ฐ์ฉ์ฑ(Availability) : ์์คํ ์ด ์คํจ ์์ด ์ด์ฉ๋ ์ ์๋ ํ๋ฅ ๋ก ์์คํ ์ด ์ฅ์ ๋ฐ์ ์์ด ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๋ ๋ฅ๋ ฅ
- ๋ณ๊ฒฝ ์ฉ์ด์ฑ(Modifiability): ์ฌ์ฉ์๊ฐ ์๋ก์ด ์๊ตฌ์ฌํญ์ ์์ฒญํ์ ๋
- ์ฑ๋ฅ(Performance) : ์ฌ์ฉ์ ์์ฒญ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ผ๋ง๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ ๊ฐ๋ฅผ ๋งํจ
- ๋ณด์์ฑ : ํ์ฉ๋์ง ์์ ์ ๊ทผ์ ๋์ํ ์ ์๋ ๋ฅ๋ ฅ
- ์ฌ์ฉ์ฑ : ์์คํ ์์ฌ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ํฉ์ ๊ทน๋ณตํ ์ ์๋๋ก ์ด๋ฅผ ๋ฐ์ํด ์ํคํ ์ฒ ์ค๊ณ ์์ ์ ํด์ผ ํจ
- ํ ์คํธ ์ฉ์ด์ฑ : ํ ์คํธ ๋น์ฉ์ ์ค์ด๊ธฐ ์ํด์๋ ์ํคํ ์ฒ ์ค๊ณ๋ถํฐ ํ ์คํธ๋ฅผ ๊ณ ๋ คํด์ผ ํจ
# ์ํคํ ์ฒ ํ์ง์์ฑ : ์ํคํ ์ฒ ํ์ง์์ฑ
- ๊ฐ๋ ์ ๋ฌด๊ฒฐ์ฑ : ์์คํ ์ค๊ณ๋ ์ ์ฒด ์์คํ ์ ๋ํ๋ด๋์ค๊ณ์ ์ธ๋ถ ๊ตฌ์ฑ ์์ ์ค๊ณ๋ก ๋๋จ
- ์ ํ์ฑ๊ณผ ์์ ์ฑ : ์ ํ์ฑ๊ณผ ์์ ์ฑ์ ์ฌ์ฉ์๊ฐ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ์ถฉ์กฑ์ํค๋ ์ ๋๋ฅผ ๋งํ๋ฉฐ ์ค๊ตฌ๋ถ์๋ช ์ธ์ ์ผ์นํ๋ ์ ๋๋ฅผ ๋ํ๋(์๊ตฌ์ฌํญ ๋ช ์ธ์ ์๋ ๋ด์ฉ์ ๋ค ํฌํจ ํด์ผํจ / ํ์ ์๋ ๋ด์ฉ ๋ฃ์ ํ์ ์์)
- ๊ฐ๋ฐ ์ฉ์ด์ฑ(๊ตฌ์ถ ๊ฐ๋ฅ์ฑ) : ์ ์ฒด ์์คํ ์ ์ ์ ํ ๋ชจ๋๋ก ๋ถํ ํ ํ ์๋ง๊ฒ ๋ถ๋ฐฐ ํด ๊ฐ๋ฐํจ์ผ๋ก์จ ์ ํด์ง ๊ธฐ๊ฐ ๋ด์ ๊ฐ๋ฐ์ ์์ฑํ ์ ์๊ณ ๊ฐ๋ฐ ๊ณผ์ ์ค์๋ ์ฝ๊ฒ ๋ณ๊ฒฝ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๋งํจ
# ์ํคํ ์ฒ์ 4 + 1 ๊ด์ (View)
- ์ดํด ๊ด๊ณ์ ๋ณ๋ก ๊ด์ ์ด ๋ค๋ฆ(QA, ๊ธฐํ์, ๊ฐ๋ฐ์....)
- ์์คํ ์ ์ด๋ฃจ๋ ์์์ ์งํฉ๊ณผ ๊ทธ๋ค์ ์ฐ๊ด ๊ด๊ผ๋ฅผ ์ถ์์ ์ผ๋ก ํํํ ๊ฒ!
# UI / UX
- UI(User Interface) : ์ฌ์ฉ์์ ์ปดํจํฐ ์ฌ์ด์์ ์์ฌ์ํต์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ง๋งค๊ฒ์ฒด(ํ๋ฉด๊ตฌ์ฑ์ ์ด๋ป๊ฒ ๋ฐฐ์นํ ์ง)
- UX(User Experience) : ์ฌ์ฉ์๊ฐ ์ด๋ค ์์คํ , ์ ํ ์๋น์ค๋ฅผ์ง/๊ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด์ ๋๋ผ๊ณ ์๊ฐํ๊ฒ ๋๋ ์ด์ฒด์ ์ธ ๊ฒฝํ(์ด๋ค ์ด์ ๋ก ์๋น์๊ฐ ๋ ๋๊ฐ๊น.. ์ด๋ฐ๋๋)
# ์ฐ๊ด ๊ด๊ณ vs ์์กด๊ด๊ณ
- ์ฐ๊ด ๊ด๊ณ(Association)
- ์์ ํ๋ค์ ์๋ฏธ (has a) -> ๋์ ๊ฒฐํฉ๋
- ๊ฒฐํฉ๋๊ฐ ๋์์ ์ ์ฌ์ฉ ์ํจ..
- 1:1, 1:N, N:M ๊ด๊ณ๊ฐ ๋ง๋ค...
- 0..* => 0..n๊ณผ ๊ฐ์ ์๋ฏธ
- ์์๋ ๊ฐ์ ๋ฉ์๋๋ฅผ์ฌ์ฉํ๋๊น ์ค์ ์ผ๋ก(์ฐ๊ด ๊ด๊ณ)ํ์
- ์์กด๊ด๊ณ(Dependency)
- ์ฌ์ฉ ํ๋ค์ ์๋ฏธ (uses a) -> ๋ฎ์ ๊ฒฐํฉ๋
- ํธ์ถ(call)ํ๋ค์ ๊ด๊ณ
# ํด๋์ค ํ์
- ๊ฒฝ๊ณ ํด๋์ค(Boundary Class)
- ์์คํ ์ธ๋ถ์ ์กํฐ์ ์ํธ ์์ฉํ๋ ํด๋์ค
- ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ดํ๋ ์ญํ
- ์์คํ ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ด๋น
- Controller์ ์ญํ !!
- ์ ์ด ํด๋์ค(Control Class)
- ๊ฒฝ๊ณ ํด๋์ค์ ์ํฐํฐ ํด๋์ค ์ฌ์ด์ ์ค๊ฐ ์ญํ
- ์์คํ ๋ด๋ถ์์ ์ปจํธ๋กคํ๋ ์ญํ / ์์คํ ๊ทธ ์์ฒด
- ์์คํ ์ ์ค์ง์ ์ธ๊ธฐ๋ฅ
- Service์ ์ญํ !!
- ์ํฐํฐ ํด๋์ค(Entity Class)
- ์์คํ ์์ ์ ์ง ๋ฐ ์ถ์ ํด์ผ ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํด๋์ค(DB์ ์ฐ๊ฒฐ๋๋ ํด๋์ค)
- ์ฌ์ฉ ์ฌ๋ก์์ ๋ฐ๋ณต๋์ด ๋์ค๋ ์ฉ์ด
- ๋ช ์ฌ ์ถ์ถ๋ฒ์ ํตํด์ ์ถ์ถํ ์ ์๋ค
# ์ํํธ์จ์ด ๊ตฌํ
- ๊ฐ๋ณ ์ํํธ์จ์ด ๋จ์๋ฅผ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๊ตฌํํ๊ณ ์ด๋ฅผ ๋ฌธ์ํํ๋ ํ๋์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ ํจ
# ํ๋ก๊ทธ๋๋ฐ์ ์ดํด
- ์ฃผ์ ์ฉ์ด
- ํ๋ก๊ทธ๋จ : ์ปดํจํฐ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ์์ฑํ๋ ๋ช ๋ น์ด๋ค์ ๋ชจ์
- ํ๋ก๊ทธ๋๋ฐ : ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ณผ์
- ํ๋ก๊ทธ๋๋จธ : ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ์ฌ๋ ๋๋ ์์
- ํ๋ก๊ทธ๋๋ฐ ์ธ์ด : ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ธ์ด
# ๊ณ ๊ธ ์ธ์ด์ ์ ๊ธ ์ธ์ด
- ์ ๊ธ ์ธ์ด : ํ๋์จ์ด ์งํฅ์ ๊ธฐ๊ณ ์ค์ฌ ์ธ์ด ex) ๊ธฐ๊ณ์ด, ์ด์ ๋ธ๋ฆฌ์ด
- ๊ณ ๊ธ ์ธ์ด : ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฌ์ด ์ผ์ ์ธ์ด์ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ ์ธ๊ฐ ์ค์ฌ์ ์ธ์ด ex) C, C++, ์๋ฐ, ํ์ด์ฌ...
# ๋น๋(Build)
- ์์ค์ฝ๋๋ฅผ ์คํ ๊ฐ๋ฅํ ๋ ๋ฆฝ์ ์ธ ์ํํธ์จ์ด๋ก ๋ง๋๋ ๊ณผ์ (์ปดํ์ผ -> ๋งํฌ -> ํจํค์ง -> ํ ์คํธ)
- ์ปดํ์ผ(Compile) : ์์ค ํ์ผ์ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ณผ์
- ๋งํฌ(Link) : ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ์ ์ธ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ฌผ(๋ชจ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)์ ์ฐ๊ฒฐํ์ฌ ์คํ ๊ฐ๋ฅํ ํ์ผ์ ๋ง๋๋ ๊ณผ์
- ํจํค์ง (Packaging) : ์ปดํ์ผ ๋ฐ ๋งํฌ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์คํ ๊ฐ๋ฅํ ํํ ๋ก ๋ฌถ๋ ๊ณผ์ (๋ฆฌ์์ค ํ์ผ(์ด๋ฏธ์ง, ์ค์ ํ์ผ ๋ฑ)์ ํฌํจํ์ฌ ๋ฐฐํฌ ๊ฐ๋ฅํ ํ์์ผ๋ก ์์ถ)
- ํ ์คํธ : ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ๊ฒ์ฆํ๋ ๊ณผ์ (์ฃผ๋ก ๊ธฐ๋ฅ ํ ์คํธ๋ฅผ ์ํ)
# ๋น๋ ๋๊ตฌ : Maven
- Java ๋น๋ ๊ด๋ฆฌ ๋๊ตฌ
- ์ฌ์ฉ ๋ชฉ์
- ๋ชจ๋๊ฐ ๋์ผํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด์(๊ฐ์ ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ธฐ ์ํด์!!)
- ์ ํํ๋ ์์ค์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด์
- ๋ค๋ฅธ ๋๊ตฌ์ ์ฝ๊ฒ ์ฐ๋ํ๊ธฐ ์ํด์
- ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ํ์ AA(Application Architect)๊ฐ Maven ๊ตฌ์กฐ ์์ฑ ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ
- pom.xmlํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ๋ฐ ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ(QA์ ๊ฒฝ์ฐ, ํ์ง ๊ด๋ จ ํ๋ฌ๊ทธ์ธ ์ค์ )
- ๊ฐ๋ฐ ํ์์ ์ ํด์ง ํจํค์ง์์ ์์ค์ฝ๋ ๊ฐ๋ฐ
# ๋ผ์ดํ์ฌ์ดํด๊ณผ ๋จ๊ณ
- ๋ผ์ดํ์ฌ์ดํด
- clean : ์ด์ ๋น๋์์ ์์ฑ๋ ์ฐ์ถ๋ฌผ์ ์ญ์ ํ๋ ๊ธฐ๋ฅ
- default : ํ๋ก์ ํธ ๋น๋/๋ฐฐํฌ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ
- site : ํ๋ก์ ํธ์ ์ฌ์ดํธ ๋ฌธ์ ์์ฑ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ
- default ์ ๋จ๊ณ
- validate : ์ ์์ ์ ํ๋ก์ ํธ์ด๊ณ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ์ค๋น๋์๋์ง ํ์ธ
- compile : ํ๋ก์ ํธ์ ์์ค์ฝ๋๋ฅผ ์ปดํ์ผ
- test : ์ปดํ์ผํ ์์ค์ฝ๋๋ฅผ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํด ํ ์คํธ
- package : JAR์ ๊ฐ์ด ์ง์ ๋ ํฌ๋งท์ผ๋ก ํจํค์ง
- verify : ํจํค์ง๊ฐ ํ์ง ์์ค์ ๋ง์กฑํ๋์ง ๊ฒ์ฆ
- install : ํจํค์ง๋ฅผ ๋ก์ปฌ ์ ์ฅ์์ ์ค์น
- deploy : ์ต์ข ํจํค์ง๋ฅผ ์๊ฒฉ ์ ์ฅ์๋ก ๋ณต์ฌ
- Maven ๋ช ๋ น
mvn clean package site pmd:pmd jdepend:generate
# Git ์๊ฐ
- ๋ฒ์ ๊ด๋ฆฌ์ ๋ํ ๋๊ตฌ
- ๋ชฉ์ : ๋ฒ์ ๊ด๋ฆฌ์ ํ์ ์ปค๋ฎค๋์ผ์ด์
- ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ๋ณ๋์ ์ ์ฅ์ ์ด์ ์๋ฒ ์ฌ์ฉ
- Git: GitHub, BitBuket, GitLab, Giblit
- ํตํฉ ์ ์ฅ์ : SCMManager
- ํด๋ผ์ด์ธํธ๋ Core๋ ๋ณ๋์ ํ์ฅ ๋๊ตฌ ์ฌ์ฉ
- Eclipse/Intelli J ๊ณ์ด / VS Code ํ๋ฌ๊ทธ์ธ : ๊ธฐ๋ณธํฌํจ
- Tortoise ์๋ฆฌ์ฆ
- Sourcetree
์ค์ต
1. github์์ ์ ์ฅ์ ํ๋ ์์ฑ (junit4 ํ๋ก์ ํธ fork)
2. github ์ ์ฅ์ (์๊ฒฉ) >> local(์ปดํจํฐ)์ ๋ณต์ (git clone)
> ํ์ผ ํ๋ ์์
> ์์ ๋ ํ์ผ commit
> ๋ก์ปฌ == ์๊ฒฉ ๋์ผํ๊ฒ ์ธํ !
3. eclipse ํ๋ก์ ํธ (maven)
# ํ์ง(Quality) ์ ์
- ๋ฌผ๊ฑด์ด ์ผ๋ง๋ ์ข์์ง, ๋์์ง๋ฅผ ๋ํ๋ด๋ ์ ๋
- ํ์ง์ ๋ชจ๋ ์ ํ์์ ๊ฐ์ฅ ์ค์ํ ์์์ด๋ฉฐ, ์ํํธ์จ์ด ์ ํ๋ ์์ธ๋ ์๋
- ๋ช ์์ , ๋ฌต์์ ์๊ตฌ๋ฅผ ๋ง์กฑ์ํค๋ ์ ํ ๋๋์๋น์ค์ ๋ฅ๋ ฅ์ ๊ดํ ํน์ฑ
(๊ณ ๊ฐ์ ์๊ตฌ๋ฅผ ๋ง์กฑ์ํค๋ ๊ฒ / ํ์ง์ ์ฌ์ฉ ๋ชฉ์ ์ ์ผ์น๋๋ ์ ๋ / ํ์ง์ ๊ณ ๊ฐ ์๊ตฌ์ฌํญ์ ๋ํ ์ ํฉ๋)
# ์ํํธ์จ์ด ํ์ง์ ์ ์
- IEEE
- ์ํํธ์จ์ด๊ฐ ํ์ํ ์์ฑ์ ๋ณด์ ํ๊ณ ์๋ ์ ๋
- ์ฌ์ฉ์์ ๊ธฐ๋ ์์ค์ ๋ง์กฑํ ์ ์๋ ์ ๋๋ฅผ ๊ฒฐ์ ํ๋ ์ํํธ์จ์ด์ ํน์ฑ
- United States Department of Defense (DoD ๋ฏธ ๊ตญ๋ฐฉ๋ถ)
- ๊ฐ๋ฐ๋ ์ํํธ์จ์ด๊ฐ ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ ์ ์๋ ๋ฅ๋ ฅ
- Roger S.Pressman
- ์ํํธ์จ์ด๊ฐ ๊ธฐ๋ฅ ์ฑ๋ฅ ๋ฐ ๋ง์กฑ๋์ ์์ด์ ๋ช ์๋ ์๊ตฌ์ฌํญ ๋ฐ ๋ด์ฌ๋ ์๊ตฌ์ฌํญ์ ์ผ๋ง๋ ์ถฉ์กฑํ๋ ๊ฐ๋ฅผ ๋ํ๋ด๋์ํํธ์จ์ด ํน์ฑ์ ์ด์ฒด
# ํ์ง ๋์ ์ํํธ์จ์ด๋?
=> ์ฌ์ฉ์๊ฐ ์ํ๋ ์ํํธ์จ์ด + ์ ์ ๋์ํ๋ ์ํํธ์จ์ด + ์์ฑ๋๊ฐ ๋์ ์ํํธ์จ์ด
[๊ฐ๋ฐ์ ๊ด์ ] ํ๋ก๊ทธ๋จ์ ๊ฒฐํจ์ด ์๊ณ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ ์ํ ์๊ตฌ๋ถ์ ๋ช ์ธ์๋๋ก ๋ง๋ ์ํํธ์จ์ด
# ์ํํธ์จ์ด ํ์ง(Software Quality)
- ์ ํ(Product) ํ์ง
- ์ ํ ์์ฒด๊ฐ ๊ฐ์ง๋ ํ์ง
- ์์ฑ๋ ์ํํธ์จ์ด๊ฐ ์ด์ฉ๋ ํ๊ฒฝ์ ์ฌ๋ ค์ ธ ์ต์ข ์์คํ ์ด ์์ฑ๋์์ ๋, ์๋น์๊ฐ ์๊ตฌํ๋ ๋ฐ์ ์ผ๋ง๋ ๋ถํฉํ๋์ง๋ฅผ ๋ํ๋ด๋ ํ์ง
- ํ๋ก์ธ์ค(Process) ํ์ง
- ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ํ์ํ๋ชจ๋ ๊ฐ๋ฐ ํ๋์ด ๊ณํ์ ์ค์ํ์ฌ ๊ฐ๋ฐํ์๋๊ฐ๋ฅผ ๋ํ๋ด๋ ํ์ง
- ๊ทธ ํ๋์ด ํจ๊ณผ์ ์ธ์ง์ ๋ํด ๊ฒํ (Review) ๋ฐ ๊ฐ์ฌ(Audit) ํ๋์ ํตํด ํ์ธ
# ์ํํธ์จ์ด ์ ํ ํ์ง ํน์
- ์ํํธ์จ์ด ์ ํํ์ง์ด ๊ฐ์ ธ์ผํ๋ ์ธ๋ถ ์์ฑ
- ISO 25010(๊ณผ๊ฑฐ ISO 9126)์ ์ํํธ์จ์ด ํ์ง ํน์ฑ ์ ์
- ๊ธฐ๋ฅ์ฑ : ์๊ตฌ๋๋ ๊ธฐ๋ฅ์ ๋ง์กฑ์ํค๋ ๋ฅ๋ ฅ
- ์ ๋ขฐ์ฑ : ๊ท์ ๋ ํ๊ฒฝ์์ ๊ฒฐํจ ์์ด ์๋๋ ๊ธฐ๋ฅ ๋ฐ ์์ ์ ์ํํ๋ ๋ฅ๋ ฅ
- ์ฌ์ฉ์ฑ : ์ฌ์ฉ์๊ฐ ์ดํดํ๊ณ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ด ์ ๋
- ํจ์จ์ฑ : ์ ์ ํ์์์ ์ฌ์ฉ ๋ฐ ์ ์ ํ ๋ฐ์์๊ฐ ์ ๋
- ์ ์ง๋ณด์์ฑ : ์ํํธ์จ์ด์ ์์ ๋ฐ ๋ณ๊ฒฝ์ ์ฉ์ด์ฑ
- ์ด์์ฑ : ์ง์ํ๋ ๋ค์ํ ํ๊ฒฝ์์ ์ด์๋ ์ ์๋ ๋ฅ๋ ฅ
- ์ํธ์ด์์ฑ : ๋ค๋ฅธ ์์คํ ๊ณผ์ ์ํธ ์ฐ๋ ๋ฅ๋ ฅ
- ๋ณด์์ฑ : ์ ๋ณด ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ๋ฅ๋ ฅ
- + ์์ ์ฑ
# ์ํํธ์จ์ด ์ ํ ํ์ง ์์ค ์๊ธฐ : V & V
- Verification (๊ฒ์ฆ)
- ์ ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ๋๊ณ ์๋๊ฐ? (Are we building the product right?)
- ์ํํธ์จ์ด๊ฐ ์ ํํ ์๊ตฌ์ฌํญ์ ๋ถํจํ์ฌ ๊ตฌํ๋์์์ ๋ณด์ฅํ๋ํ๋
- ์๊ตฌ์ฌํญ ๋ช ์ธ์์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ์ ๋ง๋ค๊ณ ์์์ ๋ณด์ฅ
- ์์ฑ๋๊ฐ ๋์ + ์ ์ ๋์ํ๋ ์ ํ!!!
- Validation (ํ์ธ)
- ์ฌ๋ฐ๋ฅธ ์ ํ์ ์์ฑํ๊ณ ์๋๊ฐ? (Are we building the right product?)
- ์ํํธ์จ์ด๊ฐ ๊ณ ๊ฐ์ด ์๋ํ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๊ตฌํ๋์์์ ๋ณด์ฅํ๋ ํ๋
- ๊ณ ๊ฐ์ด ์๋ํ ํ๊ฒฝ์ด๋ ์ฌ์ฉ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅธ์ ํ์ ๋ง๋ค๊ณ ์์์ ๋ณด์ฅ
- ์ฌ์ฉ์๊ฐ ์ํ๋ ์ ํ!!!
# V๋ชจ๋ธ์์์ V & V
- ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ ๋จ๊ณ์ ๊ทธ์ ์์ํ๋ ์ํํธ์จ์ด ํ ์คํธ ๋จ๊ณ๋ฅผ ๋งคํํ ๋ชจ๋ธ : V ๋ชจ๋ธ
- ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ก ํญํฌ์ ๋ชจ๋ธ์ ํ์ฅ๋ ํํ ์ค ํ๋๋ก, ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ ๋จ๊ณ์ ๊ทธ์ ์์ํ๋ ์ํํธ์จ์ด ์ํ ๊ฐ ๋จ๊ณ์ ๊ด๊ณ๋ฅผ ๋ํ๋
# ์ํํธ์จ์ด ํ ์คํธ
- ์ ์ ์กฐ๊ฑด ๋ฐ ๋น์ ์ ์กฐ๊ทผ(์ฆ, ๊ฒฐํจ/๋ฒ๊ทธ) ์ฌ์ด์ ์ฐจ์ด์ ์ ๋ฐ๊ฒฌํ๊ธฐ ์ํ์ฌ ์ํํธ์จ์ด ํญ๋ชฉ์ ๋ถ์ํ๊ณ , ๋ถ์๋ ํญ๋ชฉ์ ํน์ฑ์ ํ๊ฐํ๋ ํ๋ก์ธ์ค
=> ๊ฒฐํจ์ ๋ฐ๊ฒฌ์ ๋ชฉ์ ์ผ๋ก ์ํํธ์จ์ด๋ฅผ ๋ถ์ํ๋ ํ๋
# Error, Defect, Failure ์ฉ์ด ์ ์
- ์๋ฌ (Error) : ๊ฒฐํจ์ ์์ธ์ผ๋ก ์ฌ๋(SW ๊ฐ๋ฐ์, ๋ถ์๊ฐ ๋ฑ)์ ์ํ์ฌ ์์ฑ๋ ์ค์๊ฐ ์ฃผ๋ฅผ ์ด๋ฃธ
- ๊ฒฐํฉ(Defect, Fault), ๋ฒ๊ทธ(Bug) : ์คํจ / ๊ณ ์ฅ ๋๋ ๋ฌธ์ ์ ์์ธ์ผ๋ก ์ ํ์ ํฌํจ๋ ๊ฒฐ์
- ์คํจ / ๊ณ ์ฅ(Failure), ๋ฌธ์ (Problem) : ์ ํ์ ๊ฒฐํจ(Defect)์ด ์๋ ๋ถ๋ถ์ด ์คํ๋ ๋ ๋ฐ์๋๋ ํ์
์์...
Input : Distance, Time
Output : Speed = Distance / Time
1. ์๋ฌ(Error)
Didn't think about the case of <time=0>
2. ๊ฒฐํจ(Defect, Fault)
There is no code for handling when <time=0>
3. ์คํจ/๊ณ ์ฅ(Failure)
<Divide by Zero Exception> happened
# ์ํํธ์จ์ด ํ ์คํธ ์ข ๋ฅ
- ์ ์ (Static)์ธ ๋ฐฉ๋ฒ
- ์ํํธ์จ์ด๋ฅผ ์คํํ์ง ์๊ณ ๊ฒฐํจ์ ๋ฐ๊ฒฌ
- ์ฌ๋ฌ ์ฐธ๊ฐ์๋ค์ด ๋ชจ์ฌ ์ํํธ์จ์ด๋ฅผ ๊ฒํ ํ์ฌ ๊ฒฐํจ์ ์ฐพ์๋ด๊ฑฐ๋ ์ ์ ๊ฒ์ฆ ๋๊ตฌ ์ด์ฉ
- ์ํํธ์จ์ด ๊ฐ๋ฐ ์ค์ ์์ฑ๋๋ ๋ชจ๋ ์ฐ์ถ๋ฌผ๋ค์ ๋ํด์ ์ ์ฉ ๊ฐ๋ฅ
- ํ๋ก์ ํธ๊ฐ ์์ํ ๋๋ถํฐ ๋๋ ๋๊น์ง ์ํ ๊ฐ๋ฅ
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ
- ๋๋ฃ ๊ฒํ (Peer Review)
- ์ธ์คํ ์ (Inspection)
- ์ํฌ์ค๋ฃจ(Walk-through)
- ๋ฐ์คํฌ์ฒดํฌ(Desk Check)
- ๋๊ตฌ๋ฅผ ์ด์ฉํ ์ ์ ๋ถ์
- ๋ฃฐ ๊ธฐ๋ฐ ์ ์ ๋ถ์(PMD, BugFind๋ฑ)
- ์์กด์ฑ ๋ถ์
- ์ฝ๋ ๋ฉํธ๋ฆญ ์ธก์
- ๋๋ฃ ๊ฒํ (Peer Review)
- ๋์ (Dynamic)์ธ ๋ฐฉ๋ฒ(์ข์ ์๋ฏธ์์์ ํ
์คํธ๋ ๋์ ํ
์คํธ๋ผ๊ณ ๋ ํจ)
- ์ํํธ์จ์ด๋ฅผ ์คํํ์ฌ ๊ฒฐํจ์ ๋ฐ๊ฒฌ
- ๋ฐ๊ฒฌ๋ ๊ฒฐํจ์ ๋๋ฒ๊น ํ๋์ผ๋ก ํ์ธํ์ฌ ์์ ํจ
- ์์ค์ฝ๋ ๋ง๋ค์ด์ง ์ดํ์ ์ํํจ!
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ
- ํ
์คํธ
- ๋จ์ ํ ์คํธ(Unit Test)
- ํตํฉ ํ ์คํธ(Integration Test)
- ์์คํ ํ ์คํธ(System Test)
- ์ธ์ค ํ ์คํธ(Acceptance Test)
- ํ
์คํธ
- ๋ธ๋๋ฐ์ค ํ ์คํธ(๋ช ์ธ ๊ธฐ๋ฐ ํ ์คํธ)
- ํ์ดํธ๋ฐ์ค ํ ์คํธ(๊ตฌ์กฐ ๊ธฐ๋ฐ ํ ์คํธ)
- ํ
์คํธ
# ์ํํธ์จ์ด ํ ์คํธ ํ๋ก์ธ์ค
- ์ํํธ์จ์ด ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ์ํ ์ ์ฐจ/๋ฐฉ๋ฒ, ๋๊ตฌ/์ฅ๋น, ์ธ๋ ฅ์ ํตํฉ
- ํ ์คํธ ์ ์ฐจ : ํ ์คํธ ๊ณํ -> ํ ์คํธ ์ผ์ด์ค ์ค๊ณ -> ํ ์คํธ ์คํ ๋ฐ ์ธก์ -> ํ ์คํธ ๊ฒฐ๊ณผ ๋ถ์ -> ์ค๋ฅ ์ถ์ ๋ฐ ์ถ์
- ๊ตญ์ ํ์ค : ISO/IEC 29119
- ํ ์คํธ ํ๋
- ํ ์คํธ ๊ณํ(Test Planning), ํ ์คํธ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ด(Test Monitoring and Control), ํ ์คํธ ๋ถ์(Test Analysis), ํ ์คํธ ๋์์ธ, ํ ์คํธ ๊ตฌํ, ํ ์คํธ ์คํ, ํ ์คํธ ์๋ฃ... (๋ค ํ์ง๋ ์์)
- ํ
์คํธ ๊ณํ
- ํ ์คํธ ๋ชฉํ๋ฅผ ์ ์ํ๊ณ ํ ์คํธ ๋์ ๋ฐ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ํ ์คํธ ๊ณํ์๋ฅผ ์์ฑํ๊ณ ๊ฒํ
- ํ ์คํธ ๊ณํ์ ์ด๋ฐ์๋ง ํ๋๋?? ๋ชจ๋ ํ ์คํธ ๊ณผ์ ์์ ๊ณํ์ด ํ์ํจ...
- ์ํํธ์จ์ด ํ
์คํธ ๊ณํ ๋จ๊ณ
- ์ ๋ ฅ : ํ๋ก์ ํธ ๊ณํ์, ์๊ตฌ๋ถ์ ๋ช ์ธ์
- ์ฒ๋ฆฌ : ํ ์คํธ ๋ชฉํ ์ ์, ํ ์คํธ ๋์ ๋ฐ ๋ฒ์ ๊ฒฐ์ , ํ ์คํธ ๊ณํ์ ์์ฑ ๋ฐ ๊ฒํ
- ๊ฒฐ๊ณผ : ํ ์คํธ ์๊ตฌ์ฌํญ ์ ์์, ํ ์คํธ ๊ณํ์
- ํ
์คํธ ์ผ์ด์ค ์ค๊ณ
- ํ
์คํธ ์ค๊ณ ๊ธฐ๋ฒ์ ์ ์ํ๊ณ , ๋์ถ๋ ํ
์คํธ ์ผ์ด์ค์ ์
๋ ฅ ๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑ
- ์ํํธ์จ์ด ํ
์คํธ ์ผ์ด์ค ์ค๊ณ ๋จ๊ณ
- ์ ๋ ฅ : ํ ์คํธ ๊ณํ์
- ์ฒ๋ฆฌ : ํ ์คํธ ์ค๊ณ ๊ธฐ๋ฒ ์ ์, ํ ์คํธ ์ผ์ด์ค ๋์ถ, ์์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ
- ๊ฒฐ๊ณผ : ํ ์คํธ ์ผ์ด์ค ๋ช ์ธ์, ํ ์คํธ ์ค๊ณ์, ํ ์คํธ ์ ์ฐจ์
- ์ํํธ์จ์ด ํ
์คํธ ์ผ์ด์ค ์ค๊ณ ๋จ๊ณ
- ํ
์คํธ ์ผ์ด์ค(Test Case)
- ํน์ ํ ์๊ตฌ์ฌํญ์ด ์ ๋๋ก ๊ตฌํ๋์๋์ง ๊ฒ์ฆํ๊ธฐ ์ํ์ฌ ํ ์คํธ ์กฐ๊ฑด, ์ ๋ ฅ ๊ฐ, ์์ ์ถ๋ ฅ ๊ฐ, ์ค์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋๊ฒ
- ํ
์คํธ ์ผ์ด์ค ์์ฑ ์์
- ํ ์คํธ ๋ฒ ์ด์์ค(๊ทผ๊ฑฐ ๋ฌธ์)๋ฅผ ์์ฑํ ๋ ํ ์คํธ ์ผ์ด์ค ์์ฑ
- ํ ์คํธ ์ผ์ด์ค ์์ฑ์ ํตํด ํ ์คํธ ๋ฒ ์ด์์ค์ ํ์ง์ ๊ฐ์
- ํ
์คํธ ์ค๊ณ ๊ธฐ๋ฒ์ ์ ์ํ๊ณ , ๋์ถ๋ ํ
์คํธ ์ผ์ด์ค์ ์
๋ ฅ ๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑ
3. ํ ์คํธ ์คํ ๋ฐ ์ธก์
- ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ณ ๋์ถ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ด์ฉํด ํ ์คํธ๋ฅผ ์ค์ํ๊ณ ํ ์คํธ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์ํ
- ์คํจํ๋๋ชจ๋ ํญ๋ชฉ์ ๋ํด์ ๊ฒฐํจ๊ด๋ฆฌ๋ฅผ ์ํํด์ผ ํ๋ค
4. ํ ์คํธ ๊ฒฐ๊ณผ ๋ถ์
- ํ ์คํธ๊ฐ ๋๋๋ฉด ๊ณํ ๋๋น ๊ฒฐ๊ณผ๋ฅผ ๋น๊ต ๋ถ์ํ๊ณ ํ ์คํธ ๊ฒฐ๊ณผ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑ
- ์ ๋ ฅ : ํ ์คํธ ๊ณํ ๋จ๊ณ์ ๋ชฉํ ๊ฐ, ํ ์คํธ ํ๋์ํตํด ์ป์ ๊ฒฐ๊ณผ ๊ฐ
- ์ฒ๋ฆฌ : ํ ์คํธ ๊ฒฐ๊ณผ ๋ถ์, ๋ณด๊ณ ์ ์์ฑ
- ๊ฒฐ๊ณผ : ํ ์คํธ ์ผ์ด์ค๋ณ ๊ฒฐ๊ณผ ๋ถ์์, ์ํํธ์จ์ด ์ํ ๋ณด๊ณ ์, ํ ์คํธ ๊ฒฐ๊ณผ ๋ณด๊ณ ์
5. ์ค๋ฅ ์ถ์ ๋ฐ ์์
- ํ ์คํธ๊ฐ ๋๋๋ฉด ๊ณํ ๋๋น ๊ฒฐ๊ณผ๋ฅผ ๋น๊ต ๋ถ์ํ๊ณ ํ ์คํธ ๊ฒฐ๊ณผ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑ
- ์ ๋ ฅ : ํ ์คํธ ๊ฒฐ๊ณผ ๋ณด๊ณ ์, ํ ์คํธ ์ผ์ด์ค๋ณ ๊ฒฐ๊ณผ ๋ถ์์
- ์ฒ๋ฆฌ : ์ค๋ฅ ์์ ๊ณํ, ์ค๋ฅ ์์ , ์์ ๋ ๋ด์ฉ ๊ฒํ
- ๊ฒฐ๊ณผ : ์์ ๊ฒฐ๊ณผ ๋ณด๊ณ ์
# ํ ์คํธ ์๋ฆฌ
- ํ ์คํธ๋ ๊ฒฐํจ์ด ์กด์ฌํจ์ ๋ฐํ๋ ํ๋
- ์๋ฒฝํ ํ ์คํธ๋ ๋ถ๊ฐ๋ฅ(์ ์ ํ ์คํธ ๋ถ๊ฐ๋ฅ)
- ํ ์คํธ๋ ๊ฐ๋ฐ ์ด๊ธฐ์ ์์
- ๊ฒฐํจ ์ง์ค
- ์ด์ถฉ์ ํจ๋ฌ๋ ์ค
- ํ ์คํธ๋ ์ ํฉ(Context)์ ์์กด์
- ์ค๋ฅ ๋ถ์ฌ์ ๊ถค๋ณ
# ํ ์คํธํ๊ธฐ ์ข์ ์์ค์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ
- ๋ฉ์๋๋ ์ ์ ํ ํฌ๊ธฐ๋ก ์์ฑ
- LOC 80 ๋ผ์ธ ์ดํ
- ๋ฉ์๋๋ฅผ ๋๋ฌด ๋ณต์กํ์ง ์๊ฒ ์์ฑ
- ์ํ ๋ณต์ก๋ 10์ดํ / ์ธ์ง ๋ณต์ก๋ 2-3 ๊ถ์ฅ
- if(A)๋ 9๊ฐ๊น์ง. (์ด ์กฐ๊ฑด๋ฌธ์ CNN1)
- ์ฝ๋ ์์ ํ ๋ ๋ฉ์๋๋ฅผ ์๋ก ๋ง๋ค ์ ์๋ค๋ฉด, ์๋ก ๋ง๋ค๊ณ Call ํด์ฃผ์ธ์
- ๋จ์ ํ ์คํธ๋ ๋ฉ์๋๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค
- ๋จ์ผ ์ฑ
์ ์์น์ ์ง์ผ์ฃผ์ธ์
- ๋ฉ์๋๋ ํ๋์ ๊ธฐ๋ฅ๋ง ์ํํด์ผ ํฉ๋๋ค
- ๋ฉ์๋์ ์์กด์ ๋ฎ์ถฐ์ฃผ์ธ์
- ์์กด์ด ์๋ ๋ถ๋ถ๊ณผ ์๋ ๋ถ๋ถ์ผ๋ก ๋ฉ์๋๋ฅผ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
- Public, Protected ๋ฉ์๋๋ ๋ฆฌํด ํ์
์ ๋ช
์ํด์ฃผ์ธ์
- ๊ฐ ์ ๊ทผ ์ง์ ์์ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ์ฉํด์ฃผ์ธ์
- Private๋ ๋ฆฌํด ํ์ ์ ๋ช ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค
# ๊ฒฐํจ ๋ฐ์ ์์ธ
- Communication : 10๋ช ์ ์ฌ๋์ด ์์ผ๋ฉด 45๊ฐ์ Path๊ฐ ์๊น
- Short Term memory : ์ฌ๋์ด ๊ด๋ฆฌํ ์ ์๋ ๋ฒ์(7digit) / ์ฌ๋ฌ ๊ฐ์ง Interruption์ด ๋ฐ์
- Cognitive Dissonance : ์์ ์ ์ฐ์ถ๋ฌผ์์ ๊ฒฐํจ์ ์ฐพ๊ธฐ๊ฐ ํ๋ฆ
- Complexity of work : ์ค๊ณ๋ฌธ์์ ๋ณต์ก์ฑ์ผ๋ก Code ์์ฑ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ ๋ฐ์
- ์๋ฌด๋ฆฌ ๋ฅ์ํ ํ๋ก๊ทธ๋๋จธ๋ผ๋ ํ๊ท ์ ์ผ๋ก 35 Defs/KLoc๊ฐ ๋ฐ์ํจ...
# ์ ์ ํ ์คํธ ๋จ๊ณ์์ ์๋ณ ๊ฐ๋ฅํ ๊ฒฐํจ
- ์๊ตฌ์ฌํญ ๊ฒฐํจ : ๋ถ์ผ์น, ๋ชจํธ์ฑ, ๋ชจ์, ๋๋ฝ, ๋ถ์ ํฉ์ฑ, ์ค๋ณต ๋ฑ
- ์๋ชป๋ ์ธํฐํ์ด์ค ๋ช ์ธ : ๋งค๊ฐ๋ณ์์ ๊ฐ์, ์ ํ, ์์ ๋ถ์ผ์น ๋ฑ
- ์ค๊ณ ๊ฒฐํจ : ๋นํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ, ๋ชจ๋ํ ๋ถ๋ ๋ฑ
- ํน์ ์ ํ์ ๋ณด์ ์ทจ์ฝ์ฑ : ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋ฑ
- ํน์ ์ ํ์ ์ฝ๋ฉ ๊ฒฐํจ : ์ ์๋์ง ์๋ ๊ฐ์ ๊ฐ์ง ๋ณ์ ๋ฐํ ...๋ฑ
- ํ ์คํธ ๋ฒ ์ด์์ค ์ปค๋ฒ๋ฆฌ์ง์ ์ฐจ์ด ๋๋ ๋ถ์ ํ์ฑ : ์ธ์ ์กฐ๊ฑด ํ๋์ ๋ํ ํ ์คํธ ๋๋ฝ ๋ฑ
- ํ์ค ์๋ฐ์ฌํญ : ์ฝ๋ฉ ํ์ค ๋ช ๋ช ๊ท์น์ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ ๋ฑ
# ์ ์ ๋ถ์(Static Analysis)
- ์ค์ ์คํ ์์ด ์ปดํจํฐ ์ํํธ์จ์ด, ํนํ ์์ค์ฝ๋๋ฅผ ๋ถ์ํ๋ ๊ฒ
- ์ฌ์ฉ ๋ชฉ์
- ์์ค์ฝ๋์ ์ ์ฌ์ ์ธ ํ์ง ๋ฌธ์ (๋ฎ์ ํ์ง ๋ฐ๊ฒฌ)
- ๋คํธ์ํฌ ์ง์ ๋์, ๋์ ๋ณต์ก๋, ์ถ์ฒํ์ง ์๋ ํจํด๋ฑ
- ๋คํธ์ํฌ ์ง์ ๋์ ex) ๋คํธ์ํฌ ์์ผ์ open()๋ ์์ผ๋, ๋ช ์์ ์ธ close()๊ฐ ์๋ ๊ฒฝ์ฐ...
- ๊ฒฐํจ์ ์กฐ๊ธฐ ๋ฐ๊ฒฌ : ๋ฉ๋ชจ๋ฆฌ ๋ฆญ, ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋ฑ
- ์์ค์ฝ๋ ํ์ค ์ค์ ํ์ธ : ์ฝ๋ฉ ์ปจ๋ฒค์ (๋ช ๋ช ๊ท์น), ๋ณด์
- ์ค๊ณ ์์ ๋ฎ์ ํ์ง, ํ์ค ์๋ฐ ํ์ธ
- ์์ค์ฝ๋์ ์ ์ฌ์ ์ธ ํ์ง ๋ฌธ์ (๋ฎ์ ํ์ง ๋ฐ๊ฒฌ)
- ๋๊ตฌ๋ฅผ ์ด์ฉํ ์ ์ ๋ถ์
- ๋ฃฐ ๊ธฐ๋ฐ ์ ์ ๋ถ์(PMD, BugFind ๋ฑ)
- ์์กด์ฑ ๋ถ์
- ์ฝ๋ ๋ฉํธ๋ฆญ ์ธก์
- ์๋งจํฑ ๋ถ์(์คํ ์ค๋ฅ ๋ถ์)
- ์ ํ ๊ฒ์ฆ
- ์ฌ์ฉ ๋ชฉ์
# ์ํํธ์จ์ด ์ฝ๋ฉ ํ์ค(ํ์ค ์ฝ๋ฉ ๊ท์น)
- ์ฝ๋ฉ ๊ท์น(Coding Conventions)์ ํน์ ํ๋ก๊ทธ๋จ ์ธ์ด์ ๋ํ ๊ฐ์ด๋๋ผ์ธ ๋ชจ์(ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๊ณผ ๊ดํ์ ๊ถ๊ณ ) => Coding Standard
# PMD Rule Set
- ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๋ ์คํ์์ค ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ(๋ฃฐ ์ ๊ฐ์ ์ด 512๊ฐ)
- ์ง์ ์ธ์ด : Java, JavaScript, Python, C++, HTML, PLSQL, Apex, Swift, Kotlin, Scala, PHP ๋ฑ..
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html
# Eclipse์ pmd ์ค์น
# ์ ํ ํ์ง ๋ฉํธ๋ฆญ
- ๊ท๋ชจ ๊ด๋ จ
- ๋ผ์ธ ์(LOC : Line of Code)
- ์ฃผ์ ์ ์ธ ๋ผ์ธ ์(NLOC : Non-Comment Lines of Code)
- ์ฃผ์ ๋น์จ : 20% ์ด์
- ํจ์/ํ์ผ/ํจํค์ง ๋ณ ๋ผ์ธ์ (๋ฏธ๊ตญ๋ฐฉ๋ถ : 80 / NASA : 60 / ํญ์ค๋ฐ๊ฒ : 50)
- ๋ณต์ก๋ ๊ด๋ จ
- ์ํ ๋ณต์ก๋(Cyclomatic Complexity) : ํจ์์ ์ ์ด ํ๋ฆ์ด ์ผ๋ง๋ ๋ณต์กํ์ง ์ธก์ . ๋ถ๊ธฐ๋ฌธ + 1
- ์ธ์ง ๋ณต์ก๋(Cognitive Complexity) : ํจ์๊ฐ ์ผ๋ง๋ ์ค์ฒฉ๋ฌธ์ด ๋ง์์ง ์ธก์ , Nesting Depth๋ผ๊ณ ๋ ํํ
# ๋๋ฃ๊ฒํ
- ๋๋ฃ์๊ฒ ์์ ์ฝ๋๋ ์ฌ๋ฌ ๊ฐ์ง ์ฐ์ถ๋ฌผ์ ๋ํ ๊ฒํ ๋ฅผ ์๋ขฐํ์ฌ ์ค๋ฅ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
- ์ ํด์ง ํ์๋ ์๊ณ ๋ณ๋์ ๊ฒฉ์์ ์ฐจ๋ฆฐ ํ์๋ฅผ ์ํํ ํ์๊ฐ ์์ด ๋น๊ณต์ ๊ฒํ ์ ์ํจ
- ๋์ ํ ์คํธ์์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์ด ์ฐ์ถ๋ฌผ์์ ๋ฐ์ํ ์ ์๋ ๋๋ฝ๊ณผ ๊ฐ์ ๊ฒฐํจ์ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ ์ ์๋ ์ด์
- CMMI์์๋ ๊ฒฐํจ์ ๋ฐ๊ฒฌํ๊ธฐ ์ํด ํ๋ก์ ํธ๋ฅผ ํ๋ ๊ณผ์ ์์ ๋๋ฃ๊ฐ ๊ฒํตํ๋ ํ๋์ด๋ผ๊ณ ์ ์ํจ..
- ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ํตํด ๊ฒํ ๋ฅผ ์งํํด์ผ ํจ
- ์ฌ์ ์ค๋น : ๊ณต์ง, ๊ฒํ ์ ์ง์ , ๋ฐฐํฌ, ์ค๋น
- ๊ฒํ ํ์ : ๋ฌธ์ ์ ํด๊ฒฐ, ๋ณด๊ณ ์ ์์ฑ
- ํ์ ์กฐ์น : ์์ ์กฐ์น, ์กฐ์น ๋ณด๊ณ
# ํจ์จ์ ์ธ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ์์ฑ ๋ฐฉ๋ฒ
- ์ฒดํฌ๋ฆฌ์คํธ๋ ๊ฒฐํจ ๋ถ์์ ๊ธฐ์ดํด์ ์ ๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ๋์ด์ผ ํฉ๋๋ค
- ์ฒดํฌ๋ฆฌ์คํธ๋ ํ ํ์ด์ง๋ณด๋ค ๊ธธ์ง ์์์ผ ํฉ๋๋ค
- ์ฒดํฌ๋ฆฌ์คํธ ์์ดํ
์ ๋ช
๋ น๋ฌธ์ผ๋ก ์ฌ ํํ๋ ์ ์๋ ์ง๋ฌธ์ ํํ๋ก ํํํฉ๋๋ค
- ๋ฉ์๋ ๋ฆฌํด ๊ฐ์ ์ ์ ํ๊ฒ ๋ช ์ํ์๋๊ฐ?
- ์ฒดํฌ๋ฆฌ์คํธ ์์ดํ
์ ๋๋ฌด ์ผ๋ฐ์ ์ด์ง ์์์ผ ํฉ๋๋ค
- ์์ ํ๊ณ ์ผ๊ด์ฑ ์๊ณ ๋ช ๋ฐฑํ๊ฐ? (๋ชจํธํ๊ฒ ์์ฑํ์ง ์์์ผ ํจ)
# ์์ค์ฝฌ๋ ๋๋ฃ๊ฒํ ์ฃผ์ ์ฌํญ
- Review fewer than 200 ~ 400 lines of code at a time
- ํ๋ฒ์ 200 ~ 400 ๋ผ์ธ ์ด๋ด์ ๋จ์๋ก ๊ฒํ
- Aim for an inspection rate of less than 300 ~ 500 LOC/hour
- 1์๊ฐ์ 300 ~ 500 ๋ผ์ธ ๋ณด๋ค ์ ๊ฒ ๋ณธ๋ค๋ ๋๋์ผ๋ก ๊ฒํ / ๋๋ฌด ๋นจ๋ฆฌ ๊ฒํ ํ๋ ๊ฒ์ ์ ์ข์
- Authors should annotate source code before the review begins
- ๊ฒํ ๋ฅผ ์์ฒญํ๋ ๊ฐ๋ฐ์๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ด๋ค ๋ด์ฉ์ธ์ง ์ค๋ช ์ ํด์ฃผ๋ ๊ฒ์ด ์ข์
- Establish quantifiable goals for code review and capture metrics so you can imporve tour processes
- ๋ชฉ์ ์์์ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฌ์จ์ ํ์ฌ๋ณด๋ค 50% ์ค์ด๊ฒ ๋ค๋ ๋ฑ์ ๋ช ํํ ์์น๋ฅผ ์ค์ ํ๋ฉด ์ด๋ฅผ ์ํด ๋ ธ๋ ฅํ๊ฒ ๋ฉ๋๋ค.
- Managers must foster a good code review culture in which finding defects is viewed positively
- ๊ด๋ฆฌ์๋ค์ ๊ฒํ ํ๋์ด ์ ๋๊ณ ์๋์ง ๊ด์ฐฐํ๊ณ , ์ด๋ฅผ ์ฅ๋ คํ๋ ์กฐ์ง๋ฌธํ๋ฅผ ๋ง๋ค์ด ์ค์ผ ํฉ๋๋ค
- ๋๋ฃ ๊ฒํ ๋ฅผ ํ์ง ์๋๋ค๊ณ ํ๋๋ผ๋ ๋จ์ด ๋ณธ๋ค๊ณ ์๊ฐํ๊ณ ์์ฑํ๊ธฐ!
- Beware the "Big Brother" effect
- ๋๋ฃ๊ฐ ์์ ์ ์ฝ๋์ ์ค๋ฅ๋ฅผ ๋ง์ด ๋ฐ๊ฒฌํ๋ค๊ณ ํด์ ๋๋ฌด ๊ธฐ์ฃฝ์ง ๋ง์ธ์. ํ์ง์์ํ ํ๋์ ๊ณผ์ ์ด ๋ฟ์ด์ง ๋๊ตฌ๋ฅผ ๋ชจ์ํ๊ฑฐ๋ ๋นํํ๋ ์๋ฆฌ๊ฐ ์๋๋๋ค
# ์ธ์คํ ์ ์ ์ฃผ์ ํน์ง
- ์ ๋ฌธ๊ฐ๊ฒํ ์ด๋ฉฐ ๊ณต์์ ํ๊ฐ
- ์์๊ณผ ์ข ๋ฃ ์กฐ๊ฑด์ ๊ฐ๋ ์ฒดํฌ๋ฆฌ์คํธ์ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ๋ก์ธ์ค๊ฐ ์กด์ฌ
- ๊ฒํ ํ ์ฐ์ถ๋ฌผ์ ์์ฑ์๊ฐ ์๋ ํ๋ จ๋ ์งํ์์ ์ํ ์งํ
- ์ํํธ์จ์ด ๊ตฌ์ฑ ์์ ํน์ ์ฐ์ถ๋ฌผ๋ค์ ์ ํ์ฑ ํ๊ฐ
- ๊ฒฐํจ ๋ฐ๊ฒฌ์ด ์ฃผ์ ๋ชฉ์
- ์ํํธ์จ์ด๊ฐ ๋ช ์ธ๋ฅผ ๋ง์กฑํ๋์ง ๊ฒ์ฆ
- ์ํํธ์จ์ด๊ฐ ๋ช ์๋ ํ์ง ์์ฑ์ ๋ง์กฑํ๋์ง ๊ฒ์ฆ
- ์ํํธ์จ์ด๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ๊ท๊ฒฉ, ํ์ค, ๊ฐ์ด๋๋ผ์ธ, ๊ณํ ๋ฐ ํ๋ก์์ ์ ์ผ์นํ๋์ง ๊ฒ์ฆ
- ํ์ค์ด๋ ๊ท๊ฒฉ๊ณผ ์์ดํ ๋ถ๋ถ ์๋ณ
# ํ๊ท ํ ์คํธ(Regression Test)
- ์ ์ ๋์ํ๋ ๊ธฐ๋ฅ์ด SW ์์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ํ๊ท ๊ฒฐํจ์ ์ ๋ฌด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ด์ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ค์ ์คํํ๋ฉฐ ํ์ธํ๋ ํ
์คํธ
- SW ์์ ์ผ๋ก ์ธํ ๋ถ์ ์ ์ธ ์ํฅ ์ ๋ฌด๋ฅผ ํ์ธํ๊ธฐ ์ํ ํ ์คํธ
- ํ๊ท ๊ฒฐํจ์ ๋ฐ์์ํค๋ SW ์์ ์ ์ข
๋ฅ
- ์๋ก์ด ๊ฒฐํจ์ ์กฐ์น
- ๋ฆฌํฉํ ๋ง
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ/๋ณ๊ฒฝ
- ์น์ ํ์๋ ์๋์ง๋ง ๊ฒฐํจ์ ํ์ธ์ด ์ค์ํ ์๋ฒ ๋๋(์ฐจ๋)์ ๊ฒฝ์ฐ๋ ํ์์ ์..
# SW ๋์ ํ ์คํ ์ 4๋จ๊ณ
- ๋จ์(Unit) ํ ์คํ
- ํตํฉ(Integration) ํ ์คํ
- ์์คํ (System) ํ ์คํ
- ์ธ์(Acceptance) ํ ์คํ
# ๋จ์ ํ ์คํ (Unit Testiong) / ์ปดํฌ๋ํธ ํ ์คํ (Component Testing)
- ์ค๊ณ๋ ๋ชจ๋์ด ์ ํํ ๊ตฌํ๋์๋์ง ํ์ธํ๊ณ , ๋ชจ๋๊ณผ ๊ฐ์ ํ๋์ ์ํํธ์จ์ด ๊ตฌ์ฑ์์๋ ์ํํธ์จ์ด ๊ตฌ์ฑ์์์ ์งํฉ์ด ํ๋ก๊ทธ๋จ์ ์๊ตฌ์ฌํญ์ ๋ง๋์ง ํ์ธํ๋ ํ ์คํ
- ๋ชฉ์ : ๋ชจ๋์ด ์ฌ๋ฐ๋ก ์ฝ๋ฉ ๋์๋์ง ํ์ธ
- ์ํ์ฃผ์ฒด : ๊ฐ๋ฐ์
- ํ ์คํธ ๋์ : ๋ชจ๋ ์ํ๊ฐ๋ฅ(๋ธ๋๋ฐ์ค), ์ฝ๋ ๋ด๋ถํํ(ํ์ดํธ๋ฐ์ค), ๊ฒฝ๊ณ์กฐ๊ฑด
- ์๋ฃ์์ : ๊ฐ๋ฐ์๊ฐ ๋ ์ด์์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ํ๋จ๋ ๋
# ๋จ์ ํ ์คํธ ๊ฒฐํจ ์์ธ ํ์
- ๋จ์ ํ ์คํธ์์ ๊ฒฐํจ์ด ๋ฐ์ํ๋ค๋ฉด, ๊ทธ ์์ธ์ ํ ์คํธ ๋์ ๋ชจ๋์ ํ์ ํด์ผ ํจ
# ํตํฉ ํ ์คํ (Integration Testing)
- ์์คํ ์ ์ค๊ณ์ ์๊ตฌ์ฌํญ์ ๋ถํฉํ๋์ง ๋ณด์ด๊ธฐ ์ํด ์ํํธ์จ์ด ๊ตฌ์ฑ์์, ํ๋์จ์ด ๊ตฌ์ฑ์์ ๋ฑ์ด ์ ์ฐจ ํตํฉ๋์ด ์ ์ฒด ์์คํ ์ผ๋ก ํตํฉ๋ ๋๊น์ง ์ด๋ฃจ์ด์ง๋ ์ ์ฐจ์ ์ธ ํ ์คํ
# ์ํํธ์จ์ด ํตํฉ ์ ๋ต๊ณผ ์ฐ๊ณ
- SW ํตํฉ ์ ๋ต
- ๋น
๋ฑ
(Big Bang) ๊ธฐ๋ฒ
- ๋ชจ๋์ ํ๊บผ๋ฒ์ ํตํฉํ์ฌ ํ ์คํ ์ ํ๋ ๋ฐฉ๋ฒ
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๊ฒฝ์ฐ ์ด๋ ๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ๋ฌ๋์ง ์ฐพ๊ธฐ๊ฐ ํ๋ฆ
- ํํฅ์(Top-Down) ๊ธฐ๋ฒ
- ๊ฐ์ฅ ์์ ๋ชจ๋๋ถํฐ ํ์ ๋ชจ๋๋ก ์ ์ง์ ์ผ๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ
- ์์ ๋ชจ๋ ํ ์คํ ์, ํ์ ๋ชจ๋์ ๋ํ ์คํ ์ด ํ์
- ์ํฅ์(Bottom-Up) ๊ธฐ๋ฒ
- ํ์ ๋ชจ๋๋ถํฐ ํ ์คํ ํ๊ณ ์์ ๋ชจ๋๋ก ์ ์ง์ ์ผ๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ
- ํ์ ๋ชจ๋ ํ ์คํ
- ์ง์์ ํตํฉ ๋ฐฉ๋ฒ(Continuous Integration)
- SW ํตํฉ ์ค๋ฅ๋ฅผ ๊ฐ๋ฐ์ด๊ธฐ๋ถํฐ ์๋ฐฉํ๋ ๊ฒ
- ๋น
๋ฑ
(Big Bang) ๊ธฐ๋ฒ
# ์์คํ ํ ์คํ (System Testing)
- ๋ชจ๋์ด ๋ชจ๋ ํตํฉ๋ ํ, ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ์ด ๋ง์กฑ๋์๋์ง ๊ฒ์ฌํ๋ ํ ์คํ
- ๊ณ ๊ฐ์๊ฒ ์์คํ ์ ์ ๋ฌํ๊ธฐ ์ , ์์คํ ์ ๊ฐ๋ฐํ ์กฐ์ง์ด ์ฃผ์ฒด๊ฐ ๋๋ ๋ง์ง๋ง ํ ์คํ
- ํ
์คํ
๋์
- ์๊ตฌ์ฌํญ ๋ช ์ธ์๋ฅผ ๊ธฐ์ด๋ก ํ์ฌ ์ฌ์ฉ์์ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
- ๋ณด์, ์ฑ๋ฅ, ์ ๋ขฐ์ฑ, UX ๋ฑ์ ๋น ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
- ๊ธฐ๋ฅ ์์ ์๊ตฌ์ฌํญ
# ์ธ์ ํ ์คํ (Acceptance Testing)
- ์์คํ ์ด ์ฌ์ฉ์์๊ฒ ์ธ์๋๊ธฐ ์ , ์ฌ์ฉ์์ ์ํด ์ค์๋๋ ํ ์คํ
- ์ค์ ์ฌ์ฉ์๊ฐ ์ด์ํ๋ ํ๊ฒฝ์์ ์ค์
- ์ธ์ ํ ์คํ ์ ํต๊ณผํด์ผ๋ง ์์คํ ์ด ์ ์์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ธ์๋๊ณ ํ๋ก์ ํธ๋ ์ข ๋ฃ๋จ
# ๋์ SW ํ ์คํธ ์ค๊ณ ๊ธฐ๋ฒ์ ์ข ๋ฅ (+ ๊ฒฝํ ๊ธฐ๋ฐ Test)
- ๋ช
์ธ ๊ธฐ๋ฐ ํ
์คํธ(Black-Box)
- ์์ค ์ฝ๋ ์์ฒด์ ๋ก์ง(Logic)์ ์ ์ธํ๊ณ , ์ถ๋ ฅ ๊ฐ์๋ง ์ด์ ์ ๋๊ณ ํ ์คํ ํ๋ ๋ฐฉ๋ฒ
- ์๊ตฌ์ฌํญ ๋ช
์ธ์(SRS)๋ ์ค๊ณ์๋ก๋ถํฐ ํ
์คํธ ์ผ์ด์ค ์ถ์ถ
- ๋ธ๋๋ฐ์ค ํ ์คํธ
- ๋ชจ๋์ ์ธ๋ถ(์ ๋ ฅ, ์ถ๋ ฅ)
- ๊ตฌ์กฐ ๊ธฐ๋ฐ ํ
์คํธ(White-Box)
- ์์ค ์ฝ๋ ๋ด์ ๋ชจ๋ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ํํ์ฌ ๋ด์ผ๋ก์จ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ
- ๋ด๋ถ๊ตฌ์กฐ(์์ค ์ฝ๋, ์๊ณ ๋ฆฌ์ฆ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ
์คํธ ์ผ์ด์ค ์ถ์ถ -> ์ฃผ๋ก ๋จ์ํ
์คํธ์์ ์ฐ์
- ํ์ดํธ ๋ฐ์ค ํ ์คํธ
- ๋ชจ๋์ ๋ด๋ถ(๋ก์ง)
# ๋ธ๋๋ฐ์ค(Black Box) ํ ์คํ ๊ฐ์
- ์์ค ์ฝ๋ ์์ฒด์ ๋ก์ง์ ์ ์ธํ๊ณ , ์ถ๋ ฅ ๊ฐ์๋ง ์ด์ ์ ๋๊ณ ํ ์คํ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๊ตฌ์ฌํญ ๋ช ์ธ์๋ ์ค๊ณ์๋ก๋ถํฐ ํ ์คํธ ์ผ์ด์ค ์ถ์ถ
- ํ
์คํ
์ข
๋ฅ
- ๊ตฌ๋ฌธ ํ ์คํ (Syntax Testing) : ์ ๋ ฅ ๊ฐ์ ์ ํฉ๊ณผ ๋ถ์ ํฉ ์กฐ๊ฑด์ผ๋ก ๋ถ๋ฅํ ๋ค, ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ์ฌ ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํ
- ํ์ด์์ด์ฆ(Pairwise) : ํ ์คํธ๋ฅผ ํ๋๋ฐ ํ์ํ ๊ฐ ์ ๋ ฅ ๊ฐ๋ค์ด ๋ค๋ฅธ ์ ๋ ฅ๊ฐ๊ณผ ์ต์ํ ํ๋ฒ์ฉ ์กฐํฉ์ ์ด๋ฃจ๊ฒ ํ์ฌ ํ ์คํธ ํ๋ ๋ฐฉ๋ฒ / ํ์ด : ์ ๋ ฅ๊ฐ์ ๊ฐ ์์ ๊ฐ๋ณ ์กฐํฉ
- ๋๋ฑ ๋ถํ (Equivalence Partitioning) : ์ ๋ ฅ ๊ฐ์ ๋ฒ์๊ฐ ์ ํด์ ธ ์์ ๊ฒฝ์ฐ, ๊ฐ ๋ฒ์์ ๋ํฏ๊ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ์ฌ ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํ
- ๊ฒฝ๊ณ ๊ฐ ๋ถ์(Boundary Value Analysis) : ์ ๋ ฅ ๊ฐ์ ์ฃผ์ ์ค๋ฅ ๋์์ธ ๊ฒฝ๊ณ ๊ฐ์ ์ ๋ ฅ ๊ฐ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ์ฌ ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํ
- ์์ฌ๊ฒฐ์ ํ ์ด๋ธ(Devision Table) : ์ /์ถ๋ ฅ๊ฐ์ด True, False๋ก ๊ฒฐ์ ๋ ์ ์๋ ๊ฒฝ์ฐ, ์ /์ถ๋ ฅ๊ฐ์ ๋ชจ๋ ๋ ผ๋ฆฌ์ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํด๋ณผ ์ ์๋ ๋ฐฉ๋ฒ
# ํ์ด์์ด์ฆ ๋๊ตฌ ์ค์ต
https://github.com/microsoft/pict/releases/tag/v3.7.4
- ํ์ด์์ด์ฆ๋ cmd ์ฐฝ์์ ์คํ!!(๋ฐ์ดํฐ๊ฐ ๋ฝ์์ ธ ๋์จ๋ค)
- ์ผ๋จ ์ผ์ด์ค์ ๊ฒฝ์ฐ๋ฅผ txt ํ์ผ์ ์ ์ด์ค
pict ํ์ผ๋ช > ๋ง๋ค๊ณ ์ถ์ ํ์ผ๋ช .xls => ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ ๋ก ๊ฐ์ ธ๊ฐ์ค!!
# ํ์ดํธ๋ฐ์ค(White Box) ํ ์คํ ๊ฐ์
- ์์ค ์ฝ๋ ๋ด ๋ชจ๋ ๋
๋ฆฝ์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ํํ์ฌ ๋ด์ผ๋ก์จ ๊ฒฐํจ์ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋๋ก๋ถํฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ถ์ถ
# ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง(Coverage)
- ํ ์คํธ ์ผ์ด์ค ์ํ ์ ํ ํธ ๋์์ ๋ช %๋ ์คํํ๋์ง ์๋ ค์ฃผ๋ ์งํ
- ์๊ตฌ์ฌํญ์ปค๋ฒ๋ฆฌ์ง
- ํ
์คํธ ์ผ์ด์ค๊ฐ ์๊ตฌ์ฌํญ์ ์ผ๋ง๋งํผ ์คํํ๋์ง ์ธก์
- ex) ์ ์ฒด 30๊ฐ ์๊ตฌ์ฌํญ ์ค, 50% ์๊ตฌ์ฌํญ์ํ ์คํธ ์ํ
- ๋ธ๋๋ฐ์ค ํ ์คํธ ๊ธฐ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉ
- ํ
์คํธ ์ผ์ด์ค๊ฐ ์๊ตฌ์ฌํญ์ ์ผ๋ง๋งํผ ์คํํ๋์ง ์ธก์
- ์์ค์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
- ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ค์ฝ๋๋ฅผ ์ผ๋ง๋งํผ ์คํํ๋์ง ์ธก์
- ์1) ๋ฌธ์ฅ ์ปค๋ฒ๋ฆฌ์ง : ์์ค์ฝ๋ ์ ์ฒด ๋ฌธ์ฅ์ 40% ๋ฌธ์ฅ์ ํ ์คํธ ์ํ
- ์2) ๊ฒฐ์ ์ปค๋ฒ๋ฆฌ์ง : ์์ค์ฝ๋ ์ ์ฒด if ๋ฌธ์ 60%์ ์ฐธ/๊ฑฐ์ง(๊ฒฐ์ )์ ํ ์คํธ ์ํ
- ํ์ดํธ๋ฐ์ค ํ ์คํธ ๊ธฐ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉ
- ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ค์ฝ๋๋ฅผ ์ผ๋ง๋งํผ ์คํํ๋์ง ์ธก์
# ํ์ดํธ๋ฐ์ค ํ ์คํ ์ข ๋ฅ
- ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง(Basis Path Coverage)
- ํ๋ก๊ทธ๋จ ์ ์ด๊ตฌ์กฐ๋ฅผ Flow Graph๋ก ํํํ๊ณ , ์ํ ๋ณต์ก๋(Cyclomatic Complexity)๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ์๋ฅผ ์ฐพ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ ์ ํ์ฌ ์ํํ๋ ํ ์คํ
- ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง ์ํ ํ๋ก์ธ์ค
- 1. Flow Graph ์์ฑ
- 2, ์ํ ๋ณต์ก๋ ๊ณ์ฐ
- 3. ๋ ๋ฆฝ ๊ฒฝ๋ก ์ ์
- 4. ํ ์คํธ ์ผ์ด์ค ์์ฑ
- ์ ๋ ฅ์์ ์ถ๋ ฅ์ ์ด๋ฅด๊ธฐ๊น์ง์ ํ๋ก๊ทธ๋จ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ํ๋ก์ฐ ๊ทธ๋ํ๋ก ํํ
- ํจ์ ์ปค๋ฒ๋ฆฌ์ง(Function Coverage)
- ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ํจ์๋ค์ ํ ์คํ ์ ๋๋ฅผ ๋ํ๋ด๋ฉฐ ๊ฐ์ฅ ๋ฎ์ ์์ค์ ์ปค๋ฒ๋ฆฌ์ง์ด๋ฏ๋ก ๋จ์ ํ ์คํ ์ ํตํด 100% ๋ฌ์ฑ์ด ํ์ํจ
- ์น์์๋ ๊ฑฐ์ ์ธ ์ผ์ด ์์.. ํจ์๋ฅผ ๋ถ๋ฌ์ค๋๊ฑฐ์ง ๊ทธ ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ง๋ ์๊ธฐ ๋๋ฌธ์
- ์๋ฒ ๋๋์์ ๋ชจ๋ ๋ชจ๋์ ๋ค ํธ์ถํ๋์ง, ํตํฉํ๋์ง ํ์ธํ๊ธฐ ์ํด์ ์ฌ์ฉํจ
- ๋ฌธ์ฅ ์ปค๋ฒ๋ฆฌ์ง(Line Coverage)
- ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋ฌธ์ฅ๋ค์ด ์ต์ํ ํ๋ฒ์ ์คํ๋ ์ ์๋ ์ ๋ ฅ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ ์ ํ์ฌ ์ํํ๋ ํ ์ค
- ๋ฌธ์ฅ ์ปค๋ฒ๋ฆฌ์ง์ ๋จ์
- ์์ค์ฝ๋์ ๋ก์ง(Logic)์ ์ํฅ์ ๋ฏธ์น๋ ์กฐ๊ฑด๋ฌธ์ ํ ์คํธํ์ง ๋ชปํจ
- ์กฐ๊ฑด๋ฌธ ์์ฒด์ ๊ฒฐ์ (Decision์ด True/False ์ธ ๊ฒฝ์ฐ -> ๊ฒฐ์ (Decision) ์ปค๋ฒ๋ฆฌ์ง ์ ์ฉ
- ์กฐ๊ฑด๋ฌธ์ ๊ฐ ์กฐ๊ฑด(Condition)์ด True/False ์ธ ๊ฒฝ์ฐ -> ์กฐ๊ฑด(Condition) ์ปค๋ฒ๋ฆฌ์ง ์ ์ฉ
- ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง(Branch Coverage)
- ๋ถ๊ธฐ๋ฌธ ์ ์ฒด๊ฐ ์ฐธ ํ ๋ฒ, ๊ฑฐ์ง ํ ๋ฒ์ ๊ฐ๋๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ ํ์ฌ ์ํํ๋ ํ ์คํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฐ์ (Decision) ์ปค๋ฒ๋ฆฌ์ง๋ผ๊ณ ๋ ํจ
# Junit ์๊ฐ์ ๊ธฐ๋ณธ ํ ์คํธ ๊ตฌ์กฐ
- ์๋ฆญ ๊ฐ๋ง์ ์ผํธ๋ฐฑ์ด ํ์์์ผ ํ์ฌ ์ ์ธ๊ณ์ ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ Java ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ
- ๊ธฐ๋ณธ ํ
์คํธ๊ตฌ์กฐ : assertEquals() ์ฌ์ฉ ์์
- assertEquals(Expected, Actual) : Expected(Object)์ Actual(Object)์ ๊ฐ์ฒด ํ์
๋ฐ ๊ฐ์ด ๋์ผํ์ง ํ์ธํ์ฌ ๊ฐ์ผ๋ฉด ํ
์คํธ๊ฐ ์ฑ๊ณตํจ
- assertEquals(Expected, Actual) : Expected(Object)์ Actual(Object)์ ๊ฐ์ฒด ํ์
๋ฐ ๊ฐ์ด ๋์ผํ์ง ํ์ธํ์ฌ ๊ฐ์ผ๋ฉด ํ
์คํธ๊ฐ ์ฑ๊ณตํจ
# ๋จ์ํ ์คํธ(๋ฉ์๋ ๋จ์) ์ํ ๋ฐฉ๋ฒ ์์ฝ
- ํ
์คํธ ๋จ์
- public ๋ฉ์๋, API ๋ฉ์๋ ๋ฑ๋ฉ์๋ ๋จ์
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ฉ์๋์์ ์์
- ํ
์คํธ ๋ฐฉ๋ฒ
- JUnit์ ํ์ฉํ ํ ์คํธ ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ํน์ ๋ฉ์๋์ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํจ์ ํ์ธ
- ํ
์คํธ ์ ์ฐจ
- ๊ธฐ๋ฅ ๊ตฌํ -> ํ ์คํธ ์ผ์ด์ค ์์ฑ -< ๋จ์ํ ์คํธ ์์ -> ์ปค๋ฒ๋ฆฌ์ง ์ธก์ -> ๋ฆฌํฌํธ ์ถ๋ ฅ
- ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ํ ์คํธ๋ฅผ ๋ณํํ๋ฉฐ ์ ์ง์ ๊ฐ๋ฐ ์ํ
- ํ์์ ์ปค๋ฒ๋ฆฌ์ง ์ธก์ ํ ํ ์คํธ๊ฐ ๋ฏธํกํ ์ฝ๋์ ๋ํด์๋ ํ ์คํธ ๋ณด์ ๊ฐ๋ฅ
# JUnit5 ์ค์ต
package com.calc;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class CalculatorTest {
Calculator calculator = new Calculator();
@Test
void testAdd() {
// assertEquals(๊ธฐ๋๊ฒฐ๊ณผ, add());
assertEquals(6, calculator.add(4, 2));
// System.out.println(assertEquals(6, calculator.add(4, 2)));
}
@Test
void testMinus() {
assertEquals(2, calculator.minus(4, 2));
}
@Test
void testMulti() {
assertEquals(8, calculator.multi(4, 2));
}
@Test
void testDivide() throws Exception {
assertEquals(2, calculator.divide(4, 2));
assertThrows(Exception.class, () ->
calculator.divide(4, 0), "Divide Error"
);
}
@Test
void testCalculate() throws Exception {
assertEquals(6, calculator.calculate("+", 4, 2));
assertEquals(2, calculator.calculate("-", 4, 2));
assertEquals(8, calculator.calculate("*", 4, 2));
assertEquals(2, calculator.calculate("/", 4, 2));
// assertEquals(0.5, calculator.calculate("/", 2, 4));
}
// ํ
์คํธ ์ผ์ด์ค๋ ๋
๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ํ๋๋ก ๋ชจ๋์ ๊ฐ๋ฐํด์ผํ๋๋ฐ.. ํ๋์ ๋ชฉ์ ์ ๊ฐ์ง๋๊ฒ ์ข์์ ์ ์์ ์ผ๋ก ์ํ๋์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋นผ์ฃผ๋ ๊ฒ์ ๋์ฑ ์ถ์ฒ!
@Test
void testUnsupportedOperator() {
assertThrows(Exception.class, () ->
calculator.calculate("%", 4, 2), "Unsupported Operator"
);
}
/**
@Test
void testParseInput() {
fail("Not yet implemented");
}
@Test
void testMain() {
fail("Not yet implemented");
}
**/
}
# ํ ์คํธ ์คํ ๊ฑธ์ฐจ
# ๊ฒฐํจ ๊ด๋ฆฌ ๊ธฐ๋ฒ
- ๊ฒฐํจ ๊ฐ์(Reduction) : ์ฃผ์ ๋ ๊ฒฐํจ์ ๊ฐ๋ฅํ ๋ง์ด ๋ฐ๊ฒฌํ๊ณ ์ ๊ฑฐํจ
- ๊ฒฐํฉ ๋ด์(Containment) : ๊ฒฐํจ์ด ๋ฐ๊ฒฌ๋์ง ์๊ณ ๊ทธ ๊ฒฐํจ์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๊ทธ๊ฒ์ด ์คํจ๋ก ์ด์ด์ง์ง ์๊ฒ ํจ
- ๊ฒฐํจ ์๋ฐฉ(Prevention) : ๊ฒฐํจ์ ์์ธกํ๊ณ ๊ทธ ์์ธ์ ํ์ ํ์ฌ ๋ฐฉ์ง ๋ฐ ํด๊ฒฐํจ
- ๊ฒฐํจ ์๋ฐฉ ํ๋์ด ์ ๋๋ก ์ด๋ฃจ์ด ์ง๋ค๋ฉด? => ๊ฒฐํจ ๊ฐ์์ ๋ด์์ ๋ค์ด๋ ๋ ธ๋ ฅ๊ณผ ๋น์ฉ ๊ฐ์ ๊ฐ๋ฅ
# ์ํํธ์จ์ด ๊ฒฐํจ์ ํน์ง
- ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ธ๋ ฅ ์ ์ฝ์ ์์
์ผ๋ก ์ํํธ์จ์ด ๊ฒฐํจ์ ๋๋ถ๋ถ์๊ฐ๋ฐ์์ ํด๋จผ ์๋ฌ๋ก ์ธํด ๋ฐ์
- ๊ตฌํ ๋จ๊ณ์ ๊ฒฐํจ๋ ํด๋จผ ์๋ฌ๋ก ์ธํด ๋ฐ์
- ํด๋จผ ์๋ฌ ์๋ฐฉ์ ํตํด ๊ตฌํ ๋จ๊ณ ๊ฒฐํจ์ ์์กด์ ๋ฐฉ์งํ ํ์๊ฐ ์์
- ๊ฒฐํจ ๊ด๋ฆฌ ๋จ๊ณ์์ ์ถฉ๋ถํ ๋ฐ์ดํฐ๋ฅผ ์์งํด์ผ ํจ!!
# ๊ฒฐํจ ์๋ฐฉ์ ์ํ ๋ฐ์ดํฐ ์์ง
- ๊ฒฐํจ ์ ํ
- ๊ฒฐํจ ๋ฐ๊ฒฌ์ ์ ์ฅ์์ ๊ฒฐํจ์ ๋ชจ์ต : ํ ์คํธ ๋จ๊ณ๋ง๋ค ๊ฒฐํจ ์ ํ์ด ๋ฌ๋ผ์ง ์ ์์
- ๊ฒฐํจ ์์ธ
- ๊ฒฐํจ ์ ๊ฑฐ์(๊ฐ๋ฐ์) ์ ์ฅ์์ ๊ฒฐํจ ์์ธ : ํ ์คํธ ๋จ๊ณ ๊ฒฐํจ ์ ํ์ด ๋ฌ๋ผ์ง ์ ์์
- ๊ฒฐํจ ์ ์
๋จ๊ณ
- ๊ฒฐํจ์ด ํฌํจ๋ ๋จ๊ณ
- ๊ฒฐํจ ๋ฐ๊ฒฌ ๋จ๊ณ
- ํ ์คํธ/๋ฆฌ๋ทฐ ๋จ๊ณ
- ๊ธฐํ
- OS, ํ ์คํธ ํ๊ฒฝ, ํ ์คํธ ID
# ๊ฒฐํจ์ ์ถ์
- ๊ฐ๋ฐ์๋ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐ ํ ํ ์คํฐ์๊ฒ ์ ๋ฌ
- ํ ์คํฐ๋ ํ ์คํธ ๊ณํ, ๋ถ์ ๋ฐ ์ค๊ณ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ์คํ
- ํ ์คํธ ์ผ์ด์ค ์คํ ์ค ๊ฒฐํจ์ ๊ฒ์ถํ๊ณ ๊ฒ์ถ๋ ๊ฒฐํจ์ ๊ฐ๋ฐ์์๊ฒ ์ ๋ฌ ๋ฐ ์์ ์์ฒญ
- ๊ฐ๋ฐ์๋ ๊ฒฐํจ์ ์์ ํ๊ณ ๋ค์ ํ ์คํฐ์๊ฒ ์ ๋ฌ
# ๊ฒฐํจ ์ฒ๋ฆฌ ์ ํ
- Fixed : ์์ฒญ๋ ๊ฒฐํจ์ ์์ ์๋ฃํ ๊ฒฝ์ฐ
- Duplicated : ๊ธฐ์กด์ ๋ค๋ฅธ ๊ฒฐํจ๊ณผ ์ค๋ณต๋๋ ๊ฒฝ์ฐ
- Won't fix : ์์ ์ด ํ์ํ ์ ๋๋ก ์ค์ํ๊ฑฐ๋ ๊ธด๊ธํ ๊ฒ์ด ์๋๋ผ ์์ ํ์ง ์๋ ๊ฒฝ์ฐ
- Invalid : ํ ์คํธ ์ผ์ด์ค์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ