B.E/Nest JS

node-optional를 이용한 Exception 관리

pinomaker 2024. 10. 18. 15:10
해당 글은 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

 

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

 

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