[TIL] 24.09.20 FRI

GDORI·2024년 9월 20일
0

TIL

목록 보기
47/79
post-thumbnail

[ 오늘 푼 알고리즘 코드카타 ]

12945. 피보나치 수
12914. 멀리 뛰기
12953. N개의 최소공배수
12985. 예상 대진표

레이어드 아키텍처 찍먹..

오늘은 레이어드 아키텍처에 대하여 찍먹해보았다.
기존 강의에서 배웠던 모놀리식 아키텍처는 소규모 프로젝트까지는 유용하게 사용될지 몰라도 중,대규모 프로젝트로 가면 확장성이나 유지보수성이 떨어진다고 한다.

그럼 레이어드 아키텍처가 뭔데

애플리케이션을 여러 개의 레이어로 분리하여 각 레이어가 특정한 역할을 수행할 수 있도록 구조화 하는 것을 말하며, 코드의 유지보수성을 높이고 재사용성을 향상시키며 테스트를 용이하게 만든다고 한다.

구조

  • 프레젠테이션 레이어
    사용자와 상호작용하는 부분이며 웹페이지 또는 API응답을 처리

  • 비즈니스 로직 레이어
    핵심 비즈니스 규칙과 로직을 포함하며 데이터 처리 및 계산을 수행

  • 데이터 엑세스 레이어
    데이터베이스와 상호작용을 담당, 데이터의 CRUD 작업을 수행

  • 영속성 레이어
    데이터베이스, 파일시스템, 외부API 등 접근 관리

  • 에러 처리 레이어
    애플리케이션에서 발생하는 에러를 중앙 집중식으로 처리

  • 미들웨어
    요청과 응답 사이에 위치하여 중간에서 가로채 처리하는 역할

  • 예시
    my-app/

    ├── src/
    │ ├── controllers/
    │ │ └── userController.js
    │ ├── services/
    │ │ └── userService.js
    │ ├── models/
    │ │ └── userModel.js
    │ ├── routes/
    │ │ └── userRoutes.js
    │ ├── middlewares/
    │ │ └── authMiddleware.js
    │ ├── utils/
    │ │ └── errorHandler.js
    │ └── app.js

    ├── package.json
    └── .env

  • 순서

  1. 클라이언트 요청
app.use('/api/users',authMiddleWare, userRoutes);
  1. 라우터는 요청을 받아서 컨트롤러에 전달
import express from 'express';
import { UserController } from '../controllers/userController.js';

const router = express.Router();

router.post('/register', UserController.register);

export default router;
  1. 컨트롤러에서 입력 데이터 검증 및 서비스 레이어로 전달
import { UserService } from '../services/userService.js';

export const UserController = {
    register: async (req, res) => {
        try {
            const { email, password } = req.body;
            const user = await UserService.register(email, password);
            return res.status(201).json({ message: 'User registered', user });
        } catch (error) {
            return res.status(400).json({ errorMessage: error.message });
        }
    }
};
  1. 서비스 레이어에서 비즈니스 로직 처리 후 데이터 접근 모델 레이어 호출
import bcrypt from 'bcrypt';
import { UserModel } from '../models/userModel.js';

export const UserService = {
    register: async (email, password) => {
        const hashedPassword = await bcrypt.hash(password, 10);
        return await UserModel.createUser({ email, password: hashedPassword });
    }
};
  1. 모델 레이어에서 DB처리
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export const UserModel = {
    createUser: async (data) => {
        return await prisma.user.create({ data });
    }
};
  1. 모델 레이어에서 쿼리 결과 서비스 레이어로 반환

  2. 서비스 레이어에서 처리한 결과를 컨트롤러로 반환

  3. 컨트롤러는 최종적 가공 후 클라이언트 전달

코딩은 역순?

모듈화 되어있다보니 코딩 순서를 어떻게 나눠야 하나 했다.
읽혀지는 순서의 반대로 진행하면 편할 것 같은데... 엘리트 팀원님과 상담 좀 해야겠다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글