express 실습해보기

ssomae·2024년 9월 9일

DevCourse

목록 보기
14/29
post-thumbnail

📌 로그인의 기본 로직

  • POST 를 통해 입력된 아이디가 db에 저장된 회원인지 확인한다.
  • 이를 만족한다면, 입력된 비밀번호가 id에 맞는 비밀번호인지도 확인해본다.
  • 이 둘을 만족하면 로그인 성공

우선은 간단하게 구현해보자

const express = require('express');
const app = express()
app.listen(7777);
app.use(express.json()) // http 외 모듈 'json' 사용

let db = new Map();
let id = 1; //객체 식별 아이디

// 로그인
app.post('/login', function (req, res) {
    console.log(req.body); //id, pwd

    //id가 db에 저장된 회원인지 확인
    const { userId, password } = req.body;
    db.forEach(function (user, id) {
        //console.log(user.userId);
        if (user.userId === userId) {
            console.log('ID 매칭 성공');
            
            //넘어온 pwd가 id에 맞는 비밀번호인지
            if (user.password === password) {
                console.log("password 매칭성공");
            } else {
                console.log("password 매칭 실패");
            }
        }
    })

})

// 회원 가입
app.post('/join', function (req, res) {
    console.log(req.body);
    // 입력된 body 객체가 비어 있지 않은지 확인
    if (Object.keys(req.body).length !== 0) {
        // 예시로 ID를 부여하는 방식을 간단히 시뮬레이션
        db.set(id++, req.body);

        res.status(201).json({
            message: `${req.body.name}님 환영합니다.`
        });
    } else {
        res.status(400).json({
            message: `입력값을 다시 확인해주세요.`
        });
    }
});

기본적인 기능은 잘 작동한다.

예외 사항 추가해보기

const express = require('express');
const app = express()
app.listen(7777);
app.use(express.json()) // http 외 모듈 'json' 사용

let db = new Map();
let id = 1; //객체 식별 아이디

// 로그인
app.post('/login', function (req, res) {
    console.log(req.body); //id, pwd

    //id가 db에 저장된 회원인지 확인
    const { userId, password } = req.body;
    //let hasUserId = false;
    let loginUser = {};
    db.forEach(function (user, id) {
        //console.log(user.userId);
        if (user.userId === userId) {
            loginUser = user;
        } 
    })
    
    if (loginUser) {
        console.log('ID 매칭 성공');
        //넘어온 pwd가 id에 맞는 비밀번호인지
        if (loginUser.password === password) {
            console.log("password 매칭성공");
        } else {
            console.log("password 매칭 실패");
        }
    } else {
       console.log('입력하신 아이디는 없는 아이디 입니다.');
    }
})

if (loginUser) 가 의미하는 바는, 객체가 비어있을 경우 다시 말해, 위에 forEach 문에서 아무것도 찾지 못했을 때를 의미하는데, 빈 객체도 비어있는것으로 해석하지 않기 때문에 다른 방법을 찾아야한다.

빈 객체 확인하기

const obj1 = {};
const obj2 = { message: '비어있지 않음' };
const num = 1;
const str = "one";
const str2 = ""; // 문자열도 객체입니다.?? -> 객체처럼 사용한다는게 맞는 말인듯

console.log(Object.keys(obj1).length === 0); // length === 0 
console.log(Object.keys(obj2).length !== 0); // length === 1

console.log(Object.keys(num).length); // 0
console.log(Object.keys(str).length); // 3
console.log(Object.keys(str2).length); // 3

function isEmpty(obj) {
    if (Object.keys(obj).length === 0) return true;
    else return false;
}
  • 이를 이용해 이전의 코드를 고도화 시켜보자
const express = require('express');
const app = express()
app.listen(7777);
app.use(express.json()) // http 외 모듈 'json' 사용

let db = new Map();
let id = 1; //객체 식별 아이디

function isExist(obj) {
    if (Object.keys(obj).length) return true;
    else return false;
}
// 로그인
app.post('/login', function (req, res) {
    console.log(req.body); //id, pwd

    //id가 db에 저장된 회원인지 확인
    const { userId, password } = req.body;
    //let hasUserId = false;
    let loginUser = {};
    db.forEach(function (user, id) {
        //console.log(user.userId);
        if (user.userId === userId) {
            loginUser = user;
        } 
    })
    
    if (isExist(loginUser)) {
        console.log('ID 매칭 성공');
        //넘어온 pwd가 id에 맞는 비밀번호인지
        if (loginUser.password === password) {
            console.log("password 매칭성공");
        } else {
            console.log("password 매칭 실패");
        }
    } else {
       console.log('입력하신 아이디는 없는 아이디 입니다.');
    }
})

📌 채널 API 설계해보기

URL, http methods/status, req, res 를 모두 고려해보자

  • 채널
    • 채널 생성
    • 채널 수정
    • 채널 삭제
  • 채널 생성 : POST/channels
    • req : channelTitle
    • res 201 : 완료 메세지
  • 채널 개별 수정: PUT/channels/:id
    • req : URL (id), 수정할 데이터 (채널명)
    • res 200 : 완료 메세지
  • 채널 개별 삭제 : DELETE/channels/:id
    • req : URL(id)
    • res 200: 완료 메세지
  • 채널 전체 조회 : GET/channels
    • req : X
    • res 200: 전체 조회 데이터
  • 채널 개별 조회 : GET/channels/:id
    • req : URL(id)
    • res 200 : 개별 조회 데이터
const express = require('express');
const app = express();
app.listen(7777);
app.use(express.json());

let db = new Map();
let id = 1;

//채널 개별 생성
app.post('/channels');

//채널 개별 수정
app.put('/channels/:id');

//채널 개별 삭제
app.delete('/channels/:id');

//채널 전체 조회
app.get('/channels');

//채널 개별 조회
app.get('/channels/:id');
  • 기본 틀을 잡아주고 같은 URL 끼리 묶어서 라우팅을 진행해주자
const express = require('express');
const app = express();
app.listen(7777);
app.use(express.json());

let db = new Map();
let id = 1;

app
    .route('/channels')
    .get((req, res) => {
        res.send("개별 생성")
    }) //채널 개별 생성
    .post((req, res) => {
        res.send("전체 조회")
    }) //채널 전체 조회

app
    .route('/channels/:id')
    .put((req, res) => {
        res.send("개별 수정")
    }) //채널 개별 수정
    .delete((req, res) => {
        res.send("개별 삭제")
    }) //채널 개별 삭제
    .get((req, res) => {
        res.send("개별 조회")
    }) //채널 개별 조회

채널 개별 생성, 개별 조회

app
    .route('/channels')
    .get((req, res) => {
        res.send("전체 조회")
    }) //채널 전체 조회
    .post((req, res) => {
        const { channelTitle } = req.body;
        if (channelTitle) {
            db.set(id++, req.body);
            res.status(201).json({
                message: `${channelTitle}채널을 응원합니다`
            });
        } else {
            res.status(400).json({
                message : "채널명이 없습니다"
            })
        }
    }) //채널 개별 생성
app
    .route('/channels/:id')
    .put((req, res) => {
        res.send("개별 수정")
    }) //채널 개별 수정

    .delete((req, res) => {
        res.send("개별 삭제")
    }) //채널 개별 삭제

    .get((req, res) => {
        let { id } = req.params;
        id = parseInt(id);
        channelInfo = db.get(id);
        if (channelInfo) {
            res.status(200).json(channelInfo);
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 조회

채널 삭제, 수정

app
    .route('/channels/:id')
    .put((req, res) => {
        let { id } = req.params;
        id = parseInt(id);

        let channelInfo = db.get(id);
        let prevChannelTitle = channelInfo.channelTitle;
        if (channelInfo) {
            let newTitle = req.body.channelTitle;
            channelInfo.channelTitle = newTitle;
            db.set(id, channelInfo);

            res.json({
                message : `채널명이 정상적으로 수정되었습니다. 기존 ${prevChannelTitle} -> 수정 ${newTitle}`
            })
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 수정

    .delete((req, res) => {
        let { id } = req.params;
        id = parseInt(id);
        const channelInfo = db.get(id);
        if (channelInfo) {
            db.delete(id);
            res.status(200).json({
                message:`${channelInfo.channelTitle}님 채널이 정상적으로 삭제되었습니다`
            })
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 삭제

채널 전체 조회

app
    .route('/channels')
    .get((req, res) => {
        if (db.size) {
            let channels = [];
            db.forEach(function (value, key) {
                channels.push(value);
            })
            res.status(200).json(channels);
        } else {
            res.status(404).json({
                message:'조회할 채널이 없습니다'
            })
        }
    }) //채널 전체 조회

전체 코드

const e = require('express');
const express = require('express');
const app = express();
app.listen(7777);
app.use(express.json());

let db = new Map();
let id = 1;

app
    .route('/channels')
    .get((req, res) => {
        if (db.size) {
            let channels = [];
            db.forEach(function (value, key) {
                channels.push(value);
            })
            res.status(200).json(channels);
        } else {
            res.status(404).json({
                message:'조회할 채널이 없습니다'
            })
        }
    }) //채널 전체 조회
    .post((req, res) => {
        const { channelTitle } = req.body;
        if (channelTitle) {
            db.set(id++, req.body);
            res.status(201).json({
                message: `${channelTitle}채널을 응원합니다`
            });
        } else {
            res.status(400).json({
                message : "채널명이 없습니다"
            })
        }
    }) //채널 개별 생성

app
    .route('/channels/:id')
    .put((req, res) => {
        let { id } = req.params;
        id = parseInt(id);

        let channelInfo = db.get(id);
        let prevChannelTitle = channelInfo.channelTitle;
        if (channelInfo) {
            let newTitle = req.body.channelTitle;
            channelInfo.channelTitle = newTitle;
            db.set(id, channelInfo);

            res.json({
                message : `채널명이 정상적으로 수정되었습니다. 기존 ${prevChannelTitle} -> 수정 ${newTitle}`
            })
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 수정

    .delete((req, res) => {
        let { id } = req.params;
        id = parseInt(id);
        const channelInfo = db.get(id);
        if (channelInfo) {
            db.delete(id);
            res.status(200).json({
                message:`${channelInfo.channelTitle}님 채널이 정상적으로 삭제되었습니다`
            })
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 삭제

    .get((req, res) => {
        let { id } = req.params;
        id = parseInt(id);
        const channelInfo = db.get(id);
        if (channelInfo) {
            res.status(200).json(channelInfo);
        } else {
            res.status(404).json({
                message : '채널 정보를 찾을 수 없습니다'
            })
        }
    }) //채널 개별 조회
profile
성장해나갈 개발자

0개의 댓글