목록전체 글 (152)
종식당

해시 자료구조는 키값 쌍으로 이루어진 데이터 구조로 키를 이용해 값을 O(1) 시간 복잡도로 찾을 수 있다. 해시 자료구조는 키를 해시 함수에 넣어서 나오는 결과를 기반으로 값을 관리한다. 해시 함수는 다른 키를 사용해도 같은 결과가 나오는 경우가 존재하는데 이를 해시 충돌(Hash Collision)이라고 한다.해시 충돌은 어떻게 완화할 수 있나요? 🤓해시 충돌을 완화하기 위한 접근 방법으로 개방 주소법과 분리 연결법이 대표적이다. 개방 주소법(Open Addressing)은 특정 값이 들어가야 하는 자리(버킷)가 이미 사용되고 있는 경우 다른 해시 버킷에 데이터를 삽입하는 반면, 분리 연결법(Separate Chaining)은 버킷을 연결 리스트나 트리 형태로 관리하여 버킷에 들어갈 값의 수에 제한..

Git Flow 전략에서 기능 개발은 feature 브랜치에서 이루어지고, 완료된 후 develop 브랜치에 병합된다. 릴리스를 준비할 때는 release 브랜치를 따로 만들어 QA와 최종 검증을 거친 뒤, 프로덕션 코드를 관리하는 main에 병합하게 된다. 만약 긴급한 수정 사항이 발생하면 hotfix 브랜치를 만들어 신속히 배포하고, 수정 사항을 develop에도 반영한다. Git Flow 전략을 사용하면 대규모 프로젝트에서 굉장히 체계적이고 안정적인 관리가 가능하지만, 브랜치가 많아짐에 따라 복잡도가 올라간다는 단점이 존재한다.GitHub Flow 전략은 Git Flow보다 단순한 구조를 가지고 있다. 모든 변경 사항은 main 브랜치 기준으로 이루어진다. 새로운 기능을 개발할 때, feature ..

무중단 배포는 서비스에 다운 타임이 발생하지 않으면서, 새로운 버전의 애플리케이션을 서버에 배포하는 것을 의미한다. 무중단 배포 패턴에는 대표적으로 순차적으로 배포하는 롤링 배포, 전체 서버를 통째로 바꾸는 블루/그린 배포, 트래픽을 순차적으로 이동시키는 카나리 배포가 존재한다.각 배포 방식을 설명해 주시겠어요? 🤓롤링 배포는 서버를 한 대씩 순차적으로 업데이트하는 가장 기본적인 방식이다. 특정 시점에는 두 가지 버전이 공존하기 때문에 새로운 버전은 기존 버전 기능을 지원하는 등 하위 호완성(Backward Compatibility)에 신경을 써야 한다. 롤링 배포는 새로운 버전을 배포하기 위해서 새로운 서버를 생성하지 않는다. 배포가 진행 중인 서버는 요청 처리가 불가하기 때문에 다른 서버에 전달되는..

A객체가 어떤 작업을 수행하기 위해 B객체를 필요로 하는 경우에 두 객체 사이에 의존성이 존재한다고 표현한다.이때, A객체가 아닌 외부의 C객체가 B를 생성한 뒤에 이를 전달해서 의존성을 해결하는 방법을 의존성 주입이라고 한다. 유연하고 재사용할 수 있는 설계를 만들기 위해서는 코드의 변경 없이 다양한 실행구조를 만들 수 있어야 한다. 의존성 주입은 이를 돕는다. 예를 들어, A객체 내부에서 B를 직접 생성하는 경우에는 B에 대한 결합도가 높아진다. 반면, B에 대한 생성 책임을 C에게 위임하고, C가 A에게 다시 전달해 주는 방식(의존성 주입)을 통해서 A는 B에 대한 결합도를 낮추고 유연한 설계를 만들 수 있다.의존성 주입에는 어떤 방식이 있고, 각각 언제 사용할 수 있나요? 😀의존성 주입은 주입 ..

데이터베이스에서 정규화는 테이블을 정리하여 중복 데이터를 최소화하고, 데이터 무결성을 보장하는 과정을 의미한다. 이를 통해 데이터 저장 용량을 줄이고, 삽입 갱신 삭제 이상 현상을 해결할 수 있다. 정규화는 여러 단계가 존재하며, 대표적으로 1 정규화, 2 정규화, 3 정규화, BCNF가 있다.각 정규화 단계를 설명해주세요. 🤔1 정규화는 테이블 칼럼의 값이 원자값을 가지도록 정리하는 것을 의미한다.2 정규화는 1 정규화를 진행한 테이블에서 완전 함수 종속을 만족할 수 있도록 테이블을 분해하는 것이다.쉽게 표현하자면, 기본 키의 일부에만 종속된 속성이 없도록 분해하는 것을 의미한다. A속성을 통해서 B속성의 값이 유일하게 정해지는 관계에서 A를 결정자라고 한다.가령, 사용자 ID가 기본 키이며 값이 1..