๐ก Garbage Collection์ด๋? Java์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ผ๋ก JVM์ Heap ์์ญ์ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ค ํ์ ์์ด์ง ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก, ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฑฐ ํด์ฃผ๋ ํ๋ก์ธ์ค ์ด๋ค.
- ์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์ง ํ ์ ์๋ค.
- ์ด๋ฏธ ํด์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ํด์ฒดํ๊ฑฐ๋, ํด์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ ์ ๊ทผํ๋ ๋ฑ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์ง ํ ์ ์๋ค.
- ๋จ์
- ๊ฐ๋ฐ์ ์ ์ฅ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ธ์ ํด์ ๋๋์ง ์ ์ ๊ฐ ์๋ค.
- ์ค๋ฒํค๋๋ก ์ธํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ ํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๊ฐ์ฒด๊ฐ GC์ ๋์์ด ๋ ๊น?
๊ฐ์ฒด๋ ํ์ฌ ์ฐธ์กฐ ๋๊ณ ์๋ Reachable ๊ฐ์ฒด์ ์ฐธ์กฐ ๋๊ณ ์์ง ์์ UnReachable ๊ฐ์ฒด๋ก ๋๋์ด ์ง๋ค. GC๋ ์ด๋ฌํ UnReachable ๊ฐ์ฒด๋ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฑฐํด์ค๋ค.
GC์ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์๋ Reference Counting, Mark and Sweep์ด ์๋ค.
Reference Counting์ Reference Count๋ผ๋ ์ซ์๊ฐ ์กด์ฌํ๋๋ฐ ์ด๋ ๋ช๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๋น ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ฅผ ์๋ฏธํ๋ค. Reference Counting์ Reference Count๋ฅผ ๊ณ์ฐํด์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ฆ, Reference Count๊ฐ์ด 0์ด๋ผ๋ฉด GC ๋์์ด ๋๋ค.
ํ์ง๋ง Reference Counting์ ์ํ ์ฐธ์กฐ๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์์ ๊ฐ์ด ์๋ก๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ Root Space์์ ์ฐ๊ฒฐ์ด ๋๊ฒจ๋ Reference Count๊ฐ์ด 1๋ก ์ ์ง ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
Mark and Sweep์ ์ด๋ฌํ ์ํ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ค.
Mark and Sweep์ Root Space์์ ์ํ๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์๋ด๊ณ ์ฐ๊ฒฐ์ด ์๋์ด์๋ ๋๋จธ์ง ๊ฐ์ฒด๋ค์ ์ง์ฐ๋ ๋ฐฉ์์ด๋ค. ์ดํ Compaction์ ํตํด Heap ์์ญ์ ์ ๋ฆฌํด์ค๋ค.
Mark and Sweep์ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์๋์ ์ผ๋ก GC๋ฅผ ์คํ ์์ผ์ผ ํ๊ณ ์ด ๊ณผ์ ์์ GC์๊ฒ ์ปดํจํฐ ๋ฆฌ์์ค๋ฅผ ํ ๋น ํด์ผ ํ๋ฉฐ ์ฑ๋ฅ ์ ํ๊ฐ ์๊ธธ ์ ์๋ค.
GC๋ JVM์ Heap ์์ญ์์ ์ผ์ด๋๋๋ฐ, JVM์ Heap์์ญ์ Young generation๊ณผ Old generation์ผ๋ก ๋๋์ด ์ง๊ณ Young generation์ Eden, Survival0, Survival1 ์ผ๋ก ๋๋์ด ์ง๋๋ฐ...
GC๋ฅผ ์ํํ๊ธฐ ์ํด JVM์ด ํ๋ก๊ทธ๋จ ์คํ์ ๋ฉ์ถ๋ ํ์์ ์๋ฏธํ๋ค.
GC๋ฅผ ์งํํ๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋ ๋ฉ์ถ๊ฒ๋์ด ์๋น์ค ์ด์ฉ์ ์ฐจ์ง์ ์ค์์๋ค.
๋ฐ๋ผ์ STW๋ฅผ ์ต์ํ ์์ผ์ผํ๋ค.
@Deprecated(since="9")
protected void finalize() throws Throwable { }
finalize() ๋ฉ์๋๋ Object ํด๋์ค์ ์ ์๋์ด ์๋ ๋ฉ์๋๋ก, ๊ฐ์ฒด๊ฐ GC์ ์ํด ์ ๋ฆฌ๋ ๋ ์คํ๋๋ค.
ํด๋น ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด GC์ ๋์์ด ๋์์๋ ์คํ๋๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์๋ํ ๊ธฐ๋ฅ์ ์ํํ๋ฉฐ ๋ณ๋์ ๋ฆฌ์์ค ์ ๋ฆฌ ์์ ์ ์ํํ๋ค. ( ํ์ง๋ง JDK 9 ๋ฒ์ ์์ Deprecated ๋จ )
finalize()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๊ฐ์ฒด๋ ํ๋ก ์ด๋๋๊ณ ๋ณ๋์ finalize ์ค๋ ๋๊ฐ ํด๋น ํ๋ฅผ ์ ๋ฆฌํ๋ฉด์ ๊ฐ ๊ฐ์ฒด๋ง๋ค ์ ์๋ finalize() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ finalize๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ๊ฐ์ฒด๋ ์ง์ง GC์ ์ํด ์ ๊ฑฐ
- finalize() ๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ ๊ฒ์ ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์๊น์?๐ก finalize()์ JVM์์ ์๋์ผ๋ก ํธ์ถ๋๋๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ํธ์ถํ ๊ฒฝ์ฐ ์ค๋ณต์ผ๋ก ํธ์ถ๋ ์๋ ์์ผ๋ฉฐ ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ๋ ๋ฑ์ ๋ค์ํ ๋ถ์์ฉ์ด ๋ฐ์ํ ์๋ ์๋ค. ( ๋ํ finalize()์ JDK 9 ๋ฒ์ ์์ Deprecated ๋จ )
- ์ด๋ค ๋ณ์์ ๊ฐ์ด null์ด ๋์๋ค๋ฉด, ์ด ๊ฐ์ GC๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์์๊น์?๐ก GC๋ ํ์ฌ ์ฐธ์กฐ๋๊ณ ์์ง ์์ UnReachable ํ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค. ์ด๋ค ๋ณ์์ ๊ฐ์ด null์ด ๋์๋ค๋ ๊ฒ์ ํด๋น ๋ณ์๊ฐ ๋ ์ด์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง null์ด ๋ ํด๋น ๋ณ์ ์ธ์ ๋ค๋ฅธ ๋ณ์๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ํด๋น ๊ฐ์ฒด๋ ์์ง Reachable ํ ๊ฐ์ฒด์ด๋ฏ๋ก GC์ ๋์์ด ๋์ง ์๋๋ค.
๐ก Java equals()์ hashcode()๋ Java์ Object ํด๋์ค์ ์ ์ ๋์ด ์๋ค. ๋ชจ๋ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก Object๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฉ์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ํ ํ์ํ๋ค๋ฉด ์ฌ์ ์๋ฅผ ํตํด ์๋ก ์์ฑ ํ ์ ์๋ค.
// Object equals
public boolean equals(Object obj) {
return (this == obj);
}
// Object hashCode
// hashCode ๋ฉ์๋์ ๊ฒฝ์ฐ Java๊ฐ ์๋ JVM ๋ด๋ถ์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๊ตฌํ๋์ด์๋ค.
@IntrinsicCandidate
public native int hashCode();
equals ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ ๊ฐ์ฒด๊ฐ ๋์ผํ์ง ํ์ธํ ๋ ์ฌ์ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก equals ๋ฉ์๋๋ ๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ด ๋์ผ ํ์ง ํ์ธํ๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋์ผํ์ง ํ์ธํ๊ธฐ ์ํด์๋ equals ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ์ ์ํด์ผ ํ๋ค.
hashCode ๋ฉ์๋๋ Java๊ฐ ์๋ JVM ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๊ตฌํ๋์ด์๋ค.
RunTime์ ์ ์ผํ integer๊ฐ์ ๋ฐํํ๋ค.
- hashCode()๋ ๋์ผํ ๊ฐ์ฒด์ ๋ํด ํญ์ ๋์ผํ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
- ๋ ๊ฐ์ฒด๊ฐ equals ๋ฉ์๋๋ก ๋์ผํ๋ค๋ฉด ๋ฐ๋์ ๋ ๊ฐ์ฒด์ hashCode() ๊ฐ๋ ๋์ผ ํด์ผ ํ๋ค.
- ๋ ๊ฐ์ฒด๊ฐ equals ๋ฉ์๋๋ก ๋๋ฑํ์ง ์๋ค๋ฉด ๋ฐ๋์ ํด์ ์ฝ๋๊ฐ ๋ค๋ฅผ ํ์๋ ์๋ค.
- ๋ณธ์ธ์ด hashcode()๋ฅผ ์ ์ํด์ผ ํ๋ค๋ฉด, ์ด๋ค ์ ์ ์ผ๋์ ๋๊ณ ๊ตฌํํ ๊ฒ ๊ฐ์ผ์ธ์?๐ก 1. equals ๋ฉ์๋๊ฐ ์ฌ์ ์ ๋์๋์ง (equals๊ฐ ์ฌ์ ์๋์ง ์์๋ค๋ฉด hashCode๋ ์ฌ์ ์ ํ ํ์๊ฐ ์๋ค) 2. equals ๋ฉ์๋์์ ์ด๋ค ๋ฐ์ดํฐ๋ค์ ๋น๊ตํ๋์ง (equals ๋ฉ์๋์์ ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ๋ฉด hashCode๋ ๋์ผํ ๊ฐ์ ๋ฐํํด์ผํ๋ค) 3. equals ๋ฉ์๋์์ ์ด๋ค ๋ฐ์ดํฐ๋ ์ฌ์ฉํ์ง ์๋์ง (equals์์ ๋น๊ตํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ hashCode์์ ์ฌ์ฉํ๋ฉด equals๋ก ๋์ผํ ๊ฐ์ฒด์ hashCode ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.)์์ฝ: equals๊ฐ ์ฌ์ ์ ๋์๋์ง, equals์์ ์ด๋ค ๋ฐ์ดํฐ๋ ๋น๊ตํ๊ณ ์ด๋ค ๋ฐ์ดํฐ๋ ๋น๊ตํ์ง ์๋์ง
- ๊ทธ๋ ๋ค๋ฉด equals()๋ฅผ ์ฌ์ ์ ํด์ผ ํ ๋, ์ด๋ค ์ ์ ์ผ๋์ ๋์ด์ผ ํ๋์ง ์ค๋ช ํด ์ฃผ์ธ์.๐ก 1. hashCode()๋ฅผ ์ฌ์ ์ ํ๋์ง (hashCode์ ๋ง์ฐฌ๊ฐ์ง๋ก equals์ฌ์ ์์ hashCode๋ฅผ ์ฌ์ ์ ํ๋์ง ํ์ธํด์ผํ๋ค.) 2. ์ด๋ค ํ๋๊ฐ์ ๋น๊ตํ ๊ฒ์ธ์ง
๐ก IoC(Inversion of Control)๋? ์ ์ด์ ์ญ์ ์ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์๋ ์ปจํ ์ด๋๋ ํ๋ ์์ํฌ๊ฐ ๋ด๋นํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ( ๋ง ๊ทธ๋๋ก ์ ์ด์ ์ญ์ ) ์ ํต์ ์ผ๋ก ๊ฐ์ฒด๋ ํ์ํ ์์กด ๊ฐ์ฒด๋ฅผ ์ค์ค๋ก ์์ฑํ๊ฑฐ๋ ์ฐพ์์ง๋ง, Ioc๋ฅผ ํตํด ๊ฐ์ฒด์ ์์ฑ, ์ด๊ธฐํ, ์์กด์ฑ ์ค์ ๋ฑ์ ์ธ๋ถ ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ฒ๋๋ค.
DI(Dependenct Injection)๋? ์์กด์ฑ ์ฃผ์ ์ ์ปจํ ์ด๋์ ์ํด ํด๋์ค ๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์์กด ๊ด๊ณ๊ฐ ํ์ํ ํด๋์์์ ํด๋น ์์กด ๊ด๊ณ๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์คํ๋ง ๋น์ด๋ ์คํ๋ง IoC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
๋น์ ์๋ช ์ฃผ๊ธฐ๋ ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง ๋น์ ์ฑ๊ธํค ์ค์ฝํ๋ก ๊ด๋ฆฌ๋๋ค. ํ์์ ๋ฐ๋ผ ํ๋กํ ํ์ ๋น์ผ๋ก ์ค์ ํ ์ ์๋ค.
- ๋ชจ๋ํ - ๊ฐ์ฒด ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ธ๋ถ ์ปจํ ์ด๋๊ฐ ๋ด๋นํ๋ฏ๋ก ๋ชจ๋ํ๊ฐ ์ฉ์ดํ๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด์ฑ - ์ ์ด ํ๋ฆ์ด ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋์ด ์ฝ๋์ ๋ณต์ก๋๊ฐ ๊ฐ์ํ๊ณ , ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ - ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ผ๋ฏ๋ก, ํ ์คํธ ์ Mock ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ์ฃผ์ ํ ์ ์์ต๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ - ๋ค์ํ ์ค์ ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋๋ค.
- ๊ฒฐํฉ๋ ๊ฐ์ - ํด๋์ค ๊ฐ์ ์์กด์ฑ์ ์ค์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ ์ํฅ์ ์ต์ํํ ์ ์๋ค.
- ์ ์ฐ์ฑ ์ฆ๊ฐ - ์์กด ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ด ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ์ฑ ํฅ์ - ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ฌ๋ฌ ํด๋์ค์์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ํ ์คํธ ์ฉ์ด - ์์กด ๊ฐ์ฒด๋ฅผ ๋ชฉ(mock) ๊ฐ์ฒด๋ก ๋์ฒดํ์ฌ ๋จ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์๋ค.
- ๋ช ํํ ์์กด์ฑ -์์กด ๊ด๊ณ๊ฐ ๋ช ํํ๊ฒ ๋๋ฌ๋๋ฏ๋ก ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋๋ค,
- ํ๋ณด ์์ด ํน์ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค๊ฐ ๋ฑ ํ ๊ฐํ๋ฉด, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํด๋ ๋์ง ์๋์? ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ Spring์์ Bean์ ์ฌ์ฉ ํ ๊น์?๐ก ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฌ์ฉํด๋๋์ง๋ง, ๋จ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ๋์ด์, ์์กด์ฑ ์ฃผ์ , ๋น ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ์ค์ฝํ ๊ด๋ฆฌ, AOP ์ง์, ๋ชจ๋ํ, ํ ์คํธ ์ฉ์ด์ฑ ๋ฑ ๋ค์ํ ์ด์ ์ ์ ๊ณตํ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ํตํด ์ ์ฐ์ฑ, ์ ์ง ๋ณด์์ฑ, ๋์ ํ์ฅ์ฑ ๋ฑ ๋ค์ํ ์ด์ ์ด ์๋ค.
- Spring์ Bean ์์ฑ ์ฃผ๊ธฐ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.๐ก 1. ์ปจํ ์ด๋์์ ์ค์ ํ์ผ๊ณผ ์ด๋ ธํ ์ด์ ์ ํตํด ๋น์ ์ ์ํ๋ค. 2. ์ปจํ ์ด๋์์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋น์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. (๋ฉ๋ชจ๋ฆฌ ํ ๋น) 3. ๋น์ ์์ฑํ๊ณ ํ์ํ ์์กด์ฑ์ ์ฃผ์ ํ๋ค. 4. ์ด๊ธฐํ ์์ ์ ์งํํ๋ค. 5. ์ปจํ ์ด๋์์ ์์ฒญ์ ๋ฐ๋ผ ๋น์ ๋ฐํํด์ฃผ๊ณ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น์ ์ฌ์ฉํ๋ค. 6. ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ๋น์ด ๋ ์ด์ ํ์๊ฐ ์์ผ๋ฉด ํด๋น ๋น์ ์๋ฉธํ๋ค.
- ํ๋กํ ํ์ ๋น์ ๋ฌด์์ธ๊ฐ์?๐ก ํ๋กํ ํ์ ๋น์ @Scope("prototype")๋ฅผ ํตํด ์ ์ธํ ์ ์๋ค. ํ๋กํ ํ์ ๋น์ ์ปจํ ์ด๋์ ๋น์ ๋ํ ์์ฒญ์ด ๋ค์ด์ฌ๋ ๋ง๋ค ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. (์ฆ, ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ ๋น์ด ์๋๋ค) ๋ฐ๋ผ์ ์์ ๋ง์ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค. (๋น์ ๋ ๋ฆฝ์ฑ ๋ณด์ฅ, ๋ณ๋ ฌ์ฒ๋ฆฌ์ ์ค๋ ๋ ์์ ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ)
๐ก DispatcherServlet์ด๋? HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์ํด์ฃผ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ด๋ค.
DispatcherServlet์ด ๋ฑ์ฅํจ์ ๋ฐ๋ผ web.xml์ ์ญํ ์ด ์๋นํ ์ถ์๋์๋ค. ๊ณผ๊ฑฐ์๋ ๋ชจ๋ ์๋ธ๋ฆฟ์ URL ๋งคํ์ ์ํด web.xml์ ๋ชจ๋ ๋ฑ๋กํด์ฃผ์ด์ผ ํ์ง๋ง, dispatcher-servlet์ด ํด๋น ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋งํด์ฃผ๊ณ ๊ณตํต ์์ ์ ์ฒ๋ฆฌ๋ฉด์ ์๋นํ ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์๊ฒ ๋์๋ค.
web.xml์ Java EE ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ ์ค๋ช ์ ํ์ผ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ ์ํ๋ XML ํ์ผ์ด๋ค.
web.xml ํ์ผ์ ํตํด ์๋ธ๋ฆฟ๊ณผ ๊ทธ ๋งคํ URL์ ์ ์ํ ์ ์๋ค. ๊ทธ ์ธ์๋ ํํฐ, ๋ฆฌ์ค๋, ์๋ฌ ๋ฑ ๋ง์ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- ์ฌ๋ฌ ์์ฒญ์ด ๋ค์ด์จ๋ค๊ณ ๊ฐ์ ํ ๋, DispatcherServlet์ ํ๋ฒ์ ์ฌ๋ฌ ์์ฒญ์ ๋ชจ๋ ๋ฐ์ ์ ์๋์?๐ก DispatcherServlet์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด์์ ๋์ํ๊ณ , ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Tomcat)๊ฐ ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค. (์ฐ๋ ๋ํ ์ฌ์ฉ)
- ์๋ง์ @Controller ๋ฅผ DispatcherServlet์ ์ด๋ป๊ฒ ๊ตฌ๋ถ ํ ๊น์?๐ก HandlerMapping์ ํตํด @RequestMapping์ ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ์ฐพ๋๋ค.
๐ก **JPA (Java Persistence API)๋?** JPA๋ ์๋ฐ์์ ์ฌ์ฉํ๋ ORM(Object Relational Mapping) ๊ธฐ์ ํ์ค์ด๋ค.
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ๋ฐ์ดํฐ ์์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ์คํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ ์ด๋ค.
์ฆ, JPA๋ ์ธํฐํ์ด์ค์ด์ง ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JPA๋ฅผ ๊ตฌํํ ORM ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ๋ํ์ ์ธ JPA ๊ตฌํ์ฒด๋ Hibernate, OpenJPA, EclipseLink๋ฑ์ด ์๋ค
ORM์ด๋?
ORM ์ Object-Relational Mapping ์ ์ฝ์๋ก, ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ์ ์๋ํํ๋ ๊ธฐ์ ์ด๋ค.
๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
์ด๋ ํด๋์ค์ ํ ์ด๋ธ ์ฌ์ด์ ๋ชจ๋ธ ๋ถ์ผ์น๊ฐ ์๊ธฐ๋๋ฐ ์ด๋ฅผ ํด๊ฒฐํด์ค๋ค.
์์์ฑ์ ์ฌ์ ์ ์๋ฏธ๋ ์์ํ ๊ณ์๋๋ ์ฑ์ง์ด๋ ๋ฅ๋ ฅ์ ์๋ฏธํ๋ค.
๊ฐ๋ฐ์์ ์์์ฑ์ ์ํ์ ์๊ด ์๋๋ก ๋ฌผ๋ฆฌ์ ์ธ ์ ์ฅ์๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ์๋ฅผ ์๋ฏธํ๋ค.
- ์์์ฑ์ ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์? ์ด๊ฒ ์ง์ง ์ฑ๋ฅ ํฅ์์ ํฐ ๋์์ด ๋๋์?๐ก ์์์ฑ์ ์๋ ๋๊ธฐํ, ์บ์ฑ, ์ง์ฐ๋ก๋ฉ, ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ๊ณผ ํธ๋์ญ์ ๋ด ์์ ์ ์ต์ํ ํด์ ์ฑ๋ฅ์ ํฅ์ ์ํจ๋ค.
- N + 1 ๋ฌธ์ ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.๐ก ์ฐ๊ฐ๊ด๊ณ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ํ๋ฒ์ ์ฟผ๋ฆฌ๋ก ํด๊ฒฐํ ์ ์์ง๋ง ์ฌ๋ฌ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค.๋ฌธ์ ์ ์์ธ์ ์ํฐํฐ๋ฅผ ์กฐํํ๊ณ ๊ทธ์ ๊ด๋ จ๋ ์ํฐํฐ๋ฅผ ๋ชจ๋ ๋ก๋ ํ๋ ค๊ณ ํ๋ฉด, ์ฒ์์๋ N๊ฐ์ ๊ธฐ๋ณธ ์ํฐํฐ๋ฅผ ๋ก๋ ํ์ง๋ง ์ดํ ๊ฐ ๊ธฐ๋ณธ ์ํฐํฐ์ ๋ํด ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ๊ฐ๊ฐ ๋ณ๋์ ์ฟผ๋ฆฌ๋ก ๋ก๋ํ๊ฒ ๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์์ผ๋ก๋ Fetch Join, EntityGraph, Batch Size ๋ฑ์ด ์๋ค.
๐ก ํธ๋์ญ์ ์ด๋? ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์๋ฅผ ๊ตฌ์ฑํ๋ ์ฐ์ฐ๋ค์ ์งํฉ
@Transactional์ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, ๋ฉ์๋ ๋จ์๋ก ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค. (Spring์์๋ @Transactional์ AOP๋ฅผ ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ค)
JDBC ํ๊ฒฝ์์ ์๋ ์ปค๋ฐ๊ณผ ๋น์ทํ์ง๋ง ์๋์ปค๋ฐ์ ๊ฒฝ์ฐ try catch๋ฅผ ํตํด exception์ ์ก์์ rollbackํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผํ์ง๋ง @Transactional์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก rollback์ ํด์ค๋ค. (ํธ๋ฆฌํ๋ค)
- @Transactional(readonly=true) ๋ ์ด๋ค ๊ธฐ๋ฅ์ธ๊ฐ์? ์ด๊ฒ ๋์์ด ๋๋์?๐ก @Transactional(readonly=true)๋ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ํํ๋ค. 1. ์ฝ๊ธฐ ์ ์ฉ์ ๋ฐ์ดํฐ ์์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ํ ๋ ๋ฝ์ ์ฌ์ฉํ ์ ์๋ค 2. ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๊ณ ์๋์น ์๊ฒ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋๊ฒ์ ๋ฐฉ์งํด์ค๋ค. 3. readonly๋ CUD ์์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋ ์ ์ ์ฅ, ๋ณ๊ฒฝ ๊ฐ์ง ๋ฑ์ ์์ ์ ์ํํ์ง ์์ ์ฑ๋ฅ์ด ํฅ์๋๋ค. 4. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์คํ ๊ตฌ์ฑ์ (master - slave) ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก slave๋ฅผ ํธ์ถํด DB ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค. 5. ๊ฐ๋ ์ฑ ์ฆ๊ฐ
- ๊ทธ๋ฐ๋ฐ, ์ฝ๊ธฐ์ ํธ๋์ญ์ ์ ๊ฑธ ํ์๊ฐ ์๋์? @Transactional์ ์ ๋ถ์ด๋ฉด ๋๋๊ฑฐ ์๋๊น์?๐ก ์์ ์ฅ์ ๋ค์ด ์๊ธฐ๋๋ฌธ์
'Java , Spring > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] HashMap์ Thread-Safe ์ TreeMap, LinkedHashMap, EntrySet ์ ๋ฆฌ (0) | 2024.10.07 |
---|---|
[JAVA] Virtual Thread (JDK 21) (1) | 2024.09.03 |
[Java] CS ์คํฐ๋ - 1์ฃผ์ฐจ (Java & Spring) (0) | 2024.08.02 |
[Java] UncheckedException๊ณผ CheckedException (Error์ Exception) (0) | 2024.01.22 |
[Java] ์ปค๋ฅ์ ํ๊ณผ ๋ฐ์ดํฐ์์ค(DataSource) (0) | 2024.01.19 |
๋๊ธ