참고하세요!!
🔗 HetaMVC란?
🔗 프로젝트 깃허브 주소
유저와 관련된 CRUD
기능을 구현하는 것을 뜻합니다. CRUD는 각각 Create
, Read
, Update
, Delete
의 앞글자를 딴 줄임말로 무언가를 생성하고, 조회하고, 수정하고, 삭제하는 것을 말합니다. 즉 유저 CRUD는 유저를 생성하고, 조회하고, 수정하고, 삭제하는 것입니다.
유저 생성
[POST] /users
request
{
"name" : "hello",
"age" : 11
}
response
{
"id" : 1,
"name" : "hello",
"age" : 11
}
유저 수정
[PUT] /users/{userId}
request
{
"name" : "bye",
"age" : 11
}
response
{
"id" : 1,
"name" : "bye",
"age" : 11
}
유저 전체 조회
[GET] /users
response
[
{
"id" : 1,
"name" : "hello",
"age" : 11
},
{
"id" : 2,
"name" : "node",
"age" : 100
},
...
]
유저 상세 조회
[GET] /users/{userId}
response
{
"id" : 1,
"name" : "hello",
"age" : 11
}
유저 삭제
[DELETE] /users/{userId}
response
[
{
"id" : 2,
"name" : "node",
"age" : 100
},
...
]
id
type : unsigned int
primary key, auto increment
name
type : string(20)
not null
age
type : unsinged int
not null
프로젝트 생성법
1. cmd 실행
2. 폴더 생성
3. 폴더 안에서 npx hetajs-mvc
명령어 입력
4. npm start로 서버 실행
5. http://localhost:5000 접속
기본적으로 프로젝트를 생성하면 프로젝트 안에는 이미 많은 파일들이 세팅되어 있습니다. 따라서 현재 프로젝트를 위해 필요한 파일을 제외하고 모두 삭제하였습니다.
src/backend/user/model/UserModel.js
import {HetaSequelize} from 'hetamvc'
/** @Model */
export default class UserModel extends HetaSequelize {
init(Sequelize, options) {
return this.model('user', {
id: {
type: Sequelize.INTEGER.UNSIGNED,
primaryKey: true,
autoIncrement: true
},
name: {
type: Sequelize.STRING(20),
allowNull: false
},
age: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false
}
},
options
);
}
static associate(models) {
}
}
hetamvc의 HetaSequelize를 import
받습니다.@Model
어노테이션을 사용합니다. class 상단에 작성하며 반드시 /** */
주석 안에 사용해야합니다.service
src/backend/user/controller/UserService.js
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 생성
/** @Transactional */
createUser(name, age) {
try {
const user = this.userModel.create({
name: name,
age: age
});
return user;
} catch (e) {
console.error(e);
}
}
}
controller
src/backend/user/controller/UserService.js
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 생성
/** @RequestMapping('/', post) */
createUser(req, res) {
const name = req.body.name;
const age = req.body.age * 1;
const user = this.userService.createUser(name, age);
res.send(user);
}
}
Service
src/backend/user/service/UserService.js
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 상세 조회
/** @Transactional */
getUserById(id) {
try {
return this.userModel.findByPk(id);
} catch (e) {
console.error(e);
}
}
}
Controller
src/backend/user/controller/UserController.js
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 상세 조회
/** @RequestMapping('/:userId', get) */
findUser(req, res){
const userId = req.params.userId;
const user = this.userService.getUserById(userId);
res.send(user);
}
}
Service
src/backend/user/service/UserService.js
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 목록 조회
/** @Transactional */
getUsers() {
try {
return this.userModel.findAll();
} catch (e) {
console.error(e);
}
}
}
Controller
src/backend/user/controller/UserController.js
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 목록 조회
/** @RequestMapping('/', get)*/
findAllUser(req, res){
const list = this.userService.getUsers();
res.send(list);
}
}
Service
src/backend/user/service/UserService.js
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 정보 수정
/** @Transactional */
updateUser(id, name, age) {
try {
this.userModel.update(
{
name: name,
age: age
},
{
where: {id: id}
}
);
return await this.userModel.findByPk(id);
} catch (e) {
console.error(e);
}
}
}
Controller
src/backend/user/controller/UserController.js
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 정보 수정
/** @RequestMapping('/:userId', put) */
updateUser(req, res){
const userId = req.params.userId;
const name = req.body.name;
const age = req.body.age * 1;
const user = this.userService.updateUser(userId, name, age);
res.send(user);
}
}
Service
src/backend/user/service/UserService.js
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 삭제
/** @Transactional */
deleteUser(id){
try{
this.userModel.destroy({
where : {id : id}
});
return this.userModel.findAll();
}catch (e) {
console.error(e);
}
}
}
Controller
src/backend/user/controller/UserController.js
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 삭제
/** @RequestMapping('/:userId', delete)*/
deleteUser(req, res){
const userId = req.params.userId;
const list = this.userService.deleteUser(userId);
res.send(list);
}
}
Service
@Service
어노테이션을 class 상단에 작성합니다. 반드시 /** */
주석 안에 작성합니다.@Inject
어노테이션을 사용합니다.@Transactional
어노테이션을 사용합니다. Controller
@Controller
어노테이션을 class 상단에 작성합니다. 반드시 /** */
주석 안에 작성합니다./users
입니다. 따라서 공통적으로 사용하는 경로를 class 상단에 @RequestMapping
어노테이션을 사용합니다.@Inject
어노테이션을 사용해 UserService 파일을 가져옵니다.Service
/** @Service */
export class UserService {
constructor() {
/** @Inject('UserModel')*/
this.userModel;
}
//유저 생성
/** @Transactional */
createUser(name, age) {
try {
const user = this.userModel.create({
name: name,
age: age
});
return user;
} catch (e) {
console.error(e);
}
}
//유저 목록 조회
/** @Transactional */
getUsers() {
try {
return this.userModel.findAll();
} catch (e) {
console.error(e);
}
}
//유저 상세 조회
/** @Transactional */
getUserById(id) {
try {
return this.userModel.findByPk(id);
} catch (e) {
console.error(e);
}
}
//유저 정보 수정
/** @Transactional */
updateUser(id, name, age) {
try {
await this.userModel.update(
{
name: name,
age: age
},
{
where: {id: id}
}
);
return this.userModel.findByPk(id);
} catch (e) {
console.error(e);
}
}
//유저 삭제
/** @Transactional */
deleteUser(id){
try{
this.userModel.destroy({
where : {id : id}
});
return this.userModel.findAll();
}catch (e) {
console.error(e);
}
}
}
Controller
/** @Controller*/
/** @RequestMapping ('/users') */
export class UserController {
constructor() {
/** @Inject('UserService')*/
this.userService;
}
//유저 생성
/** @RequestMapping('/', post) */
createUser(req, res) {
const name = req.body.name;
const age = req.body.age * 1;
const user = this.userService.createUser(name, age);
res.send(user);
}
//유저 목록 조회
/** @RequestMapping('/', get)*/
findAllUser(req, res){
const list = this.userService.getUsers();
res.send(list);
}
//유저 상세 조회
/** @RequestMapping('/:userId', get) */
findUser(req, res){
const userId = req.params.userId * 1;
const user = this.userService.getUserById(userId);
res.send(user);
}
//유저 정보 수정
/** @RequestMapping('/:userId', put) */
updateUser(req, res){
const userId = req.params.userId;
const name = req.body.name;
const age = req.body.age * 1;
const user = this.userService.updateUser(userId, name, age);
res.send(user);
}
//유저 삭제
/** @RequestMapping('/:userId', delete)*/
deleteUser(req, res){
const userId = req.params.userId * 1;
const list = this.userService.deleteUser(userId);
res.send(list);
}
}