1. AWS IAM 정책
  2. AWS MFA
  3. 키오스크 개발
    프로그래머스

공부하며 느낀 점
참조한 사이트

1. AWS IAM 정책

AWS 서비스란? 에서 이어짐

JSON의 형태로 정책들의 내용이 들어있다.

Vsersion : 권한의 버전, 2012년이 최신이다.
(해당 글 작성 시점 2023 08 02 이지만 여전히 2012-10-17이 최신)
id : 정책 식별자 (선택사항)
Satatement : 권한의 내용물

Satatement의 내용물

  • Principal : 대상
  • Resource : 리소스
  • Action : 행동
  • Effect : 허용/비허용
  • Condition : 그 조건

각각의 요소들의 순서는 바뀌어더 상관이 없다.

2. AWS MFA

다 요소 인증 Multi Factor Authentication

비밀번호 뿐 아니라 개인 디바이스를 이용하는 인증 수단을 하나 더 가지는 것이다.

  1. USB 스틱
  2. 핸드폰 어플
  3. 하드웨어 토큰, OTP카드 등...

루트 계정과 user 계정 모두 추가하도록하자.

호환되는 인증 앱중 하나를 설치하고 다시 이전 탭으로 돌아간다.

중간의 QR코드 표시를 눌러서 인증한다.
그러면 여섯 자리 숫자가 두개 연속으로 뜨는데 입력하면, 인증기 등록이 완료된다. (OTP처럼 일정 시간마다 새로 하나 나옴)

이제부터 로그인 할때는 6자리의 OTP를 입력해야한다.

3. 키오스크 개발

이어짐

상품삭제 API
상품 수량을 체크 하는 api를 만들고, 수량이 있다면 되묻고 삭제 api로 아니면 바로 삭제 api로 가도록 이중 api를 구현하라.

//  2service/itemService.js

// 값을 입력받기 위함
const readline = require("readline");

class ItemServices {
  itemAmountService = async (name) => {
    const isSoldOut = await this.ItemRepositories.itemAmountRepository(name);
    try {
      let sureDelete = "0";

      if (isSoldOut.amount !== 0) {
        sureDelete = await this.getYesOrNoInput(name);
      } else if (isSoldOut.amount === 0) {
        sureDelete = "1";
      }

      return {
        status: 200,
        message: "남은 메뉴 수량이 0입니다.",
        isSoldOut,
        sureDelete,
      };
    } catch (err) {
      return { status: 400, message: err.message };
    }
  };

  async getYesOrNoInput(name) {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });

    return new Promise((resolve) => {
      rl.question(
        `현재  '${name}'메뉴의 잔량이 있습니다. 삭제하시겠습니까? 삭제를 원하면 "1"를 입력해주세요: `,
        (answer) => {
          rl.close();
          resolve(answer === "1" ? 1 : 0);
        }
      );
    });
  }
}
module.exports = ItemServices;

repository 레이어에서 받아온 정보에서 수량을 본다.
수량이 0이 아니라면 const readline = require("readline"); 를 이용하여, 삭제하겠다는 확인을 입력 받는다.

다시 이것을 컨트롤러 레이어로 보낸다.

itemAmountController = async (req, res) => {
    const { name } = req.body;
    const { status, message, isSoldOut, sureDelete } =
      await this.ItemService.itemAmountService(name);

    if (sureDelete === "1") {
      const deleteResult = await this.ItemService.itemDeleteService(name);

      return res.status(deleteResult.status).json({
        message: deleteResult.message,
      });
    }

    return res.status(status).json({ message, isSoldOut, status, sureDelete });
  };

조건이 맞는다면, 컨트롤러 레이어의 매서드 안에서 다시 다른 매서드로 요청을 보내서 삭제한다.

그런데 하고보니 사용자(키오스크 관리자)는 개발자 콘솔창에서 입력을 받을 수 없다...
그냐 남은 양을 return하고 프론트와 연결된 js파일에서 그 값을 판단하고 입력창을 띄우도록하자.
그 다음 입력 값이 true이면

router.delete("/delete/:name", itemControllers.itemDestoryConroller); 를 타고가서 그대로 삭제가 되도록 만들었다.

상품수정 API

- Class 메소드로 생성
- 상품명 수정
    - 빈칸일 경우 ‘이름을 입력해주세요’ 메세지 반환
- 가격 수정
    - 음수일 경우 ‘알맞은 가격을 입력해주세요’ 에러메시지 반환

상품의 id로 patch 요청을 보내수정을 하고 싶지만 그러면 name을 비웠을 때 경고가 무의미해지므로 그냥 상품명으로 수정을 하기로한다.

itemUdateService = async (name, nameToUpdate, price, type, amount) => {
    try {
      if (!name) {
        return {
          status: 400,
          message: `메뉴명은 필수 입력 값입니다.`,
        };
      }
      if (!nameToUpdate) {
        nameToUpdate = name;
      }

      if (price < 0) {
        return {
          status: 400,
          message: `가격은 음수(마이너스)일 수 없습니다.`,
        };
      }

      if (type !== "coffee" && type !== "juice" && type !== "food") {
        return {
          status: 400,
          message: "타입은 coffee , juice , food 중 하나여야합니다.",
        };
      }
    } catch (err) {
      return { status: 400, message: err.message };
    }
  ...

name : 메뉴를 검색하기 위한 현재 이름
nameToUpdate : 새로 업데이트할 이름, 만약 바꾸지 않을 것이라면 빈칸으로 둔다. 그러면 저절로 nameToUpdate = name 이 된다.
price : 가격이 음수일 수 는 없다.
type : 미리 정해진 세 값만 넣을 수 있게 만든다.

프로그래머스

x만큼 간격이 있는 n개의 숫자

오늘도 쉬운 문제다.

나의 풀이

function solution(x, n) {
  var answer = [];

  let i = 0;
  let y = 0;
  while (i < n) {
    i++;
    y += x;
    answer.push(y);
  }

  return answer;
}

간단하다.

다른 사람의 풀이 1.

function solution(x, n) {
    var answer = [];
    for (let i = 1; i <= n; i++) {
        answer.push(x*i)
    }
    return answer;
}

비슷하지만 변수를 덜 설정해도 된다.

다른 사람의 풀이 2.

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

엄청 간결하게 짜냈다.

Array(n) : 길이가 n인 배열을 만든다.
fill(x) : 내용물을 다 x로 채워넣는다.
map((v, i) => (i + 1) * v) : index i의 내용물 v에 인덱스 수+1을 곱한다.

공부한 소감

  1. 실제 사용자가 사용할 방법을 고려하며 만들어야한다.
  2. 지금 뭔가 재활용을 못하고 있는데 자고 일어나서 생각해봐야겠다.

참조한 사이트

[AWS] 📚 IAM 정책 JSON 구조 & ARN 문법 💯 정리

profile
node 개발자

0개의 댓글

관련 채용 정보