냥냥's 2021. 9. 23. 00:11

어제 심각한 DB오류와(2시간 가량 시간 버림 ㅠ) 멍청하게 vscode에서 작성을 해놓고 저장을 안하고 구동을 계속해서 (3시간 날림... 파이참은 저장안해도 실시간으로 반영되던데 ㅠㅠ) 3주차를 전부 듣지 못했다.
생각해보니 알고리즘도 못해서 오늘 두배로 해야한다...

일단 시작 전에 그냥 동기 비동기 기본 지식은 알아야할 거 같아서 뜬금없이 저장해봣다.
동기, 비동기 처리 (velog.io)

 

동기, 비동기 처리

데이터를 처리하는 방식인 동기, 비동기 처리에 대해 많은 글이 있지만 정확하게 와닿지가 않았다. 최대한 내가 이해한 방식대로 서술해 보려고 한다. 동기 (Synchronous)는 요청과 동시에 일어난다

velog.io

[Javascript] 🌟비동기 처리🌟 (velog.io)

 

[Javascript] 🌟비동기 처리🌟

앞의 글에서 동기와 비동기의 간단한 개념을 살펴 보았다. 자바스크립트의 동기 비동기 또한 개념은 같다.특정 코드의 연산이 끝날 때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하

velog.io

글 쫌 잘쓰시네 ㅎㅎ;

https://velog.io/@sujin19/node.js-REST-api-mongoDB

 

node.js (REST api, mongoDB)

Representational State TransferREST라는 규칙을 따르는 APIWorld Wide Web과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한

velog.io

기본적인 것 되새기기!!! 

- 뜬금 arrow function 되새기기 -
const 익명함수이름쓰 = (변수) =>{ 함수내용이다!}
평소에 잘 못보던 폼이라 헷갈렸었기 때문에 ㅎㅎ...

 

어제 상황에서 우선 POST 상품 불러오기를 추가하였다.

router.post('/goods', async (req, res) => {
    const { goodsId, name, thumbnailUrl, category, price } = req.body;
  
    isExist = await Goods.find({ goodsId }); //같은거 있는지 확인
    if (isExist.length == 0) {  //없으면 생성
      await Goods.create({ goodsId, name, thumbnailUrl, category, price });
    }
    res.send({ result: "success" });
  });

그리고 insomnia를 설치하여 다른 메소드(POST)를 호출해보았다.

잘 된다.

굿즈를 카트에 담고 장바구니 페이지에 보여주도록 만들었다.

//카트 정보 post
  router.post("/goods/:goodsId/cart", async (req, res) => {
    const { goodsId } = req.params;
    const { quantity } = req.body;
  
    isCart = await Cart.find({ goodsId });
    console.log(isCart, quantity);
    if (isCart.length) {
      await Cart.updateOne({ goodsId }, { $set: { quantity } });
    } else {
      await Cart.create({ goodsId: goodsId, quantity: quantity });
    }
    res.send({ result: "success" });
  });
  
  //장바구니에 정보 쏴주는거
  router.get("/cart", async (req, res) => {
    const cart = await Cart.find({});
    const goodsId = cart.map(cart => cart.goodsId);
  
    goodsInCart = await Goods.find()
      .where("goodsId")
      .in(goodsId);
  
    concatCart = cart.map(c => {
      for (let i = 0; i < goodsInCart.length; i++) {
        if (goodsInCart[i].goodsId == c.goodsId) {
          return { quantity: c.quantity, goods: goodsInCart[i] };
        }
      }
    });
  
    res.json({
      cart: concatCart
    });
  });

이번엔 장바구니에 있는 정보를 지우는 api를 추가했다.(delete)

router.delete("/goods/:goodsId/cart", async (req, res) => {
      const {goodsId } = req.params

      const isGoodsInCart = await Cart.find({ goodsId });
      if(isGoodsInCart.length > 0){
          await Cart.deleteOne({ goodsId });
      }
      res.send({result: "success" });
  })

장바구니에 수량 변경하는 api를 추가했다 (patch)

  //장바구니 수량 변경
router.patch("/goods/:goodsId/cart", async (req, res) => {
    const { goodsId } = req.params;
    const { quantity } = req.body;

    const isGoodsInCart = await Cart.find({ goodsId });
    console.log(isGoodsInCart)
    if (isGoodsInCart.length > 0) {
        await Cart.updateOne({ goodsId }, { $set: { quantity}})
    }
    res.send({ result: "success" });
})

 

====================================================
node.js로 크롤링 하는 법에 대해 배웠다.

1) Node.js 서버에서 외부에 있는 특정 웹사이트에 접근 ⇒ axios
2) 특정 웹사이트 HTML 코드를 가져와 조작하기 ⇒ cheerio
3) 한글 깨짐 방지! ⇒ iconv-lite

npm install axios cheerio iconv-lite -s

설치 후에

크롤링을 하여 DB에 저장하는 부분을 만들었다.

router.get("/goods/add/crawling", async (req, res) => {
  try {
    //크롤링 대상 웹사이트 HTML 가져오기
    await axios({
      url: url,
      method: "GET",
      responseType: "arraybuffer",
    }).then(async (html) => {
        //크롤링 코드
      const content = iconv.decode(html.data, "EUC-KR").toString();
      const $ = cheerio.load(content);
      const list = $("ol li");

      await list.each( async (i, tag) => {
        let desc = $(tag).find("p.copy a").text() 
        let image = $(tag).find("p.image a img").attr("src")
        let title = $(tag).find("p.image a img").attr("alt")
        let price = $(tag).find("p.price strong").text()
      
        if(desc && image && title && price){
          price = price.slice(0,-1).replace(/(,)/g, "")
          let date = new Date()
          let goodsId = date.getTime()
          await Goods.create({
            goodsId:goodsId,
            name:title,
            thumbnailUrl:image,
            category:"도서",
            price:price
          })
        }
  
      });
    })
    res.send({ result: "success", message: "크롤링이 완료 되었습니다." });

  } catch (error) {
    //실패 할 경우 코드
    res.send({ result: "fail", message: "크롤링에 문제가 발생했습니다", error:error });
  }
});

 

어제 까먹고 못한 ㅠ 알고리즘까지 두 문제를 했다.

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는
자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금
지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하
지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한
다.
여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고
한다. 날짜의 일의 자리 숫자가 주어지고 7대의 자동차 번호의 끝 두 자리 수가 주어졌을 때
위반하는 자동차의 대수를 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 줄에는 날짜의 일의 자리 숫자가 주어지고 두 번째 줄에는 7대의 자동차 번호의 끝 두 자
리 숫자가 주어진다.
▣ 출력설명
주어진 날짜와 자동차의 일의 자리 숫자를 보고 10부제를 위반하는 차량의 대수를 출력합니
다.

풀이

10으로 나눈 나머지가 일수 이므로 이를 이용해서 푼다 넘쉽!

function solution(day, arr){
    let answer = 0;
    for(let car of arr){
        if (car % 10 === day){
            answer++
        }
    }
    return answer
}

arr = [25, 23, 11, 47, 53, 17, 33];
console.log(solution(3,arr));

 

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다.
일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난
수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을
기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시
오.
▣ 입력설명
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며,
아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
▣ 출력설명
입력된 순서대로 일곱 난쟁이의 키를 출력한다.

풀이

대충 푸는 방법은 9개의 수를 모두 더한 값에서 아무나 두명을 뽑아서 빼면 100이 나오도록 하는 것이다.

마지막 배열에서 splice를 사용할때 뽑은 수가 4번 5번이라면 
4번부터 빼버리면 5번째숫자는 자연히 4번째가 되므로 5번째를 빼버리면 계산이 오류가 나게 되어버린다
그러므로 뒤에 뽑은 수를 먼저 빼어서 그런 오류를 범하지 않게 하여야한다.

function solution(arr){
    let answer = arr;
    let sum =  0;
    for(let nan of arr){
        sum+=nan

    }
    console.log(sum)
    for (let i =0; i < arr.length-1; i++){
        for(let k = i+1; k < arr.length; k++){
            if(sum - (arr[i] + arr[k]) === 100){
                answer.splice(k, 1)
                answer.splice(i, 1)
                 
            }
        }
        
    }
    
    return answer
}

arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));

 

forEach

자바스크립트에서 제공하는 배열(Array)의 유용한 함수 (reduce, map, filter, indexOf, foreach) (tistory.com)

 

자바스크립트에서 제공하는 배열(Array)의 유용한 함수 (reduce, map, filter, indexOf, foreach)

자바스크립트(javascript)에서 제공하는 배열의 함수 ES6에서만 사용하는 것은 아니지만 자바스크립트 프로그래밍할 때 유용한 메서드이면서 다른 사람의 코드를 보면서 이해를 못했던 필자 같은

jeong-pro.tistory.com