Skip to content

Latest commit

ย 

History

History
591 lines (531 loc) ยท 39.9 KB

db.md

File metadata and controls

591 lines (531 loc) ยท 39.9 KB

4. Database

๐Ÿ“– Contents


๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ’€

  • Connection Pool
    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Connection์ด ํ•„์š”ํ•˜๋‹ค.
    • Connection pool์€ ์ด๋Ÿฐ Connection์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด ๋‘์–ด ์ €์žฅํ•ด ๋†“์€ ๊ณต๊ฐ„(์บ์‹œ), ๋˜๋Š” ์ด ๊ณต๊ฐ„์˜ Connection์„ ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด ์“ฐ๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.
  • DB์— ์ ‘๊ทผํ•˜๋Š” ๋‹จ๊ณ„
    1. ์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ DB์™€ ์—ฐ๊ฒฐ๋œ Connection ๊ฐ์ฒด๋“ค์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ pool์— ์ €์žฅํ•œ๋‹ค.
    2. DB์— ์š”์ฒญ ์‹œ, pool์—์„œ Connection ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ DB์— ์ ‘๊ทผํ•œ๋‹ค.
    3. ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ pool์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Connction์ด ๋ถ€์กฑํ•˜๋ฉด?
    • ๋ชจ๋“  ์š”์ฒญ์ด DB์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ๊ณ  ๋‚จ์€ Conncetion์ด ์—†๋‹ค๋ฉด, ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜์‹œํ‚ค๊ณ  Pool์— Connection์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค.
  • ์™œ ์‚ฌ์šฉํ• ๊นŒ?
    • ๋งค ์—ฐ๊ฒฐ๋งˆ๋‹ค Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†Œ๋ฉธ์‹œํ‚ค๋Š” ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ Connection ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, DB ์ ‘๊ทผ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.
    • DB์— ์ ‘๊ทผํ•˜๋Š” Connection์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ, ๋ฉ”๋ชจ๋ฆฌ์™€ DB์— ๊ฑธ๋ฆฌ๋Š” ๋ถ€ํ•˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Thread Pool
    • ๋น„์Šทํ•œ ๋งฅ๋ฝ์œผ๋กœ Thread pool์ด๋ผ๋Š” ๊ฐœ๋…๋„ ์žˆ๋‹ค.
    • ์ด ์—ญ์‹œ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Thread๋ฅผ ๋งŒ๋“œ๋Š”๊ฒƒ์ด ์•„๋‹Œ, ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ pool ๋‚ด์˜ Thread๋ฅผ ์†Œ๋ฉธ์‹œํ‚ค์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์ž์›์„ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•.
  • Thread Pool๊ณผ Connection pool
    • WAS์—์„œ Thread pool๊ณผ Connection pool๋‚ด์˜ Thread์™€ Connection์˜ ์ˆ˜๋Š” ์ง์ ‘์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ํ•  ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ ์œ ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฐ˜๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ ๊ฒŒ ์ง€์ •ํ•œ๋‹ค๋ฉด, ์„œ๋ฒ„์—์„œ๋Š” ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
    • ๋ณดํ†ต WAS์˜ Thread์˜ ์ˆ˜๊ฐ€ Conncetion์˜ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ๊ฒƒ์ด ์ข‹์€๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ชจ๋“  ์š”์ฒญ์ด DB์— ์ ‘๊ทผํ•˜๋Š” ์ž‘์—…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

์ •๊ทœํ™” 1์ฐจ 2์ฐจ 3์ฐจ BCNF

โซTop โ†ฉ๏ธBack โ„น๏ธHome

ํŠธ๋žœ์žญ์…˜์ด๋ž€

  • ํŠธ๋žœ์žญ์…˜(Transaction) ์ด๋ž€
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.
      • ์˜ˆ๋ฅผ๋“ค์–ด, A๊ณ„์ขŒ์—์„œ B๊ณ„์ขŒ๋กœ ์ผ์ • ๊ธˆ์•ก์„ ์ด์ฒดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
        1. A๊ณ„์ขŒ์˜ ์ž”์•ก์„ ํ™•์ธํ•œ๋‹ค.
        2. A๊ณ„์ขŒ์˜ ๊ธˆ์•ก์—์„œ ์ด์ฒดํ•  ๊ธˆ์•ก์„ ๋นผ๊ณ  ๋‹ค์‹œ ์ €์žฅํ•œ๋‹ค.
        3. B๊ณ„์ขŒ์˜ ์ž”์•ก์„ ํ™•์ธํ•œ๋‹ค.
        4. B๊ณ„์ขŒ์˜ ๊ธˆ์•ก์—์„œ ์ด์ฒดํ•  ๊ธˆ์•ก์„ ๋”ํ•˜๊ณ  ๋‹ค์‹œ ์ €์žฅํ•œ๋‹ค.
      • ์ด๋Ÿฌํ•œ ๊ณผ์ •๋“ค์ด ๋ชจ๋‘ ํ•ฉ์ณ์ ธ ๊ณ„์ขŒ์ด์ฒด๋ผ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…๋‹จ์œ„๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
    • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์€ Commit ๋˜๊ฑฐ๋‚˜ Rollback ๋œ๋‹ค.
      • Commit ์—ฐ์‚ฐ
        • ํ•œ๊ฐœ์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„(ํŠธ๋žœ์žญ์…˜)์— ๋Œ€ํ•œ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋‹ค์‹œ ์ผ๊ด€๋œ ์ƒํƒœ์— ์žˆ์„ ๋•Œ, ์ด ํŠธ๋žœ์žญ์…˜์ด ํ–‰ํ•œ ๊ฐฑ์‹  ์—ฐ์‚ฐ์ด ์™„๋ฃŒ๋œ ๊ฒƒ์„ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
      • Rollback ์—ฐ์‚ฐ
        • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ์„ ๊นจ๋œจ๋ ธ์„ ๋•Œ, ์ด ํŠธ๋žœ์žญ์…˜์˜ ์ผ๋ถ€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋”๋ผ๋„ ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ด ํŠธ๋žœ์žญ์…˜์ด ํ–‰ํ•œ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ทจ์†Œ(Undo)ํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
        • Rollback ์‹œ์—๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ๊ธฐํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ํŠธ๋žœ์žญ์…˜๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ(ACID)
    • ์›์ž์„ฑ(Atomicity), All or nothing
      • ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“  ์—ฐ์‚ฐ๋“ค์€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ์ „ํ˜€ ์–ด๋– ํ•œ ์—ฐ์‚ฐ๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
    • ์ผ๊ด€์„ฑ(Consistency)
      • ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ ํ›„์—๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ผ๊ด€๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ๋…๋ฆฝ์„ฑ(Isolation)
      • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์— ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ด ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•œ๋‹ค.
    • ์ง€์†์„ฑ(Durability)
      • ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ ํŠธ๋žœ์žญ์…˜์€ ์˜์›ํžˆ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์˜ ํ•„์š”์„ฑ
    • ํ˜„๊ธˆ ์ธ์ถœ๊ธฐ๋ฅผ ์ž‘๋™ํ•˜๋Š” ๋„์ค‘์— ๊ธฐ๊ณ„์˜ค๋ฅ˜๋‚˜ ์ •์ „ ๋“ฑ๊ณผ ๊ฐ™์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์—ฌ ์นด๋“œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๊ฑฐ๋‚˜ ๊ธฐ๊ณ„๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒฝ์šฐ
    • ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ง€์ ์˜ ์€ํ–‰์—์„œ ๋™์‹œ์— ์ธ์ถœํ•  ๋•Œ, ํ•˜๋‚˜์˜ ์ง€์ ์ด ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์ €์žฅํ•œ ์ž”์•ก์„ ๋ฎ์–ด ์“ฐ๋Š” ๊ฒฝ์šฐ
    • ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์ฆ‰, ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ์ธ ACID๋ฅผ ์ œ๊ณต๋ฐ›๊ธฐ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ
    • ํ™œ๋™(Active)
      • ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰ ์ค‘์— ์žˆ๋Š” ์ƒํƒœ, ์—ฐ์‚ฐ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ
    • ์žฅ์• (Failed)
      • ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ค‘๋‹จ๋œ ์ƒํƒœ
    • ์ฒ ํšŒ(Aborted)
      • ํŠธ๋žœ์žญ์…˜์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด Rollback ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ์ƒํƒœ
    • ๋ถ€๋ถ„ ์™„๋ฃŒ(Partially Committed)
      • ํŠธ๋žœ์žญ์…˜์ด ๋งˆ์ง€๋ง‰ ์—ฐ์‚ฐ๊นŒ์ง€ ์‹คํ–‰ํ–ˆ์ง€๋งŒ, Commit ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๊ธฐ ์ง์ „์˜ ์ƒํƒœ
    • ์™„๋ฃŒ(Committed)
      • ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด Commit ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•œ ํ›„์˜ ์ƒํƒœ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

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

  • Isolation Level ์ด๋ž€?
    • ํŠธ๋žœ์žญ์…˜์—์„œ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์ˆ˜์ค€
  • Isolation Level ์˜ ํ•„์š”์„ฑ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ACID ๊ฐ™์ด ํŠธ๋žœ์žญ์…˜์ด ์›์ž์ ์ด๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์ธ ์ˆ˜ํ–‰์„ ํ•˜๋„๋ก ํ•œ๋‹ค.
    • ๊ทธ๋ž˜์„œ Locking ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค.
      • ํŠธ๋žœ์žญ์…˜์ด DB๋ฅผ ๋‹ค๋ฃจ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ด€์—ฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฒƒ
    • ํ•˜์ง€๋งŒ ๋ฌด์กฐ๊ฑด์ ์ธ Locking์œผ๋กœ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๋งŽ์€ ํŠธ๋žœ์žญ์…˜๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉด DB์˜ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ ์‘๋‹ต์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด Locking ๋ฒ”์œ„๋ฅผ ์ค„์ธ๋‹ค๋ฉด ์ž˜๋ชป๋œ ๊ฐ’์ด ์ฒ˜๋ฆฌ ๋  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์ธ Locking ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.
  • Isolation Level ์˜ ์ข…๋ฅ˜
    1. Read Uncommitted (๋ ˆ๋ฒจ 0)
      • SELECT ๋ฌธ์žฅ์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— Shared Lock์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” Level
      • ํŠธ๋žœ์žญ์…˜์— ์ฒ˜๋ฆฌ์ค‘์ธ ํ˜น์€ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.
      • ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ A๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ B๋ผ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€(Uncommitted ํ˜น์€ Dirty) ํŠธ๋žœ์žญ์…˜์ด์ง€๋งŒ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ์ธ B๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋‹ค.
    2. Read Committed (๋ ˆ๋ฒจ 1)
      • SELECT ๋ฌธ์žฅ์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— Shared Lock์ด ๊ฑธ๋ฆฌ๋Š” Level
      • ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค.
      • Commit์ด ์ด๋ฃจ์–ด์ง„ ํŠธ๋žœ์žญ์…˜๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ A๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ B๋ผ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
      • SQL Server๊ฐ€ Default๋กœ ์‚ฌ์šฉํ•˜๋Š” Isolation Level
    3. Repeatable Read (๋ ˆ๋ฒจ 2)
      • ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ SELECT ๋ฌธ์žฅ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— Shared Lock์ด ๊ฑธ๋ฆฌ๋Š” Level
      • ํŠธ๋žœ์žญ์…˜์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ์˜ ๋‚ด์šฉ์ด ํ•ญ์ƒ ๋™์ผํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.
      • ๋”ฐ๋ผ์„œ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์˜์—ญ์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    4. Serializable (๋ ˆ๋ฒจ 3)
      • ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ SELECT ๋ฌธ์žฅ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— Shared Lock์ด ๊ฑธ๋ฆฌ๋Š” Level
      • ์™„๋ฒฝํ•œ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
      • ๋”ฐ๋ผ์„œ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์˜์—ญ์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ • ๋ฐ ์ž…๋ ฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Isolation level ์กฐ์ •์€ ๋™์‹œ์„ฑ์ด ์ฆ๊ฐ€๋˜๋Š”๋ฐ ๋ฐ˜ํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋ฐ˜ํ•ด ๋™์‹œ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ ˆ๋ฒจ์ด ๋†’์•„์งˆ์ˆ˜๋ก ๋น„์šฉ์ด ๋†’์•„์ง„๋‹ค.
  • ๋‚ฎ์€ ๋‹จ๊ณ„์˜ Isolation Level ์ด์šฉ์‹œ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ
    • Dirty Read
      • ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ˆ˜์ • ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ
      • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ์•„์ง ์‹คํ–‰์ด ๋๋‚œ์ง€ ์•Š์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด๊ฒŒ ๋˜๋Š” ๋˜๋Š” ๊ฒฝ์šฐ
    • Non-Repeatable Read
      • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ทธ ์‚ฌ์ด์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ’์„ ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œํ•จ์œผ๋กœ์จ ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์ดํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋น„ ์ผ๊ด€์„ฑ ํ˜„์ƒ
    • Phantom Read
      • ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ผ์ • ๋ฒ”์œ„์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์ฝ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์—†๋˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ
      • ์ด๋Š” ํŠธ๋žœ์žญ์…˜ ๋„์ค‘ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜ํƒ€๋‚œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Join

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

  • ์กฐ์ธ์˜ ์ข…๋ฅ˜
    1. ๋‚ด๋ถ€ ์กฐ์ธ(INNER JOIN)
      • ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ๊ฒฐํ•ฉ ๋ฐฉ์‹์ด๋ฉฐ, ๊ธฐ๋ณธ ์กฐ์ธ ํ˜•์‹์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
      • ๋‚ด๋ถ€ ์กฐ์ธ์€ ์กฐ์ธ ๊ตฌ๋ฌธ์— ๊ธฐ๋ฐ˜ํ•œ 2๊ฐœ์˜ ํ…Œ์ด๋ธ”(A, B)์˜ ์ปฌ๋Ÿผ ๊ฐ’์„ ๊ฒฐํ•ฉํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.
      • ๋ช…์‹œ์  ์กฐ์ธ ํ‘œํ˜„(explicit)๊ณผ ์•”์‹œ์  ์กฐ์ธ ํ‘œํ˜„(implicit) 2๊ฐœ์˜ ๋‹ค๋ฅธ ์กฐ์ธ์‹ ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค.
      • ๋ช…์‹œ์  ์กฐ์ธ ํ‘œํ˜„
        • ํ…Œ์ด๋ธ”์— ์กฐ์ธ์„ ํ•˜๋ผ๋Š” ๊ฒƒ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด JOIN ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ON ํ‚ค์›Œ๋“œ๋ฅผ ์กฐ์ธ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
          SELECT *
          FROM employee INNER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
      • ์•”์‹œ์  ์กฐ์ธ ํ‘œํ˜„
        • SELECT ๊ตฌ๋ฌธ์˜ FROM ์ ˆ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ปด๋งˆ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹จ์ˆœํžˆ ์กฐ์ธ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ๋‚˜์—ดํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค.
          SELECT *
          FROM employee, department
          WHERE employee.DepartmentID = department.DepartmentID;
      • ๊ฒฐ๊ณผ
      1. ๋™๋“ฑ ์กฐ์ธ(EQUI JOIN)
        • ๋น„๊ต์ž ๊ธฐ๋ฐ˜์˜ ์กฐ์ธ์ด๋ฉฐ, ์กฐ์ธ ๊ตฌ๋ฌธ์—์„œ ๋™๋“ฑ๋น„๊ต๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
        • ๋‹ค๋ฅธ ๋น„๊ต ์—ฐ์‚ฐ์ž(<์™€ ๊ฐ™์€)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋™๋“ฑ ์กฐ์ธ์œผ๋กœ์„œ์˜ ์กฐ์ธ์˜ ์ž๊ฒฉ์„ ๋ฐ•ํƒˆํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      2. ์ž์—ฐ ์กฐ์ธ(NATURAL JOIN)
        • ๋™๋“ฑ ์กฐ์ธ์˜ ํ•œ ์œ ํ˜•์œผ๋กœ ์กฐ์ธ ๊ตฌ๋ฌธ์ด ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ์ปฌ๋Ÿผ๋ช…์„ ๊ฐ€์ง„ 2๊ฐœ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ์ปฌ๋Ÿผ๋“ค์„ ๋น„๊ตํ•จ์œผ๋กœ์จ, ์•”์‹œ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.
        • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚˜์˜จ ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์˜ ๊ฐ ์Œ์— ๋Œ€ํ•œ ๋‹จ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
        • SQL
          SELECT * FROM employee NATURAL JOIN department;
        • ๊ฒฐ๊ณผ
      3. ๊ต์ฐจ ์กฐ์ธ(CROSS JOIN)
        • ์กฐ์ธ๋˜๋Š” ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ณฑ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        • ์ฆ‰, ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๊ฐ ํ–‰๊ณผ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ–‰์ด ํ•œ๋ฒˆ์”ฉ ๊ฒฐํ•ฉ๋œ ์—ด์„ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.
        • ์˜ˆ๋ฅผ ๋“ค์–ด mํ–‰์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”๊ณผ nํ–‰์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์ด ๊ต์ฐจ ์กฐ์ธ๋˜๋ฉด m*n ๊ฐœ์˜ ํ–‰์„ ์ƒ์„ฑํ•œ๋‹ค
        • ๋ช…์‹œ์  ์กฐ์ธ ํ‘œํ˜„
          SELECT * FROM employee CROSS JOIN department;
        • ์•”์‹œ์  ์กฐ์ธ ํ‘œํ˜„
          SELECT * FROM employee, department;
        • ๊ฒฐ๊ณผ
    2. ์™ธ๋ถ€ ์กฐ์ธ(OUTER JOIN)
      • ์กฐ์ธ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์—์„œ ํŠน์ • ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์™ธ๋ถ€ ์กฐ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
      1. ์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(LEFT OUTER JOIN)
        • ์šฐ์ธก ํ…Œ์ด๋ธ”์— ์กฐ์ธํ•  ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
        • ์ฆ‰, ์ขŒ์ธก ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.
        • SQL
          SELECT *
          FROM employee LEFT OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
        • ๊ฒฐ๊ณผ
      2. ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ(RIGHT OUTER JOIN)
        • ์ขŒ์ธก ํ…Œ์ด๋ธ”์— ์กฐ์ธํ•  ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
        • ์ฆ‰, ์šฐ์ธก ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.
        • SQL
          SELECT *
          FROM employee RIGHT OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
        • ๊ฒฐ๊ณผ
      3. ์™„์ „ ์™ธ๋ถ€ ์กฐ์ธ(FULL OUTER JOIN)
        • ์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ OUTER JOIN์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
        • SQL
          SELECT *
          FROM employee FULL OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
        • ๊ฒฐ๊ณผ
    3. ์…€ํ”„ ์กฐ์ธ(SELF JOIN)
      • ํ•œ ํ…Œ์ด๋ธ”์—์„œ ์ž๊ธฐ ์ž์‹ ์— ์กฐ์ธ์„ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ
    • SQL ๋ฌธ์žฅ์˜ ์˜๋ฏธ๋ฅผ ์ œ๋Œ€๋กœ ํŒŒ์•…
      • SQL์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ขŒ์šฐ๋œ๋‹ค. ์–ด๋–ค ์งˆ์˜๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•œ ํ›„, ๋น„ํšจ์œจ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ตœ์ ์˜ SQL์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ช…ํ™•ํ•œ ์กฐ์ธ ์กฐ๊ฑด ์ œ๊ณต
      • ์กฐ์ธ ์กฐ๊ฑด์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์˜๋„์น˜ ์•Š๊ฒŒ CROSS JOIN(Cartesian Product)์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๋ ค์‚ฌํ•ญ
    • ์กฐ์ธํ•  ๋Œ€์ƒ์˜ ์ง‘ํ•ฉ์„ ์ตœ์†Œํ™”
      • ์ง‘ํ•ฉ์„ ์ตœ์†Œํ™”ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด, ์กฐ๊ฑด์„ ๋จผ์ € ์ ์šฉํ•˜์—ฌ ๊ด€๊ณ„๋ฅผ ๋งบ์„ ์ง‘ํ•ฉ์„ ์ตœ์†Œํ™”ํ•œ ํ›„, ์กฐ์ธ์„ ๋งบ๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.
    • ํšจ๊ณผ์ ์ธ ์ธ๋ฑ์Šค์˜ ํ™œ์šฉ
      • ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ์กฐ์ธ ์—ฐ์‚ฐ์˜ ๋น„์šฉ์„ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

SQL Injection

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Index๋ž€

์ธ๋ฑ์Šค(index)์˜ ์›๋ž˜ ๋œป์€ ์ƒ‰์ธ. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒ ๋ฐ ๊ฒ€์ƒ‰์„ ๋” ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•/๊ธฐ์ˆ , ํ˜น์€ ์ด์— ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์‚ฌ์šฉ ์ด์œ 

select๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์กฐ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๋‹ค๋ฉด ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ˆœํšŒ์— ๋งŽ์€ ์ž์›๊ณผ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๋„์›€์ด ๋˜๋Š”๊ฒŒ ์ธ๋ฑ์Šค์ด๋‹ค.

์ž์ฃผ ์กฐํšŒ๋˜๋Š” Column ์— ๋Œ€ํ•œ Index Table์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด SELECT ๋ฌธ์ด ๋“ค์–ด์™”์„ ๋•Œ Index ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ฐ’๋“ค๋กœ ๊ฒฐ๊ณผ ๊ฐ’์„ ์กฐํšŒํ•ด ์˜จ๋‹ค. ๊ทธ๋ž˜์„œ Index๋ฅผ ์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด "๊ฒ€์ƒ‰" ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋™์ž‘

  • Index Table์—์„œ where์— ํฌํ•จ๋œ ๊ฐ’์„ ๊ฒ€์ƒ‰
  • ํ•ด๋‹น ๊ฐ’์˜ table_id PK๋ฅผ ํš๋“
  • ๊ฐ€์ ธ์˜จ table_id PK๊ฐ’์œผ๋กœ ์›๋ณธ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ’์„ ์กฐํšŒ

DBMS๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ B+ Tree ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

B+tree ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฆฌํ”„๋…ธ๋“œ(Leaf nodes)
  • ๋ฆฌํ”„๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ ์—ญํ• ์„ ํ•˜๋Š” ๋…ผ๋ฆฌํ”„๋…ธ๋“œ(Non-leaf nodes)
  • ๊ฒฝ๋กœ์˜ ์ถœ๋ฐœ์ ์ด ๋˜๋Š” ๋ฃจํŠธ ๋…ธ๋“œ(Root node)

B+tree๋Š” ๋ฆฌํ”„๋…ธ๋“œ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€์— ๋Œ€ํ•œ ์ž์‹ ๋…ธ๋“œ์— ํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, B+ํŠธ๋ฆฌ์˜ ๊ฒ€์ƒ‰์€ ๋ฃจํŠธ๋…ธ๋“œ์—์„œ ์–ด๋–ค ๋ฆฌํ”„ ๋…ธ๋“œ์— ์ด๋ฅด๋Š” ํ•œ ๊ฐœ์˜ ๊ฒฝ๋กœ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

B+tree ์‚ฌ์šฉ ์ด์œ 
  • ์™œ index ์ƒ์„ฑ ์‹œ b-tree๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€? hash table์ด ๋” ํšจ์œจ์ ์ด์ง€ ์•Š์€์ง€?
    • SELECT ์งˆ์˜ ์กฐ๊ฑด์—๋Š” ๋ถ€๋“ฑํ˜ธ ์—ฐ์‚ฐ(<>)๋„ ํฌํ•จ
    • hash table์€ ๋™๋“ฑ ์—ฐ์‚ฐ์— ํŠนํ™”๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋“ฑํ˜ธ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ ๋ฐœ์ƒ

์ฃผ์˜ํ•  ์ 

  • ์ธ๋ฑ์Šค๋Š” ๋”ฐ๋กœ ํ…Œ์ด๋ธ”์˜ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค. ์ž์›์„ ์†Œ๋ชจํ•œ๋‹ค๋Š” ์˜๋ฏธ. ๋•Œ๋ฌธ์— ๋ฌด๋ถ„๋ณ„ํ•œ ์ธ๋ฑ์Šค์˜ ์‚ฌ์šฉ์€ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

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

    • INSERT : ํ…Œ์ด๋ธ”์—๋Š” ์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋˜์ง€๋งŒ, ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—๋Š” ์ •๋ ฌํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ
    • DELETE : ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์‚ญ์ œ๋˜๊ณ  ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—๋Š” ๋‚จ์•„์žˆ์–ด ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ์†๋„ ์ €ํ•˜
    • UPDATE : ์ธ๋ฑ์Šค์—๋Š” UPDATE๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— DELETE, INSERT ๋‘ ์ž‘์—… ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ถ€ํ•˜ ๋ฐœ์ƒ
  • ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์ด ๋†’์€ ์ปฌ๋Ÿผ(์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์€ ์ปฌ๋Ÿผ)์€ ์ธ๋ฑ์Šค๋กœ ๋งŒ๋“ค์–ด๋„ ๋ฌด์šฉ์ง€๋ฌผ (์˜ˆ: ์„ฑ๋ณ„)

  • ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์‹ฑํ•  ๋•Œ ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ->๋‚ฎ์€ ์ปฌ๋Ÿผ ์ˆœ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•ด์•ผ ํšจ์œจ์ 

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Statement์™€ PrepareStatement

โซTop โ†ฉ๏ธBack โ„น๏ธHome

RDBMS์™€ NoSQL

โซTop โ†ฉ๏ธBack โ„น๏ธHome

ํšจ๊ณผ์ ์ธ ์ฟผ๋ฆฌ ์ €์žฅ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

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

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Replication

โซTop โ†ฉ๏ธBack โ„น๏ธHome

ํŒŒํ‹ฐ์…”๋‹

  • ๋ฐฐ๊ฒฝ
    • ์„œ๋น„์Šค์˜ ํฌ๊ธฐ๊ฐ€ ์ ์  ์ปค์ง€๊ณ  DB์— ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ทœ๋ชจ ๋˜ํ•œ ๋Œ€์šฉ๋Ÿ‰ํ™” ๋˜๋ฉด์„œ, ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋Š” DB ์‹œ์Šคํ…œ์˜ ์šฉ๋Ÿ‰(storage)์˜ ํ•œ๊ณ„์™€ ์„ฑ๋Šฅ(performance)์˜ ์ €ํ•˜ ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.
    • ์ฆ‰, VLDB(Very Large DBMS)์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ DBMS์— ๋„ˆ๋ฌด ํฐ table์ด ๋“ค์–ด๊ฐ€๋ฉด์„œ ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งŽ์€ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋Ÿฐ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ table์„ 'ํŒŒํ‹ฐ์…˜(partition)'์ด๋ผ๋Š” ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š” 'ํŒŒํ‹ฐ์…”๋‹(Partitioning)'๊ธฐ๋ฒ• ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ํŒŒํ‹ฐ์…”๋‹์˜ ๊ฐœ๋…
    • ํฐ table์ด๋‚˜ index๋ฅผ, ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด partition์ด๋ผ๋Š” ์ž‘์€ ๋‹จ์œ„๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
      • ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์ด ์žˆ๋”๋ผ๋„, DB์— ์ ‘๊ทผํ•˜๋Š” application์˜ ์ž…์žฅ์—์„œ๋Š” ์ด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
    • 'ํŒŒํ‹ฐ์…”๋‹(Partitioning)'๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ์ˆ˜์›”ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ํŒŒํ‹ฐ์…”๋‹์˜ ๋ชฉ์ 
    1. ์„ฑ๋Šฅ(Performance)
      • ํŠน์ • DML๊ณผ Query์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
      • ์ฃผ๋กœ ๋Œ€์šฉ๋Ÿ‰ Data WRITE ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์ด๋‹ค.
      • ํŠนํžˆ, Full Scan์—์„œ ๋ฐ์ดํ„ฐ Access์˜ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
      • ๋งŽ์€ INSERT๊ฐ€ ์žˆ๋Š” OLTP ์‹œ์Šคํ…œ์—์„œ INSERT ์ž‘์—…์„ ์ž‘์€ ๋‹จ์œ„์ธ partition๋“ค๋กœ ๋ถ„์‚ฐ์‹œ์ผœ ๊ฒฝํ•ฉ์„ ์ค„์ธ๋‹ค.
    2. ๊ฐ€์šฉ์„ฑ(Availability)
      • ๋ฌผ๋ฆฌ์ ์ธ ํŒŒํ‹ฐ์…”๋‹์œผ๋กœ ์ธํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ํ›ผ์† ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
      • ๊ฐ ๋ถ„ํ•  ์˜์—ญ(partition๋ณ„๋กœ)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฑ์—…ํ•˜๊ณ  ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
      • table์˜ partition ๋‹จ์œ„๋กœ Disk I/O์„ ๋ถ„์‚ฐํ•˜์—ฌ ๊ฒฝํ•ฉ์„ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ์— UPDATE ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
    3. ๊ด€๋ฆฌ์šฉ์ด์„ฑ(Manageability)
      • ํฐ table๋“ค์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ํŒŒํ‹ฐ์…”๋‹์˜ ์žฅ์ 
    • ๊ด€๋ฆฌ์  ์ธก๋ฉด : partition ๋‹จ์œ„ ๋ฐฑ์—…, ์ถ”๊ฐ€, ์‚ญ์ œ, ๋ณ€๊ฒฝ
      • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์†์‹คํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ค์–ด ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
      • partition๋ณ„๋กœ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
      • partition ๋‹จ์œ„๋กœ I/O ๋ถ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜์—ฌ UPDATE ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
    • ์„ฑ๋Šฅ์  ์ธก๋ฉด : partition ๋‹จ์œ„ ์กฐํšŒ ๋ฐ DML์ˆ˜ํ–‰
      • ๋ฐ์ดํ„ฐ ์ „์ฒด ๊ฒ€์ƒ‰ ์‹œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํƒ์ƒ‰ํ•ด ์„ฑ๋Šฅ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
      • ์ฆ‰, Full Scan์—์„œ ๋ฐ์ดํ„ฐ Access์˜ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
      • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ์ž์ฒด๊ฐ€ ๊ฐ€๋ณ๋‹ค.
  • ํŒŒํ‹ฐ์…”๋‹์˜ ๋‹จ์ 
    • table๊ฐ„ JOIN์— ๋Œ€ํ•œ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • table๊ณผ index๋ฅผ ๋ณ„๋„๋กœ ํŒŒํ‹ฐ์…”๋‹ํ•  ์ˆ˜ ์—†๋‹ค.
      • table๊ณผ index๋ฅผ ๊ฐ™์ด ํŒŒํ‹ฐ์…”๋‹ํ•ด์•ผ ํ•œ๋‹ค.
  • ํŒŒํ‹ฐ์…”๋‹์˜ ์ข…๋ฅ˜
    1. ์ˆ˜ํ‰(horizontal) ํŒŒํ‹ฐ์…”๋‹
      • ์ƒค๋”ฉ(Sharding) ๊ณผ ๋™์ผํ•œ ๊ฐœ๋…
    2. ์ˆ˜์ง(vertical) ํŒŒํ‹ฐ์…”๋‹
  • ํŒŒํ‹ฐ์…”๋‹์˜ ๋ถ„ํ•  ๊ธฐ์ค€
    1. ๋ฒ”์œ„ ๋ถ„ํ•  (range partitioning)
    2. ๋ชฉ๋ก ๋ถ„ํ•  (list partitioning)
    3. ํ•ด์‹œ ๋ถ„ํ•  (hash partitioning)
    4. ํ•ฉ์„ฑ ๋ถ„ํ•  (composite partitioning)

โซTop โ†ฉ๏ธBack โ„น๏ธHome

์ƒค๋”ฉ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

ORM์ด๋ž€

Object-Relational Mapping ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์˜์†์„ฑ(Persistence)

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

Persistence layer

ํ”„๋กœ๊ทธ๋žจ์˜ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋ฐ์ดํ„ฐ์— ์˜์†์„ฑ์„ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๊ณ„์ธต. JDBC๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Persistence framework๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ณต์žกํ•จ์ด๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†์ด ๊ฐ„๋‹จํ•œ ์ž‘์—…๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋˜๋Š” ์‹œ์Šคํ…œ์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ˆ์ •์ ์ธ ๊ตฌ๋™์„ ๋ณด์žฅํ•œ๋‹ค.

  • ์ข…๋ฅ˜
    • SQL ๋ฌธ์žฅ์œผ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” SQL ๋งตํผ
      • Mybatis ๋“ฑ
    • ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด ๊ด€๊ณ„ ๋งตํผ(ORM)
      • Hibernate ๋“ฑ

์˜ˆ์‹œ (JDBC vs JPA)

  • JDBC example
public String getPersonName(long personId) throws SQLException {
    PreparedStatement st = null;
    try {
        st = connection.prepareStatement (
            "SELECT name FROM people WHERE id = ?");
            st.setLong(1, personId);
            ResultSet rs = st.excuteQuery();
            if (ts.next()) {
                String result = rs.getString("name");
                assert !rs.next();
                return result;
            } else {
                return null;
            }
    } finally {
        if (st != null) {
            st.close();
        }
    }
}
  • JPA example
public String getPersonName(long personId) {
    Person p = em.find(Person.class, personId);
    return p.getName();
}

์žฅ์  - ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋” ์ง๊ด€์ ์ด๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.
    • ์„ ์–ธ๋ฌธ, ํ• ๋‹น, ์ข…๋ฃŒ ๊ฐ™์€ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ธ‰๊ฒฉํžˆ ์ค„์–ด๋“ ๋‹ค.
    • ๊ฐ์ข… ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์˜ฌ๋ ค์ค€๋‹ค.
    • SQL์˜ ์ ˆ์ฐจ์ ์ด๊ณ  ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ์ด ์•„๋‹Œ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ ‘๊ทผ์œผ๋กœ ์ธํ•ด ์ƒ์‚ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
  • ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • ORM์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋•Œ๋ฌธ์— ๋ชจ๋ธ์—์„œ ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ๋ทฐ์™€ ํ•ฉ์ณ์ง€๋Š” ํ˜•ํƒœ๋กœ ๋””์ž์ธ ํŒจํ„ด์„ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋‹ค์ง€๋Š”๋ฐ ์œ ๋ฆฌํ•˜๋‹ค.
    • ๋งคํ•‘์ •๋ณด๊ฐ€ ๋ช…ํ™•ํ•˜์—ฌ, ERD๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.
  • DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.
    • ๋Œ€๋ถ€๋ถ„ ORM ์†”๋ฃจ์…˜์€ DB์— ์ข…์†์ ์ด์ง€ ์•Š๋‹ค.
    • ์ข…์†์ ์ด์ง€ ์•Š๋‹ค๋Š”๊ฒƒ์€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋งŽ์€ ์†”๋ฃจ์…˜์—์„œ ์ž๋ฃŒํ˜• ํƒ€์ž…๊นŒ์ง€ ์œ ํšจํ•˜๋‹ค.
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Object์— ์ง‘์ค‘ํ•จ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ DBMS๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ž‘์—…์—๋„ ๋น„๊ต์  ์ ์€ ๋ฆฌ์Šคํฌ์™€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
    • ๋˜ํ•œ ์ž๋ฐ”์—์„œ ๊ฐ€๊ณตํ• ๊ฒฝ์šฐ equals, hashCode์˜ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ™์€ ์ž๋ฐ”์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ  ๋น ๋ฅธ ๊ฐ€๊ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  • ์™„๋ฒฝํ•œ ORM ์œผ๋กœ๋งŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.
    • ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ํŽธํ•˜์ง€๋งŒ ์„ค๊ณ„๋Š” ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.
    • ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์ด ์ปค์งˆ๊ฒฝ์šฐ ๋‚œ์ด๋„ ๋˜ํ•œ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์ž˜๋ชป ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ์— ์†๋„ ์ €ํ•˜ ๋ฐ ์‹ฌ๊ฐํ•  ๊ฒฝ์šฐ ์ผ๊ด€์„ฑ์ด ๋ฌด๋„ˆ์ง€๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
    • ์ผ๋ถ€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ˜• ์ฟผ๋ฆฌ๋Š” ์†๋„๋ฅผ ์œ„ํ•ด SP๋ฅผ ์“ฐ๋Š”๋“ฑ ๋ณ„๋„์˜ ํŠœ๋‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
    • DBMS์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. (ํ•˜์ง€๋งŒ ์ด๊ฑด ๋‹จ์ ์œผ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์—†๋‹ค : ํŠน์ • DBMS์˜ ๊ณ ์œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ์ด์‹์„ฑ์ด ์ €ํ•˜๋œ๋‹ค.)
  • ํ”„๋กœ์‹œ์ €๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„  ORM์˜ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์žฅ์ ์„ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • ์ด๋ฏธ ํ”„๋กœ์‹œ์ €๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„  ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”์•ผํ•˜๋ฉฐ, ๊ทธ ๊ณผ์ •์—์„œ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋‚˜ ๋ฆฌ์Šคํฌ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

JDBC

JDBC๋ž€?

JDBC(Java Database Connectivity)๋Š” DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก Java์—์„œ ์ œ๊ณตํ•˜๋Š” API์ด๋‹ค.

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

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”๋“ค์ด ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ์ž ๋งŒ๋“ ๋‹ค๋ฉด, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ฐ ๋ฒค๋”๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜€์•ผ ํ• ๊ฒƒ์ด๋‹ค.

JDBC๋ฅผ ์ด์šฉํ•œ DB์ ‘๊ทผ

  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
    1. JDBC driver ๋กœ๋”ฉ
    2. Connection ๋งบ๊ธฐ
    3. SQL ์‹คํ–‰
    4. ์ž์› ๋ฐ˜ํ™˜

1. JDBC driver ๋กœ๋”ฉ

  • ์˜ˆ)
    Class.forName("com.mysql.jdbc.Driver"); // mysql ๋“œ๋ฆฌ์ด๋ฒ„ ๋กœ๋”ฉ
  • Driver๋ž€?
    • JDBC Driver๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ์š”์ฒญ์„ DBMS๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์–ด๋Œ‘ํ„ฐ

2. Connection ๋งบ๊ธฐ

  • ์˜ˆ)
    Connection conn = null;
    conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
  • DriverManager๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”๋“ค์ด JDBC API๋ฅผ ๊ตฌํ˜„ํ•œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. DriverManager.getConnection() ๋ฉ”์„œ๋“œ๋Š” ์ธ์ž๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์— ๋”ฐ๋ผ์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”๊ฐ€ ๊ตฌํ˜„ํ•œ Connection ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Connection ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์ด ํ™•๋ฆฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

3. SQL ์‹คํ–‰

  • ์ฟผ๋ฆฌ ์ค€๋น„
    Statement stmt = conn.createStatement();
  • ์ฟผ๋ฆฌ ์‹คํ–‰(์“ฐ๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ - insert, update, delete)
    rs = stmt.executeQuery(SQL_QUERY_STRING);
  • ์ฟผ๋ฆฌ ์‹คํ–‰(์ฝ๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ - select)
    • ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ์ž‘์—…์ด๋ผ๋ฉด
    ResultSet rs = psmt.executeQuery();
  • SQL๋ฌธ์ด select๋ฌธ์ด์—ˆ๋‹ค๋ฉด ResultSet์„ ์ด์šฉํ•œ ์ฒ˜๋ฆฌ
    • ๊ฐ’ ์ถ”์ถœ
    while(rs.next()){
        String result1 = resultSet.getString(1) // ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค
        String result2 = resultSet.getString("NAME") // ์ปฌ๋Ÿผ๋ช…
    }
    ์ด๋ ‡๊ฒŒ ์ถ”์ถœํ•œ ๊ฐ’๋“ค์€ ๋ณดํ†ต DTO๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

4. ์ž์› ๋ฐ˜ํ™˜

rs.close(); // ResultSet๋ฅผ ๋‹ซ๋Š”๋‹ค.
stmt.close(); // Statement๋ฅผ ๋‹ซ๋Š”๋‹ค.
conn.close(); // Connection๋ฅผ ๋‹ซ๋Š”๋‹ค.

(์ฐธ๊ณ ) JDBC์˜ DB์ ‘๊ทผ ํ”Œ๋กœ์šฐ

(์ฐธ๊ณ ) JDBC ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ

Plain JDBC API์˜ ๋ฌธ์ œ์ 

  • ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. EX) ์—ฐ๊ฒฐ ์ƒ์„ฑ, ๋ช…๋ น๋ฌธ, ResultSet ๋‹ซ๊ธฐ, ์—ฐ๊ฒฐ ๋“ฑ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋œ๋‹ค.

JDBC Template

JDBC Template์€ Spring JDBC ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ๋‚ด๋ถ€์ ์œผ๋กœ Plain JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์„ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ์˜ Spring์—์„œ ์ œ๊ณตํ•˜๋Š” class์ด๋‹ค.

  • Spring JDBC๊ฐ€ ํ•˜๋Š” ์ผ
    • ์ž์›์˜ ์ƒ์„ฑ๊ณผ ๋ฐ˜ํ™˜(Connection, Statement, ResultSet ๋“ฑ)
    • Statement ์‹คํ–‰
    • ResultSet Loop ์ฒ˜๋ฆฌ
    • Exception ์ฒ˜๋ฆฌ์™€ ๋ฐ˜ํ™˜
    • Transaction ์ฒ˜๋ฆฌ
  • Spring JDBC์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•  ์ผ
    • ํ•ต์‹ฌ์ ์œผ๋กœ ํ•ด์•ผ๋  ์ž‘์—…๋งŒ ํ•ด์ฃผ๋ฉด ๋‚˜๋จธ์ง€๋Š” Framwork๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
      • datasource ์„ค์ •
      • sql๋ฌธ ์ž‘์„ฑ
      • ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

๐Ÿ  Home