백엔드 부트캠프/TIL

[내일배움캠프Spring-66일차] Lettuc 가 뭐야 ?

sintory-04 2025. 5. 22. 21:37

✅ Lettuce란?

1. 주요 특징

  • Thread-safe: 멀티스레드 환경에서 안전하게 사용 가능
  • 비동기 지원: CompletableFuture를 통한 비동기 작업
  • 반응형 프로그래밍: Reactive Streams 지원 (Project Reactor)
  • 커넥션 풀링: 효율적인 연결 관리
  • 클러스터 지원: Redis Cluster 및 Sentinel 지원

2. 다른 Redis 클라이언트와의 차이점

  • Jedis: 동기식, 블로킹 방식
  • Lettuce: 비동기식, 논블로킹 방식
  • Redisson: 분산 객체 및 고수준 추상화 제공
  • Lettuce는 Java용 Redis 클라이언트 라이브러리입니다. 특히 비동기(Asynchronous)반응형(Reactive) 프로그래밍을 지원하는 것이 특징이다.

✅ 동작 방식 요약

Lettuce는 Redis 명령을 비동기적으로 처리한다.
즉, 명령을 날리고 결과를 기다리지 않고 다음 코드를 실행할 수 있다.

RedisAsyncCommands<String, String> async = connection.async();
RedisFuture<String> future = async.get("key");

// 나중에 결과 꺼내기
String value = future.get(); // blocking

-> 비동기가 기억이 나지 않는다면, 해당 블로그를 읽고 오면 된다 !

2025.02.12 - [백엔드 부트캠프[사전캠프]/TIL] - [내일배움캠프-사전캠프 15일차] 동기, 비동기 작업

✅ Lettuce 비동기 구조 흐름

Client Request
    ↓
  Netty EventLoop (NIO 기반)
    ↓
  RedisAsyncCommands
    ↓
  RedisFuture or Mono/Flux 반환
    ↓
  (필요시 blocking or subscribe)

 

✅ Lettuce를 선택하는 경우

  • Spring WebFlux 같이 비동기/논블로킹 흐름 쓸 때
  • 대량의 Redis 트래픽을 처리해야 할 때 (thread-safe하니까 connection pool도 안 써도 됨)
  • 리액티브 프로그래밍과 통합할 때

 

 동기처리방식 (Synchronization)

맞습니다! 동기처리는 Lock뿐만 아니라 다양한 영역에서 사용됩니다.

동기처리가 필요한 상황들

1. 데이터 일관성 보장

// 계좌 잔액 업데이트
synchronized void updateBalance(double amount) {
    this.balance += amount;
}

2. 순서 보장

// 메시지 순서 처리
synchronized void processMessage(Message msg) {
    messageQueue.add(msg);
    processQueue();
}

3. 자원 공유 제어

// 파일 접근 제어
synchronized void writeToFile(String data) {
    fileWriter.write(data);
}

동기처리 방식들

1. synchronized 키워드

  • 메서드나 블록 단위로 동기화
  • 간단하지만 성능 오버헤드 존재

2. ReentrantLock

  • 더 세밀한 제어 가능
  • 공정성(fairness) 설정 가능

3. Atomic 클래스들

  • AtomicInteger, AtomicBoolean 등
  • CAS(Compare-And-Swap) 기반으로 성능 우수

4. 동시성 컬렉션

  • ConcurrentHashMap, ConcurrentLinkedQueue 등
  • 내부적으로 동기화 처리됨

5. 세마포어(Semaphore)

  • 자원 개수 제한
  • 동시 접근 수 제어

 

웹 개발에서의 동기처리

데이터베이스 트랜잭션

@Transactional
public void transferMoney(Account from, Account to, double amount) {
    from.withdraw(amount);
    to.deposit(amount);
}

캐시 동기화

public synchronized String getCachedData(String key) {
    if (!cache.containsKey(key)) {
        cache.put(key, fetchFromDatabase(key));
    }
    return cache.get(key);
}

동기처리는 성능과 안정성의 트레이드오프를 고려해서 적절히 사용하는 것이 중요하다고 한다. 특히 Lettuce 같은 비동기 라이브러리를 사용할 때는 동기처리 방식을 최소화하면서도 필요한 부분에서는 확실히 보장하는 것이 좋다!

✅ Spring Boot에서 Lettuce 사용 방법 - Gradle

spring-boot-starter-data-redis 를 프로젝트에 넣으면 Lettuce 클라이언트 JAR이 함께 들어오고, 자동 설정이 LettuceConnectionFactory 를 써서 Redis에 붙습니다.

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

따로 jedis 안 넣으면 Lettuce가 자동으로 적용된다.

 

 

-> 이건 내가 프로젝트 테스트 할 때, 나온 테스트 결과인데 뿌듯해서 넣어봤따 : >

Redisson 이 가장 작다 : >