작성
·
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개 나오는게 아니라 무한루프가 돌아야되는거 아닌가해서요!