스프링 - Redission 분산락으로 동시성 문제 해결하기 예시

2024. 12. 13. 22:55· Spring
목차
  1. 의존성 추가
  2. 프로퍼티 파일 작성
  3. RedisConfig 클래스 작성
  4. 분산락 사용하기

스프링 - Redission 분산락으로 동시성 문제 해결하기 예시

 

작성 일자 : 2024년 12월 13일


 

illustrated by Dalle3 upscaled by imageupscaler.com

 

 

의존성 추가

 

dependencies {
  implementation 'org.redisson:redisson-spring-boot-starter:3.40.1'
}

 

  • spring-boot-starter-data-redis는 redisson-spring-boot-starter에 의존성을 가지고 있기 때문에 별도로 추가하지 않아도 됩니다.

 


 

 

프로퍼티 파일 작성

 

spring:
  data:
    redis:
      host: ${REDIS_HOST}
      port: 6379
      password: ${REDIS_PASSWORD}

 


 

 

RedisConfig 클래스 작성

 

@Configuration
@RequiredArgsConstructor
public class RedisConfig {

    @Value("${spring.data.redis.host}")
    private String redisHost;

    @Value("${spring.data.redis.port}")
    private int redisPort;

    @Value("${spring.data.redis.password}")
    private String redisPassword;

    /*
     * Redisson Client
     */
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort);
        config.useSingleServer().setPassword(redisPassword);
        return Redisson.create(config);
    }

}

 


 

 

분산락 사용하기

 

private static final String LOCK_KEY = "stock:";
private static final long WAIT_TIME = 10;
private static final long LEASE_TIME = 5;

...

// Lock 가져오기
RLock lock = redissonClient.getLock(LOCK_KEY + productId);

try {
    // Lock 획득 시도
    boolean locked = lock.tryLock(WAIT_TIME, LEASE_TIME, TimeUnit.SECONDS);
    if (!locked) {
        throw new RuntimeException("Lock 획득 실패");
    }

    // 임계 구역
    Stock stock = stockRepository.findByProductId(productId)
        .orElseThrow(() -> new RuntimeException("존재하지 않는 상품입니다"));

    if (stock.getQuantity() < quantity) {
        throw new RuntimeException("재고가 부족합니다");
    }

    stock.setQuantity(stock.getQuantity() - quantity);
    stockRepository.save(stock);

    return true;
} catch (InterruptedException e) {
    throw new RuntimeException(e);
} finally {
    // Lock 해제
    lock.unlock();
}

 

저작자표시 (새창열림)
  1. 의존성 추가
  2. 프로퍼티 파일 작성
  3. RedisConfig 클래스 작성
  4. 분산락 사용하기
'Spring' 카테고리의 다른 글
  • 스프링 - PostgreSQL text[] 타입을 엔티티의 List<String> 필드에 매핑하기
  • 스프링 - RabbutMQ Retry 정책 설정하기(ft. 10만원의 교훈)
  • 스프링 - Redis CacheManager ClassCastException 해결하기
  • 스프링 - LLM Response를 Redis Streams와 SSE로 스트리밍 해보자
gerrymandering
gerrymandering
gerrymandering
gerrymandering
gerrymandering
전체
오늘
어제
  • 분류 전체보기 (81) N
    • SOLID 원칙 (6)
    • 번역 (4)
    • Nginx (1)
    • Tailwind CSS (1)
    • AWS (7)
      • DMS를 사용한 RDS to OpenSearch .. (3)
      • ECS를 이용한 Blue-Green 무중단 배포 .. (7)
    • NextJS (5)
    • 기타 (12) N
    • Prompt Engineering (6)
    • 읽어볼만한 글 (3)
      • 기술 (0)
      • 쓸만한 툴 (0)
      • 아이템 (0)
      • 웹 디자인 (0)
      • 기타 (3)
    • Cloud Architecture (4)
    • Trouble Shooting (9)
    • Spring (11)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

글쓰기 / 관리자
hELLO · Designed By 정상우.v4.2.1
gerrymandering
스프링 - Redission 분산락으로 동시성 문제 해결하기 예시
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.