본문 바로가기

전체 글42

[ Java / Spring Boot ] @Transactional 붙였는데 데이터가 왜 남아있지? Spring Boot로 개발하다 보면 트랜잭션이 필요한 메서드에 자연스럽게 @Transactional을 붙이게 된다.중간에 예외가 터지면 롤백되겠지?그런데 분명히 어노테이션도 붙였고 예외도 발생했는데, DB를 열어보니 데이터가 그대로 남아 있다면?이번에는 이 상황을 직접 실행해봤다.똑같은 INSERT와 똑같은 예외를 사용했는데, 메서드를 어떻게 호출했는지에 따라 결과가 달라졌다.1. 일단 데이터를 넣고 예외를 터뜨려보자실험 환경은 다음과 같다.Java 21.0.6Spring Boot 3.2.5 / Spring Framework 6.1.6H2 2.2.224 메모리 DBJdbcTemplate + DataSourceTransactionManager이번에는 Spring이 트랜잭션을 적용하는 호출 경로에 집중하기.. 2026. 9. 15.
[ Python ] 기본값에 []를 넣었는데, 왜 이전 데이터가 남아 있을까? 파이썬에서 함수를 만들 때, 기본값을 지정하면 편합니다.def greet(name="우당탕탕"): print(f"안녕하세요, {name}님!")인자를 생략하면 기본값을 사용합니다.그렇다면 리스트도 이렇게 작성하면 되지 않을까요?def add_item(value, items=[]): items.append(value) return items리스트를 전달하지 않으면 빈 리스트에 추가하겠다는 뜻처럼 보입니다.그런데 두 번 호출하면 조금 이상해집니다.먼저 결과부터 보겠습니다print(add_item("A"))print(add_item("B"))기대했던 결과는 다음과 같습니다.['A']['B']실제 결과는?['A']['A', 'B']앞에서 넣었던 A가 남아 있습니다.(함수가 기억력이 좋네요..)이.. 2026. 9. 15.
[ Database ] LIMIT 20인데, 뒤 페이지로 갈수록 왜 느려질까? 게시판을 만들다 보면, 페이지네이션을 구현하게 됩니다.한 페이지에 20개씩 보여준다면 보통 이렇게 작성합니다.SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 0;다음 페이지는?SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 20;간단합니다.그런데 데이터가 쌓이고 뒤쪽 페이지로 넘어가면, 점점 느려지는 경우가 있습니다.SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 100000;“어차피 가져오는 건 20개인데, 왜 차이가 나지?”(20개만 달라고 했잖아요..ㅜㅜ)이번에는 MySQL(혹은 MariaDB)에서 OFFSET이 어떤 일을 만드는지 알.. 2026. 9. 15.
[ Java ] subList()로 잘랐는데, 원본까지 바뀐다고? 리스트에서 일부 데이터만 가져오고 싶을 때, subList()를 사용하기도 합니다.List part = original.subList(1, 4);1번 인덱스부터 4번 인덱스 직전까지.사용법은 간단합니다.그런데 여기서 가져온 데이터를 수정하면 어떻게 될까요?part.set(0, "X");잘라 온 리스트만 바뀔 것 같지만, 원본 리스트도 바뀝니다.“분명 다른 변수에 담았는데..?”이번에는 ArrayList의 subList()가 내부에서 무엇을 만드는지 알아보겠습니다.※ 내부 구현 설명은 OpenJDK 21의 ArrayList를 기준으로 합니다.먼저 코드부터 보겠습니다List original = new ArrayList( List.of("A", "B", "C", "D", "E"));List part = .. 2026. 9. 14.
[ Database ] 인덱스에 넣은 컬럼인데, 왜 조회가 느릴까? 쿼리가 느리면 일단 인덱스부터 생각하게 됩니다.WHERE에 쓰는 컬럼이 두 개라면, 두 개를 같이 묶어서 만들기도 합니다.CREATE INDEX idx_user_createdON orders (user_id, created_at);사용자 번호도 넣었고, 주문 날짜도 넣었습니다.그런데 날짜로만 조회하면 생각처럼 빨라지지 않을 수 있습니다.SELECT *FROM ordersWHERE created_at >= '2026-09-03';“날짜도 인덱스에 넣었는데 왜..?”이번에는 복합 인덱스에서 컬럼 순서가 중요한 이유를 알아보겠습니다.!!!복합 인덱스는 어떻게 정렬될까?먼저 아래와 같은 주문 테이블이 있다고 가정하겠습니다.CREATE TABLE orders ( id BIGINT PRIMARY KEY, .. 2026. 9. 11.
[ Java ] LinkedList를 for문으로 돌렸는데 O(n²)이라고? 자바에서 리스트를 순회할 때, 아래처럼 작성하는 경우가 있습니다.for (int i = 0; i 크기만큼 반복하고, 하나씩 꺼냅니다. 딱 봐도 O(n)처럼 생겼습니다. 그런데!!!!!!!!list가 LinkedList라면, 이 코드의 리스트 접근 비용은 O(n²)이 됩니다.“반복문이 하나인데 왜 제곱이지?”(이중 for문만 피하면 되는 줄 알았는데..) 이번에는 LinkedList의 get()이 어떻게 동작하는지부터 알아보겠습니다.※ 시간복잡도는 출력 비용을 제외하고, 리스트의 요소를 찾아가는 비용을 기준으로 설명합니다.LinkedList의 내부 구조 살펴보기ArrayList는 내부 배열에 요소를 저장합니다.반면 LinkedList는 각 요소를 노드에 담고, 노드끼리 연결합니다.자바의 LinkedLis.. 2026. 9. 10.