240916 TIL - 차고차고, Node.js 교과서

LIHA·2024년 9월 16일
0

내일배움캠프

목록 보기
52/108
post-thumbnail
post-custom-banner

뼈대잡기

내 담당 : 캐시구매, 상점 상품구매, 선수 1회뽑기, 선수 다회뽑기, 구매히스토리

  • 현재 제작현황
    가챠 -> 이건 영 모르겠다. 웅상님과 함께 고민이 필요할 것 같다.
    상점 아이템 구매 완 -> 가챠로직 필요하다. 가챠만 만들어지면 문제없을 듯
    캐시구매
    상점 아이템 생성
    상점 아이템 전체조회
    상점 아이템 세부조회
    구매이력 생성
    구매이력 조회

캐시 구매 기능 (입문 2-9~2-19, 숙련 2-5)

  • 결제 연동을 하는 것이 아니라 단순 API 호출 시 일정량의 캐시 구매할 수 있게. 코어기능 아니니 최대한 단순히 마무리!
    -> 얘는 아이템 시뮬레이터의 돈복사 API 쓰면 될것임
    근데 이거 21억 넘어가면 값 이상하게 입력되는거 같아서 MAX_VALUE 해봐야 할거 같다

    -> 완료!

상점 상품구매

상점 id랑 가챠상품 id랑 이어져있어야 한다.
-> 이어져는 있고, product - gacha가 1:N 관계.
한개의 상품에 여러 가챠템이 올 수 있다고 생각해서 이렇게 연결.

그러면 난 뭘해주고 싶은가 -> 일단 상품이 있는지부터 불러와본다.
(나는 이 작업을 위해 DB에 데이터 삽입이 먼저 필요했다) -> 그럼 삽입 라우터부터 만들자

선수 뽑기 기능 (숙련 2-7~2-8)

  • 뽑기 1번에 일정량의 캐시가 소비되어야 할것.
  • 선수를 뽑으려면 선수 데이터가 DB에 준비되어 있어야 할것
  1. Player테이블에서 playerid를 기반으로 랜덤으로 뽑아와야 한다.
    -> findMany로 뽑아오는건 알겠다. 게임 아이템 구매하려면 아이템 리스트에 있는지부터 봐야하니까.
    -> 아이템 구매로직 + 인벤토리에 넣기 로직 필요
    랜덤으로 어떻게 해야하지?
  2. 뽑기횟수는 Gacha테이블에 입력된 횟수대로 돌아가는 로직이 필요하고,
  3. 가챠가 완료되고 나면 얘는 Roster테이블에 저장되어야 한다.

가챠를 하려면 일단 프로덕트 테이블 데이터가 필요하니 넣어주자

  • SQL로 삽입하는 방법은 아래와 같다. 참고1 참고2
    모든 컬럼의 정보를 다 입력할 경우 입력할 컬럼 선언은 생략해도 된다고 한다.
INSERT INTO `our_futsal`.`product` (productName, price, productInfo)
VALUES ('10회 뽑기', 50000, '조금 좋은 선수가 있을까?')
  • 로우쿼리로 수정하는 방법은 아래와 같다. 참고1
UPDATE Temp_Table SET field3='변경된 값' WHERE field1 = 'data2';

일단 이런 식으로 데이터를 집어넣었다. 가챠는 프로덕트 테이블의 가격을 참조하기 때문.
프로덕트는 가격이 쓰인 포장박스 같은거고, 가챠는 그 안에 들어가는 상품인 셈.

가챠를 어떻게 구현하면 좋을까? 일단 Math.random을 쓰자

Math.random은 0이상 1미만 사이에서 난수를 발생시켜 리턴해준다.
(0.000...1 ~ 0.999....9 사이)
여기서 추출되는 숫자를 깔끔하게 정수부만 취하기 위해 보통 Math.floor를 바깥에 입히는데,
문제는 이게 버림이라서 0이 나오면 안되는 경우에도 0이 출력된다. 그래서 보통 + 1을 해주는 것.

-> 이걸 응용하면 최소값도 1이 아니고 내가 원하는 숫자 범위로 만들 수 있다. 참고 블로그
ex) 5 ~ 40 사이의 수를 만들어주고 싶으면 Math.floor(Math.random()*(40 - 5 + 1)) + 5
(두 수 모두 범위에 들어가므로 +1. 최소값 이상 최대값 미만 범위로 잡히기 때문)

Math.random()이 내뱉는 수가 굉장히 촘촘하기 때문에(대충 소수 15번째 자리 정도 뱉는다) 장점이 있다.
Math.random() * 10 + 1 하면 1~10 사이의 수다.
그러면 Math.random() * 60 + 1 하면 1~60 사이의 수가 될 것이다. 어떻게?

-> * 10 에서는 그냥 Math.random() 값대로 수가 나오겠지만, * 60을 하게 되면 0.5대의 수를 곱한다고 무조건 30이 나오지 않는다. 29는 아니겠지만 31 일수도 있고 심지어는 32 일수도 있을 것. 0.59라면 35도 나온다. 0.6인 수 전까지 그 사이에서 자유롭게 나오는 것.

  • 결론: 그러므로 총 선수 풀의 크기(30명, 40명 등)를 알 수 있다면 그 번호 안에서 뽑을 수 있을 것.
    혹은 티어를 둬서 특정 티어 범위 사이에서 뽑을 수 있다면 좋을 것.
    -> 이러려면 아이템 코드나 티어 코드같은 컬럼이 필요할 것.

prisma client 사용 명령어 정리

아주 잘 설명되어 있는 참고 블로그
그러나 위 블로그에도 없었던 prisma.(테이블이름).count - 참고 블로그2 에서 발견
-> 내가 하고싶었던 건 테이블 내 컬럼의 갯수가 몇개인 지 세고 싶었던 것인데, 정확히 그 기능을 발견했다.


기주 튜터님의 조언

  • instanceOf를 쓰는 것이 브루트포스로 대조하는 것 보다 훨씬 낫다.

  • '그래서 그걸 왜 쓰는거죠?' 라는 부분까지 의문을 가지는 것이 좋다!

  • validation에 대한 코드가 보통 길다.
    -> 중복되는 기능은 함수로 뽑고, 중복되는 내용은 미리 정의해두고 스프레드 문법 쓰면 훨씬 깔끔하다.

  • 함수로 뽑았을 때 변할 가능성이 있는 값은 함수의 인자로 받으면 좋다. JWT의 expiresIn 같은 값들.

  • MVC 패턴은 디자인 패턴이라 자바 스프링에서만 쓰는 것이 아니다.

  • router를 import할때는 Camel Case로 맨앞 두문자를 소문자로 써주자. JS 진영에서는 Pascal 문법을 쓰지 않는다. -> 맨 앞이 대문자인 것은 클래스일 때만.


제로초 Node.js 교과서

코테는 파이썬으로 공부는 것이 공부효율이 좋다

이건 튜터님도 말씀해 주셨지만 제로초님도 이렇게 말씀해주셨다. 당장 내배캠 동안은 쉽지 않겠지만 코테는 파이썬으로...?

노드는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 '런타임'이다

  • 일종의 실행기. JDK가 이거랑 비슷한 역할
    -> 이게 왜 필요해요? 옛날 JS는 HTML에 좀 종속된 느낌으로 웹문서 실행될때 같이 실행되던 요소라, 단독실행을 못했음.
    -> 노드는 JS파일을 단독으로 실행시켜 주는 실행기인 셈
    -> 서버의 역할도 수행할 수 있는 런타임 - 서버 코드를 써서 노드를 실행시키면 그게 서버가 되니까.

기본서 문법 다 보고도 코테를 못하겠는건 프로그래밍 사고력이 부족한 것

https://ko.javascript.info/<- 여기 내용들 다 읽고도 코테 못풀겠는건 문법을 모르는게 아니다

노드도 내부는 C/C++로 되어 있지만 -> 그 두 언어는 생산성이 좋지 않다

  • 노드는 V8과 libuv(립uv라고 읽는다)를 내부적으로 포함 - libuv가 아주아주 중요하다!
  • libuv - 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현한 라이브러리
    -> 노드는 싱글쓰레드 비동기 모델이라는게 아주아주 큰 장점이라서 어느순간 확 뜬 언어.
    -> 이것때문에 초보들이 대충 코딩해도 엄청나게 빠른 속도를 이끌어낼 수 있다.
    -> JAVA는 멀티쓰레드라서 초보/고수에 따라 성능 차이가 굉장히 심하다. 원하는 만큼 성능이 잘 안나왔었다.

콜백함수 너무 어려워하지 마 - 이벤트가 발생했을 때 실행될 함수

  • 노드가 이벤트 기반? 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
  • 이벤트의 예: 클릭, 네트워크 요청, 타이머 등
  • 이벤트 리스너 : 이벤트를 등록하는 함수
  • 콜백함수 : 이벤트가 발생했을 때 실행할 함수

논블로킹은 동시가 아니야 - 동기/비동기와 헷갈리지 말자

  • 노드는 블로킹이면서 동기, 논블로킹이면서 비동기인 것만 있다. 이건 코드를 직접 보는게 좋으니 책을 참고하자.
  • 많이들 착각하는게 비동기이면서 논블로킹이면 프로그램이 동시에 돌아간다고 생각하는데, 노드에서 동시를 구현하긴 굉장히 어렵다.
    -> 동시에 돌아가는 몇 가지는 리스트를 외워두면 된다.
  • 동기이면 코드가 순서대로 실행된다, 비동기면 코드가 순서대로 실행되지 않을 수도 있다. - 이 정도만 알고가면 ok

프로세스 vs 스레드

  • 프로세스 : OS에서 할당하는 작업단위. 프로세스 간 자원공유X
  • 스레드 : 프로세스 내에서 실행되는 작업단위. 부모 프로세스의 자원을 공유O
  • 노드 프로세스는 사실 멀티 스레드 - 노드 실행시키면 프로세스 여러개 뜬다
    -> 그렇지만 직접 다룰 수 있는건 한개라서 싱글스레드 라고 표현하는 것
    -> 노드는 멀티스레드 대신 멀티 프로세스를 활용
    -> 노드 14버전부터 멀티스레드 사용가능!
    -> 진짜 싱글스레드면 인스타와 페이스북의 알람이 동시에 오지 않는다.

Q. 그러면 노드도 처음부터 멀티스레드로 하면 되지 않았어요? 된다면서요
A. 멀티스레드 코드짜는거 진짜 정말 넘사벽으로 어렵다. 사람 머리로 이해할 수 없을 정도로 어려움!

Q. 노드도 멀티쓰레드인데 JS돌리면 한개만 차지한다면서요. 그럼 나머지 쓰레드는 뭐해요?
A. 여러 코드를 동시에 돌릴 준비를 하고 있다가, 특정 조건을 만족하면 돌아갑니당.

  • 진짜 노드가 싱글스레드였으면 동시라는 개념이 아예 나오지 않았을 것. (불가능하니까)

싱글 스레드라고 점원 한명이 고객 여러명 응대하다 앓아눕는게 아니다

  • 노드는 싱글스레드인 대신 논블로킹 모델을 채택해, 일부 코드(I/O)를 백그라운드(다른 프로세스)에서 실행할 수 있다
  • 이 말인 즉슨 요청을 먼저 받고, 완료가 다 되면 응답하겠다는 얘기다(이때 응답해주는게 콜백함수다)
  • I/O 관련 코드가 아닌 경우 싱글 스레드, 블로킹 모델과 같아진다.

-> 일단 점원(스레드)이 주문만 좌라락 받아놓은 다음에, 요리 다 되면 불러드릴게요! 하고 손님들을 돌려보내는 것.
-> 그래서 노드는 이 '점원(스레드)' 관리를 진짜 잘해야 한다. 점원이나 주방장이 쓰러지는 순간 가게 운영이 멈추기 때문.
-> 그래서 나온게 멀티 프로세싱 - 점원(스레드)이 한명인 체인점(프로세스)가 여러 군데 있어서 손님을 분산시키는 것

Q. 그러면 노드말고 다른 언어로 멀티 스레드 코딩 하면 비동기 안해도 돼요?
A. 아뇨. 멀티 스레드 하고도 비동기 해야됩니다. 근데 멀티 스레드 코딩 진짜 헬 헬 헬 헬 어려움.

  • 멀티 스레드의 활용 자체는 노드 14부터 들어와서, CPU를 많이 사용하는 작업인 경우는 활용할 수 있다
    -> 그러나 이건 어디까지나 싱글 스레드로 멀티 프로세싱만 가능했던 아쉬움 달래기 용.
    노드에서 멀티 스레딩이 주력이 될 일은 없다

노드는 내 컴퓨터를 서버로 만들어준다 - 노드서버의 장단점은 곧 노드와 JS의 장단점

  • 싱글스레드라 리소스를 적게 사용함
    -> 그런데 CPU 코어도 한개만 사용해서 세월아네월아처럼 느껴질 수도

  • I/O 작업이 많은 서버로 적합
    -> CPU 사용량이 많은 서버로는 부적합! (like 진상손님 한명) 이러면 서버가 정신을 못차린다!
    -> 이미지 리사이징, 알고리즘 처리, 암호화 등... 이런걸 위해서 멀티스레딩을 열어준 것임

  • 멀티 스레드 방식보다 쉬움 (점원 한명이어도 오픈 가능)
    -> 이 점원 한명(싱글스레드) 안쓰러지게 겁나 관리 잘해야 함!

  • 자바스크립트를 사용함 - 웹개발자가 가장 많기에 생태계가 크고 사라질 염려가 적다!
    -> 어중간한 성능.. 노드보다 성능 좋은 거 찾으려면 많다. 진짜 성능 짱짱한건 C/C++/Rust 같은 것들.
    -> 그러나 어떤 언어의 모든 것을 다 쓰고도 한계가 보인다면 그 때가 언어를 바꿀 때다.

  • JSON 형식과 호환하기 쉽다
    -> 타 언어는 JSON으로 호환을 해야 하는데, JS는 그런게 필요없다.
    -> JSON이 JavaScript Object Notation 이기 때문

서버 외의 노드 - 용도가 서버에만 한정되지도 않는다

  • JS는 런타임이기 때문에 웹, 앱, 기타 뭐든 붙을 수 있다. 웹, 모바일, 데스크탑 애플리케이션에도 사용한다.
    웹 - 앵귤러, 리액트, 뷰, 메테오
    앱 - 리액트 네이티브
    데스크탑 - 일렉트론

  • 당신이 회사원이라면 LTS를 쓰는 것이 정신건강에 이로울 것이다

  • 제로초님은 웹스톰이라는 유료 프로그램을 쓴다고. 회사가 사준다면 웹스톰 추천

  • 회사가 안 사주거나 내 컴이 후지다면 VS Code를 쓰자 -> 웹스톰은 램을 최소 4기가 이상 먹음

노드 설치할때 필수 모듈 반드시 같이 설치할 것. 안하면 나중에 피눈물 흘린다

Node라고 JS만 쓰는거 아니다. Python이나 C++도 필요하다. 이거 안 깔면 라이브러리 잘 안 돌아갈거다.

  • 프로그래머는 생각하는 데에 그 가치가 있는 것이지, 타이핑하는 데에 비중이나 가치가 있는 것이 아니다.
  • 머릿속으로 생각을 많이 해야 좋은 프로그래머가 되는 것이다.
  • 프로그래밍의 기본은 폴더명을 한글로 안 쓰는 것이다. 폴더 경로에 한글이 있으면 고통받을 확률이 높다. OS 계정명이 한글이어도 마찬가지. 다 영어로 바꾸자.
profile
갑자기 왜 춤춰?
post-custom-banner

0개의 댓글