IT 5분 잡학사전 #8

Noah·2023년 1월 22일
0

개발 도서

목록 보기
8/9
post-thumbnail

TIL 날짜 및 읽은 범위

  • 2023.01.24
  • Ep.35 ~ Ep.38

에피소드 35 : 비밀번호는 어떻게 저장할까 ?

비밀번호 시스템 구현, 어떻게 해야할까 ?

비밀번호 시스템의 잘못된 예 2가지
1. 비밀번호를 데이터 베이스에 그대로 저장
데이터 베이스에 접근할 수 있는 운영자, 개발자 모두 볼 수 있고 시스템을 구축한 사람도 비밀 번호를 볼 수 있어

numberIDpassword
1niconico1234
2lynnlynn0920
3beadori!doridori123
  1. 키(key)를 이용한 비밀번호 관리
    데이터베이스를 자체를 암호화해서 아무도 볼 수 없게 만든 후에 비밀번호로 저장 해
    키(key)로 데이터 베이스를 해제한 후 로그인하지
    키로 자신의 비밀번호가 저장된 부분을 해제하고 나서 입력한 비밀번호와 대조해서 맞으면 로그인이 되는거야
    로그인을 마치면 다시 데이터 베이스의 비밀번호 부분을 잠궈
    하지만 여러분이 키를 잃어버리거나 누군가 그 키를 훔치면 큰일이야!

괜찮은 비밀번호 시스템의 예 : 해시함수
해시 함수를 사용하면 비밀번호 시스템을 더 안전하게 구현할 수 있어
입력한 값을 무작위 값으로 둔갑
해시 함수는 상상할 수 없을 정도로 무작위성을 갖고 있다

마법사 해시 함수는 어떻게 동작하지 ?

규칙 1. 동일한 입력값에 대해 동이란 출력값을 가진다
규칙 2. 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다
규칙3. 반대로 입력한다고 해서 원래 값이 나오지 않는다 (한쪽 방향으로만 설계된 함수!)

해시 함수도 완벽하진 않다, 레이보우 테이블

레인보우 테이블은 해시 함수가 변경한 값을 원래의 값과 연결한 표
사실 해시 함수를 통과한 값은 레인보우 테이블에서 찾아보면 원래 값을 알 수 있어
그래서 레인 보우 테이블이 털리면? 다시 위험해져

최종 병기, 솔트 (salt)

솔트는 아주 조그마한 무작위 테스트야
아까 12345와 같은 비밀번호를 무작위 텍스트인 솔트와 합쳐서 해시 함수를 통과 시키는 거야!
비밀번호와 무작위 텍스트 솔트를 합치면 원래 비밀번호를 찾을 수 없다!

에피소드 36 : 객체 지향 프로그래밍이 뭐죠 ? <1>

프로그래밍 패러다임이란 ? (programming paradigm)

프로그래밍 패러다임: 프로그래머가 프로그래밍을 할 때의 관점, 방식 이런 것, 프로그래밍을 하는 사고의 틀
(종류: 절차지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍 등)
프로그래밍 언어: 이런 프로그래밍 패러다임을 하나 또는 하나 이상을 지원하는 언어
(예: 자바-객체 지향 프로그래밍, 함수형 프로그래밍)

게임 만드는 과정으로 이해하는 객체 지향 프로그래밍

우리가 <유명인 대전> 이라는 게임을 만든다고 해보자!
그럼 플레이어가 있겠지! 플레이어는 어떤 데이터를 갖고 있을 까 ?

유명인 대전 플레이어
플레이어이름빌게이츠
체력85
스킬프로그래머
// 이 데이터를 자바스크립트로 표현해볼게! 
const player = {
  name:'빌게이츠',
  health:85,
  skill:'프로그래머'
}
// 플레이어가 3명이라면?
const player_1= {
  name:'빌게이츠',
  health:85,
  skill:'프로그래머'
}
const player_2= {
  name:'일론머스크',
  health:90,
  skill:'테슬라'
}
const player_3= {
  name:'니꼬',
  health:100,
  skill:'선생님'
}

어때 ? 비효율적이지!
모두 name, health, skill 이라는 같은 속성을 가졌어
만약 어떤 플레이어는 health 속성을 까먹고 입력하지 않을 수도 있고!
haelth 라고 오타를 낼 수도 있을거야
또 새로운 속성을 추가 하고 싶으면 모든 플레이어를 수정해야돼!

짜잔~ 플레이어 공장, 클래스 등장!

플레이어를 인형처럼 팡팡 찍어주는 공장이 등장해!
공장에 name, health, xp, skill 의 값만 넣으면 나머지 코드는 공장이 찍는거지
이렇게 하면 코드를 손으로 직접 입력하는 양도 줄고, 속성도 오타가 나지 않도록 피할 수 있을거야
바로 이런 자연스런 색각이 객체 지향 프로그래밍의 클래스 (Class) 라는 개념이야

//  플레이어 공장, 클래스 
class Player {
  constructor(name, health, skill) {
    this.name = name;
    this.health = health;
    this.skill = skill;
    this.xp = 0;
  }
}
// 플레이어 생성
const bill = new Player('빌게이츠', 85, '프로그래머')
const elon = new Player('일론머스크', 90, '테슬라')
const nico = new Player('니꼬', 100, '선생님')

new Player(...) 가 보이지 ?
공장에 재료를 넣는 코드야!
Player 클래스를 보면 constructor 라는 것이 있는데, 바로 거기에 재료를 넣어 주는 코드인 거지!

에피소드 37 : 객체 지향 프로그래밍이 뭐죠? <2>

이름 그래도 상속해 주는 개념, 상속

<심즈> 게임을 만들며 배우는 상속
<심즈> 게임 알아 ? 사람들이 살아가는 현실을 만들어 가는 게임이야! 그래서 기본적으로 인간이 필요해
인간은 아기, 청소년, 성인과 같이 여러 단계를 거치면서 특징이나 성격이 달라지지?
그것을 클래스의 상속으로 표현할거야

class Human {
  constructor(name) {
    this.name = name;
    this.arms = 2;
    this.legs = 2;
  }
}
class Teenager {
  constructor(name) {
    this.name = name;
    this.arms = 2;
    this.legs = 2;
    this.emotional = true;
  }
  curse() {
  	return '$%^@#%!#$#';
  }
}
class Baby {
  constructor(name) {
    this.name = name;
    this.arms = 2;
    this.legs = 2;
    this.cute = true;
  }
  cry() {
  	return 'waa waa!';
  }
}

코드 중복 문제가 생겨!
물론 성인, 청소년, 아기는 엄연히 다르지만 결국 같은 인간이야
약간 다르지만 이렇게 중복되는 걸 해결하고 싶을 거야
이때 바로 상속이 등장해!!

짜잔! 상속 등장!!

기본이 되는 Human 클래스를 나머지 클래스에 상속 시키면 돼!
Human 클래스의 기본 속성은 다 가지면서도 자신만의 속성을 추가 할 수 있어

class Teenager extends Human {
  constructor(name) {
    this.emotional = true;
  }
  curse() {
  	return '$%^@#%!#$#';
  }
}
class Baby extends Human {
  constructor(name) {
    this.cute = true;
  }
  cry() {
  	return 'waa waa!';
  }
}

코드를 보면 기존보다 양이 훨씬 줄어들었고, 의미도 더 명확하게 바뀌었어

에피소드 38 : 함수형 프로그래밍이 뭐죠 ?

함수형 프로그래밍은 프로그래밍 패러다임 중 하나야
배워야 하는 이유는 '버그가 발생하기 어려운 구조'라서 개발자에게 매우 유용해

자바스크립트로 보는 명령형 프로그래밍과 선언형 프로그래밍의 차이

// 명령형 프로그래밍 - 공백을 ♥ 로 바꾸기
function spaceToHeart(text) {
  let result = "";
  for(let i = 0; i < text.length; i++) {
    if(text[i] === "") {
      result += "♥️";
    } else {
      result += text[i];
    }
  }
  return result;
}

말 그대로 텍스트의 공백을 어떻게 해야 하는지를 하나씩 알려 주지

// 선언형 프로그래밍 - 공백을 ♥ 로 바꾸기
function spaceToHeart(text) {
  return text.replaceAll("","♥");
}

물론 replaceAll 은 명령형 프로그래밍으로 작성되어 있을 거야
그래서 모든 선언형 프로그래밍은 명령형 프로그래밍 위에 쓴다고 이야기 할 수 있어

구분선언형 프로그래밍명령형 프로그래밍
의미원하는 결괏값을 선언 (결과중심)원하는 결곽값에 어떻게 도달하는 지 선언
예시"BLT 샌드위치를 만들어줘!"BLT 샌드위치를 만드는 방법 (1,2,3 단계별로 설명)
대표CSS
장점실수가 적다, 동료가 코드를 이해하기 쉽다할 일을 세세하게 지시할 수 있다
단점실수하기 쉽다, 동료가 코드를 이해하기 어렵다

홀수를 제거하는 코드를 함수형 프로그래밍으로 작성해 보기

함수형 프로그래밍으로 홀수를 제거하는 코드를 작성해보자

function checkForOdd(item) {
  return item % 2 === 0;
}
function remove(items) {
  return items.fillter(checkForOdd);
}

fillter 의 인자로 checkForOdd 라는 함수를 보냈어
함수형 프로그래밍에서 자주 쓰는 방식이지
이렇게 함수형 프로그래밍은 함수 중심으로 코드를 적는 방식으로 선언형 프로그래밍 콘셉트를 유지해

개발자의 번아웃, 이렇게 대체해 봐!

예방팀 1. 휴식 시간을 가져라
코딩이 언제나 즐겁기만 할 수는 없어. 개발자라 해서 코딩을 꼭 취미로 해야 하는 것도 아니야
물로 어떤 개발자는 취미로 코딩을 하기도 해
하지만 모든 사람이 그럴 필요는 없어. 코딩이 항상 흥미진진하고 즐겁지 않을 수도 있어
개발자도 컴퓨터 앞에서 잠시 멀어져서 제대로 휴식을 취할 수 있어야 해

예방팁 2. 일하는 시간을 제한하라
일하는 스케줄에 시간 제한을 두는 거야
개발자는 어디서든 일할 수 잇어서 시간에 제한을 두는 것이 매우 중요해

예방팁 3. 몸을 움직이고 건강한 음식으로 활력을 찾아라
마지막 번아웃 예방팁은 바로 운동과 음식이야. 개발자의 중요 업무는 앉아서 손가락으로 타이핑하는 일이 99%지?
'뇌 운동한다'라고 좋게 이야기할 수도 있겠지만, 사실 그건 핑계라는 걸 알잖아?
그리고 건강한 음식도 중요해! 효율적으로 일하고 싶다면 몸에 부담을 주는 음식을 멀리하는게 좋아
소화시키는 데 필요한 에너지가 너무 많이 필요해서 실제로 피곤하게 만들 거든!

뻔한 이야기이긴 한데, 그래서 간과하기 쉽잖아
번아웃을 예방하는 가장 좋은 방법은 스스로 건강을 챙기는 거라고 생각해
건강한 몸에서 건강한 정신이 나온다는 말이 있잖아?

오늘 읽은 소감은?

"해시함수는 알고 있었는데, 솔트는 처음 들었다. 보안이 필요한 데이터를 보다 안전하게 관리할 수 있다니! 너무 멋지다!"
"객체지향 이해가 잘 되지 않았는데, 적절한 예시로 쉽고 재미있게 이해가 되었다. 클래스에 대한 개념이 부족해서 추가 적인 학습이 필요할거 같다"
"오랫동안 이 일을 하기 위해서는 충분한 휴식과 건강한 몸, 그리고 깨끗한 음식!이 중요하다고 생각한다! 이는 개발 뿐만 아니라 모든 직업에 해당된다고 생각한다!
격한 운동은 아니라도 하루 1시간 꼭 운동을 할려고 하고 최근에는 주 2회 요가 수업도 듣고 있다. 오랫동안 같은 자세로 있으니 허리랑 어깨가 망가지는 느낌이 와서 시작했는데! 너무 좋다."

profile
프론트엔드가 꿈인 코린이

0개의 댓글