inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

재고시스템으로 알아보는 동시성이슈 해결방법

Pessimistic Lock 활용해보기

facade 패턴 적용 및 service 에서 락 재흭득 처리 후 문제 질문

693

최지환

작성한 질문수 14

0

facade 패턴 적용에 대한 질문

 

강의를 듣고 facade 패턴에 대해서 조금 공부해봤습니다.

강의에서 facade 패턴을 적용한 이유가 락 흭득 관련한 반복 로직을 service 레이어에서 분리하기 위함이라고 이해했습니다.

 

현재 service 레이어에는 메서드가 하나라서 facade 에 메서드가 하나인 것인가? 라는 생각이 들었습니다.
1. 락 처리(동시성 문제 처리)를 하는 메서드만 facade 로 분리를 해주는 것인가요?
2. 아니면 service 레이어에 있는 모든 메서드에 대해서 facade 패턴으로 분리한 클래스에 메서드 호출을 넣어야하는 것인가요?

만약 1번이 맞다면 컨트롤러에서 일반 service layer 와 facade 둘다 컨트롤러에서 의존성을 갖고 있도록 해야할텐데 이는 컨트롤러에에서 락처리를 하는 facade.decrease 와 stockService.decrease 둘다 참조 가능한 것이 이상하다는 생각이 들었습니다.

---
이와 별개로 facade 를 적용하지않고 service 에서 decrease 에 대해 락 흭득 재흭득 처리를 하면 단순하게 아래 처럼 처리 할 수 있다고 생각했습니다..

그랬더니 동시성 문제가 해결되지 않고 테스트를 돌려보니 51 만큼만 감소가 이루어 지더라구요... 이유가 뭔지 궁금합니다.

@Service
public class OptimisticLockStockService {

private final StockRepository stockRepository;

public OptimisticLockStockService(StockRepository stockRepository) {
    this.stockRepository = stockRepository;
}


@Transactional
 public void decrease(Long id, Long quantity) throws InterruptedException {
    while (true) {
       try {
        Stock stock = stockRepository.findByIdWithOptimisticLock(id);
        stock.decrease(quantity);
        stockRepository.saveAndFlush(stock);
            } catch (Exception e) {
              Thread.sleep(50);
            }
        }
        }
}

java spring 동시성

답변 1

0

최상용

최지환님 안녕하세요.
1번 질문과 2번질문의 대한 답은 Facade 클래스는 필요한 경우에만 사용한다고 생각하시면 좋을 것 같습니다.
재고를 감소할때는 StockService.decrease 를 외부로 노출시키지 않고싶다면 접근제어자를 이용하여 노출을 안시킬 수 있을 것 같습니다.

오류관련해서는 소스가 올라가있는 깃헙을 공유해주실 수 있으실까요 ?

51개 나오는게 아니라 무한루프가 돌아야되는거 아닌가해서요!

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

40

2

낙관적 락을 사용할 떄 차이점

0

118

2

동시성 검증 코드에 관한 문의

0

91

2

단일연산

0

69

2

낙관적락vs. 레디스락

0

106

2

안녕하세요. 레디슨 질문있습니다..!!

0

66

2

@Lock(OPTIMISTIC)이 필요한 이유

0

89

2

get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?

0

128

2

DataSource Hikari 사용 이유

0

145

2

saveAndFlush 사용 이유 문의

0

111

3

비관적 락 VS 네임드 락

0

158

3

application.yaml 에 redis 정보

0

99

2

왜 클래스 이름에 Facade 가 붙나요?

0

181

2

@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.

0

218

2

@modifying 이용한 동시성 제어

0

168

2

DB락과 분산락

0

260

2

NamedLock 테스트 실패

0

186

2

테스트에서 트랜잭션 어노테이션 질문 있습니다.

0

171

2

optimistic Lock 재시도 질문입니다.

0

229

2

낙관적 락 테스트 실패

0

239

2

오류?

0

1624

4

LettureLockStockFacadeTest에서 오류가 발생합니다.

1

267

2

Pessimistic Lock 전체 테스트 오류 문의

0

357

3

비관적 락 vs 레디스(Lettuce)락 비교 관련 질문

0

458

2