Hash table ? Hashing?

해싱이란? (Hashing)

해싱이란 임의의 길이의 값을 해시함수(Hash Function)를 사용하여 고정된 크기의 값으로 변환하는 작업을 말한다.

 

해시 테이블이란? (Hash table)

해시 테이블이란 해시함수를 사용하여 변환한 값을 색인(index)으로 삼아 키(key)와 데이터(value)를 저장하는 자료구조를 말한다. 기본연산으로는 탐색(Search), 삽입(Insert), 삭제(Delete)가 있다.

 

 

간단한 테이블을 만들어서 보자면 key의 값을 주소로 사용하여 만드는 테이블을 말한다. 만일 key가 30이라면 배열의 인덱 30에 데이터를 저장시켜 놓는 방법이다 .

key를 주소로 값을 저장

이렇게 테이블을 해시테이블을 만들어서 사용한다면 탐색,삽입,삭제 등 O(1) 시간 복잡도로 연산할 수 있다.

 

하지만 여기에서 해시테이블을 사용하기 위해선 몇가지 주의점이 있다.

 

1. 키 값의 최대가 얼마인지 알고 있어야한다.

2. 최대 키 값이 적을 때 좋은 성능을 보여준다 (최대 키 값이 커진다면 메모리 비용 상승)

3. 키 값이 골고루 분포되지 않는다면 메모리 낭비가 심해진다.

4. Key는 고유해야 하며, 만일 중복된 key 가 있으면 먼저 있던 key와 value를 대체한다.

5. 저장 순서를 보장하지 않으므로 순서에 의존적인 작업에는 적합하지 않을 수 있습니다.

 

 

해시테이블을 만드는 과정 

Hash Table에서 해시 함수는 입력된 Key를 table의 크기에 적합한 인덱스 값으로 변환하는 것이 목적이다.

만일 해시함수를 통해 해시한 값이 테이블의 크기를 벗어나게 된다면 사용 할 수 없음 (그래서 키 값의 최대가 얼마인지 알아야함 -> 변환 했을 때 범위 내에 존재하는지 알기 위해)

 

 

 아스키코드로 변환한 값을 특정 값으로 나눠 인덱스를 결정하는 모듈로 해싱(Modulo Hashing) 

  • Hash Table의 장점과 단점
    • 장점
      • 빠른 데이터 접근 속도 : 평균적으로 O(1)의 시간 복잡도로 조회 / 삽입 / 삭제를 수행
      • 키-값 쌍 저장 : 키를 기반으로 데이터를 저장하고 검색하는 구조로, 데이터의 연관 관계를 보다 명확하고 쉽게 관리할 수 있음
      • 중복 방지 : 키의 유일성을 통해 데이터의 중복을 자연스럽게 방지
    • 단점
      • 두 개 이상의 키가 동일한 해시 값을 가질 경우 충돌이 발생합니다. 충돌을 관리하는 많은 방법들이 있지만, 충돌이 빈번하게 발생할 경우 성능 저하를 가져올 수 있습니다.

 

Hash Collision이란?

해시 테이블 내에 어떤 키가 이미 자리 잡고 있는 상태에서 다른 키가 삽입을 시도하는 경우에, 해시 함수가 서로 다른 입력에 대해 동일한 값을 반환하는 경우 Hash Collision 발생 

 -  해시 함수를 임의의 크기 값을 고정 해시값으로 변경하면서 중복될 수 있음

 -  해시 함수를 나온 값이 table 크기의 범위를 넘어서는 경우가 발생 할 수 있음

 

 

해결 방법 1) Separate Chaning

- 같은 주소로 해싱되어 충돌이 일어나는 Entry를 연결 리스트(Linked List)로 연결해서 저장하는 방식으로 해시 충돌을 피할 수 있습니다. 

  • Chaning 방법에서 임의의 키에 해당하는 엔트리를 저장할 때는 해시값이 가리키는 bucket의 연결 리스트에 삽입 
  • 이때 내가 사용하고 있는 연결 리스트의 구현체에 따라서 맨 앞 혹은 끝에 삽입

 

 

해결 방법 2) Open Addressing

- Separate Chaning 방식과 달리 추가 공간을 사용하지 않고 충돌을 해결하는 방법입니다.

해시 출돌이 일어나도 정해진 hash table 공간에 다른 위치에 저장방법이다. 다른 위치에 저장함으로서 key로 해시 테이블을 때  buket에 들어있는 인덱스와 주소가 일치하지 않을 수 있다. 

 

선형 탐색 (Linear Probing) - 가장 간단한 방법으로 메모리주소 다음 위치에 bucket을 저장하는 방법

 

 

Separate Chaning 해시테이블 (python)

(list로 해시인덱스 데이터 저장)
class Chaining_Hash_table:
    def __init__(self,length= 97): # 97 테이블 크기만큼 나눈다
        self.max_len = length     #테이블 key를 97로 나누어 해싱
        self.table = [[] for __ in range(length)]

    def hash(self,key): #해시테이블에 key와 value넣기.
        hash_key = sum([ord(i) for i in key])
        return hash_key % self.max_len # #ord함수로 문자열 변경후 나온 값  % max_len

    def add(self,key,value):
        index = self.hash(key)
        self.table[index].append((key,value))

    def put(self,key,value):
        index = self.hash(key)
        if not value:         #리스트 안의 값이 존재하지않는다면 None반환
            return None
        for i in range(len(value)): # 리스트에서 동일한 값 찾기
            if value[i] == key:
                value.pop(i)  # pop으로 해시테이블 인덱스에 안에있는 튜플 제거
                break
        self.table[index].append((key,value)) # 수정할 데이터 추가,

    def get(self,key):
        index = self.hash(key)
        value = self.table[index]
        if not value:         #리스트 안의 값이 존재하지않는다면 None반환
            return None
        for v in value:       # 리스트에서 값을 찾아 반환 
            if v[0] == key:
                return v[1]

 

 

Linear Probing 해시테이블 (python)

# ”Hash Table의 크기는 2의 멱수 (2^0, 2^1, 2^2...2^11에 가깝지 않은 소수(prime number)”를 선택하는 것이 좋습니다.
class Linear_Probing_Hash_table:
    def __init__(self,length= 97): # 97 테이블 크기만큼 나눈다
        self.max_len = length     #테이블 key를 97로 나누어 해싱
        self.table = [[0] for __ in range(length)]

    def hash(self,key): #해시테이블에 key와 value넣기.
        hash_key = sum([ord(i) for i in key])
        return hash_key % self.max_len # #ord함수로 문자열 변경후 나온 값  % max_len

    def add(self,key,value):
        index = self.hash(key)
        if self.table[index]!=0:
            for i in range(index,self.max_len):
                if self.table[i]==0:
                    self.table[i] = [key,value]
        else:
            self.table[index]=[key,value]

    def put(self,key,value):
        index = self.hash(key)
        if self.table[index]==0:
            return None # 데이터 존재하지 않음
        else:
            for i in range(index,self.max_len):
                if self.table[i][0]==index: #변환된 인덱스부터 밑으로 내려가며 탐색 
                    self.table[i] = [key,value] # 키가 동일하다면 값 변경 후 저장
                    return

    def get(self,key):
        index = self.hash(key)
        if self.table[index]==0:
            return None # 첫인덱스 조회시 데이터가 0이라면 데이터 존재하지 않음
        else:
            for i in range(index,self.max_len):
                if self.table[i][0]==index: #변환된 인덱스부터 밑으로 내려가며 탐색 
                    return self.table[i][1] # 키가 동일한 인덱스를 찾았다면 값 반환,
            return None # 동일한 인덱스 범위에 다른 값이 있지만 동일한 값을 찾지 못했다면 None 반환

 

 

'CS > 자료구조' 카테고리의 다른 글

Set의 시간복잡도  (0) 2023.09.01
python으로 LinkedList 만들기  (0) 2023.08.30

 

List 에서 특정원소를 찾기 위해서는 O(N)이 걸리지만 Set을 사용하게 된다면 set에서 원소검색은 O(1)의 시간복잡도를 가진다.

 

O(1)의 비결은?

 

해시테이블은 연관 배열(Associative array) 구조를 이용하여 키(Key)에 결과 값(value)을 저장하는 자료구조이다. 키와 값은 1:1로 연관되어 있고 키를 사용하여 값을 불러올 수 있다. 해당 키로부터 값을 도출하기 위해 해시함수가 사용된다. 

 

이는 Set에 활용되서 동일하게 해시함수를 거쳐서 동일하게 저장된다 대신 ! 

 

 Set에 원소를 저장할때는 기존의 리스트나 어레이처럼 앞, 뒤에 원소를 넣어주는 것이 아니라 해시함수를 거친 해시로 변경하여 저장소에 넣어준다는 것이다. 우리가 사용하는 set은 해시값으로 넣어주는게 아니라, 가변형으로 add나 remove로 값을 넣고 빼서 True와 False로 반환된다.

 

 Set에 존재하는지를 물어본다면 Set은 저장소의 앞 또는 뒤부터 검사를 시작하지 않는다. 특정원소를 해시함수를 통과 시킨 뒤 해당 해시가 저장소안에 있는지 없는지 검사만 하면 된다. 그렇기에 한번의 연산, O(1)만 일어나면 된다.

'CS > 자료구조' 카테고리의 다른 글

Hash table을 python으로 구현해보자.  (0) 2023.09.05
python으로 LinkedList 만들기  (0) 2023.08.30

원티드 프리온보드 인턴쉽과정을 학습하면서 링크드 리스트를 배우고 나서 파이썬으로 구현해봤다.

 

처음에는 직접 리스트를 만든다는게 감이 잘 안왔지만 수업을 보면서 리스트가 어떻게 이뤄지고 어떤 형식으로 움직이는지 알게되고나니 생각보다 만들기 어렵지 않았다.

 

 

 

기본적인 리스트는 head 하나를 가지며 리스트의 헤드를 통해서 각 노드를 순회 할 수 있다.

 

Node에 데이터를 넣을 data와 next를 통해서 데이터와 다음노드방향을 알려준다.

 

<코드 본문 >

class Node:
    def __init__(self,data): 
        self.data = data # 노드값 
        self.next = None # 최초 생성시 다음 노드 지정안함

class LinkedList:
    def __init__(self,data): # 최초 링크드리스트 사용시 헤더 생성
        self.head = Node(data)

    def append(self,data):
        cur = self.head  # 현재 리스트의 헤드(시작점) 찾기
        while cur.next is not None: # 마지막 다음 목적지가 NOne값이 나올떄까지 반복
            cur= cur.next
        cur.next = Node(data) # 마지막 노드와 현재 추가하려는 노드 연결 

    def find_index(self,data):  #값으로 인덱스 찾기
        now =self.head # 헤드부터 시작해서 data값과 동일한 값 찾기 
        cnt=0
        while now == data:  # 동일한값을 찾는ㄴ다면 정지 
            if now.data ==data:
                break
            cnt+=1
            now = now.next
        print(cnt)
    def get_node(self,data): #인덱스 노드 위치 찾기
        now = self.head #리스트의 헤드 찾기
        cnt =0
        while now>data:
            now =now.next
            cnt+=1
        return cnt
    def insert_node(self,index,data): #노드 삽입
        new_node = Node(data)
        if index==0:  # 헤드변경 
            new_node.next = self.head
            self.head = new_node
            return
        find_node= self.get_node(index-1) # 찾을 인덱스의 전 인덱스 찾기 
        new_node.next =  find_node.next # 생성된 노드의 next를 전 인덱스의 next로 변경
        find_node.next = new_node # 찾은 인덱스 -1 의 next를 생성된 노드로 지정 
        
    def delete_node(self,index):
        if index ==0:
            self.head = self.head.next
            return
        find_node =self.get_node(index-1) # 인덱스-1 를 찾은 후 현재 인덱스의 앞의 연결된 부분을 연결
        find_node.next = find_node.next.next # 인덱스 next변경해줌

 

이번주에 나온 과제중 stack을 만드는 문제가 있었는데  먼저 링크드 리스트를 만들고나니 한결 쉽게 풀 수 있었다.

'CS > 자료구조' 카테고리의 다른 글

Hash table을 python으로 구현해보자.  (0) 2023.09.05
Set의 시간복잡도  (0) 2023.09.01

네이티브 앱

모바일 OS 기반의 언어로 만들어진 앱

모바일 플랫폼 API를 이용해 개발한다. 모바일 기기에 직접 다운로드하여 로컬에 저장되는 실행파일로 사용한다.

EX) IOS - SWIFT , Android - kotlin 등등

일반적으로 우리가 스마트폰에서 스토어에서 다운로드 받아 사용하는 어플리케이션

장점 - 속도가 빠르고 안정성이 높다, 고성능의 그래픽 사용 가능

단점 - 플랫폼 별로 다른 언어로를 사용함으로 호환이 어려움

웹 앱

HTML기반으로 만들어진 모바일 웹의 장점과 네이티브의 장점을 결합. 웹 기술로 구현하는 앱을 통칭한다. 기본적으로 HTML, CSS, JS를 사용해 만들어진 애플리케이션이다. 따라서 브라우저 주소창이 존재한다. 하지만 네이티브앱처럼 동작하도록 주소창을 가릴수 있고, 모바일 기기에 아이콘을 위치시킬수 있어서 겉보기에 네이티브 앱처럼 보이게 할 수 있다

장점

  • 기본적으로 웹 기술이기 때문에 다양한 언어를 포용할 수 있다. (HTML, CSS, JS, PHP, ASP)
  • 업데이트 반영이 빠르다
  • 브라우저로 접속 가능

단점

  • 모바일기기의 기능을 활용 할 수 없다
  • 스마트폰에서 제공하는 API이용 어려움

하이브리드앱

네이티브 + 웹앱의 기술을 함께 사용하는 앱. 콘텐츠 영역은 HTML 기반의 웹 앱으로 개발을 하되 패키징 처리만 각 아이폰, 안드로이드 플랫폼 안에서 함으로써 앱 배포를 가능하게 한다.

(우리가 쓰고 있는 네이버앱도 네이티브앱처럼 보이지만 하이브리드 앱이다.)

대표적으로 React Native, Flutter, PhoneGap, Cordova, Ionic 등이 존재한다.

장점

  • 웹 기술만으로 개발해서 앱스토어에 배포 할 수 있다.
  • 모바일 API를 사용할 수 있어서 하드웨어를 제어할 수 있다.

단점

  • 브라우저 성능에 따라 앱의 성능이 좌우된다.
  • 네이티브 앱 만큼 기능을 제공하진 않는다.
  • 결국 앱스토에서 배포를 해야되기 때문에 업데이트 반영이 느리다.
  • 3D 기능 지원이 취약하다.

프로그레시브 웹 앱(PWA: Progressive Web App)

PWA는 하이브리드 앱과 비슷하지만 약간 다르다. 기본적으로 사용자들에게 네이티브 앱의 느낌을 주면서도 웹 브라우저에서 바탕화면에 바로가기를 추가하여 특별한 다운로드와 인스톨 과정 없이 기본 앱처럼 사용할 수 있다는 것이 특징이다. 오프라인에서도 사용할 수도 있고 알림 메시지도 받을 수 있고 iOS보다 안드로이드가 훨씬 용이하긴 하지만 디바이스들의 하드웨어적인 기능(카메라나 GPS 같은)을 사용할 수도 있다.

PWA는 각 플랫폼에 최적화된 사용자 경험을 기반으로 하며, PWA만을 위한 언어나 프레임워크 또는 PWA만을 위한 전문 개발자도 필요가 없다. 리액트(React)나 앵귤러(Angular)만 있으면 만들 수 있다.

 

'CS' 카테고리의 다른 글

DB인덱스란?  (1) 2023.02.03
TDD란?  (0) 2023.02.03
깃(Git)과 깃허브(GitHub)  (0) 2023.01.15
객체지향 설계 5원칙(SOLID)  (0) 2023.01.10
디자인패턴이란?  (0) 2023.01.10

인덱스는 DBMS의 저장 성능을 희생하고 인덱스 통해 테이블에 존재하는 데이터 검색 성능을 높이기 위해 만들어진 자료 구조이다.

사전의 목차처럼 인덱스를 이용하여 원하는 데이터에 빠르게 접근할 수 있다

인덱스가 적용된 컬럼의 테이블(컬럼, 인덱스주소)을 따로 파일로 저장해놓고  그것을 검색해서 검색 효율을 높이는 방법

인덱스는 select문의 where, join에서 좋은 성능을 발휘한다. 대신 insert, update, delete문에서 성능이 떨어진다.

ex)

  • 책의 맨 앞에 존재하는 색인 = = DBMS의 인덱스
  • 책의 내용 = DBMS의 데이터 파일
  • 책의 색인을 통해 알 수 있는 페이지 번호 = DBMS의 데이터 파일에 저장된 레코드의 주소
  • 책의 색인은 사전 순으로 정렬 = DBMS의 인덱스도 일정 기준으로 정렬 가능

DBMS는 인덱스를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.

이를 위해서 인덱스 데이터를 새로 만들게 되고 실제 데이터가 10만인데 테이블에는 100만 개의 데이터가 있을 수 있다는 것이다

장점

  • 테이블을 조회하는 속도와 그에 따른 성능을 향상 할 수 있다.
  • 전반적인 시스템의 부하를 줄일 수 있다.

단점

저장공간의 증가, 인덱스를 사용하게되면 추가작업이 필요해짐 , 케이스에 따라 성능저하

  • 색성능은 향상될 수 있으나 추가 저장공간도 필요하고 변경 작업이 많아지면 인덱스 재구성에 필요한 비용이 커진다. - >인덱스를 생성하게 되면 INSERT, DELETE, UPDATE 쿼리문을 실행할 때 별도의 과정이 추가적으로 발생하기 때문이다
  • INSERT: 새로운 데이터에 대한 인덱스를 추가함
  • DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
  • UPDATE: 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함

인덱스를 효율적으로 사용하기 위한 상황

  1. 규모가 작지 않은 테이블
  2. INSERT, UPDATE, DELETE가 자주 발생하지 않는 칼럼
  3. JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 칼럼
  4. 데이터의 중복도가 낮은 칼럼

'CS' 카테고리의 다른 글

네이티브앱 & 웹앱 & 하이브리드웹  (0) 2023.02.03
TDD란?  (0) 2023.02.03
깃(Git)과 깃허브(GitHub)  (0) 2023.01.15
객체지향 설계 5원칙(SOLID)  (0) 2023.01.10
디자인패턴이란?  (0) 2023.01.10

TDD란?

테스트가 주도하는 개발을 의미하는데, 반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.

TDD는 짧은 개발 주기(보통 몇 분에서 몇 시간)의 반복에 의존하는 개발 프로세스로서, Extreme Programming(XP)의 “Test-First” 개념에 기반을 둔 단순한 설계를 중요시합니다. TDD를 가장 쉽게 표현한 것이 “Red-Green-Refactor” 개발 주기인데, 이는 [그림1]과 같습니다.

1. RED - 실패하는 테스트를 추가한다.

2. GREEN 성공하는 테스트를 추가한다.

3. YELLOW 테스트 성공을 유지하면서 구현된 설계를 개선한다. ( 중복코드 제거 및 일반화)

사용하기 좋은 상황

 

  1. “피드백”과 “협력”이 필요한 상황 (협업) → 다른 사람이 보기 쉽고 직접 테스트를 사용 할 수 있음
  2. 처음 진행하는 프로그램 주제 → 테스트를 통해서 불확실성을 줄임
  3. 고객의 요구 조건이 바뀔 수 있는 프로젝트 → 변화에 쉽게 적응 할 수 있음
  4. 개발하는 중에 코드를 많이 바꿔야 된다고 생각하는 경우 → 3번과 비슷한 이유
  5. 여러 명이 코드를 공유하여 유지 보수해야 하는 경우 → 리팩토링을 통해 test를 쉽게 진행하여 수정자가 어떤 코드인지 알아보기 쉽다.

장점

  • 디버깅 시간을 줄여준다.
  • 동작하는 문서 역할을 한다.
  • 변화에 대한 두려움을 줄여준다.
  • 구체적인 구현 내용이나 세부적인 사항보다는 그것이 무엇을 하는지 확인하는 용도
  • TDD를 하다보면 객체의 역할을 확인할 수 있게 됨.
  • 안정감 있는 코드 작성 가능

단점

  • 노력과 시간이 많이 든다. 하지만 시간이 지나면서 기존과 크게 달라지지 않음

TDD란?

테스트가 주도하는 개발을 의미하는데, 반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.

TDD는 짧은 개발 주기(보통 몇 분에서 몇 시간)의 반복에 의존하는 개발 프로세스로서, Extreme Programming(XP)의 “Test-First” 개념에 기반을 둔 단순한 설계를 중요시합니다. TDD를 가장 쉽게 표현한 것이 “Red-Green-Refactor” 개발 주기인데, 이는 [그림1]과 같습니다.

1. RED - 실패하는 테스트를 추가한다.

2. GREEN 성공하는 테스트를 추가한다.

3. YELLOW 테스트 성공을 유지하면서 구현된 설계를 개선한다. ( 중복코드 제거 및 일반화)

사용하기 좋은 상황

  1. “피드백”과 “협력”이 필요한 상황 (협업) → 다른 사람이 보기 쉽고 직접 테스트를 사용 할 수 있음
  2. 처음 진행하는 프로그램 주제 → 테스트를 통해서 불확실성을 줄임
  3. 고객의 요구 조건이 바뀔 수 있는 프로젝트 → 변화에 쉽게 적응 할 수 있음
  4. 개발하는 중에 코드를 많이 바꿔야 된다고 생각하는 경우 → 3번과 비슷한 이유
  5. 여러 명이 코드를 공유하여 유지 보수해야 하는 경우 → 리팩토링을 통해 test를 쉽게 진행하여 수정자가 어떤 코드인지 알아보기 쉽다.

장점

  • 디버깅 시간을 줄여준다.
  • 동작하는 문서 역할을 한다.
  • 변화에 대한 두려움을 줄여준다.
  • 구체적인 구현 내용이나 세부적인 사항보다는 그것이 무엇을 하는지 확인하는 용도
  • TDD를 하다보면 객체의 역할을 확인할 수 있게 됨.
  • 안정감 있는 코드 작성 가능

단점

  • 노력과 시간이 많이 든다. 하지만 시간이 지나면서 기존과 크게 달라지지 않음

'CS' 카테고리의 다른 글

네이티브앱 & 웹앱 & 하이브리드웹  (0) 2023.02.03
DB인덱스란?  (1) 2023.02.03
깃(Git)과 깃허브(GitHub)  (0) 2023.01.15
객체지향 설계 5원칙(SOLID)  (0) 2023.01.10
디자인패턴이란?  (0) 2023.01.10

GET

GET은 클라이언트가 서버에서 정보를 요청하기 위해 보내는 메서드

정보를 조회 할 때 대부분 사용한다.

GET은 URL 주소 끝에 파라미터로 포함되어 전송시키며 URL 뒤의 ? 뒤에 파라미터를 추가(쿼리스트링)하여 어디의 정보를 가져 올 것인지 주소를 정해준다.

www.example.com/show?name1=value1&name2=value2

name1=value1&name2=value2← 쿼리스트링

GET의 특징

  • GET 요청은 캐시를 통해서 저장되어 브라우저에서 리소스를 반환 할 수 있다.
  • GET 요청은 길이 제한이 있다.
  • GET 요청은 정보가 노출 되는 구조로 구성되어있기에 보안이 필요한 정보에 사용하지 않아야한다.
  • GET은 데이터를 요청할때만 사용 된다.

POST

클라이언트가 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용 되는 메서드

게시글 작성 및 수정에 사용된다.

POST는 전송할 데이터를 HTTP 메시지 body 부분에 담아서 서버로 보낸다.

POST 로 데이터를 전송할 때 길이 제한이 따로 없어 용량이 큰 데이터를 보낼 때 사용하거나 GET처럼 데이터가 외부적으로 드러나는건 아니라서 보안이 필요한 부분에 많이 사용된다.

( 하지만 데이터를 암호화하지 않으면 body의 데이터도 결국 볼 수 있는건 똑같다. )

POST를 통한 데이터 전송은 보통 HTML form 을 통해 서버로 전송된다.

 

post의 특징

  • POST 요청은 캐시되지 않는다.
  • POST 요청은 데이터 길이에 제한이 없다

GET과 POST의 특징만 보아도 차이가 나긴하지만 추가적으로 차이점을 정리해보면 다음과 같다.

  • 사용목적 : GET은 서버의 리소스에서 데이터를 요청할 때, POST는 서버의 리소스를 새로 생성하거나 업데이트할 때 사용한다.
  • DB로 따지면 GET은 SELECT 에 가깝고, POST는 Create 에 가깝다고 보면 된다.
  • 요청에 body 유무 : GET 은 URL 파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 메시지에 body가 없다. POST 는 body 에 데이터를 담아 보내기 때문에 당연히 HTTP 메시지에 body가 존재한다.
  • 멱등성 (idempotent) : GET 요청은 멱등이며, POST는 멱등이 아니다.

** 멱등성이란?

반복되는 요청을 진행해도 같은 정보가 반복되는 것 

 

'CS > 네트워크' 카테고리의 다른 글

TCP 연결과 해제  (0) 2023.01.10
우리가 구글 페이지를 어떻게 들어갈까?  (0) 2023.01.10
인증과 인가 ( 쿠키/세션/토큰/JWT)  (0) 2023.01.06
IPv4와 IPv6  (0) 2023.01.05
도메인과 DNS  (0) 2023.01.05

깃과 깃허브를 설명하기 전 버전 관리 라는 개념이란?

 

버전 관리 시스템

  • 시간에 따라 파일의 변경사항을 추적하고 기록하는 것입니다. 버전 관리 시스템은 이전 버전으로 복구하거나 조회할 수 있는 기능을 말한다.
  • 프로젝트 중 문제가 생겨 파일이 망가졌을 때 버전관리시스템을 통해 전 버전으로 다시 롤백 할 수 있다.

 

Git

  • Git은 "본인"의 코드와 이력을 기록하고 관리하도록 돕는 버전 관리 시스템  Git은 클라우드가 아닌 본인의 로컬 시스템에 설치되고 관리할 수 있다.
  • 브랜치를 통해 사용자는 본인의 코드에서 새로운 시도를 할 수 있다.
  • 인터넷 없이 독립적으로 실행될 수 있다.

 

GitHub

  • GitHub는 Git 저장소를 관리하는 클라우드 기반 호스팅 서비스(클라우드 버전 관리 시스템)
  • 개인의 로컬 서버 밖에서 Git 버전 프로젝트를 공유하고 기록하는 클라우드 기반 온라인 데이터베이스
  • GitHub를 통해, 다른 사람과 코드 공유 가능
  • 다양한 Git 브런치를 수정하고 개선하며 실시간으로 하나의 프로젝트에 전체 팀원이 협업 할 수 있다.

'CS' 카테고리의 다른 글

DB인덱스란?  (1) 2023.02.03
TDD란?  (0) 2023.02.03
객체지향 설계 5원칙(SOLID)  (0) 2023.01.10
디자인패턴이란?  (0) 2023.01.10
컴파일러란?  (0) 2023.01.06

+ Recent posts