해당 글은 NestJS + TypeORM 기준으로 작성되었습니다.
node-optional
node-optional 패키지는 node에서도 Java의 Optional과 유사하게 처리를 할 수 있는 방법이다.
나는 NestJS, TypeORM을 즐겨 사용 하는 데 그 중에서 Repository 패턴을 좋아한다. 백엔드 공부는 Express로 시작 했지만, NestJS보단 Spring boot를 먼저 공부해서 그런 것도 있는 거 같다.
API를 구현하다보면, 1개의 데이터만 찾고, 없을 경우 Exception을 던지는 경우가 상당히 많은 데, 일반적으론 아래와 같이 할 것이다.
/**
* 유저 데이터를 조회합니다.
* @param {number} userId
* @returns {Promise<User>}
*/
public async findOne(userId: number): Promise<User> {
const user = await this.userRepository.findOne({ where: { id: userId } });
if (!user) {
throw new NotFoundException('유저를 찾을 수 없습니다.');
}
return user;
}
userRepository에서 id를 기반으로 유저를 조회하는 데, 조회한 데이터가 없어서 null이 넘어올 수도 있기에 데이터가 있는 지 파악하고 없으면 Exception을 있으면 유저 데이터를 반환한다.
이 코드를 정말 수백번 짜면서 생각이 든 것이 Java의 Optional을 이용하여 한 줄로 던지는 코드가 생각났다.
public User findOneById(Integer userId) {
return userJpaRepository.findUserByUserId(userId).orElseThrow(() -> new NotFoundException("유저를 찾을 수 없습니다."));
}
Java의 경우는 아래와 같이 Optional Class를 활용하여 TS에서 여러줄로 작성한 코드를 1줄로 축약하여 작성할 수 있다. 이에 node-optional은 Java의 Optional과 유사한 기능을 제공헌다.
node-optional
import Optional from 'node-optional';
/**
* 유저 데이터를 조회합니다.
* @param {number} userId
* @returns {Promise<User>}
*/
public async findOne(userId: number): Promise<User> {
const user = await this.userRepository.findOne({ where: { id: userId } });
return Optional.of(user).orElseThrow(
NotFoundException,
'유저를 찾을 수 없습니다.',
);
}
node-optional을 사용하면 위와 같이 Optional.of()에 들어가는 값이 없을 경우 orElseThrow 메서드를 이용해서 같은 예외를 던질 수 있는 기능을 제공한다.
이는 이전처럼 작성하던 코드보다 조금 더 편리하게 작성할 수 있다는 장점이 있다.
'B.E > Nest JS' 카테고리의 다른 글
NestJS Request Lifecycle (0) | 2024.05.16 |
---|---|
NestJS에서 typeorm-transactional를 사용하여 트랜잭션 관리 (0) | 2024.05.13 |
NestJs Event 처리(@nestjs/event-emitter) (0) | 2024.04.11 |
NestJS V10 마이그레이션 + SWC (0) | 2023.10.11 |
Nestjs V10의 변화점 (0) | 2023.10.11 |