ํด๋น ๊ธ์ ์กฐ์ํธ๋์ ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด ์ญํ , ์ฑ ์, ํ๋ ฅ, ๊ด์ ์์ ๋ณธ ๊ฐ์ฒด์งํฅ ๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด ์์ ํ์ธํด์ฃผ์ธ์.
๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด - ์ญํ , ์ฑ ์, ํ๋ ฅ ๊ด์ ์์ ๋ณธ ๊ฐ์ฒด์งํฅ (์กฐ์ํธ)
- ์ํค๋ถ์ค
- ์ง์์ด: ์กฐ์ํธ
- ํด๋ธ์ด: ๋ฐ์ฐฌ๊ท, ์ฎ์์ด: ์ด๋์ฝ, ๋์์ธ: ๋ถ๋๋ฆฌ
- 1์ ๋ฐํ: 2015.06.17
์ด๋ฒ ์ฅ์์ ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ ๊ฒ
- ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์งํฅ์ ์์
- ๊ฐ์ฒด์งํฅ์ด๋ ์ค์ธ๊ณ๋ฅผ ์ง์ ์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์๋ ํจ๋ฌ๋ค์
- ๊ฐ์ฒด์งํฅ์ ์ค์ธ๊ณ๋ฅผ ๋ชจ๋ฐฉ
- ์ด๋ฌํ ์์์ ์ถ์์ , ์ฒ ํ์ ์ผ๋ก๋ ๋ถํฉํ์ง๋ง, ๊ฐ์ฒด์งํฅ์ ๋ถ์, ์ค๊ณํ ๋๋ ๊ฑฐ๋ฆฌ๊ฐ์ด ์์
- ๊ฐ์ฒด์งํฅ์ ์ค์ธ๊ณ๋ฅผ ๋ชจ๋ฐฉํ๋ ๊ฒ์ด ์๋๋ผ ์๋กญ๊ฒ ์ฐฝ์กฐํ๋ ๊ฒ
- ์คํ๋ ค ์ ํฉ์ฐ ์ฌ๊ณ ๋ ๊ฐ์ฒด์งํฅ์ ์๋ฌต์ ์ธ ์ฝ์๊ณผ ํ์ฝ, ๊ณ์ฝ์ ๊ธฐ๋ฐ์ผ๋กํ ํ๋ ฅ์ผ๋ก ๋ชฉ์ ์ ๋ฌ์ฑํ๋ ๊ณผ์ ์ด๋ผ๊ณ ํจ
- ์ฐ๋ฆฌ์ ์ธ๊ณ๋ ๋๋ถ๋ถ ๊ฐ์ธ ํผ์๋ง์ ํ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ถ๋ถ์ด ์ ์
- ๋ชจ๋ ํ๋ ฅ์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค ํ๋ฏ๋ก ์ด ๊ด์ ์์ ๊ฐ์ฒด๋ฅผ ๋ณด๋ ๊ฒ์ด ๋ ์ค์ธ๊ณ์ ์ฐ๊ด์ง๊ธฐ ์ฌ์
- ์์ฒญ๊ณผ ์๋ต์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ ฅ
- ์์ฒญ : ํ์ํ ๊ฒ์ ์ป๊ธฐ ์ํด ๋ค๋ฅธ ์ ๋ฌธ๊ฐ(๊ฐ์ฒด) ์๊ฒ ๋์์ ์์ฒญ
- ์๋ต : ์์ฒญ์ ๋ฐ์ ์ ๋ฌธ๊ฐ(๊ฐ์ฒด)๊ฐ ์ฃผ์ด์ง ์ฑ
์์ ๋ค ํ์ฌ ์์ฒญ์๊ฐ ์ํ๋ ๊ฒ์ ๋ฐํ
- ์ด๋ค์ ์ฐ์์ ์ผ๋ก ์์ฉํ๊ฒ ๋จ
- ์์ฒญ์ ์์ฒญ -> ์์ฒญ -> ์์ฒญ ์๋ต์
- ์์ฒญ์ ์๋ต <- ์๋ต <- ์๋ต ์๋ต์
- ํ๋ ฅ : ์ด๋ฌํ ์์ฒญ๊ณผ ์๋ต์ ๊ณผ์ ์ ํตํ ์ผ๋ จ์ ํ์
- ์ญํ ๊ณผ ์ฑ
์
- ์ญํ : ์ฌ๋๋ค๊ณผ ํ๋ ฅํ๋ ๊ณผ์ ์์์ ํน์ ํ ์ญํ ์ ๋ถ์ฌ๋ฐ์
- ์๋ฅผ ๋ค์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ ๊ณ ๊ฐ์ ๋์ ์ง๋ถํ๋ ์ญํ ๊ณผ ์ฑ ์
- ์ปคํผ๋ฅผ ๋ง๋๋ ๋ฐ๋ฆฌ์คํ๋ ๊ณ ๊ฐ์ ์์ฒญ์ ๋ถํฉํ๋ ์ปคํผ๋ฅผ ์ ์ํ๋ ์ญํ ๊ณผ ์ฑ ์
- ์ฑ ์ : ์ญํ ์ด ์๋ฏธ์ ์ผ๋ก ๋ดํฌํ๋ ๋ป์ผ๋ก, ํน์ ํ ์ญํ ์ ํน์ ํ ์ฑ ์์ ์ํํ๊ฒ ๋จ
- ์ญํ ๊ณผ ์ฑ
์์ ์ค์ํ ๊ฐ๋
- ์ฌ๋ฌ ์ฌ๋์ด ๋์ผํ ์ญํ ์ ์ํํ ์ ์์
- ์ญํ ์ ๋์ฒด ๊ฐ๋ฅํจ
- ์ฑ ์์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์์จ์ ์ผ๋ก ์ ํํ ์ ์์
- ํ ์ฌ๋์ด ์ฌ๋ฌ ์ญํ ์ ๋์ด์ ์ํํ ์ ์์
- ์ญํ : ์ฌ๋๋ค๊ณผ ํ๋ ฅํ๋ ๊ณผ์ ์์์ ํน์ ํ ์ญํ ์ ๋ถ์ฌ๋ฐ์
- ์ญํ , ์ฑ
์, ํ๋ ฅ
- ์ด๋ฌํ ์ญํ ๊ณผ ์ฑ ์, ํ๋ ฅ์ ๊ฒฐ๊ตญ ํ๋์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํ ์ผ๋ จ์ ๊ณผ์
- ํ๋์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด์๋ ์์ฒญ๊ณผ ์๋ต ๊ทธ๋ฆฌ๊ณ ํ๋ ฅ์ด ์ ์ด์ฐ๋ฌ์ ธ์ผ ํจ
์ด๋ ํ ๊ฐ์ฒด๋ ์ฌ์ด ์๋๋ค - Kent Beck
- ํ๋์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๊ทน์ ์ผ๋ก ํ๋ ฅํด์ผ ํจ
- ์ญํ ์ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ์ค๊ณ ์์
- ํ๋ ฅ ์์ ์ฌ๋ ๊ฐ์ฒด
- ๊ฐ์ฒด์งํฅ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ์์ ๊ฐ์กฐํ ํํ , ์ฑ ์, ํ๋ ฅ์ด์ง๋ง ์ค์ ๋ก ์ด๋ฅผ ์ํํ๋ ํ์๋ ๊ฐ์ฒด์
- ์ด๋ฌํ ๊ฐ์ฒด์ ๋ ๊ฐ์ง ์ค์ํ ๋๋ชฉ
- ๊ฐ์ฒด๋ ์ถฉ๋ถํ ํ๋ ฅ์ ์ผ ๊ฒ
- ๊ฐ์ฒด๋ ์ถฉ๋ถํ ์์จ์ ์ผ ๊ฒ
- ๊ฐ์ฒด๋ ์ค์ค๋ก๊ฐ ๋ชจ๋ ์ผ์ ์ํํ๋ ค ํด์๋ ์๋๊ณ , ์ํธ ํ๋ ฅ์ด ์ด๋ฃจ์ด์ ธ์ผ ํจ
- ๊ทธ๋ ์ง ์๋ค๋ฉด ์คํ๊ฒํฐ์ฒ๋ผ ๊ผฌ์ธ ๋ด๋ถ ๋ณต์ก์ฑ์ ์ํด ์ค์ค๋ก ์๋ฉธํ๊ฒ ๋จ.
- ๊ฐ์ฒด๋ ์๊ธฐ ์ค์ค๋ก์ ์์น์ ๋ฐ๋ผ์ ์ค์ค๋ก๋ฅผ ํต์ ํ๊ณ ์ ์ ํ ์ ์์ด์ผ ํจ.
- ์ด ์์น์ ๋ง์กฑํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๊ทธ ์ฌ๋ฌผ์ ์์จ์ ์ธ ์กด์ฌ๋ผ๊ณ ํจ.
- ๊ฐ์ฒด๋ ์ํ์ ํ๋์ ํจ๊ป์ง๋ ์์จ์ ์ธ ์กด์ฌ
- ๊ฐ์ฒด : ์ํ(State) + ํ๋(Behavior)
- ๊ฐ์ฒด๊ฐ ์ด๋ค ์ผ์ ์ํํ ๋๋ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํ ์ํ์ ํ๋์ ์ง๋ ์ผ ํจ
- ๊ฐ์ฒด์ ์์จ์ฑ์ ๊ฐ์ฒด ๋ด๋ถ์ ์ธ๋ถ๋ฅผ ๋ช
ํํ ๊ตฌ๋ถํ๋ ๊ฒ์ผ๋ก ๋ถํฐ ์ถ๋ฐ
- ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ฌด์(what)์ ์ํํ๋์ง ์์์ผ ํจ
- ๋์์ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ(How) ์ํํ๋์ง๋ ๋ชฐ๋ผ์ผ ํจ
- ๊ฐ์ฒด : ์ํ(State) + ํ๋(Behavior)
- ํ๋ ฅ๊ณผ ๋ฉ์์ง
- ๊ฐ์ฒด๋ ํน์ ์์ฒญ์ ํ๋ ฅ์ ํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ๋ฉ์์ง๋ฅผ ํตํด ์ฃผ๊ณ ๋ฐ์
- ๋ฉ์์ง๋ ์์ฒญ์ด ์์ ์ ์๊ณ ์๋ต์ด ์์ ์ ์์
- ๊ฒฐ๊ตญ ํ๋ ฅ์ ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ๊ฐ ๋จ
- ์ก์ ์ : ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด
- ์์ ์ : ๋ฉ์์ง๋ฅผ ์์ ์ฌํ ๊ฐ์ฒด
- ๋ฉ์๋์ ์์จ์ฑ
- ๋ฉ์๋ : ๊ฐ์ฒด๊ฐ ์์ ๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ธ๋ถ์ ์์ฒญ์ด ๋ฌด์์ธ์ง ํํํ๋ ๋ฉ์์ง์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ธ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ํต์ฌ
- ์ด๋ ์บก์ํ์ ์ฐ๊ด๋จ
- ๊ฐ์ฒด๋ฅผ ์งํฅํ๋ผ
- ๊ฐ์ฒด์งํฅ์ ์ด์ผ๊ธฐํ ๋ ๋ณดํต ํด๋์ค์ ์ด์ ์ด ๋ง์ถฐ์ง
- ํ์ง๋ง ๊ฐ์ฒด์งํฅ์ ํด๋์ค์ ์ด์ ์ ๋ง์ถ๊ฒ ์๋ ํ๋ ฅ๊ณผ ๊ด๊ณ์ ์ด์ ์ ๋ง์ถฐ์ผ ํจ
- ํด๋์ค๋ ๋จ์ง ๊ฐ์ฒด์งํฅ์ ํํํ๋ ๋๊ตฌ์ผ ๋ฟ
๊ฐ์ฒด์งํฅ์ ํต์ฌ์ ์ ์ ํ ์ฑ ์์ ์ํํ๋ ์ญํ ๊ฐ์ ์ ์ฐํ๊ณ ๊ฒฌ๊ณ ํ ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ
๋์ ํด์๊ณผ ํ๊ณ
๊ฐ์ฒด์งํฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋ผ๋ณด๋ ๊ฒ์ ์์์ผ๋ก ์กฐ์ํธ๋์ ์ฌ๋ฌ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค.
๋ํ๊ต 2ํ๋
๋ ์ฒ์์ผ๋ก ์๋ฐ๋ฅผ ๋ฐฐ์ฐ๊ณ 2๋
์ด ์ง๋ ์ง๊ธ ์์ ์์ ๋๋ ๊ฐ์ฒด์งํฅ์ ์ด๋์ ๋ ๋ง๋ณด์๊ณ ๋ฌด์์ด ๊ฐ์ฒด์งํฅ์ธ์ง ์๊ณ ์๋ค๋ ์๊ฐ์ ํ์ง๋ง, ๋ด ์๋ฑ์ ๋๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ์๋ค.
์ฐ์ ๊ฐ์ฒด๋ ํด๋์ค๊ฐ ์๋๋ผ ์ฑ ์๊ณผ ์ญํ , ํ๋ ฅ์ด๋ผ๋ ๊ฒ ๋ถํฐ์ ์์๋์๋ค.
๋๋ ์ง๊ธ๊น์ง ํด๋์ค ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ณ ์์๋ ๊ฒ์ด์๊ณ , ๊ฐ์ฒด ์งํฅ์ ํ๋ ๊ฒ์ด ์๋์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์๋ฅผ ๋ค์ด DB์ ์ ๊ทผํด ๊ธ์ ์์ ํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค๊ณ ํด๋ณด์.
public void updatePosting(Long postNumber) {
// DB ๊ฐ์ฒด ์์ฑ
DBConnection connection = new DBConnection();
// DB ์ ์ฐ๊ฒฐ
connection.connectToDatabase();
// ๋ด ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
Posting posting = connection.getPostById(postNumber);
// ๊ฒ์๊ธ ์์
String newTitle = "์์ ํ ๊ธ ์ ๋ชฉ";
String newContent = "์์ ํ ๊ธ ๋ณธ๋ฌธ";
posting.setTitle(newTitle);
posting.setContent(newContent);
// db ์ ์ ์ฅ
connection.save(posting);
}
๋๋ ์ง๋ 2๋ ๋์ ์ด ์ฝ๋๊ฐ ์ถฉ๋ถํ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋์ธ์ค ์๊ณ ์์๋ค.
์? DBConnection
ํด๋์ค, Posting
ํด๋์ค๋ฅผ ์ด์ฉํ๋๊น.
ํด๋์ค๋ ๊ณง ๊ฐ์ฒด์งํฅ์ ํต์ฌ์ด๋๊น! ๋ผ๊ณ ์๋ชป๋ ์๊ฐ์ ํ์๋ค.
ํ์ง๋ง ์ด๊ฑด ๊ฐ์ฒด์งํฅ์ ์ธ์ด๋ก ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ๊ณผ ๋ค๋ฅผ ๊ฒ์ด ์์๋ค.
์ด์ ๋ Posting
๊ฐ์ฒด์๋ ์๋ฌด๋ฐ ํ๋ ฅ์ ํ์ง ์๊ณ updatePosting()
๋ฉ์๋ ๋ด๋ถ์์ ๋ชจ๋ ๊ฒ์ ์ํํ๋ ค ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋๋ Posting
๊ฐ์ฒด์๊ฒ ์์จ์ฑ์ ์ฃผ๋ คํ์ง ์์๊ณ , ํ๋ ฅ์ ์๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฑ 1์ฅ๋ง ์ฝ์ ์์ ์์ ๋ด๊ฐ ์์ ์ฝ๋๋ฅผ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ฐ๊พธ๋ ค ํ๋ค๋ฉด ์ฌ์ค ์ ํ์ง๊ฐ ๋ง์ด ์๋ค.
์๋ ๊ฒ๋ ์์ง ๋ง์ด ์์ง๋ง ์ง๊ธ ๊น์ง์ ์ฌ๋ฌ ๊ฐ๋ฅด์นจ์ ์ฃผ์ ์กฐ์ํธ๋์ ์ด์ผ๊ธฐ๋ฅผ ๋์๊น ํด๋ณด๋ฉฐ ๋ค์ ๊ตฌ์ฑํ์๋ฉด ์๋ง ์ด๋ฐ ํํ๊ฐ ๋์ง ์์๊น ์ถ๋ค.
public void updatePosting(Long postNumber) {
// DB ๊ฐ์ฒด ์์ฑ
DBConnection connection = new DBConnection();
// DB ์ ์ฐ๊ฒฐ
connection.connectToDatabase();
// ๋ด ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
Posting posting = connection.getPostById(postNumber);
// ๊ฒ์๊ธ ์์
posting.updateTitleAndContent(newTitle, newContent);
// db ์ ์ ์ฅ
connection.save(posting);
}
์ด๋ ๊ฒ ๋๋ค๋ฉด Posting
๊ฐ์ฒด๋ฅผ ์กฐ๊ธ ๋ ์กด์คํ๋ ๊ฒ ๊ฐ๋ค.
updatePosting
๋ฉ์๋์์ ์ง์ ์กฐ์ํ๋ค๋ ๊ฒ์ Posting
๊ฐ์ฒด์ ์์จ์ฑ์ ๋นผ์๋ ๊ฒ์ด๊ณ , Posting
๊ฐ์ฒด๋ ํ๋ ฅ์ด ์๋ ์ผ๋ฐฉ์ ์ธ ๊ด๊ณ์ ์ํ ํ์กฐ๊ฐ ๋๋ค.
๊ทธ๋์ Posting
๊ฐ์ฒด์๊ฑฐ title ๊ณผ content๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ด๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
๋๊ธ