잡다한 사전

(2023.12.05) 3 Layer Architecture 본문

프로그래밍 언어/node.js

(2023.12.05) 3 Layer Architecture

잡사전집사 2023. 12. 8. 01:26
반응형

3 Layer architecture란?

비즈니스 로직을 분리하는 것을 목적으로 하며, Controller, Service Layer, Data Access Layer 3개의층으로 나뉘어져 있습니다.

 

장점 : 다른 계층에 영향을 주지 않고 특정 계층만 수정이 가능합니다.

 

Controller

controller 부분은 들어오는 클라이언트 요청을 받고 서비스를 전달하는 부분입니다. 또한 서비스 부분에서 작업을 마친 데이터를 클리언트에게 응답을 하는 역활을 합니다.

 

// controllers/posts.controller.js

postsService = new PostsService();
  //게시글 조회
  getPosts = async (req, res, next) => {
    try {
      const posts = await this.postsService.findAllPosts();

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

게시글이 조회하는 Contorller 부분 코드로, getPosts를 routes부분에서 불러와서 사용하도록 작성이 되어 있습니다.

 

const posts = await this.postsService.findAllPosts();

try, catch 문을 이용하여 오류가 생겼을 때 확인이 가능하도록 하였으며, postsService에 있는 findAllPosts() 함수를 불러와서 posts 변수에 받아 데이터를 출력하는데 사용을 하였습니다. 

 

Service

서비스 계층은 모든 비즈니스 로직을 캡슐화하고 추상화하는 계층을 말합니다.

 

특징

☑︎ 데이터 계층을 활용하여 데이터베이스와 상호 작용

☑︎ controller 계층으로 전달할 데이터를 리턴

 

☒ req, res,를 활용 불가

☒ 데이터베이스와 직접적인 상호 작용 불가

 

postsRepository = new PostsRepository();
  findAllPosts = async () => {
    const posts = await this.postsRepository.findAllPosts();

    //생성 날짜로 부터 내림차순 정렬
    posts.sort((a, b) => {
      return b.createdAt - a.createdAt;
    });

    //password, content 를 제외한 상태로 controller에게 responsefmf 전달
    return posts.map((post) => {
      return {
        postId: post.postId,
        nickname: post.nickname,
        title: post.title,
        createdAt: post.createdAt,
        updatedAt: post.updatedAt,
      };
    });
  };

Controller 부분에서 Service에 있는 findAllPosts 함수를 호출하여 사용을 하며, Service 계층에서는 repository 계층을 활용하여 데이터베이스와 상호 작용을 합니다. 

 

위 코드에서는 생성 날짜를 기준으로 내림차순 정렬을 한 뒤

//password, content 를 제외한 상태로 controller에게 response를 전달
    return posts.map((post) => {
      return {
        postId: post.postId,
        nickname: post.nickname,
        title: post.title,
        createdAt: post.createdAt,
        updatedAt: post.updatedAt,
      };
    });

 repository에서 불러온 데이터를  controller로 전달해줍니다.

 

Data Access Layer

 

특징

☑︎ 데이터를 불러오는 부분

☑︎ 데이터를 받아 Service 계층으로 전달해주는 역활

 

findAllPosts = async () => {
    const posts = await prisma.posts.findMany();

    return posts;
  };

data 계층에서 findAllPosts 함수는 prisma를 이용하였기 때문에, 데이터를 가져오는 것을 확인할 수 있습니다. 

 

3 Layer Architecture을 사용하면서 느낀점

3계층 아키텍쳐를 처음으로 프로젝트에 적용을 하면서 부분적인 기능 코드 수정과, 변경에는 용이하다는 것을 느꼈다. 하지만 3계층 아키텍쳐를 적용하여 작업을 하니, 소요되는 시간이 좀더 많다는 부분에서 살짝에 불편함을 느꼈다. 

반응형