백엔드 부트캠프/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 이 가장 작다 : >