네트워크 기초 지식1

Computer Science 공부하기 첫 번째 - Network

올해 초에 도서관에서 책을 빌려 약 한 달동안 네트워크를 간단하게나마 공부를 해 보았다. 네트워크가 어떻게 돌아가는지 모르고 웹 개발을 해오고 있었는데 알게 모르게 도움이 많이 됐던 것 같았다. 그래서 이번엔 조금 더 천천히 그리고 진지하게 공부해 보려고 한다.

시작..!

네트워크

네트워크란 무엇일까? A와 B가 연결되어 있는 것이라고 생각한다. 조금 더 자세하게 말하자면 무언가와 무언가가 무언가에 의해 연결되어 있는 것 이라고 한다.

여러가지 네트워크가 있겠지만, 그 중에서도 컴퓨터 네트워크에 대해서 정리해보려고 한다.


네트워크의 구성

컴퓨터 네트워크는 노드(Node)링크(Link) 로 구성되어있다. 다시 표현하자면 노드와 노드가 링크로 연결되어 있다고 할 수 있다. 하지만 이러한 네트워크의 구성에는 어떤 움직임도 없는데, 이 네트워크가 하려는 것은 무엇일까?

노드(컴퓨터)와 노드(컴퓨터)를 링크(통신 매체)로 연결하여 데이터(정보)를 주고 받는 것이 컴퓨터 네트워크가 하는 일이고 컴퓨터나 사용자가 가진 리소스를 공유하기 위해 존재한다

프로토콜

데이터를 주고 받기 위해서 규칙을 정할 필요가 있다. 이러한 데이터 통신에 대한 규칙을 프로토콜(protocol)이라고 하며 데이터를 보내는 쪽하고 받는 쪽하고 같은 프로토콜을 사용해야한다.

같은 규칙을 가지고 데이터를 주고 받아야 한다

프로토콜에는 데이터를 다루는 법 뿐만 아니라 주고 받는 순서, 데이터 내용 등등 많은 것 들을 포함하고 있다. 지금은 같은 규칙을 가져야 한다는 것만 이해하고 넘어가도록 하자.

네트워크 전달방식

네트워크 전달 방식에는 패킷 교환 방식회선 교환 방식이 있다. 컴퓨터 네트워크에서는 데이터를 패킷(Packet)으로 분할한 후 주고 받는다. 이때에 패킷은 어디로 전달되야하는지 알 수 있도록 주소(address)정보를 가지고 있다.

  1. 회선 교환 방식

    • 아날로그 방식의 유선전화 또는 3G 휴대전화가 사용했다
    • 통신하려는 양쪽 디바이스가 하나의 통신 경로를 점유하는 방식이다
    • 때문에 일대일 통신을 기본으로 한다
    • 통신 속도가 안정적이라는 장점이 있다
  2. 패킷 교환 방식

    • 주고받을 데이터는 작게 쪼갠 후 주고받는다
    • 다른 데이터 조각들과 섞여서 주고 받곤한다
    • 통신 경로를 공유하며 전달하기 때문에 여러 상대와 통신할때 효과적이다
    • 주고받는 패킷이 증가하면 전송 속도가 느려지는 단점이 있다

회선 교환 방식의 경우 동시 통화에 필요한 수 만큼 회선이 필요하기 때문에 교환기 사이의 회선의 수가 엄청 많아야한다. 이런 단점을 해소하기 위해 패킷 교환 방식이 등장하게 되었다.

하나의 연결이 회선을 점유하는 방식이 아니기 때문에 패킷과 패킷사이에 여러 다른 패킷이 들어갈 수 있다. 즉 서로 다른 복수의 패킷이 하나의 회선을 통해 지나갈 수 있다는 것이다.(목적지를 명확히 해야하기 때문에 각 패킷에는 수신처를 명시해야 한다). 패킷 교환기의 역할은 회선 교환기와 비교했을 때 다음과 같은 특징을 가져야 한다.

  1. 수신처가 연결되어 있는 회선을 골라서 패킷을 송신하는 역할
  2. 사용하려고 한 회선이 사용중일 경우 일시적으로 저장했다가 회선이 비는 것을 기다리는 역할

네트워크의 구조

컴퓨터 네트워크의 통신에 필요한 기기들을 정리해보자.

  1. 컴퓨터(노드)
  2. 통신 매체(링크)
  3. 인터페이스(Interface)
  4. 라우터(패킷 교환기)

컴퓨터와 통신 매체의 사이에는 인터페이스 라는게 존재하지만 나중에 얘기하기로 하고 라우터에 대해서 정리해 보도록 하자.

지금까지 얘기했던 패킷 교환기는 실제 네트워크에서 라우터(router)라는 이름으로 사용한다. 하지만 라우터 없이 통신이 가능한 구간이 존재하는 데 이러한 범위를 세그먼트(Segment)라고 한다.

세그먼트(segment)

케이블 분배기 또는 허브(Hub)로 연결되는 범위 -> 패킷 교환없이 직접 데이터를 송수신 할 수 있다

네트워크의 범위

네트워크를 규모 측면에서 나누면 LAN(Local Area Network)WAN(Wide Area Network) 가 있다.

첫 번째, LAN은 좁은 범위의 네트워크를 의미한다. 좀 더 구체적으로 구내에 설치된 네트워크 라고 말할 수 있겠다. LAN은 기본적으로 사용하는 쪽에서 책임지고 케이블 설치랑 라우터 배치 등을 해서 네트워크를 만든다.

LAN은 지역적으로 좁은 범위에서 본인이 책임지고 구축하는 네트워크

두 번째, WAN은 떨어져 있는 지역의 LAN끼리 통신사업자의 통신 케이블을 빌려서 연결한 네트워크라고 말할 수 있다. 통신사업자란 통신용 케이블을 소유하고 있는 회사인데 우리나라의 경우 KT / SKT / LG 라고 보면 된다.

WAN은 통신사가 소유한 통신망에 데이터를 전송할 권리를 구입해서 구축하는 네트워크

정리해보면, LAN은 자기가 만들고 WAN은 통신사업자에게 빌려서 만드는 네트워크이다. 그리고 대표적인 WAN은 인터넷이 있다.

Share

PostgreSQL에 CSV 파일 임포트하기

psql에 csv파일 임포트하기

갑자기 psql에 데이터를 업로드할 일이 생겼다. 간단할 것이라고 생각했으나 local / remote에 따라 해야하는 것도 달랐고 신경써야 할 부분이 있었다. 물론 처음 해보는 것이라서 그랬을 것 같단 생각…

기본 명령어

일단, local 환경이던 remote 환경이던 신경쓰지 않고 기본적인 file import 명령어를 보자.

1
2
3
COPY <table_name>
FROM <file_path>
WITH DELIMITER ',' csv HEADER

위와 같은 방법으로 사용했다.

DELIMITER는 CSV파일 내에서 어떠한 구분자가 쓰였는지 적어준다. 또한 HEADER은 CSV 파일 맨 윗줄은 데이터가 아닌 column 이라고 명시해 주는 것이다.

동일 머신

같은 머신 내에서는 기본 명령어에서 하듯이 똑같이 하면 된다. 하지만 문제는 서로 다른 머신에 있을때에 있다.

다른 머신

이번에 겪었던 문제는 다음과 같은 어려움이 있었다.

CSV 파일은 로컬환경에 있다.

데이터를 통채로 올리는 것이 아닌 CSV 파일로부터 읽어서 한 줄 한 줄씩 삽입하는 것.

클라이언트 프로그램인 pgAdmin4를 처음 사용해보는 것.

COPY 명령어를 pgAdmin4와 psql 콘솔에서 실행해 보았지만 여러 크고 작은 문제들로 인해서 잘 되지않았다. NULL값이 문자열로 인식되는 경우도 있었고 인코딩 문제도 있었다.

어찌되었던간에,

문제는 다음과 같이 해결했다.

1
2
3
4
5
6
# in shell console
# 파일이 저장되어 있는 로컬환경
psql -U <username>
-d <db_name>
-h <remote_addr>
-c "\copy <table_name> FROM <file_path> WITH DELIMITER ',' csv HEADER;"

-c 옵션을 통해서 psql 콘솔 접속 시, 입력된 명령어를 실행하게 했다. 또한 로컬에서 원격으로 접속하는 것이기 때문에 -h 옵션으로 psql이 설치된 서버의 주소를 적어주었다.

Share

virtualenvwrapper를 이용한 파이썬 가상환경 관리

virtualenvwrapper 설정하기

만약 하나의 컴퓨터에 여러개 파이썬 프로젝트가 있다면 어떻게 해야할까? 사용해야하는 파이썬 버전이 동일하고 패키지의 버전마저 같다면 문제가 될 건 없다. 하지만 프로젝트마다 사용중인 패키지의 버전이 다르다면….? 문제는 꽤나 복잡해지게 된다.

예를들어,

A라는 서비스를 만들기 위해서 Djagno 1.11 버전을 사용하고 / B라는 서비스를 위해 Django 2.0을 사용한다면 어떻게 해야할까?

왔다갔다 할때마다 설치 / 삭제를 반복해야 하는 것일까?

그래서, 프로젝트 별로 관리를 하기 위해서 가상환경을 폴더 단위로 정할 수 있는 패키지들이 있다. 나의 경우 현재 virtualenv라는 패키지를 이용하고 있다. virtualenv를 이용하면 프로젝트 별로 가상환경을 설정할 수 있어서 A에는 django 1.11를 설치하고 B에는 django 2.0 을 설치해서 진행중인 프로젝트를 왔다갔다 할때마다 가상환경만 실행해주면 문제가 발생하지 않는다.

하지만 여기에도 불편한 점이 있었으니..

바로 가상환경을 실행하기 위해서 source /bin/activate를 수동으로 실행해주어야 하는 것이다. 폴더명을 항상 외울수도 없는 노릇이고.. 타이핑 하는 수고도 꽤나 많기 때문에 귀찮은 작업이 될 수 있는데, 이러한 문제점을 해결하기 위해서 virtualenvwrapper 라는 패키지를 사용하려고 한다.

한마디로 얘기하자면

현재 위치한 경로와 상관없이 가상환경을 실행할 수 있다는 것이다!!!


설치

virtualenv는 이미 사용중이며, pip를 통해서 virtualenvwrapper를 설치해보자.

1
pip install virtualenvwrapper

그리고, 홈 디렉토리로 이동하여 가상환경들이 저장될 폴더를 만든다.

1
2
cd ~
mkdir .virtualenvs

홈 디렉토리의 쉘 설정에서 아래의 코드를 복사하여 넣어준다. (각자 사용중인 쉘 환경에 맞게 설정해 준다.)

1
2
3
4
5
6
# in ~/.zshrc
# in ~/.bashrc

export WORKON_HOME=~/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON="$(which python3)"
source /usr/local/bin/virtualenvwrapper.sh

저장하고 쉘을 재시작해주면 virtualenvwrapper를 사용할 수 있게된다.

만약 /usr/local/bin/virtualenvwrapper.sh 파일이 존재하지 않으면 아래 명령어로 파일을 찾아서 source 부분을 대체해준다.

1
find /usr -name virtualenvwrapper.sh

virtualenvwrapper 명령어

기본적인 명령어를 알아보자.

  • 가상환경 만들기
1
mkvirtualenv <virtualenv_name> # 이름

mkvirtualenv 명령어를 통해 가상환경을 새로 만들어 주면, 홈 디렉토리의 .virtualenvs 폴더에 저장된다.

  • 가상환경 삭제
1
rmvirtualenv <virtualenv_name>

가상환경을 삭제한다. 삭제하는 방법으로 위의 코드처럼 명령어를 이용하는 방식직접 폴더를 지우는 방식이 있다.

  • 가상환경 목록 출력
1
workon

아무런 인자 없이 workon을 입력하면 현재까지 생성한 가상환경의 목록을 알 수 있다.

  • 가상환경 진입 / 빠져나오기
1
2
3
4
5
# 진입
workon <virtualenv_name>

# 빠져나오기
deactivate
Share