SeSAC 웹 풀스텍 4주차 | git, node.js, 모듈

hatban·2022년 11월 26일
0
post-thumbnail

개발문화

  • 좋은 개발문화라고 정해진건 없음

1. Waterfall (폭포수 모델)

  • 가장 익숙한 소프트웨어 개발 기법
  • 고전적
  • 순차적으로 수행하는 것, 병행 수행 x
  • 장점 : 단순해서 이해 쉬움, 문서화 가능, 진행상황 한눈에 명확히 파악 가능
  • 단점 : 이슈 발생 시 한단계씩 위로 올라가야함 , 변경 수용 어려움, 대형 프로젝트에 적용하는 것 부적합, 일정이 지연될 가능성이 크다, 시스템 동작을 후반에 가야만 확인 가능

2. Agile(애자일)

  • 짧은 주기의 개발 단위를 반복해 하나의 큰 프로젝트를 완성해 나가는 것
  • 협력과 피드백이 중요
  • 유연한 일 진행 + 빠른 변화 대응이 중요
  • 짧은 주기로 설계, 개발, 테스트, 배포 과정을 반복
  • 요구사항을 작은 단위로 쪼개 그에 대한 솔루션을 만들고 빠르게 보여줌으로써 요구 사항에 대한 검증을 진행
  • 스크럼, 칸반

2-1 스크럼

  1. 개발자와 고객 사이의 지속적인 커뮤니케이션을 통해 요구사항 수용
  2. 고객이 결정한 사항을 가장 우선적으ㅗㄹ 시행
  3. 팀원들과 주기적인 미팅을 통해 프로젝트를 점검
  4. 주기적으로 제품 시현을 하고 고객으로부터 피드백 수용
  • 작은 기능에 대해 계획, 개발 테스트
  • 스프린트 : 짧은 개발 주기, 기간

2-2 칸반

  • 업무 흐름을 시각화 한것
  • 장점 : 업무 흐름의 시각화, 진행중 업무의 제한, 명시적 프로세스 정책 수립, 업무 흐름의 측정과 관리

Git

  • 소스 코드를 효율적으로 관리하기 위해 만들어진 “분산형 버전 관리 시스템”

사용이유

  • 소스코드의 변경 이력을 쉽게 확인
  • 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 돌아가기 위해

브랜치

  • 독립적으로 어떤 작업을 하기 위해 필요한 개념
Git 명령어

git branch                              #### 브랜치명 확인
git branch “브랜치명”                    #### 새로운 브랜치 생성
git checkout 브랜치명                    #### 해당 브랜치로 전환
git checout -b “브랜치명”                #### 생성과 이동을 동시에
git branch -d 브랜치명                   #### 브랜치 삭제 (삭제는 반드시 자신이 위치한 곳이 아닌 곳에서 삭제할 수있다, 꼭 메인이 아니여도)

Merge

  • git branch 를 다른 branch 로 합치는 과정
  • a브랜치에 b브랜치를 합치고 싶은 경우
git checkout a     #### a로 이동
git merge b        #### a에 b를 합칩

대형 프로젝트를 위해 알아두면 좋은 사실

Branch 종류

  • master (main)
  • develop
  • release
  • feature
  • hotfix

master

  • 제품으로 출시될 수 있는 브랜치
  • 배포 이력을 관리하기 위해 사용
  • 배포 가능한 상태만을 관리

develop

  • 다음 출시 버전을 개발하는 브랜치
  • 기능 개발을 위한 브랜치들을 병합하기 위해 사용
  • 평소 개발을 진행하는 브랜치

feature

  • 기능 개발을 진행하는 브랜치
  • 새로운 기능 개발 및 버그 수정을 할 때마다 develop에서 분기
  • 공유할 필요가 없어 로컬에서 진행 후 develop에 merge해 공유
  • 이름 : feature/~~~

release

  • 출시 버전을 준비하는 브랜치
  • 배포를 위한 전용 브랜치
  • 이름 : release-O.O

hotfix

  • 출시 버전에서 발생한 버그 수정 브랜치
  • 배포한 버전에 긴급하게 수정해야 할 필요가 있는 경우 사용
  • master에서 분기
  • 이름 : hotfix-O.O.O

Git 추가적인 명령어

  • git commit -am : add commit같이하는 것 git add 의 경우 위치를 지정할 수 있지만 add am 은 특정불가, 무조건 전체다
  • add 취소 하고 싶다면 vscode에서는 쉽게 -누르면 취소된다
  • commit 취소하고 싶으면 : git reset HEAD^ 하면 가장 최근 커밋 취소
  • 특정 커밋 취소하고 싶으면 git log해서 log확인 해서 커밋id를 조회한 다음 git reset —hard 커밋id

pull request

  • push 권한이 없는 오픈 소스 프로젝트에 기여할 때 많이 사용함
  • 내가 수정한 코드가 있으니 내 branch를 가져가 검토 후 병합(merge)해주세요!
  • 당황스러운 코드 충돌을 줄일 수 있음

.gitignore

  • 깃 버전관리에서 제외할 파일 목록을 지정하는 파일
  • 깃 관리에서 특정 파일을 제외하기 위해서는 git에 올리기 전에 .gitignore에 추가해야한다.
  • 대신 gitignore에 올라갈 수 있는 것은 한 번도 올라가지 않은 것만 가능하다.
  • 이미 만약 a.txt가 올라갔다면, 즉 git이 이미 관리하기 시작했다면 불가능

Nodejs

  • 구글에서 만들어진 자바스크립트 런타임
  • 이벤트 기반, Non Blocking I/O 모델을 사용해 가볍고 효율적
  • npm 패키지는 세계에서 가장 큰 오픈 소스 라이브러리
🔥 런타임이란

- 프로그래밍 언어가 구동되는 환경
- 자바스크립트 런타임 환경은 웹 브라우저만 존재했다
- 자바스크립트를 서버단으로 언어로 사용하기 위해 나온 것이 nodejs
- 웹 브라우저 없이 실행 가능

특징

  1. 자바스크립트언어 사용
  2. 싱글쓰레드
  3. 비동기 I/O 방식

Single Thread

  • 에러를 처리하지 못하면 프로그램이 아예 중단된다
  • 예외 처리의 중요성! 예외 처리가 중요

Non blocking I/O

  • 기다리지 않고 시작

동기

  • 한 요청에 서버의 응답이 이루어질 때까지 계속 대기
  • 장점 : 설계가 간단하고 직관적
  • 단점 : 결과가 주어질 때까지 아무것도 못하고 기다리고 있어야 한다

비동기

  • 요청한 후 응답을 기다리지 않고 다른 활동을 한다
  • 장점 : 요청에 따른 결과가 반환되는 시간동안 다른 작업을 수행할 수 있다
  • 단점 : 동기식보다 설계가 복잡

모듈

  • 특정한 기능을 하는 함수나 변수들의 집합
  • 재사용 가능한 코드 조각
  • 장점 : 추상화, 캡슐화, 재사용, 의존성 관리

global

  • 노드의 전역 객체
  • 모든 파일에서 접근 가능
  • 생략하여 사용 가능

console 객체

  • 콘솔에 접근할 수 있는 객체, 브라우저마다 조금 다르게 동작,
console.log(obj);
console.log(obj["out"]);
console.error('error');
console.time("시간"); //이것과
console.timeEnd("시간"); //이것은 들어가는 게 같아야한다
console.table([{name: 'abc'}, {name: 'def'}]);
console.dir(obj, {colors : true, depth:1}); //객체 구조 , color : 색을 구분하게 보임
console.dir(obj, {colors : true, depth:2});
console.trace("error");
{ out: { in: { key: 'value' } } }
{ in: { key: 'value' } }
error
시간: 0.044ms
┌─────────┬───────┐
│ (index) │ name  │
├─────────┼───────┤
│    0    │ 'abc' │
│    1    │ 'def' │
└─────────┴───────┘
{ out: { in: [Object] } }
{ out: { in: { key: 'value' } } }
Trace: error
    at Object.<anonymous> (C:\Users\SBAUser\SeSAC_YS\nodejs\221117_1.js:23:9)        
    at Module._compile (node:internal/modules/cjs/loader:1155:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10)      
    at Module.load (node:internal/modules/cjs/loader:1033:32)
    at Function.Module._load (node:internal/modules/cjs/loader:868:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:22:47

Timer 메소드

setTimeout(콜백함수, 밀리초) : 밀리초 후 콜백함수 실행

setInterval(콜백함수, 밀리초) :

setImmediate(콜백함수) : 즉시 콜백함수 실행

clearTimeout(아이디) : setTimeout 끝내기

clearInterval(아이디) : setInterval 끝내기

const func1 = setTimeout(function(){
    console.log("1.5초후 실행");
},1500);

const func2 = setInterval(()=>{
    console.log("1초마다 반복");
},1000);

const func3 = setTimeout(()=>{
    console.log("func3 실행");
},3000);

setTimeout(()=>{
    clearTimeout(func3);
    clearInterval(func2);
},2500);

const func4 = setImmediate(()=>{
    console.log("func4 즉시실행");
});

const func5 = setImmediate(()=>{
    console.log("func5  즉시 실행");
})

clearImmediate(func5);

/*
func4 즉시실행
1초마다 반복
1.5초후 실행
1초마다 반복
*/

Timer메소드는 따로 호출안해도 실행이 된다. 그래서 변수에 담으면 메소드 실행 후 만들어진 아이디가 변수에 담기는 것!

const func1 = setTimeout(function(){
    console.log("1.5초후 실행");
},1500);

// 이렇게 있으면 func1()이렇게 실행하지 않는것! 
//func1에는 setTimeout 실행하고 난 후 생성되는 아이디가 담긴다

filename , dirname

  • __filename : 현재 파일 경로
  • __dirname : 현재 폴더(디렉토리)경로
console.log("__filename : " , __filename); //__filename :  C:\Users\SBAUser\SeSAC_YS\nodejs\221117_1.js
console.log("__dirname : ", __dirname); //__dirname :  C:\Users\SBAUser\SeSAC_YS\nodejs

Process 객체

  • 현재 실행 중인 노드 프로세스 정보
console.log("process.version : ", process.version);
console.log("process.arch : ", process.arch);
console.log("process.platform : ", process.platform);
console.log("process.cpuUsage : ", process.cpuUsage());

OS 모듈

  • 운영체제 정보
  • 모듈이라 가져와서 사용해야 한다.
const os = require("os");
console.log("os.type : ",os.type()); //Windows_NT
console.log("os.cpus : ",os.cpus());
console.log("os.homedir : ",os.homedir());
console.log("os.freemem : ",os.freemem());

Path 모듈

const path = require("path");
const file = __filename;
console.log("path.extname : ", path.extname(file)); // .js : 확장자 이름 가져오기
console.log("path.parse : ", path.parse(file)); // 구분자별로 가져올 수 있는걸 모두 가져오기

url 모듈

  • 인터넷 주소를 쉽게 조작하도록 도와주는 모듈

searchParams는 url의 ?안의 내용을 나눠 놓은 것이다



Javascript 문법

구조분해 할당

  • 배열이나 객체의 속성을 제거해 어쩌고..
  • 기본값 = 없을때 대체하는 것
[item1, item2 = 'peach', item3 = 'orange'] = list;
console.log(item1); //apple
console.log(item2); //banana
console.log(item3); //orange
  • 임시 변수 안 만들고 바꾸는 법
let x = 1;
let y = 3;
[y,x] = [x,y];
console.log(x); //3
console.log(y); //1
  • 객체 구조분해는 순서가 아닌, 이름이 같은 것을 찾는다
  • 객체의 이름을 바꾸고 싶으면 원래이름:바꾸고싶은이름 의 구조
let obj = {
    key1 : 'one',
    key2 : 'two',
};

//let key1 = obj.key;
let {key2,key1 : a, c = 'three'} = obj;
console.log(a);  //one
console.log(key2);  //two
console.log(c); //three
  • 스프레드 문법 : 나머지 애들
  • … 은 무조건 마지막에 넣기
//나머지 연산, 스프레드
let {b, ...rest} = obj;
console.log(b); //2
console.log(rest); //{ a: '1', c: '3' }

클래스

  • 객체를 생성하기 위한 템플릿
/* Car.js */
class Car{
    constructor(color){
        this.color = color;
        this.isDoor = true;
    }

    Ismove(){
        console.log('move');
    }
    IsStop(){
        console.log('stop');
    }
    returnColor(){
        return this.color;
    }
}

module.exports = {Car};

/* index.js */
const {Car} = require('./221117_3'); //구조분해라서 이름 같게
let carA = new Car('red');
let carB = new Car('orange');
let carC = new Car('yellow');
console.log("CarA color : ", carA.returnColor());
console.log("CarB color : ", carB.returnColor());
console.log("CarC color : ", carC.returnColor());

콜백함수

  • callback : 함수가 끝난 뒤 실행되는 함수
  • 함수를 만들 때 파라미터로 함수를 받아서 사용
function login(id, ps) {
    setTimeout(()=>{
        console.log('x');
        return id;
    },2000);
}

const id = login("kim", null);
console.log(id + '님 환영합니다!');
console.log("------------FINISH-------------");

/*
-------------START--------------
undefined님 환영합니다!
------------FINISH-------------
x
*/

⇒ 비동기라 저런 결과! 콜백함수 사용하면 해결

console.log("-------------START--------------");
function login(id, cb) {
    setTimeout(()=>{
        console.log('x');
        cb(id);
    },2000);
}

const id = login("kim", function(id){
    console.log(id + '님 환영합니다!');
    console.log("------------FINISH-------------");
});

/*
-------------START--------------
x
kim님 환영합니다!
------------FINISH-------------
*/

콜백함수를 쓰다보면 Callback Hell에 빠짐

계속 매개변수로 넘겨지는 콜백함수가 반복되어 코드 들여쓰기가 너무깊어짐

⇒ 가독성떨어지고 코드 수정이 어려워진다



프로미스(promise)

  • 콜백헬로 인한 복잡도 증가와 예외처리의 어려움을 해결하기 위해 만들어짐
  • 비동기 작업에서 성공과 실패를 분리해 메소드 수행
  • resolve(value) : 일이 성공적으로 끝난경우 ⇒ 프로미스를 실행한 곳의 then으로들어감
  • rejuect(error) : 일이 성공적이지 않은경우, 에러 발생시 ⇒ 프로미스를 실행한 곳의 catch로 들어감

프로미스 상태

  1. pending : promise 수행 중인 상태
  2. fulfilled : promise가 resolve된 상태
  3. rejected : promise가 지켜지지 못한 상태, reject 된 상태
  4. settled : fulfilled 또는 rejected로 결론이 난 상태


모듈

fs모듈

  • filesystem의 약자로 파일에 접근하고 만들거나 삭제 등등 파일처리에 관련됨

readFile(파일경로, 콜백함수)

  • 파일읽기, 콜백함수의 첫번째 인자는 에러가 있으면 받는 에러, 데이터는 버퍼형태로 출력된다 따라서 문자로 변환해야함
const fs = require("fs");

fs.readFile("./test.txt", function (err, data) {
    if(err) throw err;

    console.log("data : ", data); //data :  <Buffer 74 65 73 74 ed 8c 8c ec 9d bc>
		console.log("data : ", String(data)); // data :  test파일
})
  • 프로미스로 불러올 수 있다
const fs2 = require("fs").promises;
fs2.readFile("./test.txt")
    .then((res) =>{
        console.log("data : ", String(res));
    });

writeFile(파일경로이름, 내용)

  • 파일쓰기
  • resolve로 넘기는게 없다
fs2.writeFile("./write.txt", "hyebin")
    .then((res)=>{
        return fs2.readFile('./write.txt');
    })
    .then((res) => {
        console.log("data : ", String(res));
    })

http 통신

  • 클라이언트와 서버가 통신하는 것 : tcp connection
  • 클라이언트가 서버에게 요청(request) 보냄 ⇒ 서버는 요청을 처리하고 응답(response)함

http 모듈

  • nodejs를 통해 서버를 구축하는 방법은 http와 express두개가 있다
  • 웹 서버를 구동하기 위한 nodejs 내잡 웹 모듈
  • server 객체 request객체 response 객체 사용
  • 요즘은 거의 express쓴다
const http = require("http");

//req : 클라이언트가 서버에게 요청하는 내용 , res : 서버가 클라이언트에게 응답하는 내용 
const server = http.createServer(function(req,res){
    res.write("<h1>Hello</h1>");
    res.end("<hr>");
});

/* server.on()//이벤트 등록 함수
server.listen() //서버 실행, 클라이언트를 기다린다 */

server.listen(8080, function(){
    console.log('8080번 포트로 실행');
})

///
const http = require("http");
const fs = require("fs").promises;

//req : 클라이언트가 서버에게 요청하는 내용 , res : 서버가 클라이언트에게 응답하는 내용 
const server = http.createServer(function(req,res){
    fs.readFile('./test.html')
    .then(function(data){
        res.end(String(data));
    })
});

/* server.on()//이벤트 등록 함수
server.listen() //서버 실행, 클라이언트를 기다린다 */

server.listen(8080, function(){
    console.log('8080번 포트로 실행');
})

response 객체 : writeHead : 응답 헤더, wrtie : 응답 쓰기, end : 응답 끝내기



localhost와 port

localhost

  • 컴퓨터 내부 주소(127.0.0.1)
  • 자신의 컴퓨터를 가리키는 호스트 이름

port

  • 서버 내에서 데이터를 주고 받는 프로세스를 구분하기 위한 번호
  • 기본적으로 http서버는 80번 포트 사용(생략가능, https 는 443)

http 응답

1xx : 처리중 ⇒ 100 : Continue , 102 : Processing

2xx : 성공 ⇒ 200 : OK, 201 : created, 202 : Accepted

3xx : 리다이렉트(다른페이지로 이동)

4xx : 요청 오류 ⇒ 400 : 잘못된 요청, 410 : 권한 없음, 403: 금지됨, 404 : 찾을 수 없음

5xx : 서버 오류

node 하고 명령어 칠때 경로는 명령어를 치는 곳의 위치로 보게된다

후기

개발문화라든지, 실제로 많이 쓰는 git같은 실무에서 쓰일많안 이론적인것들을 배웠다. 프로미스가 아직 조금 어색해서 더 공부를 해봐야겠다. 깃브랜치 종류를 생각하지 않고 평소에는 그냥 푸시했는데 그렇게 했다가는 나중에 큰일나겠구나..생각을 했고 이제 프로젝트를 진행하면서 적용해볼 생각에 기대가 된다..!

0개의 댓글