<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tomatovibe</title>
    <link>https://tomatovibe.tistory.com/</link>
    <description>tomatovibe 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 00:57:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>babytomato</managingEditor>
    <item>
      <title>기술 부채란 무엇인가? (실무 예시로 이해하는 기술 부채의 모든 것)</title>
      <link>https://tomatovibe.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;ldquo;이 코드&amp;hellip; 나중에 고치자&amp;rdquo; &amp;rarr; 이미 시작된 기술 부채&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발하면서 이런 말, 한 번쯤 해봤을 겁니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;일단 돌아가게만 만들자&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;이건 다음 스프린트에서 정리하자&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;테스트는 나중에&amp;hellip;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 선택들, 사실 하나로 묶입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;기술 부채(Technical Debt)&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 기술 부채란? (딱 한 줄 정의)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 부채는&lt;br /&gt;  &lt;b&gt;&amp;ldquo;빠른 개발을 위해 미래 비용을 미리 써버린 것&amp;rdquo;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 정확히 말하면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 개발을 위해 최적이 아닌 선택을 하면&lt;br /&gt;나중에 더 큰 비용(수정, 유지보수)이 발생하는 구조 (&lt;a href=&quot;https://www.ibm.com/kr-ko/think/topics/technical-debt?utm_source=chatgpt.com&quot;&gt;IBM&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 쉽게 이해하는 비유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금: 빠르게 개발 &amp;rarr; 편함&lt;/li&gt;
&lt;li&gt;미래: 수정, 유지보수 &amp;rarr; 비용 폭발&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  금융으로 치면 &lt;b&gt;이자 붙는 빚&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 실무에서 바로 공감되는 기술 부채 예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 핵심입니다.&lt;br /&gt;&amp;ldquo;아 이거 내 얘기네&amp;rdquo;가 나와야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 1: 급하게 만든 복붙 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;if (type === 'A') { processA() }
if (type === 'B') { processB() }
if (type === 'C') { processC() }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  문제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조 없음&lt;/li&gt;
&lt;li&gt;중복 로직 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  3개월 뒤&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로직 변경 &amp;rarr; 3군데 수정&lt;/li&gt;
&lt;li&gt;하나 빠뜨림 &amp;rarr; 버그 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;br /&gt;✔ 유지보수 비용 폭증&lt;br /&gt;✔ 코드 수정 공포 시작&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 2: 테스트 없는 배포&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;시간 없으니까 테스트 빼고 배포하자&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  2주 후&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능 수정했는데 다른 기능 깨짐&lt;/li&gt;
&lt;li&gt;원인 찾는데 5시간 소요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;br /&gt;✔ 개발 속도 오히려 느려짐&lt;br /&gt;✔ 팀 신뢰도 하락&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 3: 레거시 코드 방치&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function process_v2_final_real_last() {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무도 모름&lt;/li&gt;
&lt;li&gt;삭제 못함 (무서워서)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;br /&gt;✔ 신규 개발자 온보딩 지옥&lt;br /&gt;✔ 코드 이해 시간 &amp;uarr;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 4: 기술 스택 미루기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오래된 라이브러리 계속 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;지금 바꾸기 귀찮음&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  1년 뒤&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 문제 발생&lt;/li&gt;
&lt;li&gt;대규모 리팩토링 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;br /&gt;✔ 비용 10배 증가&lt;br /&gt;✔ 서비스 리스크 증가&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 기술 부채가 쌓이면 실제로 생기는 일&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 이론이 아니라 실제 현상입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1) 개발 속도 점점 느려짐&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 빠름 &amp;rarr; 점점 느려짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이유&lt;br /&gt;코드 복잡도 증가 &amp;rarr; 수정 비용 증가&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2) 버그 폭발&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나 고치면 다른 데 터짐&lt;/li&gt;
&lt;li&gt;&amp;ldquo;이 코드 건드리지 마&amp;rdquo; 문화 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3) 유지보수 비용 증가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 부채는 실제로&lt;br /&gt;  유지보수 비용 증가 + 품질 저하를 유발 (&lt;a href=&quot;https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART003245997&amp;amp;utm_source=chatgpt.com&quot;&gt;KCI&lt;/a&gt;)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4) 결국 리팩토링 지옥&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미루다가 한 번에 터짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이때 비용 = 초기의 몇 배&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 기술 부채가 생기는 진짜 이유 (핵심)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 거의 모든 팀 공통입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 1) 일정 압박&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이번 주 안에 출시해야 함&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 2) 요구사항 변경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계속 바뀌는 기획&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 3) 경험 부족&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당시엔 최선이었음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 4) 의도적 선택&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속도를 위해 일부러 감수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심 포인트&lt;br /&gt;&lt;b&gt;기술 부채는 실수가 아니라 &amp;lsquo;선택&amp;rsquo;인 경우가 많다&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 기술 부채 해결 방법 (실무 기준, 바로 적용 가능)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 건&lt;br /&gt;  &amp;ldquo;이론 말고 실제 가능한 것&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 1) 기능 개발하면서 리팩토링 같이 하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 잘못된 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;나중에 한 번에 정리하자&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 현실적인 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능 수정할 때 같이 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  효과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부담 분산&lt;/li&gt;
&lt;li&gt;리팩토링 비용 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 2) 코드 리뷰 기준 바꾸기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 기존&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;동작하나요?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 바꿔야 할 질문&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이 코드 3개월 뒤에도 이해 가능?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 3) 테스트 &amp;lsquo;최소 단위&amp;rsquo;라도 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심만 테스트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심 비즈니스 로직&lt;/li&gt;
&lt;li&gt;자주 수정되는 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  효과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리팩토링 안정성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 4) 기술 부채를 &amp;ldquo;기록&amp;rdquo;하고 관리하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 안 좋은 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TODO 주석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 좋은 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jira / Notion / 이슈로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심&lt;br /&gt;&lt;b&gt;보이지 않으면 관리 안 됨&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 결론 (이 글의 핵심 요약)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 부채는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ 없애야 하는 것&lt;/li&gt;
&lt;li&gt;✅ 관리해야 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 한 줄 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;기술 부채는 피하는 게 아니라, 통제하는 것이다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/124</guid>
      <comments>https://tomatovibe.tistory.com/124#entry124comment</comments>
      <pubDate>Mon, 13 Apr 2026 09:17:05 +0900</pubDate>
    </item>
    <item>
      <title>백엔드는 왜 서버까지 알아야 할까? (코드만 알아선 부족한 이유)</title>
      <link>https://tomatovibe.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나는 개발자인데&amp;hellip;&lt;br /&gt;왜 서버까지 알아야 하지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 처음 시작하면&lt;br /&gt;이런 생각이 한 번쯤 든다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 잘 짜면 되는 거 아닌가?&lt;/li&gt;
&lt;li&gt;서버는 인프라 담당 아닌가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 실무를 하다 보면 깨닫는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;코드만 알아서는 아무것도 해결 못 한다는 것&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API가 느린데 이유를 모름&lt;/li&gt;
&lt;li&gt;서버가 죽었는데 어디부터 봐야 할지 모름&lt;/li&gt;
&lt;li&gt;메모리 부족으로 장애 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이때 필요한 건 코드가 아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;서버 이해&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 서버를 알아야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드는 결국&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;서버 위에서 돌아가는 프로그램&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  서버를 모르면 생기는 문제&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 원인을 못 찾는다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 문제인지&lt;/li&gt;
&lt;li&gt;메모리 문제인지&lt;/li&gt;
&lt;li&gt;코드 문제인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  구분 불가&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 장애 대응이 느리다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그 위치 모름&lt;/li&gt;
&lt;li&gt;프로세스 상태 모름&lt;/li&gt;
&lt;li&gt;서버 상태 확인 못 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 성능 개선 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜 느린지 모름&lt;/li&gt;
&lt;li&gt;어디를 개선해야 할지 모름&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 최소한 알아야 할 것&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 리눅스 기본 명령어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;top / htop &amp;rarr; CPU, 메모리 확인&lt;/li&gt;
&lt;li&gt;ps &amp;rarr; 프로세스 확인&lt;/li&gt;
&lt;li&gt;df -h &amp;rarr; 디스크 용량&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 로그 위치 &amp;amp; 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심 질문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;로그 어디에 쌓이지?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 프로세스 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버가 어떻게 실행되는지&lt;/li&gt;
&lt;li&gt;죽으면 어떻게 되는지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 기본 네트워크 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트&lt;/li&gt;
&lt;li&gt;요청 흐름&lt;/li&gt;
&lt;li&gt;timeout&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 순간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 모르면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;왜 느리지&amp;hellip;?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;왜 안 되지&amp;hellip;?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 알면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;아 CPU 때문이네&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;메모리 터졌네&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;포트 막혔네&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  차이가 엄청 크다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;백엔드는 코드가 아니라 &amp;lsquo;시스템&amp;rsquo;을 다루는 일이다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시리즈 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 읽었다면&lt;br /&gt;이미 중요한 걸 하나 알게 된 거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  백엔드는 단순히 코드를 짜는 일이 아니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경을 이해하고&lt;/li&gt;
&lt;li&gt;데이터를 다루고&lt;/li&gt;
&lt;li&gt;문제를 해결하고&lt;/li&gt;
&lt;li&gt;시스템을 보는 일이다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이 시리즈를 통해 얻어야 할 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제를 보는 시각&lt;/li&gt;
&lt;li&gt;원인을 찾는 방법&lt;/li&gt;
&lt;li&gt;실무에서 살아남는 감각&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/123</guid>
      <comments>https://tomatovibe.tistory.com/123#entry123comment</comments>
      <pubDate>Fri, 10 Apr 2026 09:22:03 +0900</pubDate>
    </item>
    <item>
      <title>디버깅이 실력인 이유 (코딩보다 중요한 능력)</title>
      <link>https://tomatovibe.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;코드는 내가 짰는데&amp;hellip;&lt;br /&gt;왜 안 되는지 모르겠다&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;이 상황을 정말 많이 겪는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 어느 순간 깨닫게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;개발자의 진짜 실력은 코딩이 아니라 디버깅이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분명 맞게 짠 것 같은데 에러 발생&lt;/li&gt;
&lt;li&gt;어디서 잘못된 건지 감이 안 잡힘&lt;/li&gt;
&lt;li&gt;로그 봐도 이해 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이때 드는 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나 개발 못하는 건가&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 디버깅이 어려울까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드는 &amp;ldquo;작성&amp;rdquo;보다&lt;br /&gt;  **&amp;ldquo;흐름을 이해하는 것&amp;rdquo;**이 훨씬 어렵다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  디버깅 못 하는 사람 특징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 감으로 찍는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;여기 문제 같아&amp;rdquo;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 코드만 계속 본다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제 실행 흐름 안 봄&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 한 번에 해결하려 한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 범위 너무 넓음&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  잘하는 사람은 이렇게 한다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 범위를 줄인다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심 질문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;여기까지는 정상인가?&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OK / FAIL 기준으로 나눔&lt;/li&gt;
&lt;li&gt;문제 영역 좁히기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 로그로 추적한다&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;A &amp;rarr; B &amp;rarr; C &amp;rarr; D
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  어디까지 실행됐는지 확인&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 가설을 세우고 검증한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 그냥 수정&lt;br /&gt;  위험&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 가설 &amp;rarr; 테스트 &amp;rarr; 확인&lt;br /&gt;  반복&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 데이터부터 본다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 경우 원인은 코드가 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  데이터&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값이 이상함&lt;/li&gt;
&lt;li&gt;NULL 존재&lt;/li&gt;
&lt;li&gt;예상과 다른 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  디버깅 못 할 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3시간 동안 원인 못 찾음&lt;/li&gt;
&lt;li&gt;계속 같은 곳만 봄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  디버깅 잘할 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10분 만에 원인 파악&lt;/li&gt;
&lt;li&gt;빠르게 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  디버깅 실력 = 이런 능력&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;흐름을 쪼개는 능력&lt;/li&gt;
&lt;li&gt;원인을 좁히는 능력&lt;/li&gt;
&lt;li&gt;로그를 읽는 능력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이게 진짜 실력이다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;개발자의 실력은 얼마나 빨리 원인을 찾느냐로 결정된다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 잘 짜는 것도 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실무에서는 더 중요한 게 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;문제가 생겼을 때 얼마나 빠르게 해결하느냐&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결국 남는 건 하나다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  디버깅 실력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/122</guid>
      <comments>https://tomatovibe.tistory.com/122#entry122comment</comments>
      <pubDate>Thu, 9 Apr 2026 09:13:48 +0900</pubDate>
    </item>
    <item>
      <title>왜 요구사항은 계속 바뀔까? (개발자가 가장 많이 듣는 말)</title>
      <link>https://tomatovibe.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 조금만 수정하면 될 것 같아요  &amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;이 말을 정말 많이 듣게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 경험이 쌓일수록 알게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;조금&amp;rdquo;의 의미는 절대 &amp;lsquo;조금&amp;rsquo;이 아니다&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능 다 만들었는데 기획 변경&lt;/li&gt;
&lt;li&gt;거의 완료됐는데 정책 수정&lt;/li&gt;
&lt;li&gt;배포 직전에 요구사항 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그리고 항상 따라오는 말&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 금방 되죠?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 이런 일이 계속 생길까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 보기엔 이상하지만&lt;br /&gt;사실 이유가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  원인 1: 처음부터 완벽한 기획은 없다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획 단계에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 케이스를 다 고려하기 어렵고&lt;/li&gt;
&lt;li&gt;실제 사용 상황을 완전히 예측할 수 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그래서 개발하면서 보완된다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  원인 2: 비즈니스는 계속 변한다&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정책 변경&lt;/li&gt;
&lt;li&gt;경쟁사 대응&lt;/li&gt;
&lt;li&gt;사용자 피드백&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  개발보다 비즈니스가 더 빠르게 움직인다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  원인 3: &amp;ldquo;간단해 보이기 때문&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획자 입장:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;버튼 하나 추가하면 되겠네?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 입장:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DB, API, 로직 다 수정해야 함&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 신입 때 가장 많이 하는 착각&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ &amp;ldquo;왜 이렇게 자주 바뀌지?&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이상한 게 아니라 정상이다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 짜증부터 남&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 협업 어려워짐&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 이렇게 대응한다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 영향 범위부터 본다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 들으면 바로 생각해야 할 것:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;어디까지 영향 가지?&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 변경?&lt;/li&gt;
&lt;li&gt;API 수정?&lt;/li&gt;
&lt;li&gt;기존 기능 영향?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 바로 하지 말고 확인한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  꼭 해야 할 질문&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확한 요구사항은?&lt;/li&gt;
&lt;li&gt;예외 케이스는?&lt;/li&gt;
&lt;li&gt;기존 기능 영향은?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. &amp;ldquo;시간&amp;rdquo;을 같이 말한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &amp;ldquo;네 됩니다&amp;rdquo;&lt;br /&gt;  위험&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &amp;ldquo;이건 2일 정도 필요합니다&amp;rdquo;&lt;br /&gt;  현실적인 커뮤니케이션&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 변경을 전제로 설계한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심 마인드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이건 나중에 바뀔 수도 있다&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확장 가능하게&lt;/li&gt;
&lt;li&gt;하드코딩 지양&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 몇 번 겪으면 바뀐다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;왜 바뀌지?&amp;rdquo; &amp;rarr; ❌&lt;/li&gt;
&lt;li&gt;&amp;ldquo;어떻게 대응하지?&amp;rdquo; &amp;rarr; ⭕&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;요구사항 변경은 예외가 아니라 기본이다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발은 단순히 기능을 만드는 일이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;변화에 맞춰 계속 수정하는 일이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 중요한 건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  빠르게 만들기보다&lt;br /&gt;  &lt;b&gt;유연하게 대응하는 능력&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/121</guid>
      <comments>https://tomatovibe.tistory.com/121#entry121comment</comments>
      <pubDate>Wed, 8 Apr 2026 09:21:30 +0900</pubDate>
    </item>
    <item>
      <title>레거시 코드 처음 만났을 때 살아남는 법 (백엔드 신입 현실)</title>
      <link>https://tomatovibe.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이 코드&amp;hellip; 누가 짠 거지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자로 처음 실무에 들어가면&lt;br /&gt;거의 대부분의 시간을 이렇게 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;남이 만든 코드를 읽는 시간&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 코드가&amp;hellip;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석 없음&lt;/li&gt;
&lt;li&gt;구조 이상함&lt;/li&gt;
&lt;li&gt;어디서부터 봐야 할지 모름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이게 바로 레거시 코드다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능 하나 수정하려고 했는데 코드가 너무 복잡함&lt;/li&gt;
&lt;li&gt;어디를 건드려야 할지 모르겠음&lt;/li&gt;
&lt;li&gt;잘못 건드릴까 봐 무서움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그래서 이런 생각 든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 건드려도 되는 거 맞나&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 레거시 코드는 어려울까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 이거다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;의도를 모른다&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드는 있는데&lt;br /&gt;왜 이렇게 짰는지는 모른다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  신입이 흔히 하는 실수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 처음부터 다 이해하려고 함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 시간 낭비&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 무작정 수정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사이드 이펙트 발생&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 코드만 봄&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 흐름을 놓침&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 이렇게 접근한다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. &amp;ldquo;전체&amp;rdquo; 말고 &amp;ldquo;흐름&amp;rdquo;부터 본다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 API 하나 기준으로:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  요청 &amp;rarr; 서비스 &amp;rarr; DB &amp;rarr; 응답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 먼저 따라간다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 로그 찍어서 확인한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드만 보는 게 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  직접 실행하면서 본다&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;log.info(&quot;여기 들어옴&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  어디까지 실행되는지 확인&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 작은 단위로 이해한다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번에 전체 X&lt;/li&gt;
&lt;li&gt;함수 하나씩&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  쪼개서 이해&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. &amp;ldquo;안 건드리는 용기&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르는 부분은 건드리지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  실무에서 중요한 태도&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 5. 변경은 최소한으로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  핵심 원칙&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 부분만 수정&lt;/li&gt;
&lt;li&gt;영향 범위 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 레거시 건드릴 때 가장 위험한 순간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;이 코드 이상한데? 리팩토링 해야겠다&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입 때 이 생각 들면 위험하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 로직 깨질 가능성 높음&lt;/li&gt;
&lt;li&gt;숨겨진 의도 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 진짜 중요한 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레거시 코드를 보면 이렇게 생각해야 한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;이건 누군가의 이유 있는 선택이다&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비효율적으로 보일 수 있지만&lt;br /&gt;당시 상황에서는 최선이었을 수도 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이 코드 왜 이래?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;이해 안 된다&amp;hellip;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 지나면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;아 이래서 이렇게 했구나&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;여기서 문제 날 수도 있겠네&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;레거시 코드는 이해하려 하지 말고, 흐름부터 따라가라.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자는&lt;br /&gt;코드를 &amp;ldquo;잘 짜는 것&amp;rdquo;도 중요하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  **&amp;ldquo;남의 코드를 빠르게 이해하는 능력&amp;rdquo;**이 더 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 시작은 단순하다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  전체 X &amp;rarr; 흐름 O&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/120</guid>
      <comments>https://tomatovibe.tistory.com/120#entry120comment</comments>
      <pubDate>Tue, 7 Apr 2026 09:13:57 +0900</pubDate>
    </item>
    <item>
      <title>배포했더니 장애 나는 이유 (백엔드 개발자의 통과의례)</title>
      <link>https://tomatovibe.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;로컬에서는 잘 됐는데&amp;hellip;&lt;br /&gt;왜 배포하자마자 터지지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;한 번쯤은 반드시 겪는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;배포 = 장애 발생&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 잘 동작하던 기능도&lt;br /&gt;배포만 하면 갑자기 문제가 생긴다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배포 직후 500 에러 폭증&lt;/li&gt;
&lt;li&gt;특정 API만 갑자기 실패&lt;/li&gt;
&lt;li&gt;DB 오류 발생&lt;/li&gt;
&lt;li&gt;사용자 문의 폭주&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그리고 그 순간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아&amp;hellip; 큰일 났다&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 배포하면 터질까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 이거다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;환경과 상태가 바뀌기 때문&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 1: DB 스키마 변경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 진짜 많이 터진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼 추가했는데 코드 먼저 배포&lt;/li&gt;
&lt;li&gt;컬럼 삭제했는데 아직 코드에서 사용 중&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리 에러 발생&lt;/li&gt;
&lt;li&gt;서비스 일부 기능 마비&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 2: 캐시 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 전과 후의 상태가 다름&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 캐시 데이터 남아 있음&lt;/li&gt;
&lt;li&gt;새로운 코드와 충돌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이상한 데이터 노출&lt;/li&gt;
&lt;li&gt;일부 요청만 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 3: 서버 간 버전 불일치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 여러 대일 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 서버: 최신 코드&lt;/li&gt;
&lt;li&gt;B 서버: 이전 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 요청은 성공&lt;/li&gt;
&lt;li&gt;어떤 요청은 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  진짜 찾기 어려움&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 4: 설정 값 차이&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 변수 누락&lt;/li&gt;
&lt;li&gt;설정 파일 변경&lt;/li&gt;
&lt;li&gt;외부 API 주소 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 기능만 동작 안 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 5: 순서 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 신입 때 거의 다 겪는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  잘못된 순서&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;코드 배포&lt;/li&gt;
&lt;li&gt;DB 변경&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  올바른 순서&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB 변경&lt;/li&gt;
&lt;li&gt;코드 배포&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 신입 때 많이 하는 실수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 테스트 안 하고 바로 배포&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 위험&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 배포 후 확인 안 함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 더 위험&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 롤백 준비 안 함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 최악&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 이렇게 막는다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 배포 체크리스트 만들기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 변경 여부&lt;/li&gt;
&lt;li&gt;환경 변수 확인&lt;/li&gt;
&lt;li&gt;캐시 초기화 필요 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 점진적 배포 (Rolling / Blue-Green)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번에 전체 배포 X&lt;/li&gt;
&lt;li&gt;일부 서버부터 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  문제 발생 시 빠르게 대응 가능&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 배포 후 즉시 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 API 테스트&lt;/li&gt;
&lt;li&gt;로그 확인&lt;/li&gt;
&lt;li&gt;모니터링 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 롤백 준비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  항상 생각해야 할 질문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;문제 생기면 5분 안에 되돌릴 수 있나?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 몇 번 겪으면 생각이 바뀐다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;배포는 그냥 올리는 게 아니다&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;배포도 개발이다&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;배포는 끝이 아니라, 또 하나의 시작이다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자에게 배포는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  가장 긴장되는 순간이자&lt;br /&gt;  가장 중요한 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 한 번 크게 겪고 나면&lt;br /&gt;습관이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  체크 &amp;rarr; 확인 &amp;rarr; 대비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/119</guid>
      <comments>https://tomatovibe.tistory.com/119#entry119comment</comments>
      <pubDate>Mon, 6 Apr 2026 09:01:59 +0900</pubDate>
    </item>
    <item>
      <title>재현 안 되는 버그의 정체 (개발자 멘탈 터지는 순간)</title>
      <link>https://tomatovibe.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;분명히 에러가 났다는데&amp;hellip;&lt;br /&gt;왜 나는 재현이 안 되지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;가장 스트레스 받는 순간이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;버그가 있는데 재현이 안 되는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 봐도 문제 없어 보이고&lt;br /&gt;직접 테스트해도 정상 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 사용자한테는 계속 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이쯤 되면 이런 생각 든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 진짜 존재하는 버그 맞나&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 사용자만 에러 발생&lt;/li&gt;
&lt;li&gt;특정 시간에만 문제 발생&lt;/li&gt;
&lt;li&gt;같은 요청인데 결과가 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에서는 절대 안 터짐&lt;/li&gt;
&lt;li&gt;로그도 애매하게 찍힘&lt;/li&gt;
&lt;li&gt;QA에서도 재현 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 이런 일이 생길까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 이거다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;환경과 상황이 다르기 때문&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 1: 데이터 상태&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 API라도&lt;br /&gt;데이터 상태에 따라 결과가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 사용자 데이터만 이상함&lt;/li&gt;
&lt;li&gt;NULL 값 존재&lt;/li&gt;
&lt;li&gt;예상 못 한 값 들어옴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그래서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나는 정상&lt;/li&gt;
&lt;li&gt;특정 유저만 에러&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 2: 타이밍 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 진짜 찾기 어렵다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 순서에 따라 결과 변경&lt;/li&gt;
&lt;li&gt;처리 중간에 다른 요청 개입&lt;/li&gt;
&lt;li&gt;아주 짧은 시간 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결국&lt;br /&gt;동시성 문제랑 연결되는 경우 많다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 3: 캐시(Cache)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 때문에 결과가 달라지는 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시된 데이터 사용&lt;/li&gt;
&lt;li&gt;최신 데이터 반영 안 됨&lt;/li&gt;
&lt;li&gt;서버마다 캐시 상태 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  증상&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 요청은 정상&lt;/li&gt;
&lt;li&gt;어떤 요청은 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  대표적인 원인 4: 환경 차이&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버마다 설정 다름&lt;/li&gt;
&lt;li&gt;배포 버전 다름&lt;/li&gt;
&lt;li&gt;특정 서버만 문제 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특히 이런 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;서버 3대 중 1대만 에러 발생&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 신입 때 가장 많이 하는 실수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 코드만 계속 봄&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 원인은 코드 밖에 있음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 감으로 수정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 더 큰 문제 생김&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 로그 안 봄&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 단서 놓침&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 이렇게 해결한다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 로그부터 본다 (무조건)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언제 발생했는지&lt;/li&gt;
&lt;li&gt;어떤 값으로 호출됐는지&lt;/li&gt;
&lt;li&gt;어디서 실패했는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  단서 찾기&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. &amp;ldquo;차이&amp;rdquo;를 찾는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 질문:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;정상 케이스 vs 에러 케이스 뭐가 다르지?&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자&lt;/li&gt;
&lt;li&gt;데이터&lt;/li&gt;
&lt;li&gt;시간&lt;/li&gt;
&lt;li&gt;요청 순서&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 데이터 직접 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 조회&lt;/li&gt;
&lt;li&gt;문제 데이터 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  여기서 많이 걸린다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 일부러 상황을 만든다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동시 요청 보내보기&lt;/li&gt;
&lt;li&gt;특정 데이터 넣어보기&lt;/li&gt;
&lt;li&gt;캐시 비우기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  재현 환경 만들기&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 겪으면 깨닫는다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;버그는 항상 이유가 있다&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;재현 안 되는 게 아니라, 조건을 모르는 것뿐이다&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;재현 안 되는 버그는 없다. 조건을 아직 못 찾았을 뿐이다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발에서 진짜 실력은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;버그를 &amp;lsquo;찾는 능력&amp;rsquo;이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 시작은 항상 같다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  로그 &amp;rarr; 차이 &amp;rarr; 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름만 익히면&lt;br /&gt;재현 안 되는 버그도 결국 잡힌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/118</guid>
      <comments>https://tomatovibe.tistory.com/118#entry118comment</comments>
      <pubDate>Fri, 3 Apr 2026 09:06:06 +0900</pubDate>
    </item>
    <item>
      <title>로그 없으면 장애 못 잡는다 (백엔드 개발자의 생명줄)</title>
      <link>https://tomatovibe.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;에러가 났다고 하는데&amp;hellip;&lt;br /&gt;어디서 터진 건지 모르겠어요&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;반드시 한 번은 이런 상황을 겪는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그때 깨닫는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;로그가 없으면 아무것도 못 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자: &amp;ldquo;결제가 안 돼요&amp;rdquo;&lt;/li&gt;
&lt;li&gt;서버: 500 에러 발생&lt;/li&gt;
&lt;li&gt;개발자: &amp;ldquo;어디서 터진 거지&amp;hellip;?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 아무리 봐도 모르겠다.&lt;br /&gt;재현도 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이때 로그가 없으면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 추측 게임 시작이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 로그가 그렇게 중요할까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드는 눈에 보이지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트처럼 화면이 있는 것도 아니고,&lt;br /&gt;사용자 행동이 그대로 보이지도 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그래서 필요한 게 로그다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그는 말 그대로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;서버 안에서 무슨 일이 일어났는지 기록&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  로그가 있으면 가능한 것&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 어디서 터졌는지 바로 알 수 있음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 API&lt;/li&gt;
&lt;li&gt;어떤 함수&lt;/li&gt;
&lt;li&gt;어떤 시점&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 어떤 값으로 실행됐는지 확인 가능&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;userId=123  
amount=50000  
status=FAILED
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  문제 원인 추적 가능&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 재현이 안 되는 버그도 추적 가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제 사용자 상황을 그대로 볼 수 있음&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 신입 때 많이 하는 실수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 로그를 거의 안 남김&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;나중에 찍지 뭐&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 에러 로그만 찍음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 정상 흐름을 모르면 비교 불가&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 로그가 너무 단순함&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;error 발생
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이건 아무 의미 없음&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무에서 로그 이렇게 남긴다&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 흐름 단위로 남기기&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[Payment Start] userId=123  
[Payment Validate] OK  
[Payment Request PG]  
[Payment Failed] timeout
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  어디서 끊겼는지 바로 보임&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 핵심 데이터 같이 남기기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;userId&lt;/li&gt;
&lt;li&gt;요청값&lt;/li&gt;
&lt;li&gt;결과값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  나중에 100% 도움 된다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 에러는 스택까지 같이 남기기&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;Exception: NullPointerException  
at PaymentService.process()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이거 하나로 디버깅 시간 반으로 줄어듦&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 로그 레벨 구분하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;INFO: 흐름 확인&lt;/li&gt;
&lt;li&gt;WARN: 이상 징후&lt;/li&gt;
&lt;li&gt;ERROR: 진짜 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 로그 하나로 인생 바뀌는 순간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 실무에서 진짜 느낌 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  로그 없을 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3시간 동안 원인 못 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  로그 있을 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5분 만에 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;로그는 선택이 아니라 필수다. 없으면 장애 못 잡는다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자는&lt;br /&gt;코드를 잘 짜는 것도 중요하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;문제를 빠르게 찾는 능력&lt;/b&gt;이 더 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 능력의 핵심이 바로 로그다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/117</guid>
      <comments>https://tomatovibe.tistory.com/117#entry117comment</comments>
      <pubDate>Thu, 2 Apr 2026 09:25:12 +0900</pubDate>
    </item>
    <item>
      <title>왜 이 버그는 가끔만 터질까? (동시성 문제의 정체)</title>
      <link>https://tomatovibe.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;분명히 잘 되던 기능인데&amp;hellip;&lt;br /&gt;왜 가끔씩만 에러가 날까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;&lt;b&gt;재현이 안 되는 버그&lt;/b&gt;를 처음 만나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이때 가장 많이 하는 생각:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;내 코드 문제 맞나&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면&lt;br /&gt;  높은 확률로 &lt;b&gt;동시성 문제&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결제 요청이 두 번 들어가서 &lt;b&gt;중복 결제 발생&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;재고가 1개인데 &lt;b&gt;동시에 주문 2개 성공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;어떤 때는 정상, 어떤 때는 데이터 꼬임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에서는 절대 안 터짐&lt;/li&gt;
&lt;li&gt;테스트할 때는 멀쩡함&lt;/li&gt;
&lt;li&gt;운영에서만 가끔 터짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이쯤 되면 멘탈 나간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 왜 랜덤이야&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인: 동시에 요청이 들어옴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 보통 이렇게 생각한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;요청 &amp;rarr; 처리 &amp;rarr; 응답&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 실제 서버는 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;여러 요청이 동시에 들어와서 같이 처리됨&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이해를 위한 간단한 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재고가 1개 남은 상황&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 사용자 A &amp;rarr; 재고 확인 (1개 있음)
2. 사용자 B &amp;rarr; 재고 확인 (1개 있음)
3. A 구매 성공
4. B도 구매 성공
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;br /&gt;재고 -1 (말이 안 되는 상황 발생)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 이런 일이 생길까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 이거다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;&amp;ldquo;읽기 &amp;rarr; 처리 &amp;rarr; 쓰기&amp;rdquo; 사이에 틈이 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 틈 사이에&lt;br /&gt;다른 요청이 끼어들면 문제가 발생한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 신입이 놓치기 쉬운 포인트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 로컬에서는 절대 안 보임&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 혼자 테스트하면 동시 요청 없음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 테스트 코드로도 잘 안 잡힘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 의도적으로 동시에 때려야 함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &amp;ldquo;가끔&amp;rdquo;만 터짐&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 그래서 더 찾기 어려움&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  그래서 어떻게 해결하냐&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이런 방식으로 막는다:&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 트랜잭션(Transaction)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업을 하나의 묶음으로 처리&lt;/li&gt;
&lt;li&gt;중간에 끼어들지 못하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 2. 락(Lock)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 수정하는 동안 다른 접근 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  종류&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB Lock (비관적 락)&lt;/li&gt;
&lt;li&gt;Optimistic Lock (버전 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 3. 조건 기반 UPDATE&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;UPDATE product
SET stock = stock - 1
WHERE stock &amp;gt; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이렇게 하면&lt;br /&gt;동시에 들어와도 안전하게 처리됨&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 큐(Queue) 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청을 순서대로 처리&lt;/li&gt;
&lt;li&gt;동시에 실행되지 않게 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 느끼는 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 처음 겪으면 이렇게 된다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;왜 가끔만 터지지?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;왜 재현이 안 되지?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;내 코드가 맞는 건가&amp;hellip;?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 원인을 알고 나면 바뀐다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;아, 이건 동시성 문제구나&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;가끔만 터지는 버그는, 대부분 동시성 문제다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발에서 진짜 어려운 건&lt;br /&gt;&lt;b&gt;코드를 짜는 게 아니라 &amp;lsquo;상황&amp;rsquo;을 이해하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 동시성은&lt;br /&gt;실무에서 반드시 한 번은 크게 데이는 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 미리 알고 있으면&lt;br /&gt;  사고를 크게 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/116</guid>
      <comments>https://tomatovibe.tistory.com/116#entry116comment</comments>
      <pubDate>Wed, 1 Apr 2026 09:25:20 +0900</pubDate>
    </item>
    <item>
      <title>SQL 하나 잘못 짰다가 서비스 느려지는 이유 (백엔드 신입 2번째 멘붕)</title>
      <link>https://tomatovibe.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;코드는 문제 없어 보이는데&amp;hellip;&lt;br /&gt;왜 서비스가 이렇게 느리지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발을 하다 보면&lt;br /&gt;어느 순간부터 &lt;b&gt;API 응답 속도가 미친 듯이 느려지는 경험&lt;/b&gt;을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 대부분의 원인은 코드가 아니라&lt;br /&gt;  &lt;b&gt;SQL이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제로 겪는 상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조회 API 하나가 5초 이상 걸림&lt;/li&gt;
&lt;li&gt;사용자가 몰리면 서버가 버벅거림&lt;/li&gt;
&lt;li&gt;같은 API인데 어떤 요청은 빠르고 어떤 건 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이쯤 되면 이런 생각 든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;서버가 문제인가&amp;hellip;?&amp;rdquo;&lt;br /&gt;&amp;ldquo;코드가 비효율적인가&amp;hellip;?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 진짜 원인은 따로 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인 1: 인덱스를 안 타는 쿼리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 가장 흔하고, 가장 치명적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB는 원래 &lt;b&gt;빠르게 찾으려고 인덱스&lt;/b&gt;를 쓴다.&lt;br /&gt;근데 쿼리를 잘못 짜면 인덱스를 못 탄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  대표적인 실수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE에 함수 사용&lt;/li&gt;
&lt;li&gt;컬럼 가공&lt;/li&gt;
&lt;li&gt;타입 불일치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;WHERE TO_CHAR(created_at) = '2026-03-30'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쓰는 순간&lt;br /&gt;  인덱스 무시 + 풀스캔&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인 2: 풀 테이블 스캔 (Full Scan)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 못 타면 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 전체를 다 뒤짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 많을수록 지옥&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 100만 건이면&lt;br /&gt;  100만 개를 다 읽는다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인 3: JOIN 남용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JOIN 자체가 문제는 아닌데&lt;br /&gt;잘못 쓰면 바로 성능 터진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  위험한 패턴&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 JOIN&lt;/li&gt;
&lt;li&gt;조건 없는 JOIN&lt;/li&gt;
&lt;li&gt;다대다 JOIN&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리 실행 시간 폭발&lt;/li&gt;
&lt;li&gt;메모리 사용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인 4: LIMIT 없이 조회&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 진짜 신입 때 많이 하는 실수&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM user_log
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 다 가져옴&lt;/li&gt;
&lt;li&gt;네트워크 + 메모리 낭비&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인 5: 실행 계획을 안 봄&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 이렇게 생각한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;쿼리 잘 돌아가니까 괜찮겠지&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 DB 입장에서는&lt;br /&gt;  &amp;ldquo;비효율적으로 열심히 돌고 있는 중&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  그래서 어떻게 해결하냐&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이렇게 한다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 실행 계획(EXPLAIN) 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 인덱스 타는지 확인&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. WHERE 조건 단순화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 컬럼 가공하지 않기&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 필요한 데이터만 조회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; SELECT * 금지&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 인덱스 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 조회 조건 기준으로 만들기&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 실무에서 바로 체감하는 변화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5초 &amp;rarr; 0.1초로 줄어듦&lt;/li&gt;
&lt;li&gt;서버 부하 감소&lt;/li&gt;
&lt;li&gt;사용자 체감 속도 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  진짜 체감 확 온다&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;백엔드는 코드보다 SQL이 성능을 좌우한다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드를 하다 보면 깨닫게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;코드는 잘 짰는데 왜 느리지?&amp;rdquo;&lt;br /&gt;  &amp;ldquo;아&amp;hellip; SQL이 문제였구나&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경험을 몇 번 겪으면&lt;br /&gt;자연스럽게 SQL부터 보게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>babytomato</author>
      <guid isPermaLink="true">https://tomatovibe.tistory.com/115</guid>
      <comments>https://tomatovibe.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 31 Mar 2026 09:09:06 +0900</pubDate>
    </item>
  </channel>
</rss>