리눅스는 역시 아직 많이 낯설다!
하지만 느낀점은 이게 익숙해지면 엄청 편할 것 같다!!
Command-Line Interface
컴퓨터를 조작하기 위해서는 다양한 입력(Input)이 필요한데, 화면을 보기 위해 마우스를 사용하거나 메세지를 입력하기 위해 키보드를 사용하기도 한다. 입력을 담당하는 키보드나 마우스를 입력 소스(Input source)라고 한다.
반대로, 입력 소스에 의해 또는 작성된 프로그램에 의해 모니터에 화면을 나타내거나, 음악을 재생하거나 사용자가 인식할 수 있도록 하는 일을 출력(Output)이라고 한다.
컴퓨터를 조작하기 위한 입력과 출력을 간단하게 I/O( Input/Output )라고 한다.
리눅스의 터미널은 키보드의 입력과 모니터의 출력으로 모든 작업을 할 수 있다. 리눅스 터미널은 GUI가 개발되기 이전부터 컴퓨터를 조작하기 위해 사용되었기 때문에, GUI가 할 수 있는 모든 작업은 CLI로 할 수 있다. 다만 사람이 키보드로 입력하면 모니터에 글자로 출력하기 때문에 GUI에 익숙해진 우리에겐 낯설게 느껴질 뿐이다.
CLI는 아직 여러가지 측면에서 유리하다. 대표적으로 아마존 웹 서비스의 클라우드 컴퓨팅처럼, 대랑의 서버 컴퓨터를 설치해야 하는 서비스를 잠시 살펴보면 하나의 데이터 센터에는 최소 5만 개 이상의 서버 컴퓨터가 설치되는데 이렇게 수많은 컴퓨터에 GUI를 적용하기 위해 서버 컴퓨터마다 I/O 소스(키보드, 마우스, 모니터 등)를 부착하는 일은 불가능에 가깝다.
AWS 이전 세대의 개발자들은 GUI가 없는 서버 컴퓨터를 어떻게 다룰 수 있었을까?
CLI를 이용해 서버 컴퓨터로 접속을 요청하면, 서버 컴퓨터는 요청한 컴퓨터의 출력 소스(모니터)를 이용한다. 개발자들은 서버 컴퓨터에 직접 찾아갈 필요없이, 자신의 모니터로 서버 컴퓨터와 소통했다. 이 방법은 매우 효율적이어서 지금도 많은 현직 개발자가 이 방법을 통해 서버 컴퓨터와 소통한다. 그리고 대부분의 서버 컴퓨터는 무료로 이용할 수 있는 Linux 운영체제가 설치되어 있다.
CLI 명령어
* 터미널은 CLI(Command-Line Interface)이다. 입력하는 글자와 출력되는 글자로 컴퓨터와 소통할 수 있다. 컴퓨터가 출력하는 글자를 읽을 수 있어야 한다. 무슨 뜻인지 모르더라도, 일단 읽어야 다음 스텝이 가능하다.
프롬프트(Prompt)
키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간을 프롬프트(Prompt)라고 한다.
pwd: 현재 위치 확인하기
pwd
=> 현재 위치를 확인할 수 있는 명령어
=> print working directory의 약자. 여기서 말하는 디렉토리는 폴더라고 한다.
mkdir: 새로운 폴더 생성하기
mkdir helloWorld
=> 폴더를 생성하기 위해 사용하는 명령어
=> 생성할 폴더 이름을 출력하는 명령어 필요
ls: 특정 폴더에 포함된 파일이나 폴더 확인하기
ls
=> 특정 폴더에 포함된 파일이나 하위 폴더의 리스트를 출력한다.
=> ls 는 list의 약자.
ls에는 자주 사용하는 옵션 l 과 a 가 있다. CLI에서 특정 명령어의 옵션을 사용하는 경우에는 - 를 이용해 옵셪을 입력했다고 컴퓨터에게 전달한다.
- ls -l
- ls -a
- ls -al 또는 ls -la
위의 세 번째 예시에서, 옵션을 뜻하는 - 뒤에 오는 옵션이 순서는 기능에 영항을 미치지 않는다.
옵션 a는 "all"이라는 의미이다. 숨어있는 폴더나 파일의 포함한 모든 항목을 터미널에 출력한다.
옵션 l은 폴더나 파일의 포맷을 전부 표현하라는 의미이다.
명령어 ls에 옵션 l을 함께 사용한 경우 확인할 수 있는 포맷
drwxr-xr-x
-rw-r--r--
d로 출력된 경우는 폴더를, -로 출력된 경우는 파일을 나타낸다. 폴더는 cd를 통해 진입할 수 있지만 파일이라면 진입할 수 없다.
명령어를 이용해 폴더를 GUI의 탐색기로 실행하기
macOS
open .
바탕화면도 하나의 폴더이다. 터미널의 현재 위치를 GUI의 탐색기(파인더)로 열 수 있다.
cd: 폴더에 진입하기
cd helloWorld
=> change directory이 약자로, 프론프트로 상호작용하는 폴더를 다른 폴더로 변경하겠다는 의미이다.
touch: 파일 생성하기
touch hi.txt
=> .txt 파일 만든다.
cat: 파일의 내용을 터미널에 출력하기
cat hi.txt
=> 파일의 내용을 확인할 수 있다.
rm: 폴더나 파일 삭제하기
rm bye.txt
=> rm은 폴더나 파일을 삭제할 때 사용한다.
=> rm으로 삭제한 폴더나 파일은, 휴지통을 거치지 않고 삭제된다.
=> rm은 단일 파일은 삭제할 수 있다. 폴더를 삭제하려면 옵션 -rf를 사용해야 한다.
rm -rf bye
* 옵션 r 은 "recursive"를 뜻하고, f 는 "force"를 뜻한다. r은 폴더를 지울 때 사용하고, f는 질문을 받지 않고 지울 때 사용한다.
mv: 폴더나 파일의 이름을 변경, 또는 폴더나 파일의 위치 옮기기
명령어 mv는 move의 약자로, 폴더나 파일을 이동할 때 사용한다. GUI에서는 Drag & Drop을 이용해 가능하다.
mkdir bye
touch bye.txt
mv bye.txt bye/
mv 뒤에는 순서대로 [폴더나 파일의 이름] [도착 폴더의 이름] 을 입력한다.
cp: 폴더나 파일을 복사하기
cp helloWorld.txt hiComputer.txt
=> cp는 copy의 약자로 폴더나 파일을 복사한다.
=> cp [ 원본 파일 이름] [ 복사할 파일 이름 ]
관리자 권한과 경로
사용자와 관리자
컴퓨터 운영체제에는 사용자와 관리자가 있다. MS(MicroSoft)사에서 개발한 윈도우즈의 초기 버전에는 관리자 권한이 없었으나, 항상 관리자 권한으로 실행되어오다 보니 해킹이나 악성코드 등으로 인한 피해가 많아졌다.
악성코드와 프로그램 충돌로 인해 고통받는 고객을 보호하기 우해 Vista에 "사용자 계정 컨트롤"을 탑재했다. 사용자 계정 컨트롤(UAC , User Account Control)은 시스템을 관리하는 관리자와 사용자를 구분한다. 관리자는 프로그램을 설치하거나 변경 또는 삭제하는 권한을 가지고 있고, 사용자는 프로그램을 실행할 수 있지만 변경할 수 없도록 제한된 권한을 가지고 있다.
리눅스 기반의 운영체제 중 Ubuntu에서는 사용자가 절대 관리자 권한에 접근할 수 없도록 구분해두었다. 그러나 새로운 프로그램을 설치하거나 변경 또는 삭제할 때 관리자 권한이 반드시 필요하기 때문에 특정 명령어를 입력하는 것으로 잡시 관리자 권한을 빌려올 수 있다.
절대 경로와 상대 경로
pwd 로 확인할 수 있는 절대 경로와 현재 위치로부터 상대적인 위치를 나타내는 상대 경로로 나뉜다. 절대 경로는 기준점으로부터 절대적인 위치를 나타내는데, 이 기준을 루트 폴더( / )라고 한다. 즉, 절대경로는 특정 폴더나 파일이 루트 폴더로 부터 어떤 폴더로 진입하는 경우 만날 수 있는지 나타낸다.
상대 경로는 특정 폴더 또는 파일 위치를 현재 위치를 기준점으로 나타낸다. 현재 위치한 폴더는 점( . )으로 표현하고, 상위 폴더는 두 개의 점( .. )으로 표현한다. 현재 경로에서 ls를 통해 확인되는 폴더나 파일은, 상대 경로로써 ./ 로 표현할 수 있다. 점( . ) 은 현재 폴더를, ( / )는 폴더 내부를 나타낸다. 따라서 ./ 는 "현재 폴더 아래의" 라는 뜻이다. ./hi는 현재 폴더의 아래 폴더 hi를 나타낸다.
관리자(root) 권한
절대 경로의 기준점인 루트 폴더(/)는 Linux의 관리자 영역이다. 일반 사용자의 권한으로는 어떤 폴더나 파일도 생성, 변경, 삭제할 수 없다.
루트폴더로 이동하여 명령어 mkdir을 이용해 폴더 test를 생성하면, "Read-only file system" 이라는 에러를 만난다. 읽기 전용(Read-only)이라는 말은, 폴더나 파일을 생성, 변경 또는 삭제할 수 없다는 의미이다.
사용자 권한은 username 폴더 내에서만 자유롭게 사용할 수 있다.
* 사용자 폴더의 경로(Path)는 ~/로 표시된다. 물결 기호(~)는 루트폴더(/)로부터 사용자 폴더(username)까지의 경로를 축약한 형태이다.
사용자가 새로운 프로그램을 설치하거나 변경 또는 삭제할 때에는, 관리자 권한이 필요하다. 사용자가 관리자 권한을 필요로 할 때, 사용자 권한을 이용할 수 있는 명령어 sudo가 있다.
sudo: 관리자 권한을 획득하는 명령어
명령어 sudo는 사용자 환경에서, 관리자 권한을 획득하는 명령어이다.
명령어 ls -l을 통해 특정 폴더나 파일이 사용자 또는 관리자의 소유로 생성되었는지 확인할 수 있다.
하나는 mkdir만 사용하고 다른 하나의 폴더는 명령어 mkdir 앞에 명령어 sudo를 추가해 폴더를 생성한다.
mkdir justMkdir
sudo mkdir sudoMkdir
명령어 sudo를 이용해 생성한 폴더의 소유자는 루트이다. 다시 말해 사용자 권한이 아니라, 관리자 권한으로 생성되었다는 뜻이다.

=> 관리자 권한은 사용자가 프로그램을 설치, 변경 또는 삭제하는 권한을 차단하여 시스템을 안전하게 보호한다. 사용자는 주어진 권한만 사용할 수 있으며, 프로그램을 설치, 변경 또는 삭제하기 위해서는 관리자 권한을 획득하여야 한다. 사용자가 관리자 권한을 일시적으로 획득하는 명령어는 sudo이다.
텍스트 에디터 nano
CLI에서 환경에서 유명한 vim(vi), emacs 등이 있다. 하지만 초보자한테 적합한 neno를 먼저 해보자.
nano 실행
code hello.js
GUI 에디터이 VScode를 위와 같이 CLI에서 실행할 수 있다.
nano hello.js //hello.js 를 nano에서 연다.
nano //그냥 실행할 수도 있다.
패키지와 패키지 매니저 개요
리눅스 운영체제의 패키지와 패키지 매니저는, 포장된 삼품과 온라인 쇼핑몰 같은 역할은 한다. 패키지는 여러 파일이 담겨있는 하나의 상자이다. 이렇게 여러 파일들 담고 있는 하나의 파일을 '압축 파일'이라고 한다. 리눅스의 패키지는 여러 파일을 모아 하나의 파일로 저장하고 있는 압축파일이다. 하나의 패키지는 어떤 파일로 구성될까? 패키지 안에 들어 있는 파일의 구성은 기본적으로 다음과 같다.
- 프로그램 파일
- 프로그램 설치 파일
- 프로그램 설치 설명서
- 프로그램에 대한 정보를 담은 파일
패키지 안에는 하나의 프로그램이 정상적으로 설치되고 동작하기 위한 모든 파일이 압축되어 있다.
패키지 매니저를 사용하지 않고 프로그램을 독립적으로 설치하면 큰 단점이 있다. 여러 프로그램을 개별로 설치하기 위해서는 각각의 프로그램이 저장된 위치를 알아야 한다. 모든 프로그램이 여러 군데 펴져 있고 업테이트 확인 위해 주기적으로 저장소를 방문해서 확인해야 한다. 설치된 프로그램이 늘어난다면, 모든 프로그램을 업데이트하는 일이 불가능 해지기 때문에 이러한 단점을 보완하기 위한 도구가 바로, 패키지 매니저 이다.
패키지 매니저는 패키지의 설치, 변경, 삭제 등 관리를 편리하게 해주는 도구이다. 패키지 매니저를 스마트폰으로 비유하면 앱스토어와 역할이 비슷하다. 앱 스토어를 이용해 필요한 앱을 설치하는 것처럼, 리눅스 운영체제의 사용자도 패키지 매니저를 이용해 필요한 패키지를 설치할 수 있다.
튜토리얼

홈브류는 맥OS용 패키지 관리 애플리케이션이다. 홈브류 이전에도 커맨드라인에서 맥OS용 패키지 관리자들이 있었지만, 현재는 홈브류가 자리잡았다. 홈브류는 주로 커맨드라인 도구나 시스템 패키지들을 설치하는데 사용한다.
Node.js
Node.js
JavaScript 런타임(runtime)중 하나인 Node.js에 대해 알아보자.
프로그래밍 언어가 구동되는 환경, 즉 어떤 프로그램이 동작할 때, 프로그램이 동작하는 곳이 바로 런타임이다.
크롬, 사파리와 같은 웹 브라우저가 대표적인 JavaScript 런타임이다. 그래서 JavaScript의 주된 용도는 웹페이지를 구성하는 것이다.
그러나 Node.js라는 새로운 JavaScript 런타임이 등장하게 되면서, 웹 브라우저가 아닌 곳에서도 JavaScript을 실행될 수 있게 되었다. JavaScript를 통해 웹페이지를 구성하는 것을 넘어 서버를 구축하는 등 활용폭이 크게 확장되었다.
=> 런타임이란, 프로그래밍 언어가 실행되는 환경, 그리고 Node.js는 JavaScript 런타임이다.
Node.js에서 JavaScript를 실행시키기 위해서는, Node.js를 설치해야 한다. 별도의 프로그램을 설치할 수도 있지만, 패키지매니저처러므 node.js의 버전을 관리할 수 있도록 nvm(Node Version Manager)으로 Node.js를 설치한다. nvm을 사용하면 Node.js의 다양한 버전을 쉽게 설치하고, 사용할 수 있다.
◈ nvm은 Node.js의 다양한 버전을 관리하는 프로그램이다.
npm & package.json
package.json 생성하기
터미널에 새로운 package.json을 생성해보자. 먼저, 임의의 경로에 새로운 폴더를 생성하고 폴더 내부로 이동.
mkdir codestates
cd codestates
새로운 package.json 파일을 생성하기 위해서는 npm init 명령어를 입력하면 된다.
npm init
그런 다음 package.json 파일에 들어갈 정보를 차례대로 입력한다. 정보를 입력하지 않으면 기본값으로 생성된다.

위 과정을 모두 생략하고 만들고 싶다면 npm init -y 를 입력하면 된다.
하나의 프로그램은 다양한 모듈이 합쳐져서 만들어진다. 이러한 남들이 만들어 놓은 node.js에서는 모듈이라는 이름으로 부르며, 이에 대한 정보를 담아둔 곳이 바로 package.json이다.
package.json?
- npm 모듈을 활용하기 위해 해당 모듈에 대한 정보를 담은 파일
- 즉, 프로젝트 전반에 관한 정보가 들어있다.
npm
리눅스의 패키지 매니저가 apt, macOS의 패키지 매니저가 brew이 듯, node.js 패키지 매니저는 npm이다. 앞으로 필요한 모듈은 대부분 npm에서 다운받아 사용하면 된다.
pacage.json의 장점은 프로젝트 코드를 전달할 때, 포함하고 있는 모든 모듈을 다 전다하지 않아도 된다. 우리는 다르 사람에게 "필요한 모듈만 package.json에 적어놨으니 네가 직접 다운 받아서 쓰면 돼~ "라고 말할 수 있다.
package.json에 적혀있는 내용을 살펴보자.
먼저, devDependencies는 이 프로젝트에서 개발하는 환경에서 필요한 모듈이 무엇인지가 적혀있다. 예를들면 코드 모양을 잡아주는 Init이나 테스팅 모듈처럼, 실테 프로젝트 동작에 직접적으로 영향을 주지 않는 모듈들을 명시한다.
npm install mocka --save-dev
//참고로 mocha라는 모듈은 테스트를 위해 필요하다.
npm install을 이용하면, npm에 있는 모듈을 설치할 수 있는데, 이 때 --save-dev 옵션과 함께 설치하면 자동으로 devDependencies에 추가된다.
dependencies는 devDependencies와는 다르게, 이 프로젝트가 돌아가기 위해 반드시 필요한 모듈들이 무엇인가 적혀있다.
npm install react
//또는
npm install --save react
--save 옵션과 함께 설치하면, 자동으로 dependendies에 추가된다. --save 옵션은 생력해도 된다.
why save?
- 그런데 왜 이런 내용들을 package.json에 기술해야 될까?
내가 만든 프로젝트가 어떤 모듈이 필요하고, 이 프로그램을 어떻게 실행시킬지를 잘 알고 있어야 하는데 아무것도 모르는 사람이 내가 만든 프로젝트를 실행시킬 때 어떻게 해야 프로그램이 실행시킬 수 있을지 어떤 모듈이 있는지 알 수 없기 때문에 기술을 해야 된다.
=> 우리가 아는 npm install은 package.json에 있는 dependency 바탕으로 설치된다.
- 만일 dependency 정보를 적지 않았다면?
코드에서는 해당 모듈을 쓰고 있지만, 무엇을 설치해야 이 프로그램이 작동되는지, 무엇을 설치 해야 이 프로그램을 개발할 수 있을지 알 수가 없다.
=> 코드에서는 해당 모듈을 쓰고 있지만 npm install로는 설치되지 않는다.
scripts 항목
scripts 항목은 CLI에서 사용 가능한 명령을 기술한다. 이를 npm script라고 부른다.
CLI에서 실행할 때는 아래 처럼 사용한다.
npm rum <스크립트 이름>
| 작업 내용 | 실행 스크립트 |
| node.js 앱 실행 | npm run start |
| 테스트 실행 | npm run test |
| 코드 검사 | npm run Iint |
| 과제 제출(코드스테이츠 Only) | npm run submit |
'git' 카테고리의 다른 글
| <16> 생활코딩 - GIT (0) | 2022.12.05 |
|---|---|
| <15> 생활코딩 - GIT (0) | 2022.12.04 |
| <14> 생활코딩 - GIT (0) | 2022.12.03 |
| <13> 생활코딩 - GIT (0) | 2022.12.03 |
| <12> 생활코딩 - GIT (0) | 2022.12.03 |
댓글