๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript] : post.destroy() / await Posts.destroy({where : {postId}})

by ๊ถŒ์Šพํ–„ 2023. 7. 14.

 

https://sequelize.org/docs/v6/core-concepts/model-instances/

 

Model Instances | Sequelize

As you already know, a model is an ES6 class. An instance of the class represents one object from that model (which maps to one row of the table in the database). This way, model instances are DAOs.

sequelize.org

 

์ œ๋ชฉ์˜ ๋‘ ์ฝ”๋“œ๋Š” ์ •ํ™•ํžˆ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋„ˆ๋ฌด ์งœ์—ฌ์ง„ ํ˜•์‹์—๋งŒ ์–ฝ๋งค์—ฌ์žˆ์—ˆ๋‚˜ ํ•˜๋Š” ๋А๋‚Œ์„ ๊ต‰์žฅํžˆ ํฌ๊ฒŒ ๋ฐ›์•˜๋‹ค.

์˜ค๋Š˜ ์ฝ”๋“œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉด์„œ "์ด๋ ‡๊ฒŒ๋„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋„ค?" ๋ผ๋Š” ๋А๋‚Œ์„ ํฌ๊ฒŒ ๋ฐ›์•„ ๋‚จ๊ฒจ๋‘”๋‹ค.

๊ธฐ์กด์— ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•˜๋˜ ์ฝ”๋“œ์ด๋‹ค.

// 5. post(๊ฒŒ์‹œ๊ธ€) ์‚ญ์ œ

router.delete('/posts/:postId', authMiddleware, async (req, res) => {
	
    const { postId } = req.params;
    const { userId } = res.locals.user;
    try {
        const post = await Posts.findOne({ where: { postId } });
        
        // ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        if (!post) {
            return res.status(403).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค..' });
        }
        
        // ๊ฒŒ์‹œ๊ธ€์˜ userId์™€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ user์˜ userId๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
        if (!userId || post.UserId !== userId) {
            return res.status(403).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๊ถŒํ•œ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.' });
        }
        
        // ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
        await Posts.destroy({ where: { postId } }).catch((err) => {
            res.status(401).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.' });
        });
        return res.status(200).json({ message: '๊ฒŒ์‹œ๊ธ€์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œํ•˜์˜€์Šต๋‹ˆ๋‹ค.' });
    } catch (error) {
        console.log(error.message);
        res.status(400).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.' });
    }
});

์˜ˆ์™ธ์ฒ˜๋ฆฌ์—์„œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์กด์žฌ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ–ˆ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ์ด๋ฏธ ํ•œ ๋ฒˆ db์— ์ ‘๊ทผํ•ด ์šฐ๋ฆฌ๊ฐ€ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” post๋ฅผ ๊ธ์–ด์™”๋‹ค.

๋‚œ ์ด๋ ‡๊ฒŒ ๊ธ์–ด์˜จ post๋ฅผ ๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜๋Š”์ง€ ์•ˆํ•˜๋Š”์ง€์˜ ํ•œ ๋ฒˆ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ–ˆ์„ ๋ฟ์ด๋‹ค.

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜จ post๋ฅผ ์‹ค์งˆ์ ์ธ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๋กœ์ง์—์„œ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์ด๋ฏธ ๊ธ์–ด์˜จ post๋ฅผ destroy() ์‹œํ‚จ ์ฝ”๋“œ
// 5. post(๊ฒŒ์‹œ๊ธ€) ์‚ญ์ œ
router.delete('/posts/:postId', authMiddleware, async (req, res) => {
    const { postId } = req.params;
    const { userId } = res.locals.user;
    try {
        const post = await Posts.findOne({ where: { postId } });
        
        // ๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        if (!post) {
            return res.status(403).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค..' });
        }
        
        // ๊ฒŒ์‹œ๊ธ€์˜ userId์™€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ user์˜ userId๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        if (!userId || post.UserId !== userId) {
            return res.status(403).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๊ถŒํ•œ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.' });
        }
		
        // ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
        post.destroy().catch((err) => {
            res.status(401).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.' });
        });
        return res.status(200).json({ message: '๊ฒŒ์‹œ๊ธ€์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œํ•˜์˜€์Šต๋‹ˆ๋‹ค.' });
    } catch (error) {
        console.log(error.message);
        res.status(400).json({ errorMessage: '๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.' });
    }
});

์ด๋Ÿฐ์‹์œผ๋กœ ๋˜‘๊ฐ™์ด destroy๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธ์–ด์˜จ post๋ฅผ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ DB์—์„œ ์กฐ๊ฑด์œผ๋กœ ์ฐพ์„ ํ•„์š”์—†์ด ์ด๋ฏธ ์ฐพ์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— await์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

#destroy #sequelize_logging