https://castle0312.tistory.com/15
[Node.js] SNS 만들기 - 라우터 만들기
https://castle0312.tistory.com/14 [Node.js] SNS 만들기 - Express로 서버 구축 학습 목표 Node.js와 Express로 기본적인 서버 만들기 들어가기 전 해당 글은 작성자가 프로젝트를 끝내고 정리하는 식의 글이기 때
castle0312.tistory.com
이전 글에서 말했듯이 이번 글은 Model을 만드는 방법에 대해 알아보겠습니다.
들어가기 전

이게 Model폴더의 파일 구조이다. 별 다른거 없이 그냥 기능별로 필요한 Model(테이블)들을 지정했다고 이해하면 된다.
1. Model이란?
사실 Model에 대하여 설명하기 전에 먼저 MVC(Model, View, Controller) 패턴에 대해 간단하게 말하고 넘어가야 합니다.
MVC 패턴이란 디자인 패턴의 일종으로 개발과 유지보수의 효율을 높히기 위해서 개발하는 구조를 미리 정해놓은 것이라고 생각하면 되는데 자세한 내용은 나중에 다른 글을 통해서 알아보는 걸로 하고 이번 글에서는 이정도까지만 알고 있으면 됩니다.
이번 글에서 말할 Model이란 MVC 패턴에서 Model에 해당하는 부분입니다. Model은 데이터 객체의 구조를 코드로 정의한 부분이라고 할 수 있습니다. Model은 유저가 View를 통해서 어떤 행동(API)을 요청하면 그에 맞는 Controller가 행동에 필요한 데이터를 데이터베이스에 접근하여 가공해서 결과를 다시 전송하는데 이때 데이터베이스에 접근해서 쉽게 데이터를 가공하기 위해 만들어 놓은 일종의 템플릿 같은 것이라고 생각하면 됩니다. 예를 들어 게시글에 대한 데이터 테이블이 있고 이 테이블에 접근을 쉽게 하기 위해서 게시글 Model을 만들어서 필요할때 마다 이 Model을 이용해서 데이터베이스의 게시글 테이블에 접근해서 데이터를 가공하는 방식으로 활용됩니다.
2. Model 파일 생성 및 사용법
아래 코드가 Model 파일의 생성 예시로 로그인과 회원가입에 관련된 기능의 Model이다. 보다시피 User와 UserTagging이라는 테이블을 선언하였으며 이 테이블들이 로그인과 회원가입시 사용되는 테이블이라는 뜻이다. 코드를 보면 Sequelize라는 것을 사용하고 있는데 이건 sql 쿼리문을 직접 작성하는 것이 아니라 코드로 데이터에 접근 할 수 있도록 테이블 접근에 도움을 주는 ORM이다. 해당 기능에 대해서는 나중에 알아보고 나머지를 살펴보자면 이런 sequelize를 이용하여 먼저 테이블에 대한 선언을 해주면 되는 것이다.
다시 순서를 정리하자면 먼저 sequelize를 이용하여 Sequelize객체와 데이터베이스를 연결하고 사용할 테이블에 대하여 선언을 해주면 된다. 이때 define안에 있는 첫번째 매개변수로는 테이블 이름을 적어야 하며 두번째 매개변수로는 연결된 테이블에 있는 요소들을 선언하면 된다. 보다시피 요소들은 선언할때 요소 이름과 데이터의 타입이나 Null값 허용 여부, 기본 키 설정 등을 하고 있으며 이때 요소의 이름의 경우에는 테이블에서의 이름과는 반드시 같을 필요는 없고(하지만 웬만하면 같은 이름 사용하는 걸 추천한다.) 나중에 Controller에서 사용되는 이름이다. 마지막 매개변수로는 해당 테이블에 대한 설정이 들어가는데 이러한 설정 요소들은 나중에 Sequelize에 대한 설명을 할 때 알아 보는 걸로 하자. 이렇게 테이블 선언을 완료하면 마지막에 반드시 export를 해야지 다른 파일에서 해당 model을 사용할 수 있다.
require('dotenv').config();
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.MYSQL_DATABASE, process.env.MYSQL_USERNAME, process.env.MYSQL_PASSWORD, {
host: process.env.MYSQL_HOST,
port: process.env.MYSQL_PORT,
dialect: 'mysql',
});
const User = sequelize.define('User', {
userID: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
user: {
type: DataTypes.STRING,
allowNull: false,
},
birth: {
type: DataTypes.DATEONLY,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
gender: {
type: DataTypes.STRING,
allowNull: false,
},
region: {
type: DataTypes.STRING,
allowNull:true,
},
profileImage: {
type: DataTypes.STRING,
allowNull: true
}
}, {
// Other model options go here
tableName: 'users',
timestamps: false, // 기본 옵션으로 선택되는 설정을 취소하기 위해
sequelize
});
const UserTagging = sequelize.define('usertaggings', {
tagID: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
userID: {
type: DataTypes.STRING,
references: {
model: User,
key: 'userID'
}
},
tagName: {
type: DataTypes.STRING
}
}, {
timestamps: false, // 기본 옵션으로 선택되는 설정을 취소하기 위해
sequelize
});
module.exports = { User, UserTagging };
정리
이번 글에서는 Model을 어떻게 만들면 되는지 알아보았는데 마지막으로 단계를 나눠 보면 이렇게 된다.
- Sequelize 객체를 선언하면서 사용할 데이터베이스와 연결해주기
- 사용할 테이블을 선언, 이때 이름은 사용할 데이터베이스 상의 테이블 이름과 반드시 같을 필요는 없다.
- 마찬가지로 해당 테이블의 요소들을 정의해주는데 이때는 요소들의 설정도 같이 정의한다.
- 마지막으로 테이블 자체에 대한 설정들을 해준다.
- 최종적으로 선언한 테이블들을 export하여 파일 외부인 Controller에서도 사용가능하도록 한다.
이런 과정을 거치면 Model 파일을 만들 수 있는데 사실 구조는 여러가지가 있다. 나 처럼 기능별로 나눠도 되고 아니면 하나의 파일에 실제 데이터베이스처럼 테이블들을 선언 할 수도 있고 아니면 각 테이블당 파일들을 만들어서 사용 할 수도 있다. 어떤 방식을 하던지 동작에는 방해가 되지 않겠지만 프로젝트의 최종적인 구조가 어떻게 되는지 예를 들어 MSA로 할 것인지 아니면 한개의 통 프로젝트로 만들 것인지에 따라 이러한 구조도 다르게 선택해야 될 것이다.
'Node.js(Express)' 카테고리의 다른 글
| [Node.js] JWT 사용하기 - access token, refresh token (0) | 2024.01.20 |
|---|---|
| [Node.js] JWT에 대해 알아보기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Controller 만들기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - 라우터 만들기 (1) | 2024.01.13 |
| [Node.js] SNS 만들기 - Express로 서버 구축 (4) | 2024.01.13 |