week 4 jisoo - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ & ์Šค๋ ˆ๋“œ์„ธ์ดํ”„ํ‹ฐ & ์Šค๋ ˆ๋“œํ’€ ๊ฐ๊ฐ์˜ ํŠน์ง•์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

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

๋˜ํ•œ ์„œ๋น„์Šค ์ธก๋ฉด์—์„œ ๋ฐ”๋ผ๋ณผ๋•Œ, ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ž‘์—…ํ์— ๋„ฃ๊ณ , ์Šค๋ ˆ๋“œํ’€์€ ์ž‘์—…ํ์— ๋“ค์–ด์˜จ Task๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“์€ Thread๋“ค์—๊ฒŒ ํ• ๋‹นํ•œ๋‹ค. ์ผ์„ ๋‹ค ์ฒ˜๋ฆฌํ•œ Thread๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

https://t1.daumcdn.net/cfile/tistory/231B374B595F67F43A

  • java์˜ ์Šค๋ ˆ๋“œ ํ’€ ์ƒ์„ฑ / ์‚ฌ์šฉ java.util.concurrent.Package์—์„œ ExecuterService ์ธํ„ฐํŽ˜์ด์Šค์™€ Executor ํด๋ž˜์Šค๋ฅผ ์ œ๊ณต Executors ํด๋ž˜์Šค์˜ ๋‹ค์–‘ํ•œ ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ExecutorService ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์Šค๋ ˆ๋“œ ํ’€ ์ƒ์„ฑ)
  • java์˜ ์Šค๋ ˆ๋“œ ํ’€ ์ข…๋ฅ˜
  • newFixedThreadPool : ์ฃผ์–ด์ง„ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋งŒํผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์ˆ˜๋ฅผ ์œ ์ง€. ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ์ค‘ ์ผ๋ถ€๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑ.
  • newCachedThreadPool : ์ฒ˜๋ฆฌํ•  ์Šค๋ ˆ๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ทธ๋งŒํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ฆ๊ฐ€(์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜ : Integer.MAX_VALUE)
  • newSingleThreadExecutor : ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ(1๊ฐœ๋กœ ๊ณ„์† ์œ ์ง€)
  • newScheduledThreadPool : ํŠน์ • ์‹œ๊ฐ„ ์ดํ›„, ๋˜๋Š” ์ฃผ๊ธฐ์  ์ž‘์—… ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์‹œ ํ™œ์šฉ

https://limkydev.tistory.com/55

Hashtable๊ณผ HashMap์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ณตํ†ต์ 

  • ๋‘˜๋‹ค ๋งต์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ
  • ๋‘˜๋‹ค key / value์˜ ๊ตฌ์กฐ
  • ๊ฐ์ฒด๋“ค์ด ๋ฒ„์ผ“์— ์ „์ฒด์ ์œผ๋กœ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ put ๊ณผ get ๋ฉ”์†Œ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ ๋‘˜๋‹ค ์ผ์ •ํ•œ ์‹œ๊ฐ„์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋‘˜๋‹ค ํ•ด์‹ค ์›๋ฆฌ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค.

HashMap

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ๋™๊ธฐํ™” ์ง€์›ํ•˜์ง€ ์•Š์Œ โ†’ ConcurrentHashMap ์‚ฌ์šฉ ๊ถŒ์žฅ

  • ์ €์žฅ๋œ ์š”์†Œ๋“ค์˜ ์ˆœํšŒ๋ฅผ ์œ„ํ•ด Fail-Fast-Iterator ์‚ฌ์šฉ (ConcurrentHashMap์€ Fail-Safe-Iterator ์‚ฌ์šฉ) Fail-Fast Iterator : ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ(์—์„œ ํ•ด๋‹น ์ž๋ฃŒ์— ์š”์†Œ๋ฅผ ์ˆ˜์ •(์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ • ๋“ฑ)์ด ๋ฐœ์ƒํ•˜๋ฉด ConcurrentModificationException์„ ๋ฐœ์ƒ์‹œ์ผœ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

    Fail-Safe-Iterator: ConcurrentHashMap์˜ ๊ฒฝ์šฐ Map์˜ ๋ณต์‚ฌ๋ณธ์„ ์ฐธ์กฐํ•˜๋Š” Iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋‹ค์‹œ ๋ฐ˜ํ™˜๋ฐ›์€ ์‹œ์ ์— Map์— ์ˆ˜์ •์ด ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น Iterator๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ณ ๋กœ ConcurrentModificationException๋˜ํ•œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์•ฝํ•œ ์ผ๊ด€์„ฑ(Weakly Consistent)๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์ƒํ™ฉ์—์„œ ํ•ด๋‹น Map์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

  • 1๊ฐœ์˜ nullํ‚ค์™€ ๋‹ค์ˆ˜์˜ null๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

HashTable

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ โ†’ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ ๋น„์šฉ ๋ฐœ์ƒ. ๋” ๋А๋ฆผ(๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ฉ”์†Œ๋“œ์— syncronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ๋˜์–ด ์žˆ์Œ โ†’ ๋งค์šฐ ๋А๋ฆฐ ๋™์ž‘)
  • ์ €์žฅ๋œ ์š”์†Œ๋“ค์˜ ์ˆœํšŒ๋ฅผ ์œ„ํ•ด Enumeration ์‚ฌ์šฉ (์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ด์ „์— ์‚ฌ์šฉ๋˜์—ˆ๋˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ Iterator ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.)
  • key / value์— null๊ฐ’ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

๊ฐ์ฒด์˜ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”.

์ง๋ ฌํ™”(Serialization)๋ž€?

  • ๋ง๊ทธ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „์†ก ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ˜•ํ•˜์—ฌ Stream์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋„๋ก ํ•ด์ค€๋‹ค.
  • ์ด๊ฒƒ์€ ์ฃผ๋กœ ๊ฐ์ฒด๋“ค์„ ํ†ต์งธ๋กœ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ „์†กํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ž๋ฐ” ์ง๋ ฌํ™”๋ž€ ์ž๋ฐ” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์˜ ์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”์ดํŠธ(byte) ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ (์—ญ์ง๋ ฌํ™”)์„ ์•„์šธ๋Ÿฌ์„œ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜์ž๋ฉด JVM(Java Virtual Machine ์ดํ•˜ JVM)์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ(ํž™ ๋˜๋Š” ์Šคํƒ)๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ JVM์œผ๋กœ ์ƒ์ฃผ์‹œํ‚ค๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ™์ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์—ญ์ง๋ ฌํ™”(Deserialization)๋ž€?

  • ์ง๋ ฌํ™”๋œ ํŒŒ์ผ ๋“ฑ์„ ์—ญ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋‹ค์‹œ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ €์žฅ๋œ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ „์†ก๋œ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์›๋ž˜ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ๋ณต์›ํ•œ๋‹ค.

์ž๋ฐ” ์ง๋ ฌํ™” ์กฐ๊ฑด

์ž๋ฐ” ๊ธฐ๋ณธ(primitive) ํƒ€์ž…๊ณผ java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋Š” ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์กฐ๊ฑด์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์—ญ์ง๋ ฌํ™” ์กฐ๊ฑด

  • ์ง๋ ฌํ™” ๋Œ€์ƒ์ด ๋œ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค ํŒจ์Šค์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ import ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ค‘์š”ํ•œ ์ ์€ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.(๊ฐ™์€ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์ด๋ผ๋„ ์†Œ์Šค ๋ฒ„์ „์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‹ค์‹œ ์ž์„ธํžˆ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)
  • ์ž๋ฐ” ์ง๋ ฌํ™” ๋Œ€์ƒ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ serialVersionUID ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    private static final long serialVersionUID = 1L;

    ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์•„์‹œ๋Š” ๋ถ„์€ ์œ„์—์„œ ๊ธฐ์ˆ ํ•œ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ” ์ง๋ ฌํ™” ๋Œ€์ƒ์˜ Member ํด๋ž˜์Šค๊ฐ€ serialVersionUID ์ƒ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์˜์•„ํ•˜์‹  ๋ถ„๋„ ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค.์‚ฌ์‹ค ๋ฐ˜๋“œ์‹œ ๊ธฐ์ˆ ํ•ด์•ผ ๋˜๋Š” ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นผ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ์„œ ๋”ฐ๋กœ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ณณ์—์„œ๋Š” ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ์–ธ์ œ(when) ์–ด๋””์„œ(where) ์‚ฌ์šฉ๋˜๋‚˜์š”?

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์ƒ์ฃผ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜์†ํ™”(Persistence)๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์—†์–ด์ง€์ง€ ์•Š๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๋ฉฐ ์˜์†ํ™”๋œ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•  ๋•Œ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์—ญ์ง๋ ฌ ํ™”ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.๊ทธ๋Ÿฐ ํŠน์„ฑ์„ ์‚ด๋ฆฐ ์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ๋งŽ์€ ๊ณณ์—์„œ ์ด์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„ ๋ช‡ ๊ฐœ๋งŒ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ธ”๋ฆฟ ์„ธ์…˜ (Servlet Session)์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜์˜ WAS(ํ†ฐ์บฃ, ์›น๋กœ์ง ๋“ฑ)๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์„ธ์…˜์˜ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๋ฌผ๋ก  ๋‹จ์ˆœํžˆ ์„ธ์…˜์„ ์„œ๋ธ”๋ฆฟ ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ์šด์šฉํ•œ๋‹ค๋ฉด ์ง๋ ฌํ™”๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์ง€๋งŒ, ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง, DB๋ฅผ ์ €์žฅํ•˜๋Š” ์˜ต์…˜ ๋“ฑ์„ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด ์„ธ์…˜ ์ž์ฒด๊ฐ€ ์ง๋ ฌํ™”๊ฐ€ ๋˜์–ด ์ €์žฅ๋˜์–ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.(๊ทธ๋ž˜์„œ ์„ธ์…˜์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„(implements) ํ•ด๋‘๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.)์ฐธ๊ณ ๋กœ ์œ„ ๋‚ด์šฉ์€ ์„œ๋ธ”๋ฆฟ ์ŠคํŽ™์—์„œ๋Š” ์ง์ ‘ ๊ธฐ์ˆ ํ•œ ๋‚ด์šฉ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•œ WAS ๋งˆ๋‹ค ๋™์ž‘์€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์บ์‹œ (Cache)์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ ํผํฌ๋จผ์Šค๋ฅผ ์œ„ํ•ด ์บ์‹œ(EhcacheRedisMemcached, โ€ฆ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹œ์Šคํ…œ์„ ๋งŽ์ด ์ด์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.์ž๋ฐ” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ƒ๋‹น์ˆ˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด DB๋ฅผ ์กฐํšŒํ•œ ํ›„ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๊ฐ™์€ ๊ฒฝ์šฐ ์‹ค์‹œ๊ฐ„ ํ˜•ํƒœ๋กœ ์š”๊ตฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ, ์™ธ๋ถ€ ์ €์žฅ์†Œ, ํŒŒ์ผ ๋“ฑ์„ ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ ํ›„ ๋™์ผํ•œ ์š”์ฒญ์ด ์˜ค๋ฉด DB๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ ์‘๋‹ตํ•˜๊ฒŒ ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋ณดํ†ต ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.์บ์‹œ๋ฅผ ์ด์šฉํ•˜๋ฉด DB์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ์ž์ฃผ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. (์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.)์ด๋ ‡๊ฒŒ ์บ์‹œ ํ•  ๋ถ€๋ถ„์„ ์ž๋ฐ” ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ž๋ฐ” ์ง๋ ฌ ํ™”๋งŒ ์ด์šฉํ•ด์„œ๋งŒ ์บ์‹œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ” RMI(Remote Method Invocation)์ตœ๊ทผ์—๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์„ค๋ช…ํ•  ๋•Œ๋Š” ๋น ์ง€์ง€ ์•Š๊ณ  ์ด์•ผ๊ธฐ๋˜๋Š” ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰๋งŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.์ž๋ฐ” RMI๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜์ž๋ฉด ์›๊ฒฉ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ๊ตํ™˜์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.๋ณดํ†ต์€ ์›๊ฒฉ์˜ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ IP์™€ ํฌํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์†Œ์ผ“ํ†ต์‹ ์„ ํ•ด์•ผ ํ•˜์ง€๋งŒ RMI๋Š” ๊ทธ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์›๊ฒฉ์— ์žˆ๋Š” ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์›๊ฒฉ์˜ ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ์‹œ์— ์ „๋‹ฌํ•˜๋Š” ๋ฉ”์‹œ์ง€(๋ณดํ†ต ๊ฐ์ฒด)๋ฅผ ์ž๋™์œผ๋กœ ์ง๋ ฌํ™” ์‹œ์ผœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ์ „๋‹ฌ๋ฐ›์€ ์›๊ฒฉ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์—ญ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ž‘์€ ์ฑ… ํ•œ ๊ถŒ ์ •๋„์˜ ์–‘์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ํ•œ๋ฒˆ ์ฐพ์•„๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ž๋ฐ” ์ง๋ ฌํ™”, ๊ทธ๊ฒƒ์ด ์•Œ๊ณ ์‹ถ๋‹ค. ํ›‘์–ด๋ณด๊ธฐํŽธ - ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

Spring ๋ฉ”์‹œ์ง€ ํ Rabiit MQ vs KAFKA

RabbitMQ ์™€ Kafka ์˜ ๋ฉ”์ธ ๋ชฉ์ ์€ ๋ถ„์‚ฐ pub-sub ๋ฉ”์„ธ์ง• ์‹œ์Šคํ…œ์ด๋‹ค.๊ตฌ๋…์ž๋“ค์ด ์ •ํ™•ํžˆ ๊ทธ๋“ค์ด ํฅ๋ฏธ์žˆ์–ดํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ฝ์„์ˆ˜์žˆ๋„๋ก ํ•ด์ฃผ๊ณ ์žˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์˜ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์€ ํ™•์žฅ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹ ๋ขฐ์„ฑ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ๋†’์€ ์‹ ๋ขฐ์„ฑ/ํ™•์žฅ์„ฑ์žˆ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ฉ”์„ธ์ง• ์‹œ์Šคํ…œ์ดํ•„์š”ํ•œ๊ณณ์ด๋ฉด ์–ด๋””๋“  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ์ ์ œ ์ ์†Œ์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์œ„ ๋‘ ์†”๋ฃจ์…˜์„ ๋น„๊ตํ•ด ๋ณผ ํ•„์š” ๊ฐ€ ์žˆ์„๋“ฏ ํ•˜๋‹ค

RabbitMQ ์™€ Kafka

โ€“ RabbitMQ ๊ฐ€ ์ข€๋” ์„ฑ์ˆ™ํ•˜๋‹ค.โ€“ ์ฒ ํ•™์€ ์ข€ ๋‹ค๋ฅธ๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ RabbitMQ ๋Š” ๋ธŒ๋กœ์ปค ์ค‘์‹ฌ์ ์ด๋ฉฐ,์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๊ฐ„์˜ ๋ณด์žฅ๋˜๋Š” ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ์— ์ด›์ ์„ ๋งž์ถ”์—ˆ๋‹ค.

โ€“ ๋ฐ˜๋ฉด Kafka ๋Š” ์ƒ์‚ฐ์ž ์ค‘์‹ฌ์ ์ด๋ฉฐ, ์—„์ฒญ๋‚œ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ์„ ํŒŒํ‹ฐ์…”๋‹ํ•˜๋Š”๋ฐ ๊ธฐ๋ฐ˜์„ ๋‘”๋‹ค.๋ฐฐ์น˜ ์†Œ๋น„์ž๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์˜จ๋ผ์ธ, ์˜คํ”„๋ผ์ธ์— ์ € ์ง€์—ฐ์œจ(Low latency)์„ ๋ณด์žฅํ•˜๋ฉฐ ๋ฉ”์„ธ์ง€๋ฅผ์ „๋‹ฌํ•ด ์ค€๋‹ค.

โ€“ RabbitMQ ๋Š” ๋ธŒ๋กœ์ปค์ƒ์—์„œ ์ „๋‹ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ๋ฉ”์„ธ์ง€ ํ‘œ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.์นดํ”„์นด๋Š” ๊ทธ๋Ÿฐ ๋ฉ”์„ธ์ง€ ํ‘œ์‹์ด ์—†์œผ๋ฉฐ ์ปจ์Šˆ๋จธ๊ฐ€ ์ „๋‹ฌ(๋ฐฐ๋‹ฌ) ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๋Š”๊ฒƒ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค.

โ€“ RabbitMQ ๋Š” ์ปค๋‹ค๋ž€ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ๋””์ž์ธ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ๋งŒ์•ฝ ์ปจ์Šˆ๋จธ๊ฐ€ ๋งค์šฐ ๋А๋ฆฌ๋‹ค๋ฉด ์‹คํŒจํ• ๊ฒƒ์ด๋‹ค.๊ทธ๋Ÿฌ๋‚˜ post 2.0 ์— RabbitMQ ๋Š” ๋А๋ฆฐ ๋ฐฐ์น˜ ์ปจ์Šˆ๋จธ๋ฅผ ํ•ธ๋“ค๋ง ๋˜๋Š”๊ฒŒ ์š”์ฒญ๋˜์–ด์กŒ๋‹ค.

โ€“ Kafka ์€ ์˜ค์ง ํ† ํ”ฝ๊ฐ™์€ exchanges ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.RabbitMQ ๋Š” ๋‹ค์–‘ํ•œ exchanges ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (ํ† ํ”ฝ/ํ ๋“ฑ)

โ€“ Kafka ๋Š” ํŒŒํ‹ฐ์…˜๋“ค ์•ˆ์—์„œ ๋ฉ”์„ธ์ง€ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํŒŒํ‹ฐ์…˜๋“ค๊ฐ„์— ์—„๊ฒฉํ•œ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค.์นดํ”„์นด ์ปจ์Šˆ๋จธ๋“ค์€ ์ถฉ๋ถ„ํžˆ ์Šค๋งˆํŠธํ•ด์•ผํ•˜๋ฉฐ ๊ทธ๋“ค ์Šค์Šค๋กœ ํŒŒํ‹ฐ์…˜๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ํ•ด๊ฒฐ(resolve) ํ•ด์•ผํ•œ๋‹ค.

โ€“ Kafka ๋Š” ๋””์Šคํฌ์ƒ์—์„œ ๋ฉ”์„ธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฐ์ดํƒ€ ์†์‹ค์„ ๋ง‰๊ธฐ์œ„ํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ทธ๋“ค์„ ๋ณต์ œํ•œ๋‹ค.๊ฐ๊ฐ์˜ ์„ฑ๋Šฅ์— ํฐ ๋ฌธ์ œ์—†์ด ๋ธŒ๋กœ์ปค๋Š” ํ…Œ๋ผ๋ฐ”์ดํŠธ๋ฅผ ํ•ธ๋“ค๋งํ• ์ˆ˜์žˆ๋‹ค.Kafka ๋Š” ์“ฐ๊ธฐ์— ์ดˆ๋‹น 200k ๋ฉ”์„ธ์ง€๋ฅผ ์ฝ๋Š”๋ฐ๋Š” 3M ๋ฉ”์„ธ์ง€๋ฅผ ์ œ๊ณต๋˜๋„๋ก ๋˜์–ด์—ˆ๋‹ค.

Kafka โ€“ ์ดˆ๋‹น 100k ์ด์ƒ์˜ ๋ถˆ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ ํ•˜๋ ค๋ฉด ์ด์šฉํ•ด๋ผ. โ€“ ์˜จ๋ผ์ธ์ด๋‚˜ ๋ฐฐ์น˜๋กœ ํŒŒํ‹ฐ์…˜๋œ ์ˆœ์„œ๋กœ ์ ์–ด๋„ ํ•œ๋ฒˆ์€ ๋ฐฐ๋‹ฌ๋  ํ•„์š”๊ฐ€์žˆ์„๋•Œ

โ€“ ๋ฉ”์„ธ์ง€๋ฅผ ๋‹ค์‹œ ์ฝ์„ ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ๋„ ์‚ฌ์šฉํ•ด๋ผ.๋˜ํ•œ ๋…ธ๋“œ๋ ˆ๋ฒจ HA ๋กœ ํ๋ฆ„์ œํ•œ์„ ๋‹ค๋ฃฐ์ˆ˜์žˆ์„๊ฒƒ์ด๋‹ค.

RabbitMQ

โ€“ ์ดˆ๋‹น 20+ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปจ์Šˆ๋จธ(worker)์—๊ฒŒ ๋ผ์šฐํŠธ ํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋ผ.

โ€“ ๋ฉ”์„ธ์ง€๋‹น ์ „๋‹ฌ๋ณด์žฅ์„ ํ•ด์ค„ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ ์‚ฌ์šฉํ•˜๋ผ.

โ€“ ๋ฐฐ๋‹ฌ ์ˆœ์„œ๋Š” ๋ณ„๋กœ ๊ด€์—ฌ์น˜ ์•Š์„๋•Œ ์‚ฌ์šฉํ•˜๋ผ.(์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ฒŒ ๋„ ํ• ์ˆ˜์žˆ๋‹ค)

โ€“ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋ ˆ๋ฒจ์˜ HA ๊ฐ€ ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ผ.

https://pegasuskim.wordpress.com/2016/05/13/apache-kafka์™€-rabbitmq-์˜-์ฐจ์ด/#:~:text=โ€“ ์ฒ ํ•™์€ ์ข€ ๋‹ค๋ฅธ๋ฐ%2C ๊ธฐ๋ณธ์ ,ํŒŒํ‹ฐ์…”๋‹ํ•˜๋Š”๋ฐ ๊ธฐ๋ฐ˜์„ ๋‘”๋‹ค.

Spring์˜ Filter์™€ Interceptor์˜ ์ฐจ์ด์ ์„ ์•„๋Š”๊ฐ€?

https://supawer0728.github.io/images/spring-filter-interceptor/spring-request-lifecycle.jpg

  • Filter์™€ Interceptor๋Š” ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค.
  • Filter๋Š” Web Application์— ๋“ฑ๋ก์„ ํ•˜๊ณ , Interceptor๋Š” Spring์˜ Context์— ๋“ฑ๋ก์„ ํ•œ๋‹ค.
  • Filter๋Š” Servlet์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „ํ›„๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. (์„œ๋ธ”๋ฆฟ ์•ž๋‹จ์— ์œ„์น˜)
  • Interceptor๋Š” Handler๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์ „(preHandle), Handler๋ฅผ ์‹คํ–‰ํ•œ ํ›„(postHandle), view๋ฅผ ๋ Œ๋”๋งํ•œ ํ›„(afterCompletion) ๋“ฑ, Servlet๋‚ด์—์„œ๋„ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์‹คํ–‰ ์‹œ์ ์„ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ„๋‹ค. (์„œ๋ธ”๋ฆฟ ๋’ค์— ์œ„์น˜)

(Spring)Filter์™€ Interceptor์˜ ์ฐจ์ด

RDB์˜ ๋ฐ๋“œ๋ฝ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ๊ณผ ๊ต์ฐฉ์ƒํƒœ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

๊ต์ฐฉ์ƒํƒœ(Dead Lock)๋ž€?

์–ด๋–ค ์ง‘ํ•ฉ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์ด๋ฉฐ ์ด ์ง‘ํ•ฉ ๋‚ด์— ์žˆ๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด ์ง‘ํ•ฉ ๋‚ด์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฉด '๊ต์ฐฉ์ƒํƒœ' ๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ž‘์—… T1์€ ๋ฆฌ์†Œ์Šค R1 (R1์—์„œ T1๊นŒ์ง€์˜ ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ)์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ๊ฐ€์ง€๋ฉฐ ๋ฆฌ์†Œ์Šค R2์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ์š”์ฒญํ–ˆ๋‹ค (T1์—์„œ R2 ๋กœ์˜ ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ๋จ).
  • ์ž‘์—… T2๋Š” ์ž์› R2์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ๊ฐ€์ง€๋ฉฐ (R2์—์„œ T2 ๋กœ์˜ ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ๋จ) ์ž์› R1์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ์š”์ฒญํ–ˆ๋‹ค (T2์—์„œ R1 ๋กœ์˜ ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ๋จ).
  • ๋‘ ์ž‘์—…์€ ์ž์›์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ Task๊ฐ€ ๊ณ„์† ๋  ๋•Œ๊นŒ์ง€ ์ž์›์„ ํ•ด์ œ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ์— ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

https://t1.daumcdn.net/cfile/tistory/9912DF3359EE99C930

๊ต์ฐฉ ์ƒํƒœ์˜ ์กฐ๊ฑด

  1. ์ƒํ˜ธ๋ฐฐ์ œ(Mutual exclusion) : ํ”„๋กœ์„ธ์Šค๋“ค์ด ํ•„์š”๋กœ ํ•˜๋Š” ์ž์›์— ๋Œ€ํ•ด ๋ฐฐํƒ€์ ์ธ ํ†ต์ œ๊ถŒ์„ ์š”๊ตฌํ•œ๋‹ค.
  2. ์ ์œ ๋Œ€๊ธฐ(Hold and wait) : ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋œ ์ž์›์„ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  3. ๋น„์„ ์ (No preemption) : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์ž์›์˜ ์‚ฌ์šฉ์„ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๊ทธ ์ž์›์„ ๋บ์„ ์ˆ˜ ์—†๋‹ค.
  4. ์ˆœํ™˜๋Œ€๊ธฐ(Circular wait) : ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ˆœํ™˜์ ์œผ๋กœ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

DB ์˜ตํ‹ฐ๋งˆ์ด์ €์— ๋Œ€ํ•ด ์•„๋Š”๊ฐ€?

###์˜ตํ‹ฐ๋งˆ์ด์ €

  • ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ์˜ํ•œ SQL ๋ฌธ์— ๋Œ€ํ•ด ์ตœ์ ์˜ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ตœ์ ์˜ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์‹คํ–‰๊ณ„ํš(Execution Plan)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ์˜ ์‹คํ–‰์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ทœ์น™๊ธฐ๋ฐ˜(RBO, Rule Based Optimizer)์™€ ๋น„์šฉ๊ธฐ๋ฐ˜(CBO, Cost Based Optimizer) ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์น™๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €

  • ๊ทœ์น™(์šฐ์„  ์ˆœ์œ„)๋ฅผ ๊ฐ€์ง€๊ณ  ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•  ๋•Œ ์ฐธ์กฐํ•˜๋Š” ์ •๋ณด์—๋Š” ์ธ๋ฑ์Šค ์œ ๋ฌด, ์—ฐ์‚ฐ์ž, ๊ฐ์ฒด ๋“ฑ์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ORACLE ์˜ ๊ทœ์น™๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ˆœ์œ„์ด๋ฉฐ, ์ˆซ์ž๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.
  1. Single row by rowid

  2. Single row by clusterjoin

  3. Single row by hash cluster key with unique or primary key

  4. Single row by unique or primary key

  5. Cluster join

  6. Hash Cluster key

  7. Indexed cluster key

  8. Composite index

  9. Single column index

  10. Bounded range search on indexed columns

  11. Unbounded range search on indexed columns

  12. Sort merge join

  13. MAX or MIN of indexed column

  14. ORDER BY on indexed column

  15. Full table scan

์ด ์ค‘ ์ฃผ์š”ํ•œ ๊ทœ์น™์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋ฝํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. ROWID ๋ฅผ ํ†ตํ•ด์„œ ํ…Œ์ด๋ธ”์—์„œ ํ•˜๋‚˜์˜ ํ–‰์„ ์•ก์„ธ์Šค ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  2. ์œ ์ผ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด์„œ ํ•˜๋‚˜์˜ ํ–‰์„ ์•ก์„ธ์Šค ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ธ๋ฑ์Šค ์ ‘๊ทผ ํ›„ ์ธ๋ฑ์Šค์— ์กด์žฌํ•˜๋Š” ROWID ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ํ–‰์„ ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ณตํ•ฉ ์ธ๋ฑ์Šค์— ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

  4. ๋‹จ์ผ ์ปฌ๋Ÿผ์ธ๋ฑ์Šค์— = ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

  5. ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์ปฌ๋Ÿผ์— ์–‘์ชฝ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. BETWEEN ์ด๋‚˜ LIKE ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. LIKE ๋Š” '๋ฌธ์ž์—ด%' ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

  6. ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์ปฌ๋Ÿผ์— ํ•œ์ชฝ ๋ฒ”์œ„๋งŒ ํ•œ์ •ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  7. ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์•ก์„ธ์Šคํ•˜๋ฉด์„œ ์กฐ๊ฑด์ ˆ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ์„ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋น„์šฉ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €

  • SQL ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์ด ๊ฐ€์žฅ ์ ์€ ์‹คํ–‰๊ณ„ํš์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๋น„์šฉ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋น„์šฉ์„ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ทœ์น™๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”, ์ธ๋ฑ์Šค, ์ปฌ๋Ÿผ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด ํ†ต๊ณ„์ •๋ณด์™€ ์‹œ์Šคํ…œ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ†ต๊ณ„์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ ์ธ ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ •ํ™•ํ•œ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

https://t1.daumcdn.net/cfile/tistory/991602465BDBBC673B

๋Œ€์•ˆ ๊ณ„ํš ์ƒ์„ฑ๊ธฐ

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

๋น„์šฉ ์˜ˆ์ธก๊ธฐ

  • ๋Œ€์•ˆ ๊ณ„ํš ์ƒ์„ฑ๊ธฐ์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋œ ๋Œ€์•ˆ ๊ณ„ํš์˜ ๋น„์šฉ์„ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

์‹คํ–‰๊ณ„ํš

  • SQL ์—์„œ ์š”๊ตฌํ•œ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ์™€ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰๊ณ„ํš ํ˜•ํƒœ๋Š” ์กฐ์ธ์ˆœ์„œ, ์กฐ์ธ๊ธฐ๋ฒ•, ์•ก์„ธ์Šค ๊ธฐ๋ฒ•, ์ตœ์ ํ™” ์ •๋ณด, ์—ฐ์‚ฐ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์กฐ์ธ ๊ธฐ๋ฒ•์€ ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ NL, Hash, Sort Merge ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ก์„ธ์Šค ๊ธฐ๋ฒ•์€ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ์•ก์„ธ์Šค ํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, Table Access, Index Access ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ ํ™” ์ •๋ณด๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‹คํ–‰๊ณ„ํš์˜ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์˜ˆ์ƒ๋˜๋Š” ๋น„์šฉ ์‚ฌํ•ญ์„ ํ‘œ์‹œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://mozi.tistory.com/220