- 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๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์ถ์๋, ์ด๋ค ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ผํ ๊น์
- 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์ ๋ํด์ ์ค๋ช ํ์ธ์.
ํต์ฌ๋ต๋ณ
RDBMS๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํด์ง ์คํค๋ง์ ๋ฐ๋ผ ํ๊ณผ ์ด์ ๊ฐ์ถ 2์ฐจ์ ํ ์ด๋ธ ํํ๋ก ๊ตฌ์ฑํ๋ฉฐ ์์ฑ(Attribute)๊ณผ ๊ฐ(Value)์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์, ์ ์ฅ, ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ ์์ฑ๊ณผ ๊ฐ์ ๊ฐ์ง ํ ์ด๋ธ์ ์ธ๋ ํค(foreign key)๋ฅผ ์ด์ฉํด ์๋ก ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก SQL์ด๋ผ๋ ์ธ์ด๋ฅผ ํ์ฉํฉ๋๋ค.
NoSQL์ SQL์ธ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ
์
๋๋ค. ์ ํด์ง ์คํค๋ง๊ฐ ์์ด, ํน์ ๋์จํ ํํ์ ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ฉฐ ํ
์ด๋ธ ๊ฐ ๊ด๊ณ๋ ์ ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Key ๊ฐ์ ๊ฐ์ง๊ณ ๋ฐ์ดํฐ์ ๋ํ ์
,์ถ๋ ฅ์ ์ํํฉ๋๋ค. ๋ค์ํ ํํ์ NOSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๊ณ , ๋ํ์ ์ผ๋ก key-value store, document db, graph db ๋ฑ์ด ์์ต๋๋ค.
๐คย ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ ๋ฌด์์ด ์๊ณ , ์ธ๋ํค๋ ๋ฌด์์ธ๊ฐ์?
ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ ๊ด๊ณ๋ฅผ ๋งบ๋ ํ ์ด๋ธ์ ์์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ์์ต๋๋ค.
- ์ผ๋์ผ(one-to-one) ๊ด๊ณ
- ์ผ๋๋ค(one-to-many) ๊ด๊ณ
- ๋ค๋๋ค(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๋ ํญ์ ์ ๋ ฌ๋์ด ์๋ ์ํ์ด๋ฉฐ ๋ฐ์ดํฐ๋ค๊ฐ์ ๋ฒ์๋ฅผ ์ฌ์ฉํด์ ์์๋ ธ๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค์ ๋งค์ฐ ์ ๋ฆฌํฉ๋๋ค.
ํธ๋์ญ์
์ ์ผ๊ด์ฑ ์๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ์์ผ๋ก ๋
๋ฆฝ์ ์ด๊ฒ ์ฒ๋ฆฌ๋๋ ์์
๋จ์์
๋๋ค.
๋ฐ๋ผ์ ์์์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํด๋ 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์ ์ด๋ค ๊ฒฝ์ฐ์ ํ๋์?
ํ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด ํธ๋์ญ์ ์ ์์์ฑ์ ์ํด ๋กค๋ฐฑ์ ์ฌ์ฉํฉ๋๋ค.
ํธ๋์ญ์ ์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค ์๋ฌ๊ฐ ๋ฐ์ํ ๋, ํธ๋์ญ์ ์ ๋กค๋ฐฑํจ์ผ๋ก์จ ํด๋น ํธ๋์ญ์ ์์ ์์ ํ ๋ชจ๋ ์ฐ์ฐ์ ์ทจ์ํ์ฌ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ์ง ์๋๋ก ํฉ๋๋ค.
๋กค๋ฐฑํ๊ณ ๋ ํ์๋ ํด๋น ํธ๋์ญ์
์ ์ฌ์์ํ๊ฑฐ๋ ํ๊ธฐํด์ผ ํฉ๋๋ค.
๐คย 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๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐คย JPA๊ฐ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
์์์ ํตํด, ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ค๋ฉด, ๋ถ๋ชจํด๋์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค์์๋ ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ธฐ์, ์บก์ํ๋ฅผ ์๋ฐํฉ๋๋ค.
๋ํ, ์์น ์์ ๋ฉ์๋๋ค๋ ์์๋ฉ๋๋ค. ์์น ์์ ๋ฉ์๋๋ ์์๋๋ฉด ์๋์น ์์ ๋ฒ๊ทธ๋ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด, ํจ์์ ํน์ง๋ง์ ์ ์ํ๊ณ ํจ์์ ๋ด์ฉ์ด ์๊ธฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ต๋๋ค.
ํด๋์ค์ ๊ธฐ๋ณธ ํ์ ์ ๊ณตํ์ฌ ์ ์๋ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ์, ๊ฐ๋ฐ์๋ค์๊ฒ ์ ํํ๋ ๊ฐ๋ฐ์ ํ ์ ์๊ฒ ํด์ค ์ ์์ต๋๋ค.
๐คย JPA๋ฅผ ์ฌ์ฉํ ๋์ ์ด์ ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
JPA๋ ORM๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ RDBMS์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์กฐ์ํ ํ์์์ด, ์๋ฐ์ฝ๋๋ก ํํํ์ฌ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ทธ๋ก์ธํด JPA์ ์ต์ํ๋ค๋ฉด ์์ฐ์ฑ์ด ๋์์ง๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ๋ฆฌํ์๋ฉด, ์์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, DB์ ๊ทผ ์ต์ํ๋ก์ธํ ์ฑ๋ฅ ์ต์ ํ(์์์ฑ ์ปจํ
์คํธ), ํจ๋ฌ๋ค์ ๋ถ์ผ์น ํด๊ฒฐ, ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋
๋ฆฝ์ฑ์ด ์์ต๋๋ค.
๐คย JPA์ ๋จ์ ์ ๋ฌด์์ธ๊ฐ์
JPA๋ ์๋์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์, ํต๊ณ์ฒ๋ฆฌ์ ๊ฐ์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ณด๋ค ์ค์๊ฐ ์ฟผ๋ฆฌ์ ์ต์ ํ ๋์ด ์์ต๋๋ค.๋ฐ๋ผ์, ๋ฏธ์ธํ๊ณ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํด์ผํ ๋๋ Mybatis์ ๊ฐ์ Mapper๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
๐คย JPA ์์์ฑ ์ปจํ ์คํธ์ ์ด์ (5๊ฐ์ง)๋ฅผ ์ค๋ช ํด์ฃผ์ธ์.
์์์ฑ ์ปจํ ์คํธ๋, ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ ์ ์ฅํ๋ ํ๊ฒฝ์ ์๋ฏธํฉ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ด๊ธฐ๋๋ฌธ์ ๋์ ๋ณด์ด์ง ์์ง๋ง, JPA๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๊ณ ํ์๋, ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ์ด๋๊ณ ์ดํ DB์ ๋ฐ์๋ฉ๋๋ค.
์ด๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ DB์ฌ์ด ์์์ฑ์ปจํ ์คํธ๋ฅผ ๋์์ ๋์ ์ด์ ์ 1์ฐจ์บ์, ๋์ผ์ฑ ๋ณด์ฅ, ํธ๋์ ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ, ๋ณ๊ฒฝ๊ฐ์ง, ์ง์ฐ๋ก๋ฉ 5๊ฐ์ง๊ฐ ์์ต๋๋ค.
-
1์ฐจ ์บ์
- ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์์๋ 1์ฐจ ์บ์๊ฐ ์กด์ฌํ๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ๋ ์๊ฐ, ๋ฐ์ดํฐ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํฉ๋๋ค.
- 1์ฐจ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ด์ ์ด ์๋๋ฐ, find()๋ฅผ ํ์ ๋น์ 1์ฐจ์บ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ฉด, DB์ ์ ๊ทผํ์ง ์๊ณ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
-
๋์ผ์ฑ ๋ณด์ฅ
- ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋๋ ์ํฐํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ฒฝ์ฐ ๋์ผ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
-
ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
- ์ํฐํฐ๋ค์๋ํ ๋ฐ์ดํฐ ์ ์ด๊ฐ ์ผ์ด๋ ๋, JPA๋ ๋ฐ๋ก DB์ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ฐ์ ์ ์ผ๋ก 1์ฐจ์บ์์ ์ ์ฅํ๊ณ ,
commit()์ ์ฟผ๋ฆฌ๋ฌธ๋ค์ DB์ ๋ณด๋ ๋๋ค. flush()๋ 1์ฐจ์บ์๋ฅผ ์ง์ฐ์ง ์๊ณ , ์ฟผ๋ฆฌ๋ฅผ DB์ ๋ ๋ ค DB์ ์ฑํฌ๋ ๋ง์ถ๋ ์ญํ ์ ํ๊ณ- ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๊ณ ๋ ํ
commit()์ ํ๊ฒ ๋ฉ๋๋ค. - ํธ๋์ญ์
์ ์ปค๋ฐ์ ์ด
flush()์commit()2๊ฐ์ง ์ผ์ ํ๊ฒ ๋ฉ๋๋ค.
-
๋ณ๊ฒฝ ๊ฐ์ง (Dirty checking)
-
JPA๋ก ์ํฐํฐ๋ฅผ ์์ ํ ๋๋ update()๋ persist()๋ก ์์์ฑ์ปจํ ์คํธ์ ์๋ ค์ฃผ์ง ์๊ณ ๋จ์ํ ์ํฐํฐ๋ฅผ ์กฐํํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
-
๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ๋ํฐ ์ฒดํน์ด๋ผ ํ๋๋ฐ ๋ฐ์ดํฐ๊ฐ 1์ฐจ์บ์์ ์ ์ฅ๋ ๋ ๋์์ ์ค๋ ์ท ํ๋๋ ์ ์ฅ์ด ๋ฉ๋๋ค.
-
commit()๋๋ flush()๊ฐ ์ผ์ด๋ ๋, ๋ณ๊ฒฝ๋ ์ํฐํฐ์ ๋ด์ฉ๊ณผ, 1์ฐจ์บ์์ ์ ์ฅ๋ ์ค๋ ์ท์ ๋น๊ตํด์, ๋ณ๊ฒฝ์ฌํญ์ด ์์ผ๋ฉด Update SQL์ ๋ง๋ค์ด ๋ฐ์ํฉ๋๋ค.
-
๋ณ๊ฒฝ๊ฐ์ง์ ํ๋ฆ
- ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ฉด ์ํฐํฐ ๋งค๋์ ๋ด๋ถ์์ ๋จผ์ ํ๋ฌ์๊ฐ ํธ์ถ๋๋ค.
- ์ํฐํฐ์ ์ค๋ ์ท์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ์ํฐํฐ๋ฅผ ์ฐพ๋๋ค.
- ๋ณ๊ฒฝ๋ ์ํฐํฐ๊ฐ ์์ผ๋ฉด ์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ ์ฅํ๋ค.
- ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ SQL์ ํ๋ฌ์ํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ค.
-
-
์ง์ฐ ๋ก๋ฉ
- ์ง์ฐ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด, ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
- ์ด ๋์ ์ด์ ์, 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๋ ๋ก๊ทธ ๊ธฐ๋ฒ์ ๋ํด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๊ฐ?
- ํ์ค ์ถ๋ ฅ: application.properties์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ฐ๋จํ ๋ฐฉ์์ด์ง๋ง ๋ก๊น ํ๋ ์ ์ํฌ๋ฅผ ์ต์ ํํ์ง ์๊ณ ๋ชจ๋ ๊ฒ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ง์ ์ธ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋๋ ๋ฐฉ์์ ์๋๋๋ค.
spring.jpa.show-sql=true- ๋ก๊ฑฐ๋ฅผ ํตํ ์ฒ๋ฆฌ: ์์ฑ ํ์ผ์์ ๋ก๊ฑฐ๋ฅผ ๊ตฌ์ฑํด SQL๋ฌธ์ ๊ธฐ๋กํ๋ ๋ฐฉ์๋ ์์ต๋๋ค.
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE- 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๊ฐ์ง๊ฐ ์์ต๋๋ค.
-
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(); }
-
EntityGraph
@EntityGraphJPQL์์ fetch join์ ํ๊ฒ ๋๋ฉด ํ๋์ฝ๋ฉํด์ผํ๋ ๋จ์ ์ด ์์ต๋๋ค.- ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด
@EntityGraph์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@EntityGraph(attributePaths = {"articles"}, type = EntityGraphType.FETCH) @Query("select distinct u from User u left join u.articles") List<User> findAllEntityGraph();
-
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);
Spring Data JPA๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ CRUD ๋ฉ์๋ ๋ฐ ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ์ผ๋ก ๋ถ์กฑํ ๊ธฐ๋ฅ์ ๋ณด๊ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๊ณ ,
JPQL์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ง์ ์์ฑํ ์ฟผ๋ฆฌ ์คํธ๋ง์ด ๋ฐํ์ ์์ ์คํ ํน์ ๋ฌธ๋ฒ์ ์ธ ์ค๋ฅ๋ก ์ธํ ์๋น์ค์ ํฌ๋ฆฌํฐ์ปฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์ QueryDSL์ ์ฌ์ฉํฉ๋๋ค.
-
์ฐจ์ด์
JPQL์ ๊ฒฝ์ฐ ์ง์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ ๋ ฅํด์ค์ผํ๋ ๋ฐ๋ฉด, QueryDSL์ ์๋ฐ ์ฝ๋๋ก ์ด๋ค์ ธ์์ด ๋ฌธ๋ฒ๊ณผ ์คํ์ ๋ํ ์๋ฌ๋ฅผ ๊ฐ๋ฐ๋จ๊ณ์์ ์ก์ ์ ์์ต๋๋ค.
๐ค QueryDSL ์ฅ์ ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
- ๋ฌธ์๊ฐ ์๋ ์ฝ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํจ์ผ๋ก์จ, ์ปดํ์ผ ์์ ์ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
- ์๋์์ฑ ๋ฑ IDE์ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค.
- ๋์ ์ธ ์ฟผ๋ฆฌ ์์ฑ์ด ํธ๋ฆฌํฉ๋๋ค.
- ์ฟผ๋ฆฌ ์์ฑ์ ์ ์ฝ ์กฐ๊ฑด๋ฑ์ ๋ฉ์๋ ์ถ์ถ์ ํตํด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ๊ทํ(Nomalization)๊ฐ ๋ฌด์์ธ๊ฐ์? ๋น์ ๊ทํ(Denormalization)๋ ๋ฌด์์ด๊ณ , ์ธ์ ์ํํ๊ฒ ๋๋์ง ์ค๋ช
ํด์ฃผ์ธ์.
-
์ ๊ทํ(Normalization)
- ์ด์ํ์์ด ์กด์ฌํ๋ ํ ์ด๋ธ์ ๋ถํดํ์ฌ ์ฌ๋ฌ ๊ฐ์ ํ ์ด๋ธ์ ์์ฑํ๋ ๊ณผ์
- ์ฅ์
- ๋ฐ์ดํฐ ์ ์ฅ์ ๋ํ ํจ์จ์ฑ
- ํ
์ด๋ธ ๊ฐ ๋ฐ์ดํฐ ์ค๋ณต ๋ฐฉ์ง
- ๋ฌด๊ฒฐ์ฑ ์ ์ง
- DB์ ์ ์ฅ ์ฉ๋ ํ๋ณด
- ํ
์ด๋ธ์ด ๋ถํด๋๋ ์ ๋์ ๋ฐ๋ผ ์ ๊ทํ ๋จ๊ณ๊ฐ ๋๋ ์ง๋ค.
-
์ 1 ์ ๊ทํ
- ํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ์ด ์์๊ฐ(ํ๋์ ๊ฐ)์ ๊ฐ๋๋ก ๋ถํด
-
์ 2 ์ ๊ทํ
- ์ 1 ์ ๊ทํ์ ๋ง์กฑํ๊ณ , ์์ ํจ์ ์ข ์(๊ธฐ๋ณธํค์ ๋ถ๋ถ์งํฉ์ด ๊ฒฐ์ ์๊ฐ ๋์ด์ ์๋จ์ ์๋ฏธ)์ ๋ง์กฑํ๋๋ก ๋ถํด
- ํ์๋ฒํธ๋ก ์กฐํ ์, ๊ฐ์์ค์ด ๋ณต์๊ฐ์ผ๋ก ๋์ฌ ์ ์์ต๋๋ค.
- ์ฆ, ๊ธฐ๋ณธํค(ํ์๋ฒํธ, ๊ฐ์ข์ด๋ฆ) ์ค ๊ฐ์ข์ด๋ฆ์ด ๊ฐ์์ค์ ๊ฒฐ์ ํ๋ ๊ฒฐ์ ์์ด๋ฏ๋ก ๋ณ๋์ ํ ์ด๋ธ๋ก ๋ถํดํด์ค์ผ๋ก์จ ์์ ํจ์์ข ์ ์กฐ๊ฑด ๋ง์กฑ
-
์ 3 ์ ๊ทํ
- ์ 2 ์ ๊ทํ์ ๋ง์กฑํ๊ณ , ์ดํ์ ์ข ์(AโB, BโC = AโC)์ ์์ ๋๋ก ๋ถํด
- ๊ฐ ์์ฑ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์๋ก ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ถํด
- ์๋ฅผ ๋ค์ด, ์ดํ์ ์ข ์์ ๋ฐ๋ฅผ ๊ฒฝ์ฐ ํ์๋ฒํธโ์๊ฐ๋ฃ๊ฐ ๋์ด๋ฒ๋ ค์ ๊ฐ์ข ๋ณ๊ฒฝ ์์๋ ์๊ฐ๋ฃ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, (ํ์๋ฒํธ, ๊ฐ์ข์ด๋ฆ)๊ณผ (๊ฐ์ข์ด๋ฆ, ์๊ฐ๋ฃ) ํ ์ด๋ธ๋ก ๋ถํดํ๋ค
-
BCNF ์ ๊ทํ
- ์ 3 ์ ๊ทํ์ ๋ง์กฑํ๊ณ , ๋ชจ๋ ๊ฒฐ์ ์๊ฐ ํ๋ณดํค๊ฐ ๋๋๋ก ๋ถํด
- ๊ธฐ๋ณธํค(ํ์๋ฒํธ, ํน๊ฐ์ด๋ฆ)๋ ๊ต์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ, ๊ต์ ๋ํ ํน๊ฐ์ด๋ฆ์ ๊ฒฐ์ ํ๋ ๊ฒฐ์ ์์ด๋ค.
- ๋ฌธ์ ๋ ๊ต์๊ฐ ๊ฒฐ์ ์์ด์ง๋ง ํ๋ณดํค๋ ์๋๋ผ๋ ์ ์ด๋ค. ๋ฐ๋ผ์, ๋ชจ๋ ๊ฒฐ์ ์๊ฐ ํ๋ณดํค๊ฐ ๋ ์ ์๋๋ก ๋ถํดํ๋ค.
-
-
๋น์ ๊ทํ(Denomalization)
- ํ๋ ์ด์์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณตํด ๋ฐฐ์นํ๋ ์ต์ ํ ๊ธฐ๋ฒ
- ์์คํ ์ ์ฑ๋ฅ ํฅ์, ๊ฐ๋ฐ ๋ฐ ์ด์์ ํธ์์ฑ ๋ฑ์ ์ํด ์ ๊ทํ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํตํฉ, ์ค๋ณต, ๋ถ๋ฆฌํ๋ ๊ณผ์ ์ ๋๋ค =ย ์๋์ ์ผ๋ก ์ ๊ทํ ์์น์ ์๋ฐฐํ๋ ๊ฒ
- ํ๋ ์ด์์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณตํด ๋ฐฐ์นํ๋ ์ต์ ํ ๊ธฐ๋ฒ
-
๐ก ์ธ์ ์ฌ์ฉ๋๋์?
- ๋์คํฌ I/O ๋์ด ๋ง์์ ์กฐํ ์ ์ฑ๋ฅ์ด ์ ํ๋ ๋
- ํ ์ด๋ธ๋ผ๋ฆฌ์ ๊ฒฝ๋ก๊ฐ ๋๋ฌด ๋ฉ์ด ์กฐ์ธ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๊ฐ ์์๋ ๋
- ์นผ๋ผ์ ๊ณ์ฐํ์ฌ ์กฐํํ ๋ ์ฑ๋ฅ์ด ์ ํ๋ ๊ฒ์ด ์์๋ ๋
- (์ผ๋ฐ์ ์ผ๋ก) ์กฐํ์ ๋ํ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ค์ํ๋ค๊ณ ํ๋จ๋ ๋
- ์ฝ์
์ด์
- ๊ด๊ณ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ ์๋์ ์๊ด์์ด ์ํ์ง ์๋ ๊ฐ๋ค๋ ํจ๊ป ์ฝ์ ๋๋ ํ์
- ์ญ์ ์ด์
- ๊ด๊ณ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ ์๋์ ์๊ด์๋ ๊ฐ๋ค๋ ํจ๊ป ์ญ์ ๋๋ ํ์
- ๊ฐฑ์ ์ด์
- ๊ด๊ณ์ ํ์ ์๋ ์์ฑ ๊ฐ์ ๊ฐฑ์ ํ ๋ ์ผ๋ถ ํ์ ๋ฐ์ดํฐ๋ง ๊ฐฑ์ ๋์ด ๋ฐ์ดํฐ์ ๋ชจ์์ด ์๊ธฐ๋ ํ์
- ์ ๊ทํ๋ฅผ ๊ฑฐ์น๋ฉด, ์์ ์ด์๋ค์ด ์ผ์ด๋์ง ์๋๋ก ํ ์ ์๋ค. ๋ํ, ํ์ค์ ์ผ๋ก ๊ณผ๋ํ ์ ๊ทํ๋ DB ์ง์ ์ฒ๋ฆฌ ์๋๋ฅผ ๋จ์ด ๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ 3 ์ ๊ทํ ๋๋ ๋ณด์ด์ค ์ฝ๋ ์ ๊ทํ๊น์ง๋ง ์ ๊ทํ๋ฅผ ์งํํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ๋น์ ๊ทํ ์์
์ ํ๊ธฐ๋ ํ๋ค.
-
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๋ฅผ ์ ์ฅํ ๋ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํค์๋๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ๊ทธ ์ค์์ ๋ญํน์๊ณ ๋ฆฌ์ฆ์ ํตํด์ ๊ฐ์ฅ ์ ์ฌํ ์์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค. ํ ์คํธ๋ฅผ ์ฌ๋ฌ ๋จ์ด๋ก ๋ณํํ๊ฑฐ๋ ํ ์คํธ ํน์ง์ ์ด์ฉํ ๋์์ด, ์ ์์ด๋ฅผ ํ์ฉํ ๊ฒ์๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ํ ๋น์ ํ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ์์ธ์ด ๊ฐ๋ฅํ๊ณ , ํํ์ ๋ถ์์ ํตํ ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. ๋๋ถ์ด ์ญ์ธ๋ฑ์ฑ ์ง์์ผ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค.
๐คย ์ญ์ธ๋ฑ์ฑ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
์ญ์ธ๋ฑ์ฑ์ ๋์ฉ๋ ํ ์คํธ์ ํจ์จ์ ์ธ ๊ฒ์์ ์ํด ๊ณ ์๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ฌธ์๋ฅผ ์ ์๋ฏธํ ๋จ์ด๋ก ๋ถ๋ฆฌํ์ฌ ์ ๋ ฌ๋ ๋ชฉ๋ก์ ์์ฑํ ํ์, ๊ฐ ๋จ์ด๊ฐ ์ด๋ ๋ฌธ์์ ์๋์ง ํ์ํ์ฌ ์์ฑํ๋ ์์ ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋จ์ด๋ค์ด ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ ๋ฐ ํ์์ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ์ด ๋ ๋ฌธ์๋ฅผ ์ ์๋ฏธํ ๋จ์ด๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํด ํํ์ ๋ถ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- A๋ผ๋ ํ ์ด๋ธ์ด ์กด์ฌํ ๋, ์๋ก์ด ์์ฑ(Column)์ ์ถ๊ฐํ๊ณ , ๋ชจ๋ ํ(row)์ Default๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์ถ์๋ค๋ฉด, ์ด๋ค ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ผํ ๊น์?
alter table ~add ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Alter table A add ์ปฌ๋ผ๋ช
์๋ฃํ default ์ด๊น๊ฐ;ํต์ฌ๋ต๋ณ
-
์ฟ ํค
- ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ์ Key-Value์์ด String ํํ๋ก ์ ์ฅ๋๋ ๋ฐ์ดํฐ ํ์ผ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋ ํ์๋ ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ํ ์ ๋ณด(์ด๋ฆ, ๊ฐ, ๋ง๋ฃ ๋ ์ง ๋ฐ ์๊ฐ, ๊ฒฝ๋ก์ ๋ณด)๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
-
์ธ์
- ์ธ์ ์ ์ผ์ ์๊ฐ ๊ฐ์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ค์ด์ค๋ ์ผ๋ จ์ ์์ฒญ์ ํ๋์ ์ํ๋ก ๋ณด๊ณ , ๊ทธ ์ํ๋ฅผ ์ ์งํ๋ ๊ธฐ์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค. ์ํ ์ ์ง ์๋จ์ผ๋ก ์ฟ ํค๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ ๋ก์ปฌ์ด ์๋ ์๋ฒ์ธก์์ ๊ด๋ฆฌํฉ๋๋ค.
-
์ฟ ํค์ ์ธ์ ์ ํ์์ฑ
HTTP ํ๋กํ ์ฝ์ ๊ฒฝ์ฐ โConnectionless, Statelessโํ ํน์ฑ์ด ์์ด ์์ฒญ๊ฐ์ ์์กด๊ด๊ณ๊ฐ ์์ต๋๋ค. ๋ํ ๋งค ํต์ ๋ง๋ค ์๋ก ์ฐ๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ์ ํด๋ผ์ด์ธํธ๊ฐ ์ด์ ์ ์์์ ๊ฐ์์ง๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด ์ ์ ๋ณด์ํ๋ ๋ฐ ์ฟ ํค์ ์ธ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค.
-
๋์๋ฐฉ์
- ์ฟ ํค ๋์๋ฐฉ์
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํฉ๋๋ค.
- ์๋ฒ์์ ์ฟ ํค๋ฅผ ์์ฑํ๊ณ HTTP ํค๋์ ์ฟ ํค๋ฅผ ํฌํจ ์์ผ ์๋ตํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋์ด๋ ์ฟ ํค ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ๋ณด๊ดํ๊ณ ์์ต๋๋ค.
- ๊ฐ์ ์์ฒญ์ ํ ๊ฒฝ์ฐ HTTP ํค๋์ ์ฟ ํค๋ฅผ ํจ๊ป ๋ณด๋ ๋๋ค.
- ์๋ฒ์์ ์ฟ ํค๋ฅผ ์ฝ์ด ์ด์ ์ํ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋, ์ฟ ํค๋ฅผ ์ ๋ฐ์ดํธ ํ์ฌ ๋ณ๊ฒฝ๋ ์ฟ ํค๋ฅผ HTTP ํค๋์ ํฌํจ์์ผ ์๋ตํฉ๋๋ค.
- ์ธ์
๋์๋ฐฉ์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ ์ ์ธ์ ID๋ฅผ ๋ฐ๊ธ ๋ฐ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ธ์ ID์ ๋ํด ์ฟ ํค๋ฅผ ์ฌ์ฉํด์ ์ ์ฅํ๊ณ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญํ ๋, ์ด ์ฟ ํค์ ์ธ์ ID๋ฅผ ๊ฐ์ด ์๋ฒ์ ์ ๋ฌํด์ ์์ฒญํฉ๋๋ค.
- ์๋ฒ๋ ์ธ์ ID๋ฅผ ์ ๋ฌ๋ฐ์์ ๋ณ๋ค๋ฅธ ์์ ์์ด ์ธ์ ID๋ก ์ธ์ ์ ์๋ ํด๋ผ์ด์ธํธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ฒ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํฉ๋๋ค.
- ์ฟ ํค ๋์๋ฐฉ์
- ์ฟ ํค์ ์ธ์
์ ์ธ์ ์ฌ์ฉํ๋์?
- ์ฟ ํค: ํด๋ผ์ด์ธํธ ๋ก์ปฌ์ ์ ์ฅ๋๋ฏ๋ก ๋ณด์์ ์ทจ์ฝํด ๋ก๊ทธ์ธ๊ฐ์ ์ธ์ฆ์๋ ์ ์ฐ์ด์ง ์์ต๋๋ค. ๋จ์ํ ์์ด๋์ ์ ์ฅ์ด๋, ์ผํ๋ชฐ์ ์ฅ๋ฐ๊ตฌ๋ ๋ด์๋๊ธฐ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
- ์ธ์
: ๋ณด์์ ์ค์ํ ์์
์ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋ฉ๋๋ค.
-
๋์ ๋ฐฉ์
-
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ์์ ๊ฒ์ฆํฉ๋๋ค.
- ์ธ์ฆ๋ ์ฌ์ฉ์๋ผ๋ฉด ์๋ฒ์ ๋ก๊ทธ์ธํ ์ ์ ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ณ , Session ID๋ฅผ ๋ฐ๊ธํด ์๋ตํฉ๋๋ค.
- Session ID๋ ์ฟ ํค์ ์ค๋ ค ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ค์ ์์ฒญ์ ํ ๋, Session ID๊ฐ ํค๋์ ๋ด๊ฒจ ์ ์ก๋ฉ๋๋ค.
- ์๋ฒ๋ ์ฟ ํค ๋ด๋ถ์ Session ID๋ฅผ ์ด์ฉํด ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ธํ๊ณ , ์ด ์์ ์ ๋ฐ๋ณต์ผ๋ก ๋ก๊ทธ์ธ์ด ์ ์ง๋ฉ๋๋ค.
-
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ํด๋น ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๊ณ , ์ธ์ฆ๋๋ฉด ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ํ ํฐ์ ์ ์ฅํด๋๊ณ , ์๋ฒ์ ์์ฒญ์๋ง๋ค ํ ํฐ์ HTTP์์ฒญ ํค๋์ ๋ด์ ์๋ฒ์ ํจ๊ป ์ ๋ฌํฉ๋๋ค.
- ์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ , ์์ฒญ์ ์๋ตํฉ๋๋ค.
-
-
์ฅ๋จ์
-
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
- ์ฅ์ : ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ Session ID๋ง ์ ์กํ๊ธฐ ๋๋ฌธ์ ์ฌ์ด์ฆ๊ฐ ์์ต๋๋ค. ์๋ฒ์์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ์กฐ๊ธ ๋ ์์ ํฉ๋๋ค.
- ๋จ์ : ์ค์ ์ธ์ ๊ด๋ฆฌ ์์คํ ์ด ์์ผ๋ฉด ์์คํ ํ์ฅ์ด ์ด๋ ต๊ณ , ์ค์ ์ธ์ ์์คํ ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์์คํ ์ ์ฒด์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ๋ํ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋๊ฐ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
-
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ์ฅ์ : ํ ํฐ์ด ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ ์์ ํ Statelessํฉ๋๋ค. ์ฟ ํค ์ฌ์ฉ์ ๋ฐ๋ฅธ ๋ณด์ ์ทจ์ฝ์ ์ด ์ฌ๋ผ์ง๊ณ , ํ ํฐ์ ์ ํ์ ์ธ ๊ถํ์ ๋ถ์ฌํด ๋ฐ๊ธํ ์ ์์ต๋๋ค. ์์ปจ๋ OAuth ๋ฐฉ์์ Google, Facebook๊ฐ์ ์์ ๊ณ์ ์ ํตํ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ์ด ๊ฐ๋ฅํด ์ง์ ์ ์ธ ์ด์๊ณผ ๊ด๋ฆฌ ๋ถ๋ด์ด ์ ์ต๋๋ค.
- ๋จ์ : ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ ์ธ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ๋์ด๋ฉ๋๋ค. ๋ํ์ ์ธ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ธ JWT์ ๊ฒฝ์ฐ Payload ์์ฒด๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ด์ ์ ์๋ ์ ๋ณด๊ฐ ์ ํ์ ์
๋๋ค. ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ์ ํจ๊ธฐ๊ฐ์ด ์ง๋๊ธฐ ์ ์๋ ๋์ฒ๊ฐ ์ด๋ ต์ต๋๋ค.
-
- JWT๋ฅผ ์ฌ์ฉํ ์ด์ ์ ์ฅ, ๋จ์ ์ ๋ฌด์์ธ๊ฐ์?
-
์ฌ์ฉ ์ด์ :
๊ธฐ์กด์ ์ธ์ ์ธ์ฆ ๋ฐฉ์์ด๋ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์, ์ธ์ฆ ๊ณผ์ ์์ DB๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. ํ์ง๋ง JWT์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด(์๊ฐ์์ฉ์ Self-Contained ์ ๋ณด, ํ ํฐ ์ ๋ณด, ์ ๋ฌํด์ผ ํ๋ ์ ๋ณด, ํ ํฐ ๊ฒ์ฆ์ ๋ํ Signature ๋ฑ)๋ฅผ ํ ํฐ ์์ฒด์ ๋ด๊ณ ์์ด์, ๋ณ๋์ ์ ์ฅ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค.
๋ํ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ์ฝ๋ฉ ์ XML๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ์ฌ์ด์ฆ๊ฐ ์์ต๋๋ค. ๋ํ JSON Parser๋ ๋ณดํต ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ฐ์ฒด์ ์ง์ Mapping๋๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ณ ์ฝ๊ฒ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
์ฅ์ :
- ์นํ์ค(RFC 7519)์ผ๋ก, ์๋น์ค ๋์ ๋ฐ ํฅํ ๋๋ฒ๊น ๊ณผ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ ์ธก๋ฉด์ด ์์ต๋๋ค. ์ฌ์ฉ์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ด ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ ์์ต๋๋ค. ํธ๋ํฝ์ ๋ํ ๋ถ๋ด๋ ๋ฎ์ผ๋ฉฐ, REST ์๋น์ค๋ก ์ ๊ณต์ด ๊ฐ๋ฅํฉ๋๋ค.
-
๋จ์ :
- ํ ํฐ์ Payload์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ๋๋ฌธ์ ์ ๋ณด๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ๋ํ Payload๋ฅผ ํ์ทจํ์ฌ ๋์ฝ๋ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํ ์ ๋ณด๋ ๋ด์ง ๋ง๊ฑฐ๋, ํน์ JWE๋ผ๋ ๋ณ๋์ ์ํธํ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. Statelessํ ํน์ฑ์ ํ๋ฒ ๋ง๋ค์ด์ง๋ฉด ์์ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ ํ ํฐ ๋ง๋ฃ์๊ฐ์ ๋ณ๋๋ก ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
- ํ ํฐ์ Payload์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ๋๋ฌธ์ ์ ๋ณด๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ๋ํ Payload๋ฅผ ํ์ทจํ์ฌ ๋์ฝ๋ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํ ์ ๋ณด๋ ๋ด์ง ๋ง๊ฑฐ๋, ํน์ JWE๋ผ๋ ๋ณ๋์ ์ํธํ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. Statelessํ ํน์ฑ์ ํ๋ฒ ๋ง๋ค์ด์ง๋ฉด ์์ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ ํ ํฐ ๋ง๋ฃ์๊ฐ์ ๋ณ๋๋ก ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
-
ํต์ฌ๋ต๋ณ
์ด๋ค ํ์
์ ์ปจํ
์ธ ๋ฅผ ์ ๊ณตํ๋์ง์ ์ฐจ์ด์
๋๋ค. ์น์๋ฒ๋ ์ ์ ์ธ ์ปจํ
์ธ ๋ฅผ ์ ๊ณตํ๋ ์๋ฒ์
๋๋ค. 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์ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ค์ ํ๋ฉด ๋์ฑ ํจ์จ์ ์ธ ๋ถ์ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ
- Web Server๋ฅผ WAS ์์ ๋๊ณ ํ์ํ WAS๋ค์ Web Server์ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ค์ ํ๋ฉด ๋์ฑ ํจ์จ์ ์ธ ๋ถ์ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ
- ์ฆ, ์์ ์ด์ฉ์ ํจ์จ์ฑ ๋ฐ ์ฅ์ ๊ทน๋ณต, ๋ฐฐํฌ ๋ฐ ์ ์ง๋ณด์์ ํธ์์ฑ ์ ์ํด Web Server์ WAS๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํด์ฃผ๋ ๊ฒ ์ข์ต๋๋ค.
- SQL Injection์ ๋ํด์ ๊ฐ๋จํ ์ค๋ช ํด์ฃผ์ธ์.
ํต์ฌ๋ต๋ณ
ํด๋ผ์ด์ธํธ์ ์
๋ ฅ๊ฐ์ ์กฐ์ํ์ฌ ์์์ SQL๋ฌธ์ ์ฝ์
ํด ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต๊ฒฉํ ์ ์๋ ๊ณต๊ฒฉ ๋ฐฉ์์
๋๋ค.
๐ค SQL Injections์ ๋์๋ฐฉ๋ฒ์ ๋ฌด์์ด ์๋์
- ์ ๋ ฅ๊ฐ์ ๋ํ ๊ฒ์ฆ
- Prepared Statement ๊ตฌ๋ฌธ์ฌ์ฉ
- ์น ๋ฐฉํ๋ฒฝ ์ฌ์ฉ
๐คย ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ -XSS
๊ณต๊ฒฉ์๊ฐ ์๋๋ฐฉ ๋ธ๋ผ์ฐ์ ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋๋ก ํด ์ฌ์ฉ์์ ์ธ์ ์ ๊ฐ๋ก์ฑ๊ฑฐ๋, ์น์ฌ์ดํธ๋ฅผ ๋ณ์กฐํ๊ฑฐ๋, ์ ์์ ์ปจํ ์ธ ๋ฅผ ์ฝ์ ํ๊ฑฐ๋, ํผ์ฑ ๊ณต๊ฒฉ์ ์งํํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
XSS๊ณต๊ฒฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก <script>ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ XSS ๊ณต๊ฒฉ์ ์ฐจ๋จํ๊ธฐ ์ํด ํ๊ทธ ๋ฌธ์(<,>)๋ฑ ์ํํ ๋ฌธ์ ์ ๋ ฅ ์ ๋ฌธ์ ์ฐธ์กฐ๋ก ํํฐ๋งํ๊ณ , ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก ์ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ๋ ๊ฒ์ผ๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค.
-
RESTful์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๊ฒ์ ๋ํด์ ์๋๋๋ก ์ค๋ช ํด๋ณด์ธ์.
REST ์ํคํ ์ณ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ ์ผ๋ก, ์๋ ์์น์ ์ง์ผ ์ค๊ณํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- HTTP URI๋ฅผ ํตํด ์์(Resource)์ ๋ช ์ํ๊ณ
- HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํตํด
- ํด๋น ์์(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
- ex) my til delete โ /users/userid/tils/idx
- /๊ด๋ จ DB Columns/๊ด๋ จ Field๊ฐ
-
์น ๋ธ๋ผ์ฐ์ ์์ URI์ ๊ตฌ๊ธ๋ท์ปด์ ์ณค์ ๋ ๋ฐ์ํ๋ ์ผ๋ค์ ์๋ ๋๋ก ์ค๋ช ํด์ฃผ์ธ์.
ํต์ฌ๋ต๋ณ
- ์ฌ์ฉ์๊ฐ URL์ฃผ์๋ฅผ ์ ๋ ฅํ๋ฉด, ๋๋ฉ์ธ ๋ค์์ DNS์๋ฒ์์ ๊ฒ์ํฉ๋๋ค.
- DNS์๋ฒ์์ ํด๋น ๋๋ฉ์ธ ๋ค์์ ํด๋นํ๋ IP์ฃผ์๋ฅผ ์ฐพ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ URL ์ ๋ณด์ ํจ๊ป ์ ๋ฌํฉ๋๋ค.
- ์น ํ์ด์ง URL ์ ๋ณด์ IP ์ฃผ์๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
- HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ TCP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์ธํฐ๋ท์ ๊ฑฐ์ณ ํด๋น IP ์ฃผ์์ ์ปดํจํฐ๋ก ์ ์กํฉ๋๋ค.
- ๋์ฐฉํ HTTP ์์ฒญ ๋ฉ์ธ์ง๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์นํ์ด์ง URL ์ ๋ณด๋ก ๋ณํ๋ฉ๋๋ค.
- ์น ์๋ฒ๋ ๋์ฐฉํ ์น ํ์ด์ง URL ์ ๋ณด์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ์น ์๋ฒ์์๋ ๋ค์ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ HTTP ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๋ค์ TCP ํ๋กํ ์ฝ์ ์ด์ฉํด ์ธํฐ๋ท์ ๊ฑฐ์ณ ์๋ ์ปดํจํฐ๋ก ์ ์ก๋ฉ๋๋ค.
- ๋์ฐฉํ HTTP ์๋ต๋ฉ์์ง๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํด ์น ํ์ด์ง ๋ฐ์ดํฐ๋ก ๋ณํฅ๋๋ค.
- ๋ณํ๋ ์น ํ์ด์ง ๋ฐ์ดํฐ๋ ์น ๋ธ๋ผ์ฐ์ ์ ์ํด ์ถ๋ ฅ๋์ด ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํด์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ๊น์ง ๊ณผ์ ์ ์ค๋ช ํ์ธ์.
ํต์ฌ๋ต๋ณ
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ https://www.google.com/images/google.png๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฒญํด์ผ ํ๋ค๋ ๊ฒ์ ์ธ์งํฉ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ DNS ์๋ฒ์์ URL์ ์ด์ฉํด IP๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ์ TCP ์ปค๋ฅ์ ์ ๋งบ์ต๋๋ค.(3 way handshaking)
- ์ด๋ฏธ์ง ์์ฒญํ๊ธฐ ์ํ GET ๋ฉ์๋๋ก HTTP ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ๋ง๋ญ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ฒ๋ ๋ฉ์ธ์ง๋ฅผ ๋ฐ๊ณ HTTP ๋ฉ์ธ์ง๋ฅผ ํ์ธํ๊ณ , ํด๋น Resource๊ฐ ์กด์ฌํ๋ค๋ฉด 200์ฝ๋์ ํจ๊ป ์๋ตํด์ค๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ต๋ฐ์ ๋ฉ์ธ์ง๋ฅผ ํด์ํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.
-
OSI 7๊ณ์ธต์ด ๋ฌด์์ธ์ง ๊ทธ ์กด์ฌ ์ด์ ์ ๋ํด์ ์ค๋ช ํด๋ณด์ธ์.
- ๋คํธ์ํฌ์์ ํต์ ์ด ์ผ์ด๋๋ ๊ณผ์ ์ 7๋จ๊ณ๋ก ๋๋ ๊ฒ
- ์ํธ ์ด์ง์ ์ธ ๋คํธ์ํฌ๊ฐ์ ์ฐ๊ฒฐ์์ ํธํ์ฑ์ ๊ฒฐ์ฌ๋ฅผ ๋ง๊ธฐ ์ํด ๊ฐ๋ฐ๋ ๋ชจํ
- OSI 7๊ณ์ธต์ด ์์์ผ๋ก์จ, ํต์ ์ด ์ผ์ด๋๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ํ์ ํ ์ ์์ต๋๋ค.
- ๋ฌธ์ ๋ฐ์ ์, ํจ์จ์ ์ผ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- 7๋จ๊ณ ์ค ํน์ ํ ๊ณณ์ ์ด์์ด ์๊ธฐ๋ฉด ๋ค๋ฅธ ๋จ๊ณ์ ์ฅ๋น ๋ฐ ์ํํธ์จ์ด๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ์ด์์ด ์๊ธด ๋จ๊ณ๋ง ๊ณ ์น ์ ์์ต๋๋ค.
- 1๊ณ์ธต - ๋ฌผ๋ฆฌ๊ณ์ธต(Physical Layer)
- ์ ๊ธฐ ๋ฐ์ดํฐ์ ์ ์ก๋ง์ ๋ด๋น (ํต์ ์ผ์ด๋ธ, ๋ฆฌํผํฐ, ํ๋ธ ๋ฑ)
- 2๊ณ์ธต - ๋ฐ์ดํฐ ๋งํฌ๊ณ์ธต(DataLink Layer)
- ์ ๋ณด์ ์ค๋ฅ์ ํ๋ฆ์ ๊ด๋ฆฌ (๋ธ๋ฆฌ์ง, ์ค์์น, ์ด๋๋ท ๋ฑ)
- 3๊ณ์ธต - ๋คํธ์ํฌ ๊ณ์ธต(Network Layer)
- ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ณ ์ฃผ์๋ฅผ ์ ํ๊ณ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํจํท์ ์ ๋ฌ (๋ผ์ฐํฐ)
- ๋ผ์ฐํ , ํ๋ฆ ์ ์ด, ์ธ๊ทธ๋ฉํ ์ด์ , ์ค๋ฅ ์ ์ด, ์ธํฐ๋คํธ์ํน ๋ฑ์ ์ํ
๋ผ์ฐํย : ๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ์ง๊น์ง ๊ฐ์ฅ ์์ ํ๊ณ ๋น ๋ฅด๊ฒ ์ ๋ฌ (์ค์ ๊ธฐ๋ฅ)
- 4๊ณ์ธต - ์ ์ก ๊ณ์ธต(Transport Layer)
- ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ํฉ์ณ์ 5๊ณ์ธต์ผ๋ก ์ ๋ฌ (์: TCP)
- ์ ๋๋จ(End to end)์ ์ฌ์ฉ์๋ค์ด ์ ๋ขฐ์ฑ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ํ๋ ์ญํ
์ฐ๊ฒฐ ๊ธฐ๋ฐ(connection oriented)ย : ์ ์ก ๊ณ์ธต์ด ํจํท๋ค์ ์ ์ก์ด ์ ํจํ์ง ํ์ธํ๊ณ ์ ์ก ์คํจํ ํจํท๋ค์ ๋ค์ ์ ์ก
- 5๊ณ์ธต -์ธ์
๊ณ์ธต(Session Layer)
- ๋ฐ์ดํฐ๊ฐ ํต์ ํ๊ธฐ ์ํ ๋ ผ๋ฆฌ์ ์ธ ์ฐ๊ฒฐ(์ธ์ )์ ๋ด๋น
- TCP/IP ์ธ์ ์ ์์ฑ ๋ฐ ์ ๊ฑฐ
- ์ ๋๋จ์ ์์ฉ ํ๋ก์ธ์ค๊ฐ ํต์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณต (๋์ ์ก์์ ๋ฐฉ์(duplex), ๋ฐ์ด์ค ๋ฐฉ์(half-duplex), ์ ์ด์ค ๋ฐฉ์(Full Duplex) ๋ฑ)
- 6๊ณ์ธต - ํํ ๊ณ์ธต(Presentation Layer)
- ๋ฐ์ดํฐ ํํ์ด ์์ดํ ์์ฉ ํ๋ก์ธ์ค์ ๋ ๋ฆฝ์ฑ์ ์ ๊ณตํ๊ณ , ์ํธํ
- ์ฝ๋ ๊ฐ์ ๋ฒ์ญ ๋ด๋น, MIME ์ธ์ฝ๋ฉ์ด๋ ์ํธํ ๋ฑ์ ์ํ
- 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 ๋ฑ ๋ธ๋ฆฌ์ง, ์ค์์น - L1 - ๋คํธ์ํฌ ์ฐ๊ฒฐ ๊ณ์ธต(Network Access Layer/Network Interface Layer)
- ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ด๋ป๊ฒ ์ ์ก๋๋์ง๋ฅผ ์ ์
- MAC, LAN, ํจํท๋ง ๋ฑ์ ์ฌ์ฉ๋๋ ๊ฒ (์: Ethernet, PPP, Token Ring ๋ฑ)
- L2 - ์ธํฐ๋ท ๊ณ์ธต(Internet Layer)
- ํต์ ๋ ธ๋ ๊ฐ์ IPํจํท์ ์ ์กํ๋ ๊ธฐ๋ฅ๊ณผ ๋ผ์ฐํ ๊ธฐ๋ฅ(๊ฒฝ๋ก ์ค์ )์ ๋ด๋น
- IP, ARP, RARP ๋ฑ
- L3 - ์ ์ก ๊ณ์ธต(Transport Layer)
- ํต์ ๋ ธ๋ ๊ฐ ์ฐ๊ฒฐ์ ์ ์ดํ๊ณ , ์ ๋ขฐ์ฑ ์๋ ๋ฐ์ดํฐ ์ ์ก์ ๋ด๋น
- TCP, UDP ๋ฑ
- 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)์์ ์งํํฉ๋๋ค. - ๋คํธ์ํฌ ๊ณ์ธต์์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ด ๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ์ง๊น์ง ๊ฐ์ฅ ์์ ํ๊ณ ๋น ๋ฅด๊ฒ ์ ๋ฌํ๋ ๋ผ์ฐํ
๊ธฐ๋ฅ์
๋๋ค.
- ์๋ฒ๊ฐ ๋ผ์ฐํ
๊ธฐ๋ฅ์ 3๊ณ์ธต์ธ
-
์๋ฅผ ๋ค์ด,
www.example.com๊ณผ ๊ฐ์ด ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ด๋ฆ์ย192.0.2.1๊ณผ ๊ฐ์ ์ซ์ IP ์ฃผ์๋ก ๋ณํํ์ฌ ์ปดํจํฐ๊ฐ ์๋ก ํต์ ํ ์ ์๋๋ก ํ๋ค. -
์ธํฐ๋ท์ DNS ์์คํ ์ ์ด๋ฆ๊ณผ ์ซ์ ๊ฐ์ ๋งคํ์ ๊ด๋ฆฌํ์ฌ, ๋ง์นย ์ ํ๋ฒํธ๋ถ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค.
-
DNS ์๋ฒ๋ ์ด๋ฆ์ ๋ํ ์์ฒญ์ IP ์ฃผ์๋ก ๋ณํํ์ฌ ์ต์ข ์ฌ์ฉ์๊ฐ ๋๋ฉ์ธ ์ด๋ฆ์ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅํ ๋ ํด๋น ์ฌ์ฉ์๋ฅผ ์ด๋ค ์๋ฒ์ ์ฐ๊ฒฐํ ๊ฒ์ธ์ง๋ฅผ ์ ์ดํ๋ค. =ย
์ฟผ๋ฆฌ -
๋์์๋ฆฌ
- ์น ๋ธ๋ผ์ฐ์ ์ย
www.naver.com์ ์ ๋ ฅํ๋ฉด, Local DNS์๊ฒย"www.naver.com"์ด๋ผ๋ hostname์ ๋ํ IP ์ฃผ์๋ฅผ ์์ฒญํ๋ค.- Local DNS์ ์์ผ๋ฉด ๋ค๋ฅธ DNS name ์๋ฒ ์ ๋ณด(Root DNS ์ ๋ณด)๋ฅผ ๋ฐ๋๋ค.
- Root DNS ์๋ฒ์ย
"www.naver.com"์ ๋ํด ์์ฒญํ๋ค. - Root DNS ์๋ฒ๋ก ๋ถํฐ "com ๋๋ฉ์ธ"์ ๊ด๋ฆฌํ๋ TLD (Top-Level Domain) ์ด๋ฆ ์๋ฒ ์ ๋ณด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค.
- TLD์ย
"www.naver.com"์ ๋ํด ์์ฒญํ๋ค. - TLD์์ "name.com" ๊ด๋ฆฌํ๋ DNS ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- "example.com" ๋๋ฉ์ธ์ ๊ด๋ฆฌํ๋ DNS ์๋ฒ์ย
"www.naver.com"ย ํธ์คํธ๋ค์์ ๋ํ IP ์ฃผ์๋ฅผ ์์ฒญํ๋ค. - Local DNS ์๋ฒ์๊ฒย
www.naver.com์ ๋ํ IP ์ฃผ์(์:222.122.195.6)๋ฅผ ์๋ต ๋ฐ๋๋ค. - Local DNS๋ย
www.naver.com์ ๋ํ IP ์ฃผ์๋ฅผ ์บ์ฑ์ ํ๊ณ IP ์ฃผ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์ย
- HTTP์ ์ญํ ์ ๋ฌด์์ธ๊ฐ์?
World Wide Web์์ ํ์ดํผํ
์คํธ ๋ฌธ์๋ฅผ ๊ตํํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋๋ ํต์ ๊ท์ฝ์
๋๋ค.
- HTTP์ HTTPS์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์ธ์.
HTTP๋ ๋ฐ๋ก ์ํธํ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ํจํท์ ๊ฐ๋ก์ฑ ์ ์๊ณ , ์์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ณด์์ด ์ทจ์ฝํฉ๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด HTTPS์
๋๋ค. ์ค๊ฐ์ ์ํธํ ๊ณ์ธต์ ๊ฑฐ์ณ์ ํจํท์ ์ํธํํฉ๋๋ค.
- HTTPS์ ๋ํด์ ์ค๋ช ํ๊ณ SSL Handshake์ ๋ํด์ ์ค๋ช ํด๋ณด์ธ์.
HTTPS๋ HTTP ํต์ ์ ํ๋ ์์ผ ๋ถ๋ถ์ SSL์ด๋ TSL์ด๋ผ๋ ํ๋กํ ์ฝ๋ก ๋์ฒดํ ๊ฒ์
๋๋ค.
HTTPS๋ ์ 3์ ์ธ์ฆ, ๊ณต๊ฐํค ์ํธํ, ๋น๋ฐํค ์ํธํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ 3์ ์ธ์ฆ์ ๋ฏฟ์ ์ ์๋ ์ธ์ฆ๊ธฐ๊ด์ ๋ฑ๋ก๋ ์ธ์ฆ์๋ง ์ ๋ขฐํ๋ ๊ฒ์ด๊ณ ,
๊ณต๊ฐํค ์ํธํ๋ ๋น๋ฐํค๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
๋น๋ฐํค ์ํธํ๋ ํต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
SSL Handshake ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
ํด๋ผ์ด์ธํธ๋ TCP 3way handshake๋ฅผ ์ํํ ์ดํ Client Hello๋ฅผ ์ ์กํฉ๋๋ค.
-
์๋ฒ๋ ์ธ์ฆ์๋ฅผ ๋ณด๋ ๋๋ค.
-
ํด๋ผ์ด์ธํธ๋ ๋ฐ์ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๊ธฐ ์ํด์ ๋ฑ๋ก๋ ์ธ์ฆ๊ธฐ๊ด์ธ์ง ํ์ธํฉ๋๋ค.
์ด ์ธ์ฆ์๋ ์ธ์ฆ๊ธฐ๊ด์ ๊ฐ์ธํค๋ก ์ํธํ๋์ด์๊ณ , ๊ณต๊ฐํค๋ก ๊ฒ์ฆํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ์ ๋ด์ฅ๋ ๊ณต๊ฐํค๋ฅผ ์ด์ฉํด์ ํต์ ์ ์ฌ์ฉํ ๋น๋ฐํค๋ฅผ ์ํธํํด์ ์๋ฒ์ ๋ณด๋ ๋๋ค.
-
์๋ฒ๋ ์ด๋ฅผ ๊ฐ์ธํค๋ก ํ์ธํ๊ณ ์ดํ ํต์ ์ ๊ณต์ ๋ ๋น๋ฐํค๋ก ์ํธํ๋์ด ํต์ ํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ํจ๋์์ดํฌ ๋จ๊ณ๋ฅผ ์๋ก์๊ฒ ์๋ฆฐ๋ค.
- HTTP ํ๋กํ ์ฝ์ ํน์ง
-
๋น์ฐ๊ฒฐ์ ์งํฅํฉ๋๋ค. (Connectionless) ํด๋ผ์ด์ธํธ๊ฐ request๋ฅผ ์๋ฒ์ ๋ณด๋ด๊ณ , ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ง๋ response๋ฅผ ๋ณด๋ด๋ฉด ๋ฐ๋ก ์ฐ๊ฒฐ์ ๋์ต๋๋ค.
-
์ํ์ ๋ณด ์ ์ง๋ฅผ ํ์ง ์์ต๋๋ค. (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๋ ์คํธ๋ฆฌ๋ฐ, 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 ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.


















