TIL

24.02.19

아리단길아조씨 2024. 2. 20. 10:06
728x90

3계층 아키텍쳐 형식으로 만들어보기

컨트롤러(클라이언트에게 반환해주는 부분?)

// 게시글 상세 조회 API
  getPostById = async (req, res, next) => {
    try {
      const { postId } = req.params;
      const post = await this.postService.findPostById(postId);

      return res.status(200).json({ data: post });
    } catch (err) {
      next(err);
    }
  };

  // 게시글 수정 API
  updatePost = async (req, res, next) => {
    try {
      const { postId } = req.params;
      const { password, title, content } = req.body;

      // 서비스 계층에 구현된 updatePost 로직을 실행한다.
      const updatePost = await this.postService.updatePost(
        postId,
        password,
        title,
        content
      );

      return res.status(200).json({ data: updatePost });
    } catch (err) {
      next(err);
    }
  };

  // 게시글 삭제 API
  deletePost = async (req, res, next) => {
    try {
      const { postId } = req.params;
      const { password } = req.body;

      // 서비스 계층에 구현된 deletePost 로직 실행
      const deletePost = await this.postService.deletePost(postId, password);

      return res.status(200).json({ data: deletePost });
    } catch (err) {
      next(err);
    }
  };
}

서비스(메인 로직 부분)

 // 게시물 상세 조회
  findPostById = async (postId) => {
    // 저장소(Repository)에 특정 게시글 하나를 요청한다.
    const post = await this.postsRepository.findPostById(postId);

    return {
      postId: post.postId,
      nickname: post.nickname,
      title: post.title,
      content: post.content,
      createAt: post.createdAt,
      updatedAt: post.updatedAt,
    };
  };

  // 게시물 수정
  updatePost = async (postId, password, title, content) => {
    // 특정 게시물을 찾아서 post에 할당한다.
    const post = await this.postsRepository.findPostById(postId);
    // 만약 게시물이 존재하지 않는다면 에러를 던져준다.
    if (!post) {
      throw new Error("존재하지 않는 게시물 입니다!");
    }

    // 저장소(Repository)에게 데이터 수정을 요청한다.
    await this.postsRepository.updatePost(postId, password, title, content);

    //변경된 데이터를 조회한다.
    const updatePost = this.postsRepository.findPostById(postId);

    return {
      postId: updatePost.postId,
      nickname: updatePost.password,
      title: updatePost.title,
      content: updatePost.content,
      createdAt: updatePost.createAt,
      updatedAt: updatePost.updatedAt,
    };
  };

  // 게시물 삭제
  deletePost = async (postId, password) => {
    // 삭제할 특정 게시물을 찾아준다.
    const post = await this.postsRepository.findPostById(postId);
    // 게시물을 찾지 못했을 경우 에러 메세지를 던져줌
    if (!post) {
      throw new Error("게시물을 찾을 수 없습니다!");
    }

    // 저장소(Repository)에 데이터 삭제를 요청한다.
    await this.postsRepository.deletePost(postId, password);

    return {
      postId: post.postId,
      nickname: post.nickname,
      title: post.title,
      content: post.content,
      createAt: post.createdAt,
      updatedAt: post.updatedAt,
    };
  };
}

레파지토리(저장소에서 일어나는 일들을 처리한다)

 // 게시물 상세 조회
  findPostById = async (postId) => {
    // ORM인 Prisma에서 Posts 모델의 findUnique 메서드를 통해 데이터를 요청함
    const post = await prisma.posts.findUnique({
      where: { postId: +postId },
    });

    return post;
  };

  // 게시물 수정
  updatePost = async (postId, password, title, content) => {
    const updatedPost = await prisma.posts.update({
      where: {
        postId: +postId,
        password,
      },
      data: {
        title,
        content,
      },
    });
    return updatedPost;
  };

  // 게시물 삭제

  deletePost = async (postId, password) => {
    const deletedPost = await prisma.posts.delete({
      where: { postId: +postId, password },
    });

    return deletedPost;
  };
}

'TIL' 카테고리의 다른 글

24.02.21  (0) 2024.02.21
24.02.20  (0) 2024.02.21
24.02.16  (1) 2024.02.16
24.02.15  (0) 2024.02.16
24.02.14  (0) 2024.02.15