[프로젝트] 웹 TripRecorder - day14

_bean_·2023년 6월 21일
0
post-thumbnail

오류 및 문제점

1. attempted to assign id from null one-to-one property

  • 문제점: 양방향 관계 저장 시 entity를 설정하지 않았다.
  • 해결 방안: profile.setUser(), user.getProfile()로 양방향 entity를 모두 설정한다.
profile.setUser(user);
user.setProfile(profile);

2. A different object with the same identifier value was already

  • 문제점: entity 수정 시 영속성이 다르다.
  • 해결 방안: 새로운 객체를 생성하지 않고 원래의 객체를 얻어 수정할 속성만 변경한다.
UserVO user = urepo.findById(userNo).orElse(null);
user.setUserNick(tmpUser.getUserNick());
user.setUserName(tmpUser.getUserName());
user.setProfile(profile);

urepo.save(user);

3. useEffect get 요청 시 axios 에러

  • 문제점: get 요청에는 request body가 존재하지 않아 request body를 보내면 axios 에러가 발생한다.
  • 해결 방안: request body가 필요한 api를 post 요청으로 수정한다.

진행 상황

1. 내 정보 수정 시 중복체크

@PostMapping(value = "/signup/usernickCheck")
public boolean postUsernickCheck(HttpServletRequest request, @RequestBody UserVO user) {
	String obj = request.getHeader("Authorization");
	UserVO findUser = null;
	boolean result = true;
	String userNick = user.getUserNick();
		
	if(!userNick.equals("")) {
		if(obj != null) {
			Long userNo = EncodingUtil.getUserNo(request);
			findUser = urepo.findByUserNickAndUserNoNot(userNick, userNo);
		} else {
			findUser = urepo.findByUserNick(userNick);	
		}
			
		result = findUser != null;
	}		
		
	return result;
}

2. 경비 삭제

@DeleteMapping("/delete/{expNo}")
public String deleteExp(@PathVariable Long expNo) {
   	erepo.deleteById(expNo);
   	return "OK";
}

3. 게시글 삭제

  • S3 내 게시글 이미지 함께 삭제
  • 연결된 경비가 있으면 null처리
  • 댓글, 좋아요, 해시태그 -> cascade all이기 때문에 함께 삭제
@DeleteMapping("/delete/{snsNo}")
public String deleteSns(@PathVariable Long snsNo) {
	SnsVO sns = srepo.findById(snsNo).orElse(null);
		
	ExpVO exp = sns.getExp();
	if(exp != null) {
		exp.setSns(null);
	}
		
	String[] images = sns.getSnsPhoto().split("@");
	AwsUtil.deleteBucketObjects(images);
	srepo.delete(sns);
		
	return "OK";
}

4. 여행 카테고리 삭제

  • 카테고리에 해당하는 경비, 게시글 함께 삭제
  • 게시글, 경비 연결을 처리하기 위헤 경비 먼저 삭제
  • S3 내 게시글 이미지 함께 삭제
@DeleteMapping("/delete/{tripNo}")
public String deleteTrip(@PathVariable Long tripNo) {
	TripVO trip = trepo.findById(tripNo).orElse(null);
	List<ExpVO> expList = trip.getExp();
	List<SnsVO> snsList = trip.getSns();
		
	expList.forEach(exp -> erepo.delete(exp));
	snsList.forEach(sns -> {
		String[] images = sns.getSnsPhoto().split("@");
		AwsUtil.deleteBucketObjects(images);
			
		srepo.delete(sns);
	});
		
	trepo.delete(trip);
		
	return "OK";
}

5. 인기 카드 페이지

// 인기 카드 3개 가져오기: category가 변경될 때마다 실행
useEffect(() => {
  axios
    .post("/card/topcard", { category })
    .then((res) => {
      const allData = res.data;
      setCardList(allData.map((oneData) => oneData));
    })
    .catch((err) => console.log("error", err));
}, [category]);

// 카테고리 선택하면 setCategory, 혜택 초기화
const selectCategory = (item) => {
  setCategory(item.key);
  setBenefitList([]);
};

// 혜택 조회 버튼 눌렀을 때
const benefits = (value) => {
  const price = value.cost;
  const cardNo = cardList.map((card) => card.cardNo);

  axios
    .post("/card/carddiscount", { price, cardNo, category })
    .then((res) => {
      setBenefitList(res.data.map((data) => data));
    })
    .catch((err) => console.log("error", err));
};

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글