μ‚Ά/F-Lab

Week 7

osean 2021. 6. 18. 03:08

Week 7
: 더 꼼꼼히 μ •λ¦¬ν•˜κΈ°

✍️  6μ›” μ…‹μ§Έ μ£Ό λ©˜ν† λ§!
μ§€λ‚œ λͺ‡ μ£Ό λ™μ•ˆ κ³΅λΆ€ν•œ λ‚΄μš©μ„ λΈ”λ‘œκ·Έμ— μž‘μ„±ν•˜μ§€ λͺ»ν•΄μ„œ 이번 μ£ΌλŠ” 정리λ₯Ό λͺ©ν‘œλ‘œ ν•œ μ£Όλ₯Ό λ³΄λƒˆλ‹€.

이번 μ£ΌλŠ” IO와 NIO에 κ΄€λ ¨ν•œ λ‚΄μš©λ“€μ„ κ³΅λΆ€ν–ˆλŠ”λ‹€.
정리할 λ•ŒλŠ” 이제 μ’€ 이해가 λ˜λŠ”κ΅¬λ‚˜ ν–ˆλŠ”λ°, 막상 λ©˜ν† λ§ μ‹œκ°„μ— 직접 μ„€λͺ…ν•˜λ €κ³  ν•˜λ‹€λ³΄λ‹ˆ 어버버 κ±°λ¦¬λ©΄μ„œ μš”μ μ„ λ²—μ–΄λ‚œ μ΄μ•ΌκΈ°λ§Œ ν–ˆλ‹€.

μ™œ 그럴까 μƒκ°ν•΄λ³΄λ‹ˆ 직접 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ„œ λŠλΌλŠ” μ‹œκ°„λ³΄λ‹€ λΈ”λ‘œκ·Έ μ„œμΉ˜ν•˜λ©΄μ„œ κΈ€λ‘œ μ •λ¦¬ν•˜λŠ” μ‹œκ°„μ΄ 더 λ§Žμ•„ 크게 와닿지 μ•Šμ•˜λ˜κ²Œ κ°€μž₯ 큰 이유고 두 번째 μ΄μœ λŠ” CS에 λŒ€ν•œ μ „λ°˜μ μΈ 이해가 λΆ€μ‘±ν•΄μ„œ 이해에 λŒ€ν•œ 속도가 λŠ¦μ—ˆλ˜ 것 κ°™λ‹€.
λ§Žμ€ λ°˜μ„±μ˜ μ‹œκ°„μ„ κ°€μ§€λŠ” λ©˜ν† λ§ μ‹œκ°„μ΄μ˜€λ‹€..😿

κ·ΈλŸΌμ—λ„ κΈ°λ‘ν•˜μ§€ μ•ŠμœΌλ©΄ κΉŒλ¨ΉμœΌλ‹ˆκΉŒ λ©˜ν† λ§ λ‚΄μš©μ„ κΈ°λ‘ν•΄λ³΄μž!

1. ThreadLocal

ThreadLocal ν΄λž˜μŠ€λŠ” μŠ€λ ˆλ“œμ™€ μ—°κ²°ν•˜λ €λŠ” 클래슀의 멀버 ν•„λ“œλ‘œ μ‚¬μš©λ˜λ©°, Getter와 Setter λ©”μ†Œλ“œλ‘œ 데이터 접근이 κ°€λŠ₯ν•˜λ‹€.
즉, 각 μŠ€λ ˆλ“œμ— μ’…μ†λ˜λŠ” μŠ€λ ˆλ“œ μ „μš© 지역 λ³€μˆ˜, 멀버 ν•„λ“œλΌλŠ” μ˜λ―Έμ΄λ‹€.
Java 8 Referenceλ₯Ό μ°Έκ³ ν•˜λ©΄ ThreadLocal λ³€μˆ˜κ°€ final static μ œμ–΄μžλ‘œ μ„ μ–Έλ˜μ–΄ μžˆλŠ”λ° κ·Έ μ΄μœ λŠ” 뭘까?

λ©”μ†Œλ“œμ˜ 지역 λ³€μˆ˜λŠ” ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό λ°˜λ‚©ν•˜κΈ° λ•Œλ¬Έμ— μ§μ ‘μ μœΌλ‘œ μ™ΈλΆ€ λ©”μ†Œλ“œμ—μ„œ μ ‘κ·Ό ν•  μˆ˜κ°€ μ—†λ‹€.
λ˜ν•œ, λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œλ„ μ ‘κ·Όν•˜λŠ” λ³€μˆ˜μΌ 경우(λ™μ‹œμ„±μ„ 보μž₯ν•˜λŠ” μ—¬λŸ¬ 방법이 μžˆμ§€λ§Œ) λ°μ΄ν„°μ˜ λ™μ‹œμ„±μ„ 보μž₯ 해쀄 수 μ—†λ‹€.
μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μŠ€λ ˆλ“œ μ „μš© 지역 λ³€μˆ˜λ‘œ ThreadLocal 클래슀λ₯Ό μ΄μš©ν•˜λ©°,
μŠ€λ ˆλ“œ λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœλ˜λŠ” λͺ¨λ“  λ©”μ†Œλ“œκ°€ ThreadLocal 객체에 μ ‘κ·Ό ν•  수 있고 λ°μ΄ν„°μ˜ λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ—¬μ•Όλ§Œ μŠ€λ ˆλ“œ λ‚΄μ˜ λͺ¨λ“  κ³³μ—μ„œ μ ‘κ·Ό ν•  수 있기 λ•Œλ¬Έμ— final static μ œμ–΄μžλ₯Ό ν•¨κ»˜ μ„ μ–Έν•œλ‹€.

βœ”οΈ μ‚¬μš© μ˜ˆμ‹œ
- Spring Security - μ‚¬μš©μž 인증 정보 μ „νŒŒ
- MDC Filter - μŠ€λ ˆλ“œ 별 둜그 (Tomcat 같은 WASλ‚˜(μŠ€λ ˆλ“œ λ°œκΈ‰, λ°˜λ‚©) 싱글톀 λ””μžμΈ νŒ¨ν„΄μ—μ„œλŠ” μ–΄λ–»κ²Œ μ‚¬μš©λ κΉŒ?)

 

2. Blocking / Non-Blocking

κΈ€λ‘œ 정리할 λ•ŒλŠ” λ‚˜λ¦„ λͺ…ν™•νžˆ μ΄ν•΄ν–ˆλ‹€κ³  μƒκ°ν–ˆλŠ”λ°, 막상 μ„€λͺ…ν•˜λ €κ³  ν•˜λ‹ˆ μ œλŒ€λ‘œ λ§ν•œκ²Œ μ—†λ˜ κ°œλ…μ΄λ‹€.
이번 κ²Œμ‹œκΈ€λ‘œ λ‹€μ‹œ μ •λ¦¬ν•΄λ³΄μž.

Blockingκ³Ό Non-Blocking은 μ œμ–΄κΆŒμ„ κ°€μ§€λŠ” κ΄€μ μœΌλ‘œ λ°”λΌλ³΄λŠ” κ°œλ…μ΄λ‹€.
ν•˜μ§€λ§Œ μ΄λŠ” 관념적인 이야기이고, μ§„μ§œ μ€‘μš”ν•œ ν‚€ν¬μΈνŠΈλŠ” Blockingκ³Ό Non-Blocking은 IO 접근에 λŒ€ν•œ κ°œλ…μ΄λ‹€.

πŸ“ Blocking
IO μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” OS 컀널에 μ ‘κ·Όν•΄λ©°, ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€λ₯Ό μ μœ ν•˜κ³  μžˆλŠ” CPUλŠ” IO μž‘μ—…μ΄ 마무리될 λ•Œ κΉŒμ§€ λŒ€κΈ° μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€. 이 λ•Œ, IO μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” CPUλŠ” μžμ›μ„ μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” λ¦¬μ†ŒμŠ€ λ‚­λΉ„κ°€ 크닀. 

πŸ“ Non-Blocking
Blockingκ³Ό 달리 IO μž‘μ—…μ„ μ§„ν–‰ν•˜λŠ” λ™μ•ˆ ν˜„μž¬ CPUλ₯Ό 점유 쀑인 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ€‘λ‹¨ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, CPU μžμ›μ„ ν™œμš© ν•  수 있기 λ•Œλ¬Έμ— μžμ›μ˜ λ‚­λΉ„κ°€ Blocking에 λΉ„ν•΄ 쀄어든닀.
 

I/O λͺ¨λΈ : blocking, non-blocking, 동기, 비동기

Blocking / Non-Blocking Blocking I/O μž‘μ—…μ€ μœ μ €λ ˆλ²¨μ—μ„œ 직접 μˆ˜ν–‰ν•  수 μ—†λ‹€. μ‹€μ œ I/Oλ₯Ό μˆ˜ν–‰ν•˜λŠ”κ²ƒμ€ μ»€λ„λ ˆλ²¨μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ μœ μ € ν”„λ‘œμ„ΈμŠ€(λ˜λŠ” μ“°λ ˆλ“œ)λŠ” μ»€λ„μ—κ²Œ I/Oλ₯Ό μš”μ²­ν•΄μ•Όν•œλ‹€.

ozt88.tistory.com


3. Synchronous / Asynchronous (동기 / 비동기)

Blocking, Non-Blocking IO λͺ¨λΈκ³Ό 달리 μŠ€λ ˆλ“œ ν˜Ήμ€ ν”„λ‘œμ„ΈμŠ€μ˜ κ΄€μ μ—μ„œ λ°”λΌλ³΄λŠ” κ°œλ…μ΄λΌκ³  ν•  수 μžˆλ‹€.
동기, λΉ„λ™κΈ°λŠ” μž‘μ—…μ˜ λ°˜ν™˜μ— λŒ€ν•΄ 영ν–₯을 λ°›λŠ”μ§€μ— 따라 λ‚˜λ‰˜μ–΄μ§„λ‹€. 

πŸ“ Synchronous (동기)
λ™κΈ°λŠ” ν”„λ‘œμ„ΈμŠ€(ν˜Ήμ€ μŠ€λ ˆλ“œ)κ°€ μ»€λ„μ—κ²Œ IO μž‘μ—…μ„ μš”μ²­ν•˜κ³ , ν•΄λ‹Ή μš”μ²­μ— λŒ€ν•œ 응닡(μž‘μ—…μ˜ λ°˜ν™˜)이 올 λ•Œ κΉŒμ§€ λŒ€κΈ°(Wait)ν•˜λ©° λ™κΈ°ν™”ν•˜λŠ” μž‘μ—…μ„ λ§ν•œλ‹€. Blocking 처럼 IO μž‘μ—…μ— μ˜ν•΄ ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ‹¨λ˜λŠ” 것에 λŒ€ν•œ 관점이 μ•„λ‹ˆλΌ ν”„λ‘œμ„ΈμŠ€ μš”μ²­μ—μ„œ μ»€λ„μ˜ μž‘μ—…μœΌλ‘œ Context Switching이 μΌμ–΄λ‚˜λ©΄μ„œ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ΄ 잠깐 λŒ€κΈ°ν•œ μƒνƒœκ°€ λ˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

πŸ“ Asynchronous (비동기)
λΉ„λ™κΈ°λŠ” 동기와 달리 ν”„λ‘œμ„ΈμŠ€(ν˜Ήμ€ μŠ€λ ˆλ“œ)κ°€ μ»€λ„μ—κ²Œ IO μž‘μ—…μ„ μš”μ²­ ν–ˆμ„ λ•Œ, μ»€λ„μ˜ 응닡에 λŒ€ν•΄ 영ν–₯을 받지 μ•ŠλŠ”λ‹€.
즉, λΉ„λ™κΈ°μ μœΌλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ ν•  λ•Œ, ν•΄λ‹Ή μž‘μ—…μ΄ μ’…λ£Œλ˜μ§€ μ•Šμ•„λ„ λ‹€λ₯Έ μž‘μ—…μœΌλ‘œ 이동 ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

(영ν–₯을 받지 μ•ŠλŠ”λ‹€λŠ” 말은 μ»€λ„μ˜ 응닡을 μΈμ‹ν•˜μ§€ μ•Šμ•„λ„ μ»€λ„μ—κ²Œ μš”μ²­ν•œ IO μž‘μ—… μ΄ν›„μ˜ μž‘μ—…μ„ ν”„λ‘œμ„ΈμŠ€λŠ” μˆ˜ν–‰ν•œλ‹€λŠ” 말이닀.)
 

Asynchronous vs synchronous execution, what does it really mean?

What is the difference between asynchronous and synchronous execution?

stackoverflow.com

 

4. Buffer

ν•΄λ‹Ή κ°œλ…μ„ μ„€λͺ…ν•  λ•Œ, Block에 λŒ€ν•œ κ°œλ…λ„ ν•¨κ»˜ μ„€λͺ… ν–ˆλŠ”λ°, κ·Έ λ•Œλ¬ΈμΈμ§€ Buffer의 μ€‘μš”ν•œ κ°œλ…μΈ λͺ¨μ•„μ„œ ν•œλ²ˆμ—! λΌλŠ” 점을 놓쳐버렸닀. λ…ΉμŒν•œ λ‚΄μš©μ„ 듣닀보면 정말 μ₯κ΅¬λ©μ— λ“€μ–΄κ°€κ³  싢을 정도닀. 이번 회고λ₯Ό 톡해 λ‹€μ‹œ ν•œ 번 μ •λ¦¬ν•˜λŠ” μ‹œκ°„μ„ κ°€μ Έλ³΄μž.

λ¨Όμ € ν•΄λ‹Ή κ°œλ…μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œλŠ” νŒŒμΌμ΄λ‚˜ 데이터에 μ ‘κ·Όν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.
νŒŒμΌμ„ λ””μŠ€ν¬μ— μ €μž₯ν•œλ‹€κ³  ν–ˆμ„ λ•Œ, κ·Έλƒ₯ λ¬΄μž‘μ • μ €μž₯λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ””μŠ€ν¬(ν˜Ήμ€ λ©”λͺ¨λ¦¬ λ“±μ˜ κΈ°μ–΅ μž₯μΉ˜λ“€) μ˜μ—­μ„ Blockμ΄λΌλŠ” κ³΅κ°„μœΌλ‘œ λ‚˜λˆ„κ³ , ν•΄λ‹Ή μ˜μ—­μ— 맞게 파일(ν˜Ήμ€ 데이터)λ₯Ό μ €μž₯ν•˜κ²Œ λœλ‹€.

Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν†΅ν•΄μ„œ νŒŒμΌμ„ μ €μž₯ν•˜λŠ” λ‘œμ§μ„ μž‘μ„±ν–ˆλ‹€κ³  κ°€μ • ν–ˆμ„ λ•Œ, 기쑴의 java.ioλŠ” Bufferλ₯Ό 지원해주지 μ•Šμ•„ 데이터λ₯Ό μ“°λŠ” μ¦‰μ‹œ λ””μŠ€ν¬(ν˜Ήμ€ λ©”λͺ¨λ¦¬)에 μ ‘κ·Όν•˜μ—¬ νŒŒμΌμ„ μ €μž₯ν•˜λ„λ‘ ν•œλ‹€. 
ν•΄λ‹Ή μž‘μ—…μ„ ν•œ 번만 ν–ˆμ„ λ•ŒλŠ” 무엇이 λ¬Έμ œμΈμ§€ νŒŒμ•…ν•˜κΈ° νž˜λ“€λ‹€. ν•˜μ§€λ§Œ λ§Œμ•½ μ΄λŸ¬ν•œ μž‘μ—…μ„ 100,000번 ν•˜λŠ” 경우라면 μ–΄λ–»κ²Œ 될까?

일단, νŒŒμΌμ„ μ €μž₯ν•˜λŠ” ν–‰μœ„λ₯Ό ν•œ 번 μˆ˜ν–‰ ν•  λ•Œ λ§ˆλ‹€ λ””μŠ€ν¬μ— μ ‘κ·Ό ν•˜κ²Œ λ˜λŠ”λ°, μ΄λŠ” λΆˆν•„μš”ν•˜κ²Œ λ§Žμ€ λ””μŠ€ν¬ μ ‘κ·ΌμœΌλ‘œ 인해 μž‘μ—…μ„ 마무리 ν•  λ•ŒκΉŒμ§€ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€(μŠ€λ ˆλ“œ)λŠ” κ³„μ†ν•΄μ„œ CPUλ₯Ό μ μœ ν•˜κ³  μžˆμ–΄ λ‹€λ₯Έ μž‘μ—…μ„ λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•˜μ§€ λͺ»ν•˜λŠ” μžμ› λ‚­λΉ„λ₯Ό μ•ΌκΈ° ν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ Buffer λ₯Ό μ‚¬μš©ν•œλ‹€.
BufferλŠ” νŒŒμΌμ„ μ“°κ±°λ‚˜ 읽을 λ•Œ μ¦‰μ‹œ μ½κ±°λ‚˜ μ €μž₯ν•˜μ§€ μ•Šκ³ , μ €μž₯ν•˜κ³ μž ν•˜λŠ” λ°μ΄ν„°λ‚˜ μ™ΈλΆ€μ—μ„œ 전달 받은 데이터λ₯Ό Buffer 객체에 λ‹΄μ•„μ„œ μ—¬λŸ¬ 개의 데이터λ₯Ό Buffer 객체λ₯Ό 톡해 λ””μŠ€ν¬μ— μ ‘κ·Όν•˜κ²Œ λœλ‹€.

μΆ”κ°€μ μœΌλ‘œ 곡뢀할 λ‚΄μš©λ“€

πŸ’₯ OSI 7 Layer

πŸ’₯ Socket

πŸ’₯ Http / Https / SSL

πŸ“š Blocking / Non-Blocking, Synchronous / Asynchronous 

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

Week 9  (0) 2021.07.02
Week 8  (0) 2021.06.25
Week 6  (0) 2021.06.11
Week 5  (0) 2021.06.03
Week 4  (0) 2021.05.27