2차프로젝트 [푸망- 부동산중개 웹]

hereright·2022년 6월 15일
0

📌프로젝트 소개

  • 프로젝트 참가인원 : 5명 (프론트엔드 3명, 백엔드 2명)
  • 담당 : 백엔드
  • 프로젝트 기간 : 22.04.18~ 22.04.30
  • 참고 사이트 : 다방

    지도API의 위도,경도를 다룬다는 점에서 이전 프로젝트와 차별을 둘 수 있었으며 이전 프로젝트에서 담당하지 못했던 부분에 대한 이해도가 높아졌다.

📌사용된기술

  • Node, Express, Mysql, jwt, prisma, cors, routes, Bcrypt, Github

📌내가 맡은 역할은?

👍 로그인 API

res로 해당 유저의 토큰을 전달.

👍 Middleware, Utils (토큰확인, 키에러 확인, 에러핸들링)

  • 토큰을 확인해서 해당 유저가 자격을 가지고있는지 확인하는 미들웨어.

    유저 타입별로 토큰을 해독해 해당하는 id의 유저가 있는지 확인

  • 회원가입이나 부동산 등록 중 들어오는 인자의 수가 많아지자 객체분할, 키에러 핸들링 부분이 지저분해보였다.
    객체분할을 Dao단으로 빼 controller, service단이 깔끔해졌으며 키에러 미들웨어를 생성해 코드 가독성이 생겼다.
    밑의 코드가 controller단에 있다고 생각하면 말 안되는 가독성에 손이 떨린다..
    const keyErrorEstate = async (req, res, next) => {
      try {
        const {
          address_main,
          building_name,
          address_dong,
          address_ho,
          latitude,
          longitude,
          supply_size,
          exclusive_size,
          building_floor,
          current_floor,
          available_date,
          description_title,
          description_detail,
          price_main,
          price_deposit,
          price_monthly,
          heat_id,
          category_id,
        } = req.body;
        const requiredKey = {
          address_main,
          building_name,
          address_ho,
          latitude,
          longitude,
          supply_size,
          exclusive_size,
          building_floor,
          current_floor,
          available_date,
          description_title,
          description_detail,
          heat_id,
          category_id,
        };
        //전세월세 가격이 둘다 안들어왔을때
        if (!price_main && !price_deposit) {
          throw errUtils.errGenerator({
            statusCode: 400,
            message: "KeyError : Price",
          });
        }
        // 보증금가격은 들어왔는데 월세가 없을때
        if (price_deposit && !price_monthly) {
          throw errUtils.errGenerator({
            statusCode: 400,
            message: "KeyError : monthly",
          });
        }
        for (const key in requiredKey) {
          if (!requiredKey[key]) {
            throw errUtils.errGenerator({
              statusCode: 400,
              message: `KeyError: ${key}`,
            });
          }
        }
        next();
        } catch (err) {
        next(err);
      }
    };
  • error Generator, Handler를 생성해 custom error가 생겼을때 해당 미들웨어 함수를 사용해 코드의 가독성을 올렸다.
const errGenerator = async (errParams) => {
  const { message, statusCode } = errParams;
  const err = new Error(message);
  err.statusCode = statusCode;
  console.log(err);
  return err;
};
const errHandler = async (err, req, res, next) => {
  const { statusCode, message } = await err;
  console.log(`statusCode : ${statusCode}, message : ${message}`);
  res.status(statusCode || 500).json({
    message: message,
  });
};

👍 부동산 CRUD (CREATE, READ, UPDATE, DELETE)

방 등록, 개별 방 정보, 해당 중개인이 등록한 방 리스트, 방 정보 수정, 방 삭제로 나뉘는 CRUD API.
Delete의 경우는 복원할 경우를 생각해 boolean 칼럼을 생성해 관리했다.

👍 검색 API

검색어에 따라 오피스텔, 아파트의 건물이름, 주소지 칼럼에 해당하는 내용이 있는 data를 get해 보여주는 API.

📌소개 및 작동화면

  • 검색api
  • 지도api

📌어려웠던 코드

  • 부동산 리스트
const getEstateList = async (agentId) => {
  const estateId = await prisma.realEstates.findMany({
    where: {
      AND: [{ real_estate_agent_id: Number(agentId) }, { is_deleted: false }],
    },
    select: { id: true },
  });
  let result = [];
  for (i = 0; i < estateId.length; i++) {
    const estateInfo = await prisma.realEstates.findUnique({
      where: { id: estateId[i].id },
      select: {
        id: true,
        price_main: true,
        price_deposit: true,
        price_monthly: true,
        categories: { select: { type: true } },
        created_at: true,
      },
    });
    const likes = await prisma.usersRealEstatesLikes.aggregate({
      where: { real_estate_id: estateId[i].id },
      _count: true,
    });
    result[i] = { likes, estateInfo };
  }
  return result;
};

해당 부동산에 적용된 좋아요 개수를 가공해서 넘겨주려했으나 prisma에 내장된 aggregate를 써야 _count가 생각한대로 구현돼서
따로 변수를 지정해 res에 같이 담아서 보내니 생각한대로 구현됐다.

🎁회고🎁

지도API 자체가 data가 많이 있어야 보여줄게 있는 구조여서 부동산 정보를 크롤링해오는 작업이 쉽지않았고 결국 건물종류별 60개씩만 해오는것으로 마무리했다.

request에서 받아온 위도 경도로 범위를 지정해 해당하는 건물 정보를 가져오거나 검색어에 따라 address_main 혹은 building_name 칼럼에서 해당하는 건물정보를 가져오는데에 해당 정보들이 활용됐다.

이전과 다르게 미리 넣어야하는 data의 양이 많아 이전 프로젝트와 차별점이 있었고 ORM의 여러가지 기능에 익숙해졌다.

그리고 이번 프로젝트의 경우 스탠드업 미팅과 18시의 미팅이 따로 있어 전체적인 진행상황을 이해하기 편했다. 협업을 할때 어떤식으로 정보를 가공해서 주는지와 같은 부분에 대한 기준에 대한 소통의 중요함을 깨달았다.

0개의 댓글