본문 바로가기
SAC

[새싹x코딩온] 풀스택 개발자 부트캠프 과정 5주차-2 회고 | MySQL, MVC 패턴

by 비너발트 2024. 12. 1.

DB란?

DB는 데이터베이스라는 뜻으로 체계적으로 정리된 데이터의 집합을 의미합니다 데이터를 쉽게 접근하고 수정하면서 필요한 정보를 보다 효과적으로 제공하는것이 목적입니다

DBMS 란?

DBMS는 데이터베이스를 관리하고 사용할 수 있게 해주는 일종의 소프트웨어를 뜻하며 DBMS는 데이터를 정의, 생성, 유지, 검색, 갱신, 삭제 하는 기능을 제공하며 데이터의 보안, 일관성, 무결성을 유지하면서 사용자나 데이터를 요청하는 프로그램이 데이터를 쉽게 사용 할 수있도록하는 프로그램입니다

 

RDBMS

RDBMS 는 관계형 데이터베이스라고 불리며 데이터를 테이블(행과 열) 형식으로 저장하며 각 테이블은 서로 관계를 가질 수 있는 데이터의 방식입니다 SQL 이라는 언어를 사용하여 데이터를 조작하며 대표적으로 MySQL, Oracle, MS SQL에서 사용됩니다 장점으로는 데이터의 일관성과 무결성이 보장되며 복잡한 쿼리기능을 제공합니다

 

데이터 타입

데이터 타입은 데이터가 저장되는 형식인데 대표적으로 INT, FLOAT, BOOL, TEXT(String), DATE 가 존재합니다

각가 타입의 크기에따라 세부적인 타입이 더 나눠지게됩니다

 

SQL 분류

데이터 조작어(DML) : SELECT, INSERT, UPDATE, DELETE

데이터 정의어(DDL) : CREATE, ALTER, DROP

데이터 제어어(DCL) : GRANT, REVOKE (데이터베이스의 접근과 권한에 관련된 명령어)

 

JOIN

조인이란 검색한 두 테이블을 묶어서 하나의 테이블도 만들 수 있는 SQL문입니다

테이블 A 와 B의 KEY 값으로 서로의 일치하는 데이터값을 정리해서 보여줄 수 있는 기능입니다

간단한 예시

먼저 두 개의 테이블을 가정해보고

  1. employees 테이블 (직원 정보)employee_id name department_id
    1 Alice 1
    2 Bob 2
    3 Charlie 1
    4 David 3
  2. departments 테이블 (부서 정보)department_id department_name
    1 Sales
    2 HR
    3 IT

이제 이 두 테이블을 사용해 JOIN을 수행해 보겠습니다

INNER JOIN 예제

다음 SQL 쿼리는 직원 이름과 그들이 속한 부서 이름을 함께 조회합니다

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.department_id;

쿼리 결과

위 쿼리를 실행하면 다음과 같은 결과가 나옵니다

name department_name

Alice Sales
Charlie Sales
Bob HR
David IT

설명

  • SELECT employees.name, departments.department_name는 employees 테이블의 직원 이름과 departments 테이블의 부서 이름을 선택하라는 의미입니다.
  • FROM employees는 employees 테이블을 기준으로 데이터를 가져오도록 지정합니다.
  • INNER JOIN departments는 departments 테이블을 employees 테이블과 연결합니다.
  • ON employees.department_id = departments.department_id는 두 테이블을 연결할 때 사용할 조건으로, 직원의 department_id와 부서의 department_id가 일치하는 경우 데이터를 결합합니다.

이러한 방식으로 JOIN을 사용하여 여러 테이블에서 관련 데이터를 쉽게 조회할있습니다 고유한 값으로 일치하는 데이터를 좀 더 효율적으로 핸들링할 수 있습니다

 

 

MVC 패턴

MVC 패턴은 프로그램 개발시 프로그램의 내부 구성을 좀 더 효율적으로 유지 보수할 수 있도록 나오게된 디자인패턴 중 하나입니다

 

큰 틀로보자면 Model, View, Controller 3가지 구분을 갖고있습니다 사용자는 오로직 View(프론트뷰)와 상호작용하게됩니다 이후 데이터에 관한 처리는 Controller(백엔드 서버작업)가 맡아 처리히며 View와 Model(DB)와 소통합니다

 

MVC 패턴의 가장 큰 장점은 강력한 모듈화로 인해 역할을 분담함으로서 독립적으로 개발할 수 있고 유지보수가 좀 더 용이해진다는 것 이고 규모가 큰 프로젝트일수록 더 효율이 좋습니다

 

 

Node.js MVC 패턴 예제

 

app.js

// app.js
const express = require('express');
const app = express();
cosnt PORT = 8080;

// 미들웨어 설정
app.set('view engine', 'ejs');
app.set('views', './views');

app.use(express.urlencoded({ extended: true }));

// 라우터 설정
const todoRoutes = require('./routes/todoRoutes');
app.use('/', todoRoutes);

// 서버 시작
app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});

 

todoRoutes.js

const express = require('express');
const router = express.Router();

//컨트롤러 불러오기
const todoController = require('../controllers/todoController');

//get 요청 (기본 인덱스경로)
router.get('/', todoController.getTodos);

//post 요청
router.post('/add-todo', todoController.addTodo);

//필수
module.exports = router;

 

controller.js

// controllers/todoController.js
const Todo = require('../models/todoModel');

// 라우터에서 / 경로로 들어올때 
exports.getTodos = (req, res) => {
    const allTodos = Todo.getAll();
    res.render('index', { todos: allTodos });
};

// 라우터에서 /add-todo 로요청을 보냈을데
exports.addTodo = (req, res) => {
    const task = req.body.task;
    if (task) {
        const newTodo = new Todo(Date.now(), task);
        Todo.add(newTodo);
    }
    res.redirect('/');
};

 

index.ejs

<!-- views/index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Todo List</title>
</head>
<body>
    <h1>Todo List</h1>
    //라우터 /add-todo로 요청을보냄
    <form action="/add-todo" method="POST">
        <input type="text" name="task" placeholder="Enter a new task" required>
        <button type="submit">Add</button>
    </form>
    <ul>
        <% todos.forEach(todo => { %>
            <li><%= todo.task %></li>
        <% }); %>
    </ul>
</body>
</html>

 

mode.js

// models/todoModel.js

//db 역할을 대신할 array
let todos = [];

class Todo {
    constructor(id, task) {
        this.id = id;
        this.task = task;
    }

    static getAll() {
        return todos;
    }

    static add(todo) {
        todos.push(todo);
    }
}

module.exports = Todo;

 

처음쓰면 어렵겠지만 손에 익는다면 어떤 방법보다 편안할 디자인패턴입니다 개발 프레임워크 라라벨이 MVC 패턴구조를 갖고있으며 CMS로는 라이믹스가 이런 구조를 갖고있습니다