묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 환경 통합 질문
안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 사항이 있어서 질문드립니다. 강의 내용처럼 통합 테스트를 수행할 때 여러번 Spring 서버를 띄우는 것을 효과적으로 개선하기 위해 TestSupport 추상클래스를 상속받아 Repository/Service 계층 테스트시에 통합된 환경을 구축하는게 더 좋은 것은 이해했는데요.Controller 테스트의 경우, 강의 내용처럼 따로 스프링을 띄우지 않고 @WebMvcTest로만 테스트코드를 작성하는 경우라면 공통 추상 클래스를 구현하는게 비효율적일수도 있을 것 같아서 궁금증이 생겼습니다.@WebMvcTest(Controllers="Controller.class") 형식으로 컨트롤러 클래스들을 명시해 줘야 하는데, 클래스가 수십개로 많아질수록 매번 추가해야 하고, Controllers에 많은 클래스를 넣어야 하고(패키지 단위로 지정한다든가 등의 방식은 없는것 같더라구요), 각 클래스에서 사용하는 MockBean이 많아질수록 필드가 많아져서 본문이 길어 보기 힘들수도 있을 것 같아서요. @SpringBootTest처럼 서버를 띄우는 비용이 발생하지 않으므로, 각각의 컨트롤러 테스트마다 명시적으로 @WebMvcTest를 사용하고, 해당 클래스에서 사용할 Mockbean 또한 명시적으로 지정하는 방식도 괜찮을까요? 실무적인 관점으로 볼 때, 제 생각대로 Controller 클래스의 테스트는 통합하지 않고 각각 구현하는 건 어떨지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
OrderResponse에 List<ProductResponse> 를 추가하는게 적절한가 에 대해 의문이 듭니다
안녕하세요 강사님! 질문 드리기에 앞서 항상 좋은 강의 감사드립니다!제가 강의를 수강하면서 의아한 부분이 있었는데요,바로 OrderResponse에 List<ProductResponse> 를 추가하신 부분 입니다.이에 따라 OrderResponse의 of() 메소드 안에서 order.getOrderProducts() 를 호출할 수 밖에 없게 되었는데요,이때 페치조인을 하지 않는 이상 쿼리가 나가게 될 것 같습니다 (지연로딩)저는 바로 이 측면이 개인적으로 잘못되었다고 생각하는데요,JPA는 어떤 쿼리가 어느 타이밍에 나가는지를 파악하기 어려워서, 최대한 이 측면을 명확하게 해주는게 필요하다고 생각합니다.그래서 저의 경우는 서비스 로직에서 사용되는 repository 메소드 들에서만 쿼리가 나가는 경우로 명확하게 제한을 해주는 편 인데요,이런식으로 서비스 로직이 아닌(정확히는 그 안에서 사용되는 repository메소드) 다른 곳에서 지연로딩으로 인해 쿼리가 나간다면 - 어느타이밍에 어떤 쿼리가 나가는지를 코드만 보고 명확하게 파악할 수 없게 된다고 생각합니다.그래서 결론적으로 저는 OrderResponse 안에서 order.getProducts()를 호출하여 List<ProductResponse>를 만드는게 적절하지 않다고 생각하는데요, 이부분에 대해 강사님의 생각을 말씀해주시면 감사하겠습니다! 감사합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트를 위하여 , OrderService의 createOrder의 파라미터로 registerDateTime을 추가한 측면
안녕하세요! 먼저 항상 좋은 강의 감사드립니다!\다름이 아니라,저는 제목대로 , 테스트를 위해서 OrderSerivce의 createOrder의 파라미터로 registerDateTime을 파라미터로 받게 추가한 측면이 개인적으로 적절하지 않다고 생각하여 질문글을 작성하였습니다. 파라미터를 사용하는 이유는 결국 외부로 부터 값을 받는다는 전제가 깔려있다고 생각하고, 이런 측면에서 보았을 때 요청값으로 시간 값을 받는다고 생각할 수 있습니다.그렇게 생각을 했을때 개인적으로 2가지 정도의 의아한 점이 발생한다고 생각합니다.클라이언트로 부터 넘겨받는 시간이 과연 등록 시간이라고 할 수 있는가? (network delay가 있을것 이기 때문)그렇다고 Controller에서 now() 를 호출한 시간이라는 일종의 고정값을 받을거면 - 파라미터를 선언하는 의미가 있는가? 결론적으로 저는 createOrder의 파라미터로 registerDateTime을 선언하는것이 적합하지 않다고 생각합니다.하지만 우리의 경우는 tdd로써 테스트를 위해 외부로 값을 추출하였는데 - 이러한 문제가 발생하였으므로, tdd 개발론이 과연 적절한 production code를 만드는게 기여하는가? 라는 측면에서 의문이 듭니다.나아가 당연히 저의 미숙한 탓 이겠지만, 강의를 진행해주신 방식대로 온전한 비즈니스 로직을 작성하지 않고 , 테스트 - 개발 - 테스트 - 개발... 이런 플로우로 개발을 하는것이 과연 도움이 되는가? 도 조금 의아한 것 같습니다.어쨌든 여기까지는 저의 순수한 개인적 생각인데요, 이런 부분에 대해서 강사님 께서는 어떻게 생각하시는지 말씀해주시면 정말 감사하겠습니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
Persistence Layer 테스트 (1) 질문
안녕하세요, 좋은 강의 잘 듣고 있습니다.강의 14분쯤에 forDisplay() 메서드를 ProductSellingType Enum 파일에서 생성을 하셨는데요.ProductService 클래스가 아닌 ProductSellingType Enum에서 생성한 이유가 있을까요?어떠한 기준으로 생성을 하셨는지 궁금합니다.추가적으로 이런 부분에 있어 특정 기준을 세우는 관련 글?을 읽고 싶은데 키워드 같은게 있을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 동시성 관련 질문드립니다
안녕하세요 강의 다 듣고 기능 추가해 가며 공부를 하고 있습니다. 그러다 막히는 부분이 있어 질문드리는데 강의 내용을 조금 벗어 나는거 같아 질문을 드려도 될지 모르겠는데 괜찮으시다면 답변 주시면 감사하겠습니다. @Transactional public OrderResponse createOrder(OrderCreateServiceRequest request, LocalDateTime registeredDateTime) { List<String> productCodes = request.getProductCodes(); List<Product> products = findProductsBy(productCodes); Member member = memberRepository.findByPhoneNumber(request.getPhoneNumber()).get(); deductStockQuantities(products); Order order = Order.create(products, member, registeredDateTime); return OrderResponse.of(orderRepository.save(order)); }order를 생성하는 부분에서 재고 감소 되는 부분을 동시성 처리를 해보려 하는데 테스트 코드에선 deductStockQuantities로 넘어가서 findAllByProductCodeIn 만 한번 돌고 롤백이 되더라구요. @Test public void create_order_with_concurrent_5_request() throws InterruptedException { //given createProducts(); OrderCreateServiceRequest request1 = OrderCreateServiceRequest.builder() .productCodes(List.of("A002","A003")) .phoneNumber("010-1111-2222") .build(); OrderCreateServiceRequest request2 = OrderCreateServiceRequest.builder() .productCodes(List.of("A002","A003")) .phoneNumber("010-1111-2222") .build(); OrderCreateServiceRequest request3 = OrderCreateServiceRequest.builder() .productCodes(List.of("A002","A003")) .phoneNumber("010-1111-2222") .build(); int numberOfThreads = 3; ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); CountDownLatch latch = new CountDownLatch(numberOfThreads); //when executorService.submit(() -> { try { orderService.createOrder(request1, LocalDateTime.now()); }finally { latch.countDown(); } }); executorService.submit(() -> { try { orderService.createOrder(request2, LocalDateTime.now()); }finally { latch.countDown(); } }); executorService.submit(() -> { try { orderService.createOrder(request3, LocalDateTime.now()); }finally { latch.countDown(); } }); latch.await(); //then List<Stock> stocks = stockRepository.findAllByProductCodeIn(List.of("A002","A003")); assertThat(stocks).hasSize(2) .extracting("productCode", "quantity") .containsExactlyInAnyOrder( tuple("A002", 7), tuple("A003", 7) ); } @Lock(LockModeType.PESSIMISTIC_WRITE) List<Stock> findAllByProductCodeIn(List<String> productCodes);테스트 코드는 구글링해서 넣어보았는데 이런 부분 관련해서 따로 배운게 없어 잘 안되더라구요. 락도 걸어보고 했는데 어디서 안되는지 잘 모르겠어서 질문드립니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
이 경우, @BeforeEach에 fixture를 구성해도 될까요?
지금 OrderServiceTest 클래스의 createOrder(), createOrderWithStock(), ... 메서드들은 주문을 생성하기 위해서 given절에서 모두 동일하게 product1, 2, 3을 먼저 생성해주는 fixture가 있습니다. @Test void createOrder() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct(HANDMADE, "001", 1000); Product product2 = createProduct(HANDMADE, "002", 3000); Product product3 = createProduct(HANDMADE, "003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); OrderCreateServiceRequest request = OrderCreateServiceRequest.builder() .productNumbers(List.of("001", "002")) .build(); // when OrderResponse orderResponse = orderService.createOrder(request, registeredDateTime); // then assertThat(orderResponse.getId()).isNotNull(); assertThat(orderResponse) .extracting("registeredDateTime", "totalPrice") .contains(registeredDateTime, 4000); assertThat(orderResponse.getProducts()).hasSize(2) .extracting("productNumber", "price") .containsExactlyInAnyOrder( tuple("001", 1000), tuple("002", 3000) ); }product를 생성해주는 부분을 @BeforeEach로 빼내려고 하는데, 적절하다고 판단되시는지 궁금합니다. OrderServiceTest의 모든 메서드가 동일한 product를 생성하고는 있지만,각 테스트 메서드에서 "001"이라는 상품이 있는지는 @BeforeEach 메서드까지 스크롤을 왔다갔다하면서 확인해야될거라 생각합니다.(만약 없는 상품을 주문한다면 given절에서 예외가 발생하는 것이기 때문에, 이 부분은 당연히 있는 상품을 주문한다는 것을 보장하고 테스트 코드를 작성해야 할까요?) order에 관한 테스트이기 때문에, product에 대한 부분은 분리해도 될거라 생각하지만, 우빈님의 말씀대로 스크롤을 왔다갔다하면서 @BeforeEach의 메서드를 수시로 보는 것은 안좋다고 느껴져서.. product 생성에 대한 fixture를 분리괜찮다고 생각하시나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
controller, service용 dto를 분리시키는 것에 대한 질문
항상 잘 듣고 있습니다. 감사합니다. controller layer와 service layer의 dto를 서로 분리시켜서 service layer가 상위 레이어를 모르도록 한다는 것은 이해가 되었습니다.질문 드리겠습니다! dto를 분리할 때, 중복된 코드가 복잡성을 증가시킬 수도 있고 운영 시, 두 dto 간의 변환 과정의 비용이 어느 정도 성능에 영향을 미칠 수 있다고도 생각합니다.2개로 분리하는 방법은 일반적인 설계 패턴은 아니라고 생각되는데, 혹시 현업에서도 자주 사용하는 방식이신지가 궁금합니다. service에서 생성된 response 데이터에 대해서도 controller만의 response dto를 따로 생성할 필요가 있는지 궁금합니다. 클라이언트로 내려주는 응답 객체로 controller 클래스에서 ResponseEntity는 사용하지 않으시는지,주로 현업에서도 강의에서처럼 응답 객체(ApiReponse)를 커스텀해서 내려주는 방식을 선호하시는지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
추상클래스 IntegrationTestSupport을 통한 테스트수행 비용단축에 관한 질문
안녕하세요 강의 테스트 수행도 비용이다. 환경 통합하기 를 듣다가 궁금한 점이 생겨 질문드립니다.강의에서는 추상클래스 IntegrationTestSupport에 어노테이션 @SpringBootTest을 달아서 통합테스트가 필요한 테스트클래스가 상속하여 스프링컨테이너가 반복 실행되는걸 단축하는게 인상깊었는데요.원리가 궁금한 점이 있어 질문드립니다.어떤 원리로 마치 스프링컨테이너가 전파되듯이 상속받은 클래스로 설정한 컨테이너가 작동하는걸까요? 그리고 어떻게 상속받은 클래스가 또 실행될 줄 알고 그 환경(컨테이너)가 어느시점까지 종료되지 않고 지속되고 있는건지 궁금합니다
-
미해결Practical Testing: 실용적인 테스트 가이드
팩토리메서드를 지양하고 생성자 혹은 Builder 패턴을 쓰라는 말씀에 관하여
팩토리메서드를 지양하고 생성자 혹은 Builder 패턴을 쓰라는 말씀에 관한 질문입니다.강의 테스트 환경의 독립성을 보장하자 에 6분대 가량에서 나온 설명입니다. OrderServiceTest.java 에서 createOrderWithNoStock() 메서드입니다하나의 로직을 가지고 있는 팩토리메서드 보다는 생성자 혹은 빌더패턴을 이용하여 다른 로직의 개입으로부터 격리하여 테스트 환경의 독립성을 보장하자라는 말씀으로 이해했는데요하지만 처음 강의를 해주실 때 Builder패턴이 가독성을 방해해서 테스트 코드 안에 팩토리메서드를 만드셨는데요. 이번에는 다시 독립성을 위해 Builder 패턴을 쓰는게 좋다고 하시니 헷갈립니다. 결국 가독성 vs 독립성의 트레이드오프 관계로 이해해야하나요? 아니면 여기서 슬기롭게 풀어나갈 수 있는 방법이 있나요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
yml 프로파일 구분 관련 질문이 있습니다.
강의 잘 보고 있습니다. 감사합니다. 지금 설정해두신 yml 파일을 보면,아무런 프로파일을 지정하지 않으면 local 프로파일을 이용한다고 되어 있고, local 프로파일에는 ddl-auto 설정이 create으로 되어 있습니다.spring: profiles: default: local datasource: url: jdbc:h2:mem:~/cafeKioskApplication driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: none --- spring: config: activate: on-profile: local jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true defer-datasource-initialization: true # (2.5~) Hibernate ??? ?? data.sql ?? h2: console: enabled: true 기본 프로파일에는 ddl-auto 설정이 none으로 되어 있는데, 이 설정은 어떨 때 적용이 되는 건가요?어차피 아무런 프로파일을 지정하지 않으면, local 프로파일대로 ddl-auto 설정은 create을 따라갈텐데 ddl-auto: none을 적어두신 이유가 궁금합니다. 결론은 아무런 프로파일을 지정하지 않았을 때,local 파일의 ddl-auto 속성인 create이 되는지,아니면 default 프로파일로 설정한 ddl-auto: none이 적용이 되는지가 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
환경 통합하기 관련 질문이 있습니다.
WebMvcTest 를 위해 하나의 추상 클래스를 만들고 거기에 필요한 컨트롤러와 모킹한 서비스, 레포지토리들을 추가하셨는데요. 통합 테스트의 관점에서 보면 테스트 컨텍스트가 한번만 뜨기 때문에 좋겠지만 컨트롤러 하나에 대한 단위 테스트를 고려할땐 불필요하게 모킹한 서비스, 레포지토리, 컨트롤러들까지 띄우는데 시간이 더 걸리는데 이건 어떻게 해결 할순 없을까요?강의 해서 제안 하신 것처럼 현업에서 쓰고 있긴 한데 컨트롤러가 100개가 넘어가니... 하나의 컨트롤러 테스트를 위해 테스트 컨텍스트를 띄우는데 걸리는 시간도 상당히 오래 걸리더라구요. 혹시 좋은 방법이 있다면 알려주시면 감사하겠습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
클라우드 환경에서 테스트할 때 디비 사용법이 궁금해요
GitHub Actions을 사용하여 우분투 가상환경 위에서 스프링 부트 프로젝트를 빌드할 일이 있었는데요. 빌드 과정에서 테스트를 실행하는 단계가 있더라구요! application-test.yml에서 사용할 db의 정보를 지정하는 부분에 로컬 호스트 디비를 사용했는데 우분투 가상환경에서 테스트가 수행되다보니로컬호스트 디비와 연결하는 과정에서 커넥션 에러가 뜨더라구요 ㅠㅠ 이런 경우에선 테스트 환경에서 인메모리 디비를 사용해야 하나요..??어떤 방법이 최선인지 궁금해서 질문 남기게 되었습니다!
-
해결됨Practical Testing: 실용적인 테스트 가이드
ActiveProfiles("test")를 대체할 수 있는 다른 방법이 있을까요?
안녕하세요 선생님, 먼저 좋은 강의 감사드립니다. 로컬환경과 테스트 환경을 별도로 관리해주기 위해서, test 프로파일을 사용하는 것은 이해했습니다.그런데, 이렇게 되면 모든 클래스에 ActiveProfiles 를 붙여줘야하니 다소 번거로울 것 같습니다.제가 생각한 방법으로는 SpringBootTest와 ActiveProfiles를 묶는 어노테이션을 별도로 만들고, 만든 어노테이션을 이용해볼 것 같습니다.혹시 ActiveProfiles 를 대체하기 위한 또 다른 방법은 어떤 것들이 있을까요?좋은 강의 감사드립니다 :)
-
해결됨Practical Testing: 실용적인 테스트 가이드
빌더 사용에 대해 질문드립니다!
안녕하세요 선생님. 빌더를 사용하시는 것을 보고 흥미가 동해 질문남깁니다!선생님께서는 예제의 경우 대부분 생성자를 private으로 막아두고 빌더를 통해서만 객체를 생성하시는 것 같습니다.저는 필드 개수가 많아도 public 생성자로 열어두는 편인데, 그 이유는어떤 인자를 전달해야할지 인텔리제이의 힌트로 알아채기도 편하고필드가 null 일 수도 있는 경우 객체를 생성할 때 명시적으로 null 이 보이는게 낫다 라고 생각해서입니다. null을 명시적으로 인자로 전달하는 것이 불편하다면 텔레스코핑을 통해 생성자를 조금 더 만들어두기도 합니다 :)물론 빌더 패턴을 사용하면 이런 코드들이 전부(?) 사라지기는 하지만, 이 외에 빌더로 객체 생성을 강제하는 것에 대한 장점이 있는지 궁금합니다! 또, 선생님만의 빌더랑 생성자 선택 기준이 따로 있을까요? 마지막으로 실무에서도 자주 사용하시는지 궁금합니다. 좋은 강의 감사드립니다 :)
-
해결됨Practical Testing: 실용적인 테스트 가이드
마이바티스와 테스트 코드
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요 강사님 강의 너무 잘 듣고있습니다. 회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다. JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요.. 만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요? 테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..) Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다. 이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?) 회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다.. 좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
-
미해결Practical Testing: 실용적인 테스트 가이드
섹션 7에서 완벽하게 제어하기 파트에서 질문이 있습니다!
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.LocalDateTime. now(), 즉 현재 시간과 관련된 기능의 사용을 지양하자라고 말씀해주셨습니다!이 뜻이 현재시간과 관련된 요구사항이 넘어왔을 때 해당 요구사항을 현재시간과 관련 없이 다른 방법으로 풀어보자 라는 의미일까요?아니면 다른 기술적인 방법을 말씀하시는 걸까요~? 기술적인 방법이 있는 것이라면 어떤 방법이 있을지 궁금합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
Presentation Layer 테스트 (1) 관련 질문이 있습니다!
안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다.강의 36:03 쯔음에서 Product가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product의 최신 번호를 조회하게 되면 "001"이 되는 과정에서 ActiveProfile을 test로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요.그러면 그 전에 진행했던 createProduct 테스트의 given에서 Product를 하나 저장한다면 여기서도 ActiveProfile이 test이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다.제가 놓치고 있는게 무엇일까요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
양방향 매핑
안녕하세요~ 양방향 매핑을 사용하면 엔티티 간의 결합도를 높이기 때문에 가급적 단방향으로 만들면 좋다는 의견도 많은 것 같더라구요.심지어는 양방향 매핑을 만들어야 한다면 엔티티가 아니라 id 값을 넣어서 참조를 하는게 더 좋다는 의견도 있구요. 강의에서는 양방향 매핑을 사용하셨는데 실무에서도 자주 양방향 매핑으로 설계하시나요?사용하신다면 이러한 단점이 있지만 편의성이 더 크기 때문인가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
패키지 구조에 대한 질문
안녕하세요 강의에서는 패키지 구조를 api 아래에 api - service - productapi - controller - product 이렇게 구현하셨는데이렇게 구현하면 도메인이 많아지면 가독성이 떨어질 것 같아서 각 도메인마다 service, controller를 가지게 하는 구조는 어떻게 생각하시나요? api - product - service, controller가독성보다 더 중요한 장점이 있을까요?실무에서는 어떻게 하시는지 궁금합니다. 감사합니다~!
-
해결됨Practical Testing: 실용적인 테스트 가이드
단위테스트의 개념에 대해서 질문 드립니다!
안녕하세요! 테스트 강의가 드문데 정말 친절하게 잘 알려주셔서 감사하게 듣고 있습니다 :)아직 강의를 다 들은 것은 아니지만 강의 내용 중 궁금한 것이 있어 질문 드립니다.제가 테스트를 제대로 공부해본 적이 없어 혼자서 독학을 하며 공부했던 단위테스트는 주로 Mock과 항상 연관지어 설명이 되어 있었습니다. 통합테스트(@SpringBootTest)는 스프링 컨테이너를 띄우고 bean으로 등록된 모든 빈을 가지고 테스트를 하는 것인데 반해, 단위테스트는 해당 계층(Layer)을 테스트할 때 꼭 필요한 bean만 가지고 와서 최소 단위(메서드나 클래스)로 테스트를 진행한다고 저는 알고 있었습니다.그래서 예를 들어 Service 계층 테스트를 진행할 때면 Repository에 관련된 bean들은 Mockito 등을 사용해서 Mock을 만들고 InjectMocks를 해준다는 식으로 저는 공부를 하고 테스트 코드를 작성한 경험이 있습니다.그런데 오늘 강의에서 강사님이 설명해주시는 내용을 듣다보니 @SpringBootTest 와 같은 어노테이션과 상관없이 단위테스트를 진행하시는 것 같다는 인상을 받았습니다. Order에 대한 테스트를 진행하실 때도 단위테스트라는 언급을 하셨고, OrderSerivice에 대한 테스트를 진행하실 때도 @SpringBootTest를 사용하고 있지만 단위테스트를 하신다고 표현을 하시더라구요.혹시 통합테스트와 단위테스트를 구분하는 강사님만의 방법이 있는 것인지 궁금합니다! 장문 글 읽어주셔서 감사합니다!