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

요니님의 프로필 이미지
요니

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (3)

주문한 상품 개수만큼 Stock을 감소시키는 로직

작성

·

374

0

안녕하십니까!

 

저의 경우는 해당 로직을

stockRepository.findByProductNumberIn()이 아니라,

일일이 재고와 관련된 ProductNumber에 대하여

stockRepository.findByProductNumber()로

조회하여 decreaseQuantity()를 수행하였습니다.

 

그렇게 하여도, 동일 Stock의 경우 EntityManager에서 조회해오기 때문에 중복된 쿼리가 나가지 않아 어느정도의 성능 감소를 막을 수 있다고 판단하였고,

(물론 In절로 한꺼번에 가져오는것 보단 성능이 덜 나올 것 같습니다)

그대신에 , 로직이 직관적이라는 장점이 있을 것 같아서

위와 같이 해당 로직을 작성하였습니다.

 

이에 대해서는 어떻게 생각하시는지

의견 남겨주시면 감사하겠습니다!

 

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, khd1692 님! :)

음, 저는 구현하신 내용에 대해 조금 반대 의견이긴 한데요. ㅎㅎ
보통 실무에서 데이터베이스를 구축하면, 우리가 만든 프로그램과 같은 서버에서 구동되는 것이 아니라(애플리케이션과 DB가 로컬 연결이 아니라는 의미), 다른 환경에 구성되고는 합니다.
즉, 백엔드 서버에서 데이터베이스에 쿼리하는 것 자체가 네트워크 비용이 포함된 비싼 행위라는 의미입니다.

정리하면 로직의 단순함과 쿼리 비용을 놓고 어느 것이 나을지 비교하는 그림인데요, 성능을 고려할 필요가 없는 가벼운 애플리케이션이라면 전자를 택할 수도 있겠으나, 대부분은 데이터를 한번에 가져오고 애플리케이션에서 좀 더 연산의 복잡도를 가져가여 성능을 고려하는 방법을 사용하고는 합니다.

참고해주시면 좋을 것 같아요. ㅎㅎ

감사합니다. :)

요니님의 프로필 이미지
요니
질문자

좋은 의견 감사합니다!
마침 어제 딱 쿼리를 여러번 타는 대신 로직의 단순함 vs 쿼리를 한번 타냐 대신 로직의 복잡함
의 상황이 있었고,
답변 해주신 내용이 생각나서 저도 로직의 복잡함을 감수하고 쿼리를 한번타도록 작성하였습니다.

다시 생각해 보니 저도 말씀해주신 내용에 동의가 되더라구요!

테스트 관련 내용 뿐만 아니라, 전반적으로 좋은 말씀 그리고 답변 많이 해주셔서 정말 많이 얻어갑니다! 감사합니다!

0

안녕하세요, 인프런 AI 인턴이에요. 주문한 상품의 개수만큼 Stock을 감소시키는 로직에 대해 궁금하신 것 같아요.

일일이 재고와 관련된 ProductNumber에 대하여 stockRepository.findByProductNumber()로 조회하여 decreaseQuantity()를 수행하셨다고 하셨는데, 이 방식도 문제 없이 동작할 수는 있지만 성능 측면에서는 일반적으로는 stockRepository.findByProductNumberIn()을 사용하는 게 더 효율적일 수 있어요. 하지만 중복된 쿼리가 발생하지 않는 상황이라면 큰 문제는 없을 것 같아요.

단, 조회한 인벤토리 정보를 EntityManager를 사용하여 반복해서 조회한다면 성능에 영향을 미칠 수 있어요. 동일 Stock의 경우에도 중복된 쿼리를 발생시키지 않는다면 일일이 조회하는 방식을 사용하는 것이 직관적인 장점이 있을 수 있습니다.

최종적으로 어떤 방식을 선택하더라도, 성능 문제가 발생하지 않고 로직이 동작한다면 개발자의 판단에 따라 결정하실 수 있습니다. 각 방식의 장단점을 고려하여 그에 맞는 방식을 선택하시면 될 것 같아요.

프로그래밍에 대한 질문이나 궁금한 점이 있으면 언제든지 물어보세요. 도움이 될 수 있도록 최대한 답변해드리겠습니다. 좋은 하루 되세요~!

요니님의 프로필 이미지
요니

작성한 질문수

질문하기