μ‚Ά/F-Lab

Week 10

osean 2021. 7. 10. 19:07

Week 10
: DBMS, Servlet, Session, Cache

✍️ 7μ›”μ˜ 첫 μ§Έ μ£Ό λ©˜ν† λ§!
이번 μ£Ό 기둝은 ν˜„μƒμ— μΉ˜μ—¬ μ‹œκ°„μ„ 보내닀 λ³΄λ‹ˆ λ©˜ν† λ§ 당일에 μž‘μ„±ν•˜μ§€ λͺ»ν–ˆλ‹€. (사싀 게으λ₯Έκ±°λ‹€.)
그리고 JSP 책을 λ‹€ 읽어보렀고 ν–ˆμ§€λ§Œ 생각보닀 μ΄ν•΄λ˜μ§€ μ•ŠλŠ” 뢀뢄도 λ§Žμ•„μ„œ λ‹€ 읽지 λͺ»ν–ˆλ‹€. (정말 게으λ₯Έκ±°λ‹€.)

κ·Έλž˜μ„œ λ°˜μ„±μ˜ μ‹œκ°„μ„ 쑰금 가지고 λ©˜ν† λ§ν•œ λ‚΄μš©μ„ λŠ¦κ²Œλ‚˜λ§ˆ 기둝해보렀고 ν•œλ‹€. 이번 μ‹œκ°„μ—λŠ” μ›Ή ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°μ΄ˆκ°€ λ˜λŠ” Servlet, DBMS, Session, Cache 등에 λŒ€ν•΄μ„œ λ‹€μ‹œ μ •λ¦¬ν•΄λ³΄μž!

1. JSP Output Buffer

JSP λŠ” 기본적으둜 μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°”λ‘œ μ‘λ‹΅ν•˜μ§€ μ•Šκ³  λ²„νΌλΌλŠ” λ©”λͺ¨λ¦¬μ— κ²°κ³Όλ₯Ό μŒ“μ•„λ‘μ—ˆλ‹€κ°€ ν•œ λ²ˆμ— μ‘λ‹΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. (이전 java.io κ΄€λ ¨ Stream κ³Ό Buffer 에 λŒ€ν•΄μ„œ κ³΅λΆ€ν–ˆλ˜ κ°œλ…κ³Ό μœ μ‚¬ν•˜λ‹€.) 
Buffer λ₯Ό μ΄μš©ν•˜λ―€λ‘œμ¨ 얻을 수 μžˆλŠ” μž₯점은 IO μ²˜λ¦¬μ—μ„œμ˜ Buffer 와 λΉ„μŠ·ν•˜λ‹€κ³  λ³Ό 수 μžˆλŠ”λ°, λ‹€μŒ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄μž.

πŸ“ μ„±λŠ₯ ν–₯상
μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ λ§ˆλ‹€ μ‘λ‹΅ν•˜λŠ” 방식보닀 응닡을 λͺ¨μ•„μ„œ ν•œλ²ˆμ— μ²˜λ¦¬ν•˜λŠ” 것이 μ—¬λŸ¬ λ°©λ©΄μ—μ„œ μœ λ¦¬ν•œ κ²ƒμœΌλ‘œ κ³΅λΆ€ν–ˆλ‹€. κ·Έ μ΄μœ λŠ” μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό 응닡 ν•  λ•Œ λ§ˆλ‹€ 데이터λ₯Ό λ‚΄λ³΄λ‚΄λŠ” μž‘μ—… μžμ²΄κ°€ λ§Žμ€ μžμ›μ„ μ†Œλͺ¨ν•˜κ²Œ λ˜λŠ”λ°, 이λ₯Ό 각각의 μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ λ§ˆλ‹€ μ²˜λ¦¬ν•˜λŠ” 방법은 반볡적으둜 μ†Œλͺ¨λ˜λŠ” μžμ›μ„ μ ˆμ•½ ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

πŸ“ μœ μ—°ν•œ 데이터 μˆ˜μ •
Buffer λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μš”μ²­λ§ˆλ‹€ μ‘λ‹΅ν•˜κ²Œ λœλ‹€λ©΄ ν•΄λ‹Ή 응닡에 λŒ€ν•œ 결과값을 λ‹€μ‹œ μ„œλ²„ μΈ‘μ—μ„œ μˆ˜μ • ν•  수 μ—†λ‹€. κ·Έ μ΄μœ λŠ” μ„œλ²„ μΈ‘μ—μ„œ 응닡을 ν•˜λŠ” μˆœκ°„ μ‘λ‹΅μ˜ 결과값에 λŒ€ν•œ μ œμ–΄κΆŒμ„ μƒμ‹€ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
JSP 의 응닡 κ²°κ³ΌλŠ” HTTP 톡신 κ·Έ 자체이기 λ•Œλ¬Έμ— Buffer λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ HTTP Header ν˜Ήμ€ Body 에 μžˆλŠ” 정보 쀑 μˆ˜μ •ν•˜κ³ μž ν•˜λŠ” μ •λ³΄λŠ” μˆ˜μ •ν•˜μ§€ λͺ»ν•˜κ³  κ·ΈλŒ€λ‘œ 톡신이 이루어진닀. λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 잘λͺ»λœ HTTP νŒ¨ν‚· 정보 λ•Œλ¬Έμ— μ˜ˆμ™Έ 상황이 λ°œμƒ ν•  수 μžˆλ‹€.
λ§Œμ•½ Buffer λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ Buffer 둜 μ§€μ •λœ λ©”λͺ¨λ¦¬λ§ŒνΌ 응닡 κ²°κ³Όλ₯Ό μŒ“μ•„ 놓을 수 있고, 맀 μš”μ²­λ§ˆλ‹€ λ°”λ‘œ μ‘λ‹΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Buffer 에 μ†ν•œ 응닡 결과값을 μˆ˜μ •ν•˜κ±°λ‚˜ λ³€κ²½ ν•  수 μžˆλ‹€. 이λ₯Ό ν†΅ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡할 λ°μ΄ν„°μ˜ 잘λͺ»λœ μ •λ³΄λ‚˜ μ—λŸ¬ 등을 사전에 μ„œλ²„ μΈ‘μ—μ„œ μž‘μ„ 수 μžˆλ‹€.
 

[μ„œλΈ”λ¦Ώ/JSP] JSP 좜λ ₯ λ²„νΌλž€

JSP 좜λ ₯ 버퍼(Buffer) JSPλŠ” 기본적으둜 νŽ˜μ΄μ§€ 처리결과λ₯Ό κ³§λ°”λ‘œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 좜λ ₯ν•˜μ—¬ μ‘λ‹΅ν•˜μ§€ μ•Šκ³ , 좜λ ₯ 버퍼에 λͺ¨μ•„λ‘μ—ˆλ‹€κ°€ ν•œκΊΌλ²ˆμ— 응닡 ν•©λ‹ˆλ‹€. 버퍼 μ‚¬μš©μ‹œ μž₯점 ꡳ이 κ³§λ°”λ‘œ 좜λ ₯ν•˜

dololak.tistory.com

 

2.  Cookie, Session

쿠킀와 μ„Έμ…˜μ€ λͺ¨λ‘ μ„œλ²„ μΈ‘μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό ν™•μΈν•˜κ³ , 이λ₯Ό 톡해 연속적인 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λœλ‹€.
이λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” HTTP ν”„λ‘œν† μ½œμ˜ νŠΉμ„±μ„ λ¨Όμ € νŒŒμ•…ν•˜κ³  μžˆμ–΄μ•Ό ν•˜λŠ”λ°, HTTP ν”„λ‘œν† μ½œμ€ Stateless, Connectionless νŠΉμ„±μ„ 가진닀. 즉, HTTP 톡신을 ν•˜λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ‘œμ˜ μƒνƒœλ₯Ό μ•Œ 수 μ—†κ³ , μš”μ²­μ— μ˜ν•΄ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λ˜κ³ (3-Way Handshake) μ„œλ²„ μΈ‘μ—μ„œ 응닡을 ν•˜κ²Œ 되면 HTTP 톡신은 λ‘˜μ˜ 연결을 λŠμ–΄λ²„λ¦°λ‹€.(4-Way Handshake)

정적 λ°μ΄ν„°λ§Œμ„ μ‘λ‹΅ν•˜λ˜ 과거의 μ›Ή μ„œλΉ„μŠ€λ“€μ΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœ, κΆŒν•œμ— 따라 λ™μ μœΌλ‘œ 데이터λ₯Ό μ‘λ‹΅ν•΄μ€˜μ•Ό ν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ λŠ˜μ–΄λ‚˜λ©΄μ„œ μ΄λŸ¬ν•œ HTTP νŠΉμ„±μ„ ν•΄κ²°ν•˜κ³ μž 쿠킀와 μ„Έμ…˜μ΄ λ§Œλ“€μ–΄μ§€κ³ , 이λ₯Ό μ΄μš©ν•΄μ„œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό ν™•μΈν•˜κ³  이에 λ§žλŠ” 동적 데이터λ₯Ό 응닡 ν•  수 있게 λ˜μ—ˆλ‹€.

μ—¬κΈ°μ„œ μΏ ν‚€λž€ HTTP νŒ¨ν‚·μ— Key : Value ν•œ 쌍으둜 κ΅¬μ„±λœ ν”Œλ ˆμΈ ν…μŠ€νŠΈ λ°μ΄ν„°μ˜ 일쒅이닀. ν΄λΌμ΄μ–ΈνŠΈμ˜ μ›Ή λΈŒλΌμš°μ €μ˜ μ›Ή μŠ€ν† λ¦¬μ§€μ— μ €μž₯ν•˜λ©°, μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ή μΏ ν‚€λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό 확인 ν•  수 μžˆλ‹€. λ‹€λ§Œ μΏ ν‚€λŠ” 1) ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μ €μž₯λœλ‹€λŠ” 점과 2) ν”Œλ ˆμΈ ν…μŠ€νŠΈλ‘œ μ €μž₯λœλ‹€λŠ” μ μ—μ„œ λ³΄μ•ˆμ— μ·¨μ•½ν•˜λ‹€.

이런 μΏ ν‚€μ˜ λ¬Έμ œμ μ„ κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ μ„Έμ…˜μ΄ λ“±μž₯ν•˜κ²Œ λ˜λŠ”λ°, μ„Έμ…˜μ€ ν΄λΌμ΄μ–ΈνŠΈ 정보λ₯Ό μ„œλ²„ μΈ‘ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€μ— μ €μž₯ν•˜λ―€λ‘œμ¨ μΏ ν‚€κ°€ 가지고 μžˆλŠ” λ³΄μ•ˆμ˜ 문제λ₯Ό ν•΄κ²° ν•  수 있게 λ˜μ—ˆλ‹€. ν•˜μ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ λŠ˜μ–΄λ‚˜λ©΄μ„œ μ„œλ²„μ—μ„œ 보관해야 ν•˜λŠ” μ„Έμ…˜μ˜ 양도 μžμ—°μŠ€λŸ½κ²Œ λŠ˜μ–΄λ‚¬λŠ”λ°, μ΄λŠ” μ„œλ²„μ˜ κ³ΌλΆ€ν•˜ 문제둜 μ΄μ–΄μ§ˆ 수 μžˆλ‹€.

 

3.  Session Clustering

λ¨Όμ € ν΄λŸ¬μŠ€ν„°μ™€ ν΄λŸ¬μŠ€ν„°λ§μ΄λΌλŠ” κ°œλ…μ„ μ΄ν•΄ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.
βœ”οΈ Cluster : κ°œλ³„μ μœΌλ‘œ μž‘λ™ν•˜λŠ” 컴퓨터λ₯Ό μ—°κ²°ν•˜μ—¬ ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ²˜λŸΌ μž‘λ™ν•˜κ²Œλ” ν•œ 집합.
βœ”οΈ Clustering : ClusterλΌλŠ” 집합이 ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ²˜λŸΌ μž‘λ™ ν•  수 μžˆκ²Œλ” ν•˜λŠ” ν–‰μœ„ κ·Έ 자체.

이제 μ„Έμ…˜μ— λŒ€ν•΄μ„œ λ‹€μ‹œ ν•œ 번 μ‚΄νŽ΄λ³΄μž. μ„Έμ…˜μ€ ν΄λΌμ΄μ–ΈνŠΈμ˜ 정보 등을 μ„œλ²„ μΈ‘μ—μ„œ λ³΄κ΄€ν•˜κ³  μžˆλ‹€.
이 λ•Œ, λŒ€μš©λŸ‰ νŠΈλž˜ν”½μ— λŒ€μ‘ν•˜κΈ° μœ„ν•΄μ„œ μ„œλ²„μ˜ 규λͺ¨λ₯Ό μŠ€μΌ€μΌ 아웃 방식을 μ±„νƒν•˜κ²Œ λ˜λ©΄μ„œ μ„Έμ…˜μ˜ μ •ν•©μ„± λ¬Έμ œκ°€ λ°œμƒ ν•  수 μžˆλ‹€.
κ·Έ μ΄μœ λŠ” A ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ 무쑰건 a μ„œλ²„λ‘œλ§Œ κ°„λ‹€λŠ” 보μž₯이 μ—†κΈ° λ•Œλ¬Έμ—, A ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ b μ„œλ²„λ‘œ κ°„λ‹€λ©΄ b μ„œλ²„μ—μ„œλŠ” A ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•œ 정보λ₯Ό μ•Œμ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή ν΄λΌμ΄μ–ΈνŠΈμ˜ μ„Έμ…˜μ„ 또 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ Session Cluster λΌλŠ” 방법을 μ΄μš©ν•΄μ„œ μ„œλ²„μ˜ μ„Έμ…˜μ„ ν•˜λ‚˜λ‘œ 뭉쳐 A ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μ–΄λ–€ μ„œλ²„λ‘œ 가더라도 μ„œλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ„Έμ…˜ 정보λ₯Ό κ³΅μœ ν•˜κ³  있기 λ•Œλ¬Έμ— λΆˆν•„μš”ν•œ μž‘μ—…μ„ μ—¬λŸ¬ 번 μˆ˜ν–‰ ν•  ν•„μš”κ°€ μ—†μ–΄μ§€κ²Œ λ˜μ—ˆλ‹€.
Session Cluster λŠ” μ—¬λŸ¬κ°€μ§€ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ 될 수 μžˆλŠ”λ°, ν•΄λ‹Ή 방법듀을 μ•Œμ•„λ³΄μž.

πŸ“ Sticky Session
μ„œλ²„μ— μ„Έμ…˜μ΄ λ³΄κ΄€λœ ν΄λΌμ΄μ–ΈνŠΈλŠ” ν•΄λ‹Ή μ„œλ²„λ‘œλ§Œ μš”μ²­μ„ 보낼 수 μžˆλ„λ‘ ν•œ Session Clustering 방법이닀.
이 전에 L4 / L7 Switch 에 λŒ€ν•΄μ„œ 곡뢀 ν–ˆλŠ”λ°, 이 λ•Œ L7 SwitchλŠ” HTTP ν”„λ‘œν† μ½œμ˜ νŒ¨ν‚·μ„ ν™•μΈν•˜κ³  이λ₯Ό νŠΉμ • 기쀀에 λΆ€ν•©ν•œλ‹€λ©΄ 기쀀에 λ§žλŠ” μ„œλ²„λ‘œ λ‘œλ“œ λ°ΈλŸ°μ‹± ν•΄μ€€λ‹€λŠ” 것을 κ³΅λΆ€ν–ˆλ‹€. 이λ₯Ό 톡해 μΆ”λ‘  ν•  수 μžˆλŠ” 것은 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μ„Έμ…˜μ„ λ§Œλ“€κ³  λ‚˜λ©΄ ν•΄λ‹Ή μ„Έμ…˜ IDλ₯Ό μΏ ν‚€λ‘œ λ§Œλ“€μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‘λ‹΅ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈλŠ” 이 λ•Œ 받은 μ„Έμ…˜ ID μΏ ν‚€λ₯Ό λ§€μš”μ²­λ§ˆλ‹€ λ³΄λ‚΄λŠ”λ°, μΏ ν‚€λŠ” HTTP Body 에 담겨져 μžˆλ‹€λŠ” 것을 생각해본닀면 Sticky Session 방식이 L7 Switchλ₯Ό ν†΅ν•΄μ„œ λ‘œλ“œ λ°ΈλŸ°μ‹±λ˜μ–΄ μžμ‹ μ˜ μ„Έμ…˜μ΄ μ†ν•œ μ„œλ²„μ—κ²Œλ§Œ μš”μ²­μ΄ κ°„λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ Sticky Session 방식은 μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„κ°€ μžˆμ„ λ•Œ λ§Žμ€ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ μ„Έμ…˜μ΄ λ§Œλ“€μ–΄μ Έ ν•΄λ‹Ή μ„œλ²„μ—κ²Œλ§Œ λ‘œλ“œ λ°ΈλŸ°μ‹± λœλ‹€λ©΄ ν•΄λ‹Ή μ„œλ²„μ˜ κ³ΌλΆ€ν•˜λŠ” 물둠이고 λ‚˜λ¨Έμ§€ μ„œλ²„λ“€μ˜ μžμ›μ΄ μ‚¬μš©λ˜μ§€ μ•Šκ²Œ λœλ‹€λŠ” 단점이 μžˆλ‹€.

πŸ“ All-to-All Session
WAS μ—μ„œ μ§€μ›ν•΄μ£ΌλŠ” 방법 쀑 ν•˜λ‚˜μΈ All-to-All Session 방식은 각 μ„œλ²„μ—μ„œ λ§Œλ“€μ–΄μ§„ λͺ¨λ“  μ„Έμ…˜μ„ λ‚˜λ¨Έμ§€ μ„œλ²„μ—κ²Œ λͺ¨λ‘ κ³΅μœ ν•œλ‹€. 
λͺ¨λ“  μ„œλ²„μ—μ„œ μ„Έμ…˜μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— Sticky Session 방식과 달리 ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μ–΄λ–€ μ„œλ²„λ‘œ κ°€λ˜μ§€ 각 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό νŒŒμ•… ν•  수 μžˆλ‹€.
ν•˜μ§€λ§Œ ν•΄λ‹Ή μ„Έμ…˜ ν΄λŸ¬μŠ€ν„°λ§μ€ μ„œλ²„λ₯Ό μΆ”κ°€ν•˜λ©΄ μΆ”κ°€ ν•  수둝 μ„Έμ…˜μ„ κ³΅μœ ν•΄μ•Ό ν•˜λŠ” μ„œλ²„κ°€ λŠ˜μ–΄λ‚˜ 이에 λŒ€ν•œ μžμ› λ‚­λΉ„κ°€ O(N) 만큼 λŠ˜μ–΄λ‚œλ‹€λŠ” 단점이 μžˆλ‹€.

πŸ“ Session Storage Server
λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” μ„œλ²„μ—μ„œ μ„Έμ…˜μ„ 직접 λ³΄κ΄€ν•˜μ§€ μ•Šκ³  λ³„λ„μ˜ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜κ³ , 각 μ„œλ²„λ“€μ€ μ„Έμ…˜μ„ 확인 ν•  λ•Œ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•˜μ—¬ λͺ¨λ“  μ„œλ²„μ—μ„œ μ„Έμ…˜ μƒνƒœλ₯Ό 곡유 ν•  수 μžˆλŠ” 방법을 λ§ν•œλ‹€.
μ„Έμ…˜μ„ λ³΄κ΄€ν•˜λŠ” λ³„λ„μ˜ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜λ―€λ‘œμ¨ μ„œλ²„μ—μ„œ μ„Έμ…˜μ— λŒ€ν•œ 뢀담을 쀄일 수 있고, 무엇보닀 각각의 μ„œλ²„κ°€ μ„Έμ…˜μ„ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„λ₯Ό ν†΅ν•΄μ„œ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μ •ν•©μ„± 문제λ₯Ό ν•΄κ²° ν•  수 있게 λ˜μ—ˆλ‹€. ν•˜μ§€λ§Œ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„κ°€ λͺ¨μ’…μ˜ 이유둜 λ‹€μš΄λ˜λ©΄ μ—°κ²°λœ λͺ¨λ“  μ„œλΉ„μŠ€ μ‹œμŠ€ν…œλ„ μ‚¬μš© ν•  수 μ—†λŠ” μƒνƒœκ°€ λœλ‹€. λ•Œλ¬Έμ— 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μ΅œμ†Œ 두 개의 μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜κ³ , A μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„κ°€ λ‹€μš΄λ˜λ©΄ ν•΄λ‹Ή κΆŒν•œ 등을 B μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„κ°€ μŠΉκ²©λ°›μ•„ μ„œλΉ„μŠ€λ₯Ό κ³„μ†ν•΄μ„œ μœ μ§€ ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•œλ‹€.
μ΄λŸ¬ν•œ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€ μ„œλ²„λŠ” 주둜 InMemory(Redis, MemCache λ“±)에 μ„Έμ…˜μ„ μ €μž₯ν•˜κ²Œ λ˜λŠ”λ°, λ””μŠ€ν¬μ— μ„Έμ…˜ 정보λ₯Ό μ €μž₯ν•˜κ³  이λ₯Ό μ½λŠ” μž‘μ—…λ³΄λ‹€ 더 λΉ λ₯΄κ²Œ μž‘μ—… ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. (λ””μŠ€ν¬μ— μ„Έμ…˜ 정보λ₯Ό μ €μž₯ν•œλ‹€λ©΄ IO μž‘μ—…μ„ μΆ”κ°€μ μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μž‘μ—… 속도가 느렀질 수 밖에 μ—†λ‹€.)

 

4.  JDBC

Java Database Connectivity.
Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ 톡신 ν•  수 μžˆλ„λ‘ κ·œμ•½μ„ μ •ν•΄ 놓은 Java API이닀.
JDBCλŠ” JDBC λ“œλΌμ΄λ²„κ°€ ν•„μš”ν•œλ°, 각 λ°μ΄ν„°λ² μ΄μŠ€ μ œν’ˆλ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” μΏΌλ¦¬λ‚˜ λ‚΄λΆ€ ꡬ쑰가 달라 Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ—°κ²°ν•˜κ³ μž ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ“œλΌμ΄λ²„λ₯Ό JDBCμ—μ„œ 읽어 μ–΄λ–€ λ°μ΄ν„°λ² μ΄μŠ€ μ œν’ˆμ„ μ“Έ 것인지 λͺ…μ‹œν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
즉, JDBC λ“œλΌμ΄λ²„λ“€μ€ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš”μ²­μ„ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ œν’ˆμ΄ 이해 ν•  수 μžˆλŠ” ν”„λ‘œν† μ½œλ‘œ λ³€ν™˜ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μ–΄λŒ‘ν„° μ—­ν•  을 ν•œλ‹€.
(μ„œλ²„μ™€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 관계λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ„œλ²„λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—κ²Œ 데이터λ₯Ό μš”μ²­ν•˜λŠ” μž…μž₯이고, λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ„œλ²„μ˜ μš”μ²­μ— μ‘λ‹΅ν•˜λŠ” μž…μž₯이기 λ•Œλ¬Έμ— 이 λ•ŒλŠ” μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯이 λœλ‹€.)
이 λ•Œ, Class.forName() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λ―€λ‘œμ¨ μ»΄νŒŒμΌν•œ JDBC λ“œλΌμ΄λ²„λ₯Ό JDBC에 λͺ…μ‹œν•œλ‹€.

 

5.  Connection Pool

λ¨Όμ € Connection μ΄λž€ μ„œλ²„μ™€ λ°μ΄ν„°λ² μ΄μŠ€ 사이λ₯Ό μ—°κ²°ν•œ 객체λ₯Ό μ˜λ―Έν•œλ‹€. Connection 을 ν†΅ν•΄μ„œ Statement λ₯Ό μ΄μš©ν•΄ 데이터λ₯Ό μš”μ²­ν•˜κ³  응닡 ν•  수 μžˆλ‹€. κ³Όκ±°μ—λŠ” μ΄λŸ¬ν•œ Connection 을 맀 μš”μ²­λ§ˆλ‹€ μƒˆλ‘œ μƒμ„±ν•˜κ³ , μ‘λ‹΅ν•˜λ©΄ μ‚¬λΌμ§€λŠ” ꡬ쑰둜 μž‘λ™ ν–ˆλ‹€. ν•˜μ§€λ§Œ Connection 객체λ₯Ό μƒμ„±ν•˜λŠ” μž‘μ—… μžμ²΄κ°€ λ§Žμ€ μžμ›μ„ μ‚¬μš©ν•˜λŠ”λ°, μ΄λŸ¬ν•œ μž‘μ—…μ„ λͺ¨λ“  μš”μ²­ λ•Œ λ§ˆλ‹€ λ°˜λ³΅ν•˜λ©΄ μžμ›μ΄ λ‚­λΉ„λ˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ λ‚­λΉ„λ₯Ό λ§‰κ³ μž Connection Pool 이 λ“±μž₯ν•˜κ²Œ λœλ‹€.
Connection Pool 은 WAS κ°€ μ‹€ν–‰ν•˜λ©΄μ„œ μ„€μ •λœ 값에 맞게 Connection 을 μƒμ„±ν•˜κ³ , 이듀을 Connection Pool μ΄λΌλŠ” μ˜μ—­μ— λ³΄κ΄€ν•˜κ²Œ λœλ‹€. 이제 ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ λ“€μ–΄μ˜€κ²Œ 되면 ν•΄λ‹Ή μš”μ²­μ— Connection ν•˜λ‚˜λ₯Ό ν• λ‹Ήν•˜κ³ , ν•΄λ‹Ή μš”μ²­μ˜ 톡신이 마무리 되면 ν• λ‹Ήλœ Connection 은 λ‹€μ‹œ Connection Pool 에 λ°˜ν™˜λœλ‹€.

μ΄λŸ¬ν•œ Connection Pool 은 λ©”λͺ¨λ¦¬ 상황에 맞게 Connection 생성 갯수λ₯Ό μ œν•œν•˜κ³ , 미리 Connection 객체λ₯Ό λ§Œλ“€κΈ° λ•Œλ¬Έμ— μ„œλ²„ - λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 연결을 μœ„ν•œ μžμ›μ„ μ ˆμ•½ ν•  수 μžˆλ‹€.

 

6.  Thread Pool

κ³Όκ±° CGI ν”„λ‘œκ·Έλž˜λ° 방식은 ν•˜λ‚˜μ˜ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μƒˆλ‘œμš΄ ν”„λ‘œμ„Έμ„œλ₯Ό ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— 이둜 μΈν•œ μ„œλ²„ λΆ€ν•˜λ‚˜ μžμ› λ‚­λΉ„κ°€ μ‹¬ν–ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ Java μ§„μ˜μ˜ Servlet 이 λ“±μž₯ν•˜κ²Œ 되고, μ΄λŸ¬ν•œ Servlet 은 JVM μœ„μ—μ„œ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— CGI ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μ—μ„œ λ‚­λΉ„λ˜λŠ” μžμ›μ„ μ ˆμ•½ ν•  수 있게 λ˜μ—ˆλ‹€.
Thread Pool 도 Connection Pool κ³Ό λΉ„μŠ·ν•œλ°, 미리 μ„€μ •λœ 값에 맞게 Thread λ₯Ό λ©”λͺ¨λ¦¬μ— λ§Œλ“€μ–΄λ†“κ³ , ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ ν•΄λ‹Ή μš”μ²­μ— Thread ν•˜λ‚˜λ₯Ό ν• λ‹Ήν•œ λ’€, μš”μ²­μ— λŒ€ν•œ 톡신이 λλ‚˜λ©΄ (연결이 λŠμ–΄μ§€λ©΄) Thread λ₯Ό λ°˜ν™˜ν•œλ‹€.

μ΄λŸ¬ν•œ 방식을 μ΄μš©ν•  λ•Œ, μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ λ§ˆλ‹€ Thread λ₯Ό μƒˆλ‘œ λ§Œλ“€μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ— μžμ›μ˜ λ‚­λΉ„λ₯Ό 막을 수 μžˆλ‹€.

πŸ’₯ Prepared Statement μ„±λŠ₯κ³Ό λ³΄μ•ˆ

'μ‚Ά > F-Lab' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Week 12  (1) 2021.07.24
Week 11  (0) 2021.07.16
Week 9  (0) 2021.07.02
Week 8  (0) 2021.06.25
Week 7  (0) 2021.06.18