Skip to content

Latest commit

ย 

History

History
1188 lines (822 loc) ยท 74.5 KB

File metadata and controls

1188 lines (822 loc) ยท 74.5 KB

DB, Web, Network

๋ชฉ์ฐจ

  • RDBMS vs NOSQL์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • ์ธ๋ฑ์Šค
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ index๋ฅผ ๋งŒ๋“ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์‹œ๊ณ , ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ index๋ฅผ ๋งŒ๋“ค๋ฉด ์„ฑ๋Šฅ์ด ๋นจ๋ผ์ง€๊ฒŒ ๋˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • hash index๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋‹จ์ ๊ณผ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.
    • ์ธ๋ฑ์Šค์— ์™œ ํ•ด์‰ฌ ๋ณด๋‹ค B Tree๋ฅผ ์“ฐ๋Š”๊ฐ€?
  • ํŠธ๋žœ์žญ์…˜์ด ๋ฌด์—‡์ธ๊ฐ€์š”
    • ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”
    • ํŠธ๋žœ์žญ์…˜์˜ ํŠน์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”(ACID)
    • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Transaction Isolation Levels)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • ์ž ๊ธˆ ํƒ€์ž„์•„์›ƒ๊ณผ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • ํŠธ๋žœ์žญ์…˜ Rollback์€ ์–ด๋–ค ๊ฒฝ์šฐ์— ํ•˜๋‚˜์š”?
  • JPA
    • ORM์ด๋ž€?
    • JPA, Hibernate ๊ทธ๋ฆฌ๊ณ  Spring Data JPA ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. JPA์—์„œ ์ด๊ฒƒ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์š”?
    • DB Lock์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. JPA์—์„œ ์ด๊ฒƒ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์š”?
  • QueryDSL์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ JPQL๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • ์ •๊ทœํ™”์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
    • Nomalization ์ด ๋ฌด์—‡์ธ๊ฐ€์š”? Denormalization์€ ๋ฌด์—‡์ด๊ณ , ์–ธ์ œ ์‹œํ–‰ํ•˜๊ฒŒ ๋˜๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • Elastic Search
    • Elastic Search์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • Elastic Search์˜ ์ธ๋ฑ์Šค๊ตฌ์กฐ์™€ RDBMS์˜ ์ธ๋ฑ์Šค ๊ตฌ์กฐ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    • Elastic Search์˜ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰๊ณผ RDBMS์˜ LIKE ๊ฒ€์ƒ‰์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • SQL
    • A๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•  ๋•Œ, ์ƒˆ๋กœ์šด ์†์„ฑ(Column)์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ• ๋•Œ, ๋ชจ๋“  ํ–‰(row)์— Default๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์„๋•Œ, ์–ด๋–ค ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผํ• ๊นŒ์š”

  • ์ฟ ํ‚ค์™€ ์„ธ์…˜
    • ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ํ•„์š”์„ฑ
    • ๋™์ž‘๋ฐฉ์‹
    • ์ฟ ํ‚ค์™€ ์„ธ์…˜์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”?
  • ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์˜ ์ฐจ์ด
    • ๋™์ž‘ ๋ฐฉ์‹
    • ์žฅ๋‹จ์ 
  • JWT
    • JWT๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ์™€ ์žฅ, ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
  • ์›น ์„œ๋ฒ„์™€ WAS์˜ ์ฐจ์ด์ 
  • ์›น ๊ณต๊ฒฉ ํŒจํ„ด๊ณผ ๋ฐฉ์–ด ๋ฐฉ๋ฒ•
    • SQL Injection์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • RESTful์˜ ๊ฐœ๋…
    • RESTful์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • ๋ณธ์ธ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ• ๋•Œ Restful API๋ฅผ ์ง€ํ‚ค๊ธฐ์œ„ํ•ด ํ•œ ๋…ธ๋ ฅ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
  • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ URI์— ๊ตฌ๊ธ€๋‹ท์ปด์„ ์ณค์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋“ค์„ ์•„๋Š” ๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ๊นŒ์ง€ ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์„ธ์š”.
  • OSI 7๊ณ„์ธต
    • OSI 7๊ณ„์ธต์ด ๋ฌด์—‡์ธ์ง€ ๊ทธ ์กด์žฌ ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • TCP/IP 4๊ณ„์ธต์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด(Apache, Nginx)๋Š” OSI 7๊ณ„์ธต ์ค‘ ์–ด๋””์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด(Apache, Nginx)์˜ ์„œ๋ฒ„ ๊ฐ„ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์€ OSI 7๊ณ„์ธต ์ค‘ ์–ด๋””์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
  • DNS๋ž€?
  • HTTP
    • HTTP์˜ ์—ญํ• 
    • HTTP์™€ HTTPS์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.
    • HTTPS์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ณ  SSL Handshake์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง•
    • HTTP 1.1 VS 2.0 VS 3.0
    • HTTP ์‘๋‹ต์ฝ”๋“œ
    • HTTP Method - PUT๊ณผ PATCH์˜ ์ฐจ์ด
  • TCP์™€ UDP
    • TCP์™€ UDP์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    • 3 way hand shake์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.




DB

RDBMS vs NOSQL์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.


ํ•ต์‹ฌ๋‹ต๋ณ€

RDBMS๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ์— ๋”ฐ๋ผ ํ–‰๊ณผ ์—ด์„ ๊ฐ–์ถ˜ 2์ฐจ์› ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ ์†์„ฑ(Attribute)๊ณผ ๊ฐ’(Value)์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜, ์ €์žฅ, ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์†์„ฑ๊ณผ ๊ฐ’์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค(foreign key)๋ฅผ ์ด์šฉํ•ด ์„œ๋กœ ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ SQL์ด๋ผ๋Š” ์–ธ์–ด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

NoSQL์€ SQL์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†์ด, ํ˜น์€ ๋А์Šจํ•œ ํ˜•ํƒœ์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋„ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Key ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž…,์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ NOSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๊ณ , ๋Œ€ํ‘œ์ ์œผ๋กœ key-value store, document db, graph db ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ด ์žˆ๊ณ , ์™ธ๋ž˜ํ‚ค๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

image

ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ํ…Œ์ด๋ธ”์˜ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋Œ€์ผ(one-to-one) ๊ด€๊ณ„
  2. ์ผ๋Œ€๋‹ค(one-to-many) ๊ด€๊ณ„
  3. ๋‹ค๋Œ€๋‹ค(many-to-many) ๊ด€๊ณ„

๐Ÿค” ๋‘ DB์˜ ์žฅ๋‹จ์ ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ๋งํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • RDBMS

    • ์žฅ์ : ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ , ๊ฐ ๊ด€๊ณ„๋ฅผ ๋”ฐ๋ผ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ค‘๋ณต ์—†์Œ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ : ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋กœ ์–ฝํ˜€ ์žˆ์–ด ์‹œ์Šคํ…œ์ด ์ปค์ง„๋‹ค๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์„œ๋ฒ„ ์ž์ฒด์˜ ์„ฑ๋Šฅ์„ Scale-upํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. !ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜์‚ฌํ•ญ: ์ƒค๋”ฉ(sharding)์„ ํ†ตํ•ด์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ƒค๋”ฉ์€ Scale-out์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ ์ ์ ˆํ•˜์ง€ ์•Š์€ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • NoSQL

    • ์žฅ์ : ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๊ธฐ ๋–„๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํ•„๋“œ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์š”์ฆ˜ ์ƒํ™ฉ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ๋„ Scale-Up๊ณผ Scale-Out ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ : ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ์Šคํ‚ค๋งˆ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„œ๋ฒ„ ํ™•์žฅ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์˜ ํ™•์žฅ์„ฑ์€ ์ˆ˜์ง์  ํ™•์žฅ(Scale-up)๊ณผ ์ˆ˜ํ‰์  ํ™•์žฅ(Scale-out)์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค.

  • ์ˆ˜์ง์  ํ™•์žฅ์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.(ex. CPU ์—…๊ทธ๋ ˆ์ด๋“œ)
  • ์ˆ˜ํ‰์  ํ™•์žฅ์€ ๋” ๋งŽ์€ ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ „์ฒด์ ์œผ๋กœ ๋ถ„์‚ฐ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‰์  ํ™•์žฅ์€ NoSQL DB์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด Relational DB๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜์ง์  ํ™•์žฅ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย Nosql์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ ์†๋„ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•œ ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

RDBMS๋Š” ๋ฐฐ์—ด์˜ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.๋ฐ˜๋ฉด Nosql์˜ ๊ฒฝ์šฐ key-value ํ˜•์‹ HashMap ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— Key๊ฐ’๋งŒ ์žˆ๋‹ค๋ฉด ๋” ๋น ๋ฅธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ DB๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์ฃ ?

RDBMS๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์Šคํ‚ค๋งˆ๊ฐ€ ์ค‘์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ค‘๋ณต์ด ์—†์Œ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ์žฌ๋ฌด๊ด€๋ จ, ๋ณด์•ˆ, ๊ฐœ์ธ ๊ฑด๊ฐ•์ •๋ณด ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ์„ ํƒํ•  ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

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

๋‘˜์€ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ ์ด๋ผ๊ธฐ๋ณด๋‹ค ๊ฐ๊ฐ ํ•„์š”ํ•œ ์‹œ์ ์— ์ ์ ˆํžˆ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ƒํ˜ธ ๋ณด์™„์ ์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ธ๋ฑ์Šค


ํ•ต์‹ฌ๋‹ต๋ณ€

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

์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชฉ์ฐจ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ index๋ฅผ ๋งŒ๋“ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์‹œ๊ณ , ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์คฌ์„ ๋•Œ, ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๊ณ  ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์€ ์นผ๋Ÿผ์˜ ๊ฐ’๊ณผ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ํ‚ค์™€ ๋ฐธ๋ฅ˜๋กœ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์€ ์ •๋ ฌํ™”๋œ B TREE์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๊ณ , ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ์ด์ง„ํƒ์ƒ‰๊ณผ ํ‚ค์˜ ๋ฒ”์œ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น ํ‚ค์˜ ๋ฐธ๋ฅ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ธ๋ฑ์Šค์—์„œ ์ฐพ์€ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ’์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

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

๐Ÿค” INDEX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‚ญ์ œํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธ์™€ ์‚ญ์ œ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์ผ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๊ฐ€ ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N)์ด๊ณ  ์ธ๋ฑ์Šค ์ž๋ฃŒ ๊ตฌ์กฐ์ธ B TREE์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(logN)์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ผ์ • ์ด์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ํ…Œ์ด๋ธ”์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ index๋ฅผ ๋งŒ๋“ค๋ฉด ์„ฑ๋Šฅ์ด ๋นจ๋ผ์ง€๊ฒŒ ๋˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ํฌํ•จํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ์—, ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ์ธ๋ฑ์Šค์˜ ์ •๋ ฌํ™”๋œ B TREE ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜ˆ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์—, B TREE์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ธ๋ฑ์Šค๋Š” ์ด์ง„ํƒ์ƒ‰์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„ O(logN)์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๐Ÿค” hash index๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋‹จ์ ๊ณผ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.

ํ•ด์‹œ ์ธ๋ฑ์Šค๋Š” ํŠน์ • ๊ธฐ์ค€๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ•œ๋ฒˆ์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋“ฑํ˜ธ ์—ฐ์‚ฐ์—๋Š” ๊ต‰์žฅํžˆ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, DB์—์„œ๋Š” ๋“ฑํ˜ธ ์—ฐ์‚ฐ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ถ€๋“ฑํ˜ธ ์—ฐ์‚ฐ๋„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์ง• ๋•Œ๋ฌธ์— ํŠน์ • ๊ธฐ์ค€๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ๋•Œ๋Š” ์—ฐ์‚ฐ์˜ ์„ฑ๋Šฅ์ด ๊ต‰์žฅํžˆ ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ์ธ๋ฑ์Šค์— ์™œ ํ•ด์‰ฌ ๋ณด๋‹ค B Tree๋ฅผ ์“ฐ๋Š”๊ฐ€?

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์กฐํšŒ์—์„œ๋Š” ๋น ๋ฅด์ง€๋งŒ, ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋“ฑํ˜ธ ์—ฐ์‚ฐ์—๋Š” ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

image




ํŠธ๋žœ์žญ์…˜์ด ๋ฌด์—‡์ธ๊ฐ€์š”?


ํ•ต์‹ฌ๋‹ต๋ณ€

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


๐Ÿค”ย ํŠธ๋žœ์žญ์…˜์˜ ํŠน์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”(ACID)

ACID๋Š” ํŠธ๋žœ์žญ์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค.

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

๐Ÿค”ย ํŠธ๋žœ์žญ์…˜์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ง์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ์ค‘์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์—ฐ์‚ฐ์ด ๋ผ์–ด๋“ค ์ˆ˜ ์—†๊ณ , ์ˆ˜ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์€ ์™„์ „ํžˆ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰์ด ๋ณด์กดํ•ด์•ผ ํ•  ์ผ๊ด€์„ฑ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

๊ธฐ๋ณธ ํ‚ค, ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ๊ณผ ๊ฐ™์€ ๋ช…์‹œ์ ์ธ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด๋“ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ž๊ธˆ ์ด์ฒด ์˜ˆ์—์„œ ๋‘ ๊ณ„์ขŒ ์ž”๊ณ ์˜ ํ•ฉ์€ ์ด์ฒด ์ „ํ›„๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์‚ฌํ•ญ๊ณผ ๊ฐ™์€ ๋น„๋ช…์‹œ์ ์ธ ์ผ๊ด€์„ฑ ์กฐ๊ฑด๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Transaction Isolation Levels)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์€ ๊ณ ๋ฆฝ๋„์™€ ์„ฑ๋Šฅ์˜ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

  • READ UNCOMMITTED: ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋‚ด์šฉ๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์˜ค์—ผ๋œ ์ฝ๊ธฐ, ์žฌํ˜„ ๋ถˆ๊ฐ€ํ•œ ์ฝ๊ธฐ, ํ—ˆ์ƒ ์ฝ๊ธฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • READ COMMITTED: ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋œ ๋‚ด์šฉ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋กœ์จ ์˜ค์—ผ๋œ ๊ฐ’ ์ฝ๊ธฐ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ ์žฌํ˜„ ๋ถˆ๊ฐ€ํ•œ ์ฝ๊ธฐ, ํ—ˆ์ƒ ์ฝ๊ธฐ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋‚จ์Šต๋‹ˆ๋‹ค.
  • REPEATABLE READ: ํŠธ๋žœ์žญ์…˜์— ์ง„์ž…ํ•˜๊ธฐ ์ด์ „์— ์ปค๋ฐ‹๋œ ๋‚ด์šฉ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ค์—ผ๋œ ๊ฐ’ ์ฝ๊ธฐ, ์žฌํ˜„ ๋ถˆ๊ฐ€ํ•œ ์ฝ๊ธฐ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ ํ—ˆ์ƒ ์ฝ๊ธฐ๋Š” ์—ฌ์ „ํžˆ ๋‚จ์Šต๋‹ˆ๋‹ค.
  • SERIALIZABLE: ํŠธ๋žœ์žญ์…˜์— ์ง„์ž…ํ•˜๋ฉด ๋ฝ์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ•ด์†Œ๋˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

Dirty Read, Nonrepeatable Read์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์„œ๋กœ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ ํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ํ•œ ์ค„๋กœ ์„ธ์›Œ๋†“๊ณ  ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•˜๋Š” ๊ผด์ด๋ผ์„œ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ์„ฑ๋Šฅ์„ ๊ฐ์•ˆํ•˜๋ฉฐ, ์š”๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ ํƒํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย ์ž ๊ธˆ ํƒ€์ž„์•„์›ƒ๊ณผ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ž ๊ธˆ ํƒ€์ž„์•„์›ƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜A์˜ ๊ฐฑ์‹ ๊ณผ ํŠธ๋žœ์žญ์…˜B์˜ ๊ฐฑ์‹ ์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ, wait์ด ๋ฐœ์ƒํ•˜๊ณ  ์ง€์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž ๊ธˆ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ต์ฐฉ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜A๋Š” a์—, ํŠธ๋žœ์žญ์…˜B๋Š” b์— ๊ฐฑ์‹ ์„ ํ•œ ์ƒํƒœ์ผ ๋–„,

ํŠธ๋žœ์žญ์…˜ A๊ฐ€ b์— ๊ฐฑ์‹ ์„ ํ•˜๋ ค ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜B๋Š” a์— ๊ฐฑ์‹ ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ตํƒ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย ํŠธ๋žœ์žญ์…˜ Rollback์€ ์–ด๋–ค ๊ฒฝ์šฐ์— ํ•˜๋‚˜์š”?

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ์„ ์œ„ํ•ด ๋กค๋ฐฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๋กค๋ฐฑํ•˜๊ณ  ๋‚œ ํ›„์—๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


JPA


๐Ÿค”ย  ORM(Object Relational Mapping)์ด๋ž€?

๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ ์—†์ด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

๐Ÿค”ย JPA, Hibernate ๊ทธ๋ฆฌ๊ณ  Spring Data JPA ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • JPA๋ž€ Java Persistance API์˜ ์•ฝ์ž๋กœ JAVA ORM ํ‘œ์ค€ ๊ธฐ์ˆ  ๋ช…์„ธ์ž…๋‹ˆ๋‹ค.์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ DBMS์— ์˜๊ตฌํžˆ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” API์ด์ž, ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • Hibernate๋Š” JPA์˜ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.JPA๋Š” ๋‹จ์ˆœํžˆ ๋ช…์„ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, Hibernate๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Spring Data JPA๋Š” JPA๋ฅผ ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ๋†“์€ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. JPA๋ฅผ ํ•œ ๋‹จ๊ณ„ ์ถ”์ƒํ™”์‹œํ‚จ Repository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

image

๐Ÿค”ย JPA๊ฐ€ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ƒ์†์„ ํ†ตํ•ด, ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ํด๋ž˜์Šค์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์—, ์บก์Аํ™”๋ฅผ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์›์น˜ ์•Š์€ ๋ฉ”์„œ๋“œ๋“ค๋„ ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ์›์น˜ ์•Š์€ ๋ฉ”์„œ๋“œ๋„ ์ƒ์†๋˜๋ฉด ์˜๋„์น˜ ์•Š์€ ๋ฒ„๊ทธ๋„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•จ์ˆ˜์˜ ํŠน์ง•๋งŒ์„ ์ •์˜ํ•˜๊ณ  ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์ด ์—†๊ธฐ์— ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ํ‹€์„ ์ œ๊ณตํ•˜์—ฌ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์—, ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ •ํ˜•ํ™”๋œ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

JPA๋Š” ORM๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— RDBMS์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•  ํ•„์š”์—†์ด, ์ž๋ฐ”์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋กœ์ธํ•ด JPA์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด ์ƒ์‚ฐ์„ฑ์ด ๋†’์•„์ง„๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๐Ÿค”ย JPA์˜ ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”

JPA๋Š” ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํ†ต๊ณ„์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ณด๋‹ค ์‹ค์‹œ๊ฐ„ ์ฟผ๋ฆฌ์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.๋”ฐ๋ผ์„œ, ๋ฏธ์„ธํ•˜๊ณ  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ๋Š” Mybatis์™€ ๊ฐ™์€ Mapper๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย JPA ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์ (5๊ฐ€์ง€)๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌํžˆ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋…์ด๊ธฐ๋•Œ๋ฌธ์— ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์ง€๋งŒ, JPA๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ์ด๋˜๊ณ  ์ดํ›„ DB์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ DB์‚ฌ์ด ์˜์†์„ฑ์ปจํ…์ŠคํŠธ๋ฅผ ๋‘์—ˆ์„ ๋•Œ์˜ ์ด์ ์€ 1์ฐจ์บ์‹œ, ๋™์ผ์„ฑ ๋ณด์žฅ, ํŠธ๋žœ์ ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ, ๋ณ€๊ฒฝ๊ฐ์ง€, ์ง€์—ฐ๋กœ๋”ฉ 5๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. 1์ฐจ ์บ์‹œ

    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ๋Š” 1์ฐจ ์บ์‹œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜๋Š” ์ˆœ๊ฐ„, ๋ฐ์ดํ„ฐ๋ฅผ 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • 1์ฐจ์บ์‹œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ด์ ์ด ์žˆ๋Š”๋ฐ, find()๋ฅผ ํ–ˆ์„ ๋‹น์‹œ 1์ฐจ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด, DB์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋™์ผ์„ฑ ๋ณด์žฅ

    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™”์„ ๊ฒฝ์šฐ ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠธ๋ž™์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ

    • ์—”ํ‹ฐํ‹ฐ๋“ค์—๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ œ์–ด๊ฐ€ ์ผ์–ด๋‚  ๋•Œ, JPA๋Š” ๋ฐ”๋กœ DB์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์šฐ์„ ์ ์œผ๋กœ 1์ฐจ์บ์‹œ์— ์ €์žฅํ•˜๊ณ , commit()์‹œ ์ฟผ๋ฆฌ๋ฌธ๋“ค์„ DB์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • flush()๋Š” 1์ฐจ์บ์‹œ๋ฅผ ์ง€์šฐ์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ๋ฅผ DB์— ๋‚ ๋ ค DB์™€ ์‹ฑํฌ๋Š” ๋งž์ถ”๋Š” ์—ญํ• ์„ ํ•˜๊ณ 
    • ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ ๋‚œ ํ›„ commit()์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์€ ์ด flush()์™€ commit() 2๊ฐ€์ง€ ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    image

  4. ๋ณ€๊ฒฝ ๊ฐ์ง€ (Dirty checking)

    • JPA๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋Š” update()๋‚˜ persist()๋กœ ์˜์†์„ฑ์ปจํ…์ŠคํŠธ์— ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    • ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ๋”ํ‹ฐ ์ฒดํ‚น์ด๋ผ ํ•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ 1์ฐจ์บ์‹œ์— ์ €์žฅ๋  ๋•Œ ๋™์‹œ์— ์Šค๋ƒ…์ƒท ํ•„๋“œ๋„ ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค.

    • commit()๋˜๋Š” flush()๊ฐ€ ์ผ์–ด๋‚  ๋•Œ, ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ์˜ ๋‚ด์šฉ๊ณผ, 1์ฐจ์บ์‹œ์— ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•ด์„œ, ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด Update SQL์„ ๋งŒ๋“ค์–ด ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ€๊ฒฝ๊ฐ์ง€์˜ ํ๋ฆ„

      1. ํŠธ๋ž™์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ๋‚ด๋ถ€์—์„œ ๋จผ์ € ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
      2. ์—”ํ‹ฐํ‹ฐ์™€ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
      3. ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.
      4. ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์˜ SQL์„ ํ”Œ๋Ÿฌ์‹œํ•œ๋‹ค.
      5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

      image

  5. ์ง€์—ฐ ๋กœ๋”ฉ

    • ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ๋•Œ์˜ ์ด์ ์€, DB๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ, ์—ฐ๊ด€๊ด€๊ฑ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค์ง€์•Š์•„ ํฌ๊ธฐ๋ฅผ ์ค„์ž„์œผ๋กœ์จ ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. JPA์—์„œ ์ด๊ฒƒ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์š”?

๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด๋ž€, ์„œ๋กœ ๋ชจ์ˆœ์ด ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ์ผ์น˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

JPA์—๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ณณ์—์„œ 1์ฐจ ์บ์‰ฌ์—์„œ ์—”ํ‹ฐํ‹ฐ์™€ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•˜์—ฌ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ 1์ฐจ ์บ์‰ฌ์˜ ๋‹จ์œ„๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย DB Lock์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. JPA์—์„œ ์ด๊ฒƒ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์š”?

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

  • Shared Lock: Read Lock์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ๊ณต์œ  ๋ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Read Lock๋ผ๋ฆฌ๋Š” ๋™์‹œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ฝ๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋Š” ์ด๋Š” ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ Exclusive Lock์˜ ์ ‘๊ทผ์€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • Exclusive Lock: Write Lock, ๋ฒ ํƒ€๋ฝ์ด๋ผ๊ณ ๋„ ํ•˜๋Š” Exclusive Lock์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์œ ์ง€ ๋ฉ๋‹ˆ๋‹ค. Exclusive Lock์ด ๋๋‚  ๋•Œ ๊นŒ์ง€๋Š” ์–ด๋– ํ•œ ์ ‘๊ทผ๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ย JPA Lock

  • Optimistic Lock: ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ์‹œ ๊ฒฝํ•ฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋‚™๊ด€์ ์œผ๋กœ ๋ณด๊ณ  ์ž ๊ทธ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ํšŒ์› ์ •๋ณด๋Š” ํ•ด๋‹น ํšŒ์›์— ์˜ํ•ด์„œ๋งŒ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋™์‹œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • Pessimistic Lock: ๋™์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๋น„๊ด€์  ์ „์ œ์—์„œ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ์ƒํ’ˆ์˜ ์žฌ๊ณ ๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์ฃผ๋ฌธํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ๋น„๊ด€์  ์ž ๊ธˆ์„ ํ†ตํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ Exclusive Lock์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Implicit Lock: ์ฝ”๋“œ์— ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ์ž ๊ธˆ์ด ๋ฐœ์ƒํ•˜๋Š” Lock์ž…๋‹ˆ๋‹ค. @Version์ด๋‚˜ @OptimisticLocking ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™์ ์œผ๋กœ ์ถฉ๋Œ ๊ฐ์ง€๋ฅผ ์œ„ํ•ด ์ž ๊ธˆ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. DB์˜ ๊ฒฝ์šฐ์—๋Š” ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ์ฟผ๋ฆฌ ๋ฐœํ–‰์‹œ ์•”์‹œ์ ์ธ Row Exclusive Lock์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Explicit Lock: ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ž ๊ธˆ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋–„ LockMode๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, SELECT FOR UPDATE ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย JPA๋Š” ๋กœ๊ทธ ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€?

  1. ํ‘œ์ค€ ์ถœ๋ ฅ: application.properties์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ด์ง€๋งŒ ๋กœ๊น… ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ง์ ‘ ์–ธ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค.
spring.jpa.show-sql=true
  1. ๋กœ๊ฑฐ๋ฅผ ํ†ตํ•œ ์ฒ˜๋ฆฌ: ์†์„ฑ ํŒŒ์ผ์—์„œ ๋กœ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•ด SQL๋ฌธ์„ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
  1. JDBCTemplate ์ฟผ๋ฆฌ ๋กœ๊น…: JdbcTemplate์„ ์‚ฌ์šฉํ•  ๋•Œ ๋กœ๊น…์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ ์†์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE



๐Ÿค”ย JPA์—์„œ N + 1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š”, JPA๋Š” JPQL์„ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์™€ ํ•„๋“œ ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์— ์˜ํ•ด์„œ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ง„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์ด ํ•จ๊ป˜ ์กฐํšŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰์‹œ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ, ๋ชจ๋“ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ์— ๋‹น์—ฐํžˆ N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์ง€์—ฐ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ์—๋„, ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ณ , ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์—ฐ๊ด€๋œ ๊ด€๊ณ„์˜ ๋งคํ•‘์„ ์กฐํšŒํ• ๋•Œ N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ํ•œ๋ฒˆ ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ์กฐํšŒ๋˜์–ด ๋ถˆ๋Ÿฌ์˜จ ๊ฐ์ฒด๊ฐ€ ์žˆ์ง€๋งŒ, ์ง€์—ฐ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ, ์—ฐ๊ด€๋œ ๋งคํ•‘๊ด€๊ณ„์—์žˆ๋Š” ๊ฐ์ฒด์˜ ์ •๋ณด๋Š” ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ •๋ณด๋กœ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฌธ์„ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ์˜ N๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฌธ์ด ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒ๋˜์–ด์ง‘๋‹ˆ๋‹ค.
@Transactional
@Test
public void test_N1_๋ฌธ์ œ_๋ฐœ์ƒ_์ง€์—ฐ๋กœ๋”ฉ์„ค์ •_loop์œผ๋กœ_์กฐํšŒํ•˜๋Š”_๊ฒฝ์šฐ() throws JsonProcessingException {
  savePostWithComments(4, 2);
  List<Post> posts = postRepository.findAll(); //(1) N+1 ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

  List<Comment> commentList;
  for (Post post : posts) {
    commentList = post.getCommentList();
    log.info("post author: {}", commentList.size()); //(2) N+1 ๋ฐœ์ƒํ•œ๋‹ค
  }
}
Hibernate: select post0_.post_id as post_id1_1_, post0_.create_dt as create_d2_1_, post0_.updated_dt as updated_3_1_, post0_.author as author4_1_, post0_.content as content5_1_, post0_.like_count as like_cou6_1_, post0_.title as title7_1_ from post post0_

Hibernate: select commentlis0_.post_id as post_id6_0_0_, commentlis0_.comment_id as comment_1_0_0_, commentlis0_.comment_id as comment_1_0_1_, commentlis0_.create_dt as create_d2_0_1_, commentlis0_.updated_dt as updated_3_0_1_, commentlis0_.author as author4_0_1_, commentlis0_.content as content5_0_1_, commentlis0_.post_id as post_id6_0_1_ from comment commentlis0_ where commentlis0_.post_id=?

Hibernate: select commentlis0_.post_id as post_id6_0_0_, commentlis0_.comment_id as comment_1_0_0_, commentlis0_.comment_id as comment_1_0_1_, commentlis0_.create_dt as create_d2_0_1_, commentlis0_.updated_dt as updated_3_0_1_, commentlis0_.author as author4_0_1_, commentlis0_.content as content5_0_1_, commentlis0_.post_id as post_id6_0_1_ from comment commentlis0_ where commentlis0_.post_id=?

Hibernate: select commentlis0_.post_id as post_id6_0_0_, commentlis0_.comment_id as comment_1_0_0_, commentlis0_.comment_id as comment_1_0_1_, commentlis0_.create_dt as create_d2_0_1_, commentlis0_.updated_dt as updated_3_0_1_, commentlis0_.author as author4_0_1_, commentlis0_.content as content5_0_1_, commentlis0_.post_id as post_id6_0_1_ from comment commentlis0_ where commentlis0_.post_id=?

Hibernate: select commentlis0_.post_id as post_id6_0_0_, commentlis0_.comment_id as comment_1_0_0_, commentlis0_.comment_id as comment_1_0_1_, commentlis0_.create_dt as create_d2_0_1_, commentlis0_.updated_dt as updated_3_0_1_, commentlis0_.author as author4_0_1_, commentlis0_.content as content5_0_1_, commentlis0_.post_id as post_id6_0_1_ from comment commentlis0_ where commentlis0_.post_id=?
  • Comment ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋ฉด, Post์— ๋Œ€ํ•œ ์กฐํšŒ๋Š” ์ด๋ฏธ ๋๋‚œ ์ƒํƒœ๋ผ์„œ JOIN์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ง€ Post์— ๋Œ€ํ•œ ์ •๋ณด ID๋กœ ์กฐํšŒํ•  ์ˆ˜๋ฐ–์— ์—†์–ด์„œย where comment.postId=?ย ํ˜•์‹์œผ๋กœ JPQL ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งค๋ฒˆ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ด ๋˜์–ด N ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย N+1 ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ง€์—ฐ๋กœ๋”ฉ์‹œ, N+1 ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”,

ํŒจ์น˜ ์กฐ์ธ(fetch join), EntityGraph, Batch Size ์ง€์ • + ์ฆ‰์‹œ ๋กœ๋”ฉ 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. fetch join

    • JPQL์— fetch join ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ join ๋Œ€์ƒ์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ง€์—ฐ๋กœ๋”ฉ์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒ ์‹œ, ํ•จ๊ป˜๋ถˆ๋Ÿฌ์˜ค๊ธธ ์›ํ•˜๋Š” ์—ฐ๊ด€๊ด€๊ณ„์˜ ๊ฐ์ฒด๋ฅผ joinํ•ด์„œ ๊ฐ™์ด ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    @Repository
      public interface PostRepository extends JpaRepository<Post, Long> {
           @Query("select p from Post p left join fetch p.commentList")
           List<Post> findAllWithFetchJoin();
      }
  2. EntityGraph

    • @EntityGraph JPQL์—์„œ fetch join์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ•˜๋“œ์ฝ”๋”ฉํ•ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด @EntityGraph ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    @EntityGraph(attributePaths = {"articles"}, type = EntityGraphType.FETCH)
       @Query("select distinct u from User u left join u.articles")
       List<User> findAllEntityGraph();
  3. Batch Size ์ง€์ • + ์ฆ‰์‹œ ๋กœ๋”ฉ

    • JPQL ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์‹  Batch ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • @BatchSize ์–ด๋…ธํ…Œ์ด์…˜์— size๋ฅผ ์ง€์ •ํ•˜๊ณ  fetch ํƒ€์ž…์€ ์ฆ‰์‹œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    @Table(name = "post")
       public class Post extends DateAudit {
       ...(์ƒ๋žต)...
    
       @JsonIgnore //JSON ๋ณ€ํ™˜์‹œ ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€์šฉ
       @BatchSize(size = 2) //batch size๋ฅผ ์ง€์ •ํ•œ๋‹ค
       @OneToMany(mappedBy = "post", fetch = FetchType.EAGER) //์ฆ‰์‹œ๋กœ๋”ฉ์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค
            private List<Comment> commentList = Lists.newArrayList();
      }



๐Ÿค”ย JPA Pagingย N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Pagination์—์„œ์˜ ๋ฌธ์ œ ๋ฐœ์ƒ distinct๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ์—ฐ๊ด€๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ fetch join์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ธ๋ฐ, Paging ์ฒ˜๋ฆฌ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ๋•Œ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— JPA์—๊ฒŒ pagination ์š”์ฒญ์„ ํ•˜์—ฌ๋„ distinct๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ limit offset์„ ๊ฑธ์ง€ ์•Š๊ณ  ์ธ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด paging์„ ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • Paging ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ~ToOne ~ToOne ๊ด€๊ณ„์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” fetch join์„ ๊ฑธ์–ด๋„ Pagination์ด ์›ํ•˜๋Š”๋Œ€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
@EntityGraph(attributePaths = {"user"}, type = EntityGraphType.FETCH)
@Query("select a from Article a left join a.user")
Page<Article> findAllPage(Pageable pageable);
  • Paging ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Batch Size ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์—ฐ๊ด€๊ด€๊ณ„์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์•Œ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง€์—ฐ๋กœ๋”ฉํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ Batch์„ฑ loadingํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ง€์—ฐ๋กœ๋”ฉ์€ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ ๊ทธ๋•Œ๊ทธ๋•Œ ์ฟผ๋ฆฌ๋ฌธ์„ ๋‚ ๋ ค์„œ N+1์ด ๋ฐœ์ƒํ•œ ๋ฐ˜๋ฉด ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ์‹œ์ ์— ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋งŒ ๋‚ ๋ฆฌ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹นํ•˜๋Š” Article์— ๋Œ€ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ batch size๊ฐœ๋ฅผ ๋‚ ๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์ƒ๊ธธ N+1 ๋ฌธ์ œ๋ฅผ batch size๋งŒํผ ๊ฐ€์ ธ์™€ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๋Š”๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Paging ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : @Fetch(FetchMode.SUBSELECT) BatchSize์™€ ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜์ง€๋งŒ, size๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์Šคํ”„๋ง์—์„œ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  batchsize๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • MultipleBagFetchException ํ•ด๊ฒฐ์ฑ… - fetch join ๋‘๊ฐœ ์ด์ƒ์˜ fetch join์„ ์„ค์ •ํ•  ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฐ’์ด ๋“ค์–ด์™€ MultipleBagFetchException์„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” Set์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Pagination์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Set<Article> articles = emptySet();

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Set<Question> questions = emptySet();
  • MultipleBagFetchException ํ•ด๊ฒฐ์ฑ… : batchsize

    • List ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 2๊ฐœ ์ด์ƒ์˜ Collection join์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Pagination์„ ์‚ฌ์šฉํ•ด์•ผํ•ด์„œ ์ธ๋ฉ”๋ชจ๋ฆฌ OOM์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    @BatchSize(size = 100)
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private Set<Article> articles = emptySet();
    
    @BatchSize(size = 100)
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private Set<Question> questions = emptySet();
    @BatchSize(size = 100)
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Article> articles = new ArrayList<>();
    
    @BatchSize(size = 100)
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Question> questions = new ArrayList<>();
    @Query("select distinct u from User u left join u.articles left join u.questions")
    Page<User> findAllPage2(Pageable pageable);

QueryDSL์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ JPQL๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.


Spring Data JPA๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” CRUD ๋ฉ”์„œ๋“œ ๋ฐ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ€์กฑํ•œ ๊ธฐ๋Šฅ์„ ๋ณด๊ฐ•ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ ,

JPQL์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ง์ ‘ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์ด ๋Ÿฐํƒ€์ž„ ์‹œ์— ์˜คํƒ€ ํ˜น์€ ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ์„œ๋น„์Šค์˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž QueryDSL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐจ์ด์ 

    JPQL์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์ž…๋ ฅํ•ด์ค˜์•ผํ•˜๋Š” ๋ฐ˜๋ฉด, QueryDSL์€ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ด๋ค„์ ธ์žˆ์–ด ๋ฌธ๋ฒ•๊ณผ ์˜คํƒ€์— ๋Œ€ํ•œ ์—๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๐Ÿค” QueryDSL ์žฅ์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ, ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋™์™„์„ฑ ๋“ฑ IDE์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ ์ž‘์„ฑ์‹œ ์ œ์•ฝ ์กฐ๊ฑด๋“ฑ์„ ๋ฉ”์„œ๋“œ ์ถ”์ถœ์„ ํ†ตํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ •๊ทœํ™”์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”


  1. ์ •๊ทœํ™”(Nomalization)๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๋น„์ •๊ทœํ™”(Denormalization)๋Š” ๋ฌด์—‡์ด๊ณ , ์–ธ์ œ ์‹œํ–‰ํ•˜๊ฒŒ ๋˜๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
    1. ์ •๊ทœํ™”(Normalization)

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

          • ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์›์ž๊ฐ’(ํ•˜๋‚˜์˜ ๊ฐ’)์„ ๊ฐ–๋„๋ก ๋ถ„ํ•ด

          image

        2. ์ œ 2 ์ •๊ทœํ™”

          • ์ œ1 ์ •๊ทœํ˜•์„ ๋งŒ์กฑํ•˜๊ณ , ์™„์ „ ํ•จ์ˆ˜ ์ข…์†(๊ธฐ๋ณธํ‚ค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๊ฒฐ์ •์ž๊ฐ€ ๋˜์–ด์„  ์•ˆ๋จ์„ ์˜๋ฏธ)์„ ๋งŒ์กฑํ•˜๋„๋ก ๋ถ„ํ•ด

          image

          • ํ•™์ƒ๋ฒˆํ˜ธ๋กœ ์กฐํšŒ ์‹œ, ๊ฐ•์˜์‹ค์ด ๋ณต์ˆ˜๊ฐ’์œผ๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ์ฆ‰, ๊ธฐ๋ณธํ‚ค(ํ•™์ƒ๋ฒˆํ˜ธ, ๊ฐ•์ขŒ์ด๋ฆ„) ์ค‘ ๊ฐ•์ขŒ์ด๋ฆ„์ด ๊ฐ•์˜์‹ค์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฐ์ •์ž์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”๋กœ ๋ถ„ํ•ดํ•ด์คŒ์œผ๋กœ์จ ์™„์ „ํ•จ์ˆ˜์ข…์† ์กฐ๊ฑด ๋งŒ์กฑ

          image

        3. ์ œ 3 ์ •๊ทœํ™”

          • ์ œ2 ์ •๊ทœํ˜•์„ ๋งŒ์กฑํ•˜๊ณ , ์ดํ–‰์  ์ข…์†(Aโ†’B, Bโ†’C = Aโ†’C)์„ ์—†์• ๋„๋ก ๋ถ„ํ•ด
          • ๊ฐ ์†์„ฑ๋“ค์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋กœ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ถ„ํ•ด

          image

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

          image

        4. BCNF ์ •๊ทœํ™”

          • ์ œ 3 ์ •๊ทœํ˜•์„ ๋งŒ์กฑํ•˜๊ณ , ๋ชจ๋“  ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณดํ‚ค๊ฐ€ ๋˜๋„๋ก ๋ถ„ํ•ด

          image

          • ๊ธฐ๋ณธํ‚ค(ํ•™์ƒ๋ฒˆํ˜ธ, ํŠน๊ฐ•์ด๋ฆ„)๋Š” ๊ต์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ, ๊ต์ˆ˜ ๋˜ํ•œ ํŠน๊ฐ•์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฐ์ •์ž์ด๋‹ค.
          • ๋ฌธ์ œ๋Š” ๊ต์ˆ˜๊ฐ€ ๊ฒฐ์ •์ž์ด์ง€๋งŒ ํ›„๋ณดํ‚ค๋Š” ์•„๋‹ˆ๋ผ๋Š” ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๋ชจ๋“  ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณดํ‚ค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„ํ•ดํ•œ๋‹ค.

          image

    2. ๋น„์ •๊ทœํ™”(Denomalization)

      1. ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณตํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•
        • ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ, ๊ฐœ๋ฐœ ๋ฐ ์šด์˜์˜ ํŽธ์˜์„ฑ ๋“ฑ์„ ์œ„ํ•ด ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ํ†ตํ•ฉ, ์ค‘๋ณต, ๋ถ„๋ฆฌํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค =ย ์˜๋„์ ์œผ๋กœ ์ •๊ทœํ™” ์›์น™์„ ์œ„๋ฐฐํ•˜๋Š” ๊ฒƒ
๐Ÿ’ก ์–ธ์ œ ์‚ฌ์šฉ๋˜๋‚˜์š”?
  • ๋””์Šคํฌ I/O ๋Ÿ‰์ด ๋งŽ์•„์„œ ์กฐํšŒ ์‹œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ๋•Œ
  • ํ…Œ์ด๋ธ”๋ผ๋ฆฌ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€์–ด ์กฐ์ธ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์˜ˆ์ƒ๋  ๋•Œ
  • ์นผ๋Ÿผ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์กฐํšŒํ•  ๋•Œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ๊ฒƒ์ด ์˜ˆ์ƒ๋  ๋•Œ
  • (์ผ๋ฐ˜์ ์œผ๋กœ) ์กฐํšŒ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ


๐Ÿค”ย ์ž˜ ์กฐ์ง๋˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์—์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ด์ƒ๋“ค์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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


Elastic Search


  • Elastic Search์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

    Elastic Search๋Š” Apache Lucene ๊ธฐ๋ฐ˜์˜ Java ์˜คํ”ˆ์†Œ์Šค ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ์—”์ง„์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ, ์ˆซ์ž, ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ •๋ณด, ์ •ํ˜• ๋ฐ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ ๋“ฑ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰, ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ณดํ†ต ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ELK ์Šคํƒ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” Logstash, Kibana, Beats๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Elastic Search์˜ ์ธ๋ฑ์Šค๊ตฌ์กฐ์™€ RDBMS์˜ ์ธ๋ฑ์Šค ๊ตฌ์กฐ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

    Elastic Search๋Š” Inverted-Index ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฑ…์˜ ์ƒ‰์ธ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‰ฌ์šด๋ฐ, ํŠน์ • ๋‹จ์–ด๊ฐ€ ์ถœํ˜„ํ•˜๋Š” doc์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ „๋ฌธ(Full-text) ๊ฒ€์ƒ‰์‹œ์— RDBMS์— ๋น„ํ•ด ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ˜๋ฉด RDBMS์—๋Š” ๋‹ค์–‘ํ•œ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๊ฐ€ ์žˆ์ง€๋งŒ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฐธ๋Ÿฐ์Šค ํŠธ๋ฆฌ์˜ ์ผ์ข…์ธ B-Tree ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐธ๋Ÿฐ์Šค ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ ๋ฆฌ์ง€ ์•Š๋„๋ก ๋…ธ๋“œ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ์‹œ ํŠน์ • ๊ทœ์น™์— ์˜ํ•ด ์žฌ์ •๋ ฌ๋˜์–ด ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

  • Elastic Search์˜ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰๊ณผ RDBMS์˜ LIKE ๊ฒ€์ƒ‰์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

    RDBMS์—์„œ๋Š” where like '%...%'์˜ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ๋Š” ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์†๋„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ˆœ ํ…์ŠคํŠธ ๋งค์นญ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ํŠนํžˆ ํ•œ๊ธ€ ๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ๋นˆ์•ฝํ•œ ํŽธ์ž…๋‹ˆ๋‹ค. ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์˜ ์ƒ‰์ธ๊ณผ ๊ฒ€์ƒ‰๋„ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

๐Ÿค”ย  ์—ญ์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

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




SQL


  • A๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•  ๋•Œ, ์ƒˆ๋กœ์šด ์†์„ฑ(Column)์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ชจ๋“  ํ–‰(row)์— Default๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์„๋‹ค๋ฉด, ์–ด๋–ค ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผํ• ๊นŒ์š”?

alter table ~add ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Alter table A add ์ปฌ๋Ÿผ๋ช… ์ž๋ฃŒํ˜• default ์ดˆ๊นƒ๊ฐ’;




Web

์ฟ ํ‚ค์™€ ์„ธ์…˜


ํ•ต์‹ฌ๋‹ต๋ณ€

  • ์ฟ ํ‚ค

    • ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ์— Key-Value์Œ์ด String ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด(์ด๋ฆ„, ๊ฐ’, ๋งŒ๋ฃŒ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„, ๊ฒฝ๋กœ์ •๋ณด)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ธ์…˜

    • ์„ธ์…˜์€ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์ผ๋ จ์˜ ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๊ณ , ๊ทธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ์œ ์ง€ ์ˆ˜๋‹จ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ์ด ์•„๋‹Œ ์„œ๋ฒ„์ธก์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ํ•„์š”์„ฑ

    HTTP ํ”„๋กœํ† ์ฝœ์˜ ๊ฒฝ์šฐ โ€œConnectionless, Statelessโ€ํ•œ ํŠน์„ฑ์ด ์žˆ์–ด ์š”์ฒญ๊ฐ„์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งค ํ†ต์‹ ๋งˆ๋‹ค ์ƒˆ๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ ์ ‘์†์ž์™€ ๊ฐ™์€์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ ์„ ๋ณด์™„ํ•˜๋Š” ๋ฐ ์ฟ ํ‚ค์™€ ์„ธ์…˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๋™์ž‘๋ฐฉ์‹

    • ์ฟ ํ‚ค ๋™์ž‘๋ฐฉ์‹
      1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
      2. ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  HTTP ํ—ค๋”์— ์ฟ ํ‚ค๋ฅผ ํฌํ•จ ์‹œ์ผœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
      3. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ฟ ํ‚ค ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
      4. ๊ฐ™์€ ์š”์ฒญ์„ ํ•  ๊ฒฝ์šฐ HTTP ํ—ค๋”์— ์ฟ ํ‚ค๋ฅผ ํ•จ๊ป˜ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
      5. ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ์ฝ์–ด ์ด์ „ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ, ์ฟ ํ‚ค๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์ฟ ํ‚ค๋ฅผ HTTP ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜ ๋™์ž‘๋ฐฉ์‹
      1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘์† ์‹œ ์„ธ์…˜ ID๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์Šต๋‹ˆ๋‹ค.
      2. ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜ ID์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ €์žฅํ•˜๊ณ  ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
      3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ, ์ด ์ฟ ํ‚ค์˜ ์„ธ์…˜ ID๋ฅผ ๊ฐ™์ด ์„œ๋ฒ„์— ์ „๋‹ฌํ•ด์„œ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
      4. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ID๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์„œ ๋ณ„๋‹ค๋ฅธ ์ž‘์—…์—†์ด ์„ธ์…˜ ID๋กœ ์„ธ์…˜์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      5. ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์„œ๋ฒ„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค์™€ ์„ธ์…˜์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”?
    • ์ฟ ํ‚ค: ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ์— ์ €์žฅ๋˜๋ฏ€๋กœ ๋ณด์•ˆ์— ์ทจ์•ฝํ•ด ๋กœ๊ทธ์ธ๊ฐ™์€ ์ธ์ฆ์—๋Š” ์ž˜ ์“ฐ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์•„์ด๋””์˜ ์ €์žฅ์ด๋‚˜, ์‡ผํ•‘๋ชฐ์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด์•„๋‘๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ๋ณด์•ˆ์ƒ ์ค‘์š”ํ•œ ์ž‘์—…์ธ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์˜ ์ฐจ์ด


  • ๋™์ž‘ ๋ฐฉ์‹

    • ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ

      image

      1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
      2. ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ผ๋ฉด ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ณ , Session ID๋ฅผ ๋ฐœ๊ธ‰ํ•ด ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
      3. Session ID๋Š” ์ฟ ํ‚ค์— ์‹ค๋ ค ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
      4. ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ํ•  ๋•Œ, Session ID๊ฐ€ ํ—ค๋”์— ๋‹ด๊ฒจ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
      5. ์„œ๋ฒ„๋Š” ์ฟ ํ‚ค ๋‚ด๋ถ€์˜ Session ID๋ฅผ ์ด์šฉํ•ด ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™•์ธํ•˜๊ณ , ์ด ์ž‘์—…์˜ ๋ฐ˜๋ณต์œผ๋กœ ๋กœ๊ทธ์ธ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
    • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

      image

      1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์ธ์ฆ๋˜๋ฉด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
      2. ํด๋ผ์ด์–ธํŠธ๋Š” ํ† ํฐ์„ ์ €์žฅํ•ด๋‘๊ณ , ์„œ๋ฒ„์— ์š”์ฒญ์‹œ๋งˆ๋‹ค ํ† ํฐ์„ HTTP์š”์ฒญ ํ—ค๋”์— ๋‹ด์•„ ์„œ๋ฒ„์— ํ•จ๊ป˜ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
      3. ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์š”์ฒญ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ๋‹จ์ 

    • ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ

      • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์š”์ฒญ์‹œ Session ID๋งŒ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
      • ๋‹จ์ : ์ค‘์•™ ์„ธ์…˜ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์—†์œผ๋ฉด ์‹œ์Šคํ…œ ํ™•์žฅ์ด ์–ด๋ ต๊ณ , ์ค‘์•™ ์„ธ์…˜ ์‹œ์Šคํ…œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์Šคํ…œ ์ „์ฒด์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‚˜๊ฐ€๋‹ค๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

      • ์žฅ์ : ํ† ํฐ์ด ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ์™„์ „ํžˆ Statelessํ•ฉ๋‹ˆ๋‹ค. ์ฟ ํ‚ค ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์‚ฌ๋ผ์ง€๊ณ , ํ† ํฐ์— ์„ ํƒ์ ์ธ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ OAuth ๋ฐฉ์‹์€ Google, Facebook๊ฐ™์€ ์†Œ์…œ ๊ณ„์ •์„ ํ†ตํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด ์ง์ ‘์ ์ธ ์šด์˜๊ณผ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ์ ์Šต๋‹ˆ๋‹ค.
      • ๋‹จ์ : ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒฝ์šฐ ์ธ์ฆ ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์ธ JWT์˜ ๊ฒฝ์šฐ Payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ํ† ํฐ์„ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „์—๋Š” ๋Œ€์ฒ˜๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.


JWT


  • JWT๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ์™€ ์žฅ, ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
    • ์‚ฌ์šฉ ์ด์œ :

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

      ๋˜ํ•œ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฝ”๋”ฉ ์‹œ XML๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ JSON Parser๋Š” ๋ณดํ†ต ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ฐ์ฒด์™€ ์ง์ ‘ Mapping๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์‰ฝ๊ฒŒ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์žฅ์ :

      • ์›นํ‘œ์ค€(RFC 7519)์œผ๋กœ, ์„œ๋น„์Šค ๋„์ž… ๋ฐ ํ–ฅํ›„ ๋””๋ฒ„๊น…๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์–ด ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•œ ๋ถ€๋‹ด๋„ ๋‚ฎ์œผ๋ฉฐ, REST ์„œ๋น„์Šค๋กœ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ :

      • ํ† ํฐ์˜ Payload์— ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜ ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Payload๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๋‹ด์ง€ ๋ง๊ฑฐ๋‚˜, ํ˜น์€ JWE๋ผ๋Š” ๋ณ„๋„์˜ ์•”ํ˜ธํ™”๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. Statelessํ•œ ํŠน์„ฑ์ƒ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ž„์˜ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๋ณ„๋„๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์›น ์„œ๋ฒ„์™€ WAS์˜ ์ฐจ์ด์ 


ํ•ต์‹ฌ๋‹ต๋ณ€

์–ด๋–ค ํƒ€์ž…์˜ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์›น์„œ๋ฒ„๋Š” ์ •์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. WAS๋Š” DB ์กฐํšŒ๋‚˜, ์–ด๋–ค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋™์  ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ WAS๋กœ๋Š” ์•„ํŒŒ์น˜ ํ†ฐ์ผ“, ์›น๋กœ์ง, ์ œ์ด๋ณด์Šค ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” Web Server์™€ WAS๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ”๊ฐ€์š”?

  • Web Server๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

    • Web Server๋ฅผ ํ†ตํ•ด ์ •์ ์ธ ํŒŒ์ผ๋“ค์„ Application Server๊นŒ์ง€ ๊ฐ€์ง€ ์•Š๊ณ , ์•ž์—์„œ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ, Web Server์—์„œ ์ •์  ์ปจํ…์ธ ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ๋ถ„๋ฐฐํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • WAS๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

    • ์›น ํŽ˜์ด์ง€์˜ ์ •์  ์ปจํ…์ธ ์™€ ๋™์  ์ปจํ…์ธ ์— ๋Œ€ํ•œ ์œ ์ €์˜ ์š”์ฒญ์„ Web Server๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ, WAS๋ฅผ ํ†ตํ•ด ์š”์ฒญ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ DB์—์„œ ๊ฐ€์ ธ์™€์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๊ฒŒ ๊ทธ๋•Œ ๊ทธ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ •๋ฆฌ

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


์›น ๊ณต๊ฒฉ ํŒจํ„ด๊ณผ ๋ฐฉ์–ด ๋ฐฉ๋ฒ•


  • SQL Injection์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

ํ•ต์‹ฌ๋‹ต๋ณ€

ํด๋ผ์ด์–ธํŠธ์˜ ์ž…๋ ฅ๊ฐ’์„ ์กฐ์ž‘ํ•˜์—ฌ ์ž„์˜์˜ SQL๋ฌธ์„ ์‚ฝ์ž…ํ•ด ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿค” SQL Injections์˜ ๋Œ€์‘๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”

  1. ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ
  2. Prepared Statement ๊ตฌ๋ฌธ์‚ฌ์šฉ
  3. ์›น ๋ฐฉํ™”๋ฒฝ ์‚ฌ์šฉ

๐Ÿค”ย ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… -XSS

๊ณต๊ฒฉ์ž๊ฐ€ ์ƒ๋Œ€๋ฐฉ ๋ธŒ๋ผ์šฐ์ €์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ด ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜, ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜, ์•…์˜์  ์ปจํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜, ํ”ผ์‹ฑ ๊ณต๊ฒฉ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

XSS๊ณต๊ฒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ <script>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— XSS ๊ณต๊ฒฉ์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ํƒœ๊ทธ ๋ฌธ์ž(<,>)๋“ฑ ์œ„ํ—˜ํ•œ ๋ฌธ์ž ์ž…๋ ฅ ์‹œ ๋ฌธ์ž ์ฐธ์กฐ๋กœ ํ•„ํ„ฐ๋งํ•˜๊ณ , ์„œ๋ฒ„์—์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก ์‹œ ๋ฌธ์ž๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image


RESTful์˜ ๊ฐœ๋…


  • RESTful์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    REST ์•„ํ‚คํ…์ณ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์œผ๋กœ, ์•„๋ž˜ ์›์น™์„ ์ง€์ผœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    1. HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•˜๊ณ 
    2. HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด
    3. ํ•ด๋‹น ์ž์›(URI)์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณธ์ธ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ• ๋•Œ Restful API๋ฅผ ์ง€ํ‚ค๊ธฐ์œ„ํ•ด ํ•œ ๋…ธ๋ ฅ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

    • ์ดˆ๊ธฐ์—๋Š” ๋‹จ์ˆœํžˆ GET๊ณผ POST๋งŒ ํ™œ์šฉํ–ˆ์œผ๋‚˜, ๋ฆฌํŒฉํ† ๋ง ํ›„ ๋‹ค๋ฅธ HTTP Method์˜ ์ ๊ทน์ ์ธ ํ™œ์šฉ์„ ํ†ตํ•ด ์–ด๋–ค CRUD ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค์˜ ์ง‘ํ•ฉ์ธ Collection์—๋Š” ๋‹จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ณต์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

      ex) โ€ข [GET] /user โ†’ โ€ข [GET] /users

    • Collection์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ Identifier๋กœ ๋๋ƒˆ์Šต๋‹ˆ๋‹ค.

      ex) โ€ข GET /shops/{shopId}/category/{categoryId}/price โ†’ โ€ข GET /shops/{shopId}

    • URL์—๋Š” ๋™์‚ฌ๋ณด๋‹ค ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

      ex) โ€ข [POST] /updateuser/{userId} โ†’ โ€ข [PUT] /user/{userId}

    • ๋˜ํ•œ, URI ์„ค๊ณ„์‹œ ์•„๋ž˜์˜ ๊ธฐ์ค€์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

      • /๊ด€๋ จ DB Columns/๊ด€๋ จ Field๊ฐ’
        • ex) sign up โ†’ POST /users/2
      • /๋Š” ๊ณ„์ธต๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ„, ํฐ ๋ฒ”์œ„/์ž‘์€ ๋ฒ”์œ„
        • ex) /tils/idx/like/idx
      • /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…
        • ex) my til delete โ†’ /users/userid/tils/idx


Netwwork

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ URI์— ๊ตฌ๊ธ€๋‹ท์ปด์„ ์ณค์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋“ค์„ ์•„๋Š” ๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.


ํ•ต์‹ฌ๋‹ต๋ณ€

image

  1. ์‚ฌ์šฉ์ž๊ฐ€ URL์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๋„๋ฉ”์ธ ๋„ค์ž„์„ DNS์„œ๋ฒ„์—์„œ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  2. DNS์„œ๋ฒ„์—์„œ ํ•ด๋‹น ๋„๋ฉ”์ธ ๋„ค์ž„์— ํ•ด๋‹นํ•˜๋Š” IP์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ URL ์ •๋ณด์™€ ํ•จ๊ป˜ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์›น ํŽ˜์ด์ง€ URL ์ •๋ณด์™€ IP ์ฃผ์†Œ๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ TCP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท์„ ๊ฑฐ์ณ ํ•ด๋‹น IP ์ฃผ์†Œ์˜ ์ปดํ“จํ„ฐ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  5. ๋„์ฐฉํ•œ HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›นํŽ˜์ด์ง€ URL ์ •๋ณด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
  6. ์›น ์„œ๋ฒ„๋Š” ๋„์ฐฉํ•œ ์›น ํŽ˜์ด์ง€ URL ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  7. ์›น ์„œ๋ฒ„์—์„œ๋Š” ๋‹ค์‹œ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๋‹ค์‹œ TCP ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด ์ธํ„ฐ๋„ท์„ ๊ฑฐ์ณ ์›๋ž˜ ์ปดํ“จํ„ฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  8. ๋„์ฐฉํ•œ HTTP ์‘๋‹ต๋ฉ”์‹œ์ง€๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ์›น ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™ฅ๋‹ˆ๋‹ค.
  9. ๋ณ€ํ™˜๋œ ์›น ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ์ถœ๋ ฅ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ์ž๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ๊นŒ์ง€ ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์„ธ์š”.


ํ•ต์‹ฌ๋‹ต๋ณ€

image

  1. ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ https://www.google.com/images/google.png๋กœ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” DNS ์„œ๋ฒ„์—์„œ URL์„ ์ด์šฉํ•ด IP๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ„์˜ TCP ์ปค๋„ฅ์…˜์„ ๋งบ์Šต๋‹ˆ๋‹ค.(3 way handshaking)
  4. ์ด๋ฏธ์ง€ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ GET ๋ฉ”์„œ๋“œ๋กœ HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  6. ์„œ๋ฒ„๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ณ  HTTP ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น Resource๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด 200์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‘๋‹ตํ•ด์ค๋‹ˆ๋‹ค.
  7. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต๋ฐ›์€ ๋ฉ”์„ธ์ง€๋ฅผ ํ•ด์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


OSI 7๊ณ„์ธต


  • OSI 7๊ณ„์ธต์ด ๋ฌด์—‡์ธ์ง€ ๊ทธ ์กด์žฌ ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

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

    image

    1. 1๊ณ„์ธต - ๋ฌผ๋ฆฌ๊ณ„์ธต(Physical Layer)
      • ์ „๊ธฐ ๋ฐ์ดํ„ฐ์˜ ์ „์†ก๋งŒ์„ ๋‹ด๋‹น (ํ†ต์‹  ์ผ€์ด๋ธ”, ๋ฆฌํ”ผํ„ฐ, ํ—ˆ๋ธŒ ๋“ฑ)
    2. 2๊ณ„์ธต - ๋ฐ์ดํ„ฐ ๋งํฌ๊ณ„์ธต(DataLink Layer)
      • ์ •๋ณด์˜ ์˜ค๋ฅ˜์™€ ํ๋ฆ„์„ ๊ด€๋ฆฌ (๋ธŒ๋ฆฌ์ง€, ์Šค์œ„์น˜, ์ด๋”๋„ท ๋“ฑ)
    3. 3๊ณ„์ธต - ๋„คํŠธ์›Œํฌ ๊ณ„์ธต(Network Layer)
      • ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ฃผ์†Œ๋ฅผ ์ •ํ•˜๊ณ  ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ํŒจํ‚ท์„ ์ „๋‹ฌ (๋ผ์šฐํ„ฐ)
      • ๋ผ์šฐํŒ…, ํ๋ฆ„ ์ œ์–ด, ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜, ์˜ค๋ฅ˜ ์ œ์–ด, ์ธํ„ฐ๋„คํŠธ์›Œํ‚น ๋“ฑ์„ ์ˆ˜ํ–‰
      • ๋ผ์šฐํŒ…ย : ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ์ง€๊นŒ์ง€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌ (์ค‘์š” ๊ธฐ๋Šฅ)
    4. 4๊ณ„์ธต - ์ „์†ก ๊ณ„์ธต(Transport Layer)
      • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ 5๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌ (์˜ˆ: TCP)
      • ์–‘ ๋๋‹จ(End to end)์˜ ์‚ฌ์šฉ์ž๋“ค์ด ์‹ ๋ขฐ์„ฑ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์—ญํ• 
      • ์—ฐ๊ฒฐ ๊ธฐ๋ฐ˜(connection oriented)ย : ์ „์†ก ๊ณ„์ธต์ด ํŒจํ‚ท๋“ค์˜ ์ „์†ก์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ์ „์†ก ์‹คํŒจํ•œ ํŒจํ‚ท๋“ค์„ ๋‹ค์‹œ ์ „์†ก
    5. 5๊ณ„์ธต -์„ธ์…˜ ๊ณ„์ธต(Session Layer)
      • ๋ฐ์ดํ„ฐ๊ฐ€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋…ผ๋ฆฌ์ ์ธ ์—ฐ๊ฒฐ(์„ธ์…˜)์„ ๋‹ด๋‹น
      • TCP/IP ์„ธ์…˜์„ ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐ
      • ์–‘ ๋๋‹จ์˜ ์‘์šฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต (๋™์‹œ ์†ก์ˆ˜์‹  ๋ฐฉ์‹(duplex), ๋ฐ˜์ด์ค‘ ๋ฐฉ์‹(half-duplex), ์ „์ด์ค‘ ๋ฐฉ์‹(Full Duplex) ๋“ฑ)
    6. 6๊ณ„์ธต - ํ‘œํ˜„ ๊ณ„์ธต(Presentation Layer)
      • ๋ฐ์ดํ„ฐ ํ‘œํ˜„์ด ์ƒ์ดํ•œ ์‘์šฉ ํ”„๋กœ์„ธ์Šค์˜ ๋…๋ฆฝ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ์•”ํ˜ธํ™”
      • ์ฝ”๋“œ ๊ฐ„์˜ ๋ฒˆ์—ญ ๋‹ด๋‹น, MIME ์ธ์ฝ”๋”ฉ์ด๋‚˜ ์•”ํ˜ธํ™” ๋“ฑ์„ ์ˆ˜ํ–‰
    7. 7๊ณ„์ธต - ์‘์šฉ ๊ณ„์ธต(Application Layer)
      • ์ตœ์ข… ๋ชฉ์ ์ง€๋กœ์„œ, ์‘์šฉ ํ”„๋กœ์„ธ์Šค์™€ ์ง์ ‘ ๊ด€๊ณ„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์‘์šฉ ์„œ๋น„์Šค๋ฅผ ์ˆ˜ํ–‰ (HTTP, FTP, SMTP, POP3, IMAP, Telnet ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ)
  • TCP/IP 4๊ณ„์ธต์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    • OSI ์ฐธ์กฐ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์—…์ ์ด๊ณ  ์‹ค๋ฌด์ ์œผ๋กœ ์ด์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™”๋œ ๋ชจํ˜•
    TCP/IP 4๊ณ„์ธต ์—ญํ•  ๋ฐ์ดํ„ฐ ๋‹จ์œ„ ์ „์†ก์ฃผ์†Œ ์˜ˆ์‹œ ์žฅ๋น„
    L4
    ์‘์šฉ ๊ณ„์ธต ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ๋ฐ์ดํƒ€ ์†ก์ˆ˜์‹  Data/Message - ํŒŒ์ผ ์ „์†ก, ์ด๋ฉ”์ผ, FTP, HTTP, SSH, Telnet, DNS, SMTP ๋“ฑ -
    L3
    ์ „์†ก ๊ณ„์ธต ํ˜ธ์ŠคํŠธ ๊ฐ„ ์ž๋ฃŒ ์†ก์ˆ˜์‹  Segment Port TCP, UDP, RTP, RTCP ๋“ฑ ๊ฒŒ์ดํŠธ์›จ์ด
    L2
    ์ธํ„ฐ๋„ท ๊ณ„์ธต ๋ฐ์ดํƒ€ ์ „์†ก์„ ์œ„ํ•œ ๋…ผ๋ฆฌ์  ์ฃผ์†Œ ์ง€์ • ๋ฐ ๊ฒฝ๋กœ ์ง€์ • Packet IP IP, ARP, ICMP, RARP, OSPF ๋ผ์šฐํ„ฐ
    L1
    ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ณ„์ธต ์‹ค์ œ ๋ฐ์ดํƒ€์ธ ํ”„๋ ˆ์ž„์„ ์†ก์ˆ˜์‹  Frame MAC Ethernet, PPP, Token Ring ๋“ฑ ๋ธŒ๋ฆฌ์ง€, ์Šค์œ„์น˜
    1. L1 - ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ณ„์ธต(Network Access Layer/Network Interface Layer)
      • ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์ „์†ก๋˜๋Š”์ง€๋ฅผ ์ •์˜
      • MAC, LAN, ํŒจํ‚ท๋ง ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ (์˜ˆ: Ethernet, PPP, Token Ring ๋“ฑ)
    2. L2 - ์ธํ„ฐ๋„ท ๊ณ„์ธต(Internet Layer)
      • ํ†ต์‹  ๋…ธ๋“œ ๊ฐ„์˜ IPํŒจํ‚ท์„ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ(๊ฒฝ๋กœ ์„ค์ •)์„ ๋‹ด๋‹น
      • IP, ARP, RARP ๋“ฑ
    3. L3 - ์ „์†ก ๊ณ„์ธต(Transport Layer)
      • ํ†ต์‹  ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ ์ œ์–ดํ•˜๊ณ , ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ด๋‹น
      • TCP, UDP ๋“ฑ
    4. L4 - ์‘์šฉ ๊ณ„์ธต(Application Layer)
      • TCP/UDP ๊ธฐ๋ฐ˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ ๋ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ๋‹ด๋‹น
      • FTP, HTTP, SSH ๋“ฑ
  • ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด(Apache, Nginx)๋Š” OSI 7๊ณ„์ธต ์ค‘ ์–ด๋””์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    • ์‘์šฉ๊ณ„์ธต(Application Layer)์—์„œ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค.
    • ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ HTML, CSS, Javascript, image์™€ ๊ฐ™์€ ์ •์ ์ธ ์ •๋ณด๋“ค์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • HTTP ํ”„๋กœํ† ์ฝœ์€ OSI 7 ๊ณ„์ธต์ธ Application Layer์— ์œ„์น˜ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ์„œ, ๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด(Apache, Nginx)์˜ ์„œ๋ฒ„ ๊ฐ„ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์€ OSI 7๊ณ„์ธต ์ค‘ ์–ด๋””์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

    • ์„œ๋ฒ„๊ฐ„ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์€ 3๊ณ„์ธต์ธ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต(Network Layer)์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ์ง€๊นŒ์ง€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


DNS๋ž€?


  • ์˜ˆ๋ฅผ ๋“ค์–ด, www.example.com๊ณผ ๊ฐ™์ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์„ย 192.0.2.1๊ณผ ๊ฐ™์€ ์ˆซ์ž IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ปดํ“จํ„ฐ๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • ์ธํ„ฐ๋„ท์˜ DNS ์‹œ์Šคํ…œ์€ ์ด๋ฆ„๊ณผ ์ˆซ์ž ๊ฐ„์˜ ๋งคํ•‘์„ ๊ด€๋ฆฌํ•˜์—ฌ, ๋งˆ์น˜ย ์ „ํ™”๋ฒˆํ˜ธ๋ถ€์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  • DNS ์„œ๋ฒ„๋Š” ์ด๋ฆ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•  ๋•Œ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋ฅผ ์–ด๋–ค ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ œ์–ดํ•œ๋‹ค. =ย ์ฟผ๋ฆฌ

  • ๋™์ž‘์›๋ฆฌ

    image

    1. ์›น ๋ธŒ๋ผ์šฐ์ €์—ย www.naver.com์„ ์ž…๋ ฅํ•˜๋ฉด, Local DNS์—๊ฒŒย "www.naver.com"์ด๋ผ๋Š” hostname์— ๋Œ€ํ•œ IP ์ฃผ์†Œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
      • Local DNS์— ์—†์œผ๋ฉด ๋‹ค๋ฅธ DNS name ์„œ๋ฒ„ ์ •๋ณด(Root DNS ์ •๋ณด)๋ฅผ ๋ฐ›๋Š”๋‹ค.
    2. Root DNS ์„œ๋ฒ„์—ย "www.naver.com"์— ๋Œ€ํ•ด ์š”์ฒญํ•œ๋‹ค.
    3. Root DNS ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ "com ๋„๋ฉ”์ธ"์„ ๊ด€๋ฆฌํ•˜๋Š” TLD (Top-Level Domain) ์ด๋ฆ„ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
    4. TLD์—ย "www.naver.com"์— ๋Œ€ํ•ด ์š”์ฒญํ•œ๋‹ค.
    5. TLD์—์„œ "name.com" ๊ด€๋ฆฌํ•˜๋Š” DNS ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
    6. "example.com" ๋„๋ฉ”์ธ์„ ๊ด€๋ฆฌํ•˜๋Š” DNS ์„œ๋ฒ„์—ย "www.naver.com"ย ํ˜ธ์ŠคํŠธ๋„ค์ž„์— ๋Œ€ํ•œ IP ์ฃผ์†Œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
    7. Local DNS ์„œ๋ฒ„์—๊ฒŒย www.naver.com์— ๋Œ€ํ•œ IP ์ฃผ์†Œ(์˜ˆ:222.122.195.6)๋ฅผ ์‘๋‹ต ๋ฐ›๋Š”๋‹ค.
    8. Local DNS๋Š”ย www.naver.com์— ๋Œ€ํ•œ IP ์ฃผ์†Œ๋ฅผ ์บ์‹ฑ์„ ํ•˜๊ณ  IP ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.


HTTP


  • HTTP์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

World Wide Web์—์„œ ํ•˜์ดํผํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ํ†ต์‹ ๊ทœ์•ฝ์ž…๋‹ˆ๋‹ค.

  • HTTP์™€ HTTPS์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.

HTTP๋Š” ๋”ฐ๋กœ ์•”ํ˜ธํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ํŒจํ‚ท์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๊ณ , ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์•ˆ์ด ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด HTTPS์ž…๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ๊ฑฐ์ณ์„œ ํŒจํ‚ท์„ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • HTTPS์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ณ  SSL Handshake์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

HTTPS๋Š” HTTP ํ†ต์‹ ์„ ํ•˜๋Š” ์†Œ์ผ“ ๋ถ€๋ถ„์„ SSL์ด๋‚˜ TSL์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ๋Œ€์ฒดํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HTTPS๋Š” ์ œ3์ž ์ธ์ฆ, ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”, ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ œ3์ž ์ธ์ฆ์€ ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ๊ธฐ๊ด€์— ๋“ฑ๋ก๋œ ์ธ์ฆ์„œ๋งŒ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์ด๊ณ ,

๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ฐ€ํ‚ค ์•”ํ˜ธํ™”๋Š” ํ†ต์‹ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

SSL Handshake ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๋Š” TCP 3way handshake๋ฅผ ์ˆ˜ํ–‰ํ•œ ์ดํ›„ Client Hello๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  2. ์„œ๋ฒ„๋Š” ์ธ์ฆ์„œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  3. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋“ฑ๋ก๋œ ์ธ์ฆ๊ธฐ๊ด€์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์ธ์ฆ์„œ๋Š” ์ธ์ฆ๊ธฐ๊ด€์˜ ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด์žˆ๊ณ , ๊ณต๊ฐœํ‚ค๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํด๋ผ์ด์–ธํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋‚ด์žฅ๋œ ๊ณต๊ฐœํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ๋น„๋ฐ€ํ‚ค๋ฅผ ์•”ํ˜ธํ™”ํ•ด์„œ ์„œ๋ฒ„์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  4. ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๊ฐœ์ธํ‚ค๋กœ ํ™•์ธํ•˜๊ณ  ์ดํ›„ ํ†ต์‹ ์€ ๊ณต์œ ๋œ ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

  5. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ํ—จ๋“œ์‰์ดํฌ ๋‹จ๊ณ„๋ฅผ ์„œ๋กœ์—๊ฒŒ ์•Œ๋ฆฐ๋‹ค.

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง•
  1. ๋น„์—ฐ๊ฒฐ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. (Connectionless) ํด๋ผ์ด์–ธํŠธ๊ฐ€ request๋ฅผ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์š”์ฒญ์— ๋งž๋Š” response๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฐ”๋กœ ์—ฐ๊ฒฐ์„ ๋Š์Šต๋‹ˆ๋‹ค.

  2. ์ƒํƒœ์ •๋ณด ์œ ์ง€๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (Stateless) ์—ฐ๊ฒฐ์„ ๋Š๋Š” ์ˆœ๊ฐ„ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ํ†ต์‹ ์€ ๋๋‚˜๋ฉฐ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • HTTP 1.1 VS 2.0

HTTP/1.1๋Š” Connection๋‹น ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ•˜๋„๋ก ์„ค๊ณ„ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋™์‹œ์ „์†ก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฃจ์–ด ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ HTTP๋ฌธ์„œ ์•ˆ์— ํฌํ•จ๋œ ๋‹ค์ˆ˜์˜ ๋ฆฌ์†Œ์Šค (CSS, JS, Images)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์š”์ฒญํ•  ๋ฆฌ์†Œ์Šค ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•ด์„œ Latency(๋Œ€๊ธฐ ์‹œ๊ฐ„)๋Š” ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


HTTP/1.1 ๋‹จ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • HOL(Head Of Line) Blocking ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ๋งค ์š”์ฒญ๋ณ„๋กœ connection์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, TCP์ƒ์—์„œ ๋™์ž‘ํ•˜๋Š” HTTP์˜ ํŠน์„ฑ์ƒย 3-way handshake๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚˜๊ณ ย ๋ถˆํ•„์š”ํ•œ RTT์ฆ๊ฐ€์™€ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • Header ๊ตฌ์กฐ๊ฐ€ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค. HTTP/1.1์˜ ํ—ค๋”์—๋Š” ๋งŽ์€ ๋ฉ”ํƒ€์ •๋ณด๋“ค์ด ์ €์žฅ๋˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ย 

    ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์›นํŽ˜์ด์ง€๋Š” ๋‹ค์ˆ˜์˜ HTTP์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐย ๋งค ์š”์ฒญ์‹œ ๋งˆ๋‹ค ์ค‘๋ณต๋œ ํ—ค๋”๊ฐ’์„ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


HTTP/2.0 ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ•œ ์ปค๋„ฅ์…˜์œผ๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์žˆ์œผ๋ฉฐ, ์‘๋‹ต์€ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด stream์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›์Šต๋‹ˆ๋‹ค.

    HTTP/1.1์˜ Connection Keep-Alive, Pipelining์˜ ๊ฐœ์„ ์ด๋ผ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ, ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์ด ๋Šฆ์–ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ HTML๋ฌธ์„œ ์•ˆ์— CSSํŒŒ์ผ 1๊ฐœ์™€ ImageํŒŒ์ผ 2๊ฐœ๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ๊ฐ ์š”์ฒญํ•˜๊ณ  ๋‚œ ํ›„ ImageํŒŒ์ผ๋ณด๋‹ค CSSํŒŒ์ผ์˜ ์ˆ˜์‹ ์ด ๋Šฆ์–ด์ง€๋Š” ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง์ด ๋Šฆ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    HTTP/2์˜ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๊ฐ„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์š”์ฒญํ•˜์ง€๋„ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๋ณด๋‚ด์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTML๋ฌธ์„œ๋ฅผ ์š”์ฒญํ–ˆ๊ณ  ํ•ด๋‹น HTML์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค(CSS, Image)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, HTTP/1.1์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญํ•œ HTML๋ฌธ์„œ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„ HTML๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์žฌ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

    HTTP/2์—์„  Server Push๋ฅผ ์ด์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜์ง€๋„ ์•Š์€ (HTML๋ฌธ์„œ์— ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค) ๋ฆฌ์†Œ์Šค๋ฅผ Push ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ตœ์†Œํ™” ํ•ด์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด ๋ƒ…๋‹ˆ๋‹ค.

    ์ด๋ฅผ PUSH_PROMISE ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ PUSH_PROMISE๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด์„  ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • HTTP ์‘๋‹ต์ฝ”๋“œ

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ ์ƒํƒœ๋ฅผ ์‘๋‹ต์—์„œ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ๋ถ„ ์„ค๋ช…
1xx (Informational) ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜์–ด ์ฒ˜๋ฆฌ์ค‘
2xx (Successful) ์š”์ฒญ ์ •์ƒ ์ฒ˜๋ฆฌ
3xx (Redirection) ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ํ–‰๋™์ด ํ•„์š”
4xx (Client Error) ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜, ์ž˜๋ชป๋œ ๋ฌธ๋ฒ•๋“ฑ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ
5xx (Server Error) ์„œ๋ฒ„ ์˜ค๋ฅ˜, ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•จ



โœ”๏ธย ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” HTTP ์‘๋‹ต ์ฝ”๋“œ

  • 200 OK - ์š”์ฒญ ์„ฑ๊ณต

  • 201 Created - ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต

  • 204 No Content - ์š”์ฒญ์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋”ฑํžˆ ๋ณด๋‚ด์ค„ ๋‚ด์šฉ์ด ์—†์Œ

  • 400 Bad Request - ์ž˜๋ชป๋œ ์š”์ฒญ

  • 401 Unauthorized - ๋น„์ธ์ฆ ์š”์ฒญ

  • 403 Forbidden - ๋น„์Šน์ธ ์š”์ฒญ

  • 404 Not Found - ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ

  • 500 Internal Server Error - ์„œ๋ฒ„ ์—๋Ÿฌ

  • 503 Service Unavailable - ์„œ๋น„์Šค๊ฐ€ ์ด์šฉ ๋ถˆ๊ฐ€๋Šฅํ•จ

  • HTTP Method - PUT๊ณผ PATCH์˜ ์ฐจ์ด

  • PUT: ๋ฆฌ์†Œ์Šค์˜ ์ „์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฆฌ์†Œ์Šค๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.)

  • PATCH: ๋ฆฌ์†Œ์Šค์˜ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ๋ก ์ ์œผ๋กœ UPDATE์™€ ๋” ๊ฐ€๊น๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


TCP์™€ UDP


  • TCP์™€ UDP์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

TCP๋Š” ์—ฐ๊ฒฐ ์ง€ํ–ฅํ˜• ํ”„๋กœํ† ์ฝœ์ด๊ณ  UDP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋‹จ์œ„๋กœ ์ „์†กํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

TCP๋Š” ๊ฐ€์ƒ ํšŒ์„ ์„ ๋งŒ๋“ค์–ด ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋„๋ก (ํ๋ฆ„ ์ œ์–ด, ํ˜ผ์žก ์ œ์–ด, ์˜ค๋ฅ˜ ์ œ์–ด)ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ

๋”ฐ๋กœ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ๊ฐ€ ์—†๋Š” UDP์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋А๋ฆฐ ํŽธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ TCP๋Š” ๊ทธ๋ž˜์„œ ํŒŒ์ผ ์ „์†ก๊ณผ ๊ฐ™์€ ์‹ ๋ขฐ์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๊ณ ,


UDP๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ, RTP์™€ ๊ฐ™์ด ์—ฐ์†์„ฑ์ด ๋” ์ค‘์š”ํ•œ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ UDP๋„ ์‹ ๋ขฐ์„ฑ์„ UDP ์ž์ฒด์—์„œ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๋ฟ์ด์ง€, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ HTTP/3์€ QUIC์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š”๋ฐ, QUIC์€ UDP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, UDP ์ž์ฒด๋Š” ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์ง€๋งŒ, ์ถ”๊ฐ€์ ์ธ ์ •์˜๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”ย 3 way hand shake์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.

TCP 3way handshake๋Š” ๊ฐ€์ƒํšŒ์„ ์„ ์ˆ˜๋ฆฝํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

SYN, ACK ํŒจํ‚ท์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ, ์ž„์˜์˜ ๋‚œ์ˆ˜๋กœ SYN ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „์†กํ•˜๊ณ , ACK ํ”Œ๋ž˜๊ทธ์—๋Š” 1์„ ๋”ํ•œ๊ฐ’์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ์ˆœ์„œ๋Š” SYN(n) โ†’ ACK(n + 1), SYN(m) โ†’ ACK(m + 1) ์ˆœ์œผ๋กœ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย ์™œ ์ž„์˜์˜ ๋‚œ์ˆ˜๋กœ ์ง€์ •ํ•˜๋‚˜์š”?

Connection์„ ๋งบ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ๋Š” ์œ ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‘ ํ†ต์‹  ํ˜ธ์ŠคํŠธ๊ฐ€ ๊ณผ๊ฑฐ์— ์‚ฌ์šฉ๋œ ํฌํŠธ ๋ฒˆํ˜ธ ์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ธก์—์„œ๋Š” ํŒจํ‚ท์˜ SYN์„ ๋ณด๊ณ  ํŒจํ‚ท์„ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋‚œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆœ์ฒ˜์ ์ธ Number๊ฐ€ ์ „์†ก๋œ๋‹ค๋ฉด ์ด์ „์˜ Connection์œผ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ํŒจํ‚ท์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ๋‚œ์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค”ย 4 way hand shake์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.

TCP์˜ย ์—ฐ๊ฒฐ์„ ํ•ด์ œ(Connection Termination)ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ์—ฐ๊ฒฐ ํ•ด์ œ๋ฅผ ํ†ต์ง€ํ•˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ด๋ฅผ ๋ฐ›์•˜์Œ์„ ์ „์†กํ•ด์ฃผ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

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

๐Ÿค”ย TCP์˜ ์—ฐ๊ฒฐ ์„ค์ • ๊ณผ์ •(3๋‹จ๊ณ„)๊ณผ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๊ณผ์ •(4๋‹จ๊ณ„)์ด ๋‹จ๊ณ„๊ฐ€ ์ฐจ์ด๋‚˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

Client๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋งˆ์ณค๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ Server๋Š” ์•„์ง ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ FIN์— ๋Œ€ํ•œ ACK๋งŒ ๋ณด๋‚ด๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ „์†กํ•œ ํ›„์— ์ž์‹ ๋„ FIN ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.