Backend Ddevelopment
βπ[Backend Development] λκ·λͺ¨ μμ€ν
μν€ν
μ² ν΅μ¬ μμβ
β
1οΈβ£ λ‘λ λ°Έλ°μ (Load Balancer)
1οΈβ£ λ‘λ λ°Έλ°μλ?
- λ‘λ λ°Έλ°μ (Load Balancer)λ ν΄λΌμ΄μΈνΈμ μμ²μ μ¬λ¬ μλ²λ‘ λΆμ°νμ¬ λΆνλ₯Ό μ€μ΄κ³ , μ₯μ κ° λ°μν μλ²λ₯Ό κ°μ§νμ¬ νΈλν½μ μλμΌλ‘ λ€λ₯Έ μλ²λ‘ μ°ννλ μν μ ν©λλ€.
2οΈβ£ λ‘λ λ°Έλ°μ μ’
λ₯
-
L4 (Network Layer) λ‘λ λ°Έλ°μ : IP μ£Όμμ ν¬νΈ κΈ°λ°μΌλ‘ νΈλν½μ λΆμ° (μ: AWS NLB, HAProxy)
-
L7 (Application Layer) λ‘λ λ°Έλ°μ : HTTP μμ²μ λΆμνμ¬ νΉμ URLμ΄λ μΏ ν€ μ 보 κΈ°λ°μΌλ‘ λΆμ° (μ: Nginx, AWS ALB, Traefix)
3οΈβ£ λ‘λ λ°Έλ°μ± λ°©μ
-
Round Robin : μλ²μ μμ°¨μ μΌλ‘ μμ²μ λΆλ°°
-
Least Connections : νμ¬ μ μμκ° κ°μ₯ μ μ μλ²λ‘ λΆλ°°
-
IP Hashing : ν΄λΌμ΄μΈνΈμ IPλ₯Ό κΈ°λ°μΌλ‘ νΉμ μλ²λ‘ νμ μ°κ²° (μΈμ
μ μ§ νμν λ μ¬μ©)
-
Weighted Round Robin : μλ² μ±λ₯μ λ°λΌ κ°μ€μΉλ₯Ό λκ³ νΈλν½μ λΆλ°°
4οΈβ£ μμ
-
AWS ALB(Application Load Balancer) μ€μ μ, νΉμ URL κ²½λ‘μ λ°λΌ λ€λ₯Έ μλ² κ·Έλ£ΉμΌλ‘ μμ²μ λ³΄λΌ μ μμ.
-
https://example.com/api/*
β API μλ² κ·Έλ£Ή
-
https://example.com/images/*
β μ΄λ―Έμ§ μλ² κ·Έλ£Ή
β
2οΈβ£ μΉ μλ²(Web Server)μ μ ν리μΌμ΄μ
μλ²(Application Server)
1οΈβ£ μΉ μλ²(Web Server)λ?
- μΉ μλ²λ μ μ μ½ν
μΈ (HTML, CSS, JavaScript)λ₯Ό μ 곡νλ μν μ νλ©°, λνμ μΌλ‘ Nginxm Apacheκ° μμ΅λλ€.
2οΈβ£ μ ν리μΌμ΄μ
μλ²(Application Server)λ?
- μ ν리μΌμ΄μ
μλ²λ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μλ², λ³΄ν΅ Spring Boot, Django, Express κ°μ νλ μμν¬λ₯Ό μ¬μ©ν©λλ€.
3οΈβ£ μΉ μλ²(Web Server) + μ ν리μΌμ΄μ
μλ²(Application Server) μ°λ λ°©μ.
-
Reverse Proxy : μΉ μλ²(Nginx)κ° ν΄λΌμ΄μΈνΈ μμ²μ λ°κ³ , λ΄λΆ μ ν리μΌμ΄μ
μλ²(Spring Boot)λ‘ μ λ¬
-
μμ
lcation /api/ {
proxy_pass http://localhost:8080/;
}
β
3οΈβ£ λ°μ΄ν°λ² μ΄μ€ (Database, DB)
1οΈβ£ λ°μ΄ν°λ² μ΄μ€ μ’
λ₯.
π1οΈβ£ RDBMS (Relational Database Management System)
- MySQL, PostgreSQL, Oracle
- λ°μ΄ν° μ ν©μ±(ACID 보μ₯)μ΄ μ€μν λ μ¬μ©
π2οΈβ£ NoSQL
- MongoDB, Cassandra, Redis
- νΈλν½μ΄ λ§κ³ λΉ λ₯Έ μ½κΈ°/μ°κΈ° μ±λ₯μ΄ νμν κ²½μ° μ¬μ©
2οΈβ£ λ°μ΄ν° λΆμ° μ λ΅
-
μ€λ©(Sharding) : λ°μ΄ν°λ₯Ό μ¬λ¬ μλ²μ λλ μ μ μ₯
-
λ ν리μΌμ΄μ
(Replication) : λ°μ΄ν°λ₯Ό μ¬λ¬ μλ²μ 볡μ νμ¬ μ₯μ λλΉ
3οΈβ£ μμ
-
MySQL Master-Slave Replication:
- Master DB: μ°κΈ° μμ
μ²λ¦¬
- Slave DB: μ½κΈ° μμ
μ²λ¦¬
β
4οΈβ£ μΊμ μμ€ν
(Cache System)
1οΈβ£ μΊμ(Cache)λ?
- μμ£Ό μ¬μ©νλ λ°μ΄ν°λ₯Ό λΉ λ₯΄κ² μ 곡νκΈ° μν΄ λ©λͺ¨λ¦¬μ μ μ₯νλ κΈ°μ
2οΈβ£ μΊμ μ μ₯μ μ’
λ₯
π1οΈβ£ λ©λͺ¨λ¦¬ μΊμ.
π2οΈβ£ CDN μΊμ.
- Cloudflare
- AWS CloudFront
3οΈβ£ μΊμ μ μ±
-
TTL(Time-To-Live) : μΌμ μκ°μ΄ μ§λλ©΄ μΊμ μμ
-
LRU(Least Recently Used) : κ°μ₯ μ€λ μ¬μ©λμ§ μμ λ°μ΄ν°λΆν° μμ
4οΈβ£ μμ
-
Spring Boot + Redis μΊμ μ μ©
@Cacheable(value = "userCache", key = "#userId")
public User getUserById(Long userId) {
return userRepository.findById(userId).orElse(null);
}
β
5οΈβ£ λ©μμ§ ν (Message Queue, MQ)
1οΈβ£ λ©μμ§ νλ?
- λΉλκΈ° μ²λ¦¬λ₯Ό μν΄ λ©μμ§λ₯Ό μ μ₯νκ³ μ λ¬νλ μμ€ν
2οΈβ£ λ©μμ§ ν μ’
λ₯.
-
Kafka : λλμ λ°μ΄ν° μ²λ¦¬ κ°λ₯, λ‘κ·Έ μ²λ¦¬, μ€μκ° μ€νΈλ¦¬λ° μ§μ
-
RabbitMQ : λΉ λ₯Έ λ©μμ§ νμ, νΈλμμ
μ²λ¦¬ κ°λ₯
-
AWS SQS : κ΄λ¦¬ν λ©μμ§ ν μλΉμ€
3οΈβ£ μμ .
-
Spring Boot + Kafka
@KafakaListener(topics = "order-topic", groupId = "order-group")
public void consume(String message) {
System.out.println("Received Message: " + message);
}
β
6οΈβ£ CDN (Content Delivery Network)
1οΈβ£ CDNμ΄λ?
- μ μ μ½ν
μΈ (μ΄λ―Έμ§, λμμ, CSS)λ₯Ό μ μΈκ³ μ¬λ¬ μλ²μ λ°°ν¬νμ¬ λΉ λ₯΄κ² μ 곡νλ κΈ°μ
2οΈβ£ CDN λμ λ°©μ
-
- μ¬μ©μκ° μΉμ¬μ΄νΈ μ μ
-
- CDN μλ²κ° κ°μ₯ κ°κΉμ΄ μμΉμμ μ½ν
μΈ μ 곡
-
- μλ³Έ μλ² λΆν κ°μ
3οΈβ£ μμ
- AWS ClouldFrontλ₯Ό μ¬μ©νμ¬ μ μ μ½ν
μΈ μΊμ±
β
7οΈβ£ λͺ¨λν°λ§ & λ‘κΉ
μμ€ν
1οΈβ£ λͺ¨λν°λ§ μμ€ν
-
Prometheus + Grafana : μλ² λ©νΈλ¦ μμ§ λ° μκ°ν
-
AWS CloudWatch : AWS 리μμ€ λͺ¨λν°λ§
2οΈβ£ λ‘κΉ
μμ€ν
-
ELK Stack (Elasticsearch, Logstash, Kibana) : λ‘κ·Έ μμ§ λ° λΆμ
-
Fluetd : κ²½λ λ‘κ·Έ μμ§κΈ°
3οΈβ£ μμ
-
Spring Boot + ELK
logging.file.name=logs/app.log
β
8οΈβ£ νμ₯μ± (Scalability)
1οΈβ£ νμ₯ λ°©λ²
π1οΈβ£ μμ§ νμ₯ (Scale-Up)
- μλ² μ±λ₯ μ
κ·Έλ μ΄λ (CPU, RAM μΆκ°)
- νκ³κ° μ‘΄μ¬ν¨
π2οΈβ£ μν νμ₯ (Scale-Out)
- μλ² κ°μλ₯Ό λλ € λΆν λΆμ°
- λ‘λ λ°Έλ°μλ₯Ό νμ©
β
9οΈβ£ μ₯μ λμ (Fault Tolerance)
1οΈβ£ μ₯μ λμ κΈ°λ²
-
Failover : μ₯μ λ°μ μ μλμΌλ‘ λ체 μλ²λ‘ μ ν
-
Circuit Breaker ν¨ν΄ : μλΉμ€κ° μΌμ νμ μ΄μ μ€ν¨νλ©΄ μλμΌλ‘ μ°¨λ¨
2οΈβ£ μμ
-
Spring Cloud + Resilience4j Circuit Breaker
@CircuiteBreaker(name = "backendA", fallbackMethod = "fallback")
public String callService() {
return restTemplate.getForObject("http://example.com/api", String.class);
}