Seongwon Lim

[node.js] Sequelize를 이용하여 Mysql CRUD 기능 구현하기 본문

Node.js

[node.js] Sequelize를 이용하여 Mysql CRUD 기능 구현하기

limsw 2022. 5. 10. 14:26
반응형

들어가기

[node.js] Sequelize를 이용하여 Mysql Create 구현하기

데이터베이스에 데이터를 추가하는 Create에 관한 내용은 이전 포스팅에서 다루었으므로 이번 포스팅 글에서는 Create를 제외한 RUD에 관한 내용을 다룰 것이다. 따라서 Create 내용이 궁금한 분들은 위 포스팅 글을 참고하면 좋을 것 같다.

 

또한 초기 데이터로 Users 테이블에 위와 같이 데이터가 들어 있는 상태에서 예제를 살펴볼 예정이다.

Read 기능 구현하기

Seqeulize를 이용해서 조회 기능을 구현할 때에는 findOne(), findAll() 등의 메서드를 이용한다.

  • findOne : 데이터 단일 조회 시 사용
  • findAll : 특정 조건을 가진 데이터 전체 조회 시 사용

1. findOne()을 이용한 단일 조회

router.get('/', (req, res, next) => {
    models.Users.findOne({}) // {} 안에 조건을 추가할 수 있다.
    .then((user) => {
        res.status(200).json(user);
    });
});

위와 같이 코드를 정의하고 localhost:3000/register로 GET 호출을 하면 Users 테이블의 제일 첫번째 데이터를 리턴으로 받을 수 있다.


Postman을 통해서 살펴본 요청 결과이다. 첫번째 데이터를 Json 형태로 받을 것을 확인할 수 있다.

2. findAll()을 이용한 전체 조회

findAll()을 이용하면 조건을 걸어서 해당 조건에 부합하는 모든 데이터를 가져오는 경우 사용되거나 특정 컬럼 전체를 가져올 때 사용된다.

조건에 부합하는 데이터를 가져오는 경우

router.get('/', (req, res, next) => {
    models.Users.findAll({
        where: { // where을 통해서 필터링된 데이터를 가져올 수 있다.
            deletedAt: null
        }
    })
    .then((user) => {
        res.status(200).json(user);
    });
});

조건에 deletedAt 컬럼의 데이터가 null인 데이터를 모두 가져오는 경우이며 결과는 위처럼 3개의 데이터를 모두 반환한 것을 확인할 수 있다.

특정 컬럼의 데이터를 가져오는 경우

router.get('/', (req, res, next) => {
    models.Users.findAll({
        attributes: ['email', 'name'] // attributes를 사용하고 배열의 값에 리턴받을 컬럼명을 입력한다.
    })
    .then((user) => {
        res.status(200).json(user);
    });
});

attributes 의 배열 값으로 email, name 2개의 컬럼을 입력했으므로 GET 요청을 보냈을 때 위와같이 테이블에서 email, name에 해당하는 컬럼을 모두 가져온 것을 확인할 수 있다.


Update 기능 구현하기

Seqeulize를 이용해서 수정 기능을 구현할 때에는 update() 메서드를 이용한다.


Restful 하게 코드를 구현하기 위해서 요청은 PUT 또는 PATCH로 보내야 한다. 또한 필자는 일부 데이터만 수정하는 예시를 들 것이므로 PATCH를 사용했다.

update()를 이용한 데이터 수정

router.patch('/', (res, req, next) => {
    models.Users.update({name: "limsw"}, { where: { name: "lim" }
    })
    .then((result) => {
        res.status(200).send();
    })
    .catch((err) => {
        res.send(err);
    })
});

update() 안에 중괄호를 통해서 수정할 데이터를 지정할 수 있으며 2번째 중괄호는 조건을 걸 수 있다.


위의 경우는 테이블의 name 컬럼에서 lim이라는 데이터를 가진 것을 찾아서 limsw로 바꾸는 예제이다. 결과는 아래와 같다.


Delete 기능 구현하기

Seqeulize를 이용해서 수정 기능을 구현할 때에는 destroy() 메서드를 이용한다. 요청은 delete를 사용했고 destroy() 또한 조건을 줄 수 있다.


조건을 주지 않을 경우 모든 데이터가 삭제될 수 있으므로 유의해야 한다.

destroy()를 이용한 데이터 삭제

router.delete('/', (res, req, next) => {
    models.Users.destroy({
        where: {
            name: "kim"
        }
    })
    .then((result) => {
        res.status(204).send();
    })
    .catch((err) => {
        res.send(err);
    })
});

위처럼 destroy() 메서드 안에 조건을 추가할 수 있다. 필자는 name 컬럼의 데이터 값이 kim인 데이터를 삭제했다. 삭제된 결과는 아래와 같다.


현재 데이터 자체가 실제로 삭제 되지는 않았지만 deletedAt 컬럼의 값이 수정된 것을 확인할 수 있다. 필자는 User.js에서 모델을 정의할 때 데이터가 삭제된 경우 타임스탬프를 남기도록 설정했기 때문에 위와 같이 결과가 나타난 것이다.

사용자 설정에 맞게 모델을 정의하고 위와 같이 destory() 를 수행한다면 조건에 부합하는 데이터를 삭제할 수 있다.

Comments