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

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

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

Presentation Layer 테스트 (1)

Presentation Layer 테스트 (1) 관련 질문이 있습니다!

작성

·

894

0

안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다.

강의 36:03 쯔음에서 Product가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product의 최신 번호를 조회하게 되면 "001"이 되는 과정에서 ActiveProfiletest로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요.

그러면 그 전에 진행했던 createProduct 테스트의 given에서 Product를 하나 저장한다면 여기서도 ActiveProfiletest이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다.

제가 놓치고 있는게 무엇일까요?

답변 2

1

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

안녕하세요, JUNN님! :)

오 저도 진행하면서 의문을 갖지 않았던 부분인데 예리하시네요! ㅎㅎ
제가 다시 복기해보니, 다음과 같은 상황이네요.

현재 설계에서 가정하고 있는 기저 개념은 Product가 생성 요청되는 순으로 productNumber가 발급되어 저장되며, 그에 따라 auto increment되는 id값도 마찬가지로 그 순서대로 발급될 것이다 라는 내용입니다.
그래서 ProductRepository에서 가장 마지막 productNumber를 가져오기 위해 수행했던 쿼리가 다음과 같이 id 기반 역순 조회를 하는 것이었죠.

select p.product_number from product p order by id desc limit 1;

createOrder() 상황에서 디버거를 걸어놓고 현재 DB에 들어있는 값의 상태를 조회해보면 다음과 같습니다.

  • ID 1번 | 상품번호 001 | 아메리카노 (data.sql)

  • ID 2번 | 상품번호 002 | 카페라떼 (data.sql)

  • ID 3번 | 상품번호 003 | 크루아상 (data.sql)

  • ID 4번 | 상품번호 001 | 카푸치노 (테스트에서 저장한 fixture)

맨 마지막 ID로 상품번호를 조회하니 "001"이 조회되었고, 이를 통해 신규 Product를 만드니 "002"가 되어 data.sql의 영향을 받았음에도 테스트가 통과했습니다.


반대로 createProductWhenProductsIsEmpty() 에서는 다음과 같아요.

  • ID 1번 | 상품번호 001 | 아메리카노 (data.sql)

  • ID 2번 | 상품번호 002 | 카페라떼 (data.sql)

  • ID 3번 | 상품번호 003 | 크루아상 (data.sql)

  • (테스트에서는 아무런 fixture도 저장하지 않았음)

이렇게 되니 마지막 ID로 조회한 상품번호는 "003"이 되었고, 이를 통해 신규 Product를 만드니 "004"가 되어 테스트가 실패한 것이죠.


잘 아시겠지만 예시 프로젝트이기 때문에 구멍이 많은 설계임을 감안해주시면 좋을 것 같고요 ㅎㅎ
궁금증이 풀리셨기를 바랍니다.

감사합니다! :)

와 친절한 설명 감사드립니다! :)

0

안녕하세요! 강의 잘 듣고 있습니다. 동시성 관련한 내용이 나와서 질문드립니다.

39분에 동시성 이슈를 unique 인덱스를 걸거나 UUID로 처리한다고 하셨잖아요. 만약 같은 데이터를 요청하는 경우라면은 어떤 식으로 동시성 처리를 할 수 있을까요 ? (예를 들어, 같은 상품 넘버로 카푸치노를 같은 가격으로 등록한다고 하면)

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

안녕하세요, 코딩천국님! :)

앗 39분에서 말한 이야기가 바로 그 내용인데요.
같은 데이터로 요청이 들어왔을 때 서버에서는 동시간대에 서로 다른 스레드로 요청이 들어오니 판단하기가 어려울 수 있어, DB에서 unique 인덱스 등으로 방어하는 전략을 고려해 볼 수 있다는 의미로 말씀드린 것이었습니다.

그렇게 참고해주시면 좋을 것 같아요. :)

아하! 감사합니다. 바로 이해했습니다.
혹시 그럼 여러 서버 인스턴스를 사용하는 분산환경이라면, unique 인덱스 외에도 분산락, 비관락, 낙관락 등이 필요하겠죠??

테스트 강의에서 다른 질문해서 죄송합니다 ㅎㅎ 강의 듣다가 궁금해져서요!
좋은 하루 보내세요 :)

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

질문하기