오류 및 문제점
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. 인기 카드 페이지
useEffect(() => {
axios
.post("/card/topcard", { category })
.then((res) => {
const allData = res.data;
setCardList(allData.map((oneData) => oneData));
})
.catch((err) => console.log("error", err));
}, [category]);
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));
};
참고 자료