본문 바로가기

Development

(60)
Development 추석 이벤트 무료 이용 기간 지급 기능 개발 회고 들어가며2025년 09월 중순, 추석이 얼마 남지 않은 날. 회사에서 추석 이벤트로 무료 이용 기간을 지급해달라는 요청을 받았다. 대상은 1년 이내 결제 이력이 있는 고객이었다. 이벤트 내용 자체는 단순했다. 최근 1년 안에 결제한 고객을 조회하고, 해당 고객들에게 정해진 무료 이용 기간을 지급하면 되는 작업이었다. 요청받은 내용을 정리하면 다음과 같았다.대상: 1년 이내 결제 이력이 있는 고객시행 일시: 2025.10.06(월) 추석 당일 02시처리 내용: 대상 고객에게 추석 이벤트 무료 이용 기간(3개월) 지급이번 글에서는 추석 이벤트 무료 이용 기간 지급 기능을 개발하면서 어떤 문제를 해결하려고 했는지, 왜 직접 DB 수정 방식 대신 기능으로 만들었는지, 그리고 중복 지급과 실패 재처리를 막기 위..
Development Docker 이미지(Image)와 컨테이너(Container) 들어가며Docker를 처음 공부할 때 가장 자주 헷갈리는 개념이 이미지와 컨테이너이다. Docker 명령어를 사용하다 보면 image, container, run, build, pull 같은 단어들이 계속 등장하는데, 처음에는 이 개념들이 머릿속에서 명확하게 분리되지 않는다.특히 '이미지는 설계도이고, 컨테이너는 실행된 결과다'라는 설명을 많이 보게 된다. 이 비유가 완전히 틀린 것은 아니다. 처음 개념을 잡을 때는 꽤 도움이 된다. 하지만 여기서 멈추면 Docker가 실제로 어떤 방식으로 동작하는지 이해하기 어렵다.이미지는 단순한 설계도가 아니고, 컨테이너는 단순한 실행 결과도 아니다. 이미지는 애플리케이션을 실행하기 위해 필요한 파일 시스템과 설정을 담고 있는 정적인 실행 단위이고, 컨테이너는 그 이..
Development/기타 Docker와 가상머신(Vertual Machine, VM) 들어가며로컬에서는 잘 동작하던 코드가 서버에서는 동작하지 않거나, 같은 프로젝트인데도 개발자마다 실행 환경이 달라 문제가 발생하는 경우가 있다. 이러한 문제를 해결하기 위해 등장한 것이 바로 Docker이다.하지만 Docker를 단순히 컨테이너를 만드는 도구 정도로만 이해하면, 왜 이 기술이 등장했는지, 그리고 기존 방식과 무엇이 다른지를 제대로 이해하기 어렵다. Docker를 이해하려면 먼저 기존의 방식이었던 가상 머신(Virtual Machine)과의 차이를 함께 살펴볼 필요가 있다. 이 글에서는 Docker가 무엇인지, 그리고 Container와 VM이 어떤 차이를 가지는지를 중심으로 흐름을 따라 정리해보려고 한다.1. Docker란?Docker는 애플리케이션을 컨테이너(Container)라는 단위..
Development/회고록 AI 시대의 생존 공식 - 언러닝, 리러닝, 뉴러닝 들어가며요즘 개발을 하다 보면 예전과는 확실히 다른 감각을 느끼게 된다. 예전에는 '얼마나 많이 알고 있느냐?'가 중요했다면, 지금은 '얼마나 빠르게 바뀌는 것을 따라가느냐?'가 더 중요해진 느낌이다. 특히 AI가 등장하면서 이 변화는 더 극단적으로 드러나고 있다. 단순 반복 작업이나 정형화된 문제 해결은 점점 AI가 대신하게 되었고, 인간에게 요구되는 역할도 자연스럽게 달라지고 있다. 얼어붙은 채용 시장 속에서 채용 공고만 보더라도 기본적으로 AI 도구 활용 능력이 포함되어있다. 이런 상황에서 한 가지 질문이 생긴다.'나는 앞으로 무엇을 공부해야 하고, 어떻게 살아남아야 할까?'1. AI의 문제점AI가 강력한 도구라는 것은 분명하지만 그렇다고 해서 무조건 신뢰할 수 있는 존재는 아니다. 실제로 개발 과..
Development/회고록 웹 소켓(WebSocket)과 폴링(Polling) 중에서 무엇이 더 좋은가? - 8시간 장애로 배운 설계의 기준 들어가며유튜브를 보다가 WebSocket과 Polling 방식에 대해서 짧게 설명하는 쇼츠를 보게 되었다. 이런 영상을 볼 때마다 댓글을 함께 보는 재미가 꽤 쏠쏠하다. 그 이유는 사실 굳이 나눌 필요도 없는 주제임에도 불구하고, WebSocket파와 Polling파로 나누려는 사람들이 실제로도 존재하기 때문이다. 이런 모습을 볼 때마다 '왜 저걸 이분법으로 나누지?'라는 생각이 들었고, 과거에 비슷한 상황을 직접 겪었던 경험이 떠올랐다. 이번 글에서는 그 경험을 바탕으로 WebSocket과 Polling을 어떻게 바라보는 것이 맞는지에 대해 이야기해보려고 한다.1. 개요약 3년 전, 유저 수 약 6만 명, 최대 동시 접속자 수 약 7천 명 정도 되는 서비스를 개발하고 운영한 적이 있었다. 해당 서비스는..
Development 멱등성(Idempotency)개념과 멱등성 키(Idempotency Key) 들어가며백엔드 개발을 하다 보면 한 번쯤은 이런 고민을 하게된다."이 API가 두 번 호출되면 어떻게 되지?특히 결제, 재고 차감, 포인트 지급과 같은 기능에서는 이 질문이 굉장히 중요해진다. 단순히 한 번 실행되어야 하는 로직이 두 번 실행된다면, 서비스에 직접적인 금전적 손실이 발생할 수도 있기 때문이다. 이러한 문제의 근본적인 원인은 대부분 중복 요청에서 발생하며, 이를 안전하게 처리하기 위한 개념이 바로 멱등성(Idempotency) 이다. 이번 글에서는 중복 요청이 발생하는 상황부터 시작해서, 이를 해결하기 위한 멱등성 개념과 멱등성 키(Idempotency Key)에 대해 정리해보겠다.1. 개요1.1. 중복 요청은 왜 발생할까?개발을 처음 할 때는 '같은 요청이 두 번 들어올 일은 없겠지'라고..
Development/데이터베이스 MySQL vs PostgreSQL 트랜잭션 격리 수준 차이와 실제 장애 사례(Phantom Read 중심으로) 들어가며트랜잭션 격리 수준을 공부하다 보면 한 가지 의문이 생긴다.REPEATABLE READ에서는 Phantom Read가 발생한다고 배웠는데, 왜 MySQL에서는 잘 안 보이지?PostgreSQL은 같은 격리 수준인데 왜 동작이 다르지?이 질문은 굉장히 중요하다. 왜냐하면 이 차이를 제대로 이해하지 못하면, 실제 서비스에서 버그나 장애로 이어질 수 있기 때문이다. 이번 글에서는 Phantom Read 개념, MySQL vs PostgreSQL의 실제 동작 차이, 그리고 이 차이 때문에 발생하는 실무 장애 사례까지 하나의 흐름으로 정리해보겠다.1. Phantom Read란 무엇인가?Phantom Read는 다음과 같은 상황에서 발생한다.트랜잭션 A가 특정 조건으로 데이터를 조회한다트랜잭션 B가 해당 조..
Development/데이터베이스 분산락(Distributed Lock)과 데드락(Dead Lock) 들어가며앞선 글에서는 하나의 데이터베이스 내부에서 동시성을 제어하는 방법으로 낙관적 락과 비관적 락을 살펴보았다. 하지만 실제 서비스는 대부분 여러 서버로 구성된 분산 환경에서 동작한다. 이 경우 단순히 DB 락만으로는 동시성 문제를 해결하기 어려운 상황이 발생할 수 있다. 또한 락을 사용하다 보면 피할 수 없는 문제 중 하나가 바로 데드락(Deadlock) 이다. 이번 글에서는 분산 환경에서 사용하는 분산 락(Distributed Lock) 과, 락 사용 시 반드시 고려해야 할 데드락에 대해 정리해보겠다.1. 개요1.1. 분산 환경에서의 동시성 문제단일 DB 환경에서는 SELECT ... FOR UPDATE 같은 방식으로 비교적 간단하게 동시성 제어가 가능하다.하지만 다음과 같은 상황을 생각해보자.서버..
Development/데이터베이스 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock) 들어가며데이터베이스를 다루다 보면 동시에 여러 요청이 하나의 데이터를 수정하려는 상황을 자주 마주하게 된다. 이러한 상황에서 데이터의 정합성을 유지하기 위해 사용하는 개념이 바로 락(Lock) 이다. 락은 크게 낙관적 락(Optimistic Lock) 과 비관적 락(Pessimistic Lock) 으로 나눌 수 있으며, 각각은 데이터 충돌을 다루는 방식에서 차이를 가진다. 이번 글에서는 낙관적 락과 비관적 락의 개념과 차이점, 그리고 어떤 상황에서 어떤 방식을 선택하는 것이 적절한지에 대해 정리해보겠다.1. 개요1.1. 동시성 문제예를 들어, 하나의 게시글 조회수를 증가시키는 상황을 생각해보자.사용자 A가 조회수를 읽는다 → 10사용자 B도 조회수를 읽는다 → 10사용자 A가 +1 해서 저장 → 11사용..
Development/데이터베이스 트랜젝션(Transaction) 격리 수준(Isolation Level) 들어가며데이터베이스를 다루다 보면 한 번쯤 이런 상황을 마주하게 된다.왜 같은 쿼리를 두 번 실행했는데 결과가 다르지?아직 커밋도 안 된 데이터가 조회되는 게 맞는 건가?이러한 문제는 대부분 트랜잭션과 격리 수준(Isolation Level) 과 관련이 있다. 트랜잭션은 데이터의 일관성을 보장하기 위한 중요한 개념이지만, 동시에 여러 트랜잭션이 실행될 때는 예상하지 못한 문제가 발생할 수 있다. 이를 제어하기 위해 존재하는 것이 바로 트랜잭션 격리 수준이다. 이번 글에서는 트랜잭션 격리 수준이 왜 필요한지, 어떤 문제를 해결하기 위한 개념인지, 그리고 각 수준의 차이에 대해 정리해보겠다.1. 개요1.1. 트랜잭션이란?트랜잭션(Transaction)은 데이터베이스에서 하나의 작업 단위를 의미한다. 예를 들..