<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>bruni — 기록</title>
    <link>https://bruni-world.pages.dev/blog/</link>
    <atom:link href="https://bruni-world.pages.dev/feed.xml" rel="self" type="application/rss+xml"/>
    <description>웹·앱·글·게임을 혼자 만드는 브루니의 기록. DB·백엔드 실전 트러블슈팅을 기록해요.</description>
    <language>ko</language>
    <item>
      <title>pgbouncer transaction 모드에서 안 되는 것들</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-06</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-06</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>커넥션을 아끼려고 pool_mode 를 session 에서 transaction 으로 바꿨어요.</description>
    </item>
    <item>
      <title>인덱스를 만드는 동안 쓰기가 막힌다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-07</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-07</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>운영 중에 인덱스를 하나 추가했어요.</description>
    </item>
    <item>
      <title>안 쓰는 인덱스는 순수한 세금이다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-08</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-08</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>조회가 느릴 때마다 인덱스를 하나씩 추가해 왔어요.</description>
    </item>
    <item>
      <title>격리 수준은 이름값을 못 한다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-11</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-11</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>문서에 REPEATABLE READ 라고 적혀 있어서 "같은 걸 두 번 읽으면 같다"고 믿고 코드를 짰어요.</description>
    </item>
    <item>
      <title>서머타임에 배치가 두 번 돌거나 건너뛴다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-12</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-12</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>해외 서비스를 붙인 뒤로 특정 날에만 정산이 어긋나요.</description>
    </item>
    <item>
      <title>소프트 삭제가 인덱스를 갉아먹는다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-13</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-13</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>데이터를 실제로 지우지 않고 deleted_at 만 채우는 방식으로 만들었어요.</description>
    </item>
    <item>
      <title>대량 DELETE 가 복제를 무너뜨린다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-15</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-15</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>오래된 로그를 정리하려고 DELETE 한 번을 돌렸어요.</description>
    </item>
    <item>
      <title>인덱스가 있는데 안 타는 이유</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-16</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-16</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>느린 쿼리를 잡으려고 인덱스를 만들었어요.</description>
    </item>
    <item>
      <title>통계가 낡으면 플래너가 헛짚는다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-17</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-17</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>배치로 데이터를 대량 적재한 직후부터 쿼리가 느려졌어요.</description>
    </item>
    <item>
      <title>JSON 컬럼은 스키마를 미루는 빚이다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-19</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-19</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>요구사항이 자주 바뀌어서 속성들을 JSON 컬럼 하나에 넣었어요.</description>
    </item>
    <item>
      <title>트랜잭션 안에서 외부 API 를 부르지 마라</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-20</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-20</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>주문을 저장하면서 결제 API 를 부르는 코드예요.</description>
    </item>
    <item>
      <title>잃어버린 갱신 — 두 번의 쓰기가 한 번이 된다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-22</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-22</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>포인트를 적립하는 코드예요.</description>
    </item>
    <item>
      <title>쓰기 스큐 — 각자는 옳은데 합치면 틀리다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-23</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-23</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>당직은 최소 한 명이 남아야 해요.</description>
    </item>
    <item>
      <title>@Transactional 이 조용히 무시되는 순간</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-24</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-24</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>트랜잭션 애너테이션을 붙여 뒀는데 롤백이 안 돼요.</description>
    </item>
    <item>
      <title>REQUIRES_NEW 가 자기 커넥션 풀을 잠근다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-25</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-25</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>바깥 작업이 실패해도 로그는 남기고 싶어서, 로그 저장 메서드를 별도 트랜잭션으로 분리했어요.</description>
    </item>
    <item>
      <title>SKIP LOCKED 로 만드는 작업 큐</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-26</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-26</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>메시지 브로커를 따로 두기엔 규모가 작아서 DB 테이블로 작업 큐를 만들었어요.</description>
    </item>
    <item>
      <title>커밋되기 전에 이벤트를 보내지 마라</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-27</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-27</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>주문이 생성되면 알림 서비스에 이벤트를 보내요.</description>
    </item>
    <item>
      <title>트랜잭션은 짧게 — 경계가 곧 비용이다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-28</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-28</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>트랜잭션 범위를 넓게 잡아 뒀어요.</description>
    </item>
    <item>
      <title>낙관적이냐 비관적이냐 — 충돌 확률이 정한다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-29</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-29</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>동시성 제어를 어떻게 할지 정해야 해요.</description>
    </item>
    <item>
      <title>배치를 트랜잭션 하나로 돌리지 마라</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-30</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-30</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>야간 배치가 백만 건을 처리해요.</description>
    </item>
    <item>
      <title>읽기 전용인데 쓰기 트랜잭션으로 도는 것들</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-31</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-31</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>조회만 하는 API 인데 DB 지표를 보면 쓰기 트랜잭션으로 잡혀요.</description>
    </item>
    <item>
      <title>EXPLAIN 은 추정과 실제의 차이를 보는 것이다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-32</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-32</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>느린 쿼리를 잡으려고 EXPLAIN 을 봐요.</description>
    </item>
    <item>
      <title>LIMIT 이 붙으면 계획이 통째로 바뀐다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-33</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-33</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>목록 조회가 느려서 LIMIT 10 을 붙였어요.</description>
    </item>
    <item>
      <title>인덱스 온리 스캔이 안 되는 이유</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-34</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-34</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>필요한 컬럼을 전부 인덱스에 넣었어요.</description>
    </item>
    <item>
      <title>정렬이 메모리를 넘으면 디스크로 간다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-35</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-35</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>정렬이 들어간 쿼리가 평소엔 빠른데 가끔 수십 배로 느려져요.</description>
    </item>
    <item>
      <title>여섯 번째 실행부터 느려지는 쿼리</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-36</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-36</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>배포 직후에는 빠른데 시간이 지나면 특정 쿼리가 느려져요.</description>
    </item>
    <item>
      <title>OR 은 인덱스를 반으로 가른다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-37</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-37</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>검색 조건에 OR 하나를 추가했더니 쿼리가 갑자기 느려졌어요.</description>
    </item>
    <item>
      <title>NULL 은 인덱스에서 다르게 논다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-38</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-38</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>NULL 인 행을 찾는 쿼리가 인덱스를 안 타요.</description>
    </item>
    <item>
      <title>COUNT(*) 는 결국 다 세는 일이다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-39</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-39</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>목록 화면에 전체 개수를 보여 주려고 COUNT 를 돌려요.</description>
    </item>
    <item>
      <title>인덱스도 부푼다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-40</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-40</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>테이블은 청소가 잘 되고 있는데 인덱스만 계속 커져요.</description>
    </item>
    <item>
      <title>인덱스를 탔는데도 느린 경우</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-41</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-41</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>EXPLAIN 을 보니 인덱스 스캔이에요.</description>
    </item>
    <item>
      <title>조인 순서가 뒤집히면 100배가 된다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-42</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-42</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>여러 테이블을 조인하는 리포트 쿼리가 어느 날부터 100배 느려졌어요.</description>
    </item>
    <item>
      <title>가장 느린 쿼리가 가장 아픈 쿼리는 아니다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=db-43</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=db-43</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>느린 쿼리 로그를 켜고 상위 목록을 뽑았어요.</description>
    </item>
    <item>
      <title>컨슈머가 계속 리밸런싱만 한다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-04</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-04</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>메시지를 처리하는 컨슈머 그룹이 있어요.</description>
    </item>
    <item>
      <title>CDN 이 로그인한 사람의 화면을 캐시한다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-05</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-05</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>속도를 올리려고 CDN 을 붙였어요.</description>
    </item>
    <item>
      <title>배포 직후 DB 가 맞는다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-07</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-07</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>배포가 끝나자마자 DB 부하가 치솟아요.</description>
    </item>
    <item>
      <title>평균은 멀쩡한데 사용자는 느리다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-09</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-09</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>대시보드의 평균 응답 시간은 120ms 예요.</description>
    </item>
    <item>
      <title>서킷 브레이커</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-10</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-10</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>의존하는 서비스 하나가 느려졌어요.</description>
    </item>
    <item>
      <title>43초가 24시간이 되다</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-11</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-11</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>2018년 10월, GitHub 의 두 데이터센터를 잇는 네트워크가 43초 동안 끊겼어요.</description>
    </item>
    <item>
      <title>오타 하나와 4시간</title>
      <link>https://bruni-world.pages.dev/blog/post?p=backend-12</link>
      <guid isPermaLink="true">https://bruni-world.pages.dev/blog/post?p=backend-12</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>2017년 2월, AWS 의 스토리지 서비스가 약 4시간 동안 정상 동작하지 않았어요.</description>
    </item>
  </channel>
</rss>
