내일배움캠프 Spring 47일차(목) TIL

Skadi·2024년 3월 4일
0

스프링 심화

아웃소싱 및 백오피스 프로젝트 후기(코드 리뷰)

1. 내가 맡았던 장바구니파트에 수정할 코드가 있었다.

public ResponseEntity<CartItemResponse> cartItemAdd(
        Long menuId, int count, User user) {

        // 메뉴 검증 로직
        Menu menu = menuRepository.findById(menuId).orElseThrow(
            NotFoundMenuException::new
        );

        // 동일한 메뉴와 동일한 사용자가 있는지 확인
        CartItem existingCartItem = cartItemRepository.findByUserAndMenuAndOrderIdIsNull(user,
            menu);

        List<CartItem> cartItems = cartItemRepository.findAllByUser_idAndOrderIdIsNull(user.getId());
        Long restaurantId = menu.getRestaurant().getRestaurantId();
        for (CartItem cartItem : cartItems) {
            if (cartItem.getMenu().getRestaurant().getRestaurantId() != restaurantId){
                throw new NotMatchRestaurantException();
            }
        }

        if (existingCartItem != null) {

            existingCartItem.updateCartItemQuantityAndTotalPrice(count);
            cartItemRepository.save(existingCartItem);
        } else {
            CartItem saveCartItem = CartItem.builder()
                .totalPrice((int) (menu.getMenuPrice() * count))
                .count(count)
                // menuId와 userId가 추가로 들어가야 함
                .user(user)
                .menu(menu)
                .build();

            cartItemRepository.save(saveCartItem);
        }

        return new ResponseEntity<>(new CartItemResponse("장바구니에 해당 상품이 추가되었습니다"), HttpStatus.OK);

    }
  • 해당 코드는 Service부분의 코드로 장바구니에 메뉴를 담는 로직이다.
    하지만 하나의 메소드가 너무 여러가지의 기능을 담고 있다는 지적을 받았다.
    - 1. 메뉴 검증 로직
    - 2. 동일한 메뉴와 동일한 사용자가 존재하는 지 확인 로직
    - 3. 장바구니에 담겨져 있는 가게와 다른 가게가 들어왔을 경우 예외처리 로직
    - 4. 장바구니에 담는 로직
    이렇게 4가지 로직을 각각 메소드로 분리해서 코드를 작성해야 테스트도 편하다는 조언을 받았다.
    또한 Service 부분에서 ResponseEntity를 반환하는 것은 좋지 않고 ResponseDto를 Controller에 반환하고 Controller에서 해당 Dto를 ResponseEntity에 담아서 반환하도록 조언을 받았다.
  1. 프론트엔드와 @RestController를 사용하여 통신 중일 경우에 UserRole을 통한 관리자 페이지 접근 통제

    1. WebSecurityConfig에서 아래 코드를 통해서 권한이 ADMIN인 경우에만 /mainpage.html을 허용이라 생각해서 작성하였지만 실패
    .requestMatchers("/mainpage.html").hasRole("ADMIN")
    1. @Secured를 사용하여 권한이 ADMIN일 경우에만 허용

      • 좋은 접근이지만 @Controller를 사용하여 직접 페이지를 반환중인 것이 아닌 페이지 이동을 프론트에서 하고 있어서 실패(@RestController를 사용 중)
    2. 백엔드 반환 값을 지정하여 UserEnumRole을 반환하여 반환 결과에 따라 프론트에서 페이지 제공

      • 해당 방법을 사용
      • 백엔드 개발자 입장이어서 백엔드에서 모두 해결하려 한 부분이 오히려 어렵게 만듬
    3. 기타 추천방법

      • 직접 어노테이션을 만들어서 해결하는 방법이 있다고 알려주셨는데 아직 너무 어려워서 이해하지 못했다. 다음에 꼭 찾아보기

0개의 댓글