# ์ํคํ
์ฒ(Architecture)
- ๊ฑด๋ฌผ์ ๋ผ๋๋ฟ ์๋๋ผ ํน์ฑ์ ๊ฒฐ์ ์ง๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ผ์ปซ๋ ๋ง(๋ชจ๋ ๊ธฐ์ ๋ถ์ผ์ ์ ์ฉํ ์ ์๊ณ ์ข
๋ฅ๋ ๋ค์ํจ)
- ๋ํ ํ๋ก์ ํธ๊ฐ ๋ณต์ก์ฑ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
๊ฐ๋ฐํ ์ํํธ์จ์ด์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์๊ฐ
์ํํธ์จ์ด์ ๊ตฌ์กฐ๋ฅผ์ด๋ฃจ๋๊ฐ ๊ตฌ์ฑ์์๋ฅผ ์ฐพ์
๊ฐ ๊ตฌ์ฑ์์ ๊ฐ์ ๋ช
ํํ ๊ด๊ณ๋ฅผ ์ค์
์ผ์ ํ ๊ท์น์ ๋ฐ๋ฆ
- ์ํํธ์จ์ด ์ํคํ
์ฒ : ์์ ์์ค์์ ์ํํธ์จ์ด ๊ตฌ์ฑ์์๋ค ๊ฐ์ ๊ด๊ณ๋ก ๊ตฌ์ฑ๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ํ๋...
# ์ํํธ์จ์ด ์ํคํ
์ฒ์ ์ญํ
์ฌ๋ฌ ์ดํด๊ด๊ณ์ ๊ฐ์ ๊ณตํต์ ์์ฌ์ํต ์๋จ(์ด๋์ ๋์ what๊ณผ how๊ฐ ๋ค ๋ด๊ฒจ์ ธ ์๋ค! ๊ณ ๊ฐ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๊ฐ๊ณ ์๋์ง..)
์์คํ
ํ์ง ์์ฑ์ ์ฌ์ฉ๋๋ ์ต์ ๊ธฐ์ค (์ํํธ์จ์ด ํ์ง ์์ฑ 8๊ฐ์ง๋ฅผ ์ฌ์ฉํด์ ์ํคํ
์ฒ๊ฐ ์ด๋ค ์ ๋์ ์์ค์ธ์ง, ์ ์ง๋ณด์ & ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค๋๋ก ํจ..)
๋ณ๊ฒฝ์ ๋ํ ์์ธ ํ์
๋ฐ ์ ์ฐํ ๋์ฒ๊ฐ ๊ฐ๋ฅ
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์ ํ๋ณด ์๋จ
# ์ํคํ
์ฒ ์ค๊ณ ์ ๊ณ ๋ ค ์ฌํญ
๋ชจ๋ ์ดํด๊ด๊ณ์ ์ฌ์ด์ ์์ฌ์ํต ๋๊ตฌ๋ก ํ์ฉํ ์ ์์ด์ผ ํจ
๊ตฌํ์ ๋ํ ์ ์ฝ ์ฌํญ(๊ฐ๋ฐ ๋น์ฉ, ๊ธฐ๊ฐ, ์กฐ์ง์ ์ญ๋ ๋ฑ)์ ์ ์ํด์ผ ํจ
๋ชจ๋ ์ดํด๊ด๊ณ์์ ํ์ง์๊ตฌ์ฌํญ์ ๋ฐ์ํด ์ฐ์ ์์์ ๋ฐ๋ผ ์์คํ
ํ์ง ์์ฑ์๊ฒฐ์ ํด์ผ ํจ (์ฑ๋ฅ ์ฌ์ฉ์ฑ, ๋ณด์์ฑ, ์์ ์ฑ, ๊ฒ์ฆ ๊ฐ๋ฅ์ฑ, ๋ณ๊ฒฝ ์ฉ์ด์ฑ ๋ฑ)
ํน์ ๋ฌธ์ ์์ญ์ ์ ํฉํ ์ํํธ์จ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ํ์คํํ๊ณ ํจํดํํด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณํด์ผ ํจ
ISO/IEC 25010์ ํ์ง ์์ฑ ์์
# ์ํคํ
์ฒ ํ์ง ์์ฑ : ์์คํ
ํ์ง ์์ฑ
๊ฐ์ฉ์ฑ(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 ๋ชจ๋ธ
- ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ก ํญํฌ์ ๋ชจ๋ธ์ ํ์ฅ๋ ํํ ์ค ํ๋๋ก, ๊ฐ๋ฐ ์๋ช
์ฃผ๊ธฐ์ ๊ฐ ๋จ๊ณ์ ๊ทธ์ ์์ํ๋ ์ํํธ์จ์ด ์ํ ๊ฐ ๋จ๊ณ์ ๊ด๊ณ๋ฅผ ๋ํ๋
์ธ์ ํ
์คํ
: Validation / ์์คํ
, ํตํฉ, ๋จ์ : Verification
# ์ํํธ์จ์ด ํ
์คํธ
- ์ ์ ์กฐ๊ฑด ๋ฐ ๋น์ ์ ์กฐ๊ทผ(์ฆ, ๊ฒฐํจ/๋ฒ๊ทธ) ์ฌ์ด์ ์ฐจ์ด์ ์ ๋ฐ๊ฒฌํ๊ธฐ ์ํ์ฌ ์ํํธ์จ์ด ํญ๋ชฉ์ ๋ถ์ํ๊ณ , ๋ถ์๋ ํญ๋ชฉ์ ํน์ฑ์ ํ๊ฐํ๋ ํ๋ก์ธ์ค
=> ๊ฒฐํจ์ ๋ฐ๊ฒฌ์ ๋ชฉ์ ์ผ๋ก ์ํํธ์จ์ด๋ฅผ ๋ถ์ํ๋ ํ๋
# 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๋ฑ)
์์กด์ฑ ๋ถ์
์ฝ๋ ๋ฉํธ๋ฆญ ์ธก์
๋์ (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)์ ์์กด์
์ค๋ฅ ๋ถ์ฌ์ ๊ถค๋ณ
# ํ
์คํธํ๊ธฐ ์ข์ ์์ค์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ
๋ฉ์๋๋ ์ ์ ํ ํฌ๊ธฐ๋ก ์์ฑ
๋ฉ์๋๋ฅผ ๋๋ฌด ๋ณต์กํ์ง ์๊ฒ ์์ฑ
์ํ ๋ณต์ก๋ 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
javadoc
One use page for each package (package-use.html) and a separate use page for each class and interface (class-use/classname.html). The use page describes what packages, classes, methods, constructors and fields use any part of the specified class, interface
docs.oracle.com
# Eclipse์ pmd ์ค์น
[help] -> [marketplace]์์ pmd๋ก๊ณ ์๋๊ฑธ๋ก ์ค์นํ๊ธฐ!
pmd ๊ฒ์ฌ
pmd ๊ฒ์ฌ ํ์ธ๊ธฐ๋ก ๋จ๊ธฐ๊ธฐ
pmd ์์ ์ฝ๋ ์ถ์ฒ(์ถ์ฒ ์ฝ๋๋ฅผ ๊ตณ์ด ์ธ ํ์ x
# ์ ํ ํ์ง ๋ฉํธ๋ฆญ
๊ท๋ชจ ๊ด๋ จ
๋ผ์ธ ์(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 ํตํฉ ์ค๋ฅ๋ฅผ ๊ฐ๋ฐ์ด๊ธฐ๋ถํฐ ์๋ฐฉํ๋ ๊ฒ
# ์์คํ
ํ
์คํ
(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
Release Version 3.7.4 · microsoft/pict
What's Changed Adding building using CMake by @bhardwajs in #81 Enable -pedantic on *nix by @bhardwajs in #82 Enable warnings as error and W4 on MSVC by @bhardwajs in #83 Enable warnings as error ...
github.com
- ํ์ด์์ด์ฆ๋ cmd ์ฐฝ์์ ์คํ!!(๋ฐ์ดํฐ๊ฐ ๋ฝ์์ ธ ๋์จ๋ค)
- ์ผ๋จ ์ผ์ด์ค์ ๊ฒฝ์ฐ๋ฅผ txt ํ์ผ์ ์ ์ด์ค
? ๋์ค๋๊ฑฐ๋ ์ธ์ฝ๋ฉ UTF-8 -> ANSI๋ก ๋ฐ๊พธ๋ฉด ํด๊ฒฐ๋๋ค!!
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)์ ๊ฐ์ฒด ํ์
๋ฐ ๊ฐ์ด ๋์ผํ์ง ํ์ธํ์ฌ ๊ฐ์ผ๋ฉด ํ
์คํธ๊ฐ ์ฑ๊ณตํจ
# ๋จ์ํ
์คํธ(๋ฉ์๋ ๋จ์) ์ํ ๋ฐฉ๋ฒ ์์ฝ
ํ
์คํธ ๋จ์
public ๋ฉ์๋, API ๋ฉ์๋ ๋ฑ๋ฉ์๋ ๋จ์
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ฉ์๋์์ ์์
ํ
์คํธ ๋ฐฉ๋ฒ
JUnit์ ํ์ฉํ ํ
์คํธ ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ํน์ ๋ฉ์๋์ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํจ์ ํ์ธ
ํ
์คํธ ์ ์ฐจ
๊ธฐ๋ฅ ๊ตฌํ -> ํ
์คํธ ์ผ์ด์ค ์์ฑ -< ๋จ์ํ
์คํธ ์์ -> ์ปค๋ฒ๋ฆฌ์ง ์ธก์ -> ๋ฆฌํฌํธ ์ถ๋ ฅ
๊ธฐ๋ฅ ๊ตฌํ๊ณผ ํ
์คํธ๋ฅผ ๋ณํํ๋ฉฐ ์ ์ง์ ๊ฐ๋ฐ ์ํ
ํ์์ ์ปค๋ฒ๋ฆฌ์ง ์ธก์ ํ ํ
์คํธ๊ฐ ๋ฏธํกํ ์ฝ๋์ ๋ํด์๋ ํ
์คํธ ๋ณด์ ๊ฐ๋ฅ
# JUnit5 ์ค์ต
JUnit์ด ์๋ค๋ฉด ์ถ๊ฐ๋จผ์ ํด์ฃผ๊ธฐ
์์์ ๋ง๋ค์ด์ค!
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 : ํ
์คํธ ์ผ์ด์ค์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ