TIL

23/11/18 TIL __ ์—๋Ÿฌ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด ๊ตฌํ˜„

GABOJOK 2023. 11. 18. 23:32

 

 

 

๐Ÿฅ์ƒํ™ฉ

๊ฐœ์ธ๊ณผ์ œ๋ฅผ 1์ฐจ์ ์œผ๋กœ ์™„์„ฑํ•˜๊ณ  ๊ณต์œ ํ–ˆ์„๋•Œ,

์—๋Ÿฌ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋นผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ง์„ ๋“ค์—ˆ๋‹ค.

 

 

์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋”ฐ๋กœ ๋นผ๊ฒŒ๋˜๋ฉด, ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๊ณ , 

๋™์ผํ•œ ์—๋Ÿฌ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

๐Ÿค  ์‹œ๋„

 

์ผ๋‹จ ์—๋Ÿฌ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์•ž์„œ next ๋ผ๋Š” ์• ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ–ˆ๋‹ค.

 

next()  :  ๋ฏธ๋“ค์›จ์–ด ์ž‘๋™์— ์žˆ์–ด์„œ ๋‹ค์Œ์œผ๋กœ ๋„˜๊ธฐ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

try ๋ฌธ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

throw ๋ฅผ ํ†ตํ•ด ํŠน์ • ์—๋Ÿฌ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ catch๋ฌธ์—์„œ  ๋˜์กŒ๋˜ ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์„œ next๋กœ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ„ ์—๋Ÿฌ๋Š” ๊ฐ ์—๋Ÿฌ์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค.

 

 

 

์ƒํ’ˆ ์ˆ˜์ •ํ•˜๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณธ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ธ์ž๋กœ req, res, next๋ฅผ ์ฃผ๊ณ , 

๋งŒ์•ฝ  ํŒŒ๋žŒ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ƒํ’ˆ์ด ์—†๋Š” ๊ฒฝ์šฐ, ProductDosntExistError() ๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด throw๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

//์ƒํ’ˆ ์ˆ˜์ •ํ•˜๊ธฐ
router.patch('/product/:id', authMiddleware, newProductValidation, async (req, res, next) => {
	try {
		const { product_name, comment, status, price } = req.body;
		const { id } = req.params;

		const willModifyData = await Product.findOne({ where: { id } });

		if (!willModifyData) {
			throw new ProductDosntExistError();
		}

		const writerId = willModifyData.user_id;
		const userId = res.locals.user.id;
		if (writerId !== userId) {
			throw new NoPermissionError();
		}

		await Product.update({ product_name, comment, status, price }, { where: { id } });
		return res.status(200).json({ message: '์ƒํ’ˆ์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' });
	} catch (err) {
		next(err);
	}
});

 

 

 

์ด new  ProductDosntExistError()๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ,

ํ•ด๋‹น ํŒŒ์ผ์˜ ์ƒ๋‹จ์—, require ํ˜น์€ import๋ฅผ ํ•ด์™€์•ผ ํ•œ๋‹ค.

 

๋˜ํ•œ, ์–ด๋””์„ ๊ฐ€ exports๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ,

๋‚˜์˜ ๊ฒฝ์šฐ, CustomError.js ๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด,

Error๋กœ ๋ถ€ํ„ฐ ์ž์‹  class๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ฃผ๊ณ ,

ํ•ด๋‹น ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ๊ฐ์— ๋งž๊ฒŒ ์ง€์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

 

 

 

CustomError.js ํŒŒ์ผ

class ProductDosntExistError extends Error {
	constructor(message) {
		super(message);
		this.name = 'ProductDosntExistError';
	}
}

class NoPermissionError extends Error {
	constructor(message) {
		super(message);
		this.name = 'NoPermissionError';
	}
}

module.exports = {
	ProductDosntExistError,
	NoPermissionError
};

 

 

 

ErrorHandler.js ํŒŒ์ผ

const ErrorHandler = (err, req, res, next) => {
	if (err.name === 'ProductDosntExistError') {
		return res.status(400).json({ success: false, erroerMessage: '์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํ’ˆ์ž…๋‹ˆ๋‹ค.' });
	}
	if (err.name === 'NoPermissionError') {
		return res.status(400).json({ success: false, erroerMessage: '์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹˜์œผ๋กœ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.' });
	}
	res.status(500).json({ success: false, erroerMessage: '์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ž ์‹œํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.' });
};

module.exports = ErrorHandler;

 

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด์ ์ธ ์„ค์ •์€ app.js์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.

ํ˜„์žฌ ์‚ฌ์šฉํ–ˆ๋˜ ๋ผ์šฐํ„ฐ๋“ค ๋ฐ”๋กœ ํ•˜๋‹จ์— ,

app.use()๋กœ ๋งŒ๋“ค์—ˆ๋˜ ErrorHandler ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ ๊ด„ํ˜ธ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

const UserRouter = require('./routers/user.router.js');
const ErrorHandler = require('./middleware/ErrorHandler.js');
app.use('/api', [UserRouter, ProductRouter]);
app.use(ErrorHandler);

 

 

 

 

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์—๋Ÿฌ๋ฅผ ์ปจํŠธ๋กค ํ•˜๋‹ˆ, ๋™์ผํ•œ ๊ฒฝ์šฐ์— ๊ฐ๊ฐ ์จ์ค„ ํ•„์š” ์—†์ด, 

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋งŒ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด ์ฃผ๋ฉด ๋์ด๋ผ ๊ฐ„ํŽธํ–ˆ๋‹ค.!!!

ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ๊ณ , ์—๋Ÿฌ ํ—จ๋“ค๋Ÿฌ ํ• ๊ฒŒ ๋งŽ์„ ์ˆ˜๋ก ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๋˜ํ•œ next์— ๋Œ€ํ•ด ์• ๋งคํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, 

์ด๋ฒˆ ๊ธฐํšŒ์— ํ™•์‹คํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด์„œ ์ข€๋” ๋งŽ์ด ์ดํ•ดํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์กฐ๊ฑด ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ๋งŒ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ณด์ž๋ฉด,

์—๋Ÿฌ๊ฐ€ ๋งŽ์ด ๊ฒน์น˜์ง€ ์•Š๊ณ , ์—๋Ÿฌ๊ฐ€ ์ ์€๋ฐ, ํ™•์žฅ๊ฐ€๋Šฅ์„ฑ๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” 

๊ตณ์ด ์“ฐ์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.