[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
안녕하세요 코드팩토리님!! Transaction 파트에서 궁금한게 있어서 질문 드립니다. Transaction 적용후 테스트로 에러 발생해 보니 정상적으로 포스트가 생성되지는 않습니다. 그런데 이후 정상적으로 포스트를 한개 생성하니 이전 마지막 포스트가 10이었으면 이번에는 12번으로 생성됩니다. 에러 발생후 포스트는 생성되지 않지만 id 값은 증가하는데 정상적인 현상인가요?? 참고로 에러는 코드팩토리님 처럼 중간에 throw new InternalServerErrorException()을 넣고 저장하면 밑에 코드가 전부 지워져서그냥 images[]에 이미지 넣을때 알파벳 몇개 지워서 일부로 에러 발생하는 방식으로 에러 테스트 했습니다.
안녕하세요, 저는 Spring에서 Nest로 넘어온 네린이입니다. 스프링에서는 통합테스트 작성시에도 데이터베이스에 데이터가 삽입되거나 업데이트 되지않도록 롤백시키는 방법이 존재하는데 Nest에서는 어떻게 해야하나요? 제가 생각하는 방법은 직접 쿼리러너를 통해 afterEach를 통해서 매번테스트후에 롤백을 시키는방법을 생각했습니다.
안녕하세요 강사님 강의를 보고 토이 프로젝트에서 주문 시 재고 감소 및 메뉴 주문량 증가 로직에서 낙관적락 기법을 적용해 보았는데요, 강의에서 해주신 내용 그대로 파사드 패턴 까지 적용을 해보면서 시도했는데 무한 루프가 돌았습니다. hikariCP pool을 40으로 설정해주니 그제서야 해결이 되었는데요, 강의에선 네임드락에서 커넥션풀을 지정해주었는데요 저는 낙관적락인데도 해당 설정을 해서 해결된 이유가 있을까요? @Service @RequiredArgsConstructor public class OrderService { @Transactional public Order orderWithOptimisticLock(Long memberId, LocalDateTime now) { Cart cart = cartRepository.findByMember(memberId); List<CartItem> cartItems = cart.getCartItems(); cartItems.stream() .map(CartItem::getMenu) .forEach(menu -> { decreaseStockWithOptimisticLock(menu.getId(), 1); increaseMenuOrderCountWithOptimisticLock(menu.getId(), 1); }); Money money = calculator.calculateMenus(cart.getMember(), cart.convertToMenus()); Order order = Order.createOrder(cart, money, now); return orderRepository.save(order); } public void decreaseStockWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.decrease(quantity); } public void increaseMenuOrderCountWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.increaseOrderCount(quantity); } } ``` @Component @RequiredArgsConstructor public class OptimisticLockStockFacade { private final OrderService orderService; public Order order(Long memberId, LocalDateTime localDateTime) throws InterruptedException { while (true) { try { return orderService.orderWithOptimisticLock(memberId, localDateTime); } catch (Exception e) { Thread.sleep(50); } } } } ``` public interface JpaMenuRepository extends JpaRepository<Menu, Long> { @NotNull @Lock(LockModeType.OPTIMISTIC) @Query("select m from Menu m where m.id = :id") Optional<Menu> findByIdForOptimisticLock(@NotNull @Param("id") Long id); }
[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
코팩님 강의 잘보고있습니다. :) 'DefaultValuePipe 사용해보기'라는 강의에서 궁금한 것이 있어서 질문드립니다. new와 그냥 클래스는 제가 이해한 바로는 그냥 클래스처럼 넣게 되면 DI를 통한 nest에서 싱글톤 패턴으로 ParseIntPipe를 주입해주는 것이고 new키워드를 붙이게 되면 인스턴스가 생성하게 됨으로 nest에서 DI로 주입해주는 것이 아닌 ParseIntPipe클래스의 인스턴스가 생성되는 방식인가요? 감사합니다.
[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
RBAC까지 다뤄주시다니 정말 흥미로운 내용이었습니다! 다만 현재 로직상으로는 RefreshTokenGuard이 적용된 Access 토큰 갱신, Refresh 토큰 갱신 API에 IsPublic을 적용하면 RefreshTokenGuard도 미적용되지 않나요? 실제 저 API들을 Access Token으로 호출해보면 Guard가 아니라 Service 단에서 Exception이 발생하는 것 같더라구요.
왼쪽은 엣지 inprivate, 오른쪽은 크롬 시크릿 모드 브라우저입니다. 서로의 채팅 입력 시간이 9시간 전으로 표시되고 있습니다. 실제로 서버의 createdAt은 한국 표준시라고는 되어있지만 실제 시간보다 9시간 느린 시간이 저장되었고 entities/channelChats.ts의 설정 내용은 강사님의 깃헙 내용과 동일했습니다. aws - rds에서 확인해본 DB도 지역이 ap-northeast-2a, 서울로 잘 지정되어 있었습니다. 혹시 작업 중에 이런 경우 보신 적 있으신가요? 어디를 더 살펴봐야 서버에 제대로 된 현재 시간이 저장될 수 있을지 조언 부탁드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 스프링 데이터 JPA 가 지원하는 save를 호출하면 flush()가 나가는건가요 아니면 save를 하고 bulkAgePlus()를 호출하면서 bulkAgePlus() 에 있는 JQPL이 실행되서 flush() 가 나가는건가요 ? bulkAgePlus()를 실행하면 JPQL 실행이되고, JPQL 이 실행이 되면 flush() 가 호출이 되는데 이때 SQL쿼리문이 DB에 전송이대서 DB에는 업데이트가 되어있지만 영속성 컨텍스트는 업데이트가 안되기 때문에 clear()를 해주는게 맞는건가요 ?
[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
영상에서는 단순히 포스트 컨트롤러에서 @UseGuards(AccessTokenGuard)를 추가한 후 잘 작동하는 것 같은데 저는 디펜던시 에러가 나타나네요.. ERROR [ExceptionHandler] Nest can't resolve dependencies of the RefreshTokenGuard (?, UsersService). Please make sure that the argument AuthService at index [0] is available in the PostsModule context. 디펜던시 에러 해결하는 강의를 다시 보고 포스트 모듈에서 필요한 부분들을 추가하여 해결은 했습니다. AuthService, UsersService와 JwtModule.register({}), UsersModel까지 추가해주니까 영상처럼 토큰을 보내줬을 때 포스트 기능이 잘 작동합니다.. 궁금한 것은 영상에서는 포스트 모듈에 별다른 수정 없이 단순히 포스트 컨트롤러에서 @UseGuards만 추가해도 잘 작동하는 것 같은데.. 저는 왜 포스트 모듈에서 필요한 부분을 추가해 주어야 했는지 모르겠네요.. 제가 놓친 부분이 있었을까요..? 감사합니다.
tcp통신을 이용해서 마이크로 서비스를 만들고 있습니다. 마이크로 서비스는 3000번으로 포트를 켜놨고, 게이트웨이의 포트는 4000번으로 실행을 하게끔 해놨습니다. 제가 우선 테스트를 위해서 user의 레포지토리에서 데이터를 전체 긁어오게끔 간단한 로직을 짜놨는데요. // 게이트웨이 컨트롤러 @Get("/users") @UseGuards() async GetUsers() { return this.organizationService.getUsers(); } // 게이트웨이 서비스 getUsers() { return this.clients.send("get:getUsers", {}); } // 마이크로 서비스 @MessagePattern({ cmd: "get:getUsers" }) async getUsers() { console.log("걸림"); return pipe( await this.userRepository.find({ relations: [ /* 관계 설정 */], }), (users) => ({ success: true, users: { users: users.map((user) => ( // 유저 정보들 ), }, }), ); } localhost:3000/api/users 경로로 요청 결과는 500에러가 나오고 콘솔에는 [Nest] 3096 - 2023. 11. 16. 오후 2:45:20 ERROR [ExceptionsHandler] There is no matching message handler defined in the remote service. 이렇게 메시지 핸들러가 일치하지 않다는데 대체 뭐가 잘못된건지를 모르겠습니다. 메시지 패턴 이름도 같게 해놨는데 말이죠.