[Node.js] UUID 만들어 적용시키기

mj·2024년 11월 24일
0

kbt

목록 보기
8/18

UUID를 사용하기로 한 이유

커뮤니티 웹사이트 프로젝트를 JSON 더미 데이터로 진행하고있었다.
이때 게시물ID를 posts.length + 1 (전체 게시물 개수 + 1) 로 생성하였다.
그런데 댓글의 경우, 아래 예시처럼 게시물 ID를 key로 가지고 있으며 value로 댓글목록배열을 가지고 있는 형태이다. 전체 댓글 수를 알기 위해서는 모든 키에 대한 탐색이 필요했기에 뭔가 비효율적이라 생각했다.

// comments 구조 : {게시물id : 댓글목록배열}
{
  "1": [
    {
      "commentId": 1,
      "userId": 1,
      "nickname": "홍길동",
      "profileImage": "/images/special.jpeg",
      "content": "이 게시물 정말 유용하네요!",
      "createdAt": "2024-11-16 08:30:00"
    }
  ]
}

또, 전체 개수 + 1로 순차적으로 ID를 생성하게되면, 후에 게시글이나 댓글을 삭제 했을 때, 사용되지 않는 숫자가 존재하게 되어 낭비다.

예를 들어 1, 2, 3, 4... 순으로 게시물 ID를 생성했다고 하자. 이때 게시물ID가 2인 게시물을 삭제하게되면 1, 3, 4 ...가 된다. 새로운 게시물을 생성해도 ID는 2가 아닌 4+1=5가 되므로 ID로 2는 영원히 사용할 수 없게 된다.

이런 이유로 ID를 생성할 방법을 찾다가 UUID를 알게되었다.



UUID (Universally Unique Identifier)


factorio thumbnail (출처: toss payments 개발자센터)


고유한 아이디를 만들 수 있다.
중복의 가능성이 존재하긴하지만, 10억분의 1로 로또에 두번 연속으로 1등 당첨될 확률보다도 낮다고 하니 신경쓰지 않아도 될듯하다.

128bit의 숫자문자열이며 36자리이다.
8자-4자-4자-4자-12자로 구성되어 있으며, 세번째 필드의 첫 숫자는 UUID의 버전을 의미한다.

사용법

  • uuid npm 패키지 설치하기

    npm install uuid
  • 필요한 버전의 uuid 불러와 메서드 호출
    v4를 uuid4라는 이름으로 불러오기

    import { v4 as uuidv4 } from 'uuid';
    uuidv4(); // '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

    이름을 지정하지 않고 바로 v4를 호출해도 된다.

    import { v4 } from 'uuid';
    const test = v4();

내 프로젝트에 적용해보기

>> Before

export const createPost = async(newPost) => {
    try{
        const posts = await getAllPosts();
      
        // >> 전체 게시물 개수 + 1 로 ID설정함. <<
        const postId = posts.length > 0 ? posts[posts.length - 1].postId + 1 : 1

        newPost.postId = postId;
        posts.push(newPost);

        await fs.writeFile(postsFilePath, JSON.stringify(posts, null, 2), 'utf-8');

        return postId;

    }catch(error){
        throw error;
    }
};

>> After

import { v4 } from 'uuid';

export const createPost = async(newPost) => {
    try{
        const posts = await getAllPosts();
      
        // >> uuid 적용 <<
        const postId = v4();

        newPost.postId = postId;
        posts.push(newPost);

        await fs.writeFile(postsFilePath, JSON.stringify(posts, null, 2), 'utf-8');

        return postId;

    }catch(error){
        throw error;
    }
};

>> 결과 화면


🔗 참고 링크

profile
일단 할 수 있는걸 하자.

0개의 댓글