45일차 Database

정상희·2025년 5월 28일

코딩공부

목록 보기
55/60

현재 오즈코딩스쿨 강의를 통해 프론트엔드를 학습하고 있습니다.
본 포스트는 해당 강의에 대한 내용 정리를 목적으로 합니다.

1. ORM

1) ORM (Object-Relational Mapping) 개념

업로드중..

데이터베이스의 테이블과 프로그래밍 언어의 객체(클래스)를 연결(mapping)해주는 기술이다.
SQL 쿼리를 직접 작성하지 않고도, 객체 조작하듯이 데이터베이스 작업을 할 수 있게 해준다.


2) 주요 역할

  • 객체지향 프로그래밍(OOP)과 관계형 데이터베이스(RDB)의 구조 차이 해소
  • 데이터베이스 테이블 → 클래스
  • 테이블의 행(row) → 객체 인스턴스
  • SQL 쿼리 → 메서드 호출 또는 속성 조작

3) ORM의 장점

  • 생산성 향상
    - SQL을 직접 작성하지 않아도 되므로 빠르게 개발 가능

  • 유지보수 편리
    - 코드가 객체지향적으로 통일되어 관리하기 쉽다

  • DB 독립성 제공
    - 특정 DBMS에 종속되지 않고 쉽게 DB 변경 가능

  • 보안 향상
    - SQL 인젝션 공격 위험 감소

  • 복잡한 쿼리도 객체 형태로 표현 가능
    - 추상화된 쿼리 빌더 제공


4) ORM의 단점

  • 성능 오버헤드
    - 직접 작성한 SQL보다 느릴 수 있음

  • 복잡한 쿼리 작성 어려움
    - 복잡한 JOIN, 서브쿼리 등은 ORM에서 비효율적 또는 불편할 수 있음

  • 학습 곡선 존재
    - ORM 자체 문법과 작동 방식을 익혀야 함

  • 추상화에 따른 문제
    - 내부 쿼리 최적화 어려워질 수 있음



2. Prisma

1) Prisma란?

  • Prisma는 현대적인 TypeScript/JavaScript용 ORM이다.
  • 데이터베이스와 코드 사이에서 타입 안전한 쿼리 빌더 역할을 한다.
  • MySQL, PostgreSQL, SQLite, SQL Server, MongoDB 등 다양한 DB를 지원한다.
  • 코드 자동 완성, 타입 추론, 마이그레이션 기능이 강력하다.

2) 주요 역할

  • Prisma Client: 타입 안전한 쿼리 빌더
  • Prisma Migrate: 데이터베이스 스키마 변경(마이그레이션) 관리
  • Prisma Studio: GUI로 DB 데이터 확인 및 편집 가능

3) 사용법

a. 설치

npm install @prisma/client
npm install prisma --save-dev

b. 초기화

npx prisma init
  • 프로젝트 루트에 prisma/schema.prisma 파일 생성됨
  • 여기서 DB 연결 정보와 모델을 정의함

c. schema.prisma 예시

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}

d. 마이그레이션 및 클라이언트 생성

npx prisma migrate dev --name init
  • DB에 테이블 생성
  • Prisma Client 자동 생성

e. express.js로 Post CRUD

mkdir post-crud
cd post-crud
npm init -y
npm install express body-parser

기본 서버 및 Post CRUD 구현 (index.js)

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const PORT = 3000;

// JSON 바디 파싱 미들웨어
app.use(bodyParser.json());

// 임시 데이터 저장소 (메모리)
let posts = [];
let currentId = 1;

// CREATE - 새 포스트 생성
app.post('/posts', (req, res) => {
  const { title, content } = req.body;
  if (!title || !content) {
    return res.status(400).json({ error: 'title과 content가 필요합니다.' });
  }
  const newPost = { id: currentId++, title, content };
  posts.push(newPost);
  res.status(201).json(newPost);
});

// READ - 모든 포스트 조회
app.get('/posts', (req, res) => {
  res.json(posts);
});

// READ - 특정 포스트 조회
app.get('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const post = posts.find(p => p.id === id);
  if (!post) {
    return res.status(404).json({ error: '포스트를 찾을 수 없습니다.' });
  }
  res.json(post);
});

// UPDATE - 특정 포스트 수정
app.put('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const { title, content } = req.body;
  const post = posts.find(p => p.id === id);
  if (!post) {
    return res.status(404).json({ error: '포스트를 찾을 수 없습니다.' });
  }
  if (title) post.title = title;
  if (content) post.content = content;
  res.json(post);
});

// DELETE - 특정 포스트 삭제
app.delete('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const index = posts.findIndex(p => p.id === id);
  if (index === -1) {
    return res.status(404).json({ error: '포스트를 찾을 수 없습니다.' });
  }
  posts.splice(index, 1);
  res.status(204).send();
});

// 서버 실행
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});
node index.js

4) Prisma의 장점

  • 타입스크립트와 매우 잘 어울림 (타입 안정성 보장)
  • 직관적인 쿼리 API
  • 마이그레이션 도구 내장
  • 강력한 커뮤니티와 문서 지원


3. 3Tier 설계

1) 3Tier 아키텍처란?

  • 애플리케이션을 3개의 층(Tier)으로 나누어 설계하는 구조다.
  • 각 층은 독립적이고 역할이 분리되어 있어 유지보수, 확장성, 보안에 유리하다.

2) 3개의 층

a. Presentation Tier (프레젠테이션 계층)

  • 사용자 인터페이스(UI) 제공
  • 웹 브라우저, 모바일 앱, 데스크톱 앱 등
  • 사용자 입력을 받고 결과를 보여줌

b. Logic Tier (비즈니스 로직 계층)

  • 애플리케이션의 핵심 기능 수행
  • 데이터 처리, 계산, 비즈니스 규칙 적용
  • API 서버, 애플리케이션 서버가 해당됨

c. Data Tier (데이터 계층)

  • 데이터 저장 및 관리
  • 데이터베이스 서버, 파일 저장소 등
  • 데이터를 읽고 쓰는 역할

3) 3개의 층 장점

계층장점
PresentationUI 변경 시 Logic, Data 계층에 영향 적음
Logic비즈니스 로직 집중, 유지보수 쉬움
Data데이터 보안, 무결성 관리 용이
profile
UI/UX디자이너의 코딩 공부

0개의 댓글