Node.js 백엔드 스터디(14) - NestJS로 직접 기획한 API 만들기(2) - Delete와 예외처리
소스 코드
[리포지 링크]
들어가기 전에
이번 장에서는 앞에서 직접 개발했던 Backend API에 Delete 기능과 최소한의 예외처리를 해보겠다.
1. Backend API 스펙 확인
아래와 같이 추가하고 싶은 API의 스펙을 작성한다
URL | HTTP 메서드 | 설명 |
---|---|---|
/landingPage | DELETE | params로 넘어온 클래스 고유번호와 유저 고유번호로 해당 유저의 데이터를 제거한다 |
2. 리포지토리에 인터페이스와 함수 추가
순서 3. 리포지토리(landingPage.repository.ts)에 인터페이스를 정의하고, 몽고DB를 다룰 함수를 정의한다.
// landingPage.repository.ts
... 생략 ...
export interface LandingPageRepository {
... 생략 ...
// 리포지토리 인터페이스에 추가
deletePost(userNum: number, classNum: number);
}
@Injectable()
export class LandingMongoRepository implements LandingPageRepository {
... 생략 ...
// 특정 유저의 랜딩페이지의 구성값 제거
async deletePost(userNum: number, classNum: number) {
this.landingPageModel.findOneAndDelete({ userNum, classNum });
}
}
3. 서비스(LandingPageService)에 코드 추가
// landingPage.service.ts
... 생략 ...
@Injectable()
export class LandingPageService {
... 생략 ...
// 추가
deletePost(userNum: number, classNum: number) {
this.landingRepository.deletePost(userNum, classNum);
}
}
4. 컨트롤러(landingPage.controller)에 코드 추가
// landingPage.controller.ts
... 생략 ...
@Controller('landingPage')
export class LandingPageController {
... 생략 ...
// 추가
@Delete('/:classNum/:userNum')
deletePost(@Param('userNum') userNum: number, @Param('classNum') classNum: number) {
console.log('랜딩페이지 제거');
return 'success'
}
}
5. 예외 처리
컨트롤러(landingPage.controller.ts)에서 userNum과 classNum이 모두 있는지를 체크하고, 그렇지 않으면 에러를 던져 로그로 출력하게 했다.
// landingPage.repository.ts
... 생략 ...
export class LandingMongoRepository implements LandingPageRepository {
... 생략 ...
async deletePost(userNum: number, classNum: number) {
try {
// 1. userName과 className이 둘다 있는지 체크
const areBothKeyExist =
await this.landingPageModel.exists({ userNum, classNum });
if (!areBothKeyExist) { throw new Error('userNum || classNum 없음.') }
// ... 1
await this.landingPageModel.findOneAndDelete({ userNum, classNum });
} catch (error) {
console.log(error);
}
}
}
참고
다음에 다루게 될 것
- NestJS 환경변수(1) - 환경 변수(.env) 설정, 커스텀 환경 변수 설정”
댓글남기기