우리 팀의 공식 개발 일정은 화~토 사이이다.
따라서 쉬는 날 한 작업들은 화요일 회고에 같이 기록한다!
( 하지만 스크럼은 매일 진행했고 작업도 매일 했다...👍)
📖 2022년 5월 03일
✔️ 오늘 내가 한 일
- 좋아요 기능 수정, 좋아요 스키마 수정
- Board + Comment 전체 리팩토링
- Board 이미지 수정
- Board 조회수 구현중
- MBTI data 자료조사
- 리팩토링 (로그인, 회원가입 → user MVP로 합치기)
- 회원 탈퇴 구현
- 탈퇴 시 유저가 작성한 게시글, 댓글은 writer 필드값 => null. 좋아요는 유지
- 그래서 프론트에서 null값일 때 '집나간 칵테일' 등 임의로 이름 랜더링
💡 TIL ( Today I Learned )
1) 데이터베이스 트랜잭션
트랜잭션은 작업의 완전성 을 보장해주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.
👉 출처
좋아요를 count 할 때 중복되는 값은 처리를 하지 않기 위해서 알게된 개념이다.
데이터베이스에서 트랜잭션은 중요한 개념임으로 따로 추가적으로 공부해서 포스팅을 남겨야겠다!
static addLike = async ({ giveUserId, getCocktailId }) => {
try {
const session = await db.startSession();
session.startTransaction();
const name = await CocktailModel.findById({ getCocktailId });
const newLike = await LikeModel.addLike({
name: name.name,
giveUserId,
getCocktailId,
});
await CocktailModel.likeCocktail({ getCocktailId });
await session.commitTransaction();
return newLike;
}
catch (e) {
await session.abortTransaction();
const errorMessage =
"좋아요를 생성하는 데 실패했습니다.";
return { errorMessage };
} finally {
session.endSession();
}
};
알지 못했던 개념이라 우리 팀원분께 많이 배우고 있다. 🙇♀️
2) Mongoose는 MongooseDocument 객체를 반환
Mongoose는 일반 JSON 객체가 아닌 MongooseDocument 객체를 반환한다.
따라서 obj에서 .lean() 메서드를 사용하여 JSON으로 변환하고 거기에서 원하는 대로 변경할 수 있다.
[ Task ]
전체 칵테일을 반환(페이지네이션으로) 해주는 API 에서 유저가 각각의 칵테일을 '좋아요' 눌렀는지 여부를 담은 JSON 객체를 response 해야한다.
[ Action + Issue ]
✔️ Action
일단 칵테일 페이지를 보는 유저는 두 가지로 나뉠 수 있다.
- 로그인을 한 유저
- 로그인을 하지 않은 유저
로그인을 하지 않았다면 isLiked가 필요없을 것이고 로그인을 했다면 필요하다.
칵테일을 반환해줄 때 로그인을 한 유저가 가지고 있는 Token 속 userId를 통해서 반환하려는 칵테일과 userId가 일치하는 도큐먼트가 있는지 findOne 한 다음 그 결과를 isLiked로 넣어준다.
(이때 findOne 결과값이 없으면 null 값을 반환한다.)
✔️ Issue
mongoose에서 반환하는 값이 JSON 객체인 줄 알고 ㅠㅠ 계속 ' data.isLiked = true ' 를 반복했다..읽기 전용인데 계속 값을 추가하려고 하니깐 추가가 안된 것이었다.
[ Solution ]
칵테일을 불러오는 코드에 lean() 메서드를 붙여 객체로 바꿔준 객체에 isLiked 추가 완료..!
찾아온 팀원분 최고...!
static getAllCocktail = async ({ offset, limit = 20 }) => {
const count = await Cocktail.countDocuments();
const result = await Cocktail.find()
.populate("rank")
.skip(offset > 0 ? (offset - 1) * limit : 0)
.limit(limit)
.lean();
result["total"] = count;
return result;
};
return Promise.all(
cocktailUserList.map(async (v, i) => {
const cocktailName = v.name
const result = await LikeModel.getLikeOne({ userId, t : cocktailName });
if (result !== null) {
return { ...v, isLiked: true};
} else {
return { ...v, isLiked: false};;
}
})
);
💁♀️ 오늘 느낀 점
해야할게 너무 많아서 정신이 없지만 화이팅해보자!!!
그리고 깨알 오랜만에 내 개인기 ㅎㅎ
아뇨?? 전 뚱인데요
📌 내일 할 일(계획)
- MBTI Cocktail Data 조사 끝내기
- test 배포 (바쁘면 목요일)
- 조회수 구현 끝내기
'프로젝트 회고 > 저쪽 손님께서 보내신 겁니다. 🍸' 카테고리의 다른 글
[칵테일 웹 서비스 프로젝트] 13일 차 회고 (0) | 2022.05.05 |
---|---|
[칵테일 웹 서비스 프로젝트] 12일 차 회고 (0) | 2022.05.04 |
[칵테일 웹 서비스 프로젝트] 10일 차 회고 (0) | 2022.04.30 |
[칵테일 웹 서비스 프로젝트] 9일 차 회고 (0) | 2022.04.29 |
댓글