파이썬으로 알아보는 자료구조 - hash table

Hash Table

  • 해시 테이블
  • 키(key)에 값(데이터 - value)를 저장하는 구조
  • 즉, key를 알면 한 번에 데이터를 가져올 수 있다

출처: https://en.wikipedia.org/wiki/Hash_table

용어

  • 해시(hash)

예시

  • 파이썬의 딕셔너리(사전 - Dictionary) 데이터 타입을 생각하면 됨

장단점

장점

  • 데이터의 저장 / 읽기 속도가 다른 구조와 비교했을때 매우 빠르다
  • 검색 속도가 빠르다
  • 데이터 중복 확인이 쉽다

단점

  • 저장공간이 조금 더 필요하다
  • 여러 키에 대해 동일한 해시 주소가 동일할 수도 있다. 해시 주소의 충돌을 해결하기 위해서 별도의 자료구조가 필요할 수 있다.

사례

  • 검색이 많이 필요한 경우
  • 저장 / 삭제 / 읽기 / 수정 작업이 자주 일어날 때
  • 캐시(중복 확인이 용이하기 때문)
Share

유닉스 명령어 미세팁 정리

유닉스 명령어 미세팁 정리.

cd -

바로 직전에 있던 경로로 한 번에 이동한다.

예를 들어 /home/ubuntu/desktop에 있다가 cd명령어를 통해 /home/ubuntu/documents 경로로 옮겨 왔다고 가정해보자. 조금 전에 있던 경로인 /home/ubuntu/desktop로 이동하려면 cd - 명령어를 입력하자

1
cd -

ls -ld

디렉터리의 자세한 정보를 출력한다.

보통 ls 명령어는 디렉터리의 내용을 출력하기 위해 사용하지만, -d 옵션을 통해 내용이 아닌 디렉터리 자체의 정보를 출력할 수 있다.

1
ls -ld <directory_name>

mv -i | cp -i

-i 옵션을 통해 덮어쓰기를 방지할 수 있다.

명령어를 사용하면 파일 또는 디렉터리의 이름을 변경하거나 경로를 이동시킬 수 있는데, 목적지에 같은 이름의 파일이 있다면 덮어쓰기를 자동으로 수행한다. ```-i``` 옵션은 interactive의 약자로 이름의 중복이 발생할 경우 사용자에게 작업을 계속해서 수행할지 물어본다. 따라서, 묻지마 덮어쓰기를 방지할 수 있을 것이다.
1
2
3
4

```sh
mv -i <file> <destination>
cp -i <file> <destination>

이름에 공백이 있을 경우

대게 명령어의 인자 구분은 공백을 사용해서 하기 마련이다. 즉, mkdir hello world라는 명령어는 hello world 라는 디렉터리를 만들지 않고 helloworld라는 두 개의 디렉터리를 생성한다.

이름에 공백이 필요할 경우 따옴표를 사용해 주어야 한다.

1
mkdir 'hello world'
Share

HTTPS를 위한 let's encrypt 무료 인증서 적용하기

플레이 스토어와 앱 스토어에 어플리케이션을 등록하기 위해서 충족해야 하는 몇가지 사항들이 있는데 그 중에서 가장 쉬운 방법은 백엔드 서버에 SSL을 적용하는 것이다. 우분투 서버에 let’s encrypt의 무료 인증서를 적용하여 HTTPS을 사용하도록 하는 방법에 대해서 정리힌다.

참고로 SSL을 적용하는 방법에는 두 가지가 있는 것 같다. 첫 번째, webroot 플러그인을 사용하는 방법. 두 번째, certbot 사용하는 방법인데, 두 번째 방법인 certbot을 이용하는 것이 훨씬 간단하다.

1. certbot 설치

사용하는 리눅스 배포판에 따라 certbot을 설치하면 된다. apt에 certbot 저장소를 아래와 같이 추가한다. 저장소 추가 후 apt 업데이트를 해주어 반영시킨다.

1
2
sudo add-apt-repository ppa:certbot/certbot
sudo apt update

certbot을 설치한다.

1
sudo apt-get install python-certbot-nginx

2. nginx 설정

사용할 환경에 따라 nginx 설정을 해준다. certbot을 이용해 인증서를 발급받을때 해당 도메인의 80번 포트로 접속이 가능한지 보기 때문에 80번 포트server_name을 설정해주어야 한다.

1
2
3
4
server {
listen 80;
server_name domain-example.com;
}

nginx 설정이 잘 되어있는지 확인하고 재시작하자.

1
2
sudo nginx -t
sudo systemctl restart nginx

3. SSL 인증서 발급 받기

이전에 설치한 certbot을 이용해 ssl 인증서를 받자. SSL 인증서를 이용할 도메인 주소 하나가 꼭 필요하다.

1
sudo certbot --nginx -d domain-example.com

위의 커맨드를 실행하면 이것 저것 물어보는 것이 있는데 Accept / Yes를 하면 문제없이 진행할 수 있다.

인증서 경로는 아래와 같다.

fullchain -> /etc/letsencrypt/live/도메인 주소/fullchain.pem
privkey -> /etc/letsencrypt/live/도메인 주소/privkey.pem

4. certbot 관련 기초 명령어

letsencrypt의 SSL 인증서의 유효기간은 90일이다. 따라서 90일 이후에는 갱신을 해주어야 하는데 certbot에는 갱신을 자동으로 해주는 기능도 있다.

자동 갱신이 제대로 되는지 테스트 하기 위해 아래의 명령어를 입력하자.

1
sudo certbot renew --dry-run

실제 인증서를 갱신하는 명령어는 다음과 같다. crontab을 통해 갱신을 하게 되는데 크론탭의 경로는 /etc/cron.d/certbot이다.

1
sudo certbot renew

또한 인증서의 만료일을 확인하고 싶다면 아래와 같이 확인하자.

1
certbot certificates

5. nginx에 인증서 적용

지금까지 SSL 인증서를 발급하는 과정에 에러없이 진행해왔다면 nginx에 적용할 차례이다. nginx의 세팅을 수정하자. nginx를 재시작하면 HTTPS로 접근이 가능해 질 것이다.

1
2
3
4
5
6
7
8
9
10
11
server {
server_name domain-example.com;

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

ssl_certificate /etc/letsencrypt/live/domain-example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain-example.com/privkey.pem; # managed by Certbot
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:MD5;
}

[참고]
https://twpower.github.io/44-set-free-https-by-using-letsencrypt
https://devlog.jwgo.kr/2019/04/16/how-to-lets-encrypt-ssl-renew/

Share