---
# System prepended metadata

title: 서울숲_T_Day07 리뷰 레포트

---

# 서울숲_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 고가용 솔루션의 인프라 등에 사용되고 있다. 

  ![unix and unix-like operating systems](https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Unix_history-simple.svg/1920px-Unix_history-simple.svg.png)
  
  - 참고
    - 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로 남아있다. 
    
    &#35; 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을 사용하여 생산성 높게 작업을 하되, 작업물들을 트랜스파일링하여 배포함으로서 다양한 브라우저들을 지원할 수 있게 처리한다.
