본문 바로가기
SQL로 차집합 구하기 - LEFT JOIN, NOT EXISTS, NOT IN 비 A 테이블에는 있지만 B 테이블에는 없는 데이터를 구하고 싶을 때, SQL에서는 3가지 방법을 쓴다.예시 상황 : 이미지가 없는 상품을 찾아라 1. LEFT JOIN + IS NULLSELECT * FROM tb_item iLEFT JOIN tb_item_image img ON i.id = img.item_idWHERE img.item_id IS NULL;동작 원리는 LEFT JOIN의 특성을 역이용하는 것이다. 1. LEFT JOIN은 왼쪽 테이블(item)의 모든 행을 가져오고, 오른쪽 테이블(image)에서 매칭되는 게 있으면 붙이고, 없으면 그 자리를 NULL로 채운다.2. 조인 직후의 상태는이미지가 있는 상품: [상품 정보] | [이미지 정보]이미지가 없는 상품: [상품 정보] | [NULL, .. 2026. 5. 15.
재고 감소 동시성 문제, 분산락으로 해결하기 간단한 재고 감소 API 하나를 만들면서 동시성 문제를 직접 마주치고, 분산락(Redisson)으로 해결해 나간 과정을 기록했습니다. 들어가며 재고 감소 API 하나를 만들고 동시성 테스트를 돌려봤다.100개 스레드가 동시에 요청했을 때 재고가 정확히 0이 되어야 하는데, 결과는 62였다. 38개 밖에 재고가 감소되지 못한 거다.이 문제를 해결하면서 락 전략들에 대해 알아보았다. 1) 비관적 락은 @Lock(LockModeType.PESSIMISTIC_WRITE) 한 줄로 해결되긴 했는데, 모든 트랜잭션이 줄 서서 기다리다 보니 트래픽이 몰릴수록 DB 커넥션 점유가 심해지는 문제가 있었다. 2) 낙관적 락은 DB 락을 안 쓰니까 빠를 줄 알았는데, 재고처럼 충돌이 잦은 도메인에서는 재시도가 폭발적으로 .. 2026. 2. 20.
Redis는 왜 싱글 스레드일까? Redis는 왜 멀티 코어 시대에 싱글 스레드를 고집할까?Redis를 공부하다가 문득 궁금해졌다.요즘 노트북들은 CPU 코어가 적어도 8코어는 기본인데, 왜 Redis는 싱글 스레드로 동작하도록 만들었을까?성능을 더 높이려면 멀티 스레드를 써서 CPU를 더 사용하는 게 낫지 않나? 그래서 찾아보니, Redis가 싱글 스레드를 사용하는 이유는 기술이 부족해서가 아니라 의도적으로 싱글스레드를 선택했다는 사실을 알게 됐다. 1. Redis의 병목은 CPU가 아니다.Redis가 싱글 스레드를 선택한 가장 큰 이유는 애초에 Redis의 성능 병목 지점이 CPU가 아니기 때문이다.Redis의 성능 병목 지점이 CPU가 아니기 때문이다. Redis는 In-Memory 데이터베이스다.디스크가 아니라 메모리에 데이터를.. 2026. 2. 8.
라이브러리 만들기 - Github Packages 회사에서 프로젝트를 진행하면서 서로 다른 repository지만 같은 기능이나 같은 파일을 사용하는 경우가 많았다.수정 사항이 생기면 모든 repository를 모두 수정해주어야 하는 일이 잦아졌고, 그러다보면 실수가 일어나기도 하였다.이런 중복되는 일에 사용하는 시간을 아끼고자 고민을 하던 중, 방법을 모색해보게 되었다. 내 눈에 띄게 된 건 바로 GitHub Packages였다. GitHub Packages가 뭔데?GitHub Packages는 지정된 사용자에 대해 비공개로 또는 공개적으로 소프트웨어 패키지를 호스트하고 패키지를 프로젝트에 종속성으로 사용할 수 있도록 하는 소프트웨어 패키지 호스팅 서비스 그렇다면 왜 GitHub Packages로 해야할까?private repository를 라이센스 .. 2026. 1. 26.
@Transactional(rollbackFor = Exception.class)은 뭘까? 어느 날처럼 @Transactional 어노테이션을 쓰다가 @Transactional(rollbackFor = Exception.class)이 사용되고 있는 것을 발견했다. 트랜잭션은 메서드 실행 중 Exception 클래스나 그 하위 예외가 발생하면 트랜잭션을 롤백한다.Spring의 기본 동작은 RuntimeException이나 Error만 롤백 대상으로 한다.하지만, rollbackFor = Exception.class 를 명시하면 모든 예외에 대해 롤백이 수행된다. 예시를 들어보자@Transactional(rollbackFor = Exception.class)public void transferMoney(String from, String to, int amount) throws Exception.. 2025. 6. 22.
운영체제란? 운영체제란?(Operating System, OS)실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램운영체제는 실행되고 있는 프로젝트이므로 메모리에 적재되어 실행된다. 그러나 메모리 중에서도 따로 커널 영역이라는 곳에 저장이 된다. 덧붙이자면, 메모리는 커널 영역, 사용자 영역으로 나눌 수 있는데, 일반적으로 사용되는 응용 프로그램은 사용자 영역에 저장된다. 메모리 구조+---------------------+| 사용자 영역 | ← 대부분의 프로그램이 여기서 실행| (User Space) | - 웹 브라우저| | - 게임| | - 문서 편집기+-.. 2025. 5. 19.