본문 바로가기
프로젝트 회고/저쪽 손님께서 보내신 겁니다. 🍸

[칵테일 웹 서비스 프로젝트] 11일 차 회고

by HelloJudy 2022. 5. 3.

우리 팀의 공식 개발 일정은 화~토 사이이다.
따라서 쉬는 날 한 작업들은 화요일 회고에 같이 기록한다!
( 하지만 스크럼은 매일 진행했고 작업도 매일 했다...👍)

📖 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 배포 (바쁘면 목요일)
  • 조회수 구현 끝내기
반응형

댓글