í°ì¤í 리 ë·°
[BE] 주ëì´ ë°±ìë ê°ë°ìê° ë°ëì ììì¼ í ì¤ë¬´ ì§ì Ch01~02
ì¤ë©ì´ 2025. 11. 14. 17:51
Chapter 01. ë¤ì´ê°ë©°
1. ì½ë©ì í ì ìê² ë ê²ì¼ ë¿
1ì±í°ë ì¬ì¤ ìíë¡ê·¸ ê°ì ëëì´ë¼ í¬ê² ìì½í ë´ì©ì ìë¤.
íì§ë§ ê°ë°ìë¡ ì·¨ì í´ì ì¼í 3ë ëì ì주 겪ì 문ì ë¤ì´ ëììì´ì ë¨ëíë¤. ì§ê¸ ë¹ì¥ íìí ìë¬ë¤ë§ í´ê²°íëê±° ,,
ë³ ë´ì©ì ìì§ë§ ìíë¡ê·¸ë¥¼ ë³´ê³ ëëê±´, ì´ ì± ëíí ì§ì§ ëì ë§ì´ ë ê² ê°ë¤ë ìê°ì íë¤
ë°±ì¤ë를 ê°ë°í´ë ì 매íê² ìë©´ì ê°ë°íë ì¬ëë¤. ìë°ë§ ëì¶© ìê³ ì¤íë§ë¶í¸ë§ ì¼ë²ë¬´ë¦¬ë ì¬ëë¤
꾸ì¤íê² íì´í ~ íì¬ì ë§ê³ ê°ë°ìê° ëì¥
Chapter 02. ëë ¤ì§ ìë¹ì¤. ì´ëë¶í° ë´ì¼ í ê¹
첫 ë§ì£¼í ì±í°ë¶í° ë´ê° ê¶ê¸í´ì ììë³´ë 주ì ë¤. ëì©ë í¸ëí½! ëë°
ð ì²ë¦¬ëê³¼ ìëµ ìê°
ìë²ì ì±ë¥ì íë¨íë ë¤ìí ì§í ì¤ ê°ì¥ ì¤ìí ìëµ ìê°ê³¼ ì²ë¦¬ëì ëí´ ìì본ë¤.
1. ìëµ ìê°
- ìëµ ìê° ? ì¬ì©ìì ìì²ì ì²ë¦¬íë ë° ê±¸ë¦¬ë ìê°
- íëì API ìì²ì ì²ë¦¬íë ê³¼ì
- API ìì²(ìë²ì ì°ê²°, ìë²ë¡ ë°ì´í° ì ì¡) → SQLì¤í, ìëµ ìì± ë±(DB ìë¤ë¦¬ê°ë¤ë¦¬) → API ìëµ (í´ë¼ì´ì¸í¸ë¡ ë°ì´í° ì ì¡)
- ìëµìê° ì¸¡ì 기ì¤
ë 기ì¤ì ìëµ ë°ì´í°ì í¬ê¸°ê° ìì¼ë©´ ë³ë¡ ì°¨ì´ ìëì§ë§, ì ì¡í ë°ì´í°ê° í¬ê±°ë ë¤í¸ìí¬ ìëê° ë리면 ì°¨ì´ê° ì»¤ì§ ì ìë¤.
ìë² ì±ë¥ì ì¬ë°ë¥´ê² íê°íë ¤ë©´ ë°ì´í° í¹ì±ì´ë ë¤í¸ìí¬ íê²½ì ê³ ë ¤í´ ì ì í ì§í를 ì íí´ì¼ íë¤.- TTFB(Time to First Byte) : ìëµ ë°ì´í° ì¤ ì²« ë²ì§¸ ë°ì´í¸ê° ëì°©í ëê¹ì§ 걸린 ìê°
- TTLB(Time to Last Byte) : ìëµ ë°ì´í°ì ë§ì§ë§ ë°ì´í¸ê° ëì°©í ëê¹ì§ 걸린 ìê°
- ìë²ì ì²ë¦¬ ìê°
- ë¡ì§ ìí(if, for ë±)
- DB ì°ë ←←←←←←←←← ìë¤ ëì´ ì ì¼ ë§ì´ ì°¨ì§
- ì¸ë¶ API ì°ë ←←←←←← ëë§ í´ë ê±°ì 80~95%ê¹ì§ ì°¨ì§íë¤
- ìëµ ë°ì´í° ìì±(ì ì¡)
2. ì²ë¦¬ë
- ì²ë¦¬ë ? ë¨ì ìê°ë¹ ìì¤í ì´ ì²ë¦¬íë ìì ë
- ì²ë¦¬ë 측ì 기ì¤
- TPS(transaction per second) : ì´ë¹ í¸ëìì ì
- RPS(request per second) : ì´ë¹ ìì² ì
- TPS를 ëì¼ ì ìë ë°©ë²
- ìë²ê° ëìì ì²ë¦¬í ì ìë ìì² ì를 ëë ¤ ë기 ìê° ì¤ì´ê¸°
- ì²ë¦¬ ìê° ì체를 ì¤ì¬ ë기 ìê° ì¤ì´ê¸°
- TPS를 íì¸íë ë°©ë²
- 모ëí°ë§ ìì¤í
íì©
- ì¤ì¹´ì°í°, íí¬ì¸í¸, ë´ë ë¦, ...
- 모ëí°ë§ ìì¤í
íì©
ð ìë² ì±ë¥ ê°ì 기ì´
1. ë³ëª©ì§ì ë° ìì§/ìí íì¥
TPS를 ëì´ë ¤ë©´ 먼ì 모ëí°ë§ ë구(ëë ë¡ê·¸)를 ì¬ì©íì¬ ì±ë¥ 문ì ê° ë°ìíë ì§ì ì ì°¾ìì¼ íë¤.
ì±ë¥ 문ì 를 ì¼ì¼í¤ë ìì¸ì ì°¾ìë¤ë©´, ê¸í ë¶ì ëë ë°©ë² ì¤ íëì¸ ìì§íì¥ / ìë²ë¥¼ ë리ë ë°©ë²ì¸ ìí íì¥ì ê³ ë ¤íë¤.
- ìì§íì¥
- ìì§íì¥ ? CPU, ë©ëª¨ë¦¬, ëì¤í¬ ë±ì ììì ì¦ê°ìì¼ì ê¸í ë¶ì ëë¤.
- ë ë¹ ë¥¸ CPUë¡ ë°ê¾¸ê±°ë, CPU ì½ì´ì를 ë리기 / ë©ëª¨ë¦¬ íì¥ / ëì¤í¬ë¥¼ HDD → SDD
- ìì§íì¥ì ì¦ê°ì ì¸ í¨ê³¼ë¥¼ ë°ë¡ ì»ì ì ìì§ë§ í¸ëí½ì´ ì§ìí´ì ì¦ê°íë©´ ì¸ì ê° ê²°êµ ëë¤ì ì±ë¥ 문ì ê° ë°ìíë¤.
ë¹ì©ì´ ë§ì´ ë¤ê¸° ë문ì 매 ë² ìì§íì¥ì ë°ë³µí ìë ìë¤.
- ìííì¥
- ìííì¥ ? ìë²ë¥¼ ì¶ê°ë¡ í¬ì í´ TPS를 ëì¸ë¤.
- ê·¸ë¬ë 무í±ëê³ ìë²ë¥¼ ì¶ê°íë©´ ìëë¤.
DBìì ì±ë¥ 문ì ê° ë°ìíëë° ìë²ë¥¼ ì¶ê°ë¡ í¬ì íë©´ ë¶íê° ë 커ì§ê³ ì±ë¥ 문ì ë ì íë ì ìë¤.
→ DBë ì¸ë¶ APIì ì±ë¥ 문ì ê° ë°ìíì§ ìë ë²ì ë´ììë§ ìí íì¥ì í´ì¼ í¨ê³¼ê° ìë¤.
2. DB 커ë¥ì í
DB 커ë¥ì
íì´ë,
ìë²ì DBì¬ì´ì ë¤í¸ìí¬ ì°ê²°ì ìì±íê³ ì¢
ë£íë ë°ìë§ í´ë ìê°ì´ ì¤ë 걸리ë, DBì ì°ê²°ë 커ë¥ì
ì 미리 ìì±í´ì ë³´ê´íë ê²ì ì미íë¤.
ì í리ì¼ì´ì ì DBìì ì´ íìí ë íìì 커ë¥ì ì ê°ì ¸ì ì¬ì©íê³ , ìì ì´ ëëë©´ ë¤ì íì ë°ííë¤.
커ë¥ì íì ì¬ì©íë©´ ì´ë¯¸ ì°ê²°ë 커ë¥ì ì ì¬ì¬ì©í기 ë문ì ìëµ ìê°ì´ ì¤ì´ëë ì¥ì ì´ ìë¤.
â» Springbootë HikariCP, Goì¸ì´ë ìì²´ DB 커ë¥ì íì ì§ì
커ë¥ì íì ì¤ì ê°ë¤ ì¤ ì¤ì 3ê°ì§ë ìëì ê°ë¤.
- 커ë¥ì
í í¬ê¸° (ëë ìµì í¬ê¸°, ìµë í¬ê¸°)
- 커ë¥ì íì 미리 ìì±í´ ë 커ë¥ì ê°ì를 ì§ì íë ì¤ì
- DB ìí를 ê³ ë ¤íì¬ ì»¤ë¥ì íì ìµì/ìµë í¬ê¸°ë¥¼ ì¡°ì íë¤. (ex. ìíì ë® ìê° / ê²ìì ì ë ìê°ì í¸ëí½ì´ ëìì ì°¸ê³ )
- íì 커ë¥ì
ì´ ìì ë 커ë¥ì
ì 구í ëê¹ì§ ë기í ìê°
- íì ì¬ì©í ì ìë 커ë¥ì
ì´ ìì ë 커ë¥ì
ì ì»ê¸° ìí´ ê¸°ë¤ë¦´ ì ìë ìµë ìê°ì ì미
(â» ì§ì ë ë기 ìê° ìì 커ë¥ì ì 구íì§ ëª»íë©´ DB ì°ê²° ì¤í¨ ìë¬ê° ë°ì) - ë기ìê°ì ì§§ê² ì¤ì íì¬ ìë¬ë¥¼ ë¹ ë¥´ê² ìëµíë ê²ë ë°©ë²ì.
→ ë기 ìê°ì ì§§ê² ì¤ì íë©´ ìë² ë¶í를 ì¼ì ìì¤ì¼ë¡ ì ì§í ì ìì¼ë©° ìë²ë¥¼ ìì ì ì¼ë¡ ì´ìíë ë° ëìì´ ëë¤.
- íì ì¬ì©í ì ìë 커ë¥ì
ì´ ìì ë 커ë¥ì
ì ì»ê¸° ìí´ ê¸°ë¤ë¦´ ì ìë ìµë ìê°ì ì미
- 커ë¥ì
ì ì ì§ ìê° (ìµë ì í´ ìê°, ìµë ì ì§ ìê°)
- 커ë¥ì ì´ ì¬ì©ëì§ ìë ìê°ì´ 길ì´ì§ë©´ ì°ê²°ì´ ë길 ì ìë¤. ì´ë¬í ìë¬ë¥¼ ë°©ì§í기 ìí´ ìµëì í´ìê°, ìµëì ì§ìê°ì ì ê³µíë¤.
- ìµë ì í´ ìê° : ì¬ì©ëì§ ìë 커ë¥ì ì íì ì ì§í ì ìë ìµë ìê°ì ì미
- ì í¨ì± ê²ì¬ : 커ë¥ì ì´ ì ìì ì¼ë¡ ì¬ì©í ì ìë ìíì¸ì§ ì¬ë¶ë¥¼ íì¸
- ìµë ì ì§ ìê° : ì¤ì í ìê° ëìë§ ì»¤ë¥ì ì´ ì ì§ëë¤. ì¤ì ìê°ì´ ì§ëë©´ 커ë¥ì ì´ ì í¨íëë¼ë 커ë¥ì ì ë«ê³ íìì ì ê±°ëë¤.
3. ìë² ìºì
DB ìë²ë¥¼ íì¥íì§ ìê³ ë ìëµ ìê°ê³¼ ì²ë¦¬ëì ê°ì íê³ ì¶ë¤ë©´ ìºì ì¬ì©ì ê³ ë ¤í ì ìë¤.
ìºìë ì¼ì¢ ì (key, value) ìì ì ì¥íë Mapê³¼ ê°ì ííì ë°ì´í° ì ì¥ìë¤.
ìºìì ë°ì´í°ë¥¼ ì ì¥í´ëë©´ ëì¼í ë°ì´í°ë¥¼ ìì²í ë DBê° ìë ìºììì ë°ì´í°ë¥¼ ì½ì´ì ìëµìê°ì ì¤ì¼ ì ìë¤.
ìºììì í¤ì í´ë¹íë ê° ì¡°í → (ê° ì¡´ì¬) → ê° ì¬ì©
âï¸ (ê° ìì) → DBìì ê° ì¡°í → (key, value)를 ìºìì ì ì¥ âï¸
- ìºìì ì ì¤ë¥
ì ì¤ë¥ (hit rate) = ìºìì ì¡´ì¬í ê±´ì/ìºììì ì¡°í를 ìëí ê±´ì
→ ì ì¤ë¥ ì´ ëììë¡ DBìì ì°ëì´ ì¤ì´ë¤ê³ ê³§ ìëµ ìê° ê°ì, ì²ë¦¬ë ì¦ê°, DB ë¶í ê°ìë¡ ì´ì´ì§ë¤.
- ìºìê° ê°ë ì°¼ì ë ìì í ëìì ì ííë ê·ì¹
- LRU (Least Recently Used) : ê°ì¥ ì¤ëì ì ì¬ì©ë ë°ì´í°ë¥¼ ì ê±°íë¤.
- LFU (Least Frequently Used) : ê°ì¥ ì ê² ì¬ì©ë ë°ì´í°ë¥¼ ì ê±°íë¤.
- FIFO (First In First Out) : 먼ì ì¶ê°ë ë°ì´í°ë¥¼ 먼ì ìì íë¤.
4. ë¡ì»¬ ìºìì ë¦¬ëª¨í¸ ìºì
- ë¡ì»¬ ìºì (In-memory Cache)
- ìë²íë¡ì¸ì¤ì ëì¼í ë©ëª¨ë¦¬ë¥¼ ìºì ì ì¥ìë¡ ì¬ì©.
- Caffeine(ìë°), go-cache(Go), node-cache(Node.js)
- ì¥ì
- ìëê° ë¹ ë¥´ë¤
- ë³ëì ì¸ë¶ ì°ëì´ íìíì§ ìì 구조를 ë¨ìíê² ì ì§í ì ìë¤.
- ë¨ì
- ìºìì ì ì¥í ì ìë ë°ì´í° í¬ê¸°ì ì íì´ ìë¤.
- ìë² íë¡ì¸ì¤ë¥¼ ì¬ììíë©´ ë©ëª¨ë¦¬ì ì¡´ì¬íë ìºì ë°ì´í°ê° 모ë ìì ëë¤.
- ìºìì ë³´ê´í ë°ì´í° ê·ëª¨ê° ìê³ ë³ê²½ ë¹ëê° ë§¤ì° ë®ë¤ë©´ ë¡ì»¬ ìºìë¡ ì¶©ë¶ (ex. í íë©´ì íìí ìµì ê³µì§ê¸ 목ë¡)
- ë¦¬ëª¨í¸ ìºì
- ë³ë íë¡ì¸ì¤ë¥¼ ìºì ì ì¥ìë¡ ì¬ì©.
- Redis
- ì¥ì
- ë°ì´í° ê·ëª¨ë¥¼ ìí íì¥í ì ìë¤.
- ìë² íë¡ì¸ì¤ê° ì¬ììëëë¼ë ì ì¥ëì´ìë ìºì ë°ì´í°ë ê·¸ëë¡ ì ì§ëë¤.
- ë¨ì
- ìëê° ë리ë¤.
(âµ ìë² íë¡ì¸ì¤ ↔ï¸ ìºì íë¡ì¸ì¤ ë¤í¸ìí¬ íµì ) - ìì¤í
êµ¬ì¡°ê° ë³µì¡í´ì§ë¤.
(âµ ë³ëì ìë² ì¥ë¹ì íë¡ì¸ì¤ê° íìí기 ë문)
- ìëê° ë리ë¤.
- ë°ì´í° ê·ëª¨ê° í¬ë¤ë©´ ë¦¬ëª¨í¸ ìºì ì¬ì© (ex. í¸ëí½ì´ ë§ì ëí ì¼í ì¬ì´í¸ì ê°ë³ ì í ì ë³´)
- ë°°í¬ ë¹ëê° ëì ìë¹ì¤ (âµ ìºì를 ì ì§í ì ìì¼ëê¹)
- ë³ê²½ì 민ê°í ë°ì´í°
- ìºì ì¬ì ì ì¬
- í¸ëí½ì´ ìê°ì ì¼ë¡ ê¸ì¦íë í¨í´ì ë³´ì¸ë¤ë©´ ìºìì ë°ì´í°ë¥¼ 미리 ì ì¥íë ê²ì ê³ ë ¤
- ex. ìê¸ ìë´ í¸ì ì림ì ë°°í¬í기 ì , 미리 ë°ì´í°ë¥¼ ìºìì ì ì¥
- ìºì 무í¨í
- ìºìì ë³´ê´ë ë°ì´í°ì ìë³¸ì´ ë°ëë©´, ìºìì ë³´ê´ë ë°ì´í°ë í¨ê» ë³ê²½íê±°ë ìì ëì´ì¼íë¤.
5. ê°ë¹ì§ 컬ë í°ì ë©ëª¨ë¦¬ ì¬ì©
ê°ë¹ì§ 컬ë í°ë¥¼ ì¬ì©íë ì¸ì´ë ì¬ì©ì´ ëë ê°ì²´ë¥¼ í ë©ëª¨ë¦¬ìì ë°ë¡ ìì íì§ ìê³ ì í´ì§ ê·ì¹ì ë°ë¼ ì¬ì©íì§ ìë ë©ëª¨ë¦¬ë¥¼ ì°¾ìì ë°ííë¤.
- ì¥ì
- ê°ë°ìê° ë©ëª¨ë¦¬ë¥¼ ì§ì ê´ë¦¬í´ì¼ íë ë¶ë´ì ì¤ì¬ì¤ë¤.
- ì½ëë¡ ë©ëª¨ë¦¬ë¥¼ ê´ë¦¬í ì ì기 ë문ì ë³´ì ì´ì를 ì¤ì¬ì¤ë¤.
- ë¨ì
- ìëµ ìê°ì ìí¥ì ì¤ ì ìë¤ (ex. Stop-The-World : GCê° ì¤íëë ëì ì¤íì´ ë©ì¶ë íì)
ëëì¼ë¡ ê°ì²´ê° ìì±ëë ê²ë ë©ëª¨ë¦¬ê° ë¶ì¡±í ì ì기 ë문ì ì¡°í ë²ì를 ì ííê±°ë ì¤í¸ë¦¼ì íì©íì¬ ë°©ì§í´ì¼ íë¤.
ìëì²ë¼ ì¤í¸ë¦¼ì íì©íë©´ íì¼ ì²ë¦¬ ê³¼ì ìì íìí ë©ëª¨ë¦¬ í¬ê¸°ë¥¼ ì¤ì¼ ì ìë¤.
// Stream ì¬ì© X
byte[] bytes = Files.readAllBytes(Path.of("path")); //íì¼ì í ë²ì ë©ëª¨ë¦¬ì ë¡ë©
out.write(bytes)
// Stream ì¬ì© O
InputStream is = Files.newInputStream(Path.of("path"));
byte[] buffer = new byte[8192]; // 8KB ë©ëª¨ë¦¬
int read;
while ((read = is.read(buffer, 0, 8192)) >= 0 {
out.write(buffer, 0, read);
}'Programming > BackEnd' ì¹´í ê³ ë¦¬ì ë¤ë¥¸ ê¸
- ë°ê°ìµëë¤. ê¸ì 구ì±ê³¼ íë¦ì´ ë§¤ì° ìì°ì¤ë¬ì ìµëë¤.â¯
- ë¤ë ë¤ ê°ëë¤~ ì½ë ë´ë´ 몰ì íì´ì. ììì ìë¯¸ë¡ â¯
- ë°ë»í ì´ì¼ê¸° ëë¶ì íë£¨ê° ë ì¦ê±°ìì¡ì´ì. ê°ì¬í©ëâ¯
- ê¸ì´ ì°¸ ê¹ì´ê° ìë¤ì. ê°ì ê³¼ ë ¼ë¦¬ê° ì ì¡°í를 ì´ë¤â¯
- Total
- 1,011
- Today
- 0
- Yesterday
- 0
- docker
- cicd
- dp
- ë°±ì¤
- ìì´í 59
- subset
- í í°ê¸°ë°ì¸ì¦
- bruteforce
- ìí
- Java
- ì¡°í©
- IMAGE
- ê·¸ëííì
- dfs
- ìì íì
- BOJ
- ìì´í 61
- DevOps
- Retrofit2
- BFS
- ìê³ ë¦¬ì¦
- ìì´í 60
- Container
- ì´ìì²´ì
- EffectiveJava
- docker-compose
- ì´íí°ë¸ìë°
- OS
- springboot
- ìì´
