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

데이터베이스의 테이블과 프로그래밍 언어의 객체(클래스)를 연결(mapping)해주는 기술이다.
SQL 쿼리를 직접 작성하지 않고도, 객체 조작하듯이 데이터베이스 작업을 할 수 있게 해준다.
생산성 향상
- SQL을 직접 작성하지 않아도 되므로 빠르게 개발 가능
유지보수 편리
- 코드가 객체지향적으로 통일되어 관리하기 쉽다
DB 독립성 제공
- 특정 DBMS에 종속되지 않고 쉽게 DB 변경 가능
보안 향상
- SQL 인젝션 공격 위험 감소
복잡한 쿼리도 객체 형태로 표현 가능
- 추상화된 쿼리 빌더 제공
성능 오버헤드
- 직접 작성한 SQL보다 느릴 수 있음
복잡한 쿼리 작성 어려움
- 복잡한 JOIN, 서브쿼리 등은 ORM에서 비효율적 또는 불편할 수 있음
학습 곡선 존재
- ORM 자체 문법과 작동 방식을 익혀야 함
추상화에 따른 문제
- 내부 쿼리 최적화 어려워질 수 있음

npm install @prisma/client
npm install prisma --save-dev
npx prisma init
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
}
npx prisma migrate dev --name init
mkdir post-crud
cd post-crud
npm init -y
npm install express body-parser
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
| 계층 | 장점 |
|---|---|
| Presentation | UI 변경 시 Logic, Data 계층에 영향 적음 |
| Logic | 비즈니스 로직 집중, 유지보수 쉬움 |
| Data | 데이터 보안, 무결성 관리 용이 |