본 내용은 내일배움캠프에서 활동한 내용을 기록한 글입니다.
펫시터 관련 여러 API를 만들었지만, 그 중에서도 조금 헷갈리던 펫시터 검색 기능에 대해서 기록을 남길 예정
펫시터 검색 기능은 펫시터의 이름, 경력, 지역, 가격을 기준으로 Query에 검색을 통해서 데이터를 찾음
아래의 코드는 펫시터 검색 기능의 Controller 부분
// 펫시터 검색 기능
searchPetsitter = async (req, res, next) => {
try {
// 펫시터를 검색하기 위한 쿼리를 가져옴
const { name, region, price, career } = req.query;
let petsitters;
// 각 쿼리로 검색할 때의 where 조건절
if (name) {
petsitters = await this.petsitterService.searchPetsitter({ petsitterName: name });
} else if (region) {
petsitters = await this.petsitterService.searchPetsitter({ region });
} else if (price) {
petsitters = await this.petsitterService.searchPetsitter({ price: { lte: +price } });
} else if (career) {
petsitters = await this.petsitterService.searchPetsitter({
petsitterCareer: { gte: +career },
});
} else {
petsitters = await this.petsitterService.searchPetsitter({});
}
return res
.status(200)
.json({ status: 200, message: '펫시터 검색에 성공했습니다.', data: { petsitters } });
} catch (err) {
next(err);
}
};
각 쿼리로 검색할 쿼리에 맞는 데이터를 출력하기 위해서 where절에 넣을 조건 객체를 설정해서 서비스로 넘김
만약 아무런 쿼리가 없으면 그냥 모든 펫시터를 시간 순으로 정렬함
펫시터의 Service 코드는 생각보다 간단함
그저 Controller에서 가져온 where 절의 조건을 그대로 Repository에 전달함
// 펫시터 검색 기능
searchPetsitter = async (whereCondition) => {
const petsitters = await this.petsitterRepository.searchPetsitter(whereCondition);
return petsitters;
};
펫시티의 Repository 코드도 마찬가지로 간단하게 구현이 가능함
아직까지는 'desc'와 같이 문자열을 그대로 사용했지만 객체화 해서 관리할 예정
// 펫시터 검색 기능
searchPetsitter = async (whereCondition) => {
const petsitters = await this.prisma.petsitter.findMany({
where: whereCondition,
orderBy: { createdAt: 'desc' },
});
return petsitters;
};
오늘 팀원들도 어느정도 필수 구현이 완료되었기에 내일은 코드들을 연결할 예정
원래는 각제 독자적으로 더미 데이터를 이용해서 구현했음
그리고 에러 처리, 유효성 검사 등도 같이 진행할 예정
펫시터에 대한 구현은 생각보다 그렇게 어렵진 않았음
하지만 3계층으로 분리된 만큼 생각해야 하는게 많았고 아직까지 낯설게 느껴짐
오늘은 펫시터 검색, 목록 조회, 상세 조회, 수정, 예약 현황 조회, 예약 상태 변경 API를 구현함
펫시터 예약 현황 예약 상태 변경 API는 예약 테이블에 접근해서 조회하거나 수정해야 하는데 petsitter.repository 에 넣는게 맞는지 잘 모르겠음
펫시터 검색 기능에서는 코드 자체의 난이도가 있는 것은 아니었지만 처음에 이름, 경력, 가격, 지역에 대한 쿼리를 어떻게 처리할 지에 대해 고민을 많이함