Node.js 에서 3계층 아키텍처
3계층 아키텍처는 애플리케이션을 웹 계층(클라이언트 계층), 애플리케이션 계층, 데이터베이스 계층으로 분리하는 설계 패턴입니다. 가장 기본적으로 많이 사용되는 설계이기에 이번 포스트에서는 간단한 코드와 함께 3계층 아키텍처를 살펴보도록 하겠습니다.
Web Layer
프레젠테이션 계층은 일반적으로 클라이언트(웹 브라우저)와 수신 요청을 처리하고 응답을 회신하는 서버 측 코드를 포함하는 애플리케이션의 Front-End 부분을 처리합니다.
const http = require('http');
const hostname = 'localhost';
const port = 3000;
const app = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World!');
});
app.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
위의 코드에서는 Node.js에 내장된 http 모듈을 사용하여 새 HTTP 서버를 만듭니다. 그런 다음 포트 3000에서 수신 요청을 수신하고 각 요청에 "Hello World!"라는 일반 텍스트 메시지로 응답합니다.
물론 실제 응용프로그램에서는 다양한 유형의 요청을 처리하고 적절한 응답을 보내기 위한 보다 복잡한 논리를 포함하고 싶을 것입니다. 그렇다면 바로 비지니스 로직을 다루는 어플리케이션 계층으로 넘어가도록 하죠.
Application Layer
애플리케이션 계층은 일반적으로 애플리케이션의 비즈니스 로직을 처리하는 곳입니다.
Node.js 응용 프로그램에서 MVC 아키텍처를 사용하여 응용 프로그램의 문제를 다른 구성 요소로 분리할 수 있습니다.
Express 웹 프레임워크를 사용하여 Node.js에서 간단한 MVC 아키텍처를 구현 해보겠습니다.
const express = require('express');
const app = express();
// Model - MySQL Database connection
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'username',
password: 'password',
database: 'mydb'
});
// View - using EJS template engine
app.set('view engine', 'ejs');
// Controller - using Singleton pattern
class UserController {
static getInstance() {
if (!UserController.instance) {
UserController.instance = new UserController();
}
return UserController.instance;
}
getUser(req, res) {
// get user data from database
connection.query('SELECT * FROM users WHERE id = ?', [req.params.id], (error, results) => {
if (error) {
console.log(error);
res.status(500).send('Error retrieving user data');
} else {
res.render('user', { user: results[0] });
}
});
}
}
// Routes
const userController = UserController.getInstance();
app.get('/user/:id', userController.getUser);
// Start server
app.listen(3000, () => {
console.log('Server started on port 3000');
});
위의 코드에서는 먼저 mysql 모듈을 사용하여 MySQL 데이터베이스 연결을 만듭니다. 또한 뷰 렌더링에 EJS 템플릿 엔진을 사용하도록 Express 앱을 구성합니다.
그런 다음 Singleton 패턴을 따르는 사용자 컨트롤러 클래스를 생성하여 애플리케이션 전체에서 컨트롤러의 단일 인스턴스를 공유할 수 있습니다. 이 예에서 getUser() 메서드는 데이터베이스에서 사용자 데이터를 검색하고 EJS를 사용하여 보기를 렌더링하는 역할을 합니다.
마지막으로 /user/:id URL에 대한 경로를 정의하고 UserController의 getUser() 메서드에 매핑합니다. 이 URL에 대한 요청이 있으면 데이터베이스에서 사용자 데이터를 검색하고 EJS를 사용하여 보기를 렌더링하는 컨트롤러의 getUser() 메서드가 호출됩니다.
Database Layer
데이터베이스 계층에서는 일반적으로 데이터베이스와의 상호 작용을 처리합니다.
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'username',
password: 'password',
database: 'mydb'
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected to MySQL database!');
const createTableQuery = `
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
)
`;
connection.query(createTableQuery, (err, result) => {
if (err) throw err;
console.log('User table created successfully!');
});
});
위의 코드에서 mysql 모듈을 사용하여 MySQL 데이터베이스 연결을 만듭니다. 그런 다음 ID, 이름 및 이메일 열이 있는 사용자 테이블을 생성하기 위한 SQL 쿼리를 포함하는 createTableQuery 변수를 정의합니다.
마지막으로 연결을 사용합니다.query() 메서드는 데이터베이스에 사용자 테이블을 만드는 SQL 쿼리를 실행합니다. 쿼리가 성공하면 테이블이 성공적으로 생성되었음을 나타내는 메시지를 콘솔에 출력됩니다.
실제 응용프로그램에서는 오류를 처리하고 더 복잡한 데이터베이스 상호작용을 구현할 수 있습니다. 복잡한 로직을 구성하다보면 수많은 쿼리들로 인해 callback hell 문제가 발생할 수 있습니다. 대체 방안으로 ORM을 사용하는 방법이 있습니다. 이 내용은 추후에 ORM 파트에서 더 자세하게 설명하겠습니다.
결론
간단하게 Express를 사용해서 3계층 아키텍처를 적용해 어플리케이션을 구성해보았습니다. 사실 지금 까지의 내용에 살을 덧붙이고, 비지니스 로직을 추가적으로 구성한다면 하나의 어플리케이션이 완성되는 것입니다.
하지만 지금까지의 내용으로는 부족한 부분이 많습니다. 실제 프로젝트에서 사용하기 위해서는 더 많은 부분이 필요할 것입니다.
이후 내용에서는 Express에 여러 디자인 패턴을 적용한 코드와 함께 찾아오겠습니다.
'Node.js' 카테고리의 다른 글
🎨디자인 패턴과 함께하는 Nodejs (0) | 2023.03.05 |
---|---|
✨Welcome to Express! (0) | 2023.02.27 |
🎉Start Node.js (0) | 2023.02.24 |