인프런 커뮤니티 질문&답변

최지환님의 프로필 이미지

작성한 질문수

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

Pessimistic Lock 활용해보기

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

작성

·

560

·

수정됨

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);
            }
        }
        }
}

답변 1

0

최상용님의 프로필 이미지
최상용
지식공유자

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

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

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