반응형

 

스니핑(Sniffing)

스니핑(Sniffing)은 네트워크 상의 데이터 흐름을 감시하고 분석하는 행위로,

해커가 비밀번호, 신용카드 정보, 개인 데이터 등을 불법적으로 취득할 수 있는 해킹 기법 중 하나입니다.

이 기술은 일상생활에서의 데이터 보안에 중대한 영향을 미칠 수 있으므로,

모든 인터넷 사용자가 기본적으로 알아야 할 필수적인 지식입니다.

사전적으로 '스니핑'은 '코를 킁킁거리다'

또는 '냄새를 맡다'와 같은 뜻을 가지고 있습니다.

이처럼 탐지견이 마약을 찾아내듯,

컴퓨터 네트워크에서 스니핑은 통신 중인 데이터 패킷에서 몰래 정보를 추출하는 과정입니다.

쉽게 설명하면,

우체국에서는 많은 편지와 소포가 들어오고 각각의 주소로 분류되어 발송됩니다.

편지들이 네트워크에서의 데이터 패킷에 해당하며,

편지에는 발신자와 수신자의 주소가 적혀 있습니다.

스니핑을 하는 해커는 우체국에서 일하는 직원처럼 모든 편지를 있으며,

특정 편지를 몰래 열어보고 안의 정보를 읽는 것입니다.

, 통신하는 데이터 패킷에서 정보를 몰래 추출하는 과정이죠.

 

패킷이 무엇인지 궁금하시다면 아래 글을 읽어주세요!

https://jdcyber.tistory.com/12

 

패킷(Packet)이란? (쉬운 설명, 구조, 헤더, 인캡슐레이션, 핑, Ping)

패킷 (Packet) 이란 무엇일까요? 패킷은 패키지(package)와 덩어리를 뜻하는 버킷(bucket)의 합성어로 통신망을 통해 전송하기 쉽도록 데이터를 잘게 나눈 전송 단위입니다. 본래 패킷은 소포를 뜻하는

jdcyber.tistory.com

원리

네트워크에서 데이터는 '패킷'이라는 단위로 전송됩니다.

각 패킷은 송신자와 수신자의 정보, 즉 IP 주소와 물리적 주소인 MAC 주소를 포함합니다.

스니핑 공격자는 이 패킷들을 가로채 정보를 읽어내려고 합니다.

이를 가능하게 하는 대표적인 방법 중 하나가 ARP(Address Resolution Protocol) 스푸핑입니다.

ARP 스푸핑을 통해 공격자는 네트워크 상에서 자신을 다른 장치로 가장하여 데이터를 중간에서 가로챌 수 있습니다.

 

iP주소와 Mac주소에 대해 모르신다면 아래 글을 읽어주세요!

https://jdcyber.tistory.com/27

https://jdcyber.tistory.com/26

 

iP 주소란 무엇일까? (쉬운 설명, 개념, 정의, 호스트 아이디, 네트워크 아이디, 서브넷 마스크)

iP 주소란 무엇인가요? 정답은 컴퓨터마다 가지고 있는 주소 즉 이름입니다. 192.168.123.132 위와 같은 형태의 아이피 주소를 많이 보셨을겁니다. 위와 같이 A컴퓨터 너의 이름은 오늘부터 192.168.123.1

jdcyber.tistory.com

 

MAC 주소? iP 주소? 무슨 차이지? (쉬운 설명, 개념, 정의)

Mac 주소? IP 주소? iP 주소, MAC 주소.. 저희가 IT 업계로 들어오거나 인터넷 통신 혹은 게임을 할 때에도 간간히 들어봤던 이름일 겁니다. 여러분은 무엇인지 둘의 차이는 무엇인지 알고 계신가요?

jdcyber.tistory.com

스푸핑, ARP에 대해 모르신다면 아래 글을 읽어주세요!

https://jdcyber.tistory.com/61

 

스푸핑(Spoofing) 기초: 해커가 사용하는 다양한 공격 방식 이해하기

현재 디지털 시대에서 우리는 끊임없이 새로운 기술의 혜택을 받고 있지만, 동시에 우리의 데이터는 해커들의 스푸핑 공격 같은 위협에 직면해 있습니다. 예를 들어, 최근 한 글로벌 기업은 이

jdcyber.tistory.com

우리는 이미 영화에서 스니핑 공격을 본 적이 있습니다.

영화에서는 전화를 도청하고 민감한 정보를

수집하여 범죄에 사용하는데,

이는 가장 단순한 형태의 스니퍼 공격입니다.

스니핑을 사용하면 인터넷을 통해 공유하는

모든 데이터 중 암호화되지 않은 것들은

해킹당하고 위험해질 수 있습니다.

예를 들어 여러분이 인터넷에서 결재를 하게 되면

모든 카드 정보와 비밀번호가 해커에게 제공되며

해커는 이를 이용하여

당신의 돈을 모조리 훔칠 수 있겠죠

해킹을 배우는 목적은 보다 안전한 보안을 위하여 공부하는 것입니다.

궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

 

프로그래밍을 공부하면서 가장 어려웠던 점은

지금까지 아이콘과 마우스 클릭으로 이루어졌던 모든 일들을

이제는 CMD, TERMINAL 등에서 명령어로

수행해야 한다는 것이었습니다.

즉각적으로 눈에 보이는 구조가 아니라

머릿속에서 컴퓨터 동작의 구조를 인지하고

있어야 한다는 점이 익숙하지 않았습니다.

터미널 창을 띄우고 간단한 명령어들을

입력해 보면서 공부하기는 했지만,

기본적으로 이 시스템 자체에 대한 이해가 필요했고,

그중 셸 (Shell)에 대해 정리해 보기로 했습니다.


쉘(Shell)이란 무엇인가?

쉘 (Shell)은 껍질이라는 뜻입니다.

바깥 환경과 속 살 그 사이의 껍질,

이것이 쉘 (Shell)입니다.

속 살은 운영체제 (Window, Mac, Linux etc..)이고,

바깥 환경은 사용자이며

운영체제와 사용자가 대화를 주고받을 수 있도록

그 사이에서 도와주는 것이 쉘입니다.

Shell 은 명령어 해석기로서

프로그램이며 실행 파일입니다.

C언어, 자바스크립트 같은 언어들은

컴파일러라는 번역기에 의해

기계어로 변환되어 컴퓨터에서 동작하지만

쉘 스크립트는

사람이 바로 이해할 수 있는

자연어 형식으로 되어있습니다.

기본적으로 셸은 대화형 인터페이스를 제공합니다.

따라서 입력받은 명령어를 즉시 실행시킬 수 있으며

다양한 옵션 기능을 통해 편리하게 이용할 수 있습니다

 

즉,

쉘은 사용자와 운영체제 간의 대화를 중개하는 인터페이스입니다.

사용자가 입력한 명령을 운영체제에 전달하고,

그 결과를 사용자에게 돌려주는 역할을 합니다.

쉘은 일종의 명령어 해석기로,

사용자의 명령어를 해석하여 컴퓨터가 수행할 수 있는 언어로 변환합니다.

이는 다양한 프로그래밍 언어가 컴파일러를 통해 기계어로 번역되는 과정과 유사합니다.


마지막으로 다시 한번 짚어보겠습니다.

쉘은 운영체제와 커널 사이에 위치해 있으며,

응용 프로그램과 커널이

대화를 할 수 있도록 만들어줍니다.

우리가 명령어를 쳐서 쉘에게 넘기면

쉘은 커널에게 전달합니다.

커널은 해당 명령어를 수행하고 결과를

다시 쉘을 통해 우리에게 전달합니다.

그래서 쉘을 명령어 해석기라고 이해하셔도 무방합니다.


쉘의 주요 기능
  • 대화형 인터페이스: 사용자로부터 명령어를 입력받아 즉시 실행할 수 있습니다.
  • 스크립트 실행: 쉘 스크립트를 통해 복잡한 작업을 자동화할 수 있습니다.
  • 환경 설정: 시스템 전체나 개별 사용자의 환경을 설정할 수 있습니다.

주요 쉘의 종류
  1. Bourne Shell (sh): 유닉스에서 가장 초기의 쉘로, 많은 리눅스 배포판에서 기본적으로 설치됩니다.
  2. C Shell (csh): C언어의 문법을 모방하여 사용성을 향상시킨 쉘입니다. 다양한 편리 기능을 제공하지만, 처리 속도가 느린 단점이 있습니다.
  3. Korn Shell (ksh): Bourne Shell을 확장한 쉘로, C Shell의 기능을 포함하며 빠른 처리 속도를 자랑합니다.
  4. Bash (Bourne Again Shell): 현재 가장 널리 사용되는 쉘로, Bourne Shell의 기능을 기반으로 하여 Korn Shell과 C Shell의 장점을 결합했습니다. sh 셸을 기반으로 만들어졌으며 리눅스에서 사용자 계정을 생성할때 특별한 셀을 지정하지 않으면 기본적으로 사용되는 셸입니다. bash는 sh를 기반으로 korn shell(ksh) + C shell(csh)의 장점을 모아 만들었으며 무로료 배포되어 빠르게 시장을 점유했습니다.
  5. Z Shell (zsh): Bash의 기능을 확장하고 사용성을 더욱 향상시킨 쉘로, macOS Catalina 버전부터 기본 쉘로 사용됩니다.
  6. tcsh Shell: csh의 기능을 강화한 쉘입니다.

내가 원하는 셸을 사용해 보자

 

내가 사용 중인 셸 확인하기

# echo $SHELL
# env|grep SHELL
 

변경 가능한 셸 확인하고, 일시적으로 변경하기

# cat /etc/shells
# /bin/sh
 

변경 가능한 셸 확인하고 , 셸 변경하기

# cat /etc/shells
# chsh -l

(방법1)
# chsh ubuntu -s /bin/dash <- 예시로 우분트 셸을 dash셸로 변경해보기
(방법2)
# vi /etc/passwd <- vi 편집기로도 변경 가능

 

셸 별 기능 체크

 
Bourne
C
TC
Korn
Bash
sh
csh
tcsh
ksh
bash
Programming language
Shell variables
Command alias
X
Command history
X
Filename completion
X
✓+
✓+
Command line editing
X
X
✓+
Job control
X

쉘과 커널의 관계

쉘은 운영체제의 핵심 구성 요소인 커널과 밀접하게 연결되어 있습니다.

사용자가 쉘에 명령을 입력하면, 쉘은 이를 해석하여 커널에 전달합니다.

커널은 명령을 수행한 후 그 결과를 쉘을 통해 사용자에게 반환합니다.

 

아래 글에 커널에 대해 쉽고 자세하게

작성해 두었으니

https://jdcyber.tistory.com/67

 

커널(Kernel)이란 무엇일까? (개념, 이중 모드, 쉘의 역할)

커널(Kernel)은 컴퓨터 운영체제의 핵심 부분으로,하드웨어 자원을 관리하고 응용 프로그램과 하드웨어 사이의 인터페이스 역할을 수행합니다.이는 응용 프로그램이 시스템 호출을 통해 하드웨

jdcyber.tistory.com


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

이번 강의에서는 C언어의 핵심 구조 중 하나인 조건문과 반복문에 대해 배워보겠습니다.

이미 우리는 이전 글에서 변수, 자료형, 연산자에 대해 배웠으며,

이러한 지식을 바탕으로 프로그램의 흐름을 제어하는 방법을 학습할 것입니다.


C 프로그래밍 언어 독학 시리즈 전편을 아직 안 보신 분은 아래 링크를 참고해 주세요!

C 언어 독학 #1 (기초, 쉬운 설명, Hello world)

C 언어 독학 시리즈 #2 (변수, 자료형, 연산자, 기본 입출력, 실습예제)


"C언어를 배우는 것은 마치 산을 오르는 것과 같다.

정상에 오를 때까지는 힘들고 도전적이지만, 정상에 서면 전에 보지 못했던 경치와 가능성을 볼 수 있다."

조건문

조건문은 주어진 조건에 따라 다른 코드를 실행하게 하는 구조입니다.

C언어에서는 주로 if, else, else if, switch 문을 사용합니다.

if문
if 문은 마치 도로의 분기점과 같습니다.
어떤 조건을 만족하면 한 길로 가고, 그렇지 않으면 다른 길로 갑니다.
조건의 복잡성에 따라 여러 개의 분기로 나뉠 수 있습니다.
#include <stdio.h>

int main() {
    int score = 85;
    if (score >= 90) {
        printf("A학점입니다.\n");
    } else if (score >= 80) {
        printf("B학점입니다.\n");
    } else {
        printf("C학점 이하입니다.\n");
    }
    return 0;
}

위 내용을 응용하여 나이에 따른 입장료 계산을 해보도록 하겠습니다.

#include <stdio.h>

int main() {
    int age;
    printf("나이를 입력하세요: ");
    scanf("%d", &age);

    if (age < 13) {
        printf("어린이 입장료는 2000원입니다.\n");
    } else if (age <= 19) {
        printf("청소년 입장료는 3000원입니다.\n");
    } else {
        printf("성인 입장료는 5000원입니다.\n");
    }
    return 0;
}
switch 문
switch 문은 마치 기차역의 스위치처럼 특정 변수의 값에 따라 다른 트랙으로 기차를 보내는 역할을 합니다.
각 케이스는 특정한 역에 해당하며, 해당 역에 정차할 때만 실행됩니다.
#include <stdio.h>

int main() {
    char grade = 'B';
    switch (grade) {
        case 'A':
            printf("우수한 성적입니다.\n");
            break;
        case 'B':
            printf("좋은 성적입니다.\n");
            break;
        default:
            printf("노력이 필요합니다.\n");
            break;
    }
    return 0;
}

위 내용을 응용하여 요일에 따른 스케줄 출력을 해보도록 하겠습니다.

#include <stdio.h>

int main() {
    int day;
    printf("요일을 입력하세요 (1=월요일, ..., 7=일요일): ");
    scanf("%d", &day);

    switch(day) {
        case 1:
            printf("월요일: 팀 회의가 있습니다.\n");
            break;
        case 2:
            printf("화요일: 프로젝트 작업의 날입니다.\n");
            break;
        case 3:
            printf("수요일: 영어 학습 시간입니다.\n");
            break;
        case 4:
            printf("목요일: 체육활동이 있습니다.\n");
            break;
        case 5:
            printf("금요일: 자유 연구 시간입니다.\n");
            break;
        case 6:
            printf("토요일: 휴식일입니다.\n");
            break;
        case 7:
            printf("일요일: 가족과 시간을 보냅니다.\n");
            break;
        default:
            printf("잘못된 입력입니다.\n");
            break;
    }
    return 0;
}

반복문

반복문은 특정 조건이 만족하는 동안 코드 블럭을 반복 실행합니다.

C언어에서는 for, while, do-while 문을 사용합니다.

for 문
for 문은 마치 달력의 날짜를 하나씩 넘기는 것과 같습니다.
시작점, 종료점, 그리고 얼마나 빠르게 넘길지(증가량)를 정해놓고 반복합니다.
#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

위 내용을 응용하여 1부터 10까지의 합 계산을 해보도록 하겠습니다.

#include <stdio.h>

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        sum += i;
    }
    printf("1부터 10까지의 합은 %d입니다.\n", sum);
    return 0;
}
while 문
while 문은 마치 조건을 충족하는 동안 무한 루프 도로를 도는 자동차와 같습니다.
주어진 조건이 참인 동안 계속해서 루프를 돕니다.
#include <stdio.h>

int main() {
    int i = 1;
    while (i <= 5) {
        printf("%d ", i);
        i++;
    }
    printf("\n");
    return 0;
}

위 내용을 응용하여 사용자로부터 0이 입력될 때까지 숫자 입력 받기를 해보도록 하겠습니다.

#include <stdio.h>

int main() {
    int number;
    printf("숫자를 입력하세요 (0으로 종료): ");
    scanf("%d", &number);

    while (number != 0) {
        printf("입력한 숫자: %d\n", number);
        printf("다시 숫자를 입력하세요 (0으로 종료): ");
        scanf("%d", &number);
    }
    printf("프로그램을 종료합니다.\n");
    return 0;
}

이제 위 내용을 모두 포함한 실습 예제를 하나 만들어보겠습니다.

조건문과 반복문을 모두 활용하여 하나의 통합된 프로그램을 구성할 것이며, 아래 기능을 포함할 것입니다

  1. 사용자로부터 날짜(요일)와 나이를 입력받습니다.
  2. 요일에 따른 스케줄을 출력합니다 (switch 문 사용).
  3. 나이에 따른 입장료를 계산합니다 (if 문 사용).
  4. 1부터 입력받은 날짜까지의 합을 계산합니다 (for 문 사용).
  5. 사용자로부터 0이 입력될 때까지 추가 숫자를 입력받아 출력합니다 (while 문 사용)

 

C코드 구현
#include <stdio.h>

int main() {
    int day, age, number, sum = 0;

    // 요일 입력받기
    printf("요일을 입력하세요 (1=월요일, ..., 7=일요일): ");
    scanf("%d", &day);

    // 스케줄 출력 (switch 문)
    switch(day) {
        case 1: printf("월요일: 팀 회의가 있습니다.\n"); break;
        case 2: printf("화요일: 프로젝트 작업의 날입니다.\n"); break;
        case 3: printf("수요일: 영어 학습 시간입니다.\n"); break;
        case 4: printf("목요일: 체육활동이 있습니다.\n"); break;
        case 5: printf("금요일: 자유 연구 시간입니다.\n"); break;
        case 6: printf("토요일: 휴식일입니다.\n"); break;
        case 7: printf("일요일: 가족과 시간을 보냅니다.\n"); break;
        default: printf("잘못된 입력입니다. 프로그램을 종료합니다.\n"); return 1;
    }

    // 나이 입력받기
    printf("나이를 입력하세요: ");
    scanf("%d", &age);

    // 입장료 계산 (if 문)
    if (age < 13) {
        printf("어린이 입장료는 2000원입니다.\n");
    } else if (age <= 19) {
        printf("청소년 입장료는 3000원입니다.\n");
    } else {
        printf("성인 입장료는 5000원입니다.\n");
    }

    // 1부터 day까지의 합 계산 (for 문)
    for (int i = 1; i <= day; i++) {
        sum += i;
    }
    printf("1부터 %d까지의 합은 %d입니다.\n", day, sum);

    // 0이 입력될 때까지 숫자 입력받기 (while 문)
    printf("숫자를 입력하세요 (0으로 종료): ");
    scanf("%d", &number);
    while (number != 0) {
        printf("입력한 숫자: %d\n", number);
        printf("다시 숫자를 입력하세요 (0으로 종료): ");
        scanf("%d", &number);
    }
    printf("프로그램을 종료합니다.\n");
    return 0;
}

우리는 위 예제를 통해 아래와 같은 c언어 구현 스킬을 배워봤습니다.

1. 요일에 따른 스케줄 출력 (switch 문 활용)

  • 조건 분기 처리: switch 문을 통해 특정 변수의 값(요일)에 따라 다른 동작을 수행하도록 프로그램을 제어합니다. 이를 통해 여러 조건에 대해 각각의 로직을 구현하는 방법을 연습할 수 있습니다.
  • 값에 따른 특정 케이스 처리: 각 요일마다 다른 메시지를 출력하며, switch 문의 case 레이블을 사용하는 방법을 실습합니다.
  • 디폴트 케이스 처리: default 레이블을 사용하여 입력 값이 유효 범위를 벗어났을 때의 예외 처리를 구현합니다.

2. 나이에 따른 입장료 계산 (if 문 활용)

  • 조건 로직 구현: 다중 if-else if-else 구조를 사용하여 복잡한 조건 로직을 구현합니다. 이는 프로그램에서 다양한 조건에 따라 다른 행동을 취해야 할 때 매우 유용합니다.
  • 조건 표현식: 다양한 비교 연산자(<, <=, else)를 사용하여 특정 조건을 평가하고 그에 따라 다른 동작을 수행합니다.

3. 1부터 day까지의 합 계산 (for 문 활용)

  • 반복문 사용: for 문을 사용하여 특정 범위의 값에 대해 반복 작업을 수행합니다. 이는 데이터의 집합이나 범위에 대해 일련의 연산을 반복적으로 적용할 때 필수적입니다.
  • 변수 증가와 누적 계산: 반복문 내에서 변수를 하나씩 증가시키면서, 누적 합계를 계산하는 방법을 연습합니다.

4. 0이 입력될 때까지 숫자 입력받기 (while 문 활용)

  • 조건 반복 처리: while 문을 사용하여 사용자로부터 계속해서 입력을 받고, 특정 조건(number != 0)이 만족될 때까지 반복합니다.
  • 사용자 입력 처리와 조건 평가: 사용자로부터 입력받은 값을 즉시 처리하고, 프로그램의 흐름을 사용자 입력에 따라 조절하는 방법을 연습합니다.

오늘 배운 조건문과 반복문을 통해 프로그램의 흐름을 자유자재로 제어할 수 있는 기초를 마련했습니다.

다음 강의에서는 배열과 포인터에 대해 자세히 다룰 예정이니,

이번 강의 내용을 복습하고 연습문제를 풀어보면서 확실하게 이해하시면 좋을 것 같습니다.

Happy coding!

 

https://jdcyber.tistory.com/79

 

C 언어 독학 시리즈 #4: 함수(Function)의 이해와 활용

이번 강의에서는 C 언어의 핵심 요소 중 하나인 함수에 대해 배워보겠습니다.이미 우리는 이전 글에서 변수, 자료형, 연산자, 조건문과 반복문에 대해 학습했으며,이러한 지식을 바탕으로 더 체

jdcyber.tistory.com


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

지금까지 우리는 파이썬의 기본적인 설치 방법,

개발 환경 설정, 기본 명령어와 자료형,

그리고 기본적인 연산과 변수 사용법에 대해 배우고,

해당 내용을 응용하여 간단한 프로그램 작성까지 해봤습니다.


못 보신 분들은 아래 글을 순차적으로 읽고 오는 것을 추천드립니다.

파이썬 독학 #1 파이썬 (Python)이란? 설치 (쉬운 설명, 정의, IDLE, IDE, 특징, M1)

파이썬 독학 #2 (쉬운 설명, 개발환경 설정, vscode, 기본 명령어, Hello world)

파이썬 독학 #3 기초 (쉬운 설명, 자료형, 사칙 연산, 인덱싱, 포맷팅, 슬라이싱, 변수)

파이썬 독학 #4 기초 개념을 활용한 간단한 프로그램 작성하기(응용)

 

이번 글에서는 파이썬 독학 시리즈의 다섯 번째 글로 파이썬의 중요한 자료형

튜플, 딕셔너리, 그리고 집합에 대해 알아보겠습니다.

이전 글들을 통해 파이썬의 기본 사항을 배우고 응용하여 익혀봤다면,

번에는 좀 더 효율적으로 데이터를 다루는 방법을 배워보겠습니다.


먼저 저번 독학#4 시간에 우리가 리스트를 쓰는 이유를 가르쳐드렸는데 기억나시나요?

1(a), 2(b), 3(c) 이런 식으로 번거롭게

하나씩 변수를 담는 것이 아니라

a [1,2,3] a라는 변수에 1,2,3을 한 번에 담아

사용하기 위한 자료 구조라고 배웠습니다.

 

이걸 한 번 더 언급하는 이유는

아래 튜플을 배우기 위해서입니다.


튜플 (Tuple)

튜플은 이전 시간에 배운 리스트와 유사하지만,

한 번 생성되면 수정할 수 없는 불변의 성질을 가지고 있습니다.

튜플은 데이터가 변경되지 않길 원할 때,

예를 들어 함수에서 여러 값을 안전하게 반환할 때 유용합니다.

리스트
튜플
a = [1,2,3]
a = (1,2,3)

둘의 차이점은 [대괄호]와 (소괄호)로 표현되며

리스트는 추가하거나 수정 및 변경이 가능하고

튜플은 수정하거나 바꾸거나 추가하는

변경이 불가능한 고정 값입니다.

 

아래 튜플의 예시를 한번 보여드리겠습니다.

jd = (1,2,'a','b')
del jd[0]
#원래 위처럼 코드를 작성하면 리스트[]에서는 인덱싱 0번째 요소인 1번이 삭제되게 되는데 튜플()로 작성하고 실행하면 아래와같이 에러가 출력됩니다.
TypeError: 'tuple' object doesn't support item deletion

즉 튜플은 볼 수 있으나 값은 고정되어 변하지 않는다.

그렇다면 아래와 같이 입력한다면

어떻게 나오게 될까요?

jd = (1,2,'a','b')
print(jd[0] + 1)
a = (1,2)
a = a * 3
print(a)

먼저 생각해 보시고 아래 답을 봐주세요

(1, 2, 1, 2, 1, 2)
튜플 값이 고정되어 바뀌지 않는데 아래와 같이 출력됐습니다.
이는 변경된 것이 아니라 a*3을 a에 넣는다는 개념의 변수로 a라는 튜플 값이 3번 반복됐을 뿐 변한 것이 아닙니다.

실생활 예제

튜플은 여러 값을 그룹화하여 변경할 필요가 없는 경우에 유용하게 사용됩니다.

예를 들어 아래와 같이 좌표 시스템에서 점의 위치를 나타낼 때

수정되지 않아야 하는 데이터를 튜플로 저장할 수 있습니다.

# 좌표를 튜플로 표현
point = (10, 20)
print(f"X 좌표: {point[0]}, Y 좌표: {point[1]}")  # 출력: X 좌표: 10, Y 좌표: 20

# 시도해보기: point[0] = 15  # TypeError 발생

딕셔너리 (Dictionary)

딕셔너리는 키와 값의 쌍으로 데이터를 저장합니다.

이 자료형은 데이터에 빠르게 접근할 수 있어 매우 효율적입니다.

JSON 데이터를 다루거나,

설정 값과 같은 정보를 관리할 때 많이 사용됩니다.

 

루비에서는 Hash, 자바에서는 Map,

자바스크립트에서는 Object, 혹은 JSON으로

불리는 것들이 모두 딕셔너리입니다.

# 딕셔너리 선언
my_dict = {'name': 'JD', 'age': 38, 'location': 'Seoul'}
# 값 접근
print(my_dict['name'])  # 출력: JD

 

API에 자주 활용되는 딕셔너리

앞서 말씀드린 키값을 가지고 내용을 찾아냅니다.

제일 많이 사용되는 개인 정보

JSON의 형태를 보여드리겠습니다.

 

JSON이란?
(json : JavaScript Object Notation)

https://jdcyber.tistory.com/42

 

JSON 이란? (효율적인 데이터 교환의 핵심)

JSON, 이 단어를 들어본 적이 있으신가요? 오늘은 웹 개발 및 데이터 전송에 있어 매우 중요하고 유용한 JSON 파일에 대해 알아보는 시간을 갖도록 하겠습니다. JSON은 데이터 교환을 가능하게 하는

jdcyber.tistory.com

1 {
2    "이름": "JD",
3    "나이": 38,
4    "성별": "남",
5    "주소": "서울특별시 강남구 도곡동",
6    "이메일": "jd@naver.com",
7    "회사이름": "jdcyberexpert",
8    "회사주소": {"naver", "google", "youtube"},
9 }

Key를 통해 Value를 얻는다라고 기억해 주세요

dic = {'name':'jd', 'phone':'0101234567', 'birt':'910327'}

예제 (이름 찾기)
dic = {'name': 'jd', 'age': 42}
print(dic['name'])
jd

예제 (key와 value)
a = {1:'a'}
a['name'] = "jd"
{1:'a','name':'jd'}

1:a (1=a) / name:jd (이름=jd)

1:a name:jd

1=key a=value / name=key jd=value

여기서 알 수 있는 건 딕셔너리는

keyvalue로 이루어져 있다.

key가 핵심이기 때문에 value는 같아도 되지만

key는 달라야 합니다.

삭제도 key를 작성하게 되고

따로 key만 value만 출력되게도 가능합니다.

#key와 value를 나눠서 처리해야할 때
a = {1: 'jd', 2: 'alice', 3: 'jason'}
for k, v in a.items():
    print("키는: " + str(k))
    print("벨류는: " + v)
키는: 1
벨류는: jd
키는: 2
벨류는: alice
키는: 3
벨류는: jason

실생활 예제

딕셔너리를 사용하는 것은 주소록을 사용하는 것과 비슷합니다.

사람의 이름(키)과 그 사람의 전화번호(값)를 연결하여,

이름을 알면 전화번호를 쉽게 찾을 수 있습니다.

딕셔너리는 데이터베이스의 간단한 형태로 사용될 수 있습니다.

예를 들어,

상품의 ID와 그에 대한 정보를 저장하고 관리하는 용도로 사용할 수 있습니다.

# 상품 ID를 키로, 상품 정보를 값으로 가지는 딕셔너리
products = {
    101: {'name': '사과', 'price': 1000, 'stock': 25},
    102: {'name': '바나나', 'price': 500, 'stock': 50}
}

# 상품 ID 101의 정보 출력
product_info = products[101]
print(f"상품 이름: {product_info['name']}, 가격: {product_info['price']}원, 재고: {product_info['stock']}개")

a.get을 활용하기

개인적으로 중요하다고 생각하는 내용이기에

a.get 내용은 지금 언급하고 가겠습니다.

아래 예시를 먼저 보시죠

a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(4 in a)
False

a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a[4])
keyError: 4

a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a.get(4))
None

a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a.get(4,'없음'))
없음

맨 위 in을 사용하면 4가 a에 있냐고 물어본 것이고

False를 출력했죠

그리고 print a[4]로 해봤더니 없는 key 값이라는 keyerror를 출력했는데

a.get을 사용하니 None이라고 출력했습니다.

이를 활용하여 값이 없을 때는

None이 아닌 없음으로 출력해라라고 지정하여

값이 없을 때마다 없음을 표시하는 방법입니다.

이와 같이 딕셔너리는 앞으로 정말 자주 사용하고

중요한 내용입니다.

꼭 많이 써보시고 많이 응용해 보시길 바랍니다.

추가적인 활용이 궁금하신 분들이 계시다면

댓글에 알려주세요!


집합 (Set)

집합은 중복을 허용하지 않고,

순서가 없는 자료형입니다.

데이터 중복을 제거하거나,

두 그룹 간의 공통 요소를 찾는 데 유용합니다.

jd1 = set("Hello")
print(jd1)
{'o', 'l', 'e', 'H'}

*순서가 뒤죽박죽으로 출력되며,

l도 하나가 없어졌습니다.

집합은 중복을 허용하지 않고 순서가 없습니다.

jd1 = set([1,2,3])
print(jd1)
{1, 2, 3}

jd1 = {1,2,3}
print(jd1)
{1, 2, 3}

두 그룹에서 중복된 데이터를 가려낼 때

l = {1,2,2,3,3}
newlist = list(set(l))
print(newlist)
{1, 2, 3}

newlist = set(l) l을 set으로 감싸면 집합으로 바뀌면서 중복되는 값들이 없어지고

list로 다시 만들어주면

아래 중복 제거된 리스트로 출력됩니다.

교집합
jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1 & jd2)
{4, 5, 6}

jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1.intersection(jd2))
{4, 5, 6}
합집합
jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1 | jd2)
{1, 2, 3, 4, 5, 6, 7 ,8, 9}

jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1.union(jd2))
{1, 2, 3, 4, 5, 6, 7 ,8, 9}
차집합
jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1 - jd2)
{1, 2, 3}

jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd1.difference(jd2))
{1, 2, 3}

jd1 = set([1, 2, 3, 4, 5, 6])
jd2 = set([4, 5, 6, 7, 8, 9])
print(jd2.difference(jd1))
{7, 8, 9}

 

실생활 예제

집합을 사용하는 것은 파티의 초대장 명단을 관리하는 것과 비슷합니다.

명단에 동일한 사람을 여러 번 쓸 필요가 없으며,

명단에서 누가 초대됐는지 빠르게 확인할 수 있습니다.

중복을 허용하지 않고, 순서가 없기 때문입니다.

집합은 데이터에서 중복을 제거하거나 여러 데이터 그룹 간의 공통 요소를 찾는 데 사용됩니다.

예를 들어,

두 쇼핑 리스트에서 중복되는 항목만을 찾아내고 싶을 때 사용할 수 있습니다.

# 두 쇼핑 리스트
shopping_list1 = {'사과', '바나나', '체리'}
shopping_list2 = {'체리', '키위', '바나나'}

# 두 리스트의 교집합을 통해 중

Add &Update

튜플과 달리 집합은 값은 추가할 수 있습니다.

하나를 추가할 때는 add 여러 개를 추가할 때는 update

jd1 = set([1, 2, 3, 4, 5, 6])
jd1.add(7)
print(jd1)
{1, 2, 3, 4, 5, 6, 7}

jd1 = set([1, 2, 3, 4, 5, 6])
jd1.update(7,8,9)
print(jd1)
{1, 2, 3, 4, 5, 6, 7,8,9}

오늘 배운 내용 중 딕셔너리와 집합 부분은

실무에서도 정말 많이 사용되는 부분이니

꼭 여러 번 연습해 보시고 이를 활용해서 여러 리스트를 만들어보시고 추가해 보시는 연습을 해보시길 바랍니다.

이해가 안 가시는 부분이나 더 추가로 알고 싶은 내용은 아래 댓글에 남겨주세요!

파이썬 독학 #5는 여기서 마치겠습니다.

파이썬 독학 #6에서 만나요~

 


궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용
추후 정리해서 올려드리겠습니다
구독 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형
반응형

컨테이너 이미지의 기본 개념

컨테이너 이미지는 애플리케이션을 실행하는 데 필요한 모든 요소를 포함한

표준화된 실행 패키지 또는 "실행 환경"입니다.

컨테이너 이미지는 애플리케이션을 실행하는 데 필요한 모든 파일과 설정을 담고 있으며,

호스트 OS의 커널을 공유하면서 독립적으로 실행됩니다.

이미지는 일종의 '스냅샷'으로, 생성 후에는 변경되지 않습니다.

 

조금 더 쉽게 풀어보겠습니다.

컨테이너 이미지는 마치 여행을 위해 필요한 모든 짐을 가지고 있는 완벽하게 준비된 여행 가방과 같습니다.

이 가방에는 여행지에서 필요한 모든 것들이 들어있어 어디든지 떠날  준비가 되어 있습니다.

컨테이너 이미지는 애플리케이션을 실행하는 데 필요한 모든 파일과 설정을 담고 있으며,

마치 여행 가방이 다른 집의 침대 위에 놓여도 그 안의 내용물이 변하지 않는 것처럼,

컨테이너 이미지도 다른 컴퓨터 환경에 배치되어도 동일하게 작동합니다.

컨테이너 이미지는 컴퓨터의 '호스트 OS 커널'을 공유하며,

이는 여러 여행 가방들이 같은 항공기를 공유하는 것과 비슷하다고 볼 수 있습니다.

마지막으로,

컨테이너 이미지는 '스냅샷'으로, 여행 가방이 완벽하게 포장되어 잠겨진 후 변하지 않는 것과 같습니다.

이 이미지는 생성된 후에는 변경되지 않으며, 필요할 때마다 원본 상태 그대로 사용할 수 있습니다.

즉,

컨테이너는 소프트웨어를 효율적으로 실행하기 위해 필요한

코드, 런타임 환경, 시스템 도구, 시스템 라이브러리와 같은 모든 종속성을 포함하는 경량화된 가상화 기술입니다.

컨테이너는 애플리케이션을 격리하고 그 환경을 다른 시스템에 쉽게 이식할 수 있게 해 줍니다.

컨테이너는 전통적인 가상 머신(VM)과 비교하여 더 가벼운 가상화 형태로 간주됩니다.

가상 머신은 각각의 VM이 전체 운영 시스템을 실행하므로

상대적으로 많은 자원을 소모합니다.

반면,

컨테이너는 호스트 OS의 커널을 공유하며,

오직 애플리케이션과 그 종속성만을 포함하기 때문에

더 빠르게 시작되고, 더 적은 자원을 사용합니다.

 

VM에 대해서 아직 모르신다면 아래 글을 읽고 와주세요!

(작성 중)


컨테이너의 장점
  1. 이식성: 컨테이너는 도커와 같은 컨테이너 플랫폼에 의해 지원되며, 이로 인해 어떤 컴퓨터나 클라우드 환경에서도 동일하게 실행될 수 있습니다.
  2. 경량성: 컨테이너는 필요한 리소스만 포함하고 있기 때문에 작고, 빠르며, 효율적입니다.
  3. 격리성: 각 컨테이너는 서로 독립적으로 작동하며, 이는 서로 다른 컨테이너 간의 충돌을 방지합니다.
  4. 스케일링과 관리의 용이성: 컨테이너는 쉽게 생성, 배포, 복제, 및 삭제가 가능하여 대규모 애플리케이션과 서비스의 관리가 용이합니다.

컨테이너의 사용 사례
  • 개발 및 테스트: 개발자는 로컬 환경에서 컨테이너를 사용하여 애플리케이션을 개발하고 테스트할 수 있으며, 생산 환경과 동일한 설정을 유지할 수 있습니다.
  • 마이크로서비스 아키텍처: 컨테이너는 마이크로서비스 아키텍처의 기본 구성 요소로, 각 마이크로서비스를 독립적인 컨테이너로 배포하여 서비스의 확장성과 유지보수성을 향상시킬 수 있습니다.
  • 지속적 통합 및 지속적 배포 (CI/CD): 컨테이너는 CI/CD 파이프라인을 통해 코드 변경 사항을 쉽게 통합하고 자동으로 배포하는 데 이상적입니다.

컨테이너 기술은 현대 IT 환경에서 중요한 역할을 하며,

애플리케이션의 배포와 관리를 더욱 간편하고 효율적으로 만들어 줍니다.

특히, 도커 이미지는 컨테이너 이미지의 특별한 형태로,

도커 플랫폼에서 사용되며 표준화된 형식을 따릅니다.

도커 이미지는 이미지 레이어의 개념을 활용하여,

각 레이어가 변경 사항을 포함하므로 이미지의 효율적인 관리와 업데이트가 가능합니다.

이는 저장 공간과 데이터 전송을 최적화하며,

도커 레지스트리를 통한 이미지의 공유와 배포를 용이하게 합니다.

 

도커 이미지에 대해 더 알고 싶으시다면,

아래 링크를 참조해 주세요. 

https://jdcyber.tistory.com/68

 

도커(Docker)란 무엇인가?

도커(Docker)란 무엇인가? 도커는 컨테이너 가상화 기술을 이용해 개발자들이 프로그램을 효과적으로 배포하고관리할 수 있도록 해주는 오픈 소스 프로젝트입니다.이 기술은 각각의 애플리케이

jdcyber.tistory.com


오늘은 컨테이너 이미지에 대해 알아보며,

이 독특한 기술이 어떻게 소프트웨어 개발과 배포를 혁신적으로 변화시켰는지를 살펴보았습니다.

컨테이너 이미지는 개발자들이 어떤 환경에서도 일관된 결과를 보장하며

애플리케이션을 빠르고 효율적으로 배포할 수 있게 해 줍니다.

이러한 표준화된 실행 패키지는 앞으로도 계속해서

IT 산업에서 중요한 역할을 할 것입니다.

다음 시간에는 또 다른 흥미로운 기술 주제로 여러분을 만나 뵙겠습니다.

감사합니다!


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

오늘은 도커에 대해서 공부해 볼 예정입니다.

먼저 컨테이너에 대한 개념이 잡히지 않으셨다면

아래 글을 먼저 읽고 아래 내용을 봐 주시길 바랍니다.

https://jdcyber.tistory.com/69

 

컨테이너 이미지 이해하기: 애플리케이션 실행의 기본

컨테이너 이미지의 기본 개념컨테이너 이미지는 애플리케이션을 실행하는 데 필요한 모든 요소를 포함한 표준화된 실행 패키지 또는 "실행 환경"입니다.컨테이너 이미지는 애플리케이션을 실

jdcyber.tistory.com

도커(Docker)란 무엇인가?

 

도커는 컨테이너 가상화 기술을 이용해 개발자들이 프로그램을 효과적으로 배포하고

관리할 수 있도록 해주는 오픈 소스 프로젝트입니다.

이 기술은 각각의 애플리케이션을 컨테이너라고 불리는 독립된 환경에 격리시켜,

한 컴퓨터에서 여러 애플리케이션을 동시에 실행할 수 있게 해 줍니다.

이는 각 애플리케이션 사이의 충돌을 방지하고,

시스템 설정이 다른 환경에서도 동일하게 작동할 수 있게 합니다.

 

즉,

컴퓨터의 프로세스 (실행 중인 프로그램) 들을

마치 배에 실려있는 컨테이너처럼

각각 컨테이너로 격리시켜 하나씩 관리할 수 있는 기술입니다.


기존 가상화 방식과 도커는 어떤 점이 다른가요?

 

전통적으로 애플리케이션 격리는 가상 머신(VM)을 통해 이루어졌습니다.

가상 머신은 각각의 애플리케이션을 위해 별도의 운영 시스템(OS)을 설치하며, 이는 상당한 자원을 소모합니다.

도커는 이러한 점을 개선하여, 하나의 운영 시스템을 공유하면서도

애플리케이션을 격리시킬 수 있게 만들었습니다.

이로 인해 더 적은 자원을 사용하면서도 빠른 실행이 가능해졌습니다.

 

아직 VM에 대해 모르신다면 아래 글을 읽고 와주세요

(작성중)

 

즉, 이전에는  작업할 때

해당 OS와 충돌이 일어나는 프로그램이나

환경설정을 만들어 돌려야 하는 상황에서

Vm을 통해 충돌이 일어나지 않는

새로운 OS를 깔아서 사용했었는데요

이것이 바로 위에서 볼 수 있는

Vmware 같은 가상화 프로그램입니다.

Vmware 같은 가상 머신을 사용하기 위해서는

전체 OS를 설치하고 이용해야 하기 때문에

시간도 오래 걸리고 원래 pc의

성능이 떨어질 수밖에 없었습니다.

그래서 Docker는 이러한 문제점을 해결하기 위해

프로세스 격리라는 방식을 이용하게 되었습니다.

리눅스에서 이 방식을 컨테이너라고 설명하며

원래 PC의 OS 위에 다른 작업 필요 없이

Docker라는 엔진 (배) 위에 프로세스 (컨테이너)를

쌓아 실행하여 시간이나 성능의 낭비를 줄였습니다.


도커의 주요 구성 요소

1. 도커 파일(Dockerfile)

  • 도커 파일은 도커 이미지를 만들기 위한 스크립트입니다. 이 파일은 애플리케이션을 실행하는 데 필요한 모든 명령어를 포함하여, 이미지를 빌드하는 과정을 자동화합니다.

2. 도커 이미지(Docker Image)

  • 도커 이미지는 컨테이너를 실행하기 위한 기본 템플릿으로, 애플리케이션과 모든 종속성 및 라이브러리를 포함한 파일 시스템의 스냅샷입니다. 이미지는 변경되지 않으며, 같은 이미지에서 여러 컨테이너를 생성할 수 있습니다.

3. 도커 컨테이너(Docker Container)

  • 도커 컨테이너는 이미지를 기반으로 생성된 실행 가능한 인스턴스입니다. 이는 필요한 코드와 런타임, 시스템 도구, 시스템 라이브러리 등 실제 실행 환경을 모두 포함합니다. 컨테이너는 독립적으로 실행되며, 애플리케이션을 시작, 정지, 이동, 삭제할 수 있습니다.

여러분이 PC에 프로그램을 설치할 때 운영 환경을 고민하고

특정 경로에 맞춰 컴퓨터에 필요한 옵션을 만들고

힘들게 설치해보셨던 경험이 있을 텐데요.

컨테이너는 이러한 프로그램과 여타 환경까지 모두 포함하여 한번에 실행할 수 있도록 도와주는 기술입니다.

컨테이너 환경을 묶어서 배포한

컨테이너 이미지를 내려받아 구동하여 실행하기 때문에,

설치 및 설정 과정이 줄어들어 좀 더 편하게 사용할 수 있습니다.

컨테이너는 이미지를 기반으로 생성되며,

이미지를 실행한 상태로 파일 시스템과

애플리케이션이 실행된 상태라고ㄱ 보시는 게 좋습니다.

어떠한 것을 추가하거나 변하는 값은

바로 이 컨테이너에 저장이 됩니다


즉 생성과정은

도커 파일을 빌드하고 -> 도커 이미지를 생성하고 -> 도커 컨테이너를 생성합니다.

도커의 장점

 

도커는 여러 가지 면에서 개발 및 운영 효율성을 크게 향상시킵니다:

  • 환경 일관성: 개발, 테스트, 생산 환경 간 차이를 최소화합니다.
  • 이식성: 어떤 OS에서도 동일하게 실행됩니다.
  • 보안: 애플리케이션 간 격리를 통해 보안을 강화합니다.
도커의 확장성과 관리

도커 컨테이너는 단일 시스템에서 효율적으로 작동하지만,

대규모 애플리케이션을 여러 컨테이너로 관리할 때는 추가 도구가 필요합니다.

이런 경우, **쿠버네티스(Kubernetes)**가 중요한 역할을 합니다.

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 시스템입니다.

이 도구는 도커와 같은 컨테이너 플랫폼을 사용하여 애플리케이션의 복잡한 관리 작업을 단순화하고,

대규모의 서비스를 쉽게 운영할 수 있게 해 줍니다.

 

자세한 정보와 쿠버네티스의 더 깊은 이해를 원하신다면,

다음 링크를 참조하세요: [https://jdcyber.tistory.com/46]

 

쿠버네티스 (Kubernetes)란? (쉬운 설명, 개념)

쿠버네티스 (Kubernetes)란?컨테이너화된 애플리케이션의 대규모 배포, 스케일링 및 관리를 간편하게 만들어주는 오픈 소스 기반 컨테이너 오케스트레이션(Container Orchestration) 도구입니다.뭐라고요

jdcyber.tistory.com


오늘은 운영팀 개발팀 모두가 사랑하는

도커에 대해서 알아봤습니다.

도커는 현대의 소프트웨어 개발에 혁명을 가져온 도구로서,

개발자와 운영팀 모두에게 꼭 필요한 기술입니다.

이는 더 빠르고 효율적인 애플리케이션 배포와 관리를 가능하게 하여,

기술 스택의 중요한 부분이 되었습니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

커널(Kernel)은 컴퓨터 운영체제의 핵심 부분으로,

하드웨어 자원을 관리하고 응용 프로그램과 하드웨어 사이의 인터페이스 역할을 수행합니다.

이는 응용 프로그램이 시스템 호출을 통해 하드웨어 자원을 안전하게 요청하고 사용할 수 있게 도와줍니다.

 

다시 한번 설명하면,

커널 (Kernel)은 알맹이, 핵심 이란 뜻입니다.

운영체제의 핵심으로

컴퓨터 자원을 관리하는 역할을 수행합니다.

커널은 하드웨어와 응용 프로그램 사이에서

인터페이스를 제공하여 응용 프로그램이

하드웨어에서부터 오는 자원을 관리하고

사용할 수 있게 해 줍니다.

 

소프트웨어로부터 요청 (System Call)

컴퓨터에 있는 하드웨어(CPU, 메모리, 모니터)가

처리할 수 있도록 요청을 변환하는 역할을 합니다

 

커널을 도시의 전력 관리 시스템으로 생각해 보세요.

도시에서 전기는 각 가정과 회사에 필수적인 자원입니다.

전력 관리 시스템은 필요한 곳에 전기를 공급하고,

공급이 안전하게 이루어지도록 관리합니다.

마찬가지로 커널은 컴퓨터의 하드웨어 자원(전력)을

필요한 소프트웨어(가정, 회사)에 안전하고 효율적으로 분배합니다.

 

아래에서 하나씩 풀어서 설명해 드리도록 하겠습니다.

 

커널은 어디에 있는 건가요?

컴퓨터는 하드웨어(예: 키보드, 모니터, CPU)와 소프트웨어로 구분됩니다.

소프트웨어는 운영체제(예: Linux, MacOS, Windows)와

그 위에 설치되는 응용 프로그램(예: Excel, Chrome)으로 나뉩니다.

운영체제 안에서 커널은 시스템 프로그램과 함께 존재하며,

컴퓨터의 자원을 관리하는 중요한 역할을 합니다.

 

커널을 대형 쇼핑몰의 관리실로 생각할 수 있습니다.

쇼핑몰 안에는 다양한 상점이 있고,

이 상점들이 고객에게 서비스를 제공합니다.

관리실은 상점들이 필요로 하는 자원을 조정하고 배분하는 역할을 합니다.

이와 유사하게,

커널은 운영체제 내에서 소프트웨어가 하드웨어 자원을 효과적으로 사용할 수 있도록 관리합니다.

 

운영체제커널(Kernel)

시스템 프로그램으로 구분됩니다.

즉 커널은 컴퓨터 안에 운영체제에 속해 있는

컴퓨터의 자원을 관리해 주는 아주 중요한 부분

왜 커널이 필요한가요?

응용 프로그램이 하드웨어 자원을 직접 조작하면 자원 관리가 무질서해지고

시스템에 큰 영향을 미칠 수 있습니다.

따라서 운영체제는 응용 프로그램이 자원에 접근할 때

자신을 통해서만 접근하도록 제한하여 자원을 보호합니다.

이 과정에서 커널이 중심적인 역할을 합니다.

 

상황을 교통 체계에 비유해 볼 수 있습니다.

도로에서 차량(응용 프로그램)이 자유롭게 움직이면

교통 혼잡이 일어나고 사고가 발생할 수 있습니다.

교통경찰(커널)은 차량이 규칙을 준수하며 움직일 수 있도록 도로 사용을 조정합니다.

이로 인해 도로의 효율과 안전이 보장됩니다.

 

이중 모드: 사용자 모드와 커널 모드

대부분의 운영체제는 이중 모드를 사용하여 운영됩니다.

사용자 모드에서는 제한된 접근 권한으로 응용 프로그램이 실행되고,

커널 모드에서는 운영체제가 전체 시스템 자원에 접근할 수 있습니다.

예를 들어, 하드 디스크에 데이터를 저장하려는 응용 프로그램은

시스템 호출을 통해 커널 모드로 전환하여 이 작업을 수행하고,

다시 사용자 모드로 복귀합니다.

 

이중 모드를 학교에서의 교실과 교장실로 비유할 수 있습니다.

학생들(응용 프로그램)은 교실에서 일정한 규칙 내에서 활동합니다(사용자 모드),

반면 교장실(커널 모드)은 학교 전체를 관리하고 교육적 의사결정을 내릴 수 있는 전권을 가집니다.

이중 모드는 시스템의 안정성과 보안을 유지하기 위해 필수적입니다.

 

이중모드에 대해 자세히 알고 싶으신 분은 아래 글을 읽어 주세요

(작성 중)

쉘과의 관계

커널은 사용자와 직접 소통하지 않으므로,

사용자는 쉘을 통해 커널에게 명령을 내릴 수 있습니다.

쉘은 사용자로부터 명령을 받아 커널에 전달하고,

커널의 작업 결과를 사용자에게 돌려줍니다.

 

쉘이란 무엇일까요? 아래 글을 참조해주세요

https://jdcyber.tistory.com/72

 

쉘이란? Shell 기본 개념 이해하기

프로그래밍을 공부하면서 가장 어려웠던 점은<p id="SE-2b20e3bc-c016-4659-afd1-f225c9122d8c" style="background-color: #f7f7f7; color: #000000; text-ali..

jdcyber.tistory.com

 

쉘을 컴퓨터 프로그램과 하드웨어 사이의 통역사로 생각해 보세요.

외국에서 통역사 없이 의사소통을 하려면 어렵겠지만,

통역사가 있다면 소통이 수월해집니다.

마찬가지로 사용자(외국인)는 쉘(통역사)을 통해 커널(현지인)에게 명령을 전달하고,

결과를 이해할 수 있도록 도움을 받습니다.


커널은 운영체제의 핵심 부분으로서

컴퓨터의 기능과 성능에 지대한 영향을 미칩니다.

사용자와 하드웨어 사이에서 중요한 역할을 수행하며,

컴퓨터의 자원을 효율적으로 관리하고 보호하는 데 필수적입니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

하이퍼바이저(Hypervisor)란?

하이퍼바이저, 또는 가상 머신 모니터(VMM)라고도 불리는 이 소프트웨어 플랫폼은

단일 호스트 컴퓨터에서 여러 개의 게스트 운영체제(OS)를 동시에 실행할 수 있게 해주는 가상화 기술의 핵심 요소입니다.

하이퍼바이저는 물리적 하드웨어 자원을 가상화하여 각 가상 머신에 할당하고,

이를 통해 다양한 운영체제가 마치 독립된 컴퓨터에서 실행되는 것처럼 작동할 수 있도록 합니다.

 

상상해 보세요.

공항에는 한정된 수의 게이트가 있으며, 여러 항공사가 이 게이트를 통해 동시에 여러 비행기를 운항해야 합니다.

공항의 관리 시스템은 각 항공사에 필요한 게이트를 할당하고,

각 항공사가 자신의 비행 스케줄에 맞춰 효율적으로 게이트를 사용할 수 있도록 조정합니다.

 

이와 마찬가지로,

윈도우 운영 체제에서 하이퍼바이저는 컴퓨터의 하드웨어 자원(게이트와 같은)을 관리합니다.

여러 가상 머신(항공사의 비행기)이 동시에 이 자원을 공유하며 사용할 수 있도록 합니다.

예를 들어, 하이퍼바이저를 활용하면 한 컴퓨터에서

윈도우, 리눅스, 맥 OS와 같은 여러 운영체제를 동시에 실행할 수 있는

가상 머신들을 만들고 관리할 수 있습니다.

각 가상 머신은 마치 공항의 게이트를 할당받은 항공사처럼,

컴퓨터의 CPU, 메모리, 저장 공간 등의 자원을 할당받아 사용합니다.

하이퍼바이저는 이 모든 가상 머신들이 필요한 자원을 공정하게 받고,

서로 간섭 없이 효율적으로 작동하도록 돕습니다.

다시 돌아와서 하이퍼바이저는

내 컴퓨터에 가상 머신(vmware)을 이용하여

리눅스나 맥 다른 운영체제를 다운로드해 실행할 때

해당 OS (운영체제)에 필요한 리소스를 내 컴퓨터

하드웨어에서 할당받아 제공해 줍니다.

서로 다른 여러 개의 운영체제를 나란히 구동할 수 있으며,

VM을 모니터링하는 중간 관리

VMM(Virtual Machine Monitor)라고도 불립니다.

쉽게 설명하자면,

하이퍼바이저 (Hypervisor)는

가상 머신 속 OS들에게 자원을 나눠주며 조율하고

OS들의 커널을 번역해서 본 컴퓨터 하드웨어에게

알려주는 역할을 합니다.

 

커널이란?

https://jdcyber.tistory.com/67

 

커널(Kernel)이란 무엇일까? (개념, 이중 모드, 쉘의 역할)

커널(Kernel)은 컴퓨터 운영체제의 핵심 부분으로, 하드웨어 자원을 관리하고 응용 프로그램과 하드웨어 사이의 인터페이스 역할을 수행합니다. 이는 응용 프로그램이 시스템 호출을 통해 하드웨

jdcyber.tistory.com


하이퍼바이저의 주요 기능과 유형

  1. 전체 가상화(Full Virtualization)
    전체 가상화에서는 하이퍼바이저가 모든 하드웨어 호출을 포착하고 중재하여, 게스트 운영체제가 자신이 물리적 하드웨어 위에서 직접 실행되고 있는 것처럼 착각하게 만듭니다. 이 방식은 하드웨어 자원을 완전히 가상화하며, 게스트 OS는 하이퍼바이저를 통해서만 하드웨어 자원을 요청할 수 있습니다. 다시 말해, CPU 차원의 가상화는 하드웨어를 완전히 가상화하는 방식이므로 반드시 하이퍼바이저가 중간에서 중재하게 됩니다. 조금 더 세부적으로 살펴본다면, DOM0이 그 역할을 하게 되는데 각 가상머신은 DOM0에게 명령을 전달하고, DOM0에서 이를 해석하여 하이퍼바이저에게 알려주게 됩니다. (Vmware, ESX server, Hyper V, KVM)
  2. 반가상화(Paravirtualization)
    반가상화는 게스트 OS가 하이퍼바이저 존재를 인식하고, 하이퍼바이저와 직접 상호작용하는 것을 특징으로 합니다. 이 모델에서는 DOM0(도메인 제로)가 하이퍼바이저와 게스트 OS 사이의 중개자 역할을 하지 않고, 게스트 OS는 하이퍼 콜(Hyper-Call)이라는 특수한 API를 통해 하이퍼바이저에 직접 요청을 보냅니다. 이는 전체 가상화에 비해 성능 향상을 제공할 수 있습니다.

DOM0 이 무엇인지 알고 싶으신 분들은 아래 글을 참고해 주세요!

(작성 중)

 

Hyper-Cell이 무엇인지 알고 싶으신 분들은 아래 글을 참고해 주세요!

(작성 중)

하이퍼바이저의 구분

하이퍼바이저는 크게 두 가지 유형으로 나뉩니다

  1. Type 1 하이퍼바이저(Native or Bare-Metal Hypervisors): 이 유형의 하이퍼바이저는 직접 하드웨어 위에 설치되며, 하드웨어와 가상 머신을 관리하는 데 필요한 모든 기능을 갖추고 있습니다. 운영체제 없이 처음부터 하이퍼바이저를 설치해야 하며, 이는 보다 높은 성능과 보안을 제공합니다.
  2. Type 2 하이퍼바이저(Hosted Hypervisors): 호스트 운영체제 위에 설치되는 이 하이퍼바이저는 일반적인 소프트웨어 응용 프로그램처럼 작동합니다. 게스트 운영체제는 호스트 OS를 통해 간접적으로 하드웨어 자원을 접근하며, 이는 설치 및 관리가 상대적으로 쉽지만, Type 1 하이퍼바이저에 비해 성능 면에서 뒤떨어질 수 있습니다.

하이퍼바이저 기술은 현대 IT 인프라에서 중추적인 역할을 수행하며,

다양한 가상 환경을 가능하게 합니다.

기업들은 하이퍼바이저를 사용하여 하드웨어 비용을 절감하고,

시스템의 유연성을 높이며,

IT 자원을 보다 효과적으로 관리할 수 있습니다.

특히 클라우드 컴퓨팅, 대규모 데이터 센터,

개발 및 테스트 환경 구축에 있어서 가상화는 필수적인 기술로 자리 잡고 있습니다.

하이퍼바이저를 통한 가상화는

물리적 제약을 넘어서는 새로운 가능성을 제공하며,

기술의 발전과 함께 그 적용 범위와 효율성이 계속해서 개선되고 있습니다.

 

앞으로도 기술 발전에 따라 더욱 향상된 성능과 보안을 갖춘

하이퍼바이저 솔루션이 등장할 것으로 기대됩니다.

이처럼 하이퍼바이저는 비단 복잡한 기술 환경뿐만 아니라

일상적인 비즈니스 운영에도 중요한 역할을 하고 있으며,

그 중요성은 점점 더 커질 것입니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

오늘은 최적의 프로그래밍 언어를 선택하는
가이드 글을 작성해 보겠습니다.

현대 IT 산업에서 프로그래밍 언어의 역할은 중요하며,
다양한 언어가 각자의 특성과 용도로 활용됩니다.
개발자가 되려는 초보자든, 경력을 확장하고자 하는 전문가든,
적절한 프로그래밍 언어 선택은 경력의 방향을 결정짓는 핵심 요소입니다.
이 글에서는 주요 프로그래밍 언어의 특성과 각 언어가 어울리는 사용 환경에 대해 자세히 탐구하고,
독자의 필요와 목표에 맞는 언어를 선택할 수 있는 방법을 제공하겠습니다.


  1. 프로그래밍 언어의 역할과 중요성
    • 프로그래밍 언어는 소프트웨어 개발의 기반입니다.
      각 언어는 특정 도메인이나 작업에 적합한 독특한 특성과 기능을 가지고 있습니다.
      예를 들어, 웹 개발, 시스템 프로그래밍, 모바일 애플리케이션 개발 등 각 분야에서 선호되는 언어가 다릅니다.
  2. 주요 프로그래밍 언어의 특징 및 적용 분야
    • Python: 직관적인 문법과 높은 가독성으로 초보자에게 추천됩니다. 데이터 과학, 웹 개발, 자동화 등 다양한 분야에서 널리 사용됩니다.
    • Java: 플랫폼 독립적이며, 대규모 시스템 개발에 적합합니다. 안드로이드 앱 개발과 엔터프라이즈 급 애플리케이션에 주로 사용됩니다.
    • JavaScript: 웹 프론트엔드 개발에 필수적이며, Node.js를 통해 백엔드에서도 활용됩니다.
    • C 언어: 시스템 프로그래밍과 임베디드 시스템 개발에 이상적입니다. 고성능이 요구되는 어플리케이션에 주로 사용됩니다.
    • C++: C의 직접적인 확장으로, 게임 개발, 실시간 시스템, 고성능 서버 등에서 사용됩니다.
    • C#: 주로 마이크로소프트의 .NET 프레임워크에서 사용되며, 게임 개발(Unity 엔진 사용)에도 인기가 있습니다.
    • PHP: 서버 측 웹 개발에 강력하며, WordPress와 같은 CMS 개발에 자주 사용됩니다.
    • HTML/CSS: 웹 페이지의 구조와 스타일을 정의하는 데 필수적입니다.
    • Swift: iOS 및 macOS 애플리케이션 개발에 사용되며, Apple 생태계에서 매우 중요합니다.
    • Kotlin: Android 개발에 최적화된 언어로, Java의 대안으로 빠르게 자리잡고 있습니다.
  3. 언어 선택 시 고려해야 할 요소
    • 목적 및 프로젝트 요구 사항: 개발하고자 하는 애플리케이션의 유형에 따라 적합한 언어를 선택해야 합니다.
    • 학습 곡선: 언어의 복잡성과 학습 자원의 가용성을 고려하세요.
    • 커뮤니티 및 지원: 강력한 개발자 커뮤니티와 충분한 학습 자료가 있는 언어는 시작하기에 좋습니다.
    • 경력 전망 및 시장 수요: 직업 시장에서의 수요와 경력 전망도 중요한 선택 요소입니다.

Github Push 순위 (22년 1분기)

Github에서 Push는 자신이 작업한 내용을 깃허브 서버에 올리는 기능입니다. 
2022년 1분기 Push 기능에서 자주 사용된 개발 언어 순위 1~10위는 아래와 같습니다.

1
Python
2
Java
3
JavaScript
4
C++
5
PHP
6
TypeScript
7
C
8
Go
9
Shell
10
Ruby

Tiobe 프로그래밍 언어 순위 (22년)

TIOBE는 소프트웨어 사용성과 소스 코드의 품질을 검사하고 관리하는 회사로
TIOBE Index를 통해 개발 언어의 인기 순위를 알려줍니다.
프로그래밍 언어 순위는 한 달에 한 번씩 업데이트되며
산정 기준은 구글, Bing, 야후, 위키피디아, 아마존, 유튜브와 같은
인기 검색 엔진 검색 빈도수에 더해 소프트웨어의 프로그래밍 언어 사용량을 기반으로 합니다.
2022년 9월 Tiobe index 프로그래밍 언어 순위는 아래와 같습니다.

1
Python
2
C
3
Java
4
C++
5
C#
6
Visual Basic
7
JavaScript
8
Assembly language
9
SQL
10
PHP

파이썬과 자바가 항상 높은 순위에 있네요!


그렇다면 나는 어떤 언어를 공부해야 할까요?

어느 한 곳에서 완벽한 프로그래밍 언어는 없습니다. 
특정 분야에서 강점을 가지면, 다른 분야에서 약점을 가지기 마련입니다. 
 
C나 C++ 같은 언어는 속도가 빠르지만, 배우기 어렵고 개발하는데 시간이 다른 언어들에 비해 오래 걸립니다. 
Python 같은 언어는 개발 속도가 빠르고 가독성이 높다는 장점은 있지만 실행 속도가 다른 언어들에 비해 느립니다.  
이와 같이 목적과 하고자 하는 일의 특성에 따라 선호되는 언어가 다릅니다. 
그래서 우리는 하고자 하는 일을 명확히 파악하고 가중치를 두어 언어를 선택해야 합니다. 
 
여러분은 프로세스와 관련된 서버(server-side)와 데이터베이스를 관리해 주는 백엔드를 하고 싶으신가요? 
사용자와 직접 만나 부딪히는 레이아웃을 고민하고 짜는 프론트앤드를 하고 싶으신가요?
데이터를 분석하고 솔루션을 내주는 데이터 분석가가 되고 싶으신가요?


프로그래밍 언어를 선택하는 것은 당신의 경력 목표, 관심 있는 기술 영역,
그리고 학습할 준비가 되어 있는 어려움의 수준에 따라 달라집니다.
여기서는 프론트엔드와 백엔드 개발에 필요한 주요 프로그래밍 언어와
그 사용 목적을 명확하게 구분하여 표로 정리해 보겠습니다.
아래 표는 각 언어가 어떻게 활용되는지,
어떤 분야에 적합한지에 대한 간략한 가이드를 제공해 보겠습니다.


프론트엔드 개발

언어/기술목적추가 공부 추천
HTML웹 페이지의 구조 설계-
CSS웹 페이지의 스타일링과 레이아웃 디자인-
JavaScript동적인 웹 페이지 기능 구현AngularJS, ReactJS, Bootstrap

프론트엔드 개발자는 사용자 인터페이스를 생성하고 개선하는 역할을 담당합니다.
이를 위해 웹 표준 기술인 HTML과 CSS를 통해 웹의 구조와 스타일을 정의하고,
JavaScript로 웹 페이지에 상호작용을 추가합니다.
또한, AngularJS나 ReactJS 같은 모던 자바스크립트 프레임워크를 학습하여
더 복잡하고 동적인 웹 애플리케이션을 구축할 수 있습니다.


백엔드 개발

언어목적추가 정보
PHP웹 서버 스크립트 및 콘텐츠 관리 시스템 개발-
Node.js서버 사이드 스크립트 구현JavaScript 기반
C++고성능 백엔드 서비스 개발-
Java대규모 엔터프라이즈 시스템 및 안드로이드 앱-
Python데이터 처리 및 백엔드 로직 개발빅 데이터, 인공지능 분야 선호

백엔드 개발자는 클라이언트(사용자)가 볼 수 없는 서버, 애플리케이션, 데이터베이스 관리 등을 담당합니다.
이들은 사용자 요청을 처리하고 적절한 출력을 제공하는 로직을 구현합니다.
PHP, Node.js, Java, Python 등 다양한 언어가 백엔드 개발에 활용되며,
선택은 프로젝트 요구 사항과 개인의 기술 선호도에 따라 달라질 수 있습니다.


개발 분야별 언어 추천

관심 분야추천 언어
웹 개발HTML, CSS, JavaScript, PHP, Ruby
안드로이드 앱 개발Kotlin
iOS 앱 개발Swift
데이터 분석Python
시스템 프로그래밍C, C++
범용 프로그래밍Java, C

 
어떤 언어를 선택하여 공부하기로 마음먹는 계획보다 가장 중요한 것은
오늘부터 시작하세요
언어를 선택하여 시작했지만 굉장히 지루할 수도 재미있을 수 도 있습니다.
각자의 성향은 다양하니까요
그래서 우선 시작하고 맞지 않는 것 같다면 과감하게 다른 언어로 다시 시도해 보는
경험이 굉장히 중요할 것 같습니다.
계획을 잡고 어떻게 공부해야 하는지 어려움이 있으시다면 아래 글을 참고해 보세요!

https://jdcyber.tistory.com/15

프로그래밍 언어 어떤 걸 먼저 배워야할까? (쉬운 설명, 특징, 목적, 파이썬, 자바, 자바 스크립트

수많은 프로그래밍 언어 도대체 뭘 먼저 배워야 해? 개발을 처음 배우거나 보안을 배우거나 iT업계로 들어올 때 수많은 컴퓨터 언어를 보고 멘붕이 오실 겁니다. 저걸 다 해야 하나..? 어떤 언어

jdcyber.tistory.com

https://jdcyber.tistory.com/13

개발자 입문부터 풀스택까지 로드맵 (공부 순서를 어떻게 해야 하나요?)

앞서 2가지 프로그래밍 언어를 소개하는 글을 통해서 어떤 프로그래밍 언어를 배워야 하는지 그 프로그래밍 언어는 어떤 것에 특화가 되어있고 목표로 잡은 것이 어떤 것이냐에 따라 달라진다

jdcyber.tistory.com


 
궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용
추후 정리해서 올려드리겠습니다
구독 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형

+ Recent posts