본문 바로가기
TIL with Programmers

[TIL] 9/2 parseInt, params, query, Destructuring 문법, Map, 네이밍케이스

by 보먀 2024. 9. 2.
728x90
반응형

1. params

 

1.1. parseInt

 

자바스크립트 문자열을 정수로 변환하는 함수로, 문자열의 앞부분부터 숫자를 읽어서 정수로 변환한다. 만약 숫자가 아닌 문자가 나타나면 그 지점에서 변환을 중지한다. 기본적으로 10진수로 변환하지만, 다른 진수를 지정할 수도 있다. 

parseInt(string, radix); // 문자열, 진수(선택사항)

 

 

기본적으로 req.params 로 전달되는 URL 경로 매개변수들은 모두 문자열로 처리된다. 

 

 

URL 경로는 문자열로 처리된다고 했으니 이렇게 코드를 짰을 때 콘솔문은 출력이 안될 것이라고 생각할 수 있다. 하지만, URL 경로로 products/10 을 넣으면 콘솔문은 출력이 된다. 

-> 자바스크립트는 비교 연산시 자동으로 타입 변환이 이루어지기 때문이다. 

app.get('/products/:n', function(req, res) {
    if (req.params.n > 5) {
        console.log('5보다 큼'); // 출력
    }
    res.json({
        num: req.params.n
    })
});

 

 

하지만, 의도치 않은 결과를 방지하려면 명시적으로 문자열을 숫자로 변환하는 것이 좋다

Number 또는 ParseInt 를 써서 의도적으로 형 변환을 할 수 있다. 이렇게 형 변환을 하면, 화면에서도 문자열이 아니라 숫자로 표시되는 것을 확인할 수 있다. 

app.get('/products/:n', function(req, res) {
    let number = parseInt(req.params.n);
    if (number > 5) {
        console.log('5보다 큼');
    }
    res.json({
        num: number
    })
});

 

 

1.2. params 변수에 넣어 사용하기

 

받아온 URL 경로 매개변수를 변수에 저장하여 사용하면 가독성이 높아지고 재사용성이 좋아진다. 

app.get('products/:id', function(req, res) {
    const params = req.params; // 변수에 넣어 사용
    res.json({
        product: params.id
    })
})

 

 

 

2. query

URL 에서 ? 뒤에 key=value 형태로 붙으며, & 으로 구분할 수 있다.  

https://URL경로/params?key=value&key=value
app.get('/watch', function(req, res) {
    const q = req.query;
    console.log(q);
    res.json({
        video: q.v,
        timeline: q.t
    });
});

// URL: https://www.youtube.com/watch?v=SjclCCS-5Og&t=291s

 

 

 

3. 자바스크립트 객체, 배열 비구조화

 

객체/배열의 비구조화는 Destructuring 문법이라고도 불리며, 객체/배열에 포함된 객체/배열의 속성을 손쉽게 추출하는 자바스크립트 문법이다. 

 

3.1. 객체의 비구조화

// JSON 객체의 비구조화

app.get('/watch', function(req, res) {
    const q = req.query;
    const {v, t} = req.query;
    console.log(v);
    console.log(t);

    console.log(q);
    res.json({
        video: v,
        timeline: t
    });
});

 

 

3.1. 배열의 비구조화

배열의 요소는 변수에 순서대로 들어간다. 중간에 요소를 건너뛰고 추출하고 싶다면 필요없는 요소는 변수 이름을 써주지 않고 콤마로만 구분하고 넘어가면 된다.

// 배열 비구조화

const array = [1, 2, 3, 4, 5];

const [num1, num2] = array; // num1 = 1, num2 = 2
const [, num2, num3, , num5] = array; // num2 = 2, num3 = 3, num5 = 5

 

 

 

4. URL 경로에 따라 다른 객체 주기

 

// 강의 코드

let youtuber1 = {
    channelTitle : "십오야",
    sub : "593만명",
    videoNum: "993개"
}

let youtuber2 = {
    channelTitle: "침착맨",
    sub: "227만명",
    videoNum: "6.6천개"
}

let youtuber3 = {
    channelTitle: "테오",
    sub: "54.8만명",
    videoNum: "726개"
}

app.get('/watch/:nickname', function(req, res) {

    const {nickname} = req.params;

    if (nickname == '@15ya.fullmoon') {
        res.json(youtuber1);
    } else if (nickname == '@ChimChakMan_Official') {
        res.json(youtuber2);
    } else if (nickname == '@TEO_universe') {
        res.json(youtuber3);
    } else { // 찾는 값이 없을 때 예외처리
        res.json({
            message: '모르는 유튜버임'
        });
    }    
})

 

강의 코드는 이해하기 쉽게 if-else 문으로 처리를 했지만, 조금 아쉬워서 객체를 사용한 코드로 고쳐보았다. 

const express = require('express'); // 외부 모듈 express 가져옴
const app = express(); // 서버 담음

// 서버 셋팅: 포트 넘버를 1234 로 셋팅
app.listen(1234);

let youtuber1 = {
    channelTitle : "십오야",
    sub : "593만명",
    videoNum: "993개"
}

let youtuber2 = {
    channelTitle: "침착맨",
    sub: "227만명",
    videoNum: "6.6천개"
}

let youtuber3 = {
    channelTitle: "테오",
    sub: "54.8만명",
    videoNum: "726개"
}

app.get('/watch/:nickname', function(req, res) {
    // nickname : 객체이름
    const youtubers = {
        '@15ya.fullmoon' : youtuber1, 
        '@ChimChakMan_Official' : youtuber2,
        '@TEO_universe' : youtuber3
    };

    const youtuber = youtubers[req.params.nickname];
    
    if (youtuber) { // 찾는 값이 있다면 객체 담아줌
        res.json(youtuber);
    } else {
        res.json({ // 찾는 값이 없다면 예외처리
            message: '모르는 유투버임'
        });
    }

    
})

// https://www.youtube.com/watch?v=SjclCCS-5Og
// https://www.youtube.com/watch?v=SjclCCS-5Og&t=291s

 

 

query 별로 객체에 넣어 놓은 다른 정보들이 화면에 출력됨을 확인할 수 있다. 

 

 

5. 자바스크립트 Map 

  • map 은 key : value 쌍으로 이루어진 데이터 저장 형태
  • key 를 가지고 value 를 찾을 수 있다면 map 
  • 하나의 객체
let db = new Map();
db.set(1, "NoteBook") // 키로 벨류를 찾을 수 있는 한 쌍을 저장
db.set(2, "Cup")
db.set(3, "Chair")

console.log(db); 
console.log(db.get(1));

 

 

5.1. express + map

 

URL 로 받은 id 값에 따라 map 객체에 저장된 value 들을 화면에 뿌려주려고 한다. 

 

이 부분을 조심해야 하는데, URL 로 들어온 경로 파라미터 값은 기본적으로 문자열이므로 parseInt 를 통해 숫자로 타입 변환을 해줘야한다. map 객체는 숫자 1과 문자열 "1" 을 구분하기 때문이다. map 객체에 key 값이 숫자로 저장되어 있으므로 map 객체의 값을 꺼내려면 숫자로 타입 변환을 해준 뒤 꺼내야 올바른 값을 꺼낼 수 있다.

 

만약 숫자로 타입 변환을 하지 않고 map 객체에서 값을 꺼내려 하면 map 객체는 값을 찾을 수 없기 때문에 undefined 를 반환하고, 화면에는 아무것도 나타나지 않는다. 

let {id} = req.params;
id = parseInt(id);

// ...

// 키로 벨류를 찾을 수 있는 한 쌍을 저장
let db = new Map();
// 숫자 1과 문자열 1은 다른 값!
db.set(1, "NoteBook"); 
db.set("1", "문자열");

db.set(2, "Cup");
db.set(3, "Chair");

 

 

전체 코드

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

    if (db.get(id)) {
        res.json({
            id: id,
            productName: db.get(id)
        });
    } else { // 예외처리
        res.json({
            message: "없는 상품임"
        });
    }
})

let db = new Map();
db.set(1, "NoteBook"); // 키로 벨류를 찾을 수 있는 한 쌍을 저장
db.set(2, "Cup");
db.set(3, "Chair");

 

 

아래 코드는 먼저 예외 처리를 하는 if 문을 넣고 if 문에 걸리지 않는다면 밑에 코드를 실행하도록 코드를 짠 것이다. 코딩을 하면서 이런 식으로 코드를 짠 것을 많이 보았을 것이다. 하지만, 이렇게 코드 짜는 것이 좋지 않다.

 

정상적으로 실행되는 것 같지만 없는 id 값을 넣었을 때 콘솔창에는 아래와 같은 에러가 난다. 이 에러는 이미 클라이언트에게 보냈는데 (if문에서) 또 보내라고 했기 때문에 나는 에러이기 때문에 if-else 문을 원래의 형태로 사용하는 것을 추천한다-!

-> Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

const express = require('express'); // 외부 모듈 express 가져옴
const app = express(); // 서버 담음

app.listen(1234);

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

    if (db.get(id) == undefined) { // 예외 처리
        res.json({
            message: "없는 상품임"
        })
    }
    res.json({
        id: id,
        productName: db.get(id)
    });
})

let db = new Map();
db.set(1, "NoteBook"); // 키로 벨류를 찾을 수 있는 한 쌍을 저장
db.set(2, "Cup");
db.set(3, "Chair");

 

 

 

추가 - 네이밍 케이스

 

- 폴더/파일 -> 케밥 또는 스네이크 둘 중 아무거나 사용해도 됨 but 통일 중요

[kebab-case]

  • 알바벳 소문자
  • 두 개 이상의 단어를 합쳐서 쓸 때, 단어 사이에 하이픈 '-'

ex) demo-api, object-api-demo.js

 

[snake_case]

  • 두 개 이상의 단어를 합쳐서 쓸 때, 단어 사이에 언더바 '_'

ex) demo_api, object_api_demo.js

 

- 변수/함수 [camelCase]

  • 두 개 이상의 단어를 합쳐서 쓸 때, 두번째 단어의 첫글자를 대문자로

ex) channerTitle, videoNum

 

- 클래스 [PascalCase]

  • 두 개 이상의 단어를 합쳐서 쓸 때, 맨 앞글자를 대문자로 

ex) MyClass

 

 

 

728x90
반응형