개발/CS
Python은 Call by value일까, Call by reference일까?
최근 Python을 이용하여 알고리즘 문제를 자주 풀고 있으며 동시에 또 회사에서도 Python을 이용하여 백엔드 개발을 진행하고 있기에 Python에서는 어떤 방식으로 함수에서의 호출이 일어나는지 알아보고 싶어서 관련 내용을 정리하고자 한다.우선 이에 대한 정리 전에 간단하게 Call by reference, Call by value가 무엇인지 알아보고자 한다.1. Call by valueCall by value는 값에 의한 호출이다. 즉, 함수에 인자를 넘겨줄 때 인자에 "값"을 복사하여 넘겨준다는 것이다.함수의 실행 환경을 저장하는 스택 프레임에 인자의 값의 복사본을 담음으로써 함수 내에서 스택 프레임 내에 존재하는 값을 사용할 수 있도록 한다.그렇기 때문에 함수 내에서 만약 해당 인자를 변경하더라..
트랜잭션이란?
회사에서 최근 업무를 진행하면서 트랜잭션을 사용하는 일이 매우 많다. 현재 MongoDB를 이용하여 개발하고 있는 프로젝트에서 트랜잭션을 사용하고 있는 이유는 아래와 같다. 대용량의 데이터를 벌크로 처리해야하는 경우가 많은데, 이 때 하나의 데이터라도 유효하지 않거나 실행 중 실패가 발생한다면 모든 처리 내용을 롤백 시켜야 함 여러 사람들이 하나의 데이터에 동시에 접근하여 수정을 가하는 경우가 발생할 확률이 기획 상 매우 높음 여러 컬렉션에 위치한 여러 도큐먼트에 대한 삽입이나 수정이 하나의 서비스 로직에서 수행되는 경우가 많음 위와 같은 이유들로 트랜잭션을 진행하였고, 이들은 곧 트랜잭션으로 얻을 수 있는 가장 큰 장점들이다. 이렇게 개발 과정에서 어느 경우에 트랜잭션을 사용하는지는 알고 있지만, 이에..
(CS) 무중단 배포
프로젝트나 서비스 개발에 백엔드 개발자로 참여하였을 때, 로컬이 아닌 실제 환경에서 개발한 기능들을 테스트하고 또 사용하기 위해서 반드시 진행해야 하는 작업이 있다. 그것은 바로 배포이다. 1년이 넘는 시간 동안 백엔드 개발을 많이 진행하였기에 여러 번 배포를 진행하였지만, 무중단 배포에 대해서는 들어만 보았을 뿐 정확하게 어떤 방식으로 진행되는지에 대한 학습조차 되어 있지 않았다. 현재 진행 중인 프로젝트에서 무중단 배포를 진행해 볼 기회를 얻어서 이에 대해 학습 후 정리해보고자 한다. 배포란? 무중단 배포에 대해 정리하기에 앞서 배포가 무엇인지 먼저 간단하게 알아보고자 한다. 배포라는 단어 자체는 원래 신문이나 책자 등을 널리 나누어주는 행동을 나타내는 말이다. 소프트웨어 관점에서 말하는 배포도 역시..
(CS) 계수 정렬 & 기수 정렬
계수 정렬(Counting Sort)과 기수 정렬(Radix Sort)은 비교 정렬이 아닌 정렬 알고리즘으로, 특정한 상황에서 매우 효과적인 알고리즘이다. 각 정렬 알고리즘에 대해 자세하게 알아보자. 계수 정렬 계수 정렬은 범위에 해당하는 각 숫자의 빈도수를 계산하고, 빈도수의 누적값을 사용하여 데이터의 위치를 결정하여 정렬하는 알고리즘이다. 정렬할 데이터의 범위를 알고 있을 때 매우 효과적인 정렬 알고리즘이다. 비교 정렬이 아니기에 특정 상황에서 매우 빠르지만, 정렬할 데이터의 범위만큼의 추가적인 메모리가 필요하다. 정렬 과정 데이터들의 최솟값과 최댓값을 확인하여 전체 범위를 파악한다. 범위에 해당하는 각 숫자의 빈도수를 세어 배열에 저장한다. 각 숫자의 빈도수를 누적하여 해당 숫자의 정렬된 위치를 계..
(CS) 트리 & 트라이
트리 트리는 계층적 구조를 가지며, 각 노드들이 서로 연결되어 있는 자료구조이다. 트리는 하나의 루트(root) 노드에서 시작하여 다양한 자식 노드들로 확장된다. 각 노드는 부모와 자식 노드 간의 관계를 가진다. 트리는 순환 구조를 갖지 않으며, 각 노드는 정확히 하나의 부모를 가진다. 트리를 이루는 구조를 하나씩 알아보자. Node(정점, Vertex) 트리의 기본 단위로, 정보를 저장하는 단일한 항목 노드는 데이터 필드(Key)와 하나 이상의 포인터를 가짐 Key 노드를 구분하거나 정렬하는데 사용하는 값 노드의 데이터 필드에 저장되는 값 Edge(간선) 노드 간의 연결 관계를 나타내는 선으로, 트리의 구조를 형성 두 노드 간의 간선은 부모-자식 관계를 나타냄 Root 트리의 최상위 노드로, 모든 다른..
(CS) 객체와 객체지향이란?
컴퓨터 전공생, 아니 코딩에 대한 조금의 학습만 진행해본 사람이라면 객체지향 또는 객체라는 말에 대해 들어본 적이 있을 것이다. 필자도 4년 간의 전공 수업 또 외부 교육 프로그램을 수강하였지만 이에 대한 명확한 정의를 딱 내리라고 하면 솔직히 말해서 어려울 것 같다는 생각이 들었다. 그래서 객체와 객체지향이라는 개념에 대한 학습과 명확한 정의를 내려보고자한다. 객체란? 우선 객체란 무엇인지 먼저 알아보고 시작하는 것이 추후의 내용에 대한 이해를 위해 좋을 것 같다. 우선 객체의 사전적 의미는 실제 존재하는 것, 실체를 의미한다. 즉, 우리가 인식하고 확인할 수 있는 것이라고 말할 수 있겠다. 하지만 컴퓨터 공학에서 말하는 객체는 객체의 사전적 의미와 조금은 다르다. An object is a class..
(CS) git
git git의 전체적인 개념에 대해 설명해보겠다. git이란? git은 소프트웨어 개발 및 유지보수 과정에서 발생하는 소스코드나 문서 등의 생성, 수정, 삭제 등의 이력을 관리하는 VSC(Version Control System)의 하나이다. git은 버전 관리 시스템 중에서도 분산형 VSC이다. 분산형 VSC는 중앙에서 관리하고 있는 모든 버전들을 가지는 저장소(Remote Repository) 전체를 복사하여 사용자의 컴퓨터로 가져와 사용한다. 분산형 외에도 개인 컴퓨에 관리할 버전을 저장하고 관리하는 로컬형, 여러 사용자의 버전 관리 내용을 중앙 서버에서 관리하는 중앙형 VSC도 존재한다. 그렇다면 이런 다양한 VSC의 종류 중 왜 특히 git이 대중적으로 쓰이는 것일까? git의 장점이 협업에 ..
(CS) HTTP Request/Response/Method, CORS, 서브넷
HTTP Request/Response 메시지 구조 HTTP 메시지는 웹에서 데이터를 전송하기 위해 사용되는 프로토콜인 HTTP(HyperText Transfer Protocol)에서 사용되는 메시지 구조이다. HTTP 메시지는 데이터 통신을 위해 사용되며 Request와 Response 두 가지 형태로 나뉩니다. 1. HTTP Request(요청) Start Line: 요청 메서드, URL 경로, 프로토콜 버전 등의 정보를 포함한다. 예: GET /index.html HTTP/1.1 Header Fields: 추가적인 메타데이터를 포함하는 헤더 필드들이 위치한다. General 헤더: Via(메시지 전달을 추적하고 요청 루프를 방지하며 요청/응답 체인에서 발신자의 프로토콜 기능을 식별하는 데 사용)와 ..
(CS) HTTP, HTTPS, TCP
HTTP 버전별 구분 1. HTTP 0.9 1991년에 처음 도입된 버전으로, 일반 문서만 검색하는 간단한 프로토콜이었다. 초기에는 버전 정보가 없었으나, 이후에 차후 버전과 구별하기 위해 HTTP 0.9라는 이름을 붙이게 되었다. 요청과 응답은 매우 간소했으며, 리소스에 대한 메서드로는 GET이 유일하다. HTTP 헤더가 없었는데 이는 HTML 파일만 전송될 수 있으며 다른 유형의 문서는 전송될 수 없음을 의미한다. 상태 혹은 오류 코드도 없어서 문제가 발생한 경우, 특정 HTML 파일이 사람이 처리할 수 있도록, 해당 파일 내부에 문제에 대한 설명과 함께 되돌려 보내졌다. 요청과 응답 예시 요청 GET /mypage.html 응답 A very simple HTML page 2. HTTP 1.0 199..
(CS) OSI, TCP/IP Layer, TCP vs UDP
OSI 7 Layer OSI(Open Systems Interconnection) 모델은 네트워크 아키텍처를 설명하기 위한 일반적인 프레임워크로, 데이터 통신 시스템의 다른 요소 간의 상호 작용을 설명하기 위해 일곱 개의 계층으로 구성된다. 또한 7단계로 나눔으로써 특정한 계층에 이상이 생기면 다른 계층의 장비 및 소프트웨어를 건드리지 않고도 이상이 생긴 단계만 고칠 수 있다는 장점도 가지고 있다. 1. 물리 계층(Physical Layer) 이 계층에서는 주로 전기적, 기계적, 기능적인 특성을 이용해서 통신 케이블로 데이터를 전송하게 된다. 이 계층에서 사용되는 통신 단위는 비트이며 이것은 1과 0으로 나타내어지는, 즉 전기적으로 신호가 흐르는지 아닌지로 생각할 수 있다. 이 계층에서는 단지 데이터만을..