๐ ๋ชฉ์ฐจ.
13. ๋์์ฑ
.๋์์ฑ์ด ํ์ํ ์ด์ ?
.๋๊ด
.๋์์ฑ ๋ฐฉ์ด ์์น
.๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๋ผ.
.์คํ ๋ชจ๋ธ์ ์ดํดํ๋ผ.
.๋๊ธฐํํ๋ ๋ถ๋ถ์ ์๊ฒ ๋ง๋ค์ด๋ผ
.์ฌ๋ฐ๋ฅธ ์ข ๋ฃ ์ฝ๋๋ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค.
.์ค๋ ๋ ์ฝ๋ ํ ์คํธํ๊ธฐ
.๊ฒฐ๋ก
โ๏ธ ๋ด์ฉ.
13. ๋์์ฑ
๊ฐ์ฒด๋ ์ฒ๋ฆฌ์ ์ถ์ํ๋ค. ์ค๋ ๋๋ ์ผ์ ์ ์ถ์ํ๋ค.
- ์ ์์ค O. ์ฝํ๋ฆฌ์
๋์์ฑ๊ณผ ๊น๋ํ ์ฝ๋๋ ์๋ฆฝํ๊ธฐ ์์ฃผ ์ด๋ ต๋ค.
์ด ์ฅ์์๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ๋๋ฆฌ๋ ์ด์ ๋ฅผ ๋ ผํ๋ค. ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ๋๋ฆฌ๋ ์ด๋ ค์๋ ๋ ผํ๋ฉฐ ์ด๋ฐ ์ด๋ ค์์์ ์ด๋ป๊ฒ ๊นจ๋ํ ์ฝ๋๋ฅผ ์์ฑํ๋์ง ๋ฐฉ๋ฒ๋ ์ ์ํ๋ค.
๋ง์ง๋ง์ผ๋ก, ๋์์ฑ์ ํ ์คํธํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฌธ์ ์ ์ ๋ ผํ๋ค.
.๋์์ฑ์ด ํ์ํ ์ด์ ?
๋์์ฑ์ ๊ฒฐํฉ์ ์์ ๋ ์ ๋ต์ด๋ค. ์ฆ, ๋ฌด์๊ณผ ์ธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ ์ ๋ต์ด๋ค.
๋จ์ผ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ๋ฌด์๊ณผ ์ธ์ ๊ฐ ์๋ก ๋ฐ์ ํ๋ค. ํธ์ถ ์คํ์ ์ดํด๋ณด๋ฉด ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ๊ณง๋ฐ๋ก ์ ์ ์๋ค.
๋ฌด์๊ณผ ์ธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ์ ํจ์จ์ด ๊ทน์ ์ผ๋ก ๋์์ง๋ค. ๊ตฌ์กฐ์ ๊ด์ ์์ ํ๋ก๊ทธ๋จ์ ๊ฑฐ๋ํ ๋ฃจํ ํ๋๊ฐ ์๋๋ผ ์์ ํ๋ ฅ ํ๋ก๊ทธ๋จ ์ฌ๋ฟ์ผ๋ก ๋ณด์ธ๋ค. ๋ฐ๋ผ์ ์์คํ ์ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ฝ๋ค.
์๋ก. ์น ์ ํ๋ฆฌ์ผ์ด์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ '์๋ธ๋ฆฟ(Servlet)' ๋ชจ๋ธ์ ์ดํด๋ณด์.
์๋ธ๋ฆฟ์ ์น ํน์ EJB ์ปจํ ์ด๋๋ผ๋ ์ฐ์ฐ ์๋์ ๋์๊ฐ๋๋ฐ, ์ด๋ค ์ปจํ ์ด๋๋ ๋์์ฑ์ ๋ถ๋ถ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค. ์น ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์น ์๋ฒ๋ ๋น๋๊ธฐ์์ผ๋ก ์๋ธ๋ฆฟ์ ์คํํ๋ค. ์๋ธ๋ฆฟ ํ๋ก๊ทธ๋๋จธ๋ ๋ค์ด์ค๋ ๋ชจ๋ ์น ์์ฒญ์ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. ์์น ์ ์ผ๋ก ๊ฐ ์๋ธ๋ฆฟ ์ค๋ ๋๋ ๋ค๋ฅธ ์๋ธ๋ฆฟ ์ค๋ ๋์ ๋ฌด๊ดํ๊ฒ ์์ ๋ง์ ์ธ์์์ ๋์๊ฐ๋ค.
- ๋ฏธ์ ๊ณผ ์คํด
๋์์ฑ๊ณผ ๊ด๋ จํ ์ผ๋ฐ์ ์ธ ๋ฏธ์ ๊ณผ ์คํด
- ๋์์ฑ์ ํญ์ ์ฑ๋ฅ์ ๋์ฌ์ค๋ค.
๋์์ฑ์ ๋๋ก ์ฑ๋ฅ์ ๋์ฌ์ค๋ค. ๋๊ธฐ ์๊ฐ์ด ์์ฃผ ๊ธธ์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ํ๋ก์ธ์๋ฅผ ๊ณต์ ํ ์ ์๊ฑฐ๋, ์ฌ๋ฌ ํ๋ก์ธ์๊ฐ ๋์์ ์ฒ๋ฆฌํ ๋ ๋ฆฝ์ ์ธ ๊ณ์ฐ์ด ์ถฉ๋ถํ ๋ง์ ๊ฒฝ์ฐ์๋ง ์ฑ๋ฅ์ด ๋์์ง๋ค. ์ด๋ ์ชฝ๋ ์ผ์์ ์ผ๋ก ๋ฐ์ํ๋ ์ํฉ์ ์๋๋ค.
- ๋์์ฑ์ ๊ตฌํํด๋ ์ค๊ณ๋ ๋ณํ์ง ์๋๋ค.
๋จ์ผ ์ค๋ ๋ ์์คํ ๊ณผ ๋ค์ค ์ค๋ ๋ ์์คํ ์ ์ค๊ณ๊ฐ ํ์ดํ๊ฒ ๋ค๋ฅด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์๊ณผ ์ธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์์คํ ๊ตฌ์กฐ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
- ์น ๋๋ EJB ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋์์ฑ์ ์ดํดํ ํ์๊ฐ ์๋ค.
์ค์ ๋ก๋ ์ปจํ ์ด๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง, ์ด๋ป๊ฒ ๋์ ์์ , ๋ฐ๋๋ฝ ๋ฑ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋์ง๋ฅผ ์์์ผ๋ง ํ๋ค.
๋์์ฑ๊ณผ ๊ด๋ จํ ํ๋นํ ์๊ฐ
- ๋์์ฑ์ ๋ค์ ๋ถํ๋ฅผ ์ ๋ฐํ๋ค.
์ฑ๋ฅ ์ธก๋ฉด์์ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ฉฐ, ์ฝ๋๋ ๋ ์ง์ผํ๋ค.
- ๋์์ฑ์ ๋ณต์กํ๋ค.
๊ฐ๋จํ ๋ฌธ์ ๋ผ๋ ๋์์ฑ์ ๋ณต์กํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋์์ฑ ๋ฒ๊ทธ๋ ์ฌํํ๊ธฐ ์ด๋ ต๋ค.
๋ฐ๋ผ์ ์ง์ง ๊ฒฐํจ์ผ๋ก ๊ฐ์ฃผ๋์ง ์๊ณ ์ผํ์ฑ ๋ฌธ์ ๋ก ์ฌ๊ฒจ ๋ฌด์ํ๊ธฐ ์ฝ๋ค.
- ๋์์ฑ์ ๊ตฌํํ๋ ค๋ฉด ํํ ๊ทผ๋ณธ์ ์ธ ์ค๊ณ ์ ๋ต์ ์ฌ๊ณ ํด์ผ ํ๋ค.
.๋๊ด
๋์์ฑ์ ๊ตฌํํ๊ธฐ ์ด๋ ค์ด ์ด์ .
public class X {
private int lastIdUsed;
public int getNextId() {
return ++lastIdUsed;
}
}
์ธ์คํด์ค X ์์ฑ ํ, lastIdUsed ํ๋๋ฅผ 42๋ก ์ค์ ํ ๋ค์, ๋ ์ค๋ ๋๊ฐ ํด๋น ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๋ค.
์ด์ ๋ ์ค๋ ๋๊ฐ getNextId();๋ฅผ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๊ฒฐ๊ณผ๋ ์๋ ์ ์ค ํ๋์ด๋ค.
1. ํ ์ค๋ ๋๋ 43์ ๋ฐ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ 44๋ฅผ ๋ฐ๋๋ค. lastIdUsed๋ 44๊ฐ ๋๋ค.
2. ํ ์ค๋ ๋๋ 44๋ฅผ ๋ฐ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ 43์ ๋ฐ๋๋ค. lastIdUsed๋ 44๊ฐ ๋๋ค.
3. ํ ์ค๋ ๋๋ 43์ ๋ฐ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ 43๋ฅผ ๋ฐ๋๋ค. lastIdUsed๋ 43์ด ๋๋ค.
๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ณ์๋ฅผ ๋์์ ์ฐธ์กฐํ๋ฉด ์ธ ๋ฒ์งธ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฌํ ์๋ชป๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ธฐ ์ํด์๋ JIT ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์์๋ก ๊ฐ์ฃผํ๋ ์ต์ ๋จ์๋ฅผ ์์์ผ ํ๋ค.
.๋์์ฑ ๋ฐฉ์ด ์์น
- ๋จ์ผ ์ฑ ์ ์์น(SRP)
๋์ ์ฑ์ ๋ณต์ก์ฑ ํ๋๋ง์ผ๋ก๋ ๋ฐ๋ก ๋ถ๋ฆฌํ ์ด์ ๊ฐ ์ถฉ๋ถํ๋ค. ์ฆ, ๋์์ฑ ๊ด๋ จ ์ฝ๋๋ ๋ค๋ฅธ ์ฝ๋์ ๋ถ๋ฆฌํด์ผ ํ๋ค.
๋์์ฑ ๊ตฌํ ์ ๊ณ ๋ ค์ฌํญ
1. ๋์์ฑ ์ฝ๋๋ ๋ ์์ ์ธ ๊ฐ๋ฐ, ๋ณ๊ฒฝ, ์กฐ์จ ์ฃผ๊ธฐ๊ฐ ์๋ค.
2. ๋์์ฑ ์ฝ๋์๋ ๋ ์์ ์ธ ๋๊ด์ด ์๋ค.
3. ์๋ชป ๊ตฌํํ ๋์์ฑ ์ฝ๋๋ ๋ณ์๋ณ ๋ฐฉ์์ผ๋ก ์คํจํ๋ค.
- ๋ฐ๋ฆ ์ ๋ฆฌ : ์๋ฃ ๋ฒ์๋ฅผ ์ ํํ๋ผ.
์๋ฃ๋ฅผ ์บก์ํํ๋ผ, ๊ณต์ ์๋ฃ๋ฅผ ์ต๋ํ ์ค์ฌ๋ผ
๊ณต์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ๋ด ์๊ณ ์์ญ์ synchronized ํค์๋๋ก ๋ณดํธํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ด๋ฐ ์๊ณ ์์ญ ์๋ฅผ ์ค์ด๋ ๊ธฐ์ ์ด ์ค์ํ๋ค. ๊ณต์ ์๋ฃ๋ฅผ ์์ ํ๋ ์์น๊ฐ ๋ง์์๋ก ๋ค์ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋ค.
1. ๋ณดํธํ ์๊ณ ์์ญ์ ๋นผ๋จน๋๋ค.
2. ๋ชจ๋ ์๊ณ์์ญ์ ์ฌ๋ฐ๋ก ๋ณดํธํ๋์ง(DRY ์๋ฐ) ํ์ธํ๋๋ผ ๋๊ฐ์ ๋ ธ๋ ฅ๊ณผ ์๊ณ ๋ฅผ ๋ฐ๋ณตํ๋ค.
3. ์ ๊ทธ๋๋ ์ฐพ์๋ด๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๊ฐ ๋์ฑ ์ฐพ๊ธฐ ์ด๋ ค์์ง๋ค.
- ๋ฐ๋ฆ ์ ๋ฆฌ : ์๋ฃ ์ฌ๋ณธ์ ์ฌ์ฉํ๋ผ.
๊ณต์ ์๋ฃ๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ ์ฒ์๋ถํฐ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ด ์ ์ผ ์ข๋ค. ์ด๋ค ๊ฒฝ์ฐ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ฐ ์ค๋ ๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด ์ฌ์ฉํ ํ ํ ์ค๋ ๋๊ฐ ํด๋น ์ฌ๋ณธ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ฆ ์ ๋ฆฌ : ์ค๋ ๋๋ ๊ฐ๋ฅํ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ๋ผ
๋ ์์ ์ธ ์ค๋ ๋๋ก, ๊ฐ๋ฅํ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์์์, ๋๋ ค๋ ๊ด์ฐฎ๋๋ก ์๋ฃ๋ฅผ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก ๋ถํ ํ๋ผ.
๋ค๋ฅธ ์ค๋ ๋์ ์๋ฃ๋ฅผ ๊ณต์ ํ์ง ์๋ ์ค๋ ๋๋ฅผ ๊ตฌํํ๋ค. ๊ฐ ์ค๋ ๋๋ ํด๋ผ์ด์ธํธ ์์ฒญ ํ๋๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ชจ๋ ์ ๋ณด๋ ๋น๊ณต์ ์ถ์ฒ์์ ๊ฐ์ ธ์ค๋ฉฐ ๋ก์ปฌ ๋ณ์์ ์ ์ฅํ๋ค.
.๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๋ผ.
๊ฐ๊ฐ Java Version์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๋ค.
ex. java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks
.์คํ ๋ชจ๋ธ์ ์ดํดํ๋ผ.
๊ธฐ๋ณธ ์ฉ์ด
ํ์ ๋ ์์ (Bound Resource) | ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ์์์ผ๋ก, ํฌ๊ธฐ๋ ์ซ์๊ฐ ์ ํ์ . DB ์ฐ๊ฒฐ, ๊ธธ์ด๊ฐ ์ผ์ ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฒํผ ๋ฑ |
์ํธ ๋ฐฐ์ (Mutual Exclustion) | ํ ๋ฒ์ ํ ์ค๋ ๋๋ง ๊ณต์ ์๋ฃ๋ ๊ณต์ ์์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ |
๊ธฐ์ (Starvation) | ํ ์ค๋ ๋๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ต์ฅํ ์ค๋ซ๋์ ํน์ ์์ํ ์์์ ๊ธฐ๋ค๋ฆฐ๋ค. ์๋ก. ํญ์ ์งง์ ์ค๋ ๋์๊ฒ ์ฐ์ ์์๋ฅผ ์ค ๊ฒฝ์ฐ, ์งง์ ์ค๋ ๋๊ฐ ์ง์์ ์ผ๋ก ์ด์ด์ง๋ฉด, ๊ธด ์ค๋ ๋๊ฐ ๊ธฐ์ ์ํ์ ๋น ์ง๋ค. |
๋ฐ๋๋ฝ (Deadlock) | ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์๋ก ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ๊ธฐ ํ์ํ ์์์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ์ ํ๋ ๋ฐ๋์ ์ด๋ ์ชฝ๋ ๋ ์ด์ ์งํํ์ง ๋ชปํ๋ค. |
๋ผ์ด๋ธ๋ฝ (Livelock) | ๋ฝ์ ๊ฑฐ๋ ๋จ๊ณ์์ ๊ฐ ์ค๋ ๋๊ฐ ์๋ก๋ฅผ ๋ฐฉํดํ๋ค. ์ค๋ ๋๋ ๊ณ์ํด์ ์งํํ๋ ค ํ์ง๋ง, ๊ณต๋ช (resonance)์ผ๋ก ์ธํด, ๊ต์ฅํ ์ค๋ซ๋์ ํน์ ์์ํ ์งํํ์ง ๋ชปํ๋ค. |
๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉํ๋ ์คํ ๋ชจ๋ธ
- ์์ฐ์ - ์๋น์ (Producer - Consumer)
ํ๋ ์ด์ ์์ฐ์ ์ค๋ ๋๊ฐ ์ ๋ณด๋ฅผ ์์ฑํด ๋ฒํผ๋ ๋๊ธฐ์ด(queue)์ ๋ฃ๋๋ค.
ํ๋ ์ด์ ์๋น์ ์ค๋ ๋๊ฐ ๋๊ธฐ์ด์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค.
์์ฐ์ ์ค๋ ๋์ ์๋น์ ์ค๋ ๋๊ฐ ์ฌ์ฉํ๋ ๋๊ธฐ์ด์ ํ์ ๋ ์์์ด๋ค.
์์ฐ์ ์ค๋ ๋๋ ๋๊ธฐ์ด์ ๋น ๊ณต๊ฐ์ด ์์ด์ผ ์ ๋ณด๋ฅผ ์ฑ์ด๋ค. ์ฆ, ๋น ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
์๋น์ ์ค๋ ๋๋ ๋๊ธฐ์ด์ ์ ๋ณด๊ฐ ์์ด์ผ ๊ฐ์ ธ์จ๋ค. ์ฆ, ์ ๋ณด๊ฐ ์ฑ์์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
๋๊ธฐ์ด์ ์ฌ๋ฐ๋ก ์ฌ์ฉํ๊ณ ์ ์์ฐ์ ์ค๋ ๋์ ์๋น์ ์ค๋ ๋๋ ์๋ก์๊ฒ ์๊ทธ๋์ ๋ณด๋ธ๋ค.
์์ฐ์ ์ค๋ ๋๋ ๋๊ธฐ์ด์ ์ ๋ณด๋ฅผ ์ฑ์ด ๋ค์ ์๋น์ ์ค๋ ๋์ "๋๊ธฐ์ด์ ์ ๋ณด๊ฐ ์๋ค"๋ ์๊ทธ๋์ ๋ณด๋ธ๋ค.
์๋น์ ์ค๋ ๋๋ ๋๊ธฐ์ด์์ ์ ๋ณด๋ฅผ ์ฝ์ด ๋ค์ธ ํ "๋๊ธฐ์ด์ ๋น ๊ณต๊ฐ์ด ์๋ค"๋ ์๊ทธ๋์ ๋ณด๋ธ๋ค.
๋ฐ๋ผ์ ์๋ชปํ๋ฉด ์์ฐ์ ์ค๋ ๋์ ์๋น์ ์ค๋ ๋๊ฐ ๋ ๋ค ์งํ ๊ฐ๋ฅํจ์๋ ๋ถ๊ตฌํ๊ณ ๋์์ ์๋ก์๊ฒ์ ์๊ทธ๋์ ๊ธฐ๋ค๋ฆด ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค.
- ์ฝ๊ธฐ-์ฐ๊ธฐ (Readers-Writers)
์ฝ๊ธฐ ์ค๋ ๋๋ฅผ ์ํ ์ฃผ๋ ์ ๋ณด์์ผ๋ก ๊ณต์ ์์์ ์ฌ์ฉํ์ง๋ง, ์ฐ๊ธฐ ์ค๋ ๋๊ฐ ์ด ๊ณต์ ์์์ ์ด๋ฐ๊ธ ๊ฐฑ์ ํ ๋คํ์. ์ด๋ฐ ๊ฒฝ์ฐ ์ฒ๋ฆฌ์จ(throughput)์ด ํต์ฌ์ด๋ค. ์ฒ๋ฆฌ์จ์ ๊ฐ์กฐํ๋ฉด ๊ธฐ์ ํ์์ด ์๊ธฐ๊ฑฐ๋ ์ค๋๋ ์ ๋ณด๊ฐ ์์ธ๋ค. ๊ฐฑ์ ์ ํ์ฉํ๋ฉด ์ฒ๋ฆฌ์จ์ ์ํฅ์ ๋ฏธ์น๋ค. ๋ฒํผ๋ฅผ ๊ฐฑ์ ํ๋ ๋์ ์ฝ์ง ์๊ณ , ๋ฒํผ๋ฅผ ์ฝ๋ ๋์ ๊ฐฑ์ ํ์ง ์๊ธฐ ์ํด์๋ ๋ณต์กํ ๊ท ํ ์ก๊ธฐ๊ฐ ํ์ํ๋ค. ๋๊ฐ๋ ์ฐ๊ธฐ ์ค๋ ๋๊ฐ ๋ฒํผ๋ฅผ ์ค๋ซ๋์ ์ ์ ํ๋ ๋ฐ๋์ ์ฌ๋ฌ ์ฝ๊ธฐ ์ค๋ ๋๊ฐ ๋ฒํผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ผ ์ฒ๋ฆฌ์จ์ด ๋จ์ด์ง๋ค.
๋ฐ๋ผ์ ์ฝ๊ธฐ ์ค๋ ๋์ ์๊ตฌ์ ์ฐ๊ธฐ ์ค๋ ๋์ ์๊ตฌ๋ฅผ ์ ์ ํ ๋ง์กฑ์์ผ ์ฒ๋ฆฌ์จ๋ ์ ๋นํ ๋์ด๊ณ ๊ธฐ์๋ ๋ฐฉ์งํ๋ ํด๋ฒ์ด ํ์ํ๋ค.
๋๊ธฐํํ๋ ๋ฉ์๋ ์ฌ์ด์ ์กด์ฌํ๋ ์์กด์ฑ์ ์ดํดํ๋ผ
๊ณต์ ๊ฐ์ฒด ํ๋์๋ ๋ฉ์๋ ํ๋๋ง ์ฌ์ฉํ๋ผ
๋๊ธฐํํ๋ ๋ฉ์๋ ์ฌ์ด์ ์์กด์ฑ์ด ์กด์ฌํ๋ฉด ๋์์ฑ ์ฝ๋์ ์ฐพ์๋ด๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๊ฐ ์๊ธด๋ค.
์๋ฐ ์ธ์ด๋ ๊ฐ๋ณ ๋ฉ์๋๋ฅผ ๋ณดํธํ๋ synchronized๋ผ๋ ๊ฐ๋ ์ ์ง์ํ๋ค. ํ์ง๋ง ๊ณต์ ํด๋์ค ํ๋์ ๋๊ธฐํ๋ ๋ฉ์๋๊ฐ ์ฌ๋ฟ์ด๋ผ๋ฉด ๊ตฌํ์ด ์ฌ๋ฐ๋ฅธ์ง ๋ค์ ํ๋ฒ ํ์ธํ๊ธฐ ๋ฐ๋๋ค.
๊ณต์ ๊ฐ์ฒด ํ๋์ ์ฌ๋ฌ ๋ฉ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ณ ๋ คํ ์ฌํญ
1. ํด๋ผ์ด์ธํธ์์ ์ ๊ธ
ํด๋ผ์ด์ธํธ์์ ์ฒซ ๋ฒ ์งธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์๋ฒ๋ฅผ ์ ๊ทผ๋ค. ๋ง์ง๋ง ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๊น์ง ์ ๊ธ์ ์ ์งํ๋ค.
2. ์๋ฒ์์ ์ ๊ธ
์๋ฒ์๋ค '์๋ฒ๋ฅผ ์ ๊ทธ๊ณ ๋ชจ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ํ ์ ๊ธ์ ํด์ 'ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
3. ์ฐ๊ฒฐ(Adapted) ์๋ฒ
์ ๊ธ์ ์ํํ๋ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์์ฑํ๋ค. '์๋ฒ์์ ์ ๊ธ' ๋ฐฉ์๊ณผ ์ ์ฌํ์ง๋ง ์๋ ์๋ฒ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค.
.๋๊ธฐํํ๋ ๋ถ๋ถ์ ์๊ฒ ๋ง๋ค์ด๋ผ
๋๊ธฐํํ๋ ๋ถ๋ถ์ ์ต๋ํ ์๊ฒ ๋ง๋ค์ด๋ผ.
์๋ฐ์์ synchronized ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฝ์ ์ค์ ํ๋ค. ๊ฐ์ ๋ฝ์ผ๋ก ๊ฐ์ผ ๋ชจ๋ ์ฝ๋ ์์ญ์ ํ ๋ฒ์ ํ ์ค๋ ๋๋ง ์คํ์ด ๊ฐ๋ฅํ๋ค. ๋ฝ์ ์ค๋ ๋๋ฅผ ์ง์ฐ์ํค๊ณ ๋ถํ๋ฅผ ๊ฐ์ค์ํจ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฌ๊ธฐ์ ๊ธฐ์ synchronized ๋ฌธ์ ๋จ๋ฐํ๋ ์ฝ๋๋ ๋ฐ๋์งํ์ง ์๋ค. ๋ฐ๋ฉด ์๊ณ ์์ญ์ ๋ฐ๋์ ๋ณดํธํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์งค ๋๋ ์๊ณ ์์ญ ์๋ฅผ ์ต๋ํ ์ค์ฌ์ผ ํ๋ค.
์๊ณ์์ญ ์๋ฅผ ์ค์ธ๋ค๊ณ ๊ฑฐ๋ํ ์๊ณ ์์ญ ํ๋๋ก ๊ตฌํํ ๊ฒฝ์ฐ, ํ์ ์ด์์ผ๋ก ์ปค์ง ์๊ณ ์์ญ์ ์ค๋ ๋ ๊ฐ ๊ฒฝ์์ด ๋์ด๋๊ณ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
.์ฌ๋ฐ๋ฅธ ์ข ๋ฃ ์ฝ๋๋ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค.
์ข ๋ฃ ์ฝ๋๋ฅผ ๊ฐ๋ฐ ์ด๊ธฐ๋ถํฐ ๊ณ ๋ฏผํ๊ณ ๋์ํ๊ฒ ์ด๊ธฐ๋ถํฐ ๊ตฌํํ๋ผ. ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฐ๋ค. ์๊ฐ๋ณด๋ค ์ด๋ ค์ฐ๋ฏ๋ก ์ด๋ฏธ ๋์จ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒํ ํ๋ผ.
์๊ตฌ์ ์ผ๋ก ๋์๊ฐ๋ ์์คํ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ ๋๋ค ๊น๋ํ๊ฒ ์ข ๋ฃํ๋ ์์คํ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅด๋ค.
๊น๋ํ๊ฒ ์ข ๋ฃํ๋ ์ฝ๋๋ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค. ๊ฐ์ฅ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ๋๋ฝ์ด๋ค. ์ฆ, ์ค๋ ๋๊ฐ ์ ๋ ์ค์ง ์์ ์๊ทธ๋์ ๊ธฐ๋ค๋ฆฐ๋ค.
.์ค๋ ๋ ์ฝ๋ ํ ์คํธํ๊ธฐ
๋ฌธ์ ๋ฅผ ๋ ธ์ถํ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ผ. ํ๋ก๊ทธ๋จ ์ค์ ๊ณผ ์์คํ ์ค์ ๊ณผ ๋ถํ๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์์ฃผ ๋๋ ค๋ผ. ํ ์คํธ๊ฐ ์คํจํ๋ฉด ์์ธ์ ์ถ์ ํ๋ผ. ๋ค์ ๋๋ ธ๋๋ ํต๊ณผํ๋๋ผ๋ ์ด์ ๋ก ๊ทธ๋ฅ ๋์ด๊ฐ๋ฉด ์ ๋๋ก ์๋๋ค.
- ๋ง์ด ์ ๋๋ ์คํจ๋ ์ ์ ์ ์ธ ์ค๋ ๋ ๋ฌธ์ ๋ก ์ทจ๊ธํ๋ผ
์์คํ ์คํจ๋ฅผ '์ผํ์ฑ'์ด๋ผ ์น๋ถํ์ง ๋ง๋ผ.
๋ค์ค ์ค๋ ๋ ์ฝ๋๋ ๋๋๋ก '๋ง์ด ์ ๋๋' ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค. ๊ทธ๋์ ๋ง์ ๊ฐ๋ฐ์๊ฐ ๋จ์ํ '์ผํ์ฑ' ๋ฌธ์ ๋ก ์น๋ถํ๊ณ ๋ฌด์ํ๋ค. '์ผํ์ฑ' ๋ฌธ์ ๋ฅผ ๊ณ์ ๋ฌด์ํ๋ค๋ฉด ์๋ชป๋ ์ฝ๋ ์์ ์ฝ๋๊ฐ ๊ณ์ ์์ธ๋ค.
- ๋ค์ค ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ์ง ์์ ์์ฐจ ์ฝ๋๋ถํฐ ์ ๋๋ก ๋๊ฒ ๋ง๋ค์.
์ค๋ ๋ ํ๊ฒฝ ๋ฐ์์ ์๊ธฐ๋ ๋ฒ๊ทธ์ ์ค๋ ๋ ํ๊ฒฝ์์ ์๊ธฐ๋ ๋ฒ๊ทธ๋ฅผ ๋์์ ๋๋ฒ๊น ํ์ง ๋ง๋ผ. ๋จผ์ ์ค๋ ๋ ํ๊ฒฝ ๋ฐ์์ ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ก ๋๋ ค๋ผ.
์ค๋ ๋ ํ๊ฒฝ ๋ฐ์์ ์ฝ๋๊ฐ ์ ๋๋ก ๋๋์ง ๋ฐ๋์ ํ์ธํ๋ค. ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, ์ค๋ ๋๊ฐ ํธ์ถํ๋ POJO๋ฅผ ๋ง๋ ๋ค. POJO๋ ์ค๋ ๋๋ฅผ ๋ชจ๋ฅธ๋ค. ๋ฐ๋ผ์ ์ค๋ ๋ ํ๊ฒฝ ๋ฐ์์ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค. POJO์ ๋ฃ๋ ์ฝ๋๋ ๋ง์์๋ก ์ข๋ค.
- ๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ๋ค์ํ ํ๊ฒฝ์ ์ฝ๊ฒ ๋ผ์ ๋ฃ์ ์ ์๋๋ก ์ค๋ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ.
๋ค์ํ ์ค์ ์์ ์คํํ ๋ชฉ์ ์ผ๋ก ๋ค๋ฅธ ํ๊ฒฝ์ ์ฝ๊ฒ ๋ผ์ ๋ฃ์ ์ ์๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ.
1. ํ ์ค๋ ๋๋ก ์คํํ๊ฑฐ๋, ์ฌ๋ฌ ์ค๋ ๋๋ก ์คํํ๊ฑฐ๋, ์คํ ์ค ์ค๋ ๋ ์๋ฅผ ๋ฐ๊ฟ๋ณธ๋ค.
2. ์ค๋ ๋ ์ฝ๋๋ฅผ ์ค์ ํ๊ฒฝ์ด๋ ํ ์คํธ ํ๊ฒฝ์์ ๋๋ ค๋ณธ๋ค.
3. ํ ์คํธ ์ฝ๋๋ฅผ ๋นจ๋ฆฌ, ์ฒ์ฒํ, ๋ค์ํ ์๋๋ก ๋๋ ค๋ณธ๋ค.
4. ๋ฐ๋ณต ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
- ๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ์ํฉ์ ๋ง์ถฐ ์กฐ์ ํ ์ ์๊ฒ ์์ฑํ๋ผ.
์ ์ ํ ์ค๋ ๋ ๊ฐ์๋ฅผ ํ์ ํ๋ ค๋ฉด ์๋นํ ์ํ์ฐฉ์ค๊ฐ ํ์ํ๋ค.
์ฒ์๋ถํฐ ๋ค์ํ ์ค์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ ์ธก์ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํ๋ค.
์ค๋ ๋ ๊ฐ์๋ฅผ ์กฐ์จํ๊ธฐ ์ฝ๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
ํ๋ก๊ทธ๋จ์ด ๋์๊ฐ๋ ๋์ค์ ์ค๋ ๋ ๊ฐ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ๋ค.
ํ๋ก๊ทธ๋จ ์ฒ๋ฆฌ์จ๊ณผ ํจ์จ์ ๋ฐ๋ผ ์ค์ค๋ก ์ค๋ ๋ ๊ฐ์๋ฅผ ์กฐ์จํ๋ ์ฝ๋๋ ๊ณ ๋ฏผํ๋ค.
- ํ๋ก์ธ์ ์๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ๋๋ ค๋ณด๋ผ.
์์คํ ์ด ์ค๋ ๋๋ฅผ ์ค์ํ(swapping)ํ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ค์ํ์ ์ผ์ผํค๋ ค๋ฉด ํ๋ก์ธ์ ์๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ๋๋ฆฐ๋ค. ์ค์ํ์ด ์ฆ์์๋ก ์๊ณ ์์ญ์ ๋นผ๋จน์ ์ฝ๋๋ ๋ฐ๋๋ฝ์ ์ผ์ผํค๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ฌ์์ง๋ค.
- ๋ค๋ฅธ ํ๋ซํผ์์ ๋๋ ค๋ณด๋ผ.
์ฒ์๋ถํฐ ๊ทธ๋ฆฌ๊ณ ์์ฃผ ๋ชจ๋ ๋ชฉํ ํ๋ซํผ์์ ์ฝ๋๋ฅผ ๋๋ ค๋ผ.
๋ค์ค ์ค๋ ๋ ์ฝ๋๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์๊ฐ๋ค. ๋ฐ๋ผ์ ์ฝ๋๊ฐ ๋์๊ฐ ๊ฐ๋ฅ์ฑ์ด ์๋ ํ๋ซํผ์ ์ ๋ถ์์ ํ ์คํธ๋ฅผ ์ํํด์ผ ๋ง๋ ํ๋ค.
- ์ฝ๋์ ๋ณด์กฐ ์ฝ๋(instrument)๋ฅผ ๋ฃ์ด ๋๋ ค๋ผ. ๊ฐ์ ๋ก ์คํจ๋ฅผ ์ผ์ผํค๊ฒ ํด ๋ณด๋ผ.
ํ๋ค๊ธฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๋ผ.
์ค๋ ๋ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ฝ์ง ์๋ค. ์ฌํ ์ญ์ ์ฝ์ง ์๋ค. ์ฝ๋๊ฐ ์คํ๋๋ ์์ฒ ๊ฐ์ง ๊ฒฝ๋ก ์ค ์์ฃผ ์์๋ง ์คํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๋ฏ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ข ๋ ์์ฃผ ์ผ์ผํฌ ๋ฐฉ์์ผ๋ก๋ณด์กฐ ์ฝ๋๋ฅผ ์ถ๊ฐํด ์ฝ๋๊ฐ ์คํ๋๋ ์์๋ฅผ ๋ฐ๊ฟ์ค๋ค.
์๋ก Object.wait(), Object.sleep ๋ฑ๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ์ฝ๋๋ฅผ ๋ค์ํ ์์๋ก ์คํํ๋ค.
๊ฐ ๋ฉ์๋๋ ์ค๋ ๋๊ฐ ์คํ๋๋ ์์์ ์ํฅ์ ๋ฏธ์น๋ค. ๋ฐ๋ผ์ ๋ฒ๊ทธ๊ฐ ๋๋ฌ๋ ๊ฐ๋ฅ์ฑ๋ ๋์์ง๋ค. ์๋ชป๋ ์ฝ๋๋ผ๋ฉด ๊ฐ๋ฅํ ์ด๋ฐ์ ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ ์์ฃผ ์คํจํ๋ ํธ์ด ์ข๋ค.
์ฝ๋์ ๋ณด์กฐ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง
- ์ง์ ๊ตฌํํ๊ธฐ
์ฝ๋ ์ค๊ฐ์ค๊ฐ wait(), yield() ์ฝ์
- ์๋ํ
AOF(Aspect-Oriented Framework), CGLIB, ASM ๋ฑ ๋๊ตฌ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ค๊ฐ์ค๊ฐ sleep, yield ์๊ฐ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค๋ ๋ฉ์๋๋ฅผ ์ฝ์ ํ๋ค. ์๋ก ThreadJigglePoint.jiggle() ์ฝ์ ํ ํธ์ถํ ๊ฒฝ์ฐ sleep, yield, nop(์๋ฌด ๋์)๋ฅผ ๋ฌด์์๋ก ํธ์ถํ๋ค.
.๊ฒฐ๋ก
๋ค์ค ์ค๋ ๋ ์ฝ๋๋ ์ฌ๋ฐ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค.
์์ ์๊ธฐํ ๋ด์ฉ ๋ชจ๋๋ฅผ ์๊ฐํ๋ฉฐ ๊ตฌํํด์ผ ํ๋ค.
๐ ๋๋์ .
- ์ค๋ ๋ ๊ตฌํ์ ๋ํด ๊น๊ฒ ์๊ฐํ ๋ฐ๊ฐ ์์๋๋ฐ ๊ตฌํ ์ ๊ณ ๋ ค์ฌํญ๊ณผ ํ ๊ฐ์ ๊ฒ๋ค์ด ์ฃผ์ด์ ธ์ ์ข์ ๋ด์ฉ์ด์๋ค.
'Study > CleanCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Study][CleanCode - 4] 15. JUnit ๋ค์ฌ๋ค๋ณด๊ธฐ (0) | 2022.08.11 |
---|---|
[Study][CleanCode - 4] 14. ์ ์ง์ ์ธ ๊ฐ์ (0) | 2022.08.10 |
[Study][CleanCode - 3] 12. ์ฐฝ๋ฐ์ฑ (0) | 2022.08.04 |
[Study][CleanCode - 3] 11. ์์คํ (0) | 2022.08.04 |
[Study][CleanCode - 3] 10. ํด๋์ค (0) | 2022.08.01 |