Type-ORM CRUD / mysql

TigerStoneV·2022년 12월 28일
0
post-thumbnail
post-custom-banner

express 프레임워크에 mysql을 typeORM으로 연결

기본 폴더 구조

package.json

server/index.ts

data-source.ts

  • entity 지정 필요

entity/user.ts

controller/UserController.ts

import { AppDataSource } from "../data-source";
import { User } from "../entity/User";
import { Request, Response } from "express";

export default class UserController {
  addUser = async (req: Request, res: Response) => {
    let info = {
      firstName: req.body.firstName,
      lastName: req.body.lastName,
      age: req.body.age,
    };

    const userRepo = AppDataSource.getRepository(User);
    const user = userRepo.create(info);

    await userRepo
      .save(user)
      .then((data) => {
        res.json(data);
      })
      .catch((err) => console.log(err));
  };
  getUser = async (req: Request, res: Response) => {
    let name = req.params.firstName;
    const userRepo = AppDataSource.getRepository(User);

    await userRepo
      .findOne({ where: { firstName: name } })
      .then((data) => {
        res.json(data);
        console.log("Get User: ", data);
      })
      .catch((err) => console.log(err));
  };

  getAllUsers = async (req: Request, res: Response) => {
    const userRepo = AppDataSource.getRepository(User);

    await userRepo
      .find()
      .then((data) => {
        res.json(data);
        console.log("Get all User: ", data);
      })
      .catch((err) => console.log(err));
  };

  updateUser = async (req: Request, res: Response) => {
    const userRepo = AppDataSource.getRepository(User);
    const beforeName = req.body.beforeName;
    const newName = req.body.newName;
    let user = await userRepo.findOne({ where: { lastName: beforeName } });
    if (!user) {
      return res.json({ MSG: "NOT_FOUND" });
    }
    user.lastName = newName;
    await userRepo.save(user);

    return res.json({
      MSG: "SUCCESS",
    });
  };

  deleteUser = async (req: Request, res: Response) => {
    const userRepo = AppDataSource.getRepository(User);
    const deleteNames = req.body.deleteNames;
    // 첫번째 이름이 deleteNames 모든 row 찾기
    let user = await userRepo.find({ where: { firstName: deleteNames } });
    // if (user.length === 0) {
    if (!user) {
      return res.json({ MSG: "NOT_FOUND" });
    } else {
      await userRepo.remove(user);
      return res.json({
        MSG: "SUCCESS",
      });
    }
  };
}

routers/UserRouter.ts

업로드중..

type orm pattern

Data Mapper Pattern ?

  • Data Mapper 패턴은 분리된 클래스에 쿼리 메소드를 정의하는 방식이며, Repository를 이용하여 객체를 저장, 제거, 불러온다.
  • Active Record 패턴과의 차이점은 모델에 접근하는 방식이 아닌 Repository에서 데이터에 접근 한다는 것.
  • 규모가 큰 애플리케이션에 적합하고 유지보수하는데 효과적이다.

Active Record Pattern?

  • Active Record 패턴은 모델 그 자체에 쿼리 메소드를 정의하고, 모델의 메소드를 사용하여 객체를 저장, 제거, 불러오는 방식이다.
  • BaseEntity라는 클래스를 사용하여 새로운 클래스에 상속하게 한 후 사용할 수 있다. 이를 통해 BaseEntity가 갖고 있는 메소드와 static으로 만들어 내는 커스텀 메소드를 이용할 수 있다.
  • 규모가 작은 애플리케이션에서 적합하고 간단히 사용할 수 있다.

CRUD

// 유저 생성
  addUser = async (req: Request, res: Response) => {
    let info = {
      firstName: req.body.firstName,
      lastName: req.body.lastName,
      age: req.body.age,
    };

    const userRepo = AppDataSource.getRepository(User);
    const user = userRepo.create(info);

    await userRepo
      .save(user)
      .then((data) => {
        res.json(data);
      })
      .catch((err) => console.log(err));
  };
// 모든 유저 get
getUsers = async(req:Request, res:Response)=>{
  	const userRepo = AppDataSource.getRepository(User);
    await userRepo.find().then((data)=>{ 
    res.json(data)
    console.log("all User" , data)
    })
}
// 특정 한명의 유저 get
getSelectUsers = async(req:Request, res:Response)=>{
	let name = req.params.firstName;
  	const userRepo = AppDataSource.getRepository(User);
    await userRepo.findOne({where:{ firstName: name}})
      .then((data)=>{ 
      res.json(data)
      })
}
// 업데이트 
  updateUser = async (req: Request, res: Response) => {
    const userRepo = AppDataSource.getRepository(User);
    const beforeName = req.body.beforeName;
    const newName = req.body.newName;
    let user = await userRepo.findOne({ where: { lastName: beforeName } });
    if (!user) {
      return res.json({ MSG: "NOT_FOUND" });
    }
    user.lastName = newName;
    await userRepo.save(user);

    return res.json({
      MSG: "SUCCESS",
    });
  };
// 유저 삭제

  deleteUser = async (req: Request, res: Response) => {
    const userRepo = AppDataSource.getRepository(User);
    const deleteNames = req.body.deleteNames;
    // 첫번째 이름이 deleteNames 모든 row 찾기
    let user = await userRepo.find({ where: { firstName: deleteNames } });
    // .find에서 찾지못하여도 !user 는 빈배열로 나오기 때문에 true로 나온다.
    if (user.length === 0) {
      return res.json({ MSG: "NOT_FOUND" });
    } else {
      await userRepo.remove(user);
      return res.json({
        MSG: "SUCCESS",
      });
    }
  };

find option (축약)

  • find where and
repo.find({
	where: {
    	firstName: 'a',
        lastName:'b'
    }
})
select * from repo 
WHERE "firstName" = 'a' AND "lastName" = 'b'
  • find where or
repo.find({
	where:[{'firstName':"a"},{"firstName':"b"}]
})
select * from repo 
WHERE "firstName" = 'a' OR "firstName" = 'b'
  • find order
repo.find({
	order:{
    	firstName:"ASC",
        lastName:"DESC"
    }
})
SELECT * FROM "repo"
ORDER BY "firstName" ASC, "lastName" DESC
  • find take and skip
repo.find({
	skip:10 ,
    take:10 
})
SELECT * FROM "repo"
OFFSET 10,
LIMIT 10 
profile
개발 삽질하는 돌호랑이
post-custom-banner

0개의 댓글