# 서울숲_T_Day07 리뷰 레포트
### 참석자
- 이창권, 손상렬, 서보현
## 1. 코드 동작 이해
- 가상머신
- 목적 : 다른 OS를 실행, 독립된 환경을 마련, 테스트를 위해서 환경 자체를 저장하고 다시 쓰거나 배포하는 등도 가능하다.
- ssh를 설치
- ssh는 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 의미한다.
- ssh로 접속 시 인증 방법에는 크게 2가지로, 공개키를 이용하거나 비밀번호를 이용하는 방식이 있다.
- 쉘 스크립트에서 패스워드로 ssh접속하여 파일 복사하는 코드
```script
sshpass -p{Password} scp -o StrictHostKeyChecking=no {복사할 파일} {원격아이디}@{원격주소}:{복사될원격서버경로}
```
- 리눅스(Linux)
- 하나의 컴퓨터를 여러 사람이 사용할 수 있는 멀티유저 운영체제이기 때문에 권한관리가 중요.
- chmod 명령어를 통해 파일 권한을 변경할 수 있음
```script
chmod 764 backup
```
- 쉘 스크립트(shell script)
- shell script이용 시, 서버에서 원하는 동작을 자동화할 수 있다.
- 새로운 pc이용 시, 개발환경을 손수 구축해야 하지만 쉘 스크립트를 이용해 한번에 처리할 수 있다.
- 예시 코드
```script
mkdir ./temp
for file in $directory/*
do
if [ ${file: -3} == ".js" ]
then
cp $file ./temp/
fi
done
```
- 쉘스크립트 cheatsheet : https://devhints.io/bash
- 타입 스크립트(type script)
- 자바스크립트의 태생적 문제를 극복하고자 AltJS(자바스크립트의 대체 언어)가 등장하였는데, 대체 언어들 중 가장 주목받고 있는 언어라고 할 수 있다.
- 컴파일 언어, 정적 타입 언어
- 타입 기반 언어
1. 타입 스크립트 = 자바 스크립트 + 타입
2. 컴파일 단계에서 타입 오류를 잡아낼 수 있고, 코드 어시스트 기능도 지원받을 수 있음
3. 암묵적 형변환, 호이스팅, 복잡성 문제 해결
```typescript
var fruit = "apple";
{
// javascript에서는 호이스팅 문제로 이와 같은 중복선언이 불가능했으나 typescript에서는 가능
let fruit:string = "banana";
console.log(fruit);
}
console.log(fruit);
> banana
> apple
```
## 2. 코드 동작 개선
- 리눅스 역사와 유닉스와 차이를 학습한다.
- 유닉스
- 유닉스(영어: Unix)는 교육 및 연구 기관에서 즐겨 사용되는 범용 다중 사용자 방식의 시분할 운영 체제이다. 1970년대 초반 벨 연구소 직원인 켄 톰슨, 데니스 리치 등이 처음 개발하였다.
- 유닉스는 처음부터 다양한 시스템 사이에서 서로 이식할 수 있고, 멀티 태스킹과 다중 사용자를 지원하도록 설계되었다.
- 서버에 '특화'된 운영체제로 보안성도 뛰어나며, 이식성, 유연성, 호환성, 가상메모리 등으로 세계적인 기업들이 유닉스 시스템으로 서버를 운영관리하게 됐다.
- 리눅스
- 이런 유닉스의 장점을 그대로 차용하고 가격을 무료화한 유닉스-유사 시스템을 만들려는 시도가 있어오는 중에, 1991년 리누스 토발즈가 취미 삼아 개발한 커널, 리눅스가 등장했다.
- 리눅스는 운영 체제이자 혹은 커널을 뜻하기도 한다. 리눅스는 자유 소프트웨어와 오픈 소스 개발의 가장 유명한 표본으로 들 수 있다. 리눅스는 다중 사용자, 다중 작업(멀티태스킹), 다중 스레드를 지원하는 네트워크 운영 체제(NOS)이다.
- 벤더 독립성과 적은 개발비, 보안성과 안전성등으로 꾸준히 사랑받고 있다. 리눅스 재단에 따르면 퍼블릭 클라우드 워크로드의 90%, 세계 스마트폰의 82%, 임베디드 기기의 62%, 슈퍼 컴퓨터 시장의 99%가 리눅스로 작동한다.
- 차이점
- 리눅스
- 무료(유료버전도 있다)
- 커뮤니티에 의해 개발됐다.
- 모바일폰, 태블릿 컴퓨터, 비디오콘솔, 슈퍼컴퓨터 등 다양한 하드웨어에 설치가 가능하다.
- 유닉스
- 유료이며 판매 회사별로 가격이 다르다.
- Solaris(Oracle), AIX(IBM), HP-UX가 큰 3개의 제조사이고, Apple의 OSX도 있다.
- 인터넷서버, 워크스테이션과 PC들에 사용되고, 금융 인프라, 24x365 고가용 솔루션의 인프라 등에 사용되고 있다.

- 참고
- https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4
- https://en.wikipedia.org/wiki/Unix
- https://leeject.tistory.com/108
- 여러 가지 쉘 종류에 대해 학습한다.
**쉘은 '줄'단위로 해석하여 명령을 수행한다. 프롬포트에서 명령을 읽을 때도, 스크립트 파일을 읽을 때도 한 줄씩 받아 읽는다.**
1. Bourne shell
- 구조적 프로그램을 만들 수 있는 프로그램 언어를 내장했고, 특히 입/출력 제어에 강력하는 기능을 제공. 다만, 대화식 사용자 환경에는 매우 빈약하다. 모든 쉘의 토대가 되는 기본 원칙을 견고하게 다져놓음.
2. C shell
- 대화식 사용자 환경을 강화하고 새로운 개념(job control, history, alias 등)을 도입. 네이밍에서 볼 수 있듯이 언어 구조가 C언어랑 매우 유사하기 때문에 C언어를 사용하는 사람은 이해하기가 쉽다.
3. TC shell
- 새로운 기능(command line editing, spelling correction, login/logout watching 등)을 추가. 그러나 C shell을 표준으로 하여, 비표준 shell로 남아있다.
# Bourne shell vs. C shell
```shell
#!/bin/sh
if [ $days -gt 365 ]
then
echo This is over a year.
fi
#!/bin/csh
if ( $days > 365 ) then
echo This is over a year.
endif
```
- 타입스크립트가 자바스크립트 다른 점에 대해 학습하고, ts 파일과 js 파일을 비교한다.
- Typescript장점
- TypeScript 의 특징 중 컴파일시점의 타입 체크, 인터페이스, 클래스 기반의 디자인 패턴 등은 다른 언어 기반에서도 많은 개발자들에게 이미 익숙
- 대부분의 JavaScript 로 변환되는 언어들이 커뮤니티의 노력으로 운영되는 반면, TypeScript 는 공식적으로 Microsoft 의 지원을 받는다
- JavaScript 표준과 상호 호환이다. Typescript를 컴파일만 하면 Javascript파일로 만들 수 있으므로, 사용하고 싶은 기능만 사용도 가능하다.
- Javascript장점
- 함수형 프로그래밍을 하기에 Typescript보다 좋다
- 견해 차이는 존재하지만, 생산성에 Javascript가 더 좋다는 해석도 존재한다.
- Typescript는 d.ts에 따라 새로운 의존성이 생겨 npm의 장점을 희석시키지만, Javascript만 사용시 이러한 새로운 의존성은 없다.
## 3. Consideration
- 셀 스크립트에 활용한 다양한 사례에 대해서 조사해보자.
- linux의 cron과 조합하여 다양한 자동화 작업에 활용할 수 있다.(예시 : database화된 지인들의 생일 알림 메일 보내기)
- 시스템을 감시하며 문제 발생시 자동 대처(예시 : 하드 디스크 사용량이 90%가 넘었을 때 자동으로 alert)
- 원격 디바이스 제어 (예시 : 라즈베리 파이에서 ip 변경 감시 및 알림)
- 외에도 시스템 환경 제어, 자동화, 어플리케이션 설치, 변경점 배포 등등 셀을 활용해서 할 수 있는 많은 작업들을 할 수 있다고 한다.
- 참고
- http://emertxe.com/blog/2017/12/automation-using-shell-script.html
- 타입스크립크를 왜 써야하는지 각자 나름의 이유를 찾아서 비교하고 정리한다.
- 자바스크립트와는 달리 Type이 있어, 정확함을 보장할 수 있어 버그를 찾기 쉽게 만들어준다.
- 컴파일 타임에 어느 부분이 잘못되었는지 알려주어 리팩토링 부분에서 정적 타이핑의 강점이 드러난다.
- 타입스크립트는 자바스크립트의 확장이므로 '타입스크립트 <-> 자바스크립트'의 변환이 자유롭다. 이를 이용해 각 언어의 장점이나 특색을 살려서 사용할 수 있다.
- 결론적으로 유지보수에 아주 뛰어난 장점을 가지고 있다.
- babel 도구의 트랜스파일링 동작방식과, 실무에서 babel도구가 어떤목적으로 사용되는지 조사하자.
- Babel은 ES6/ES7 코드를 ECMAScript5 코드로 transpiling 하기 위한 도구이다.
- Babel은 다양한 작은 모듈들로 구성되어 있으며, 다양한 모듈을 담는 일종의 상자 역할을 하며 코드를 컴파일 하기 위해 작은 모듈들(ex. presets)을 사용한다.
- babel의 트랜스 파일링 동작방식
1. 파싱(Parsing) : 소스코드를 가지고 추상적인 형태의 코드로 변환. 이 추상적인 형태의 코드를 추상구문트리(AST)라고 부른다.
2. 변환(Transformation) : 파싱된 추상구문트리를 받아와 각 브라우저의 환경에 맞는 결과로 변환. 이과정에서 preset/plugin이 처리된다.
3. 코드 생성(Generation) : 2단계에서 생성된 추상구문 트리를 바탕으로 실제 브라우저 환경에 맞는 소스코드로 변환하는 과정. 기술만하는 단계가 2단계라면 실제로 코드를 생성하는 단계가 3단계이다
<img src="https://k.kakaocdn.net/dn/cnn1K8/btqu2UQqFvm/iI4WS91ahe3W8kcOau5sv0/img.jpg" style="width:600px; height:400px"/>
- ES6/ES7을 사용하면 생산성이 높아지는데, 아직 이를 지원하지 않는 브라우저들이 많이 존재한다. babel을 사용하여 생산성 높게 작업을 하되, 작업물들을 트랜스파일링하여 배포함으로서 다양한 브라우저들을 지원할 수 있게 처리한다.