Linux Basic Command

Linux Command Command Description 1 pwd 현재 위치 출력 2 ls 현재 디렉터리 내의 파일과 디렉터리 출력 3 cd 디렉터리 이동 4 mkdir 디렉터리 생성 5 cp 파일 또는 디렉터리 복사 6 mv 파일 또는 디렉터리 이동 7 rm 파일 또는 디렉터리 삭제 8 cat 파일 내용을 확인 9 touch 빈 파일을 생성 10 echo 문자열 화면에 표시 11 ip addr/ifconfig IP 정보 확인 12 ss 네트워크 상태 확인 13 nc 서버의 포트 확인 14 which, whereis, locate 명령어 위치 확인 15 tail 파일의 마지막 부분 확인하기 16 find 파일이나 디렉터리 찾기 17 ps 현재 실행 중인 프로세스 목록과 상태 확인 18 grep 주어진 입력값에서 패턴에 맞는 값 출력 19 kill 프로세스 종료 20 alias 명령어 별칭 만들기 21 vi / vim 편집기 Pwd work directory의 약자로 작업 중인 디렉터리를 보여줌 1 2 $ pwd /Users/hyden Ls list segments의 약자로 현재 디렉터리의 파일과 디렉터리를 보여준다. 보통 단독으로 잘 사용하지 않고 a,l 등의 옵션과 함께 사용 Option Description ls -l 파일들의 상세 정보를 보여줌 ls -a 숨김 파일 표시 ls -t 최신 파일부터 표시 ls -rt 오래된 파일부터 표시 ls -F 파일을 표시할 때 파일의 타입을 나타내는 문자열을 표시(/ 디렉터리, * 실행파일, @심볼릭 링크) ls -R 하위 디렉터리의 내용까지 표시 보통은 위 옵셥들을 조합해 ls -al, ls -alt, ls -altF 등으로 사용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 $ ls -altF total 95340 drwxr-x--- 28 hyden hyden 4096 Oct 29 12:34 ./ -rw------- 1 hyden hyden 326035 Oct 29 12:34 .zsh_history drwx------ 8 hyden hyden 4096 Oct 29 12:34 .cache/ -rw------- 1 hyden hyden 33 Oct 27 16:40 .lesshst -rw------- 1 hyden hyden 25052 Oct 27 16:39 .bash_history -rw------- 1 hyden hyden 38160 Oct 27 16:32 .viminfo drwx------ 6 hyden hyden 4096 Oct 27 15:50 .config/ drwx------ 2 hyden hyden 4096 Oct 27 15:36 .ssh/ -rw-rw-r-- 1 hyden hyden 287 Oct 27 13:34 .wget-hsts -r--r--r-- 1 hyden hyden 117120 Oct 27 12:31 .zcompdump-devserver-5.8.1.zwc -rw-rw-r-- 1 hyden hyden 50720 Oct 27 12:31 .zcompdump-devserver-5.8.1 -rw-rw-r-- 1 hyden hyden 49203 Oct 27 12:31 .zcompdump drwxr-x--- 6 hyden hyden 4096 Oct 26 16:20 istio-1.18.2/ drwxr-xr-x 12 hyden hyden 4096 Oct 26 14:30 .oh-my-zsh/ -rw-r--r-- 1 hyden hyden 4789 Oct 26 14:30 .zshrc drwxr-xr-x 9 hyden hyden 4096 Oct 23 13:01 .minikube/ -rw-r--r-- 1 hyden hyden 3919 Oct 20 17:47 .bashrc -rw------- 1 hyden hyden 2313 Oct 5 12:49 kubeconfig.yaml drwxrwxr-x 2 hyden hyden 4096 Sep 19 12:52 lang_test/ drwxrwxr-x 2 hyden hyden 4096 Sep 18 20:27 .ncloud/ drwxr-xr-x 5 hyden hyden 4096 Sep 11 19:06 pybind11/ drwxrwxr-x 2 hyden hyden 4096 Sep 8 16:25 data/ -rw------- 1 hyden hyden 151 Sep 8 15:59 .python_history -rw-rw-r-- 1 hyden hyden 1452216 Sep 7 18:59 libboost_regex.so.1.58.0 drwxrwxr-x 2 hyden hyden 4096 Sep 6 14:35 test/ drwxrwxr-x 4 hyden hyden 4096 Sep 6 14:28 ffmpeg/ drwxrwxr-x 2 hyden hyden 4096 Aug 30 16:00 dockerbuild/ drwxr-xr-x 8 root root 4096 Aug 30 10:50 ../ -rw-rw-r-- 1 hyden hyden 435 Aug 3 17:05 default-user-config.yaml drwxr-x--- 3 hyden hyden 4096 Aug 3 15:30 .kube/ drwxrwxr-x 5 hyden hyden 4096 Aug 3 14:47 manage_kubernetes/ -rw-rw-r-- 1 hyden hyden 84 Aug 2 18:54 .bash_profile -rw-rw-r-- 1 hyden hyden 508 Aug 2 18:53 ncp-iam-authenticator.sha256 -rwxrwxr-x 1 hyden hyden 11665408 Aug 2 18:53 ncp-iam-authenticator* -rwx------ 1 hyden hyden 11345 Aug 2 10:13 get_helm.sh* 심볼릭 링크(symbolic link): 원본 파일을 가리키도록 링크만 연결. 윈도우의 바로가기 링크와 같은 개념 Cd change directory의 약자로 디렉터리 이동시 사용하는 명령어 Option Description cd ~ 홈 디렉터리로 이동 cd.. 상위 디렉터리로 이동. cd../../ 같은 식으로 여러 단계를 한 번에 이동 가능 cd /dir 절대 경로를 지정해 이동 가능 cd - 바로 전의 디렉터리로 이동 Mkdir make directory의 약자로 디렉터리를 만들 때 사용 1 2 # <이름>의 디렉터리를 현재 디렉터리에 만든다 $ mkdir <이름> 절대 경로를 지정하여 만들 수도 있다. 1 2 # <이름>의 디렉터리를 절대 경로의 디렉터리에 만든다 $ mkdir /home/hyden/<이름> -p 옵션으로 하위 디렉터리까지 한 번에 생성할 수 있다 1 mkdir -p <디렉터리명>/<하위 디렉터리명> Cp copy의 약자로 파일 또는 디렉터리를 복사할 때 사용 1 2 3 4 5 6 7 8 # source를 target으로 복사 $ cp source target # target 파일의 이미 있는 경우 덮어쓰기 $ cp -f source target # 디렉터리를 복사할 때 사용. 하위 디렉터리도 모두 복사하기 $ cp -R sourceDir targetDir Mv move의 약자로 파일 또는 디렉터리의 위치를 옮길 때 사용. 혹은 이름을 변경할 때도 사용 1 2 3 4 5 6 7 8 # afile 이름을 bfile로 변경 $ mv afile bfile # afile을 상위 디렉터리로 옮김 $ mv afile ../ # afile을 /opt 이하 디렉터리로 옮김 $ mv afile /opt/ Rm remove의 약자로 파일 또는 디렉터리를 삭제할 때 사용 1 2 3 4 5 6 7 8 9 10 11 # afile을 삭제 $ rm afile # 디렉터리 adir을 삭제. 삭제 시 확인을 함 $ rm -r adir # 디렉터리 adir을 삭제. 삭제 시 확인 안 함 $ rm -rf adir # txt로 끝나는 모든 파일을 삭제할지 물어보면서 삭제 $ rm -i *.txt Cat catenate의 약자로 파일의 내용을 확인할 때 사용. 1 2 # test.txt 파일의 내용을 확인 $ cat test.txt Touch touch는 빈 파일을 생성. 혹은 파일의 날짜와 시간을 수정할 때 사용한다. 1 2 3 4 5 6 7 8 # afile을 생성 $ touch afile # afile의 시간을 현재 시간으로 갱신 $ touch -c afile # bfile의 날짜 정보를 afile의 정보와 동일하게 변경 $ touch -r afile bfile Echo echo는 어떤 문자열을 화면에 보여줄 때 사용. echo와 리다이렉션을 사용해 파일을 생성, 추가하는 작업을 많이 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # helloworld 출력 $ echo 'helloworld' # 패스로 지정된 문자열을 출력 $ echo $PATH # 이스케이프 문자열을 해석 $ echo -e 문자열 # 개행을 표시할 수 있음 $ echo -e "안녕하세요\n이렇게 하면\n새 줄이생겨요" # ls와 유사하게 현재 디렉터리의 파일과 폴더를 출력 $ echo * # 리다이렉션 '>'을 사용해 hello.txt 파일 생성. 파일 내용에는 echo로 표시되는 내용이 들어감 $ echo hello redirection > hello.txt # 추가 연산자 >>를 사용해 기존 파일에 문자열 추가 $ echo hello2 >> hello.txt Ip addr/ifconfig 접속한 리눅스의 IP 정보를 알아낼 때 사용. 1 2 3 4 5 6 7 8 9 10 11 $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 50000 link/ether fa:16:3e:5d:0b:d7 brd ff:ff:ff:ff:ff:ff inet 10.201.1.10/16 brd 10.202.255.255 scope global eth0 valid_lft forever preferred_lft forever ip addr이 설치되어 있지 않은 경우에는 ifconfig를 사용. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $ ifconfig eth0 Link encap:Ethernet HWaddr 06:4d:de:ae:a8:50 inet addr:172.31.27.212 Bcast:172.31.31.255 Mask:255.255.240.0 inet6 addr: fe80::44d:deff:feae:a850/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:68903966 errors:0 dropped:0 overruns:0 frame:0 TX packets:75295223 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15691124260 (15.6 GB) TX bytes:42265387295 (42.2 GB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:6623596 errors:0 dropped:0 overruns:0 frame:0 TX packets:6623596 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:349206971 (349.2 MB) TX bytes:349206971 (349.2 MB) Ss socket statistics의 약자로 네트워크 상태를 확인하는 데 사용. nestat과 동일. 옵션으로 a, t, u, l, p, n 등이 있다. Option Description ss -a 모든 포트 확인 ss -t TCP 포트 확인 ss -u UDP 포트 확인 ss -l LISTEN 상태 포트 확인 ss -p 프로세스 표시 ss -n 호스트, 포트, 사용자명을 숫자로 표시 TCP 포트 중 LISTEN 상태인 포트의 번호를 알고 싶을 때 다음과 같이. 1 2 3 4 $ ss -tln LISTEN 0 511 *:443 *:* LISTEN 0 1 127.0.0.1:8006 *:* LISTEN 0 511 *:80 *:* Nc netcat의 약자로 예전에는 포트가 열렸는지 확인하는 데 사용. 1 2 3 4 5 6 7 8 # 포트가 오픈됐는지 확인 $ nc IP주소 포트 # 더 자세한 정보가 남음 $ nc -v IP주소 포트 # 현재 서버의 포트를 오픈(방화벽에 해당 포트 번호가 설정 함) $ nc -l 포트 Which, Whereis, Locate which는 특정 명령어의 위치를 찾아줌. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ which git /usr/local/bin/git # which -a : 검색 가능한 모든 경로에서 명령어를 찾아준다. $ which -a git /usr/local/bin/git /usr/bin/git # where : which -a와 같다. $ where git /usr/local/bin/git /usr/bin/git # whereis는 실행 파일, 소스, man 페이지의 파일을 찾아준다. $ whereis ssh ssh: /usr/bin/ssh /usr/share/man/man1/ssh.1 # locate는 파일명을 패턴으로 빠르게 찾아준다. # 아래 예제는 .java 파일을 찾아주는 명령. $ locate *.java Tail tail은 파일의 마지막 부분을 보여준다. 이와 반대로 head는 파일의 첫 부분을 보여준다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 파일의 마지막 라인부터 숫자만큼의 파일의 라인 수를 보여주기 $ tail -n {숫자} {파일경로} # 숫자로 지정한 라인부터 보여주기 $ tail -n +{숫자} {파일경로} # 파일의 마지막 라인부터 숫자로 지정한 바이트 수 만큼 보여주기 $ tail -c {숫자} {파일경로} # Ctrl + C로 중단하기 전까지 지정한 파일의 마지막에 라인이 추가되면 계속 출력하기 $ tail -f {파일경로} : # 파일의 마지막 라인부터 지정한 숫자만큼을 # {초}로 지정한 시간이 지날 때마다 리프레시해서 보여주기 $ tail -n {숫자} -s {초} -f {파일경로} Find find는 명령어의 뜻 그대로 파일이나 디렉터리를 찾는 데 사용하는 명령어. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 확장자 명으로 찾기 $ find {디렉터리} -name '*.bak' # 디렉터리를 지정해 찾기 $ find {디렉터리} -path '**/검색 시 사용하는 디렉터리명/**.*.js' # 파일명을 패턴으로 찾기 $ find {디렉터리} -name '*패턴*' # 파일명을 패턴으로 찾되 특정 경로는 제외하기 $ find {디렉터리} -name '*.py' -not -path '*/site-packates/*' # 파일을 찾은 다음 명령어 실행하기 $ find {디렉터리} -name '*.ext' -exec wc -l {} \; # 최근 7일간 수정된 파일을 찾고 삭제하기 $ find {디렉터리} -daystart -mtime -7 -delete # 0바이트인 파일을 찾고 삭제하기 $ find {디렉터리} -type f -empty -delete Ps 현재 실행 중인 프로세스 목록과 상태를 보여준다. 1 2 3 4 5 6 7 8 9 10 11 # 실행 중인 모든 프로세스를 보여주기 $ ps aux # 실행 중인 모든 프로세스를 전체 커맨드를 포함해 보여주기 $ ps auxww # 특정 문자열과 매칭되는 프로세스 찾기(grep은 바로 다음에 나옵니다) $ ps aus | grep {패턴} # 메모리 사용량에 따라 정렬하기 $ ps --sort size ps와 grep을 pipe로 사용하여 현재 실행 중인 프로세스 목록중 특정 명칭을 포함하는 프로세스를 찾는 식으로 사용하기도 한다. Grep grep은 입력에서 패턴에 매칭되는 내용을 찾는 명령어. grep이라는 이름은 ed의 명령어인 g/re/p(내용 전체를 정규식으로 찾은 다음 프린트하라: globally search for a regular expression and print matching lines)에서 왔음. 보통 find, ps 등과 조합해 사용. 1 2 3 4 5 6 7 8 9 10 11 # 파일에서 특정 패턴을 만족하는 부분 찾기 $ grep "패턴" 파일경로 # 파일명과 라인을 함께 표시하기 $ grep --with-filename --line-number "패턴" 파일경로 # 매칭하지 않는 부분 표시하기 $ grep --invert-match "패턴" # cat과 함께 사용하기 $ cat 파일경로 | grep "패턴" Kill 프로세스를 죽이는 명령어 프로세스를 죽인다고는 하지만 원리는 프로세스에 중지하라는 시그널을 보내는 것 SIGKILL, SIGSTOP은 강제 종료이며 나머지는 정상적으로 종료. 프로세스 아이디는 ps 명령어로 알아낼 수 있다. 1 2 3 4 5 6 7 8 9 10 11 # kill에서 사용할 수 있는 시그널 표시하기 $ kill -l # 프로세스 죽이기 SIGTERM(terminate) $ kill 프로세스ID # 백그라운드 잡 종료시키기 $ kill {잡ID} # 프로세스 강제 종료 $ kill -9 | KILL 프로세스ID Alias alias를 사용하면 줄여서 사용할 수 있다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 모든 alias 표시하기 $ alias # alias 만들기 # 예) alias ll="ls -al" $ alias 단어="명령" # cd ../..을 cd …으로 줄여 쓰기 # cd ../../../은 cd ….으로 가능 $ alias ...=../.. $ alias ....=../../.. $ alias .....=../../../.. $ alias ......=../../../../.. # alias 삭제하기 $ unalias 단어 Vi / Vim vi 혹은 vim은 대부분의 리눅스에 기본적으로 설치되어 있는 텍스트 에디터 1 vi test.txt 참고 및 출처 백엔드 개발자라면 알아야 할 리눅스 필수 명령어 21개 ...

October 1, 2024 · 10 min · Me

Linux Permission

Linux Permission Source: https://medium.com/@usamashafique00786/day-4-task-linux-permissions-and-access-control-lists-ef59cebf9324 File type: 파일 유형 type Description - normal file d directory l link p named pipe s socket c character device b block device Permissions: 각 파일에 접근해서 읽거나 쓰거나 실행할 권리를 갖는 소유자 / 그룹 / 다른 사용자로 나눠서 관리 Source: https://pamirwebhost.com/check-linux-file-permissions-with-ls/ Permission은 3개로 나눠서 관리 Description User 파일을 만든 소유주 Group 파일을 만든 소유주가 속한 그룹 Other 기타 사용자 Permission은 4가지에 대하여 구분 Permission 파일 디렉토리 r 파일에 대한 읽기 권한.열기, 읽기 허용 디렉토리 내의 파일을 나열할 수 있게 허용 w 파일에 대한 쓰기 권한.쓰기, 잘라내기 허용.이름 변경이나 파일 삭제 허용되지 않음. 파일 삭제나 파일 이름 변경 디렉토리 속성에 의해 결정 디렉토리 내의 파일들을 생성, 삭제, 이름 변경이 가능하도록 허용 x 파일에 대한 실행 권한.파일이 프로그램으로 처리되고 파일이 실행되도록 허용.스크립트 언어에서 작성된 프로그램 파일들은 읽기 가능으로 설정 되어 있어야만 실행 가능 디렉토리 내에서 탐색을 위해 이동할 수 있도록 허용(디렉토리에 들어올 수 있도록 허용) - r,w,x에 대한 권한이 없음을 표시 r,w,x에 대한 권한이 없음을 표시 Permission Source: https://medium.com/@gumbershruti1119/day-6-file-permissions-and-access-control-lists-2126f994a5b8 ...

October 1, 2024 · 2 min · Me

Event-Driven Pattern vs Event Sourcing Pattern vs Publisher-Subscriber Pattern vs Producer-Consumer Pattern

Event-Driven Pattern Vs Event Sourcing Pattern Vs Publisher-Subscriber Pattern Vs Producer-Consumer Pattern Event Sourcing Pattern, Publisher-Subscriber Pattern, Event-Driven Architecture, Producer-Consumer Pattern은 모두 소프트웨어 아키텍처에서 중요한 역할을 하는 패턴들이며, 서로 밀접한 관계를 가지고 있다. 이들의 관계를 다음과 같이 설명할 수 있다: Event-Driven Architecture (EDA)와 다른 패턴들의 관계: EDA는 이벤트 중심의 시스템 설계를 위한 상위 수준의 아키텍처 스타일. Publisher-Subscriber Pattern과 Producer-Consumer Pattern은 EDA를 구현하는 데 사용되는 구체적인 통신 모델이다. Event Sourcing Pattern은 EDA의 한 구현 방식으로 볼 수 있으며, 이벤트를 저장하고 관리하는 방법을 제공한다. Publisher-Subscriber Pattern과 Producer-Consumer Pattern의 관계: ...

November 19, 2024 · 3 min · Me

Scenario Testing vs Use Case Testing

Scenario Testing vs. Use Case Testing Scenario Testing과 Use Case Testing은 소프트웨어 테스팅 기법으로, 사용자 관점에서 시스템의 기능과 동작을 검증하는 데 사용된다. 두 기법은 유사한 점이 있지만, 접근 방식과 세부 사항에서 차이가 있다. 비교 항목 Scenario Testing Use Case Testing 정의 실제 사용자의 행동과 상황을 기반으로 한 현실적인 시나리오를 통해 시스템을 테스트하는 방법 사용자와 시스템 간의 상호작용을 구조화된 형식으로 정의하고 테스트하는 방법 테스트 관점 사용자 중심적이며, 실제 업무 상황과 맥락을 중요시함 시스템 중심적이며, 기능적 정확성과 완전성을 중요시함 목적 실제 사용 환경에서의 시스템 동작을 검증 시스템의 기능적 요구사항을 검증 구조화 정도 자유로운 형식으로, 스토리텔링 방식의 서술적 구조 체계적이고 형식적인 구조 (기본 흐름, 대체 흐름, 예외 흐름) 테스트 범위 여러 기능이나 프로세스를 걸쳐 있는 end-to-end 시나리오 주로 단일 기능이나 프로세스에 초점 테스트 설계 자유로운 형식으로 다양한 “가정” 상황을 포함 유스케이스 문서의 기본 흐름과 대체 흐름을 따름 테스트 케이스 도출 다양한 소스(사용자 피드백, 시장 조사 등)에서 시나리오 개발 유스케이스 문서에서 직접 테스트 케이스를 도출 상황 맥락 사용자의 동기, 감정, 환경 등 풍부한 맥락 정보 포함 객관적이고 기술적인 상호작용 위주의 맥락 문서화 방식 서술적이고 이야기 형식의 문서화 구조화되고 단계별로 정형화된 문서화 적합한 상황 사용자 경험이 중요한 애플리케이션, 복잡한 업무 프로세스 명확한 기능 요구사항이 있는 시스템, 트랜잭션 기반 애플리케이션 테스트 설계 난이도 실제 사용자 경험에 대한 이해가 필요하며, 창의적인 시나리오 도출이 중요 체계적인 분석과 문서화 능력이 필요하며, 기술적 이해가 중요 유지보수성 시나리오 수정이 비교적 자유롭고 유연함 구조화된 형식으로 인해 변경 관리가 체계적 재사용성 특정 상황에 특화된 시나리오로 재사용이 제한적 표준화된 형식으로 인해 재사용이 용이 커버리지 측정 시나리오 기반의 정성적 측정이 주로 이루어짐 흐름 기반의 정량적 측정이 가능 테스트 자동화 복잡한 시나리오로 인해 자동화가 어려울 수 있음 구조화된 형식으로 인해 자동화가 비교적 용이 장점 예상치 못한 오류 발견에 효과적, 사용자 경험 개선에 도움 요구사항 검증에 효과적, 체계적인 테스트 가능 단점 모든 가능한 시나리오를 고려하기 어려움 유스케이스 문서의 품질에 의존적 실제 프로젝트에서는 이 두 방법을 상호 보완적으로 사용하는 것이 효과적이다. 예를 들어, Use Case Testing으로 기본적인 기능 정확성을 검증하고, Scenario Testing으로 실제 사용 환경에서의 사용성과 통합성을 검증하는 방식으로 활용할 수 있다. ...

November 5, 2024 · 2 min · Me

Kafka vs RabbitMQ

Kafka vs. RabbitMQ Apache Kafka와 RabbitMQ는 모두 분산 메시징 시스템이지만 설계 목적, 아키텍처, 활용 사례에서 뚜렷한 차이를 보인다. 기본 개념 항목 Apache Kafka RabbitMQ 유형 분산 이벤트 스트리밍 플랫폼 메시지 브로커 (AMQP 구현) 주요 목적 대규모 실시간 데이터 스트리밍 및 처리 유연한 메시지 라우팅과 비동기 통신 지원 데이터 처리 로그 기반 스트림 (메시지 재생 가능) 큐 기반 메시지 (소비 후 삭제) Kafka는 LinkedIn에서 개발되어 나중에 Apache 재단으로 이관된 분산 이벤트 스트리밍 플랫폼이다. 주로 대용량 데이터 스트림을 실시간으로 처리하기 위해 설계되었다. ...

October 22, 2024 · 7 min · Me

Paging vs Segmentation

Paging vs. Segmentation Paging과 Segmentation은 운영체제의 메모리 관리 기법이다. Paging: 프로세스의 주소 공간을 고정 크기의 페이지로 나누어 관리한다. 물리적 메모리를 같은 크기의 프레임으로 나눈다. 외부 단편화 문제를 해결하고 메모리 할당을 단순화한다. Segmentation: 프로세스를 논리적 단위인 세그먼트로 나누어 관리한다. 각 세그먼트의 크기는 가변적이다. 프로그램의 논리적 구조를 반영하여 메모리를 관리한다. Paging과 Segmentation 비교 특성 Paging Segmentation 분할 단위 고정 크기 페이지 가변 크기 세그먼트 주소 변환 페이지 테이블 사용 세그먼트 테이블 사용 외부 단편화 없음 발생 가능 내부 단편화 발생 가능 거의 없음 메모리 활용 효율적 유연함 구현 복잡도 상대적으로 간단 복잡함 공유와 보호 페이지 단위 세그먼트 단위 사용자 관점 투명함 프로그램 구조 반영 할당/해제 속도 빠름 상대적으로 느림 테이블 크기 큼 작음 참고 및 출처

October 5, 2024 · 1 min · Me

Callback vs Promise vs Async/Await

Callback vs. Promise vs. Async/Await JavaScript의 비동기 처리 방식은 프로그램의 실행 흐름을 막지 않고 다른 작업을 수행할 수 있게 해주는 중요한 기능이다. 주요 비동기 처리 방식에는 콜백(Callbacks), 프로미스(Promises), 그리고 async/await가 있다. 특성 콜백 (Callback) Promise Async/Await 정의 다른 함수의 인자로 전달되어 특정 시점에 실행되는 함수 비동기 작업의 최종 완료 또는 실패를 나타내는 객체 Promise를 기반으로 비동기 코드를 동기 코드처럼 작성할 수 있게 해주는 문법 도입 시기 JavaScript 초기부터 사용 ES6 (2015) ES8 (2017) 문법 function(err, result) { … } new Promise((resolve, reject) => { … }) async function() { await … } 에러 처리 콜백 함수의 첫 번째 인자로 에러 객체 전달 .catch() 메서드 사용 try-catch 구문 사용 장점 - 간단한 비동기 처리에 적합 - 모든 환경에서 지원 - 체이닝 가능 - 에러 처리 용이 - 병렬 처리 가능 (Promise.all) - 동기 코드와 유사한 구조 - 가독성 향상 - 직관적인 에러 처리 단점 - 콜백 지옥 발생 가능 - 에러 처리 복잡 - 약간의 학습 곡선 존재 - 브라우저 지원 고려 필요 - 항상 Promise를 반환 - 오래된 환경에서 지원 안 됨 비동기 처리 방식 콜백 함수를 통해 결과 처리 then() 메서드를 통해 결과 처리 await 키워드로 결과를 기다림 중첩 처리 콜백 안에 콜백을 계속 넣어야 함 .then() 체이닝으로 처리 일반적인 동기 코드처럼 작성 가능 병렬 처리 복잡한 로직 필요 Promise.all() 사용 Promise.all()과 함께 사용 순차적 처리 콜백 중첩으로 처리 .then() 체이닝으로 처리 일반 동기 코드처럼 작성 타입스크립트 통합 타입 추론이 어려움 제네릭을 통해 타입 안정성 확보 가장 타입 안정적 테스트 용이성 테스트 작성이 복잡할 수 있음 테스트 작성이 비교적 쉬움 가장 테스트 작성이 쉬움 디버깅 콜백 중첩으로 인해 어려움 스택 트레이스가 깔끔함 동기 코드와 유사해 가장 쉬움 메모리 사용 콜백 중첩 시 메모리 사용량 증가 체이닝으로 인한 약간의 오버헤드 일반적으로 가장 효율적 취소 가능성 직접 구현 필요 취소 불가능 (별도 구현 필요) 취소 불가능 (별도 구현 필요) 구현 예시 콜백 함수 (Callbacks) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // 콜백 함수를 사용한 비동기 처리 예시 function fetchData(callback) { // 데이터를 가져오는 비동기 작업 시뮬레이션 setTimeout(() => { const data = { id: 1, name: "John" }; callback(null, data); // 성공시 첫 번째 인자는 null }, 1000); } fetchData((error, data) => { if (error) { console.error('에러 발생:', error); return; } console.log('데이터:', data); }); 하지만 콜백 방식은 여러 비동기 작업을 연달아 처리해야 할 때 “콜백 지옥"이라는 문제가 발생합니다: ...

November 23, 2024 · 4 min · Me

Streaming vs Polling

Streaming vs. Polling Streaming과 polling은 실시간 데이터 전송을 위해 사용되는 두 가지 주요 기술입니다. 각각의 특징과 차이점을 자세히 살펴보겠습니다. Streaming Streaming은 데이터를 연속적으로 전송하는 방식입니다. 주요 특징 연속적인 데이터 흐름: 서버에서 클라이언트로 데이터를 지속적으로 전송합니다. 실시간성: 데이터가 생성되는 즉시 전송되어 높은 실시간성을 제공합니다. 효율적인 대역폭 사용: 필요한 데이터만 전송하므로 대역폭을 효율적으로 사용합니다. 지속적인 연결: 클라이언트와 서버 간 연결이 유지됩니다. 사용 사례 비디오/오디오 스트리밍 실시간 주식 시세 정보 라이브 이벤트 중계 Polling Polling은 클라이언트가 주기적으로 서버에 데이터를 요청하는 방식입니다. ...

October 20, 2024 · 2 min · Me

동기(Synchronous) vs. 비동기(Asynchronous) and Blocking vs. Non-Blocking

Synchronization vs. Asynchronization and Blocking vs. Non-Blocking 카테고리 동기(Synchronous) 비동기(Asynchronous) Blocking Non-Blocking 핵심 개념 작업이 순차적으로 실행되며, 이전 작업이 완료될 때까지 다음 작업을 시작하지 않음 작업들이 독립적으로 실행되며, 이전 작업의 완료를 기다리지 않고 다음 작업 수행 가능 호출된 함수가 작업을 완료할 때까지 제어권을 반환하지 않음 호출된 함수가 작업 완료 여부와 관계없이 즉시 제어권을 반환함 작업 처리 방식 순차적으로 작업을 처리하며, 각 작업이 완료된 후 다음 작업 시작 여러 작업이 동시에 처리될 수 있으며, 작업 완료 순서는 불확실할 수 있음 호출한 함수는 작업이 완료될 때까지 대기 상태 유지 호출한 함수는 작업 진행 중에도 다른 작업 수행 가능 제어 흐름 프로그램의 제어 흐름이 순차적이고 예측 가능함 제어 흐름이 비선형적이며, 콜백이나 이벤트로 처리 제어권이 호출된 함수에 완전히 넘어감 제어권이 호출한 함수에 즉시 반환됨 결과 처리 작업 완료 후 바로 결과를 반환받아 처리 콜백 함수, Promise, async/await 등을 통해 결과 처리 결과를 직접 반환받아 처리 상태 확인이나 콜백을 통해 결과 처리 주요 특징 - 코드의 실행 순서가 명확함 - 직관적인 코드 흐름 - 단순한 구현 - 작업의 병렬 처리 가능 - 복잡한 이벤트 처리 - 높은 확장성 - 자원을 점유하며 대기 - 단순한 구현 - 예측 가능한 실행 - 자원의 효율적 활용 - 복잡한 구현 - 높은 동시성 에러 처리 try-catch 블록으로 즉시 에러 처리 가능 Promise의 catch나 async/await의 try-catch로 처리 동기적 에러 처리 가능 비동기적 에러 처리 메커니즘 필요 성능 특성 - 단순 작업에서 오버헤드 적음 - 순차 처리로 인한 대기 시간 발생 - 동시 처리로 인한 전체 처리 시간 감소 - 컨텍스트 스위칭 오버헤드 - I/O 작업에서 성능 저하 - 리소스 독점 - 리소스 효율적 활용 - 높은 처리량 적합한 사용 사례 - 간단한 계산 작업 - 메모리 내 데이터 처리 - 순차적 처리 필요 작업 - 네트워크 요청 - 대용량 파일 처리 - 독립적 실행 가능 작업 - CPU 연산 작업 - 간단한 파일 작업 - 메모리 작업 - I/O 작업 - 네트워크 통신 - 대용량 처리 실행 순서 코드 작성 순서와 실행 순서가 동일 실행 순서가 코드 작성 순서와 다를 수 있음 작업 완료 순서가 예측 가능 작업 완료 순서가 불확실 자원 활용 단일 자원을 순차적으로 사용 여러 자원을 동시에 효율적으로 활용 자원을 독점적으로 사용 자원을 공유하여 사용 응답성 작업 완료 전까지 다른 작업 불가 여러 작업의 동시 처리로 높은 응답성 대기 시간 동안 응답 불가 지속적인 응답 가능 디버깅 코드 흐름 추적이 용이함 비동기 로직으로 인한 디버깅 어려움 문제 발생 지점 파악 쉬움 문제 발생 지점 추적 어려움 확장성 수직적 확장에 제한적 수평적/수직적 확장 용이 동시 처리 능력 제한적 높은 동시성 처리 가능 데이터 일관성 데이터 일관성 보장이 쉬움 경쟁 조건 고려 필요 순차적 처리로 일관성 보장 동시성 제어 메커니즘 필요 추가적인 고려사항: ...

October 6, 2024 · 7 min · Me

Lock and Mutex

Lock and Mutex Lock과 Mutex는 둘 다 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지하는 동기화 도구이다. 한 스레드가 자원을 사용할 때 다른 스레드의 접근을 막는 것이다. 특성 Mutex Lock 기본 개념 상호 배제를 위한 동기화 객체로, 소유권 개념이 있음 일반적인 동기화 메커니즘으로, 단순한 잠금/해제 기능 소유권 소유권 개념이 있어 획득한 스레드만 해제 가능 소유권 개념이 없어 다른 스레드도 해제 가능 재진입성 보통 재진입 가능 (같은 스레드가 여러 번 획득 가능) 구현에 따라 재진입 가능할 수 있음 용도 스레드 간 엄격한 상호 배제가 필요한 경우 간단한 동기화가 필요한 일반적인 상황 성능 소유권 검사 등으로 인한 오버헤드 존재 상대적으로 가벼운 오버헤드, 단 구현에 따라 다름 에러 처리 소유권 위반 시 예외 발생 가능 단순한 실패/성공 여부만 반환 구현 복잡도 상대적으로 복잡한 구현 단순한 구현, 그러나 고급 기능 추가 시 복잡해질 수 있음 적용 범위 프로세스 내 스레드 간 동기화 프로세스 내 또는 프로세스 간 동기화에 사용 가능 우선순위 상속 우선순위 상속 지원 가능 일반적으로 지원하지 않음, 구현에 따라 다를 수 있음 교착상태 처리 소유권 추적으로 교착상태 감지 용이 기본적인 교착상태 감지만 가능 에러 검사 상세한 에러 검사 및 보고 기능 기본적인 에러 검사, 구현에 따라 확장 가능 메모리 사용 소유권 정보 저장으로 추가 메모리 필요 최소한의 메모리 사용 유연성 엄격한 규칙으로 유연성 제한 상대적으로 유연한 사용 가능 디버깅 소유권 정보로 디버깅 용이 디버깅이 상대적으로 어려움, 구현에 따라 다를 수 있음 사용 예시 데이터베이스 트랜잭션, 파일 시스템 접근 간단한 공유 자원 보호, 카운터 타임아웃 지원 보통 타임아웃 기능 내장 구현에 따라 타임아웃 지원 가능 복구 기능 비정상 종료 시 자동 복구 지원 구현에 따라 자동 복구 기능 추가 가능 중첩 사용 재진입성으로 중첩 사용 가능 구현에 따라 중첩 사용 가능, 주의 필요 시스템 수준 주로 커널 수준에서 구현 사용자 수준 및 커널 수준 모두에서 구현 가능 표준화 POSIX 표준으로 잘 정의됨 구현에 따라 동작이 다를 수 있음 성능 특성 경쟁 상황에서 성능 저하 가능 스핀락 구현 시 짧은 대기 시간에 효율적 공정성 일반적으로 공정성 메커니즘 내장 구현에 따라 공정성 보장 여부가 다름 실제 구현 시에는 고려할 사항 동시성 요구사항 (얼마나 많은 스레드가 동시에 접근하는가) 성능 요구사항 (응답 시간, 처리량 등) 리소스 사용량 (메모리, CPU 사용률) 오류 처리 및 복구 요구사항 데드록 방지 필요성 플랫폼 및 운영체제의 지원 여부 참고 및 출처

October 5, 2024 · 2 min · Me