23.05.07 23:00 작성
·
878
0
안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다.
강의 36:03 쯔음에서 Product
가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product
의 최신 번호를 조회하게 되면 "001"
이 되는 과정에서 ActiveProfile
을 test
로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요.
그러면 그 전에 진행했던 createProduct
테스트의 given에서 Product
를 하나 저장한다면 여기서도 ActiveProfile
이 test
이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다.
제가 놓치고 있는게 무엇일까요?
답변 2
1
2023. 05. 09. 08:34
안녕하세요, 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
2023. 06. 12. 09:50
안녕하세요, 코딩천국님! :)
앗 39분에서 말한 이야기가 바로 그 내용인데요.
같은 데이터로 요청이 들어왔을 때 서버에서는 동시간대에 서로 다른 스레드로 요청이 들어오니 판단하기가 어려울 수 있어, DB에서 unique 인덱스 등으로 방어하는 전략을 고려해 볼 수 있다는 의미로 말씀드린 것이었습니다.
그렇게 참고해주시면 좋을 것 같아요. :)
2023. 05. 09. 08:38
와 친절한 설명 감사드립니다! :)