소프트웨어 개발과 인지 편향 현상(Cognitive Bias)
2023. 10. 7. 17:48
Others
평소처럼 유튜브를 시청하던 중 인간의 인지 편향에 대한 흥미로운 영상을 발견했습니다. 인간이 저지르기 쉬운 인지 편향에 관련된 내용인데, 이러한 편향은 소프트웨어 업계에도 만연해있기 때문에 예시와 함께 고민해 보면 좋은 주제라 생각하여 포스팅을 작성하게 됐습니다. 인지 편향 현상을 소개한 영상 기준점 편향(Anchoring Bias) 기준점 편향은 처음 제공된 정보를 의사 결정의 기준점(anchor)으로 삼아 지나치게 의존할 때 발생하는 현상입니다. 예를 들어 우리가 어떤 지역의 월세방을 구한다 했을 때 처음 확인한 월세방이 "보증금/월세"가 3000/60이라고 가정해 보겠습니다. 그다음으로 확인한 웰셋방의 "보증금/월세"가 2000/50이라고 가정했을 때 여러분은 어떻게 느끼시나요? 대부분의 사람들은 ..
[Kubernetes] Rolling Update 이슈와 해결 과정
2023. 9. 21. 18:18
Infrastructure/Kubernetes
최근 쿠버네티스에서 운영되는 프로덕션 애플리케이션을 배포(rolling update)하는 과정에서 클라이언트 요청이 중단되거나 거부되는 현상이 발생했습니다("client connection refused" 등의 에러 발생). 분명 deployment.yaml에 rollingUpdate를 수행하도록 설정했지만, 배포 과정에서 순단현상이 발생했습니다. spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 replicas: 4 위 설정에서의 배포는 다음과 같이 동작합니다. 총 4개의 pod가 실행됩니다. 배포 시 새로운 버전의 반영은 순차적으로 수행됩니다. 새로운 pod 생성 새로운 pod가 준비상태(Ready)가 되면..
[필D상] Chapter 1. 실제 DBMS 사례를 통해 기본 개념 익히기 - MySQL Redo Log & Checkpoint
2023. 9. 9. 16:01
Database/필수 DBMS 상식
INSERT, UPDATE, DELETE 등의 DML이 수행될 때 디스크상의 데이터 파일에 변경사항을 즉시 반영하는 것은 성능에 부정적인 영향을 미칠 수 있습니다. 이는 변경해야 하는 데이터 파일이 디스크에 랜덤 하게 위치하기 때문입니다. MySQL은 리두 로그와 체크포인트를 활용해 변경사항을 일괄적으로 처리해 성능을 최적화합니다. Redo Log 트랜잭션은 ACID 속성을 지니고 있습니다. ACID를 풀이하면 다음과 같습니다. A(Atomicity): 원자성을 의미합니다. 트랜잭션으로 묶인 작업은 모두 성공하거나 모두 실패해야 한다는 속성입니다. C(Consistency): 트랜잭션에 의해 조작된 데이터는 일관성을 유지할 수 있음을 의미합니다. 주의할 점은 데이터의 일관성을 유지하기 위해서는 트랜잭션뿐..
[필D상] Chapter 1. 실제 DBMS 사례를 통해 기본 개념 익히기 - MySQL 아키텍처
2023. 9. 8. 06:15
Database/필수 DBMS 상식
Chapter 1에서는 MySQL의 아키텍처에 대해 살펴보겠습니다. MySQL의 기본 아키텍처는 다음과 같습니다. MySQL Connectors & Shell MySQL connector는 애플리케이션이 MySQL과 연결되어 작동할 수 있도록 도와주는 소프트웨어입니다. API를 통해 MySQL의 기능(쿼리 실행, 데이터 조회, 데이터 수정 등)을 활용할 수 있습니다. MySQL connector는 프로그래밍 언어에 따라 구현이 다르며, 대표적인 예시로 Java의 경우 JDBC(Java Database Connectivity)를 사용합니다. MySQL shell은 CLI(Command Line Interface) 또는 스크립트를 사용하여 MySQL을 다룰 수 있는 또 다른 방법입니다. MySQL Engin..
[필D상] 소개 및 목차
2023. 9. 6. 17:05
Database/필수 DBMS 상식
"필수 DBMS 상식(필D상)" 포스트 시리즈는 DBMS를 사용하는 개발자라면 반드시 알아야 하는 DBMS 상식에 대해 다룹니다. 이 시리즈는 단순한 정보 전달을 넘어, DBMS가 내부적으로 어떻게 동작하는지와 개발자의 시각에서 DBMS의 동작 방식을 바라보는 방법 등을 다룹니다. DBMS는 Database Management System의 약자로, 일반적으로 데이터베이스라고 불리지만 사실상 데이터베이스와는 엄연히 다른 개념입니다. 데이터베이스는 구조화된 정보 또는 데이터의 조직화된 모음으로서 디스크에 저장되는 반면, DBMS는 이러한 데이터베이스의 데이터를 효율적으로 관리하기 위해 사용되는 소프트웨어입니다. 시리즈 목차는 다음과 같습니다. Part 1. 단일 프로세스 DBMS Part 1에서는 단일 프..
[Java] LocalDate.now()를 사용하면 안되는 이유
2023. 9. 1. 09:29
Java/Deep Java
최근에 개발한 배치 프로그램이 로컬에서 실행했을 때와 배포 환경에서 실행했을 때 조회하고 생성하는 데이터 간에 차이가 발생하는걸 확인했습니다. 동일한 설정으로 배포했는데 대체 어떻게 문제가 발생하는 건지... 원인을 찾아내기까지 오랜 시간이 걸렸습니다. 문제는 배치 프로그램에서 사용하는 LocalDate.now()였습니다. 이번 포스팅에서는 LocalDate.now()가 어떻게 문제를 유발했는지, 그리고 어떻게 해결했는지에 대해 공유하고자 합니다. 원인 분석 배치 프로그램은 05:30, 07:30, 09:30에 실행하도록 스케줄링 돼있습니다. 배치 프로그램에 date와 관련된 일자를 인자로 넘기지 않으면 해당 배치 프로그램은 LocalDate.now()를 기준으로 배치 실행 일자를 결정하게됩니다. 그런데..
[Rust] Rust Ownership이란
2023. 8. 31. 19:03
Rust/Basic Rust
Rust는 다른 언어에서 찾아보기 힘든 ownership이란 개념이 존재합니다. Java의 경우 garbage collector가 메모리를 관리하고 C/C++의 경우 프로그래머가 메모리를 직접 관리합니다. Rust는 ownership을 활용해 garbage collector와 프로그래머의 개입 없이도 메모리를 효과적으로 관리할 수 있습니다(여기서 말하는 메모리의 관리는 사용하지 않는 객체 등에 할당된 메모리를 해제하는 것을 의미합니다). 이번 포스팅에서는 Rust가 제공하는 ownership의 4가지 유형에 대해 살펴보겠습니다. Move Move는 ownership을 한쪽 위치에서 다른 쪽 위치로 옮기는 것을 의미합니다. fn main() { let string = String::new(); use_st..
[OS] sendfile 시스템 콜과 kafka zero-copy
2023. 8. 24. 17:37
Operating System
File.read(fileDesc, buf, len); Socket.send(socket, buf, len); 위 코드는 디스크의 데이터를 네트워크를 통해 전달하는 코드입니다. 구체적인 내부 동작원리는 다음과 같습니다. 운영체제가 디스크상의 파일을 읽어 데이터를 커널 공간(kernel space)의 읽기 버퍼(read buffer)에 저장합니다. 애플리케이션은 읽기 버퍼에 저장된 데이터를 사용자 공간(use space) 버퍼(application buffer)로 읽어 들입니다. 애플리케이션은 사용자 공간 버퍼로 읽어 들인 데이터를 소켓 버퍼에 씁니다. 운영체제는 소켓 버퍼의 데이터를 NIC(Network Interface Card) 버퍼에 복사합니다. 해당 데이터는 네트워크를 통해 전송됩니다. 디스크상의..