0725 ~ 0807


# 0725 ~ 0807

# 0727 - OOM ์ข…๋ฅ˜ ๋ฐ ์กฐ์น˜

OOM(Out Of Memory) : ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ํ˜„์ƒ

Heap image

  • Java 7 ๊นŒ์ง€์˜ Heap ๊ตฌ์กฐ, 8๋ถ€ํ„ฐ PermGen ๋ถ€๋ถ„์ด Metaspace๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
    • PermGen ์€ class ํ˜น์€ method ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์œผ๋กœ Heap์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
    • Metaspace๋Š” Classloader๊ฐ€ ๋กœ๋“œํ•œ class ๋“ค์˜ metadata๋ฅผ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ Heap์ด ์•„๋‹Œ Native ์˜์—ญ์— ์œ„์น˜์‹œํ‚จ๋‹ค.
    • ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ํด๋ž˜์Šค์˜ metadata๋ฅผ native ์˜์—ญ์œผ๋กœ ์˜ฎ๊น€์œผ๋กœ์จ OS๊ฐ€ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ
  • Runtime Data Area๋Š” JVM์ด OS๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งํ•˜๋ฉฐ ํฌ๊ฒŒ 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • Heap์€ ๋Ÿฐํƒ€์ž„์‹œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ์œผ๋กœ class๋ฅผ ์ด์šฉํ•ด instance๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Heap์— ์ €์žฅ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
    • ์‹œ์Šคํ…œ ์ž‘์—…๊ด€๋ฆฌ์ž์—์„œ ๋‚˜์˜ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ๋Š” ์ธก์ •์˜ ์ •ํ™•๋„๊ฐ€ ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค.
    • Runtime ํด๋ž˜์Šค์— totalMemory() - freeMemory()๋ฅผ ํ†ตํ•ด ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ
      • long freeMemory() : Returns the amount of free memory in the jvm.
      • long totalMemory() : Returns the total amount of memory in the jvm.
    • Jprobe ๋˜๋Š” Optimizeit์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ๋„๊ตฌ๋กœ ์ธก์ •
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ์š”์ธ
    • Java์—์„œ๋Š” GC์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž๋™ ๊ด€๋ฆฌ ๋˜์ง€๋งŒ memory leak๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฃจํŠธ ์ฐธ์กฐ๋“ค๋กœ๋ถ€ํ„ฐ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์ฐธ์กฐ๊ฐ€ ๋˜๋Š”(reachable) ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ JVM์€ ์ด๋Ÿฌํ•œ ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐํ•œ๋‹ค.
      • ๋ฃจํŠธ ์ฐธ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.
        • static ๋ณ€์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ
        • ํ˜„์žฌ ์ž๋ฐ” ์Šค๋ ˆ๋“œ ์Šคํƒ๋‚ด์˜ ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ
        • JNI ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ œ๊ฑฐ๋˜๋Š” JNI global ๊ฐ์ฒด ์ฐธ์กฐ
      • ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์˜ Reference๋ฅผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์žก๊ณ  ์žˆ์œผ๋ฉด GC์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ , ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ๋„ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ฒŒ ๋œ๋‹ค.
        • ์ƒํ˜ธ์ฐธ์กฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ์ž ์กฐ๋ฅผ null์ฒ˜๋ฆฌ ํ•ด์ฃผ์ง€ ์•Š๋Š” ์‹ค์ˆ˜
      • ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ OOM์ด ๋ฐœ์ƒํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋Š” ์‹ฌ๊ฐํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

OOME(Out Of Memory Error)

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

OOME ์ข…๋ฅ˜ ๋ฐ ์›์ธ

  • java.lang.OutOfMemoryError : Java heap space(Java ํž™ ๊ณต๊ฐ„)
    • ์›์ธ
      • ์ž๋ฐ” ํž™ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์•„๋‹Œ ์ง€์ •ํ•œ ํž™ ํฌ๊ธฐ(ํ˜น์€ ๊ธฐ๋ณธ ํฌ๊ธฐ)๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋ฐœ์ƒํ•œ๋‹ค.
      • ํ˜น์€, ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ธด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ finalize๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค. (finalize๋Š” ์†Œ๋ฉธ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋‚˜ GC์— ๋งˆํ‚นํ•˜๋Š” ๋ฐ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค)
    • ์กฐ์น˜
      • JVM Option์„ ํ†ตํ•ด Heap size๋ฅผ ๋Š˜๋ ค ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • java.lang.OutOfMemoryError : GC Overhaed limit exceeded(GC ์˜ค๋ฒ„ํ—ค๋“œ ํ•œ๋„ ์ดˆ๊ณผ)
    • ์›์ธ
      • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ด๋ฃจ์–ด์กŒ์ง€๋งŒ, ์ƒˆ๋กœ ํ™•๋ณด๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ์˜ 2% ๋ฏธ๋งŒ์ผ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
      • ๋” ์ด์ƒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • ์กฐ์น˜
      • ํž™ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฐ๋‹ค.
      • XX:-UseGCOverheadLimit ์„ ํƒ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ดˆ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ GC ์ œํ•œ ๋ช…๋ น์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • java.lang.OutOfMemoryError: Requested array size exceeds VM limit(์š”์ฒญ ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ VM ์ œํ•œ ์ดˆ๊ณผ)
    • ์›์ธ
      • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํ˜น์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” API)์ด ํž™ ๊ณต๊ฐ„๋ณด๋‹ค ํฐ ๋ฐฐ์—ด์„ ํ• ๋‹น์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
      • ํž™๊ณต๊ฐ„ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์€๊ฒฝ์šฐ
        • ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋”ํ•˜๋Š” ๋“ฑ ๋ฐฐ์—ด์„ ํ‚ค์šฐ๋Š” ๊ฒฝ์šฐ
  • java.lang.OutOfMemoryError: Metaspace
    • ์›์ธ
      • ์ž๋ฐ” ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์›์‹œ ๋ฉ”๋ชจ๋ฆฌ(=๋ฉ”ํƒ€ ๊ณต๊ฐ„)์— ํ• ๋‹น๋œ๋‹ค.
      • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋  ๋ฉ”ํƒ€ ๊ณต๊ฐ„์ด ๋ชจ๋‘ ์†Œ๋ชจ๋˜๋ฉด ๋ฐœ์ƒํ•œ๋‹ค.
      • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋  ๊ณต๊ฐ„์€ MaxMetaSpaceSize ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œํ•œ๋œ๋‹ค.
    • ์กฐ์น˜
      • MaxMetaSpaceSize ๊ฐ’์„ ๋Š˜๋ ค ์„ค์ •ํ•œ๋‹ค. ์ž๋ฐ” ํž™๊ณผ ๋™์ผํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์— ํ• ๋‹น๋œ๋‹ค.
      • ์ž๋ฐ” ํž™์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ” ํž™๊ณต๊ฐ„์— ์—ฌ์œ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
      • heap์˜์—ญ๊ณผ perm ์˜์—ญ์„ ๊ณผํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด, native ์˜์—ญ๊ณผ stack ์˜์—ญ์ด ์ ์€ ๊ณต๊ฐ„์œผ๋กœ ์„ค์ •๋˜์–ด ์ด ๋‘ ์˜์—ญ์˜ ๊ณต๊ฐ„๋ถ€์กฑ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?
    • ์›์ธ
      • ์ž๋ฐ” HotSpot VM ์ฝ”๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ํž™ ๊ณ ๊ฐˆ์ด ๋˜์–ด ๋„ค์ดํ‹ฐ๋ธŒ ํž™์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
      • ์ด ๋ฉ”์‹œ์ง€๋Š” ์‹คํŒจํ•œ ์š”์ฒญ์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์˜ ์ด์œ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋Œ€๊ฐœ์˜ ๊ฒฝ์šฐ ํ• ๋‹น์— ์‹คํŒจํ•œ ์†Œ์Šค ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
    • ์กฐ์น˜
      • ๋„ค์ดํ‹ฐ๋ธŒ ํž™ ๊ณ ๊ฐˆ์˜ ๊ฒฝ์šฐ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋กœ๊ทธ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋งต ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค.
      • ์ด๋Ÿฐ ์œ ํ˜•์€ ์šด์˜์ฒด์ œ์˜ ๋ฌธ์ œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • java.lang.OutOfMemoryError: Compressed class space(์••์ถ•๋œ ํด๋ž˜์Šค ๊ณต๊ฐ„)
    • ์›์ธ
      • 64๋น„ํŠธ ํ”Œ๋žซํผ์—์„œ ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ๋Š” 32๋น„ํŠธ ์˜คํ”„์…‹(UseCompressedOops)์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ์ด ๋ฐฉ์‹์€ UseCompressedClassPointers(๊ธฐ๋ณธ๊ฐ’ ํ™œ์„ฑํ™”, on)์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์ž‡์œผ๋ฉฐ ํ™œ์„ฑํ™”๋˜๋ฉด ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ๋‹ค.
      • UseCompressedClassPointers์— ํ•„์š”ํ•œ CompressedClassSpaceSize๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด java.lang.OutOfMemoryError: Compressed class space๋ฅผ ๋˜์ง„๋‹ค.
    • ์กฐ์น˜
      • CompressedClassSpaceSize ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๊ฑฐ๋‚˜ UseCompressedClassPointers๋ฅผ ๋น„ํ™œ์„ฑํ™” ์‹œํ‚จ๋‹ค.
  • java.lang.OutOfMemoryError: Reason stack_trace_with_native method
    • ์›์ธ
      • ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์€ ์›์‹œ ๋ฉ”์„œ๋“œ์—์„œ๋ถ€ํ„ฐ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์— ํ• ๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
      • ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์œ„์˜ ๋ฉ”์‹œ์ง€๋“ค๊ณผ ๋‹ค๋ฅธ ์ ์€ JVM ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ Java Native Interface(JNI) ๋˜๋Š” ์›์‹œ๋ฉ”์„œ๋“œ์—์„œ ํ• ๋‹น์‹คํŒจ๊ฐ€ ๊ฐ์ง€๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • ์กฐ์น˜
      • ์ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ์ ์„ ์ง„๋‹จํ•ด์•ผ ํ•œ๋‹ค.

# 0807 - Flyway

# Flyway๋ž€?

DB ์ด๋ ฅ์„ ํ˜•์ƒ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ์ด๋‹ค.

๋กœ์ปฌ, ์•ŒํŒŒ ๋“ฑ ๊ฐœ๋ฐœ DB์—์„œ ๋ณ€๊ฒฝํ•œ Schema, Index, Key ๋“ฑ์„ ๋ฒ ํƒ€, ์šด์˜ DB์— ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ์„ Flyway๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ๋„ In-Memory DB(H2, derby, Hsqldb ๋“ฑ)์— DB DDL์ด๋ ฅ์„ ์‹คํ–‰ํ•˜์—ฌ ์›๊ฒฉ๊ณผ ๊ฐ™์€ DB ํ˜•์ƒ์„ ์œ ์ง€ํ•œ ์ฑ„, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

flyway๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต์‹ ์‚ฌ์ดํŠธ์— ๋”ฐ๋ฅด๋ฉด gradle, maven, CLI, JAVA API๋“ฑ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# Flyway ์‚ฌ์šฉ๋ฒ•

# ์˜์กด์„ฑ ๋ฐ ํ™˜๊ฒฝ ์„ค์ •

flyway์˜ Java API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” org.flywaydb:flyway-core ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ํ•„์š”ํ•˜๋‹ค

implementation("org.flywaydb:flyway-core:6.5.7")

# yaml ํŒŒ์ผ ์„ค์ •

Spring Boot์—์„œ๋Š” flyway์— ๋Œ€ํ•œ autoconfigure๋ฅผ ์ง€์›ํ•œ๋‹ค.

spring:
  datasource:
    hikari:
      jdbc-url: jdbc:mariadb://localhost:3306/pika
      username: pika_app
      password: pika_password

  flyway:
    locations: classpath:/db/migration # migration ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•˜๋Š” directory
    sql-migration-suffixes: ddl        # ํŒŒ์ผ ํ™•์žฅ์ž
    baseline-on-migrate: true          # flyway_schema_history ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ• ์ง€ ์—ฌ๋ถ€ 
    baseline-version: 0                # ์ตœ์ดˆ ๋ฒ„์ „ ์ •๋ณด

# ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ

flyway์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ํ–‰์œ„๋ฅผ ๋ฉ”์ด๊ทธ๋ ˆ์ด์…˜(migration)์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌ๋˜์–ด ์ง„๋‹ค. ํŒŒ์ผ์˜ ์ด๋ฆ„์€ ์ง€์ •ํ•˜๋Š” ํ˜•์‹์ด ์กด์žฌํ•˜๋ฉฐ ์ด๋ฅผ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

image

  • Prefix : V, U, R ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅ V๋Š” Verion, U๋Š” undo, R์€ Repeatable์ด๋‹ค.
  • Version : ๋ฒ„์ „ ์ •๋ณด์ด๋‹ค. ์ •์ˆ˜, ์†Œ์ˆ˜, ๋‚ ์งœ ๋“ฑ์ด ๊ฐ€๋Šฅ
  • Seperator : __(underscore 2๊ฐœ๋ฅผ ์‚ฌ์šฉ)
  • Description : ์ถ”๊ฐ€๋˜๋Š” ์„ค๋ช…์ด๋‹ค. _๊ฐ€ space๋ฅผ ๋Œ€์‹ ํ•œ๋‹ค.

์˜ˆ) V0_create_table_user.sql, V1.1_create_table_game.sql, V20210909_create_table_screenshot.sql

Flyway๋กœ ๊ด€๋ฆฌ๋  SQL ํŒŒ์ผ์€ src/main/resources/db/migration ์œ„์น˜์— ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

# flyway_schema_history ํ…Œ์ด๋ธ”

image

  • version์€ ํŒŒ์ผ์˜ V๋’ค์— ๋ถ™์–ด์žˆ๋˜ ์ˆซ์ž๋กœ ๋‚ฎ์€ ์ˆœ์„œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋ฉฐ ์‹คํ–‰ ์ˆœ์„œ๋Œ€๋กœ ํ…Œ์ด๋ธ”์— ์Œ“์ด๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • checksum์€ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ hashingํ•œ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง€๋ฉด ์ด ์ฒดํฌ์„ฌ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ํ•œ๋ฒˆ ์ฒดํฌ์„ฌ์„ ๋งŒ๋“ค์–ด ๋‘” ํ›„ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํ˜•์ƒ๊ด€๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒป๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฒดํฌ์„ฌ์„ repair ํ•œ ํ›„ success๋ฅผ 0์œผ๋กœ ๋Œ๋ฆฌ๋Š”๋“ฑ์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. (flyway๋กœ ๋“ฑ๋ก๋œ ์ˆœ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ flyway๊ฐ€ DB๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •, ์‚ญ์ œํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)
  • success๋Š” ํŒŒ์ผ ์‹คํ–‰์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๋‹ค.
Last update: September 13, 2022 21:44
Contributors: ahnjs