프로젝트

[SpringBoot & JPA 프로젝트] 아쉬운점 & 보완할점

sian han 2022. 10. 5. 16:58

※ 프로젝트 후기

 

제작기간을 한달정도로 예상하고 시작한 프로젝트였으나 약 두달이 걸려서 완성되었다.

JPA 를 배우면서 엔티티 설계를 해서 초반에 시간이 많이 소요되었고,

실제 서비스를 운영하기 위해서 서버에 배포하는데 생각보다 많은 리소스가 필요해서

마무리짓는데 시간이 더 오래 걸렸다.

 

프로젝트를 진행하면서 가장 많이 든 생각은 '이대로 끝내고싶다' 와 '끝까지 해내고싶다' 였다.

해결이 안되는 문제를 붙잡고 2~3일씩 지낸것도 여러번이다.

이럴때면 그냥 도망치고싶었지만 .. 어쩌겠는가 해내야한다.

그렇지만 .. 내 좋은대로 개발하는게 이렇게나 재밌구나 !

즐거운 시간이었다.

 

실운영을 할 서비스이기 때문에 보완할 점이 끊임없이 보이고 매일 조금씩 수정해나가는 중이다.

현재 카드사 심사를 기다리고 있고(2주 소요된다 함), 이것만 마치면 바로 홍보하고 사용자를 모집할 계획이다. 

사용자들에게 많은 피드백을 받고 보완하며 배울 수 있길 바란다.

 

 

 

 

 

 

 

※ 아쉬운 점

 

1. Address 의 엔티티 설계

 

사용자가 주소 정보를 변경하면

해당 사용자의 주문정보에서 주소가 함께 변경된다.

 

A주소를 갖고있던 사용자가 A주소로 상품이 배송되길 바라며 주문을 한 후

B주소로 변경하면 주문정보도 함께 수정되기때문에 상품은 B주소로 배송될 위험이 있다.

 

이런 경우는 극히 드물거고,

주문건이 발생하는 즉시 내가 직접 확인할예정이라서

수정하지 않고 아쉬운점으로 남기기로 했다.

 

User - Address 사이의 관계만 생각하고 Address - Order 관계를

고려하지 못했던 프로젝트 초반 나의 엔티티 오설계다.

 

흠 .. 다시 곱씹어보니 .. Order에 주소 정보 멤버변수만 .. 추가하믄 되는것아녀 ? 

이건 둘이 연관관계로 맺어지면 안되는거잖아 .. !

아이고 보완하면되겠다

 

 

 

 

 

 

2. Item 과 Order 의 엔티티 설계

 

Order 와 OrderItem 이 OneToMany 양방향 매핑이되어있고,

OrderItem 과 Item이 ManyToOne 단방향 매핑이 되어있다.

 

Order 와 Item 은 직접적으로 연결되어있지 않다.

 

단일 상품을 판매하는 뜨개장터의 특성상

1개의 상품(Item) 은 1번만 주문(Order) 이 가능하다

따라서 해당 상품이 판매되었을 시 어떤 주문건인지 확인을 해야하는데, 

엔티티 설계가 미흡하여 직관적으로 확인이 어렵다.

 

판매자가 내상품 탭을 들어갔을 때 판매완료된 상품은

아래와 같이 Order_Id를 value로 가진 버튼이 함께 조회되어야한다 ( 상품 배송을 위해 주문정보를 조회하는 버튼 ) 

 

 

Item 과 Order은 직접적으로 연결되어있지 않기때문에 

Item 정보만으로 Order 테이블에서 Order_id 를 찾을 수 없었다.

 

아래의 코드로 이를 해결했다

@Transactional
    public List<ItemResponseDto> getMyItemList(Long sellerId) {
        List<Item> itemLists = itemRepository.findBySeller_Id(sellerId);
        List<ItemResponseDto> itemResponseDtoList = new ArrayList<>();
        List<OrderItem> orderItemList = orderItemRepository.findOrderItemByOrder_OrderStatusAndItem_Seller_Id(OrderStatus.ORDER, sellerId);
        
        for (Item item : itemLists) {
            ItemResponseDto itemResponseDto = ItemResponseDto.builder()
                    .id(item.getId())
                    .itemName(item.getItemName())
                    .price(item.getPrice())
                    .regTime(item.getRegTime())
                    .sellStatus(item.getSellStatus())
                    .orginFileName(item.getFile().getOrginFileName())
                    .build();

            for(OrderItem orderItem : orderItemList){
                if(Objects.equals(orderItem.getItem().getId(), item.getId())){
                    itemResponseDto.setOrderId(orderItem.getOrder().getId());
                }
            }
            itemResponseDtoList.add(itemResponseDto);
        }
        return itemResponseDtoList;
    }

 

OrderItem 테이블에서 해당 Seller 의 상품 중 판매완료가 된것만 OrderItemList 에 넣는다

(OrderItem 객체는 Order정보를 담고있다)

 

그리고 Item 에서 해당 Seller 의 상품만을 itemList에 넣는다

 

그리고 OrderItemList 의 Item_id 와 ItemList 의 Item_id 를 조회하여 일치한다면

responsedto 에 Order_id 를 넣어주는 것이다.

이제 ItemDto 는 Order 정보를 갖게 되었다.

 

이 역시 뜨개장터는 1상품 1주문 특성이 있어 가능한 로직이다.

Item 에서 Order 로 OneToMany 단방향 매핑을 넣었으면 이렇게 복잡하게 해결하지 않았을것이다.

 

중간에 엔티티 설계를 수정할수도있었겠지만

어디서 어떤 문제로 야기될지 몰라 최대한 엔티티를 수정하지않는 방법으로 해결했다.

 

 

 

 

 

 

보완할 점

  • ✅https 적용하여 보안강화
  • ✅판매자가 주문정보를 확인할 수 있는 view 추가
  • ✅판매자 계좌번호 설정 할 수 있게 수정
  • 상품사진이 정방형만 업로드 될 수 있도록 수정
  • index 상품 정렬
  • 로컬에서는 정상작동하나 배포 후 에러 페이지 작동 안됨
  • ✅상품이 구매되면 다른 사람들의 장바구니에서 해당 상품이 삭제되도록 수정
  • 주문건 발생시 관리자 & 판매자에게 알람 갈 수 있도록 설정
  • 주문정보에서 주문한 당시의 사용자 주소를 확인 할 수 있도록 수정
  • CloudWatch 로그 조회 설정