본문 바로가기
일기/항해99

거래내역 리팩토링 내역

by 고구밍 2022. 6. 7.

135줄 -> 107줄로 20% 개선

 

거래내역 리팩토링 Before

더보기
@RequiredArgsConstructor
@Service
public class BarterService {
    private final BarterRepository barterRepository;
    private final UserRepository userRepository;
    private final ItemRepository itemRepository;

    // 성훈 - 거래내역서 보기
    public List<BarterResponseDto> showMyBarter(UserDetailsImpl userDetails) {
        User user = userRepository.findById(userDetails.getUserId()).orElseThrow(
                () -> new IllegalArgumentException("유저 정보가 없습니다.")
        );

        Long userId = userDetails.getUserId();
        // (거래 물품리스트들과 거래내역의 Id값)이 포함된 거래내역 리스트를 담을 Dto
        BarterResponseDto totalBarter = null;
        List<BarterResponseDto> totalList = new ArrayList<>();
        // 유저의 거래내역 리스트를 전부 조회한다
        List<Barter> mybarterList = barterRepository.findAllByBuyerIdOrSellerId(userId, userId);
        // 상대방 아이디
        Long opponentId = null;
        // 나의 포지션
        String myPosition = null;

        // 내가 거래한 거래리스트를 대입한다.
        // barterId, buyerId, SellerId를 분리한다.
        for (Barter barters : mybarterList) {
            Long barterId = barters.getId();
            System.out.println("바터아이디 " + barterId);
            LocalDateTime date = barters.getModifiedAt();
            // 거래 물품리스트를 담을 Dto -> 내것과 상대것을 담는다
            List<MyBarterDto> myBarterList = new ArrayList<>();
            List<MyBarterDto> barterList = new ArrayList<>();

            String barter = barters.getBarter();
            //barter 거래내역 id split하기 -> 파싱하여 거래항 물품의 Id값을 찾기
            String[] barterIds = barter.split(";");
            String[] buyerItemIdList = barterIds[0].split(",");
            String[] sellerItemIdList = barterIds[1].split(",");


            // 바이어(유저)의 물품을 찾아서 정보를 넣기
            for (String buyerItemId : buyerItemIdList) {
                Long itemId = Long.parseLong(buyerItemId);
                System.out.println("바이어 아이템 아이디 " + itemId);
                Item buyerItem = itemRepository.findById(itemId).orElseThrow(
                        () -> new IllegalArgumentException("buyerItem not found")
                );

                MyBarterDto buyerItemList = new MyBarterDto(
                        itemId,
                        buyerItem.getTitle(),
                        buyerItem.getItemImg().split(",")[0]
                );

                //바이어가 유저라면
                if (buyerItem.getBag().getUserId().equals(userId)) {
                    myBarterList.add(buyerItemList);
                    // 바이어가 유저이기 때문에, 상대방은 셀러가 된다.
                    opponentId = barters.getSellerId();
                    myPosition = "buyer";
                } else {
                    barterList.add(buyerItemList);
                    opponentId = barters.getSellerId();
                    myPosition = "seller";
                }
                System.out.println("바이어아이템 아이디 :" + buyerItem.getId());
            }

            //셀러(유저)의 물품을 찾아서 정보를 넣기
            for (String sellerItemId : sellerItemIdList) {
                Long itemId = Long.parseLong(sellerItemId);
                Item sellerItem = itemRepository.findById(itemId).orElseThrow(
                        () -> new IllegalArgumentException("sellerItem not found")
                );

                MyBarterDto sellerItemList = new MyBarterDto(
                        itemId,
                        sellerItem.getTitle(),
                        sellerItem.getItemImg().split(",")[0]
                );
                //셀러가 유저라면
                if (sellerItem.getBag().getUserId().equals(userId)) {
                    myBarterList.add(sellerItemList);
                } else {
                    barterList.add(sellerItemList);
                }
            }

            // 상대 유저 정보
            User opponentUser = userRepository.findById(opponentId).orElseThrow(
                    () -> new IllegalArgumentException("유저 정보가 없습니다.")
            );
            System.out.println("유저 네임 :" + opponentUser.getNickname());
            // 거래상태 정보 1 : 신청중 / 2 : 거래중 / 3 : 거래완료 / 4 : 평가완료
            int status = barters.getStatus();



            if (status == 2 || status == 1) {
                BarterNotFinDto barterNotFin = new BarterNotFinDto(
                        barterId,
                        opponentId,
                        opponentUser.getNickname(),
                        opponentUser.getProfile(),
                        status,
                        myPosition,
                        myBarterList,
                        barterList
                );

//                BarterResponseDto barterResponseDto = new BarterResponseDto(
//                        barterNotFin,
//                        barterFin
//                );
                totalBarter.addNotFin(barterNotFin);
                System.out.println("상태 2 야호" + status);
                // 거래완료, 평가완료일 경우
            } else if (status == 3 || status == 4) {
                BarterFinDto barterFin = new BarterFinDto(
                        barterId,
                        opponentId,
                        opponentUser.getNickname(),
                        opponentUser.getProfile(),
                        date,
                        status,
                        myPosition,
                        myBarterList,
                        barterList
                );

//                BarterResponseDto barterResponseDto = new BarterResponseDto(
//                        barterNotFin,
//                        barterFin
//                );
                totalBarter.addFin(barterFin);
                System.out.println("상태 4 야호" + status);
            }
        }
        totalList.add(totalBarter);
        return totalList;
    }
}

 

 

거래내역 리팩토링 After

 

1. 거래내역 

// 성훈 - 거래내역서 보기
@Cacheable(cacheNames = "barterMyInfo", key = "#userDetails.userId")
public List<BarterDto> showMyBarter(UserDetailsImpl userDetails) {
    User user = userRepository.findById(userDetails.getUserId()).orElseThrow(
            () -> new CustomException(NOT_FOUND_USER)
    );

    Long userId = userDetails.getUserId();
    // 유저의 거래내역 리스트를 전부 조회한다
    List<Barter> mybarterList = barterRepository.findAllByBuyerIdOrSellerId(userId, userId);
    // 거래내역 리스트를 담기
    return addTotalList(userId, mybarterList);
}

 

2.  가독성을 위하 매서드화

// 거래내역 리스트를 담기
private List<BarterDto> addTotalList(Long userId, List<Barter> mybarterList) {

    // 나의 거래완료 여부
    Boolean opponentTradeCheck;
    Boolean myScoreCheck;
    Boolean myTradeCheck;
    List<BarterDto> totalList = new ArrayList<>();

    for (Barter barters : mybarterList) {
        Long barterId = barters.getId();
        LocalDateTime date = barters.getModifiedAt();

        String barter = barters.getBarter();
        //barter 거래내역 id split하기 -> 파싱하여 거래항 물품의 Id값을 찾기
        String[] barterIds = barter.split(";");
        String[] buyerItemIdList = barterIds[0].split(",");
        String[] sellerItemIdList = barterIds[1].split(",");


        // 거래상태 정보 1 : 신청중 / 2 : 거래중 / 3 : 거래완료 / 4 : 평가완료
        int status = barters.getStatus();
        Long opponentId;
        String myPosition;
        //내포지션이 바이어라면 거래내역의 상태 확인하기
        if (barters.getBuyerId().equals(userId)) {
            myTradeCheck = barters.getIsBuyerTrade();
            myScoreCheck = barters.getIsBuyerScore();
            opponentTradeCheck = barters.getIsSellerTrade();
            myPosition = "buyer";
            opponentId = barters.getSellerId();
            //내포지션이 셀러라면 거래내역의 상태 확인하기
        } else {
            myTradeCheck = barters.getIsSellerTrade();
            myScoreCheck = barters.getIsSellerScore();
            opponentTradeCheck = barters.getIsBuyerTrade();
            myPosition = "seller";
            opponentId = barters.getBuyerId();
        }
        // 상대 유저 정보
        User opponentUser = userRepository.findById(opponentId).orElseThrow(() -> new CustomException(NOT_FOUND_USER));

        // 거래 물품리스트를 담을 Dto -> 내것과 상대것을 담는다
        List<OpponentBarterDto> myBarterList = new ArrayList<>();
        List<OpponentBarterDto> barterList = new ArrayList<>();
        // 바이어(유저)의 물품을 찾아서 정보를 넣기
        for (String buyerItemId : buyerItemIdList) {
            Long itemId = Long.parseLong(buyerItemId);
            BarterItemListDto buyerItem = itemRepository.findByBarterItems(itemId);
            // 각 아이템의 정보를 리스트에 담기
            OpponentBarterDto buyerItemList = getMyBarterDto(buyerItem);
            //상대와 나의 바터리스트에 각각 아이템을 넣기
            BarterCheckAddList(barters, userId, myBarterList, buyerItemList, barterList);
        }

        //셀러(유저)의 물품을 찾아서 정보를 넣기
        for (String sellerItemId : sellerItemIdList) {
            Long itemId = Long.parseLong(sellerItemId);
            BarterItemListDto sellerItem = itemRepository.findByBarterItems(itemId);
            // 각 아이템의 정보를 리스트에 담기
            OpponentBarterDto sellerItemList = getMyBarterDto(sellerItem);
            //상대와 나의 바터리스트에 각각 아이템을 담기
            BarterCheckAddList(barters, opponentId, myBarterList, sellerItemList, barterList);
        }

        // 성훈 리팩토링 (거래리스트 정보넣기 )
        BarterDto barterFin = new BarterDto(
                barterId,
                opponentId,
                opponentUser.getNickname(),
                opponentUser.getProfile(),
                date,
                status,
                myPosition,
                myTradeCheck,
                myScoreCheck,
                opponentTradeCheck,
                myBarterList,
                barterList
        );
        totalList.add(barterFin);
    }
    return totalList;
}

 

3. 반복되는 코드 매서드화

// 성훈 - 상대와 나의 바터리스트에 각각 아이템 정보를 넣기
private void BarterCheckAddList(Barter barters, Long userId, List<OpponentBarterDto> myBarterList, OpponentBarterDto ItemList, List<OpponentBarterDto> barterList) {
    if (barters.getBuyerId().equals(userId)) {
        myBarterList.add(ItemList);
    } else {
        barterList.add(ItemList);
    }
}

// 성훈 리팩토링 (거래리스트)
private OpponentBarterDto getMyBarterDto(BarterItemListDto Item) {
    return new OpponentBarterDto(
            Item.getItemId(),
            Item.getTitle(),
            Item.getItemImg().split(",")[0],
            Item.getContents()
    );
}

 

4. 생성자에 If 조건을 줘서 date 값을 다르게 기입

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

@Getter
@Builder
@NoArgsConstructor
public class BarterDto {
    private Long barterId;
    private Long userId;
    private String usernickname;
    private String profile;
    private LocalDateTime date;
    private int status;
    private String myPosition;
    private Boolean isTrade;
    private Boolean isScore;
    private Boolean userIsTrade;
    private List<OpponentBarterDto> myItem;
    private List<OpponentBarterDto> barterItem;



    public BarterDto(Long barterId, Long userId, String usernickname, String profile, LocalDateTime date, int status, String myPosition , Boolean isTrade, Boolean isScore, Boolean userIsTrade , List<OpponentBarterDto> myItem, List<OpponentBarterDto> barterItem) {

        this.barterId = barterId;
        this.userId = userId;
        this.usernickname = usernickname;
        this.profile = profile;
        if (status == 2 || status == 1){
            this.date = null;
        } else{
            this.date = date;
        }
        this.status = status;
        this.myPosition = myPosition;
        this.isTrade = isTrade;
        this.isScore = isScore;
        this.userIsTrade = userIsTrade;
        this.myItem = myItem;
        this.barterItem = barterItem;
    }
}