Tech Blog of Pinomaker
해당 글은 NestJS + TypeORM 기준으로 작성되었습니다.

 

 

 

node-optional

A utility class for handling optional values. Latest version: 1.0.2, last published: 24 days ago. Start using node-optional in your project by running `npm i node-optional`. There are no other projects in the npm registry using node-optional.

www.npmjs.com

 

1. node-optional

node-optional 패키지는 node에서도 Java의 Optional과 유사하게 처리를 할 수 있는 방법이다.

 

나는 NestJS, TypeORM을 즐겨 사용 하는 데 그 중에서 Repository 패턴을 좋아한다. 백엔드 공부는 Express로 시작 했지만, NestJS보단 Spring boot를 먼저 공부해서 그런 것도 있는 거 같다.

 

 

 

API를 구현하다보면, 1개의 데이터만 찾고, 없을 경우 Exception을 던지는 경우가 상당히 많은 데, 일반적으론 아래와 같이 할 것이다.

<typescript />
/** * 유저 데이터를 조회합니다. * @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을 이용하여 한 줄로 던지는 코드가 생각났다.

 

<java />
public User findOneById(Integer userId) { return userJpaRepository.findUserByUserId(userId).orElseThrow(() -> new NotFoundException("유저를 찾을 수 없습니다.")); }

 

Java의 경우는 아래와 같이 Optional Class를 활용하여 TS에서 여러줄로 작성한 코드를 1줄로 축약하여 작성할 수 있다. 이에 node-optional은 Java의 Optional과 유사한 기능을 제공헌다.

 

2. node-optional 

<typescript />
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 메서드를 이용해서 같은 예외를 던질 수 있는 기능을 제공한다.

 

이는 이전처럼 작성하던 코드보다 조금 더 편리하게 작성할 수 있다는 장점이 있다.

profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!