계층형 쿼리

개발을 하다보면 메뉴구성, 조직도 등 같은 테이블 내에서 계층적으로 데이터를 처리해야 하는 경우가 많다.
자주 사용 되기도 하고, 이번 프로젝트에서 이 부분에 대한 삽질을 많이 했기 때문에 정리를 해본다.
계층형(hirarchical) 구조는 계급적, 수직적인 관계로 2진 트리 관계라고 할 수 있다.
실습은 Oracle emp 를 이용하며 설치 여건이 안되므로 livesql를 이용한다.
사용법은 여기서 보면 된다.

계층 구조와 용어

(계층 구조와 용어 이미지 만들어 올리기.)

  • 노드 (node) : 테이블 상의 각각의 row를 노드라고 한다.
  • 루트 (root) : 트리 구조의 최상위에 있는 노드를 의미한다.
  • 부모 (parent) : 부모노드. 트리 구조에서 상위에 있는 노드를 부모라고 한다.
  • 자식 (child) : 자식노드. 트리 구조에서 하위에 있는 노드를 자식이라고 한다.
  • 리프 (leaf) : 리프노드 혹은 말단노드. 하위에 연결된 노드가 없는, 자식이 없는 노드이다.
  • 레벨 (level) : 트리구조에서 각각의 계층을 의미한다. 루트부터 순차적으로 1씩 올라간다.

SELF JOIN

테이블 개수가 1개이며 각 ROW가 상위 코드로 부모 자식 관계로 연결 되어 셀프 조인을 사용한다.
최상단 노드의 경우 상위 코드가 NULL 이므로 외부 조인도 사용한다.

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)

결과

ENAME   EMPNO  MGR_NN
- - - - - - - - - - - -
BLAKE   7698    KING
CLARK   7782    KING
JONES   7566    KING
ALLEN   7499    BLAKE
WARD    7521    BLAKE
MARTIN  7654    BLAKE
TURNER  7844    BLAKE
JAMES   7900    BLAKE
MILLER  7934    CLARK
SCOTT   7788    JONES
FORD    7902    JONES
ADAMS   7876    SCOTT
SMITH   7369    FORD
KING    7839     - 

동일한 테이블 EMP 를 각각 C, P 로별칭을 주어 셀프 조인 하였고,
C가 하위 ROW, P가 상위 ROW임을 알 수 있다.
계층적인 결과가 나왔지만, 계층형 구조(TREE)와는 다른 결과이다.


START WITH & CONNECT BY

START WITH ... CONNECT BY 절은 계층형 정보를 표현하기 위한 목적으로 나온 조건이다.

문법

SELECT
    [컬럼 ...]
FROM
    테이블
START WITH [최상위 조건]
CONNECT BY [NOCYCLE] [PRIOR] [계층 구조 조건];

예제

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR

결과

ENAME   EMPNO  MGR_NN
- - - - - - - - - - - -
KING    7839     - 
JONES   7566    KING
SCOTT   7788    JONES
ADAMS   7876    SCOTT
FORD    7902    JONES
SMITH   7369    FORD
BLAKE   7698    KING
ALLEN   7499    BLAKE
WARD    7521    BLAKE
MARTIN  7654    BLAKE
TURNER  7844    BLAKE
JAMES   7900    BLAKE
CLARK   7782    KING
MILLER  7934    CLARK

PRIOR 키워드는 이전 결과의 컬럼을 참조하는 키워드로 현재 행의 MGR을 이전 행의 ENPNO와 연결한다는 의미이다.


LEVEL

계층 레벨(depth level)을 나타낸다.

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , LEVEL
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR;
ENAME  EMPNO  MGR_NN  LEVEL
- - - - - - - - - - - - - - -
KING    7839     -      1
JONES   7566    KING    2
SCOTT   7788    JONES   3
ADAMS   7876    SCOTT   4
FORD    7902    JONES   3
SMITH   7369    FORD    4
BLAKE   7698    KING    2
ALLEN   7499    BLAKE   3
WARD    7521    BLAKE   3
MARTIN  7654    BLAKE   3
TURNER  7844    BLAKE   3
JAMES   7900    BLAKE   3
CLARK   7782    KING    2
MILLER  7934    CLARK   3

레벨별로 들여쓰기를 하면 쿼리 결과 볼때 편하다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , LEVEL
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR;
ENAME       EMPNO  MGR_NN  LEVEL
- - - - - - - - - - - - - - - - -
KING         7839   -        1
  JONES      7566  KING      2
    SCOTT    7788  JONES     3
      ADAMS  7876  SCOTT     4
    FORD     7902  JONES     3
      SMITH  7369  FORD      4
  BLAKE      7698  KING      2
    ALLEN    7499  BLAKE     3
    WARD     7521  BLAKE     3
    MARTIN   7654  BLAKE     3
    TURNER   7844  BLAKE     3
    JAMES    7900  BLAKE     3
  CLARK      7782  KING      2
    MILLER   7934  CLARK     3

ORDER SIBLINGS BY

계층형 쿼리에서 ORDER BY 절을 사용하면 계층의 상관 관계가가 유지되지 않은체 정렬이 되어 버린다.
이 문제로 한참 삽질을 했었는데, ORDER SIBLINGS BY를 사용하면 계층 구조를 유지하면서 정렬을 할 수 있다.

일반 ORDER BY를 사용했을 경우

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER BY EMPNO;
ENAME         EMPNO  MGR_NN
- - - - - - - - - - - - - - -
      SMITH   7369    FORD
    ALLEN     7499    BLAKE
    WARD      7521    BLAKE
  JONES       7566    KING
    MARTIN    7654    BLAKE
  BLAKE       7698    KING
  CLARK       7782    KING
    SCOTT     7788    JONES
KING          7839     - 
    TURNER    7844    BLAKE
      ADAMS   7876    SCOTT
    JAMES     7900    BLAKE
    FORD      7902    JONES
    MILLER    7934    CLARK

ORDER SIBLINGS BY를 할 경우

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME         EMPNO  MGR_NN
- - - - - - - - - - - - - - -
KING          7839   - 
  JONES       7566  KING
    SCOTT     7788  JONES
      ADAMS   7876  SCOTT
    FORD      7902  JONES
      SMITH   7369  FORD
  BLAKE       7698  KING
    ALLEN     7499  BLAKE
    WARD      7521  BLAKE
    MARTIN    7654  BLAKE
    TURNER    7844  BLAKE
    JAMES     7900  BLAKE
  CLARK       7782  KING
    MILLER    7934  CLARK

CONNECT_BY_ISLEAF

계층 구조에서 ROW의 최하위 레벨 여부의 반환이다.
해당 ROW가 말단 노드라면 1 아니라면 0을 반환한다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , CONNECT_BY_ISLEAF LEAF
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME        EMPNO  MGR_NN  LEAF
- - - - - - - - - - - - - - - - -
KING          7839   -        0
  JONES       7566  KING      0
    SCOTT     7788  JONES     0
      ADAMS   7876  SCOTT     1
    FORD      7902  JONES     0
      SMITH   7369  FORD      1
  BLAKE       7698  KING      0
    ALLEN     7499  BLAKE     1
    WARD      7521  BLAKE     1
    MARTIN    7654  BLAKE     1
    TURNER    7844  BLAKE     1
    JAMES     7900  BLAKE     1
  CLARK       7782  KING      0
    MILLER    7934  CLARK     1

CONNECT_BY_ROOT

계층구조 쿼리에서 LEVEL이 0인 최상위 로우의 정보를 얻어 올 수 있다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , CONNECT_BY_ROOT C.ENAME ROOTNANME
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME        EMPNO  MGR_NN  ROOTNANME
- - - - - - - - - - - - - - - - - - - -
KING          7839   -        KING
  JONES       7566  KING      KING
    SCOTT     7788  JONES     KING
      ADAMS   7876  SCOTT     KING
    FORD      7902  JONES     KING
      SMITH   7369  FORD      KING
  BLAKE       7698  KING      KING
    ALLEN     7499  BLAKE     KING
    WARD      7521  BLAKE     KING
    MARTIN    7654  BLAKE     KING
    TURNER    7844  BLAKE     KING
    JAMES     7900  BLAKE     KING
  CLARK       7782  KING      KING
    MILLER    7934  CLARK     KING

SYS_CONNECT_BY_PATH

계층 구조에서 ROOT노드부터 현제 노드까지의 PATH 정보를 가져올 수 있다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , SYS_CONNECT_BY_PATH( C.ENAME, '/') PATH
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME         EMPNO  MGR_NN  PATH
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
KING          7839     -      /KING
  JONES       7566    KING    /KING/JONES
    SCOTT     7788    JONES   /KING/JONES/SCOTT
      ADAMS   7876    SCOTT   /KING/JONES/SCOTT/ADAMS
    FORD      7902    JONES   /KING/JONES/FORD
      SMITH   7369    FORD    /KING/JONES/FORD/SMITH
  BLAKE       7698    KING    /KING/BLAKE
    ALLEN     7499    BLAKE   /KING/BLAKE/ALLEN
    WARD      7521    BLAKE   /KING/BLAKE/WARD
    MARTIN    7654    BLAKE   /KING/BLAKE/MARTIN
    TURNER    7844    BLAKE   /KING/BLAKE/TURNER
    JAMES     7900    BLAKE   /KING/BLAKE/JAMES
  CLARK       7782    KING    /KING/CLARK
    MILLER    7934    CLARK   /KING/CLARK/MILLER
728x90
반응형

'Database' 카테고리의 다른 글

[DB] INDEX REBUILD  (0) 2021.01.07
[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03

셸 사용하기

  • 학습 개요
    셸은 명령 행 인터페이스를 제공한다.
    셸 명령의 기본 사용법과 온라인 매뉴얼의 활용법을 살펴본다.
    셸이 제공하는 강력한 기능으로 파이프, 입출력 리다이렉션, 명령 치환, 수식과 변수의 확장 및 환경 변수와 환경 설절 파일 등을 학습한다.

  • 학습 목표

    1. 셸 명령의 기본 사용법을 익히고 온라인 매뉴얼 기능을 활용할 수 있다.
    2. 히스토리 기능과 명령 행 자동 완성 기능을 사용할 수 있다.
    3. 셸의 특수문자, 명령 치환, 수식과 변수의 확장에 관해 설명할 수 있다.
    4. 셸의 환경 설정 파일을 나열하고 설명할 수 있다.

셸 개요

Shell

  • 명령어 해석기 또는 명령 행 인터페이스
    • 사용자와 커널 사이에서 명령어를 해석하여 처리
    • 셸 명령을 사용하면 GUI로는 하기 힘든 다양한 기능을 수행할 수 있음
  • 셸 명령을 프로그램으로 작성하여 처리할 수도 있음
    • 셸 스크립트는 텍스트 파일로, 프로그래밍을 통한 셸 명령의 조합
    • 반복적으로 수행되는 작업을 셸 스크립트로 작성할 수 있음
    • 셸이 쉘 스크립트 파일을 읽어 처리할 수 있음
  • 로그인을 하면 기본 셸이 주어짐.

Shell 사용하기

  • 터미널에서 로그인을 해야 함
  • GNOME 데스크톱에서 터미널 창을 실행 시켜 셸을 사용함
  • '프로그램 > 시스템도구 > 터미널'
    • 여러 터미널 창을 띄워 사용할 수 있음
    • 셸은 명령 프로프트와 명령 행을 제공함
  • 기본적으로 한 라인에 명령을 입력하고 Enter를 쳐 명령을 수행함
    • 결과가 출력되면 명령 프롬프트가 다시 등장함
    • 세미콜론(;)을 사용하면 한 라인에 여러 명령을 입력할 수 있음

Shell의 종류

  • 많은 리눅스 배포판에서 bash를 기본 셸로 사용함
    • 명령 프롬프드로 일반 사용자는 $, root 사용자는 #을 사용함
  • 셸의 종류에 따라 alias 설정, 초기화 파일, 스크립트 작성, 명령 행 완성 기능, 명령 행 편집 기능 등에 차이가 있음

bash shell

  • Bourne Again Shell로 Bourne Shell의 개선된 버전
    • 많은 셸 스크립트의 문법이 Bourne Shell에 기반을 둠
  • C Shell과 Korn Shell의 유용한 기능을 가져옴
  • 실행 명령은 /bin/bash
    • /etc/passwd 파일에 다음과 같은 라인이 있음
    • jeaha:x:500:500:jeaha:/home/jeaha:/bin/bash

셸 선택하기

  • 기본 셸을 변경할 수 있음
    • chsh -s /bin/셸이름
  • 터미널 창은 대화형 셸임
    • 셸을 종료하면 exit 명령어 또는 ctrl + d를 실행
  • 로그인 셸과 비로그인 셸을 구분해야 함.
    • logout 명령은 로그인 셸에서만 사용 가능
    • 셸 프롬프트에서 셸 프로그램을 실행하면 '서브 셸'이 실행 됨

셸 명령

셸 명령의 형식과 실행

  • $명령어 옵션 인수
    • 예) usermod -L jeaha
    • 옵션과 인수는 여럿일 수 있으며 선택적 또는 필수적
  • 명령어는 프로그램의 이름
  • 가장 간단한 형태의 실행은 명령의 이름만 사용
    • who, date, ls, pwd

chsh 명령

  • 기본 셸을 바꾸는 명령
  • chsh [*option*] [*username*]
    • 대괄호는 생략 가능, 이텔릭체는 적당한 내용으로 대체해야 함
    • 복수는 여러 개가 가능하다는 의미

옵션과 인수

  • 짧은 옵션 -
    • li -l
    • ls -latls -l -a -t는 같은 것
  • 긴 옵션 --
    • ls --all
  • 인수는 명령의 수행 대상을 지정하는 것
    • cat -n /etc/passwd
    • grep "jeaha" /etc/passwd
  • 옵션도 인수를 가질 수 있음
    • chsh -s /bin/sh jeaha
    • chsh --shell=/bin/bash jeaha

명령어의 종류

명령어 설명
엘리어스 alias 명령을 사용하여 만든 명령의 별칭
셸 예약어 예약된 단어로 do, while, case
함수 셸에서 수행되는 함수의 정의
내장 명령 셸 내부에 존재하는 명령으로 cd, echo, pwd
일반 명령 실행 파일이 존재하는 명령

환경 변수 PATH에 설정된 경로 중에 실행 파일이 존재하면 이름만으로 실행이 가능

  • 아니면 절대경로를 사용해야 함
  • 현재 디렉토리(.)는 보통 PATH에 포함되어 있지 않음
  • echo $PATH로 저장된 경로를 확인할 수 있음

alias

자주 사용되는 명령의 단축 명령을 만드는 명령.
계속 유지하려면 셸의 환경 설정 파일에 기록해 두어야 함.

  • alias
  • alias la=ls -a
  • alias rm=rm -i

type

명령이 어떻게 해석 되는지 알려주는 명령

  • type cd
  • type -a ls

which

실행 프로그램을 환경변수 PATH를 기초로 찾아 경로를 출력함

  • which rm
  • 비슷한 명령으로 whereis가 있음

man

메뉴얼 페이지를 보여줌

  • 명령의 사용법이나 설정 파일 등에 관한 온라인 도움말 제공
  • man passwd 또는 man 5 passwd
  • 명령어의 간단한 도움말을 보려면 명령 --help를 사용할 수 있음.
섹션 내용 섹션 내용
1 사용자 명령 5 시스템 설정 파일
2 커널의 시스템 호출 6 게임
3 C 라이브러리 함수 7 파일 포멧, 인코딩 등
4 디바이스 드라이버 정보 8 시스템 관리 명령

history

이전에 수행했던 명령 행의 목록을 불러옴

  • history 또는 history 10

히스토리 기능을 이용하여 명령을 실행하는 방법

  • 이전에 수행했던 명령을 이용하여 명령을 수행할 수 있음.
  • 다음을 입력하고 실행함.
    • 명령 행 편집도 가능
입력 방법 설명
!! 직전 명령을 불러옴
!n 히스토리 목록에서 해당 명령을 불러옴
!string 지정된 문자열로 시작되는 최근 명령을 불러옴
up or down 누를 때마다 직전 또는 직후 명령을 불러옴

명령 행 자동 완성

  • 일부만 입력하고 나머지를 자동으로 완성하는 기능
  • 처음 몇 자만 입력한 후, tab 키를 누르면 실행됨
    • 명령어, 변수, 파일, 디렉토리 등을 구분하여 결정함
  • 정보가 충분하지 않은 경우, tab 키를 한번 더 누르면 모든 가능한 경우를 보여주고 원래의 명령 행이 유지 됨

명령의 연결과 확장

특수문자

셸에서 특별한 의미를 가지는 문자

문자 의미
\ 특수 문자의 기능을 제거하는 escape 문자 또는 긴 명령 행을 분리할 때 사용
~ ~ 또는 ~username은 사용자의 홈 디렉토리를 의미
. 현재 작업 디렉토리를 표시 또는 명령 행의 맨 앞에서 셸 스크립트를 실행하는 source 명령
.. 현재 디렉토리의 부모 디렉토리
# # 문자의 뒤에 나타나는 문자를 주석으로 처리
$ $ *변수*는 변수의 값을 추출
& 명령&는 명령을 백그라운드로 실행시킴
* 파일 이름에서 사용할 때, 0 개 이상의 임의 문자열과 대응됨
? 파일 이름에서 사용할 때, 1 개 문자와 대응됨
| 앞 명령의 출력을 다음 명령의 입력으로 연결 시킴
<또는> 입출력 리다이렉션에서, 즉 파일로부터 입력 받을 때 또는 파일로 출력할 때 사용
>> 표준 출력을 파일의 끝에 덧붙일 때 사용
! 명령 히스토리 기능을 이용할 때 사용

파이프

앞 명령의 출력 결과를 다음 명령의 입력으로 연결

  • 명령1 | 명령2
    • cat /etc/passwd | sort | more

입출력 리다이렉션

  • 명령 < 파일 : 명령 수행에 필요한 표준 입력 대신 파일로부터 얻음
    • sort < /etc/passwd
  • 명령 > 파일 : 명령 수행의 결과를 표준 출력으로 보내지 않고 파일에 기록함
    • grep typedef /usr/include/* > typedef.out
  • 명령2 > 파일 : 명령 수행 중 표준 오류 출력을 파일에 덧붙임
    • ls 2 >> error.txt

명령 치환

명령을 수행할 때, 명령의 인수로서 다른 명령의 결과를 사용

$(command) 또는 `command`

➜  UNIX git:(master) ✗ ls -l $(which passwd)
-rwxr-xr-x  1 root  wheel  45312 Sep 22 09:29 /usr/bin/passwd
➜  UNIX git:(master) ✗ which passwd
/usr/bin/passwd
➜  UNIX git:(master) ✗ ls -l /usr/bin/passwd
-rwxr-xr-x  1 root  wheel  45312 Sep 22 09:29 /usr/bin/passwd
➜  UNIX git:(master) ✗

인용 부호

  • 빈칸을 포함하는 문자열을 개의 인수로 사용할 때 인용 부호가 필요함
  • 작은 따옴표 ''는 특수 문자의 의미를 제거함
  • 큰 따옴표 ""는 $, ``, , !를 해석하여 확장함.
➜  UNIX git:(master) ✗ echo "$(date)"
Fri Oct 16 19:29:05 KST 2020
➜  UNIX git:(master) ✗ echo "\$(date)"
$(date)
➜  UNIX git:(master) ✗ echo 'Today is $(date)'
Today is $(date)
➜  UNIX git:(master) ✗

수식과 변수의 확장

  • 수식의 결과를 명령 수행 전에 전달
    • $[수식] 또는 $((수식))
  • 변수의 값을 추출하여 명령 수행 전에 전달
    • $변수
➜  UNIX git:(master) ✗ echo "I am $[ 2020 - 1992 ] years old."
I am 28 years old.
➜  UNIX git:(master) ✗ echo BASH
BASH
➜  UNIX git:(master) ✗ ls -l $BASH
total 24
-rw-r--r--   1 jeahasorrowkissed  staff  10623 Oct 16 19:31 03_Use_Shell.md
drwxr-xr-x   4 jeahasorrowkissed  staff    128 Oct 16 16:51 Lecture
drwxr-xr-x  11 jeahasorrowkissed  staff    352 Oct 15 17:46 중간과제

셸 변수

셸 변수와 환경 변수

  • 셸 변수는 셸의 환경을 설정하기 위함 값을 저장

    • 모든 변수와 값을 출력하기 위해 set 명령을 사용
  • 셸 변수

    • 현재 셸에서만 사용이 가능하고 서브 셸로는 전달되지 않음(지역변수)
  • 환경 변수

    • 현재 셸뿐만 아니라 서브 셸로도 전달 (전역 변수)
    • 보통 변수 이름으로 대문자를 사용함
    • 터미널 창을 열어 셸을 시작하면 이미 많은 환경 변수가 설정되어 있음
    • 모든 환경 변수와 값을 출력하기 위해 prrntenv 명령을 사용
  • 변수 설정과 환경 변수로 만드는 방법

    • 변수=값
    • export 변수
  • 특정 환경 변수의 값 확인하는 방법

    • printenv 변수
    • echo $변수는 모든 종류의 변수 값을 확인할 수 있음
  ➜  UNIX git:(master) ✗ FOO=bar
  ➜  UNIX git:(master) ✗ export FOO
  ➜  UNIX git:(master) ✗ sh
  sh-3.2$ echo $FOO
  bar
  sh-3.2$ printenv FOO
  bar
  sh-3.2$ exit
  exit
  ➜  UNIX git:(master) ✗ unset FOO

자주 사용되는 환경 변수

변수 내용
HISTSIZE 1개 셸에서 저장되는 명령 히스토리 목록의 최대 개수로 기본 값은 1000
HOME 홈 디렉토리
MAIL 사용자의 메일박스에 해당하는 파일로 보통 /var/spool/mail/username
PATH 명령을 수행할 때 실행 파일을 찾기 위한 디렉초리 목록
PS1 셸 프롬프트를 표시하기 위한 문자열
SHELL 사용 중인 기본 셸
PWD 현재 작업 디렉토리
USER 현재 사용자 계정

로그인과 셸의 환경 설정 파일

  • 로그인할 때 또는 셸을 시작할 때 자동으로 실행되는 명령을 저장한 파일
    • 시스템 환경 설정 파일과 사용자 환경 설정 파일이 있음
    • 셸의 종류에 따라 다른 이름의 파일을 사용함
    • bash 셸의 경우 다음과 같음.
파일 설명
/etc/profile 모든 사용자에게 적용. 로그인할 때 가장 먼저 수행 됨 PATH, MAIL, HISTZISE 등 전역의 환경 변수가 설정됨
~/.bash_profile 로그인할 때 수행되며 개별 사용자에게 적용됨 보통 내부에서 ~./bashrc를 수행
~/.bashrc 셸을 시작할 때마다 수행되며 개별 사용자에게 적용됨 보통 내부에서 /etc/bashrc를 수행
/etc/bashrc 모든 사용자에게 적용. 셸을 시작할 때마다 수행됨 PS1, alias 설정, umask를 사용한 접근 권한의 초기값, 함수등 설정.
~/.bash_logout 로그아웃을 수행할 때 실행되는 스크립트 파일
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 사용자 관리  (0) 2020.10.25
[Linux] 시작과 종료  (0) 2020.10.24
[Linux] 파일과 디렉토리  (0) 2020.10.24
[Linux] 리눅스 설치준비 및 표준 디렉토리  (0) 2020.10.16
[Linux] 리눅스 란  (0) 2020.10.16

리눅스 설치

  • 학습 개요
    CentOS Linux 배포판의 설치를 위한 준비 작업을 알아본다.
    리눅스 파티션의 의미, 장치이름과 주요 표준 디렉토리의 종류와 용도를 살펴본다.
    CentOS의 설치 과정을 학습하고 설치함으로 실습을 준비한다.

  • 학습 목표

    1. 리눅스 설치를 위한 준비 과정을 설명할 수 있다.
    2. 파티션, 장치이름, 리눅스 표준 디렉토리에 관해 설명할 수 있다.
    3. CentOS 운영체제를 설치할 수 있다.

리눅스 실습 환경의 준비

CentOS

  • RHEL의 소스코드를 이용해 만들어진 무료 배포판.
  • 상용 RHEL과 호환되나 운영상의 문제가 생길 때 스스로 해결해야 함.
  • 웹 서버나 데이터베이스 서버용 컴퓨터로 널리 사용됨.
  • 리눅스 마스터 1급 2차 : CentOS 6.9 또는 Fedora 13 버전으로 시험 진행.

CentOS 설치를 위한 하드웨어 사양

  • i386 || x86_64 프로세서
  • GUI를 사용하려면 512M이상의 RAM과 5G 이상의 하드디스트가 필요함.

설치전 준비 작업

추후 정리 후 링크 연결 하겠음.
ISO 이미지 파일을 가상머신 SW에 설치하거나 설치 DVD를 만들어 설치할 수 있음.

하드디스크의 비어있는 파티션에 설치

  • 기존 운영체제에서 사용하지 않는 파티션이 있는지 확인.
    • 리눅스용 파티션을 준비하는 것.
  • 리눅스 설치 공간은 기존의 운영체제 공간과 구분됨.
  • 부팅시 윈도우와 리눅스 중 선택할 수 있음(멀티부팅)

가상머신 SW를 이용하여 설치

  • 가상머신 소프트웨어 설치 후 가상머신에 리눅스 설치
  • 게스트 운영체제로 설치됨.

가상머신에 설치하는 방법으로 추후 정리하여 링크로 연결 하겠음.

저장 장치 이름과 표준 디렉토리

파티션

  • 하드디스크를 논리적으로 나눈 구역.
  • 파티션 별로 파일 시스템을 만들 수 있음.
  • 윈도우에서는 각 파티션 마다 각각의 드라이브로 지정함 (C:, D:, ...)
  • 리눅스는 오직 개의 루트 디렉토리(/)만을 가짐.
    • 파티션은 푸트 파일 시스템의 특정 디렉토리에 부착됨.
      • 저장장치를 사용하려면 해당 저장장치 이름을 파일 시스템의 특정 디렉토리에 마운트 시켜야 함.
    • 예) 장치이름/dev/sdb1 을 /home에 부착
  • Linux는 하드디스트나 주변 장치를 모두 파일로 취급함.
  • 네트워크 소켓이나 프로세스, 모든 주변 장치 등을 파일처럼 다룸.

장치 이름

  • 리눅스에서 사용하는 하드디스트 장치 또는 파티션의 이름
  • IDE 디스크 : 이름에 'hd'를 붙임.
    • /dev/hda, /dev/hdb, ...
  • SCSI 디스트 : 이름에 'sd'를 붙임
    • /dev/sda, /dev/sdb, ...
  • 물리적인 하드디스크가 추가될 때 알파벳 순서대로.
  • 파티션 번호는 숫자를 1부터 차례대로 붙임
    • /dev/hda1, /dev/hda2, ...
  • CD/DVD
    • /dev/sr0, /dev/sr1, ...

리눅스 표준 디렉토리

다양한 배포판이 등장함으로써 디렉토리 구조나 사용방법의 통일성을 위해 디렉토리 표준이 생겼음.
거의 모든 리눅스 배포판이 비슷한 디렉토리 구조를 갖게 됨.

/ -               : 루트 디렉토리
  |                 * 전체 파일 시스템의 최상위 경로
  +- bin          : 바이너리 디렉토리
  |                 * 기본적인 명령의 실행 파일들이 위치
  +- sbin         : 바이너리 디렉토리
  |                 * 시스템 관리와 관련된 명령의 실행 파일이 위치
  +- boot         : 부트 디렉토리
  |                 * 리눅스가 부팅될 때 사용되는 설정 파일이 위치
  |                 * 커널 이미지(vmlinz)와 부트 로더 설정 파일을 포함
  +- dev          : 디바이스 디렉토리
  |                 * 장치를 접근하는데 사용되는 '디바이스 파일'이 위치
  +- etc          : 시스템 설정 파일 디렉토리
  |                 * 초기화 스크립트, 사용자 정보 등 시스템의 중요한 환경 설정 파일이 위치
  +- home         : 사용자 계정 디렉토리
  |                 * 사용자 계정의 홈 디렉토리가 만들어지는 디렉토리 예) /home/jeaha
  |                 * 사용자의 홈 디렉토리는 해당 사용자만 사용할 수 있는 독립적인 공간
  +- lib          : 공유 라이브러리 디렉토리
  |                 * 프로그램들이 사용하는 시스템 라이브러리 파일들이 위치
  +- media        : 미디어 디렉토리
  |                 * 이동식 저장장치가 마운트 될 때, 마운트 지점을 제공함.
  +- proc         : 시스템 정보 디렉토리
  |                 * 커널이 사용하는 가상의 파일 시스템
  +- root         : 루트 계정의 디렉토리
  |                 * root 계정의 홈 디렉토리
  +- usr          : 사용자 디렉토리
  |   +- bin      : 여러가지 실행파일
  |   +- sbin     : 여러가지 실행파일
  |   +- include  : 라이브러리 헤더파일
  |   *- lib      : 실행파일을 위한 사용자 라이브러리
  *- var          : 가변 자료 저장 디렉토리
                    * 시스템 운영 중에 필요한 가변 자료가 저장되는 디렉토리
                    * 시스템 작동 로그, 인쇄, 메일 등

리눅스 설치하기

가상머신에 설치하는 방법을 추후 정리하여 링크로 연결 하겠음.

728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 사용자 관리  (0) 2020.10.25
[Linux] 시작과 종료  (0) 2020.10.24
[Linux] 파일과 디렉토리  (0) 2020.10.24
[Linux] Shell 사용하기  (0) 2020.10.16
[Linux] 리눅스 란  (0) 2020.10.16

리눅스 란

  • 학습 개요
    UNIX 운영체제와 리눅스의 발전 과정을 알아보고 리눅스의 특징을 알아보자.
    GNU 프로젝트와 오픈소스 소프트뤠어 라이센스의 의미를 알아보자.
    또 주요 리눅수 배포판의 특징을 정리해 보자.

  • 학습 목표

    1. 리눅스의 발전사와 특징을 알아본다.
    2. 오픈소스 소프트웨어 라이센스의 종류를 나열해 보자.
    3. 주요 리눅스 배포판의 특징을 설명해 보자.

유닉스와 리눅스

UNIX의 특징

다중 사용자(Multi User), 다중 작업(Multi Thread)을 지원하는 신뢰성 높은 시분할 방식의 운영체제.
운영체제가 C로 작성되었기 때문에 이식성이 좋음.
네트워크 기능에 강력함.
단순화 된 설계, 모듈화된 설계로 기능을 제공함.
파일 시스템 트리가 하나로 통합됨.
셸스크립트로 명령 행 기반의 인터페이스를 사용할 수 있음.

UNIX와 LINUX

  • 리눅스는 UNIX의 무료 공개 버전.
  • 초기의 리눅스는 PC용 운영체제로 개발 되었음. (UNIX는 고성능 혹은 중형 컴퓨터 용으로 제작됨)

UNIX 발전사

  • 최초의 UNIX
    • Multics
      • 1969년 assembly 언어로 작성된 최초의 시분할 운영체제.
    • Unicx -> UNIX
      • 작고 심플한 운영체제로 다시 작성됨.
      • 1973년 대부분이 C 언어로 다시 작성 됨.
  • 대표적인 UNIX 시스템
    • BSD 계열 (버클리) : Free BSD, SunOS
    • System V 계열 (직계) : HP-UX, IBM AIX, Solaris(SunOS가 System 계열로 넘어옴)
    • Linux : 리눅스 커널을 사용하는 운영체제

Linux의 등장

  • 1983년 GNU 프로젝트
    • 리처드 스톨만(MIT연구원)이 UNIX와 유사한 공개 운영체제를 개발하기 위해 GNU 프로젝트를 시작.
    • 소프트웨어 상업화에 반대하고 소스코드의 공유, 자유로운 사용과 배포를 주장.
    • 1985년 GNU 선언문 (Manifesto) 발표.
    • 1989년 GPL을 발표.
    • 현재 Free Software Foundation(FSF)라는 이름으로 활동.
    • GNU 프로젝트에서 만들어진 Util들이 Linux에서 사용 됨.
  • 1991년 Linux Kernel
    • 리누스 토발즈가 리눅스 커널을 작성하여 발표
      • 커널은 하드웨어를 제어하고 응용 프로그램과의 상호작용을 제공하는 운영체제의 핵심임.
    • 개발자인 Linus와 UNIX의 이름을 따서 Linux로 명명함.
  • 1992년
    • 최초의 리눅스 배포판인 MCC Interim 리눅스가 발표됨.
    • 보통 리눅스라 함은 리눅스 커널을 사용한 운영체제(리눅스 배포판)를 의미함.
  • 1998년
    • IBM과 Oracle이 리눅스 지원을 발표함.

리눅스 개요

리눅스 발전상

  • 전 세계 리눅스 사용자는 만명 정도로 추산됨.
  • 유수의 100만 도메인 중 95% 이상이 리눅스를 사용
  • Mac, 안드로이드 운영체제가 리눅스 기반.
  • 슈퍼 컴퓨터의 95%가 리눅스에서 운영됨.
  • 주요 증권 거래소에서 리눅스 서버 사용.
  • 대다수 전자장비에서 리눅스 사용.

리눅스의 특징

  • 다중 사용자와 다중 작업을 지원.
  • 뛰어난 이식성
  • 모듈화 되어 있어 업그레이드 또는 업데이트가 용이함.
  • CUI와 GUI를 지원.
    • Character UI : Shell을 통해 커맨드 입력.
    • Graphical UI : X Window, GNOME, KDE 등의 데스트 톱.
  • 소스코드가 공개죔.
    • 공개 소스로서 빠르게 발전하고 보완됨.
  • 여러 종류의 파일 시스템을 지원.
    • Minix, ext 계열, FAT, FAT32, NTFS, NFS, ISO-9660 등.
  • 효과적인 하드웨어의 활용.(저사양 하드웨어에서도 효율적으로 활용 가능하다)
  • 다양한 응용프로그램과 소프트웨어 개발 환경을 제공.

오픈소스와 라이센스

오픈소스

  • 개발자(저작권자)가 소스코드를 공개하여 누구나 사용, 수정, 공유할 수 있도록 허가람 소프트웨어.
  • 반대 개념은 "proprietary (closed) SW"

소프트웨어 라이센스

  • 컴퓨터 프로그램은 지식재산권으로 보호받는 저작물.
  • 원칙적으로 저작자가 공표, 복제, 배포, 개작할 권한을 가짐.
  • 타인에게 일정한 대가나 조건을 전제로 권한을 부여할 수 있음.(라이센스)
    opensource.org

오픈 소스의 장점

  • 누구나 잘못된 점을 발견하고, 알리거나, 고칠 수 있음.
  • 배울 수 있고, 효율적인 프로그램 개발에 적용할 수 있음.
  • 오픈 소스는 여러 사람에 의해 테스트되어 안전함.
  • 오픈소스 운동의 철학은 커뮤니티를 통한 협력, 공유, 개방이 발전을 위해 효율적이라는 것.

GNU 프로젝트와 자유 소프트웨어 운동

  • 목적에 상관없이 프로그램을 실행할 수 있는 자유
  • 프로그램을 복제하고 공유할 수 있는 자유
  • 소스코드를 개작할 수 있는 자유
  • 개작된 프로그램을 배포할 수 있는 자유
    • 소프트웨어 소스코드는 공개

리눅스의 라이센스

  • 리눅스는 독접되거나 배타되지 않는 자유 소프트웨어
    • 공개 라이센스에 따라 자유롭게 고치고 배포 가능
  • 주로 GPL (GNU General Public License)를 따름.
  • 일부는 LGPL(GNU Lesser General Public License)
  • X Window는 MIT 라이센스

GNU GPL

  • 자유롭게 사용, 복제, 배포
  • 필요에 따라 자유롭게 수정하고 배포 가능.
  • 수정하여 배포하는 경우 소스코드를 공개하여야 함.
  • 수정된 소프트웨어에 저작권을 표시하고 똑같이 GPL 조건으로 배포하여야 함.

다양한 오픈소스 소프트웨어 라이센스

  • GPL, LGPL, MPL
    • 소스코드를 공개해야 하는 카피레프트 라이센스
      • 기본적으로 코드를 공개하도록 함.
    • LGPL은 주로 오픈소스 라이브러리에 적용됨
    • MPL 코드와 결합하여 프로그램을 만들 때, MPL 코드를 포함하지 않은 파일은 공개 의무가 없음.
    • 소스코드의 공개 범위는 다르게 정의 됨.
      • 전체 / 파일 / 모듈 단위 등
  • BSD, Apache, MIT 라이센스
    • 배포 시 소스코드의 비공개가 허용됨.
    • Permissive 라이센스라고도 함.
    • 코드의 재사용을 높이려는 목적.

리눅스 배포판

리눅스 배포판의 역사

  • 리눅스 배포판은 리눅스 커널 외에 시스템 유틸리티, 응용프로그램, 설치 프로그램을 포함한 완전한 운영체제
  • 리눅스 커널은 1991년 처음 개발됨.
    • 1994년에 커널 1.0이 발표 되었고 최신 안정 버전은 4.12
  • 1992년 최초의 배포판 MCC Interim과 SLS(Softlanding Linux System) 배포판이 발표됨.
  • 1993년부터 주요 배포판이 나오기 시작함.

주요 리눅스 배포판의 종류

  • Debian 계열 : Debian, Ubuntu etc
  • Slackware : Slackware, SUSE etc
  • Red Hat : Redhat, Fedora, CentOS etc

Debian Linux

  • Debian Project
    • 자유 운영체제를 만들어가는 사람들의 독자적인 모임.
    • Ian Merdock에 의해 1994년에 비영리 조직으로 설림
  • GNU 정신에 가장 충실한 배포판
    • GNU의 공식 후원을 받는 유일한 배포판
  • 세 가지 릴리즈를 유지
    • stable, testing, unstable
    • 코드명을 가지며(toystory 케릭터 이름), unstable 버전은 항상 코드명이 sid

Red Hat

  • 배포판 가운데 가장 널리 알려진 리눅스
  • Red Hat Linux
    • 2003년 지원 중단. 마지막 버전은 9.
  • Red Hat Enterprise Linux (RHEL)
    • Red Hat 사에 의해 지원. 최신 버젼은 7
  • Fedora 라는 오픈소스 프로젝트를 지원. (Fedora는 RHEL의 테스트 버젼)
  • RPM(Redhat Package Manager)
    • 바이너리, 설정파일, 라이브러리, 문서 등을 일괄 관리 기능
    • 데이터베이스를 검색하여 패키비나 특정 파일의 검색 기능
    • 패키비에 필요한 파일, 의존성 유무 등을 조사하는 기능

CentOS

  • Red Hat Linux로 부터 파생
  • RHEL 기반의 무료 버전
    • RHEL의 소스코드 기반으로 만들어지는 무료 배포판
    • RHEL은 유료로 지원
  • 서버용으로 많이 사용됨.
  • 최신 버전 7.3

SuSE Linux

  • Slackware Linux 의 파생
  • 독일에서 만든 배포판, 유럽에서 많이 사용.
  • Software und System Entwicklung의 약자(Software 와 System의 발전).
  • 풍부한 기능, 안정성, 보안 기능을 포함.
  • Novell 사에 의해 지원.
  • 두가지 종류
    • SUSE Linux Enterprise(유료)
    • openSUSE (무료)

Slackware Linux

  • SLS linux에서 파생
  • 가장 먼저 대중화 된, 현존하는 가장 오래된 배포판.
  • 1992년 Patrick Volkerding에 의해 시작됨.
  • 간결한 설계 철학으로 함. (the KISS priciple)
    • 현재 GNOME desktop이 제외되어 있음.
  • 유닉스 자체 학습에 적합함.

Ubuntu

  • Debian Linux에서 파생
  • desktop Unity를 제공하여 Linux를 쉽게 사용할 수 있도록 함.
  • Debian Linux에 비하여 사용 편리성에 중점을 둠.
  • 인기 있는 리눅스 배포판 중 하나.
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 사용자 관리  (0) 2020.10.25
[Linux] 시작과 종료  (0) 2020.10.24
[Linux] 파일과 디렉토리  (0) 2020.10.24
[Linux] Shell 사용하기  (0) 2020.10.16
[Linux] 리눅스 설치준비 및 표준 디렉토리  (0) 2020.10.16

윈도우10 재설치 없이 UEFI 모드로 변환하기

why?

서브 노트북이 필요해서 레노버 아이디어 패드 S340-15IWL 프리도스 모델을 사서 윈도우 10을 설치 했는데,
HDMI 포트로 외부 모니터 연결이 안되는 이슈가 발생했음.
글카 드라이버도 잡아보고 bios 버젼도 바꿔보고 했는데, BIOS를 UEFI로 실행하면 된다는 포스팅이 있었음.
그런데 이게 또 Windows를 설치 할때 잡아주는 방법 말고는 구글링 해서 방법을 찾기 어려웠고, 나는 이미 윈도우 설치후 초기 셋팅에 개발 환경 셋팅을 다 해놨기 때문에 OS 설치를 처음부터 다시 할 엄두가 서지 않았음.
끝없는 삽질 끝에 결국 방법을 알아내서 기록 해 둠.

checksum

일단, UEFI 모드로 변환 하기 전에 확인 해야할, 만족해야 할 사항이 있음.

  1. Windows10 v1703이상
    • { win + r } -> winver 입력해서 현재 윈도우 버젼을 확인함.
  2. Legacy BIOS 모드 사용 중.
    • { win + r } -> msinfo32 입력해서 열린 창에서 BIOS 모드가 레거시 인지 확인 해야함.
  3. Windows 10 설치된 드라이브 파티션 3개 미만 및 Partition Style MBR
    • { win + r } -> disckmgmt.msc 입력해서 열린 창에서 파티션 갯수 확인 가능.
    • os가 설치된 볼륨 우클릭, properties 혹은 속성 -> Volumes 탭에서 Partition style : MBR 확인

Partition Style MBR -> GPT 변환

  1. 설정 -> 업데이트 및 보안 -> 복구 Advanced Startup(고급 시작 옵션) 섹션에서 재시작을 함.
  2. 옵션 선택에서 문제 해결 -> 고급 옵션 -> 명령 프롬프트 실행. 윈도우 암호를 입력해서 관리자 CMD 창을 실행 시킴.
  3. { mbr2pgt /validate } 실행
  4. { mbr2gpt /convert } 실행
  5. 여기서 나는 문제가 생겼는데, 3, 4번 명령어에 1가지 옵션을 더 넣어 줬음. 문제가 없다면 8번으로 넘어가면 됨.
  6. { mbr2gpt /validate /allowFullOS }
  7. { mbr2gpt /convert /allowFullOS }
  8. 컴퓨터 시작과 함께 BIOS 모드로 진입, UEFI로 설정 해주면 됨.
728x90
반응형
728x90
반응형

정말 궁금한게,

연봉 10억대 받는 Oracle 개발자가 만든 Oracle DB를 사용 하지 않고,
연봉 1억대 받을까 말까 하는 T MAX 개발자가 만든 Tibero를 쓰는 이유는 대체 뭘까.

728x90
반응형

'ETC > Daily Life' 카테고리의 다른 글

[프랑코 폰타나]  (0) 2023.02.26
[카시코이] 빛이 예쁜 화과자 카페  (0) 2022.12.19
RICOH GR3  (1) 2022.12.19

Async / Await

async와 await

01.js

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function progress() {
  console.log("HI HI");
  await delay(1000);
  console.log("BYE");
}

progress();

동기 작업이 필요 할 때 함수의 선언 앞부분에 async 키워드를 붙임.
그리고 Promise를 리턴 받는 곳에 await 키워드를 넣어주면 해당 Promise가 끝날 때까지 기다렸다 다음 작업을 수행 할 수 있음.

then

위 코드에서는 delay이라는 함수를 만들어서 파라미터로 넣어준 시간 만큼 기다리는 Promise를 만들고, 이를 progress 함수에서 사용함.
함수에서 async를 사용하면, 해당 함수는 결과 값으로 Promise를 반환하게 됨.
따라서 await을 기다린 후 작업할 것이 있다면, 다음과 같이 then을 써서 코드를 작성할 수 있음.

02.js

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function progress() {
  console.log("HI HI");
  await delay(1000);
  console.log("BYE");
}

progress().then(() => {
  console.log("progress end");
});

async await의 catch

async 함수에서 에러를 발생 시킬 때는 throw를 사용하고,
에러처리는 try / catch 문을 이용하면 됨.
03.js

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function troubleMaker() {
  await delay(1000);
  throw new Error("await make error");
}

async function progress() {
  try {
    await troubleMaker();
  } catch (err) {
    console.error(err.message);
  }
}

progress();

async await의 return

동기 후 결과를 처리해야 한다면 then으로 결과를 받아서 처리할 수 있음.
04.js

const arr = ["a", "b", "c", "d", "e"];

const delay = (idx) => {
  return new Promise((resolve) =>
    setTimeout(() => {
      resolve(arr[idx]);
    }, 500)
  );
};

const basic = async () => {
  const item = await delay(2);
  console.log("await end");
  return item;
};

basic().then((result) => console.log(result));

async await 의 반복문.

반복문에서 await를 사용해야 하는 경우 forEach문은 사용할 수 없음.
일반적인 for문이나, for in, for of문을 사용해야 함.

05.js

const delay = (item) => {
  return new Promise((resolve) =>
    setTimeout(() => {
      console.log(item);
      resolve();
    }, 500)
  );
};

const arr = [0, 1, 2, 3, 4];

const loop = async (array) => {
  array.forEach(async (item) => await delay(item));

  console.log("DONE!");
};

loop(arr);

06.js

const delay = (item) => {
  return new Promise((resolve) =>
    setTimeout(() => {
      console.log(item);
      resolve();
    }, 500)
  );
};

const arr = [0, 1, 2, 3, 4];

const loop = async (array) => {
  //array.forEach(async item => await delay(item));
  for (let i = 0; i < array.length; i++) {
    await delay(arr[i]);
  }
  for (const item of array) {
    await delay(item);
  }
  for (const item in array) {
    await delay(item);
  }

  console.log("DONE!");
};

loop(arr);

await의 병렬 처리

동기적이면서 병렬 처리를 하는 방법도 있음.
07.js

const delay = (item) => {
  return new Promise((resolve) =>
    setTimeout(() => {
      console.log(item);
      resolve();
    }, 500)
  );
};

const arr = [0, 1, 2, 3, 4];

const parallel = async (array) => {
  const promises = array.map((item) => delay(item));
  await Promise.all(promises);

  console.log("DONE!");
};

parallel(arr);
728x90
반응형

Promise

참고 : MDN Promise
참고 : 감성프로그래밍

비동기 처리를 위해서 JS 에서는 주로 콜백을 많이 사용함.
콜백은 비동기 처리를 할 수 있지만, 비동기 작업을 순차적으로 처리해야할 경우 중첩시켜 표현하므로 예외처리가 어렵고, 중첩으로 인한 복잡도가 높음.
이를 위해 Promise 라이브러리가 생겼고 ES6에서 언어적 차원에서 지원하게 됨.
IE에서는 지원 되지 않지만 bluebirdjs 라이브러리를 추가 해준다면 지원 가능함.
Promise의 핵심은 목적만 머리에 넣고, 직접 적용해 보는것임.

Promise는 pending(수행중), fulfilled(완료), rejectd(실패), settled(종료)의 단계를 가지고 있고,
단어 의미 그대로 "약속"임. '지금은 없는데, 이상없으면 이따 주고 없으면 알려줄게~' 의 약속임.

Promise의 선언

//  Promise의 선언부
let myPromise = function (param) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (param) {
        resolve("SUCESS!!");
      } else {
        reject(Error("FAIL!!"));
      }
    }, 1000);
  });
};

//  Promise의 실행부
myPromise(false)
  .then((result) => console.log(result))
  .catch((err) => console.log(err));

//  아래처럼 실행할 수도 있음.
myPromise(false).then(
  (result) => console.log(result),
  (err) => console.log(err)
);

Promise의 심화는 생략 하도록 하겠음.

728x90
반응형

Spread And Rest

Spread

spread라는 단어는 펼치다 퍼뜨리다 라는 의미를 가지고 있는데,
이 문법을 사용하면 객체 혹은 배열을 펼칠 수 있음.
예를 들어 다음과 같은 객체들이 있다고 가정하면,
01.js

const o = {
  name: "object",
};

const ob = {
  name: "object",
  attribute: "hard",
};

const obj = {
  name: "object",
  attribute: "hard",
  color: "grey",
};

console.log(o);
console.log(ob);
console.log(obj);

객체 o를 선언하고, 기존에 선언한 o를 건드리지 않고 o의 속성을 이용해서 ob를 만들고, ob의 속성을 이용해서 obj를 만들었는데,
기존의 객체를 건드리지 않고 새로운 객체를 만들 때 spread를 사용하면 다음과 같이 작성할 수 있음.

02.js

const o = {
  name: "object",
};

const ob = {
  ...o,
  attribute: "hard",
};

const obj = {
  ...ob,
  color: "grey",
};

console.log(o);
console.log(ob);
console.log(obj);

배열에서 Spread

const pet = ["개", "고양이", "토끼"];
const animals = [...pet, "코요테", "코끼리"];

console.log(pet);
console.log(animals);

Rest

Rest는 가변 인자를 받아 배열로 만들어 선언하는것

04.js

const obj = {
  name: "object",
  attribute: "hard",
  color: "grey",
};

const { attribute, ...rest } = obj;

console.log(attribute);
console.log(rest);

배열에서의 rest

05.js

const numbers = [0, 1, 2, 3, 4, 5, 6];
const [first, ...others] = numbers;

console.log(first);
console.log(others);

// const [...othrs, last] = numbers;

함수 파라미터와 인자로서의 rest와 spread

const sum = function (...nums) {
  return nums.reduce((acc, curr) => acc + curr, 0);
};

const numbers = [1, 2, 3, 4, 5];
const result = sum(...numbers);

console.log(result);
728x90
반응형

+ Recent posts