Home > Backend Development > πŸ“š[Backend Development] λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 핡심 μš”μ†Œ

πŸ“š[Backend Development] λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 핡심 μš”μ†Œ
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️⃣ λ©”λͺ¨λ¦¬ μΊμ‹œ.

  • Redis
  • Memcached

πŸ“Œ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 λ™μž‘ 방식

    1. μ‚¬μš©μžκ°€ μ›Ήμ‚¬μ΄νŠΈ 접속
    1. CDN μ„œλ²„κ°€ κ°€μž₯ κ°€κΉŒμš΄ μœ„μΉ˜μ—μ„œ μ½˜ν…μΈ  제곡
    1. 원본 μ„œλ²„ λΆ€ν•˜ κ°μ†Œ

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);
    }