Search
Duplicate

BoilerPlate 만들기

따라하면서 배우는 노드 리액스 강의 노트

1강

npm init
npm install express --save
공홈가서 기초 코드 복사
"scripts": { "start": "node index.js" } 추가
npm run start

2강

몽고 db 회원가입
몽고 db 공홈에서 클러스터 만들기
클라우드 상에서 만드는것
싱가포르 프리 티어
이름은 맘대로
유저 만들기
CONNECT 눌러서 유저 생성
connect your application
연결 코드 복사
npm install mongoose --save
몽고 db 연결 코드 작성
password 랑 dbname 잘 치환
use~ 머시기들 쓰고
then, catch로 확인
Collections 탭에서 데이터 확인 가능

3강

Model, Schema 만들기
user.js 파일 참고

4강

까먹고 안적은듯

5강

라이브러리 파일은 빼고 올린다ㅏ
다시 npm install 하면 설치 됨
git add .
git status
git rm --cached node_modules -r
.gitignore 파일만들고
git commit

6강

깃허브에서 원격 리파지토리 만들어
안전하게 통신하기 위해서 ssh를 연결해서 사용
ssh 설정 되어있는지 확인
ls -a ~/.ssh
id_ras, id_ras.pub 있는지 확인
이거 랑 이거 보고 ssh key 만들어서 git 에 등록
git bash
ssh-keygen -t rsa -b 4096 -C "petercha2000@gmail.com"
eval $(ssh-agent -s)
ssh-add /d/Dev/Projects/JsStudy/Tave/.ssh/id_rsa
clip < ~/.ssh/id_rsa.pub
깃 설정에 퍼블릭키 추가
git branch -M master
git push -u origin master

7강

body 데이터를 parse 해서 req.body로 출력
npm install body-parser --save
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true})); //url 인식
app.use(bodyParser.json()); //json 입력 인식
이제 req.body 로 client의 정보를 받을수있다.
Register Route 만들기
req를 db로 넘겨주고 받은값을 res로 넘겨주면됨
DB 다루기
const { User } = require("./models/user")
const user = new User(req.body) //User instance 생성
user.save() //db 저장
Client 부분을 만들어줄 PostMan 다운로드
POST 방식
body / raw / json
db에 들어갈 내용 입력 - 다 입력하지 않아도 됨
Send 하면 success: true 뜸
app.use의 정체res.josn / res.status(200) 정체

8강

nodemon : 서버 실시간 업데이트
npm install nodemon --save-dev
"backend": "nodemon index.js" 추가
npm run backend

9강

git 에 올라가면 안되는 변수는 따로 파일로 빼놓고 gitignore을 써서 가릴것
depoly 하는 서비스에 따라서 변수을 따로 설정해주는 경우가 있어 처리해줘야함
환경 변수 process.env.NODE_ENV 를 사용
key.js / dev.js / prod.js 참고
git 업로드

10강

비밀번호를 암호화 해서 db에 저장
npm install bcrypt --save
mongoose의 pre 함수를 사용
userSchema.pre('save', f => f())
save 되기전에 먼저 처리될것
bcrypt 의 공식 doc 확인
salt를 이용한 암호화 코드 복사
const saltRuonds = 10; // salt가 몇글자인지 정함
꼭 next()를 통해서 원래 함수로 넘어가야함
user.isModified('password') // 변경될때

11강

로그인 과정
요청된 이메일을 DB에서 있는지 찾는다.
비밀번호가 맞는지 확인
토큰 생성하기
스키마에 함수 만드는법 methods.함수이름 = function() {}
comparePassword 함수를 만든다.
비밀번호 비교 bcrypt.compare

12강

토큰 생성
npm install jsonwebtoken --save
스키마에 generateToken 함수 만듬
토큰은 user._id + secretToken 으로 만들어져있는 문자열
토큰을 생성해서 db에 저장
생성된 토큰을 브라우저에 저장해야댐 : 쿠키 or 로컬스토리지
쿠키에 저장하는 방법
npm install cookie-parser --save
res.cookie("x_auth", user.token)

13강

auth 기능 : 로그인된 유효한 유저인지 확인하는 기능
db에 있는 token이랑 쿠키에있는 token이랑 비교
쿠키에 있는 token에서 user._id 값을 찾아냄
req.coookies.x_auth
findByToken 함수 만든다.
이떄 statics으로 만들어야함
jwt.verify(token, 'secretToken', function(err, decoded) {})
db에서 해당 user._id의 토큰값이 일치하는지 확인
auth 라는 미들웨어를 만들어서 거기서 토크 값 확인
그냥 바로 token을 비교하면 안되는것인가?statics이랑 methods 차이점이 뭐지?

14강

로그아웃 하는법 : 토큰을 지워주면 됨

15강

리액트 : 페이스북에서 만든 라이브러리
컴포넌트로 이루어짐
Real DOM / Virtaul DOM
Virtaul DOM에서 Snapshot을 찍어두고 바뀐부분만 Real DOM에 적용

16강

Babel : 자바스크립트 문법을 구형 브라우저에서 돌수있게 변환시켜줌
Webpack : 웹개발이 점점 복잡해짐 -> bundle로 묶어줌
react 설치
npx create-react-app .

17강

npm vs npx
npm : node package manager
따로 -g 안하면 local에 다운받음
npx하면 온라인에있는 node repository를 그대로 쓴다..?
disk space를 낭비 하지 않음
원래는 npm install -g create-react-app 이였는데
npx create-react-app 하면 다운로드 없이 실행 시켜준다!

18강

간단하게 구조만 살펴봄
webpack 이 src를 관리해줌
이미지나 그런건 왠만하면 src에 넣어서 webpack의 기능이 작용할수있게

19강

boiler-plate 구조대로 뼈대 폴더/파일들 만들었음

20강

react-router-dom으로 페이지 이동함
npm install react-router-dom --save
여기있는 코드중 example.js 부분을 그대로 복사해서 App.js에 붙여넣기
그리고 npm run start로 실행
작동확인
Switch 부분 빼고 다 삭제
컴포넌트를 불러온다
import 컴포넌트이름 from 페이지 위치
라우터에 컴포넌트 연결
<Route exact path="/"> <LandingPage /> </Route> <Route exact path="/" component={LandingPage} />
Plain Text
복사

21강

React JS 부분에서 Request 보낼떄 AXIOS 를 씀
JQuery에서 Ajax 같은거
npm install axios --save
Landingpage 가서 테스트용으로 request 보내보자
import React, { useEffect } from 'react' import axios from 'axios' useEffect(() => { axios.get('/api/hello') .then(res => console.log(res)) }, [])
Plain Text
복사
CORS 오류가 발생!

22강

CORS : 서로 다른 도메인은 CORS의 보호 없이는 통신 불가능
Proxy라는걸 써서 해결할것임
npm install http-proxy-middleware --save
seroutProxy.js 만들어서 코드 복사
console 창에 출력되는거 확인
https://brunch.co.kr/@adrenalinee31/1 참고

23강

proxy 가 무엇인지 알아보자
유저랑 인터넷 사이에 존재하는것
아이피를 임의로 바꿈
데이터도 임의로 바꿈
방화벽 기능
웹 필터 기능
캐쉬 데이터, 공유 데이터 제공 기능
쓰는 이유
인터넷 접근 제한 / 빠른 속도 / 보안 등

24강

프론트와 백서버 한번에 켜기
npm install concurrently --save
"dev": "concurrently "npm run backend" "npm run start --prefix ../client""

25강

css framework
Material UI
Reacct Bootstrap
Semantic UI
Ant Design <- 이거 쓸거임
Materialize
npm install antd --save

26강

Redux : 상태 관리 라이브러리
Props
properties
부모-자식 컴포넌트 간에 변수를 주고받을때
부모->자식만 가능
자식이 받은 변수는 바꾸지 못함 immutable
<ChatMessages messages={messages} currentMember={currentMember} />
Plain Text
복사
State
컴포넌트 내부에서 변수 공유
변수가 바뀔수있음 mutable
바뀌면 rerender 된다.
state = { message: '', attachFile; undefined, openMenu: false, }
Plain Text
복사
Store: 글로벌 변수같은 느낌
Data Flow : Component -> ACTION -> REDUCER -> STORE -> Component
Action: 객체형식으로 무엇을할지 미리 정해놓고 씀
Reducer: 실제로 행동이 일어나는곳인듯

27강

npm install redux react-redux redux-promise redux-thunk --save
redux-promis redux-thunk
ACTION 이 무조건 객체 형식만 받음
Promise나 Function도 쓸수있게 해줌
redux 쓰는법
import { Provider } from 'react-redux';
App 컴포넌트를 Provider로 감싸주면 됨
미들웨어 쓰는법
const createStorewithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore)
Provider 컴포넌트에 store={createStorewithMiddleware()} 속성 추가
_reducer 에 index.js 추가
combineReducers : reducers 여러개를 묶어서 root 화
_reducer 폴더 import
크롬 확장 프로그램 설치
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() store 인자로 넘겨

28강

Functional Component
원래는 안됐었는데 hook 업데이트하고 엄청 편리해져서 이거 씀
lifecycle
1.
constructor : 변수 설정 생성자같은거 -> useState 사용
2.
render : 화면에 dom으로 출력
3.
componentDidMount, componentDidUpdate, componentDidUnmount : 데이터 통신부분 -> useEffect 사용

29강 / 30강

Formik, Yup 라이브러리로 다이나믹 하게 가능
LandingPage 보기좋게 살짝 수정
LoginPage에 폼 추가
react hook 으로 이메일/비밀번호 state를 만든다.
onchange 되면 value를 바꿔줌
submit을 위한 핸들러 추가
Axios 를 그냥 쓰지 않고 action(dispatch) 를 쓸것임
props.history.push('/') 이걸로 페이지 이동
import { withRouter } from 'react-router-dom'
export default withRouter(RegisterPage)
history 가 react-router-dom 을 쓰는거라 이거 해줘야댐

31강

RegisterPage 만들기

32강

LandingPage에 로그아웃 버튼 만들어서 redux 안쓰고 그냥 axios 때려서 로그아웃 시킴

33강

로그인 회원만 접근 가능한 페이지에 대한 컨트롤
HOC : component를 받아서 새로운 component 를 리턴하는놈
component 전에 HOC에 보내서 로그인 유무를 서버로부터 받는다 | 미들웨어 같은 느낌
HOC 폴더에 auth.js 만들어
HOC 적용하는 법 : App.js 에서 다른 컴포넌트 호출 전에 Auth로 묶어