Processes

2025. 3. 2. 14:24Spring Microservice

📌 Processes (프로세스 관리 - Stateless 원칙)

(Twelve-Factor App 원칙: 프로세스는 상태를 저장하지 않아야 한다.)

마이크로서비스 아키텍처에서는 각 서비스가 Stateless(무상태)해야 합니다.
즉, 서비스는 실행 중 특정 상태를 저장하지 않으며,
필요한 데이터는 외부 데이터 저장소(SQL, NoSQL, 캐시)에서 가져와야 합니다.

🔹 1. Stateless(무상태) 마이크로서비스란?

  • 마이크로서비스는 특정 요청을 처리한 후 내부적으로 상태를 유지하지 않음.
  • 세션, 사용자 데이터, 트랜잭션 상태 등은 데이터베이스 또는 캐시에 저장.
  • 서비스가 종료되거나 재시작되어도 데이터 유실이 발생하지 않아야 함.

📌 아래 다이어그램은 Stateless 원칙을 기반으로 마이크로서비스가 SQL/NoSQL DB를 활용하는 방법을 나타냅니다.

출처 : Spring Microservices in Action 2nd Edition

 

Cart Service는 데이터를 직접 보관하지 않으며, SQL 또는 NoSQL DB에 저장
마이크로서비스가 중단되어도 데이터가 손실되지 않음
Redis 같은 캐시를 활용하여 성능 최적화 가능

🔹 2. Stateless 마이크로서비스의 장점

확장성(Scalability) 향상

  • Stateless 서비스는 로드 밸런서를 통해 여러 인스턴스로 확장 가능.
  • 특정 인스턴스가 중단되어도 요청을 다른 인스턴스로 분배할 수 있음.

신뢰성(Reliability) 증가

  • 서비스 장애가 발생해도 데이터 손실 위험 없음.
  • 서비스 복구 시, 기존 상태를 유지할 필요가 없어 빠르게 재시작 가능.

배포 유연성 증가

  • 배포 시, 기존 서비스 종료 없이 새로운 서비스 인스턴스를 추가 가능.
  • Rolling Update, Blue-Green Deployment 같은 무중단 배포가 가능함.

🔹 3. 상태가 필요한 경우, 어떻게 관리해야 할까?

✅ (1) 외부 데이터 저장소 활용 (SQL, NoSQL)

모든 상태 정보는 데이터베이스에 저장하여,
서비스 자체가 상태를 유지하지 않도록 설계해야 합니다.

📌 Spring Boot에서 MySQL 연동 예제

spring:
  datasource:
    url: jdbc:mysql://aws-rds-instance:3306/cart-db
    username: cart_user
    password: cart_pass

📌 Spring Boot JPA 엔티티 예제

@Entity
public class Cart {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String userId;
    private String productId;
    private int quantity;
}

✅ (2) In-Memory 캐시 활용 (Redis)

일시적인 상태 정보(예: 세션, 사용자 로그인 상태)는
Redis 같은 인메모리 캐시를 활용하여 관리할 수 있습니다.

📌 Spring Boot에서 Redis 설정 예제

spring:
  redis:
    host: redis-server
    port: 6379

📌 Spring Boot에서 Redis 활용 예제

@Service
public class CartService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void saveCart(String userId, Cart cart) {
        redisTemplate.opsForValue().set("cart:" + userId, cart);
    }

    public Cart getCart(String userId) {
        return (Cart) redisTemplate.opsForValue().get("cart:" + userId);
    }
}

📌 Redis 사용의 장점
✅ 빠른 데이터 접근 속도로 성능 향상
✅ 자주 변경되는 데이터(세션, 캐싱된 데이터)에 적합
✅ 장애 발생 시, Redis 클러스터를 통해 자동 복구 가능

🔹 4. Stateless 서비스 아키텍처에서 피해야 할 실수

서비스 자체에서 세션 정보를 유지하는 경우

// 잘못된 예제 (서비스 내부에서 상태 유지)
public class CartService {
    private Map<String, Cart> cartStorage = new HashMap<>();  // ❌ 메모리에 상태 저장

    public void saveCart(String userId, Cart cart) {
        cartStorage.put(userId, cart);
    }

    public Cart getCart(String userId) {
        return cartStorage.get(userId);
    }
}

🚨 문제점

  • 서비스가 중단되면 저장된 데이터가 모두 사라짐.
  • 여러 인스턴스가 실행될 경우, 데이터 일관성이 깨질 수 있음.

해결 방법: Redis 또는 DB에 저장하여 Stateless 방식으로 변경.

📌 결론: Stateless 마이크로서비스 구현 원칙

1️⃣ 마이크로서비스는 상태를 유지하지 않고, 모든 데이터를 외부 저장소(SQL, NoSQL, Redis)에 저장해야 함
2️⃣ 서비스 중단 또는 재시작이 발생해도 데이터 손실이 없도록 설계해야 함
3️⃣ In-Memory 캐시(예: Redis)를 활용하여 성능을 최적화할 수 있음
4️⃣ 세션 정보는 개별 서비스가 아닌 중앙 집중식 저장소(예: Redis, JWT 기반 인증)에서 관리해야 함
5️⃣ 서비스 확장성(Scalability)과 신뢰성(Reliability)을 높이기 위해, Stateless 원칙을 철저히 준수해야 함

 

🔹 이를 통해 확장 가능하고 유지보수성이 뛰어난 클라우드 네이티브 마이크로서비스를 구축할 수 있습니다! 🚀

'Spring Microservice' 카테고리의 다른 글

Concurrency  (0) 2025.03.02
Port binding  (0) 2025.03.02
Backing Services  (0) 2025.03.02
Dependencies  (0) 2025.03.02
Codebase  (0) 2025.03.02