티스토리 뷰

개발 일지

sequelize 사용 팁 1편

Eseak 2023. 12. 14. 18:26
반응형

sequelize 사용 팁 1편
sequelize 사용 팁 1편

 

 

목차

     

    1. 원시 쿼리 (row query)로 조회하기

    const user = await sequelize.query('select * from user where userId = 3');

     

    이렇게 sequelize(sq) 의 query 함수를 이용하면 원시 쿼리문으로 조회가 가능합니다.

     

     

     

    2. 원시 쿼리 조회 시 객체 중첩되지 않게 하기

    const user = await sequelize.query(
    	'select * from user where userId = 3',
        {
        	type: QueryTypes.SELECT
        },
    );

     

     

    type: QueryTypes.SELECT 를 추가해준다면 아래처럼 배열로 중첩되어 조회되었던 내용이

     

    {
        "data": [
            [
                {
                    "userId": 3
                }
            ],
            [
                {
                    "userId": 3
                }
            ]
        ]
    }

     

     

    이렇게 중첩되지 않은 상태로 조회가 됩니다.

     

    {
        "data": [
            {
                "userId": 3
            }
        ]
    }

     

     

    3. where 절 in 조회하기

    in 조회는 두 가지 방법이 있습니다. 귀찮은 방법은 아래와 같은 방법있고,

     

    User.findAll({
      where: {
        userId: { [Op.in]: [1,2,3] }
      }
    });

     

     

    만약 조금 더 간단히 사용하고 싶다면 아래와 같이 배열을 집어넣어 사용해도 정상적으로 동작합니다.

     

    User.findAll({
      where: {
        userId: [1,2,3]
      }
    });

     

     

    4. hasMany 와 belongsTo

    아래와 같이 userId를 fk로 가지고 있는 board 테이블이 있다고 가정하겠습니다.

     

    User.init({
    	userId: Sequelize.STRING,
    	name: Sequelize.STRING
    }, { sequelize, modelName: 'user' });
    
    
    Board.init({
    	boardId: Sequelize.STRING,
    	userid: Sequelize.STRING,
    	title: Sequelize.STRING,
    	content: Sequelize.STRING
    }, { sequelize, modelName: 'board' });

     

     

    둘의 연관 관계를 설정하여 이후에 include 등을 사용할 때 문제없이 동작하도록 설정이 가능합니다.

     

    이 때 constraints를 false 설정하면 순환 참조를 방지할 수 있습니다.

     

    User.hasMany(DB.Board, { foreignKey: 'userId', constraints: false })
    Board.belongsTo(DB.User, { foreignKey: 'userId', constraints: false })

     

     

     

    5. include 로 join 하기

    include 를 사용하여 다른 테이블을 join 할 수 있습니다. 이 때 아래와 같이 attributes 를 설정하면 원하는 컬럼만 조회하도록 설정이 가능합니다. 이는 주체가 되는 테이블에도 동일하게 적용이 가능합니다.

     

    User.findAll({
      attributes: ['userId'],
      include: [
        { model: Board, attributes: ['content'] }
      ],
    });

     

     

     

     

    6. 조회 로직 기본 옵션 예제

    아래와 같이 기본 옵션을 설정할 수 있습니다.

     

    User.findAll({
        attributes: ['userId'],
        include: [
            { model: Board, attributes: ['content'] },
        ],
        where: {
            userId: 3,
        },
        order: [['userId', 'DESC']],
        limit: 1,
    })

     

    group byoperators 를 이용하는 방법은 차차 알아보겠습니다.

     

     

    더 쓰고 싶은데 시간이 부족하네요.

     

    부족한 내용은 2탄으로 더 작성하겠습니다.

    반응형