๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java , Spring/Java

[Java] CS ์Šคํ„ฐ๋”” - 2์ฃผ์ฐจ (Java & Spring)

by ๋ฐฉ๋ฐฐํ‚น 2024. 8. 11.

Java์˜ GC

๐Ÿ’ก Garbage Collection์ด๋ž€? Java์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์œผ๋กœ JVM์˜ Heap ์˜์—ญ์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์ค‘ ํ•„์š” ์—†์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ, ์ฃผ๊ธฐ์ ์œผ๋กœ ์ œ๊ฑฐ ํ•ด์ฃผ๋Š” ํ”„๋กœ์„ธ์Šค ์ด๋‹ค.

GC์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฏธ ํ•ด์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์‹œ ํ•ด์ฒดํ•˜๊ฑฐ๋‚˜, ํ•ด์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์‹œ ์ ‘๊ทผํ•˜๋Š” ๋“ฑ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ 
    • ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ•ด์ œ ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ๊ฐ€ ์—†๋‹ค.
    • ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

GC์˜ ๋Œ€์ƒ

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ GC์˜ ๋Œ€์ƒ์ด ๋ ๊นŒ?

๊ฐ์ฒด๋Š” ํ˜„์žฌ ์ฐธ์กฐ ๋˜๊ณ  ์žˆ๋Š” Reachable ๊ฐ์ฒด์™€ ์ฐธ์กฐ ๋˜๊ณ  ์žˆ์ง€ ์•Š์€ UnReachable ๊ฐ์ฒด๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค. GC๋Š” ์ด๋Ÿฌํ•œ UnReachable ๊ฐ์ฒด๋“ค์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

GC ์•Œ๊ณ ๋ฆฌ์ฆ˜

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 ๋™์ž‘ ๊ณผ์ •

GC๋Š” JVM์˜ Heap ์˜์—ญ์—์„œ ์ผ์–ด๋‚˜๋Š”๋ฐ, JVM์˜ Heap์˜์—ญ์€ Young generation๊ณผ Old generation์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง€๊ณ  Young generation์€ Eden, Survival0, Survival1 ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง€๋Š”๋ฐ...

Stop The World

GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JVM์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•œ๋‹ค.

GC๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์“ฐ๋ ˆ๋Š” ๋ฉˆ์ถ”๊ฒŒ๋˜์–ด ์„œ๋น„์Šค ์ด์šฉ์— ์ฐจ์งˆ์„ ์ค„์ˆ˜์žˆ๋‹ค.

๋”ฐ๋ผ์„œ STW๋ฅผ ์ตœ์†Œํ™” ์‹œ์ผœ์•ผํ•œ๋‹ค.

finalize()

@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์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

equals()์™€ hashcode()

๐Ÿ’ก 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()

equals ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ equals ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๋™์ผ ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” equals ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

hashCode()

hashCode ๋ฉ”์„œ๋“œ๋Š” Java๊ฐ€ ์•„๋‹Œ JVM ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

RunTime์— ์œ ์ผํ•œ integer๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. hashCode()๋Š” ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  2. ๋‘ ๊ฐ์ฒด๊ฐ€ equals ๋ฉ”์„œ๋“œ๋กœ ๋™์ผํ•˜๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋‘ ๊ฐ์ฒด์˜ hashCode() ๊ฐ’๋„ ๋™์ผ ํ•ด์•ผ ํ•œ๋‹ค.
  3. ๋‘ ๊ฐ์ฒด๊ฐ€ 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์™€ DI

๐Ÿ’ก IoC(Inversion of Control)๋ž€? ์ œ์–ด์˜ ์—ญ์ „์€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ( ๋ง ๊ทธ๋Œ€๋กœ ์ œ์–ด์˜ ์—ญ์ „ ) ์ „ํ†ต์ ์œผ๋กœ ๊ฐ์ฒด๋Š” ํ•„์š”ํ•œ ์˜์กด ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐพ์•˜์ง€๋งŒ, Ioc๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์˜์กด์„ฑ ์„ค์ • ๋“ฑ์„ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ฒŒ๋œ๋‹ค.

DI(Dependenct Injection)๋ž€? ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•œ ํด๋ž˜์„œ์—์„œ ํ•ด๋‹น ์˜์กด ๊ด€๊ณ„๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ฃผ์ž… ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring Bean

์Šคํ”„๋ง ๋นˆ์ด๋ž€ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์€ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Ioc์˜ ์žฅ์ 

  • ๋ชจ๋“ˆํ™” - ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆํ™”๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ - ์ œ์–ด ํ๋ฆ„์ด ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ - ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ฏ€๋กœ, ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€ - ๋‹ค์–‘ํ•œ ์„ค์ •์— ๋”ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

DI์˜ ์žฅ์ 

  • ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ - ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€ - ์˜์กด ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ - ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด - ์˜์กด ๊ฐ์ฒด๋ฅผ ๋ชฉ(mock) ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ช…ํ™•ํ•œ ์˜์กด์„ฑ -์˜์กด ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค,

DI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด

  • ํ›„๋ณด ์—†์ด ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋”ฑ ํ•œ ๊ฐœํ•˜๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€ ์•Š๋‚˜์š”? ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์™œ Spring์—์„  Bean์„ ์‚ฌ์šฉ ํ• ๊นŒ์š”?๐Ÿ’ก ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„๋˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ, ์˜์กด์„ฑ ์ฃผ์ž…, ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ, ์Šค์ฝ”ํ”„ ๊ด€๋ฆฌ, AOP ์ง€์›, ๋ชจ๋“ˆํ™”, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์ ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ†ตํ•ด ์œ ์—ฐ์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ, ๋†’์€ ํ™•์žฅ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์ ์ด ์žˆ๋‹ค.
  • Spring์˜ Bean ์ƒ์„ฑ ์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.๐Ÿ’ก 1. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์„ค์ •ํŒŒ์ผ๊ณผ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋นˆ์„ ์ •์˜ํ•œ๋‹ค. 2. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ •์˜๋œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋นˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น) 3. ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค. 4. ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. 5. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญ์— ๋”ฐ๋ผ ๋นˆ์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋นˆ์„ ์‚ฌ์šฉํ•œ๋‹ค. 6. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๋นˆ์ด ๋” ์ด์ƒ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ํ•ด๋‹น ๋นˆ์„ ์†Œ๋ฉธํ•œ๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?๐Ÿ’ก ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ @Scope("prototype")๋ฅผ ํ†ตํ•ด ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์ฆ‰, ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋นˆ์ด ์•„๋‹ˆ๋‹ค) ๋”ฐ๋ผ์„œ ์ž์‹ ๋งŒ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. (๋นˆ์˜ ๋…๋ฆฝ์„ฑ ๋ณด์žฅ, ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์™€ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ)

DispatcherServlet

๐Ÿ’ก DispatcherServlet์ด๋ž€? HTTP ํ”„๋กœํ† ์ฝœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›์•„ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์œ„์ž„ํ•ด์ฃผ๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.

DispatcherServlet์ด ๋“ฑ์žฅํ•จ์— ๋”ฐ๋ผ web.xml์˜ ์—ญํ• ์ด ์ƒ๋‹นํžˆ ์ถ•์†Œ๋˜์—ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์„ URL ๋งคํ•‘์„ ์œ„ํ•ด web.xml์— ๋ชจ๋‘ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ํ–ˆ์ง€๋งŒ, dispatcher-servlet์ด ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ•ธ๋“ค๋งํ•ด์ฃผ๊ณ  ๊ณตํ†ต ์ž‘์—…์„ ์ฒ˜๋ฆฌ๋ฉด์„œ ์ƒ๋‹นํžˆ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

web.xml

web.xml์€ Java EE ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ ์„ค๋ช…์ž ํŒŒ์ผ๋กœ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” XML ํŒŒ์ผ์ด๋‹ค.

web.xml ํŒŒ์ผ์„ ํ†ตํ•ด ์„œ๋ธ”๋ฆฟ๊ณผ ๊ทธ ๋งคํ•‘ URL์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ํ•„ํ„ฐ, ๋ฆฌ์Šค๋„ˆ, ์—๋Ÿฌ ๋“ฑ ๋งŽ์€ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, DispatcherServlet์€ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‚˜์š”?๐Ÿ’ก DispatcherServlet์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋™์ž‘ํ•˜๊ณ , ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(Tomcat)๊ฐ€ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค. (์“ฐ๋ ˆ๋“œํ’€ ์‚ฌ์šฉ)
  • ์ˆ˜๋งŽ์€ @Controller ๋ฅผ DispatcherServlet์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ ํ• ๊นŒ์š”?๐Ÿ’ก HandlerMapping์„ ํ†ตํ•ด @RequestMapping์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.

JPA์™€ ๊ฐ™์€ ORM์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๐Ÿ’ก **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

๐Ÿ’ก ํŠธ๋žœ์žญ์…˜์ด๋ž€? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ๋“ค์˜ ์ง‘ํ•ฉ

ACID, Commit, Rollback

@Transactional(์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜)

@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์„ ์•ˆ ๋ถ™์ด๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹๊นŒ์š”?๐Ÿ’ก ์œ„์˜ ์žฅ์ ๋“ค์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์—

๋Œ“๊ธ€