서비스 테스트 시 Repository 상속해서 FakeRepository를 생성자 주입을 통해 진행한다는 내용에 대해서는 이해하고 실습해 보았습니다. 그런데 만약 Repository 메서드 중 JPA의 on 절을 이용한 join을 사용해 데이터를 가져오는 경우 FakeRepository의 내부 구현이 궁금합니다 내부에 Id와 List를 통해 해당 엔티티에 대한 정보를 저장할 수 있지만, Join을 하는 경우 외부 테이블의 정보가 필요하기 때문에 이를 Fake하고 싶을 때는 어떻게 해결할 수 있는지 알려주시면 감사하겠습니다.
테스트의 질문과는 좀 벗어나는 질문입니다만.. 궁금해서 여쭤보게 되었습니다! 간단한 프로젝트를 구성하는 과정에서 Beverage라는 인터페이스를 만들어 추상화를 진행하고 해당 인터페이스는 get의 행위만 가지고 있었습니다. 그리고 추가된 라떼와 아메리카노 둘 다 같은 속성이지만 구현을 통해서 두 개의 구성 클래스를 만들어 예제를 진행하였는데요. 이에 다음과 같은 의문점이 생겼습니다. 인터페이스가 get이라는 행위만 가져도 사용해도 괜찮은지. 지금과 같은 상황에서는 확장에서의 의미로 추상 클래스가 더 괜찮을 것 같은데 사용하지 않은 이유가 있으신지 궁금합니다ㅎㅎ 좋은 강의 제공해주셔서 감사합니다~
post 요청시 헤더 관련 아래 에러 발생하는데, apollo-require-preflight: true등을 넣으면 정상 작동 하네요. 혹시 이 에러가 강의 중에는 안 나던데, 이유 알 수 있을까요? { "errors": [ { "message": "This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight\n", "extensions": { "code": "BAD_REQUEST", "stacktrace": [ "BadRequestError: This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight", "", " at new GraphQLErrorWithCode (/Users/hojeongpark/Develop/study/backend-bootcamp/class/section13/13-01-single-image-upload/node_modules/@apollo/server/src/internalErrorClasses.ts:15:5)", " at new BadRequestError (/Users/hojeongpark/Develop/study/backend-bootcamp/class/section13/13-01-single-image-upload/node_modules/@apollo/server/src/internalErrorClasses.ts:116:5)", " at preventCsrf (/Users/hojeongpark/Develop/study/backend-bootcamp/class/section13/13-01-single-image-upload/node_modules/@apollo/server/src/preventCsrf.ts:91:9)", " at ApolloServer.executeHTTPGraphQLRequest (/Users/hojeongpark/Develop/study/backend-bootcamp/class/section13/13-01-single-image-upload/node_modules/@apollo/server/src/ApolloServer.ts:1047:20)", " at processTicksAndRejections (node:internal/process/task_queues:95:5)" ] } } ] }
안녕하세요, 우빈님 너무 좋은 강의를 올려주셔서 잘 듣고 있습니다! Repository 구현 시 @Repository 어노테이션을 붙이는 이유가 궁금합니다. 스프링 데이터 JPA를 사용할 경우 스프링이 만들어서 제공하는 컴포넌트를 사용해서 @Repository 를 생략해도 되는 거로 알고 있는데, 사용하시는 이유가 따로 있는지 궁금합니다.
JPQL를 데이터를 조회하면, DB에 먼저 조회한 후, 영속성 컨텍스트에 이미 동일한 엔티티가 있으면, DB에서 조회한 데이터를 버리고, 이미 있는 엔티티를 반환한다고 알고 있습니다. 만약, 기존 엔티티를 새로 검색한 엔티티로 대체한다면, 영속성 컨텍스트에 수정 중인 데이터가 사라질 수 있어, 위험하다고 하는데, 그러면, 조회시 수정 중인 데이터가 조회되어서, 의도치 않는 데이터가 조회될 수 있지 않나요? 오히려 수정 중인 데이터 대신 새로 조회한 데이터로 대체하는게 좋지 않을까 싶은데, 혹시, DB에서 조회한 데이터를 버리고, 이미 있는 엔티티를 반환하는게 더 장점인 구체적인 예시가 있을까요?
안녕하세요 import.service.ts의 checkPaid 메서드 부분입니다. axios와 http 예외를 통합하기 위해서 다음처럼 작성하였는데 옵셔널 체이닝부분 관련 질문이 있습니다. throw new HttpException( error.response.data?.message || error.response.message, error.response.status || error.response.statusCode, ); 옵셔널 체이닝이 data가 있는지 여부를 보고 있으면 다음을 보내고 error.response.data.message 없으면 다음을 보내는데 error.response.message 다음처럼 옵셔널 체이닝 없이 작성한다면 오류가 발생하나요? throw new HttpException( error.response.data.message || error.response.message, error.response.status || error.response.statusCode, );
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. [공지] 제가 9/27 ~ 10/9 약 2주간 해외 여행을 가게 되어, 해당 기간 동안은 질문에 대한 답변이 불가합니다. 🥲 질문을 남겨주시면 10/10 이후로 순차적으로 확인하고 빠르게 답변드릴 수 있도록 하겠습니다. 너른 양해 부탁드리며, 강의를 수강해주시는 분들 모두 항상 감사드리고, 또 응원합니다. 🙌🏻 다시 코드를 보니 헷갈리는게 있어서 질문 드립니다! OrderService에서 createOrder를 할때 내부적으로 중간 매핑 엔티티인 OrderProduct가 생기는 이유가 Order엔티티에 있는 create메서드를 호출 빌더로 Order객체를 생성할때 orderProducts리스트 초기화 orderProducts는 casecade = CasecadeType.ALL이 되어있으므로 2번 과정으로 인하여 객체가 생성되고 db에 저장 이 맞을까요? 감사합니다!
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. [공지] 제가 9/27 ~ 10/9 약 2주간 해외 여행을 가게 되어, 해당 기간 동안은 질문에 대한 답변이 불가합니다. 🥲 질문을 남겨주시면 10/10 이후로 순차적으로 확인하고 빠르게 답변드릴 수 있도록 하겠습니다. 너른 양해 부탁드리며, 강의를 수강해주시는 분들 모두 항상 감사드리고, 또 응원합니다. 🙌🏻 안녕하세요 우빈님! 강의 수강 중 궁금한 점이 생겨서 질문드립니다! 지금까지 작성한 테스트들은 Production Code가 제대로 동작하기 위해서 ~~했을때 이러한 결과가 나와야한다! 식의 검증을 제대로 한다는 느낌을 받았습니다. 그래서 후에 코드를 수정하고 테스트를 다시 돌려보며 로직이 제대로 실행하는지를 검증하며 테스트의 이점을 잘 활용할 수 있겠다라고 생각하였습니다. 하지만 Mock에 대해 학습을 하면서는 이 테스트가 효과적인 테스트인가? 하는 의문이 조금씩 들기 시작하였습니다. 물론 지난 시간 학습하였던 OrderStatisticsService 의 경우 테스트의 주된 목적은 총 금액 확인이었으므로 sendEmail 메서드의 Stubbing은 왜 하는지 이해하였습니다. 이번 강의를 들으면서 몇가지 의문점이 생겼는데 다음과 같습니다! sendEmail을 Stubbing하면 당연히 반환되는 값은 Ture 일 것 Mock객체의 defaultAnswer에 의해서 mailSendHistoryRepository.save ()의 반환값이 null이어도 테스트가 성공함 로직을 원하는대로 수행하기 위해 메서드가 몇번 호출되는지 검증을 할 필요가 있는가? 전체적으로 Stubbing을 얼마나 잘하는지에 대한 테스트를 한다는 느낌을 받았습니다! 혹시 기능에 대한 사용법을 알려주시려고 한것인지 아니면 실무에서도 이러한 테스트를 작성하는지, 작성한다면 verify()를 사용할때 메서드 호출횟수를 검증하여 얻고자 하는것은 무엇인지, 그리고 모든 메서드를 Sutbbing하게 되면 해당 코드에서 무엇을 검증하는것인지 궁금합니다! 감사합니다!
안녕하세요! 강의영상에서는 가능한 많은 예제를 보여주려고 다양한 연관관계 매핑을 사용했다고 하셨는데 단방향을 지향하는 실무 관점에서 궁금한게 있습니다. Order N:1 Member => 다대일 단방향이 가능한지 OrderItem N:1 Order => 다대일 단방향이 가능한지 Order와 Delivery 관계에서 단방향이 안되는 이유 Item과 Category를 일대다, 다대일로 풀어내는게 맞는지 답변해주시면 감사하겠습니다!!
안녕하십니까! 항상 좋은 강의 감사드립니다. ApiResponse에 HttpStatus를 필드로 두어, 응답 상황에 따라 적절한 HttpStatus를 설정하도록 강의에서 의도해주셨습니다. 실제로 저도 이런식으로 사용하고 있었는데요, 그런데 이번에 테스트 하면서 알게 된 것이지만, ApiResponse에 HttpStatus를 넣어준다고 하더라도 실제 응답 HTTP의 status에는 반영이 되지 않고, 단순히 응답 body에만 설정한 status가 쓰여졌습니다. 아래 첨부한 사진을 보면 201로 setting 하였지만, 실제 응답은 200 인걸 예로 확인할 수 있었습니다. 그래서 제가 질문 드리고 싶은 부분은, "그렇다면 응답을 어떻게 해야 하는가?" 입니다. ApiResponse라는 공통 응답을 한번 더 ResponseEntity<> 안에 감싸서 보내는 방법 을 생각해 볼 수 있을 것 같습니다. 단 이방식은 ApiResponse의 status를 ResponseEntity의 status로 동기화 시켜주는 작업 과, 그리고 응답 타입도 ResponseEntity<ApiResponse<>> 이런식으로 depth가 2번 생기게 되는 단점이 있을 것 같습니다. (depth가 2번 생긴다는게 올바른 표현인지는 모르겠으나, 서비스 응답을 ApiResponse로 한번 감쌌는데, 이를 한번 더 ResponseEntity로 감싼 것을 2번의 depth로 표현하였습니다.) 두 번째로는 오직 응답 바디에 있는 값 만을 사용하기로 프론트와 규약을 정하고 사용하는 방법 이 있을 것 같습니다. 이렇게 하면 굳이 한번 더 ResponseEntity<>로 감쌀 수고는 덜어질 것 같습니다. 제가 생각한 방식은 이렇게 두가지가 있을 것 같고, 제가 속한 회사에서 기존 방식은 2번째 방식을 사용 하고 있었습니다. 그런데 , 저는 신규 프로젝트에 투입되어 있는 상황 이여서 코드를 제가 원하는 대로? 짤 수 있는 상황 인데요,, 그래서 위 두가지 방식중에 어떤것이 좋을지, 혹은 더 나은 방식이 있을지 질문 드리고 싶습니다. 제가 3개월 차라 .. 경험이 많이 부족해서,, 강사님 경험에 기반하여 답변해주시면 정말 감사하겠습니다.