[SQL] 프론트엔드 개발자도 sequelize, SQL 궁금해!

MINEW·2022년 12월 12일
0

백엔드 데이터 관리는 어떻게 해?

Node.js에서 데이터를 관리하는 방법에 관심이 생겼는데, 어떤 것부터 공부해야 할까?
우리는 SQL로 코드를 작성할 수 있고, sequelize를 이용해서 코드를 작성할 수도 있다.
그럼, sequelize랑 SQL은 무슨 차이가 있을까?
* 주의! 백엔드에 막 입문한 사람의 글 입니다.

sequelize를 알아보자

  1. ORM
    - sequelize는 Node.js에서 사용하는 대표적인 ORM 입니다.
    - ORM은 데이터베이스와 데이터베이스 테이블을 프로그래밍 할 때와 같이 객체처럼 사용할 수 있게 해주는 방식입니다.
    - 직접 SQL문을 날리지 않아도, 객체 형태로 데이터베이스에 접근해 객체를 추가, 수정, 삭제, 조회 등을 가능하게 해줍니다.
    - 즉, SQL을 사용하는 대신 자바스크립트 코드로 데이터베이스를 사용할 수 있게 만들어줍니다.

  2. 시퀄라이즈의 정의
    - sequelize는 Node.js에서 raw SQL문을 쓰지 않고도, 자바스크립트만으로 데이터베이스를 다룰 수 있는 라이브러리 입니다.
    - 자바스크립트 구문을 작성하면, SQL로 변환해주는 역할을 합니다.
    - 물론, 메서드로 raw SQL문을 삽입해서 사용할 수도 있습니다.

  3. 시퀄라이즈 사용 이유
    - 개발자의 의도가 명확히 보이는 메서드를 사용합니다.
    - 유지보수가 편리하고 가독성이 높습니다. 한 줄의 SQL문으로 작성하는 대신, 동작을 나눠서 코드를 완성할 수 있습니다.

SQL을 알아보자

  1. SQL의 정의
    - SQL은 데이터베이스를 관리하기 위한 목적의 프로그래밍 언어입니다.
    - 데이터베이스란 데이터를 모아둔 공간을 의미하는데, 프로그래머들은 SQL을 사용해서 데이터베이스를 설계하거나 운영하고 관리합니다.
    - 데이터를 추가, 수정, 삭제, 조회 등을 할 수 있습니다.
    - 규칙이 엄격하고, 역사가 깊어서 안정적입니다.

  2. SQL 사용 이유
    - SQL은 데이터에 접근하기 위해 필수적인 수단입니다.
    - 개발자 뿐 아니라 마케터나 데이터 분석가들도 SQL을 사용하여 서비스의 데이터(매출, 고객 정보 등)를 분석합니다. SQL은 다양한 분야의 동료들과 데이터에 관한 소통을 할 수 있는 언어입니다.

sequelize와 SQL의 차이점은 뭘까?

  1. 가독성
    - sequelize는 개발자의 의도가 명확히 보이는 메서드를 사용합니다.
    - 한 줄의 SQL문으로 작성해야하는 동작들을, sequelize는 분리해서 작성할 수 있습니다. 그로인해 유지보수가 편리해지고 가독성이 높아집니다.
    - 단, 작성하고자 하는 동작이 복잡해질수록 SQL문을 사용하는 것이 더 가독성이 좋습니다.

  2. 프로젝트 규모
    - 프로젝트가 작을수록, sequelize를 사용해서 간단한 코드로 분리해 작성하는 것이 가독성이 좋고 유지보수에 편리합니다.
    - 프로젝트가 커질수록, 코드가 복잡해지기 때문에 SQL문을 사용하는 것이 더 간단하고 직관적입니다.

  3. 제공하는 방식
    - sequelize는 서브 쿼리, 조인 등 특정 작업을 할 때, SQL문과 비교해 제공하는 방식이 제한적입니다. ORM이 정해놓은 명령만 사용할 수 있습니다.
    - SQL문은 raw하게 원하는 동작을 작성하면 됩니다.

sequelize vs SQL 간단한 코드 비교

  1. 간단한 코드 예시
    item 테이블에 id, name, price, size, inventory_count, gender 컬럼이 있다고 가정해봅시다.
    이 중 item 테이블에 있는 price 컬럼만 제외한 컬럼들만 조회하고 싶다면 어떻게 해야할까요?

  2. 시퀄라이즈 ver.

const items = await item.findAll({
  attributes: {
    exclude: ['price'], // 조회하고 싶지 않은 컬럼명만 제외할 수 있습니다
  },
  where: { gender: 'f' },
});
res.send(items);
  1. SQL ver.
USE copang_main;
SELECT 
    id, -- 조회하고자 하는 컬럼명을 모두 나열해야 합니다
    name,
    size,
    inventory_count,
    gender
FROM item
WHERE gender = 'f';

sequelize vs SQL 복잡한 코드 비교

  1. 복잡한 코드 예시
    job_openings 테이블에 id, company_id, 채용포지션, 채용보상금, 사용기술, 채용내용 컬럼이 있고,
    companies 테이블에 id, 회사명, 국가, 지역, email, password 컬럼이 있다고 가정해봅시다.
    다음과 같은 조건을 가진 row들만 조회하고 싶다면 어떻게 해야할까요?
    조건 1) job_openings 테이블에 companies 테이블을 조인합니다.
    조건 2) job_openings 테이블의 company_id와 companies 테이블의 id가 동일해야 합니다.
    조건 3) job_openings 테이블에서는 id, 채용포지션, 채용보상금, 사용기술 컬럼만 조회해야 합니다.
    조건 4) companies 테이블에서는 회사명, 국가, 지역 컬럼만 조회해야 합니다.
    조건 5) 조인한 테이블의 row 중 request로 들어오는 검색어가 포함되어 있는 row만 반환해야 합니다.

  2. 시퀄라이즈 ver.

// models/index.js
db.companies.hasMany(db.job_openings, { as: "job_openings" });
db.job_openings.belongsTo(db.companies, {
  foreignKey: "company_id",
  as: "companies"
});

// controllers/jobOpeningController.js
const getAllJobOpenings = async (req, res) => {
  const { search } = req.query;

  const JobOpeningList = await job_openings.findAll({
    raw: true,
    include: [
      {
        model: companies,
        as: "companies",
        attributes: [
          '회사명',
          '국가',
          '지역',
        ],
      },
    ],
    attributes: [
      ['id', '채용공고_id'],
      '채용포지션',
      '채용보상금',
      '사용기술',
    ],
  });

  const searchJobOpeningList = [];
  JobOpeningList.forEach((JobOpening) => {
    const companyName = JobOpening["companies.회사명"];
    const companyCountry = JobOpening["companies.국가"];
    const companyRegion = JobOpening["companies.지역"];

    delete JobOpening["companies.회사명"];
    delete JobOpening["companies.국가"];
    delete JobOpening["companies.지역"];

    JobOpening.회사명 = companyName;
    JobOpening.국가 = companyCountry;
    JobOpening.지역 = companyRegion;

    const searchTerm = isNaN(search) ? search : Number(search);
    const isIncludesWord = Object.values(JobOpening).includes(searchTerm);
    const isNotId = JobOpening["채용공고_id"] !== searchTerm;
    if (isIncludesWord && isNotId) {
      searchJobOpeningList.push(JobOpening);
    }
  });

  res.send(searchJobOpeningList);
};
  1. SQL ver.
SELECT 
    JO.id AS '채용공고_id', 
    CO.회사명,
    CO.국가, 
    CO.지역, 
    JO.채용포지션, 
    JO.채용보상금, 
    JO.사용기술 
FROM crud_api_server.job_openings AS JO 
LEFT OUTER JOIN crud_api_server.companies AS CO 
ON JO.company_id = CO.id 
WHERE CO.회사명 LIKE :search 
    OR CO.국가 LIKE :search 
    OR CO.지역 LIKE :search 
    OR JO.채용포지션 LIKE :search 
    OR JO.채용보상금 LIKE :search 
    OR JO.사용기술 LIKE :search;

결론

SQL은 데이터베이스를 관리하기 위한 목적의 프로그래밍 언어이고, sequelize는 Node.js에서 raw SQL문을 쓰지 않고도 자바스크립트만으로 데이터베이스를 다룰 수 있는 라이브러리입니다.
SQL과 sequelize 둘다 데이터 베이스에 접근해 데이터를 추가, 수정, 삭제, 조회 등을 가능하게 합니다.
간단한 동작을 하는 규모가 작은 프로젝트는 sequelize를 사용하는 것이 좋고, 복잡한 동작을 하는 규모가 큰 프로젝트에서는 SQL를 사용하는 것이 좋습니다.
필자와 같은 백엔드 입문자는 SQL을 학습하고, sequelize를 학습하는게 좋습니다.
sequelize를 먼저 살짝 알아보고 SQL을 공부했는데, 처음 sequelize를 공부할 때 헷갈렸던 부분이 SQL을 공부하니까 SQL을 기준으로 약간 변형해서 사용하는 느낌이었습니다.
예를 들어, SQL으로 WHERE와 ORDER BY를 이해하고 나서는 where나 order와 같은 속성들의 사용 방법과 사용 순서를 금방 이해할 수 있었습니다.

개인적으로는 SQL을 공부할 때보다 sequelize를 공부할 때가 더 어렵게 느껴졌습니다.
SQL은 원하는 동작을 코드로 작성하면 예상하는 결과가 금방 나온 반면, sequelize로 작성할 때는 작성하고자하는 코드와 관련된 명령어가 존재하는지 확인해야했기 때문에 해당 부분에서 상당히 많은 시간을 소요해야 했습니다.
그럼에도 sequelize는 사용하면서 중간에 콘솔로 찍어볼 수 있다는 점에서, 저와 같이 코드 중간에 확인하는 작업을 많이 하는 개발자에게는 매력적인 도구인 것 같습니다.

profile
JS, TS, React, Vue, Node.js, Express, SQL 공부한 내용을 기록하는 장소입니다

0개의 댓글