<프로그래머스 데브코스 풀스택> 2026-01-25 TIL 미니프로젝트(2) - 로그인, 빈 객체 확인하는 방법, 채널 API

로그인 : POST / login

- req : body (id, pwd)

- res : `${name}님 환영합니다` 

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

    //userId가 디비에 저장된 회원이지 확인
    const {userId, password} = req.body
    var loginUser = {}

    db.forEach(function(user, id) {
        if(user.userId === userId){
            loginUser = user         
        } 
    })

    if (isExist(loginUser)){
        console.log("같은 거 찾았다.")  
        
        if(loginUser.password === password){
            console.log("패스워드도 같다.")
        } else {
            console.log("패스워드는 틀렸다.")
        }
    } else {
        console.log("입력하신 아이디는 없는 아이디입니다.")
    }
})

🤔 빈 객체 확인하는 방법?

1️⃣ 객체.keys() : key를 가져옴 💡연습 추천!

2️⃣ for in문 : 전체 순회해야되기 때문에 추천하지않음.

3️⃣ lodash 라이브러리 : isEmpty

const obj1 = {}
const obj2 = {message : "안 빔"}
const num = 1
const str1 = "one"
const str2 = "" // 문자열도 객체!

//Object.keys(obj1) -> []
//Object.keys(obj2) -> ['message']
console.log(Object.keys(obj1).length === 0); //length === 0 => true
console.log(Object.keys(obj2).length === 0); //length === 1 => false


//console.log(Object.keys(num).length === 0); 
// => true 숫자는 아예 말이 안됨 => Empty 확인할 때에는 객체인지 확인과정 필요

console.log(Object.keys(str1).length === 0); // => false
console.log(Object.keys(str2).length === 0); // => true

//이렇게 함수로 빼서 사용
function isEmpty(obj) {
    if(obj.constructor  === Object) {
        if(Object.keys(obj).length === 0) {
            return true;
        } else {
            return false;
        }
    }
}

console.log(isEmpty(obj1)); //length === 0 => true
console.log(isEmpty(obj2)); //length === 1 => false

console.log(Object.keys(str1).length === 0); // => false
console.log(Object.keys(str2).length == 0); // => true

 

Object.keys(객체) -> ['객체 안의 키값']

Object.keys(객체).length === 0 확인으로 활용 가능

 

객체가 아닌 숫자가 들어가면, 말이 안되기 때문에

매개변수가 객체인지 확인하는 과정 필요. 

obj.constructor === Object

 


메소드로 뽑아서 고도화 해보자. - 과제

🚩 기존코드

let db = new Map();
let id = 1; // 하나의 객체를 유니크하게 구별하기 위함 (PK)

function isExist(obj) {
    if (Object.keys(obj).length) {
        return true;
    } else {
        return false;
    }
}

// 로그인
app.post('/login', (req, res) => {
    console.log(req.body); // userId, password

    const { userId, password } = req.body;
    let loginUser = {};

    // db에 userId가 있는지 확인
    db.forEach(function (user, id) {
        if (user.userId === userId) {
            loginUser = user;
        }
    });

    if (isExist(loginUser)) {
        console.log("같은 거 찾았다.");

        if (loginUser.password === password) {
            console.log("패스워드도 같다.");
        } else {
            console.log("패스워드는 틀렸다.");
        }
    } else {
        console.log("입력하신 아이디는 없는 아이디입니다.");
    }
});

 

아이디어 

// 로그인
app.post('/login', (req, res) => {
    console.log(req.body); // userId, password

    const { userId, password } = req.body;
    let loginUser = {};

    // db에 userId가 있는지 확인
    db.forEach(function (user, id) {
        if (user.userId === userId) {
            loginUser = user;
        }
    });

... 생략    
}

 

1️⃣ db에 id가 있는지 확인해주는 메소드를 빼주자. 

 

- findByUserId 함수 생성

function findByUserId(db, userId){
    let foundUser = {};
    db.forEach(function(user){
        if(user.userId === userId){
            foundUser = user;
        }
    });
    return foundUser;
}

 

db랑 사용자가 입력한 userId를 받으면,

forEach를 돌려서 db안에서 userId의 값과 같은 것을 찾아 foundUser 객체에 담아준 뒤,

foundUser 객체를 리턴하게 했다. 

 

- 함수 실행부

    const {userId, password} = req.body
    var loginUser = findByUserId(db, userId);

실행부에서는 미리 만들어놓은 loginUser 객체에 바로 넣어주었다. 

 

그러면 이 객체만으로 로그인 여부를 찾을 수 있을 것이다!


        if (loginUser.password === password) {
            console.log("패스워드도 같다.");
        } else {
            console.log("패스워드는 틀렸다.");
        }

 

1️⃣ password 맞는지 확인해주는 메소드

- isPwdCorrect 함수 생성

function isPwdCorrect(loginUser, password){
    return loginUser.password === password;
}

- 실행부

        if(isPwdCorrect(loginUser, password)){
            console.log("패스워드도 같다.")
        } else {
            console.log("패스워드는 틀렸다.")
        }

채널 API 설계 (URL, http method/status, res/res)

채널채널 "생성" 페이지  

채널 생성 버튼 클릭 시 => 입력받은 채널명을 받아서, 채널 생성(등록) API

채널 관리 페이지

(1) 화면 출력 => 이 회원이 소유한 전체 채널 조회 API 

(2) 삭제 버튼 클릭 시 => 개별 채널 삭제 API

개별 채널 수정페이지

(1) 화면 출력 => 기존 개별 채널 정보 조회 API 

(2) 수정 완료 버튼 클릭 시 => 개별 채널 수정 API

- 채널 생성

- 채널 수정

- 채널 삭제

 

채널

1) 채널 "생성" 페이지  : POST /channels

- req : body (channelTitle)

- res 201: `${channelTitle}님 채널을 응원합니다.` 👉🏻 다른 페이지 띄워주고 싶음 ex. 채널 관리 페이지

2) 채널 개별 "수정" : PUT /channels/:id

- req : URL(id), body(channelTitle)

- res 200: `채널명이 성공적으로 수정되었습니다. 기존 : ${} -> 수정 : ${}`

3) 채널 개별 "삭제" : DELETE /channes/:id

- req : URL (id)

- res 200: `삭제 되었습니다.`  👉🏻 메인페이지

4) 채널 전체 "조회" : GET /channels 

- req : X

- res 200: 채널 전체 데이터 list, json array  

5) 채널 개별 조회  : 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();
var id = 1; 

app
    .route('/channels')
    .get((req, res)=>{
        if(db.size){
            //json array
            var channels = [];
            
            db.forEach(function(value, key){
                channels.push(value)
            })

            res.status(200).json(channels)
        } else {
            res.status(404).json({
                message : "조회할 채널이 없습니다."
            })
        }
    }) // 채널 전체 조회
    .post((req, res)=>{
        if(req.body.channelTitle){
            db.set(id ++, req.body);
            
            res.status(202).json({
                message : `${db.get(id-1).channelTitle}님, 채널을 응원합니다!`
            })
        } else {
            res.status(400).json({
                message : "요청 값을 제대로 보내주세요."
            })
        }
    }) // 채널 개별 생성 = db에 저장

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

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

        var channel = db.get(id)
        var oldTitle = channel.channelTitle
        if(channel){
            var newTitle = req.body.channelTitle

            channel.channelTitle = newTitle;
            db.set(id, channel)
            res.status(200).json({
                message : `채널명이 정상적으로 수정되었습니다. 기존 ${oldTitle} -> 수정 ${newTitle} `
            })
        }   
        else{
            req.status(404).json({
                message : "채널 정보를 찾을 수 없습니다."
            })
        }
    }) // 채널 개별 수정
    .delete((req, res)=>{
        let {id} = req.params;
        id = parseInt(id);

        var channel = db.get(id);
        if(channel){
            db.delete(id);

            res.status(200).json({
                message : `${channel.channelTitle}이 정상적으로 삭제되었습니다.`
            })
        }else{
            res.status(404).json({
                message : "채널 정보를 찾을 수 없습니다."
            })
        }
    }) // 채널 개별 삭제

채널 전체 조회 

(이외의 api는 이전 코드 복습)

app
    .route('/channels')
    .get((req, res)=>{
        if(db.size){
            //json array
            var channels = [];
            
            db.forEach(function(value, key){
                channels.push(value)
            })

            res.status(200).json(channels)
        } else {
            res.status(404).json({
                message : "조회할 채널이 없습니다."
            })
        }
    }) // 채널 전체 조회

 

💭 { } vs [ ] 

{ } :객체 

let channels = {}

{
	1: { channelTitle : "A" },
    2: { channelTitle : "B" }
}

- 구조 key : value

- 하나하나 이름으로 접근하고, 순서 개념 없음

 

[ ] : 배열

let channels = []

[
  { channelTitle: "A" },
  { channelTitle: "B" }
]

- 구조 [값, 값, 값] 

- 순서 있음 (0~)

- 같은 구조의 데이터 여러개 목록

 

🤔 근데 왜 res.json()으로 보내지지? 

- json은 데이터를 보내는 포맷 개념이기 때문에 객체, 배열 둘다 JSON이라고 할 수 있음!!

👉🏻 그래서 JSON array / JSON 객체라고 쉽게 표현하신 것이구나!

 


 

여행 직후의 컨디션 때문에 강의가 하루가 밀려서 그거 청산하느랴 정리가 쉽지 않았다.. 

이제야 조금 일상생활에 복귀도 하고 Adsp 공부, 코테공부도 자연스럽게 하는 습관도 정착한 것같다.

 

오늘은 아침일찍 일어나서 강의도 다듣고 코테 정리도 끝내서 오후에는 adsp공부랑 쉬는 시간도 있는 갓생 삶이어서 ㅂ참 뿌듯했다

 

이런 습관이 오래오래 지속됐으면 좋겠ㄷ다!!!!!!!

 

더 열심히 살고, 더더더욱 치열하게 살아서 정말 성공하고 싶은 마음이 드는 요즘이다..