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;
}
}
'일기 > 항해99' 카테고리의 다른 글
[항해 99 6기] 항해99 수료! (0) | 2022.06.10 |
---|---|
[행해99 6기] 수료식 - 최고의 프로젝트 상 (0) | 2022.06.10 |
이력서를 작성해보자 - 1 (0) | 2022.06.07 |
[항해 99 6기] 이력서를 작성 시작 (0) | 2022.06.05 |
[항해 99 6기] 최종 발표회를 마치며 (0) | 2022.06.03 |