๐Ÿ“Œ ๋ฌธ์ œ 1 :

์ด๋ฒˆ์— ์„œ๋ฒ„ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋‹ค๋ณด๋‹ˆ GET์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

 

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด /Dashboard๋กœ GET์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๋˜์–ด ์žˆ๋Š”๋ฐ ์™œ ์•ˆ๋˜๋Š”์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด์ž...ํ›„....

 

๋จผ์ €, ์•„๋ž˜๋Š” ํด๋ผ์ด์–ธํŠธ์ธก์˜ get์š”์ฒญ ์ง„์ž…์ ์ด๋‹ค.

    const handleLogin = (event) => {
        event.preventDefault();
        toast.info('Navigating to VT CAS login page...');
        const casLoginUrl = 'https://login.vt.edu/profile/cas/login?service=https://crescendo.cs.vt.edu:8080/Dashboard';
        window.location.href = casLoginUrl;
    };

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด /Dashboard๋กœ ๋ผ์šฐํŒ… ๋œ๋‹ค.

 

๋‹ค์Œ์€ ์„œ๋ฒ„์ธก ๋ผ์šฐํŒ… ์„ค์ •์„ ํ™•์ธ ํ•ด๋ณด์ž.

app.use('/auth', require('./routes/authRoutes'));

 

์ด ๋ผ์ธ์€ '/auth' ๊ฒฝ๋กœ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์„ authRoutes ํŒŒ์ผ๋กœ ๋ผ์šฐํŒ… ํ•œ๋‹ค.

 

์–ด ๊ทผ๋ฐ... ์ง€๊ธˆ ๋‹ค์‹œ๋ณด๋‹ˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ /Dashboard ๋ผ๊ณ ๋งŒ ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค. ๋ฐฉ๊ธˆ ๋งํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ๊ฒฝ๋กœ๋ฅผ ์ž˜๋ชป ์„ค์ •ํ•ด ๋ฐœ์ƒํ•œ ์ผ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ ์น˜๋‹ˆ ์ œ๋Œ€๋กœ ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค.

 

๐Ÿ“Œ ๋ฌธ์ œ 2:

์ฝ”์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ฝ”์Šค๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋œธ... ์ด๊ฒƒ๋„ 99% ๊ฒฝ๋กœ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•œ๋‹ค. ์ผ๋‹จ ๋ณด์ž....

 

๋จผ์ €, ์„œ๋ฒ„ ํŒŒ์ผ์„ ํ™•์ธํ•ด ๋ผ์šฐํŒ… ์„ค์ •์„ ํ™•์ธ ํ•ด์ค€๋‹ค.

app.use('/courses', require('./routes/courseRoutes'));

 

์ด ๋ผ์ธ์€ '/courses' ๊ฒฝ๋กœ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์„ courseRoutes ํŒŒ์ผ๋กœ ๋ผ์šฐํŒ… ํ•œ๋‹ค.

 

์ด์ œ, courseRoutes๋ฅผ ํ™•์ธ ํ•ด๋ณด์ž.

const express = require('express');
const router = express.Router();
const courseController = require('../controllers/courseController');

router.post('/create', courseController.createCourse);
router.post('/register', courseController.registerCourse);
router.get('/', courseController.getCourses);
router.get('/:courseId', courseController.getCourse);
router.put('/:courseId', courseController.updateCourse);
router.delete('/:courseId', courseController.deleteCourse);

module.exports = router;

 

๋ผ์šฐํ„ฐ ์„ค์ •


-express.Router()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํ„ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
-courseController์—์„œ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค.


๋ผ์šฐํ„ฐ ์—”๋“œํฌ์ธํŠธ


router.post('/create', courseController.createCourse): ๊ฐ•์ขŒ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ. POST /create ์š”์ฒญ์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๊ฐ•์ขŒ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
router.post('/register', courseController.registerCourse): ๊ฐ•์ขŒ ๋“ฑ๋ก ์—”๋“œํฌ์ธํŠธ. POST /register ์š”์ฒญ์„ ๋ฐ›์•„ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ•์ขŒ์— ๋“ฑ๋กํ•œ๋‹ค.
router.get('/', courseController.getCourses): ๊ฐ•์ขŒ ๋ชฉ๋ก ์กฐํšŒ ์—”๋“œํฌ์ธํŠธ. GET / ์š”์ฒญ์„ ๋ฐ›์•„ ๋ชจ๋“  ๊ฐ•์ขŒ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
router.get('/:courseId', courseController.getCourse): ํŠน์ • ๊ฐ•์ขŒ ์กฐํšŒ ์—”๋“œํฌ์ธํŠธ. GET /:courseId ์š”์ฒญ์„ ๋ฐ›์•„ ํŠน์ • ID์˜ ๊ฐ•์ขŒ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
router.put('/:courseId', courseController.updateCourse): ๊ฐ•์ขŒ ์—…๋ฐ์ดํŠธ ์—”๋“œํฌ์ธํŠธ. PUT /:courseId ์š”์ฒญ์„ ๋ฐ›์•„ ํŠน์ • ID์˜ ๊ฐ•์ขŒ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
router.delete('/:courseId', courseController.deleteCourse): ๊ฐ•์ขŒ ์‚ญ์ œ ์—”๋“œํฌ์ธํŠธ. DELETE /:courseId ์š”์ฒญ์„ ๋ฐ›์•„ ํŠน์ • ID์˜ ๊ฐ•์ขŒ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

๋ชจ๋‘ ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ๋Š”๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ์ชฝ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

    const handleCreateCourse = async () => {
        try {
            const response = await axios.post('https://crescendo.cs.vt.edu:8080/createCourse', {
                name: courseName,
                term: term,
                crn: crn
            }, {
                withCredentials: true,
                headers: {
                    'Content-Type': 'application/json'
                }
            });

            if (response.status === 201) {
                toast.success('Course created successfully!');
                setCourses([...courses, response.data]);
                setShowModal(false);
                setCourseName('');
                setTerm('');
                setCrn('');
                setSelectedCourseId(null); 
            }
        } catch (error) {
            toast.error('Failed to create course');
            console.error('Error creating course:', error);
        }
    };

 

์—ญ์‹œ๋‚˜! ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋˜์–ด ์ €๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

https://crescendo.cs.vt.edu:8080/courses/create ์˜ ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ์ œ๋Œ€๋กœ ๋œ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ ๋ฌธ์ œ 3: ์ฝ”์Šค ์‚ญ์ œ ๋ถˆ๊ฐ€

์ƒ์„ฑ๋œ Course๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์ž๊พธ 404 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ. ์ด๊ฑด ํ™•์ธํ•ด๋ณด๋‹ˆ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์˜€๋‹ค.

 

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค : ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” req.params.id๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋ผ์šฐํŠธ์—์„œ๋Š” :courseId๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ์ผ์น˜์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด...

 

Express.js์—์„œ ๋ผ์šฐํŠธ๋ฅผ ์ •์˜ํ•  ๋•Œ, URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฝœ๋ก (:)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


์ด์ „ ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์šฐํŠธ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์—ˆ๋‹ค:


router.delete('/:courseId', courseController.deleteCourse);


์—ฌ๊ธฐ์„œ :courseId๋Š” URL ํŒŒ๋ผ๋ฏธํ„ฐ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /courses/123์ด๋ผ๋Š” ์š”์ฒญ์ด ์˜ค๋ฉด, 123์ด courseId ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ํ•จ์ˆ˜์—์„œ๋Š” ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋‹ค:


const courseId = req.params.id;


์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ผ์šฐํŠธ์—์„œ๋Š” :courseId๋กœ ์ •์˜ํ–ˆ์ง€๋งŒ, ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” id๋กœ ์ ‘๊ทผํ•˜๊ณ  ์žˆ์–ด ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค:

๋ผ์šฐํŠธ ์ •์˜๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ผ์น˜์‹œํ‚ค๊ธฐ:
router.delete('/:id', courseController.deleteCourse);

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ผ์šฐํŠธ์™€ ์ผ์น˜์‹œํ‚ค๊ธฐ:
const courseId = req.params.courseId;


๋‘ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ์ผ์น˜์‹œํ‚ค๋ฉด, ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ course ID๋ฅผ ๋ฐ›์•„ ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด courseId๊ฐ€ undefined๊ฐ€ ๋˜์–ด course๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. 

+ Recent posts