week 2 incheol - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ˆ  ๋ฌธ์ œ

JAVA (์žฅ์ง€์ˆ˜)

  • ์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™๊ธฐํ™”๋˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

    • ์“ฐ๋ ˆ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

      1. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. (run() ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค)

        Runnable์€ย run( ) ์ด๋ผ๋Š”ย ๋‹จ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค Runnable ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์“ฐ๋ ˆ๋“œ๋กœ ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜๋Š” ์—†๋‹ค.ย Thread ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•ด์ฃผ์–ด์•ผ๋งŒ ํ•œ๋‹ค.ย 

      2. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.

        Thread ํด๋ž˜์Šค๋Š” ๋งŽ์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ๋งŒ๋“  ํด๋ž˜์Šค๋Š” start()๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.ย ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” start()์ด๋ฉฐ,ย ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘ํ•˜๋ฉด ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” run()์ด๋‹ค.

    • ๋™๊ธฐํ™” ๊ณผ์ •

      • ???
  • hashCode() ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”? hashcode()์™€ equls()๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€?

    hashcode()์™€ equals()๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    • hashcode() : ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•  ํ•˜๋‚˜์˜ ์ •์ˆ˜๊ฐ’์„ ๋งํ•œ๋‹ค.(๋™์ผ์„ฑ ๋น„๊ต์— ์‚ฌ์šฉ)
    • equals() : ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•œ๋‹ค(๋™๋“ฑ์„ฑ)
    • equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค. String ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ equlas() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๊ณ  ์žˆ์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    hashCode()๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ฐ€?

    equals๋Š” ํ•„๋“œ ์ „์ฒด๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋А๋ฆฌ๋‹ค. ๊ทธ์— ๋น„ํ•ด ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ์ • ๊ณ„์‚ฐ๊ณผ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์˜ ๋น„๊ต๋งŒ์œผ๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด ๋น„๊ต๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— HashMap์ด๋‚˜ HashSet์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์„ ์‚ฌ์šฉํ•œ๋‹ค.

    • ํ•ด์‹œ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.
    • ํ•ด์‹œ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ์— ํ•œํ•ด euqals ๋ฉ”์„œ๋“œ๋กœ ๋น„๊ตํ•œ๋‹ค.

    https://i.imgur.com/dShPCEh.png

    HashMap์ด๋‚˜ HashSet์—์„œ hashcode๊ฐ€ ๋™์ผํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๊ฐ€?

    • jdk 8 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” hashcode index๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ linked-list๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ jdk8 ์ดํ›„์—๋Š” ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋ฉด red-black-tree๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.

    ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋Š” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ๋˜๊ณ  ๊ทธ ๊ธฐ์ค€์œผ๋กœ ์ •ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    • linked list์™€ red-black-tree๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€์€ ๋™์ผํ•œ index์— ๋ชจ์ธ entity ๊ฐœ์ˆ˜๊ฐ€ 8๋ณด๋‹ค ํด ๊ฒฝ์šฐ์— tree๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 6๊ฐœ ๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ์—” linked list๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    • 6๊ฐœ์™€ 8๊ฐœ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ๋ณ€ํ™˜ํ•˜๋Š” ์„ฑ๋Šฅ์ƒ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์—ˆ๋‹ค.
  • ํŒจ๋Ÿฌ๋ŸดGC, G1GC์˜ ์ฐจ์ด์  ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

    Parallel GC

    JDK 8 ์ด์ „์— ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋˜ GC๋กœ Serial GC์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ•œ ๋ฐฉ์‹์ด๋‹ค. Minor GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋Š˜๋ ค ์ข€ ๋” ๋น ๋ฅธ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ ๋ฐฉ์‹์ด๋‹ค.

    Serial GC ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€?

    Serial GC๋Š” Mark-Sweep-Compaction ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

    Mark-Sweep-Compaction ๋ฐฉ์‹์ด๋ž€?

    • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ฐœํ•˜๋Š” ์ž‘์—…(Mark)
    • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…(Sweep)
    • ํŒŒํŽธํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์ž‘์—…(Compaction)

    G1 GC

    JDK 8๋ถ€ํ„ฐ๋Š” G1 GC๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. GC์˜ ๋Œ€์ƒ ์˜์—ญ์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ region์œผ๋กœ ๋‚˜๋‰˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์ „์ฒด heap์— ๋Œ€ํ•ด์„œ GC๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ถ€ region์—์„œ๋งŒ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    ์ „์ฒด heap์— ๋Œ€ํ•ด์„œ GC๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ์ผ๋ถ€ region์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ heap์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์œ ๋ฆฌํ•˜๋‹ค.

SPRING (์ด๊ฒฝํฌ)

  • Spring์˜ AOP์˜ ํŠน์ง•๊ณผ ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ๋œ proxy ํŒจํ„ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    AOP๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

    AOP๋Š” ๊ณตํ†ต์˜ ๊ด€์‹ฌ์‚ฌ(aspect)๋ฅผ ์ถ”์ƒํ™”ํ•ด ์ž˜ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์— ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜์—ฌ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

    ์Šคํ”„๋ง์—์„œ๋Š” ๊ณตํ†ต์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ถ”์ƒํ™”ํ•ด ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์–ด๋“œ๋ฐ”์ด์Šค(Advice)๋ผ๊ณ  ํ•˜๊ณ , ์ด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ํƒ€๊นƒ ๊ตฌํ˜„์ฒด์—์„œ ์ ์šฉ๋  ์‹œ์ ์„ ํฌ์ธํŠธ์ปท(PointCut)์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

    ์Šคํ”„๋ง์€ AOP๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋œ๋‹ค.

    • JDK Dynamic Proxy : java.lang.reflect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด์„œ๋งŒ ํ”„๋ก์‹œ๋ฅผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ concreate class์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • CGLIB : Code Generator Library์˜ ์•ฝ์ž๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋นˆ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
      • ํด๋ž˜์Šค์—์„œ๋„ AOP๋ฅผ ์ ์šฉํ• ์ˆ˜ ์žˆ์–ด์„œ ์žฅ์ ์ด ์žˆ๋‹ค.
      • Final class์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜๋Š” ๋ฌด์—‡์ด ์žˆ์„๊นŒ?

    • @Around : ํƒ€์ผ“์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์ด์ „๊ณผ ์ดํ›„ ์‹œ์ ์— ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • @Before : ํƒ€๊ฒŸ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ด์ „ ์‹œ์ ์— ์‚ฌ์šฉํ•œ๋‹ค.
    • @AfterReturning : ํƒ€๊ฒŸ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ์ดํ›„ ์‹œ์ ์— ์‚ฌ์šฉํ•œ๋‹ค.
    • @AfterThrowing : ํƒ€๊ฒŸ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ๋œ ์ดํ›„ ์‹œ์ ์— ์‚ฌ์šฉํ•œ๋‹ค.
    • @After : ํƒ€๊ฒŸ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ ๋˜๋Š” ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒฝ์šฐ ๋‘ ์ผ€์ด์Šค ๋ชจ๋“  ์‹œ์ ์— ์‚ฌ์šฉํ•œ๋‹ค.

    ํ”„๋ก์‹œ ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

    AOP์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก์‹œ์™€ ๋””์ž์ธ ํŒจํ„ด์˜ ํ”„๋ก์‹œ ํŒจํ„ด์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

    • ํ”„๋ก์‹œ : ํด๋ผ์ด์–ธํŠธ์™€ ์‚ฌ์šฉ ๋Œ€์ƒ ์‚ฌ์ด์— ๋Œ€๋ฆฌ ์—ญํ• ์„ ๋งก์€ ์˜ค๋ธŒ์ ํŠธ (ํ”„๋ก์‹œ๋Š” ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ๋ชจ๋‘ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค)
    • ํ”„๋ก์‹œ ํŒจํ„ด : ํƒ€๊นƒ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜๋ ค๋Š” ๋ชฉ์ 

    ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

    ์‚ฌ์šฉ์˜ ๋ชฉ์ ์ด ๊ธฐ๋Šฅ์˜ ๋ถ€๊ฐ€์ธ์ง€, ์ ‘๊ทผ ์ œ์–ด์ธ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•ด๋ณด๋ฉด ๊ฐ๊ฐ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ํ”„๋ก์‹œ๊ฐ€ ์‚ฌ์šฉ๋๋Š”์ง€, ๊ทธ์— ๋”ฐ๋ผ ์–ด๋–ค ํŒจํ„ด์ด ์ ์šฉ๋๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    • ์ ‘๊ทผ ์ œ์–ด โ†’ ํ”„๋ก์‹œ ํŒจํ„ด
    • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ โ†’ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
  • ์Šคํ”„๋ง์—์„œ @Transactional์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ์–ด๋–ค ์˜ต์…˜์ด ์žˆ๋Š”๊ฐ€?

    2. ๋™์ž‘ ์›๋ฆฌ

    @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

    ํŠธ๋žœ์žญ์…˜์€ย Spring AOP๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

    ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ AOP๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. (import๋ฌธ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค)

    import org.springframework.transaction.annotation.Transactional;
    

    ๋”ฐ๋ผ์„œ,ย ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค

    • ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ์— @Transactional์ด ์„ ์–ธ๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์— ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ
    • ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” @Transactional์ด ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  Commit or Rollback์„ ์ˆ˜ํ–‰
    • CheckedException or ์˜ˆ์™ธ๊ฐ€ ์—†์„ ๋•Œ๋Š” Commit
    • UncheckedException์ด ๋ฐœ์ƒํ•˜๋ฉด Rollback

    3. ์ฃผ์˜์ 

    1) ์šฐ์„ ์ˆœ์œ„

    @Transactional์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์— ์„ ์–ธ๋œ ํŠธ๋žœ์žญ์…˜์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ํŠธ๋žœ์žญ์…˜์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ๋‹ค.

    ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ -> ํด๋ž˜์Šค -> ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์†Œ๋“œ -> ์ธํ„ฐํŽ˜์ด์Šค
    

    ๋”ฐ๋ผ์„œ ๊ณตํ†ต์ ์ธ ํŠธ๋žœ์žญ์…˜ ๊ทœ์น™์€ ํด๋ž˜์Šค์—, ํŠน๋ณ„ํ•œ ๊ทœ์น™์€ ๋ฉ”์„œ๋“œ์— ์„ ์–ธํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋˜ํ•œ, ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๋‹ค๋Š” ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ๊ณ ํ•œ๋‹ค.

    • ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ย ์ธํ„ฐํŽ˜์ด์Šค์˜ย ๋ฉ”์„œ๋“œ์—ย ์ ์šฉํ• ย ์ˆ˜ย ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ์—์„œ๋งŒ ์œ ํšจํ•œ ํŠธ๋žœ์žญ์…˜ ์„ค์ •์ด ๋œ๋‹ค.
    • ์ž๋ฐ” ์–ด๋…ธํ…Œ์ด์…˜์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—ย ํด๋ž˜์Šคย ๊ธฐ๋ฐ˜ย ํ”„๋ก์‹œย orย AspectJย ๊ธฐ๋ฐ˜์—์„œย ํŠธ๋žœ์žญ์…˜ย ์„ค์ •์„ย ์ธ์‹ย ํ• ย ์ˆ˜ย ์—†๋‹ค.

    2) ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“œ

    @Transactional์€ Proxy Mode์™€ AspectJ Mode๊ฐ€ ์žˆ๋Š”๋ฐย Proxy Mode๊ฐ€ Default๋กœ ์„ค์ •๋˜์–ด์žˆ๋‹ค.

    Proxy Mode๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • ๋ฐ˜๋“œ์‹œ public ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜์–ด์•ผํ•œ๋‹ค.
      • Protected, Private Method์—์„œ๋Š” ์„ ์–ธ๋˜์–ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋™์ž‘ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค.
      • Non-Public ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด AspectJ Mode๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
    • @Transactional์ด ์ ์šฉ๋˜์ง€ ์•Š์€ Public Method์—์„œ @Transactional์ด ์ ์šฉ๋œ Public Method๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ”„๋ง์—์„œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    https://k.kakaocdn.net/dn/cAp74D/btqAWyBRZsE/Lk6EL0R680ykd45G6A5rK1/img.png

    ์œ„ ๊ทธ๋ฆผ์˜ ๋™์ž‘ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ธ์ฆ ์š”์ฒญ(Http Request)

    2. AuthenticationFilter๊ฐ€ ์ด ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐ€๋กœ์ฑˆ ์ •๋ณด๋ฅผ ํ†ตํ•ด UsernamePasswordAuthenticationToken์ด๋ผ๋Š” ์ธ์ฆ์šฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    3.ย AuthenticationManager์˜ ๊ตฌํ˜„์ฒด์ธย ProviderManager์—๊ฒŒ UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์‹œ AuthenticationProvider์— UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    2. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” UserDetailsService์— ์‚ฌ์šฉ์ž ์ •๋ณด(์•„์ด๋””)๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.

    3. ๋„˜๊ฒจ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ†ตํ•ด DB์—์„œ ์ฐพ์€ ์‚ฌ์šฉ์ž ์ •๋ณด์ธ UserDetails ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋•Œ UserDetails ๋Š” ์ธ์ฆ์šฉ ๊ฐ์ฒด์™€ ๋„๋ฉ”์ธ์šฉ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ธ์ฆ์šฉ ๊ฐ์ฒด์— ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

    4. AuthenticationProvider๋Š” UserDetails๋ฅผ ๋„˜๊ฒจ๋ฐ›๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    5. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ถŒํ•œ ๋“ฑ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์€ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. ๋‹ค์‹œ ์ตœ์ดˆ์˜ AuthenticationFilter์— Authentication ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

    7. Authentication ๊ฐ์ฒด๋ฅผ SecurityContext์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    ์ตœ์ข…์ ์œผ๋กœ SecurityContextHolder๋Š” ์„ธ์…˜ ์˜์—ญ์— ์žˆ๋Š” SecurityContext์—ย Authentication ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์— ์‚ฌ์šฉ์ž์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ „ํ†ต์ ์ธ ์„ธ์…˜-์ฟ ํ‚ค ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

DATABASE/SQL (์ •์ธ์ฒ )

  • SQL์˜ HINT๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

    SQL ํžŒํŠธ๋ž€?

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

    ํžŒํŠธ์˜ ํŠน์ง• ๋„ค๊ฐ€์ง€

    • ์‹คํ–‰ ๊ณ„ํš์„ ์ œ์–ดํ•œ๋‹ค.
    • ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. (ํžŒํŠธ์˜ ์‹œ์ž‘ /* ์™€ */ ์€ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.)
    • ์„ ํƒ ๋˜๋Š” ์ทจ์†Œ ๋  ์ˆ˜ ์žˆ๋‹ค. (ํžŒํŠธ์˜ ๋ฌธ๋ฒ•์ด ์˜ฌ๋ฐ”๋ฅด๋”๋ผ๋„ ํžŒํŠธ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ๋ฒ„๋ ค์งˆ ์ˆ˜๋„ ์žˆ๊ณ  ์„ ํƒ๋˜์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.)
    • ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํžŒํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ฒ„์ „์—…์ด ๋ ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์ถ”๊ฐ€๋œ๋‹ค.

    ํžŒํŠธ์˜ ์ข…๋ฅ˜ (MYSQL ๊ธฐ์ค€)

    • STRAIGHT_JOIN : ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ์กฐ์ธ์‹œ ์กฐ์ธ์ˆœ์„œ๋ฅผ from์˜ ์ˆœ์„œ๋Œ€๋กœ Access
    • USE INDEX / FORCE INDEX / IGNORE INDEX : ์ธ๋ฑ์Šค ์‚ฌ์šฉ/๊ฐ•์ œ/๋ฌด์‹œ
    • SQL_CACHE / SQL_NO_CACHE : ์กฐํšŒ๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ ์บ์‹œ์— ์„ ํƒ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • SQL_CALC_FOUND_ROWS : SQL_CALC_FOUND_ROWS ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ limit ์ ˆ๊ณผ๋Š” ์ƒ๊ด€์—†์ด ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๊ฒฐ๊ณผ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ช‡๊ฑด์ด๋‚˜ ๋˜๋Š”์ง€ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ ‡์น˜๋งŒ ์‚ฌ์šฉ์ž ์—๊ฒŒ๋Š” Limit ์ ˆ์— ์ œํ•œ๋œ ๊ฑด์ˆ˜ ๋งŒํผ๋งŒ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • FOUND_ROWS : FOUND_ROWS๋Š” ์ง์ „ ์ฟผ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ row ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • memcached๋ณด๋‹ค redis์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์€?

    ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

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

    ์ฟ ํ‚ค์™€ ์„ธ์…˜์€ ๋ฌด์—‡์ด์ง€?

    ์ฟ ํ‚ค

    ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๊ณ , ํ†ต์‹ ํ•  ๋•Œย HTTP ํ—ค๋”์— ํฌํ•จ๋˜๋Š”ย ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ

    ์ด๋ฆ„, ๊ฐ’ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„(์ง€์ • ๊ฐ€๋Šฅ), ๊ฒฝ๋กœ ์ •๋ณด๊ฐ€ ์žˆ๊ณ  ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค

    ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ฟ ํ‚ค์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ ->ย ๋ณด์•ˆ์„ฑ์ด ๋‚ฎ๋‹ค!

    ์„ธ์…˜

    ์„œ๋ฒ„'์— ์ €์žฅ๋˜๋Š” ์ฟ ํ‚ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ํ†ต์‹  ์ƒํƒœ. ์ฃผ๋กœ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ์‹œ ์‚ฌ์šฉ

    ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์œ ์ง€ ๋จ

    ์‚ฌ์šฉ์ž ๋กœ์ปฌ์ด ์•„๋‹Œย ์„œ๋ฒ„์— ์ง์ ‘ ์ €์žฅ๋˜๋ฏ€๋กœ, ์„ธ์…˜ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›€ย -> ๋ณด์•ˆ์„ฑ์ด ๋น„๊ต์  ๋†’์Œ

    Redis๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    • ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. String, Set, Sorted Set, Hash List ๋“ฑ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ๋Š” JSON ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ์ง€์›ํ•œ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””์Šคํฌ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์‹œ ์œ ์šฉํ•˜๋‹ค.
    • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋‹ค์–‘ํ•œ Eviction ์ •์ฑ…์„ ํ†ตํ•ด ์„ธ๋ฐ€ํ•œ Eviction ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

    ์™œ Redis์—์„œ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ• ๊นŒ?

    • Redis์˜ Copy on Write๊ฐ€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ด์œ 
    • ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜, ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ์ง€์šฐ๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค. ์ด๋•Œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ˆ˜์ •ํ•œ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Redis์—์„œ๋Š” ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    Memcached๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • ์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ์— "Single Thread์ธ Redis์— ๋น„ํ•ด Memcached๋Š” Multi Thread๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ Scale up์— ์œ ๋ฆฌํ•˜๋‹ค"๋ผ๊ณ  ๋‚˜์™€์žˆ๋Š”๋ฐ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ์Šค์ผ€์ผ์—…์˜ ์ƒ๊ด€๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”์„ฑ์ด ์žˆ๊ฒ ๋‹ค.
    • Redis ๋ณด๋‹ค ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.
    • Redis์™€ Memcached ์‚ฌ์ด์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์บ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. Memcached๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์œ ๋ฆฌํ•˜๋‹ค. Redis๋Š” Copy-on-Write ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.

    Redis์™€ Memcached ์žฅ๋‹จ์ 

    Redis > Memcached

    1. ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    String๋งŒ ์ง€์›ํ•˜๋Š” Memcached์— ๋น„ํ•ด Redis๋Š” ๋”์šฑ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋” ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Memcached์— ๋น„ํ•ด Redis๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

    2. ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    ํ”„๋กœ์„ธ์Šค์˜ ๋Œ๋ฐœ ์ข…๋ฃŒ, ์„œ๋ฒ„ ์ข…๋ฃŒ ๋“ฑ ๋Œ๋ฐœ ์ƒํ™ฉ์—์„œ Memcached๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์ง€๋งŒ, Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Disk์—๋„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์œ ์‹ค๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    3. ๋‹ค์–‘ํ•œ Data Eviction ์ •์ฑ…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    Memcached๋Š” LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•œ Eviction์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Redis๋Š” 6๊ฐ€์ง€ Eviction์ •์ฑ…์„ ํ†ตํ•ด ๋”์šฑ ์„ธ๋ฐ€ํ•œ Eviction ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    Memcached > Redis

    1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    Single Thread์ธ Redis์— ๋น„ํ•ด Memcached๋Š” Multi Thread๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ Scale up์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    2. Redis์— ๋น„ํ•ด ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

    HTML๊ณผ ๊ฐ™์€ ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ์—๋Š” Memcached๊ฐ€ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Redis๋Š” Copy&Write ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (Isolation Level) ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.

    ํŠธ๋žœ์žญ์…˜์ด ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ACID

    • ์›์ž์„ฑย (Atomicity) : ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ ์ž‘์—…๋“ค์€ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๋ชจ๋‘ ์„ฑ๊ณต ๋˜๋Š” ๋ชจ๋‘ ์‹คํŒจ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ์ผ๊ด€์„ฑย (Consistency) : ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐ์ดํƒ€๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด DB์—์„œ ์ •ํ•œ ๋ฌด๊ฒฐ์„ฑ ์กฐ๊ฑด์„ ํ•ญ์ƒ ๋งŒ์กฑ.
    • ๊ฒฉ๋ฆฌ์„ฑย (Isolation) : ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌ ํ•ด์•ผํ•œ๋‹ค.
    • ์ง€์†์„ฑย (Durability) : ํŠธ๋žœ์žญ์…˜์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ์น˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

    ๊ฒฉ๋ฆฌ์„ฑ ๊ด€๋ จ ๋ฌธ์ œ์ 

    (1) Dirty Read

    ํ•œ ํŠธ๋žœ์žญ์…˜(T1)์ด ๋ฐ์ดํƒ€์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ 'A'์—์„œ 'B'๋กœย ๋ณ€๊ฒฝํ–ˆ๊ณ  ์•„์ง ์ปค๋ฐ‹์„ ํ•˜์ง€ ์•Š์•˜์„๋•Œ,ย ๋‹ค๋ฅธย ํŠธ๋žœ์žญ์…˜(T2)์ด ํ•ด๋‹น ๋ฐ์ดํƒ€๋ฅผ Read ํ•˜๋ฉด?

    T2๊ฐ€ ์ฝ์€ ๋ฐ์ดํƒ€๋Š” B๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ T1์ด ์ตœ์ข… ์ปค๋ฐ‹์„ ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋œ๋‹ค๋ฉด,ย T2๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํƒ€๋Š” ๊ผฌ์ด๊ฒŒ ๋œ๋‹ค.

    (2) Non-Repeatable Read

    ํ•œ ํŠธ๋žœ์žญ์…˜(T1)์ด ๋ฐ์ดํƒ€๋ฅผย Readย ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜(T2)๊ฐ€ ๋ฐ์ดํƒ€์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝ ๋˜๋Š”, ๋ฐ์ดํƒ€๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ปค๋ฐ‹์„ ๋•Œ๋ ค๋ฒ„๋ฆฌ๋ฉด?

    ๊ทธ ํ›„ T1์ด ๋‹ค์‹œ ํ•ด๋‹น ๋ฐ์ดํƒ€๋ฅผ Readํ•˜๊ณ ์ž ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํƒ€ ํ˜น์€ ์‚ฌ๋ผ์ง„ ๋ฐ์ดํƒ€๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค.

    (3) Phantom Read

    ํŠธ๋žœ์žญ์…˜(T1) ์ค‘์— ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํƒ€๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค. ์ด๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜(T2)๊ฐ€ ์ ‘๊ทผํ•ด ํ•ด๋‹น ์กฐ๊ฑด์˜ ๋ฐ์ดํƒ€ ์ผ๋ถ€๋ฅผ ์‚ญ์ œ ๋˜๋Š” ์ถ”๊ฐ€ ํ–ˆ์„๋•Œ, ์•„์ง ๋๋‚˜์ง€ ์•Š์€ย T1์ด ๋‹ค์‹œ ํ•œ๋ฒˆ ํ•ด๋‹น ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํƒ€๋ฅผ ์กฐํšŒ ํ•˜๋ฉด T2์—์„œ ์ถ”๊ฐ€/์‚ญ์ œ๋œ ๋ฐ์ดํƒ€๊ฐ€ ํ•จ๊ป˜ ์กฐํšŒ/๋ˆ„๋ฝ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  T2๊ฐ€ ๋กค๋ฐฑ์„ ํ•˜๋ฉด? ๋ฐ์ดํƒ€๊ฐ€ ๊ผฌ์ธ๋‹ค

    ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€

    ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์—, ANSIํ‘œ์ค€์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์„ฑ๊ณผ ๋™์‹œย ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ Trade-off๋ฅผ ๋‘๊ณ  4๋‹จ๊ณ„ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ๋‚˜๋ˆ„์—ˆ๋‹ค. ๋‚ด๋ ค๊ฐˆ์ˆ˜๋ก ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์•„์ ธ์„œ ์–ธ๊ธ‰๋œ ์ด์Šˆ๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง„๋‹ค.

    ์ฐธ๊ณ ๋กœ, ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฝ(Lock)์ด ๊ฑธ๋ฆฌ๋Š”๋ฐ, SELECT ์‹œ์—๋Š”ย ๊ณต์œ  ๋ฝ, CREATE/INSERT/DELETE ์‹œ์—๋Š” ๋ฐฐํƒ€์  ๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค

    (1) Read Uncommitted

    ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํƒ€์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํƒ€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์ด ์ˆ˜์ค€์€ ๋‹น์—ฐํžˆ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ฐœ์ƒ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ๋Œ€์‹ , ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๊ฐ€์žฅ ๋†’๋‹ค.

    • ๋ฐœ์ƒ ๋ฌธ์ œ์  : Dirty Read, Non-Repeatable Read, Phantom Read

    (2) Read Committed

    ์ปค๋ฐ‹์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํƒ€๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    Dirty Read๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๋Š” ์—†์œผ๋‚˜, Read Uncommitted ์ˆ˜์ค€๋ณด๋‹ค ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง„๋‹ค.ย  ๋Œ€์‹  Non-Repeatable Read ๋ฐ Phantom Read๋Š” ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•˜๋‹ค.๋ฐ์ดํƒ€๋ฒ ์ด์Šค๋“ค์€ ๋ณดํ†ต Read Committed๋ฅผ ๋””ํดํŠธ ์ˆ˜์ค€์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

    • ๋ฐœ์ƒ ๋ฌธ์ œ์  :ย Non-Repeatable Read, Phantom Read

    (3) Repeatable Read

    ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ๋ฒˆ ์กฐํšŒํ•œ ๋ฐ์ดํƒ€๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•ด๋„ ๊ฐ™์€ ๋ฐ์ดํƒ€๊ฐ€ ์กฐํšŒ ๋œ๋‹ค

    ์ด๋Š” ๊ฐœ๋ณ„ ๋ฐ์ดํƒ€ ์ด์Šˆ์ธ Dirty Read๋‚˜ Non-Repeatable Read๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” Phantom Read๋Š” ๋ฐœ์ƒ๊ฐ€๋Šฅํ•˜๋‹ค.

    • ๋ฐœ์ƒ ๋ฌธ์ œ์  : Phantom Read

    (4) Serializable

    ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

    ์œ„ 3๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋ชจ๋‘ ์ปค๋ฒ„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.