<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>CUKU</title>
    <link>https://calicucu.tistory.com/</link>
    <description>6년차 백엔드개발자의 머릿속 끄집어내기</description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 18:27:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>얇피</managingEditor>
    <image>
      <title>CUKU</title>
      <url>https://tistory1.daumcdn.net/tistory/4357573/attach/2560a18ac50947c4b749946a2376ee06</url>
      <link>https://calicucu.tistory.com</link>
    </image>
    <item>
      <title>[ 인프런 ] 90%할인 이벤트 트래픽이슈에 대한 고찰(f.502 Bad Gateway)</title>
      <link>https://calicucu.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025.05.16 오전11시 인프런에서 강의 90%할인 쿠폰이 발행되는 이벤트가 열렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 강의 적용인지, 일부 강의 적용인지 모르는 상태에서 90% 할인이라는 키워드에 유저들이 몰렸고, 이벤트 오픈시각인 오전 11시 정각, 인프런 이벤트 페이지 접속은 마비되었다. (이때 인프런은 예쁜 502 Bad Gateway 에러 페이지를 보여주었다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250516_110213703.png&quot; data-origin-width=&quot;1607&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnX7ml/btsN0DpZWdi/sxGhnGaHl1DeAXAxuAkmnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnX7ml/btsN0DpZWdi/sxGhnGaHl1DeAXAxuAkmnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnX7ml/btsN0DpZWdi/sxGhnGaHl1DeAXAxuAkmnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnX7ml%2FbtsN0DpZWdi%2FsxGhnGaHl1DeAXAxuAkmnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1607&quot; height=&quot;877&quot; data-filename=&quot;KakaoTalk_20250516_110213703.png&quot; data-origin-width=&quot;1607&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜 트래픽을 쳐 내지 못했을까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런은 국내 1위 IT강의 플랫폼이고, 다양한 이벤트를 많이 진행하는 만큼 당연히 이벤트 트래픽에 대한 대비가 짱짱할거라 생각했다.&lt;br /&gt;하지만, 사전공유된 URL을 통해 이벤트 페이지에 접근했을때 나를 맞이하는건 예쁜 502 에러페이지였다. (ALB레벨에서 커스텀 502를 띄운 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기다림 끝에 11시 7분경이 되서야 이벤트 페이지는 열렸고, 쿠폰은 금세 소진되었다.&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인프런의 인프라&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런이 실제로 어떤 아키텍처를 가지고 있는지 구체적으로는 모르지만, node.js기반이라는것은 명확하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;(출처 &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://stackshare.io/inflab/inflearn&quot;&gt;https://stackshare.io/inflab/inflearn &lt;/a&gt;)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드밸런서를 두고, node.js (Express.js) 를 띄운 상태에서 RDB과 Redis로 데이터를 관리하는 구성이라고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 최근 대부분의 대규모 플랫폼이 그렇듯, 인프런 역시 컨테이너 기반의 쿠버네티스(Kubernetes) 환경 위에서 서비스를 운영 중일 가능성도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2025년 5월 16일 오후 11_45_01.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MtLDk/btsN2aNjPuy/SkibjejaIsWo7LGTRdeU31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MtLDk/btsN2aNjPuy/SkibjejaIsWo7LGTRdeU31/img.png&quot; data-alt=&quot;가상 아키텍처 흐름도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MtLDk/btsN2aNjPuy/SkibjejaIsWo7LGTRdeU31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMtLDk%2FbtsN2aNjPuy%2FSkibjejaIsWo7LGTRdeU31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;437&quot; data-filename=&quot;ChatGPT Image 2025년 5월 16일 오후 11_45_01.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가상 아키텍처 흐름도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 &amp;rarr; 중간계층서버 (Nginx 등) &amp;rarr; 백엔드 (API, DB) 구조에서 중간 계층 서버(ALB/Nginx)가 백엔드 인스턴스로부터 유효한 응답을 받지 못해 &lt;b&gt;502 Bad Gateway&lt;/b&gt;가 발생한 것으로 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 백엔드가 timeout 되었거나, 프로세스 자체가 실패했을 가능성을 의미한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;502 Bad Gateway의 원인 &lt;/b&gt;&lt;br /&gt;  네트워크 문제 &lt;br /&gt;  백엔드 서버가 트래픽 폭주로 느려져서 응답을 못하는 경우 &lt;br /&gt;  DB나 외부 API 호출이 지연되거나, 내부 timeout 설정이 너무 짧아 발생할 수도 있음.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오토스케일링을 했다는 가정하에, 오토스케일링만으로는 감당하지 못한 병목지점이 뭐가 있었을지 살펴보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; ❓ 오토스케일링이 있는데 왜?&lt;/b&gt;&lt;br /&gt;오토스케일링은 CPU/메모리 사용량이나 트래픽 수 기준으로 동작하는데, 서버 수는 늘어났지만, &lt;br /&gt;문제는 코드 또는 DB병목에 있는 경우에는 &lt;b&gt;병목만 복제한 꼴&lt;/b&gt;이 된다. &lt;br /&gt;즉, 병목 해결 전에는 아무리 서버 수를 늘려도 효과가 없다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;원인 추론&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A. 트래픽 폭증 &amp;rarr; 백엔드 컨테이너 crash 또는 리소스의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선착순 쿠폰이라는 특성상 수천~수만명이 동시에 이벤트 페이지를 접근했고, 그 순간 API 서버 또는 SSR 서버 컨테이너가 OOM으로 종료(OOM killed) 되었거나, CPU 한계에 도달했을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 트래픽 급증은 예측 가능했지만, Auto Scaling 정책이 CPU 기준이거나 1~2분 단위로 scale-out 되면 초기 수요를 감당하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 신규 컨테이너가 Auto Scaling 중인데 아직 준비가 안된 상태(Cold Start)에 요청이 몰리면, ALB는 준비되지않은 인스턴스로도 라우팅을 하며 502 에러가 발생했을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;스케일링 타이밍 문제&lt;/b&gt; 또는 미리 &lt;b&gt;warm-up&lt;/b&gt; 안했을 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. SSR 기반 페이지에서, 수천개의 요청이 API와 SSR 서버에 병렬로 도달&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 페이지의 핵심 구성은 간단하게 [쿠폰코드정보], [쿠폰등록 페이지 이동], [쿠폰 적용가능 강의 목록] 으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 페이지가 SSR으로 렌더링 된다고 가정했을 때, &lt;b&gt;SSR 구조는 트래픽 급증에 매우 민감한 구조&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSR은 트래픽을 유저 브라우저로 분산시키지만, SSR은 트래픽이 많아질 수록 요청마다 서버가 동적으로 HTML을 생성해야하므로 위험하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 되는 이벤트 페이지는, 페이지 구조상 최소 2개 이상의 API가 병렬로 호출될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 가장 병목이 많이 발생할 수 있는 요소가 쿠폰 적용가능한 강의 목록이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 목록은 필터링/정렬이 포함된 복잡한 쿼리이고, 수천명이 동시에 같은 SSR 코드를 실행하면서 DB 또는 SSR 서버에 부하가 발생했을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Prisma ORM으로 구현되었다면, 쿼리 튜닝이 안된 경우 성능저하가 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR 프로세스가 응답을 반환하지 못하고 timeout 발생되었다면, ALB는 응답이 없는 백엔드 인스턴스에 대해 502 Bad Gateway를 반환할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. 캐싱 미비 또는 캐시 히트율 저하&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 페이지는 수천 명이 동일한 태그 기반 강의 목록을 요청하게 되므로, 캐싱이 적절하게 구성되어있지 않으면 모든 요청이 DB까지 도달하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;강의 리스트가 14개뿐인데 굳이 Redis가 필요한가?&amp;rdquo; 라고 판단하여 캐시를 생략할 경우, 트래픽이 폭발하는 상황에서는 단순 쿼리조차 병목을 유발할 수 있다. 이는 쿼리 복잡도와 무관하게 &lt;b&gt;요청 수의 문제&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis 또는 메모리 캐시가 없거나 TTL(Time-To-Live)이 짧은 경우, SSR이 요청될 때마다 DB에 직접 접근하게 되며, 캐시 히트율이 급격히 저하된다. 그 결과, 동일한 쿼리가 반복적으로 DB에 도달하게 되고, 이는 곧 병목 현상을 가속시키는 원인이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 캐싱 히트율은 트래픽이 많을수록 더 떨어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에는 95% 수준의 히트율이 유지되더라도, 이벤트 시점엔 수만 건의 요청이 캐시 생성 이전이나 TTL 만료 직후에 동시에 유입되면, 대부분의 요청이 캐시 미스가 되고 DB에 직접 접근하게 된다.&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;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D. 기타 (가능성 낮음)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SSR 에러 핸들링 누락
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 호출/ DB 조회 실패 시, Try/Catch 없이 그대로 예외 발생&lt;/li&gt;
&lt;li&gt;&amp;rarr; 이 예외가 서버로그로만 남고, 클라이언트에는 HTTP오류로 전파&lt;/li&gt;
&lt;li&gt;Next.js는 명시적 에러핸들링이 없으면 서버 자체가 응답을 종료함.&lt;/li&gt;
&lt;li&gt;&amp;rarr; ALB/Nginx는 이 상태를 502 Bad Gateway 로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB인덱스 누락 or 비효율 쿼리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prisma ORM 사용 시, join + where + orderBy 조합이 자동쿼리로 만들어질 경우 성능이 급격히 저하될 수 있음&lt;/li&gt;
&lt;li&gt;특정 시점의 과도한 필터 쿼리로 인한 slow query 다발 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALB Target 그룹 설정 문제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALB가 unhealty instance에 트래픽을 계속 보내거나,&lt;/li&gt;
&lt;li&gt;readiness check 없이 트래픽이 전달될 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; backend가 준비되지않아 502 에러 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rArr; 신규 인스턴스 scale-out 시점에서 발생할 수 있는 설정 이슈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;원인별 해결방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런은 약 7분만에 이벤트 페이지를 정상적으로 출력되도록 복구했다. 어떻게 해결했을 지 유추해보자.&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A. 컨테이너 Crash/ 리소스 한계 &amp;rarr; 사전 Prewarming과 정밀 Auto Scaling 조건 도입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 고트래픽 이벤트에 대비하기 위해서는 Auto Scaling 정책을 단순한 CPU 사용률 외에도 응답시간, 큐 적체 등 다양한 지표 기반으로 정교하게 구성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이벤트 시작전에는 인스턴스를 미리 준비시켜 놓은 Prewarm전략이 반드시 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 Cold Start 상태의 인스턴스가 요청을 받지 않도록 하고, ALB 타겟 그룹에 등록되기 전 readiness probe를 통과한 인스턴스만을 라우팅 대상으로 설정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. SSR구조에서 API병렬 요청 과부하 &amp;rarr; CSR전환 또는 SSR내 API호출 최소화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 페이지는 본질적으로 실시간 데이터 변경이 거의 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 SSR의 이점 (SEO, 유저맞춤 렌더링 등)을 굳이 유지할 필요가 없으므로, 이런 페이지는 SSR로 유지할 이유보다 SSR로 인한 병목비용이 더 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한 한 CSR기반으로 분리하고 사용자 진입만 SSR, 주요 데이터는 클라이언트 fetch로 처리하도록 하는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 CSR전환이 어려운 상황이라면, SSR에서 병렬로 요청되는 API들을 하나로 병합하여 병렬 API요청 수를 줄이는 것도 하나의 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드에서 요청 수가 많아질 수록 서버가 동시에 처리해야하는 작업량이 급증하므로, 프론트에서 여러 API를 호출하는게 아니라 하나의 API 요청을 하면 백엔드 서버내부에서 여러 데이터를 준비해서 단일 응답으로 전달해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청은 1회, DB 쿼리는 병렬로 처리되므로 전체 응답 시간이 최적화 된다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;// 병합 API 내부 예시
const [coupon, user, courses] = await Promise.all([
  prisma.coupon.findUnique({ where: { code } }),
  prisma.user.findUnique({ where: { id: userId } }),
  prisma.course.findMany({
    where: { tags: { some: { name: tag } }, isPublished: true },
    orderBy: { createdAt: 'desc' },
    take: 10,
  }),
])

return { coupon, user, courses }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. 캐싱 미비 또는 캐시 히트율 저하&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. TTL 랜덤성 부여&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis의 TTL이 짧게 고정되어있으면, TTL의 만료시점에 갑자기 많은 요청이 캐시미스를 일으켜 DB로 몰리는 cache stampede (캐시폭탄현상)이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이벤트 시작 직전에 TTL이 만료되면 수천명의 요청이 모두 DB로 쏟아지기 때문에 TTL은 고정값 대신 짧은 범위의 랜덤성을 부여하여 캐시 만료 타이밍을 분산시키는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 60초&amp;plusmn;5초 범위로 설정하면 트래픽이 한 순간에 DB로 몰리는 것을 완화할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;2. 캐시 Prewarming&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 요청이 있을때만 캐시가 채워지는 구조이기 때문에, 이벤트 시작 시 모든 유저의 첫 요청이 동시에 캐시를 비우고 DB를 호출하게 된다. 이 경우 DB병목은 Redis가 있어도 그대로 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이벤트 시작 5~10분 전에 주요 요청 키에 대한 데이터를 강제로 Redis에 저장하는 Prewarming 로직을 운영툴 또는 CI/CD 파이프라인에 포함시키는 것이 좋다. 이렇게 하면 트래픽이 몰리기 전에 캐시가 준비되고, 대부분의 요청이 Redis에서 응답될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 캐시 미스 시, graceful fallback 전략 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시가 없으면 DB에서 데이터를 조회하되, 실패한 경우에는 빈 리스트나 기본 응답을 반환하고, 응답실패시에도 SSR이 완전히 무너지지 않도록 구성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) SSR내에서 try/catch를 통해 예외가 나도 fallback props를 전달하도록 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Redis 클라이언트 설정 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis 클라이언트 설정이 잘못되어 연결 수 제한, timeout 설정부족, 재시도 무한루프등으로 Redis 자체가 부하의 병목점이 되거나 응답 실패가 전파될 수 있다. Redis 클라이언트를 사용할 때는 다음 설정을 반드시 명시해야한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결 timeout (ex. 3000ms)&lt;/li&gt;
&lt;li&gt;최대 시도 수 (ex. 3회)&lt;/li&gt;
&lt;li&gt;Offline queue 비활성화 (enableOfflineQueueL false)&lt;/li&gt;
&lt;li&gt;커넥션 풀 설정 (Redis Sentinel, Cluster일 경우는 pool 또는 pipeline활용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 결과라도 캐시 미비는 병목을 유발할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 크기가 작더라도, 동일 쿼리가 반복적으로 요청되는 경우는 Redis에 저장해야한다. 이때는 Redis를 정적 컨텐츠 저장소처럼 사용하는 개념이며, SSR 또는 API 병목을 분산시킬 수 있는 중요한 수단이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(참고 &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://toss.tech/article/cache-traffic-tip&quot;&gt;https://toss.tech/article/cache-traffic-tip&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이슈가 발생한 시점, 누구는 11시 이벤트를 통해 부하테스트를 해본것 아니냐고 우스갯소리를 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;라이브서버에 어떻게 실데이터 부하테스트를 해볼 수 있을까 하고&amp;lsquo; 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브서비스를 운영해본 개발자라면 이 말이 얼마나 무모하고 위험한 농담인지 잘 알것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오전 짧은 시간동안, 나는 한명의 인프런 유저로서 502에러를 맞닥뜨렸고, 동시에 백엔드 개발자로서 그 원인을 곱씹어 볼 필요가 있겠다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 페이지에 수많은 유저가 몰렸고, 아마도 서버 어딘가에서 병목이 생겼을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR구조였을까? 캐시가 준비되지 않았던걸까? 내가 모르는 인프라나 예상치 못한 지점에서 문제가 생긴 것일 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 작성하며 내 머릿속에 있던 병목 현상의 원인을 하나하나 꺼내봤고, 가능한 해결 방안에 대해서도 나름대로 열심히 고민해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++ 생각보다 블로그 글 쓰는데 굉장히 오래걸린다는 걸 알았다. AI와 함께하는데도, 내 생각을 글로 정리해서 쓰는 일이 이렇게나 어려운 줄 몰랐다. &lt;/p&gt;</description>
      <category>실무 경험 &amp;amp; 회고/운영 회고 &amp;amp; 설계 인사이트</category>
      <category>inflearn</category>
      <category>redis</category>
      <category>server</category>
      <category>병목</category>
      <category>이벤트</category>
      <category>이슈</category>
      <category>인프런</category>
      <category>트래픽</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/40</guid>
      <comments>https://calicucu.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 17 May 2025 14:35:40 +0900</pubDate>
    </item>
    <item>
      <title>[MYSQL] ON 조건(KEY) 없이 JOIN하기(더미데이터 생성)</title>
      <link>https://calicucu.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* mysql 성능테스트를 위해 A&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;테이블 row당 B 테이블의 전체 데이터를 붙여서 더미데이터를 만들고 싶은데 두 테이블 간 JOIN 할 키가 없어서 고민함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;- ex. &lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Employee&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; 50row |&amp;nbsp; &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Memeber&lt;/b&gt; 2,000row =&amp;gt; &lt;b&gt;&lt;span&gt;duplicateM&lt;/span&gt;ember &lt;/b&gt;100,000row를 만들고 싶은 것 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join 시 where 과 같은역할을 하는 조건절인 ON없이 join을 진행하고자 함.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SELECT * FROM Member &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;LEFT OUTER JOIN Employee &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ON 1=1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JOIN 을 진행하고 싶은데 ON조건으로 걸만한 키가 없는 경우 모든 값을 JOIN 하는 방식으로 결합할 수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 그러나 위와 같은 방법으로 데이터를 조합하는 경우, 각 테이블의 데이터가 많다면(ex. row)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;too many connections 에러(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mysql에 연결된 클라이언트의 수가 일정수치 이상인 경우 나타나는 에러메시지)&lt;/span&gt;가 발생할 수 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;( 쿼리 실행이 오래 걸리면 커넥션이 닫히지 않고 남아 있게 되고, 이게 누적되면 Too many connections )&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 간단하게 더미데이터를 만들고자 위와같은 짓을 했지만 좀 무식한 방법이니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차라리 join하고자 하는 A테이블 데이터 값을 가져와서 B테이블 데이터만큼 while문으로 select insert 하도록 프로시저나 코드를 짜는 것을 추천&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터 &amp;amp; 저장소/데이터 설계 &amp;amp; 운영</category>
      <category>join</category>
      <category>key없이</category>
      <category>MySQL</category>
      <category>on조건</category>
      <category>조인</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/24</guid>
      <comments>https://calicucu.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 10 May 2021 19:32:39 +0900</pubDate>
    </item>
    <item>
      <title>[php] php5.x -&amp;gt; php7.x로 업그레이드 시, 확인해야할 사항</title>
      <link>https://calicucu.tistory.com/22</link>
      <description>&lt;p&gt;1. 오류 확인 위해 에러리포팅 필수&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. mysql -&amp;gt; mysqli&lt;/p&gt;
&lt;p&gt;mysql 관련 코드가 너무 많은데다 흩뿌려져있어서 mysqli로 일괄 변경하려니 도저히 엄두가 나지않음.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mysql 코드를 유지할 수 있는 좋은 코드를 발견하여 require하여 사용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. use of undefined constant 관련 (배열) &lt;br /&gt;php&amp;nbsp;5.x에는&amp;nbsp;$arr[id]='admin';&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;''문자&amp;nbsp;생략해도&amp;nbsp;문제가&amp;nbsp;없었는데&amp;nbsp; &lt;br /&gt;7버전에서는&amp;nbsp;인수부분을&amp;nbsp;따옴표로&amp;nbsp;묶지않으면&amp;nbsp;상수로&amp;nbsp;인식하여&amp;nbsp;경고를&amp;nbsp;표시함.&amp;nbsp; &lt;br /&gt;따라서&amp;nbsp;배열&amp;nbsp;인수부분을&amp;nbsp;따옴표로&amp;nbsp;묶어줘야함.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. Magic Quotes 관련 (get_magic_quotes_gpc()) &lt;br /&gt;get_magic_quotes_gpc()&amp;nbsp;:&amp;nbsp;데이터를&amp;nbsp;전송할때,&amp;nbsp;(따옴표가&amp;nbsp;들어가서&amp;nbsp;db저장&amp;nbsp;시&amp;nbsp;문제생기는&amp;nbsp;것을&amp;nbsp;방지하기위해)&amp;nbsp;php에서&amp;nbsp;(서버&amp;nbsp;config)역슬래시를&amp;nbsp;넣어주는&amp;nbsp;기능이&amp;nbsp;있음.&amp;nbsp;해당&amp;nbsp;기능이&amp;nbsp;켜져있는지&amp;nbsp;확인&amp;nbsp;후,&amp;nbsp;켜저있으면&amp;nbsp;역슬래시를&amp;nbsp;제거(stripslashes)하는&amp;nbsp;역할로&amp;nbsp;사용함.&amp;nbsp;//&amp;nbsp;stripslashes와&amp;nbsp;세트로&amp;nbsp;사용&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-&amp;gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;PHP 5.4.0부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;제거되어 해당&lt;span style=&quot;color: #333333;&quot;&gt;Magic Quotes 관련 함수 사용 시, 오류발생&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 변수관련 선언 및 사용 (에러리포팅 notice) &lt;br /&gt;Undefined&amp;nbsp;variable&amp;nbsp;:&amp;nbsp;해당&amp;nbsp;변수의&amp;nbsp;초기값이&amp;nbsp;설정되어있지&amp;nbsp;않을&amp;nbsp;때&amp;nbsp;notice &lt;br /&gt;Undefined&amp;nbsp;index&amp;nbsp;:&amp;nbsp;미리&amp;nbsp;선언하지않은&amp;nbsp;변수를&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;notice &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. count 관련 오류&amp;nbsp;&lt;/p&gt;</description>
      <category>실무 경험 &amp;amp; 회고/운영 회고 &amp;amp; 설계 인사이트</category>
      <category>php</category>
      <category>php update</category>
      <category>php5.4</category>
      <category>php7</category>
      <category>Update</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/22</guid>
      <comments>https://calicucu.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 29 Apr 2021 22:42:57 +0900</pubDate>
    </item>
    <item>
      <title>[git] 깃 허브 이슈 삭제하는 방법</title>
      <link>https://calicucu.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gitHub 이슈 삭제하려고 보니 삭제루트가 바로 보이지않아 남겨놓는 글임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 삭제하고자 하는 이슈 글의 상세페이지로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 페이지 우측 하단에 보면 [Delete issue] 버튼이 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4mGTC/btq0TvlyvkS/KK6lQamP4lzf5baHYonep1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4mGTC/btq0TvlyvkS/KK6lQamP4lzf5baHYonep1/img.png&quot; data-alt=&quot;페이지 우측하단에 issue 삭제하는 버튼이 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4mGTC/btq0TvlyvkS/KK6lQamP4lzf5baHYonep1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4mGTC%2Fbtq0TvlyvkS%2FKK6lQamP4lzf5baHYonep1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;페이지 우측하단에 issue 삭제하는 버튼이 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Delete issue 클릭 후, 이슈 삭제 확인창에서 삭제버튼 클릭하면 해당 이슈 글이 삭제됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/em6GCZ/btq0UcMRnlD/WajkoGXK0EsmHbAQ8qjjWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/em6GCZ/btq0UcMRnlD/WajkoGXK0EsmHbAQ8qjjWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/em6GCZ/btq0UcMRnlD/WajkoGXK0EsmHbAQ8qjjWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fem6GCZ%2Fbtq0UcMRnlD%2FWajkoGXK0EsmHbAQ8qjjWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 참고 : issue 삭제는 해당 issue 생성자만 삭제가능함. 공동작업자는 &lt;span style=&quot;color: #333333;&quot;&gt;Delete issue 버튼자체가 표시되지않음.&lt;/span&gt;&lt;/p&gt;</description>
      <category>도구 &amp;amp; 자동화/버전 관리 &amp;amp; 협업</category>
      <category>Git</category>
      <category>GitHub</category>
      <category>깃이슈</category>
      <category>깃이슈삭제</category>
      <category>이슈</category>
      <category>이슈삭제</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/18</guid>
      <comments>https://calicucu.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 24 Mar 2021 13:57:25 +0900</pubDate>
    </item>
    <item>
      <title>[VsCode] 파일의 특정 확장자 인식방법</title>
      <link>https://calicucu.tistory.com/16</link>
      <description>&lt;p&gt;&lt;span&gt;ini, kbp &lt;/span&gt;파일 등 비주류파일은 하이라이팅이 되지않아 코드읽기가 어려움&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;위 파일확장자를 인식하게끔 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8r41/btq0kECHeSP/F1HTdAh1jCqtRcJ7KQp2bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8r41/btq0kECHeSP/F1HTdAh1jCqtRcJ7KQp2bK/img.png&quot; data-alt=&quot;vscode에서 inc 열었을 때, 하이라이팅이 되지않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8r41/btq0kECHeSP/F1HTdAh1jCqtRcJ7KQp2bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8r41%2Fbtq0kECHeSP%2FF1HTdAh1jCqtRcJ7KQp2bK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode에서 inc 열었을 때, 하이라이팅이 되지않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. 설정하기 (Ctrl+,)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lI62L/btq0jOevusn/SnylvMwenkb0mGjxLBqC7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lI62L/btq0jOevusn/SnylvMwenkb0mGjxLBqC7k/img.png&quot; data-alt=&quot;vscode&amp;amp;amp;nbsp; 좌측 하단의 설정 아이콘 클릭&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lI62L/btq0jOevusn/SnylvMwenkb0mGjxLBqC7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlI62L%2Fbtq0jOevusn%2FSnylvMwenkb0mGjxLBqC7k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode&amp;nbsp; 좌측 하단의 설정 아이콘 클릭&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. &lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;file associations&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;검색&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;항목 추가&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;파일 언어 추가&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 항목: 추가하고자 하는 파일 확장자 입력&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 값 : 인식하고자 하는 파일 확장자 입력&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmAf0/btq0kEbDFHy/SqY8zmHZTv5zh3Hlm6Vt5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmAf0/btq0kEbDFHy/SqY8zmHZTv5zh3Hlm6Vt5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmAf0/btq0kEbDFHy/SqY8zmHZTv5zh3Hlm6Vt5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtmAf0%2Fbtq0kEbDFHy%2FSqY8zmHZTv5zh3Hlm6Vt5k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8jfJH/btq0fldkCVm/aBPUyBvo5ipo3QjOp4XpX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8jfJH/btq0fldkCVm/aBPUyBvo5ipo3QjOp4XpX0/img.png&quot; data-alt=&quot;지원하지 않는 확장자를 입력하여 등록할 수 있음 .&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8jfJH/btq0fldkCVm/aBPUyBvo5ipo3QjOp4XpX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8jfJH%2Fbtq0fldkCVm%2FaBPUyBvo5ipo3QjOp4XpX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지원하지 않는 확장자를 입력하여 등록할 수 있음 .&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. &lt;/span&gt;확인&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- &lt;/span&gt;설정 후&lt;span&gt;, vscode&lt;/span&gt;를 다시켜보면 인식되지않았던 파일이&lt;span&gt; php&lt;/span&gt;로 인식되어 하이라이팅 기능이 적용된 것을 확인할 수 있음&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnlBJw/btq0jOr1ncU/E95ugIHKyd2QJuA6X8HU1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnlBJw/btq0jOr1ncU/E95ugIHKyd2QJuA6X8HU1K/img.png&quot; data-alt=&quot;하이라이팅 적용됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnlBJw/btq0jOr1ncU/E95ugIHKyd2QJuA6X8HU1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnlBJw%2Fbtq0jOr1ncU%2FE95ugIHKyd2QJuA6X8HU1K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하이라이팅 적용됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>도구 &amp;amp; 자동화/개발도구</category>
      <category>associations</category>
      <category>vscode</category>
      <category>비주얼스튜디오</category>
      <category>파일확장자</category>
      <category>하이라이팅</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/16</guid>
      <comments>https://calicucu.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 17 Mar 2021 09:35:37 +0900</pubDate>
    </item>
    <item>
      <title>AWS 이메일 구독 취소하기 (aws 마케팅 메일 수신거부)</title>
      <link>https://calicucu.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;aws 계정을 생성하여 사용하는데, aws 이용방법 안내 등 정기적으로 마케팅 메일이 날아옴.&amp;nbsp;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pages.awscloud.com/communication-preferences&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pages.awscloud.com/communication-preferences&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614907360461&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;company&quot; data-og-title=&quot;San Francisco Loft&quot; data-og-description=&quot;Enhance your business acumen and accelerate the growth of your startup through live webinars, workshops, how-to sessions, and many more features that we will continue to roll out. Join us for monthly events featuring local founders, investors, and innovato&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://pages.awscloud.com/communication-preferences&quot; data-og-url=&quot;https://aws.amazon.com/start-ups/loft/sf-loft/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/756VX/hyJsbDEwKr/qUCqS9kFwYWCqmOAMLm7j0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/doCTs8/hyJtNVtgYk/SddvaKmv0Q3AOPsZnHKQ20/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109&quot;&gt;&lt;a href=&quot;https://pages.awscloud.com/communication-preferences&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pages.awscloud.com/communication-preferences&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/756VX/hyJsbDEwKr/qUCqS9kFwYWCqmOAMLm7j0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/doCTs8/hyJtNVtgYk/SddvaKmv0Q3AOPsZnHKQ20/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;San Francisco Loft&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Enhance your business acumen and accelerate the growth of your startup through live webinars, workshops, how-to sessions, and many more features that we will continue to roll out. Join us for monthly events featuring local founders, investors, and innovato&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구독취소하려면 위 링크로 들어간 후, 로그인하여 &quot;이메일 수신거부&quot; 버튼을 클릭&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 수신거부할 이메일 주소 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 구독할 유형만 선택하여 저장하거나, 페이지 하단의 &quot;모든 마케팅 이메일 수신 거부&quot; 를 체크하여 전체 마케팅 수신거부하면 됨.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MrVtR/btqZSwe9PIo/1fH347MdgJMYM41tIt0qr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MrVtR/btqZSwe9PIo/1fH347MdgJMYM41tIt0qr1/img.png&quot; data-alt=&quot;&amp;quot;모든 마케팅 이메일 수신 거부&amp;quot; 를 체크한 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MrVtR/btqZSwe9PIo/1fH347MdgJMYM41tIt0qr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMrVtR%2FbtqZSwe9PIo%2F1fH347MdgJMYM41tIt0qr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;모든 마케팅 이메일 수신 거부&quot; 를 체크한 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;* 마케팅 메일구독을 취소하더라도 &lt;span&gt;월 대금 청구서가 발행되거나, 이용하는 서비스 중에서 기능이나 요금 변동이 있는 경우에는 이메일이 발송됨.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>서버 &amp;amp; 클라우드/설정 가이드</category>
      <category>AWS</category>
      <category>aws mail</category>
      <category>aws 광고메일</category>
      <category>구독취소</category>
      <category>아마존</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/12</guid>
      <comments>https://calicucu.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 5 Mar 2021 10:39:45 +0900</pubDate>
    </item>
    <item>
      <title>[php] mysql 커넥션 관련 에러 (feat.삽질)</title>
      <link>https://calicucu.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;include db_conn.php //&amp;nbsp;A서버&amp;nbsp;db커넥션&amp;nbsp;파일&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 1개 이상의 DB 커넥션 사용 시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- php는 기본적으로 열려있는 페이지가 닫히면 mysql_close 하지않아도 connection이 끊어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A, B 커넥션을 선언해놓고 B 커넥션을 &lt;span style=&quot;color: #333333;&quot;&gt;mysql_close() 했다고 하더라도 선언된 커넥션이 없어진게 아니기때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 실행 시, 사용할 커넥션을 명시해줘야함&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;#&amp;nbsp;커넥션&amp;nbsp;명시하지않았을&amp;nbsp;경우&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;오류&amp;nbsp;발생&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Warning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in /home/aaa/www/html/03/bbb.php on line 515&lt;br /&gt;&lt;br /&gt;Warning: mysql_query(): A link to the server could not be established in /home/aaa/www/html/03/bbb.php&amp;nbsp;on&amp;nbsp;line&amp;nbsp;515&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 에러코드로 구글링하니 mysqli를 안써서 그렇다, &lt;span&gt;mysql_query('SET NAMES utf-8')를 사용해봐라 등등 다양한 답변들이 있었음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 결국 쿼리실행할 주체를 못찾았던 것&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #333333;&quot;&gt;=&amp;gt; 한페이지 내에서 (include 포함) 1개 이상의 커넥션이 있으면 sql 쿼리 사용 시, 무조건 커넥션을 명시해줘야함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. mysql_select_db 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[개요] 아래와 같이 db_conn을 하고 select 쿼리를 날렸는데 쿼리 실행이 되지않음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;- 아래 코드에서 커넥션 제대로 됐고/ insert 문은 실행되는데 select문만 실행되지않는다고 삽질을 시작함.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHW3ie/btqUOCqrqBw/zKpvkpAJfTo6F9jug0w7z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHW3ie/btqUOCqrqBw/zKpvkpAJfTo6F9jug0w7z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHW3ie/btqUOCqrqBw/zKpvkpAJfTo6F9jug0w7z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHW3ie%2FbtqUOCqrqBw%2FzKpvkpAJfTo6F9jug0w7z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;285&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&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;gt; 쿼리에 'db명.컬럼명' 으로 쓸것아니면 커넥션 부분에 &lt;i&gt;mysql_select_db(&quot;db명&quot;,$Conn_2);&lt;/i&gt; 정도는 하자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(+ 쿼리에 DB명 붙이는것은 비추 //한 코드로 여러 서비스를 할 경우 피본다)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Mysqli 변경문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 예전 소스는 mysql_ 으로 모든 함수를 사용했으나 php5이상은 mysql 익스텐션은 지원하지않으므로 mysqli_ 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;span style=&quot;color: #333333;&quot;&gt;참고url :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.nhn?blogId=sunrc&amp;amp;logNo=221211680619&amp;amp;proxyReferer=https:%2F%2Fwww.google.com%2F&quot;&gt;m.blog.naver.com/PostView.nhn?blogId=sunrc&amp;amp;logNo=221211680619&amp;amp;proxyReferer=https:%2F%2Fwww.google.com%2F&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 변경방법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 소스에서 &lt;span style=&quot;color: #333333;&quot;&gt;mysql_...을 mysqli_...으로 일괄 &lt;/span&gt;replace를 하면 잘못된 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇백개의 오류가 발생하고 디버깅이 어려우므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mysql_ ...&lt;/span&gt;내장함수를 사용자 정의함수로 변경하여 일괄처리해야 오류발생 시,&amp;nbsp; try/catch가 가능함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql_... -&amp;gt; $new_mysql_... 으로 변경 후, 해당 함수에서 오류처리해야함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>실무 경험 &amp;amp; 회고/트러블슈팅 리포트</category>
      <category>Connection</category>
      <category>DB connection</category>
      <category>MySQL</category>
      <category>mysqli</category>
      <category>mysql_select_db</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/9</guid>
      <comments>https://calicucu.tistory.com/9#entry9comment</comments>
      <pubDate>Tue, 26 Jan 2021 16:14:23 +0900</pubDate>
    </item>
    <item>
      <title>지원중단된 어도비 플레이어 실행방법 (2021년ver)</title>
      <link>https://calicucu.tistory.com/8</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Adobe는 2020년 12월 31일 이후로 Flash Player 지원을 중단하고 2021년 1월 12일부터 Flash Player에서 Flash 콘텐츠의 실행을 차단했습니다. 모든 사용자가 Flash Player를 즉시 제거하여 시스템을 보호할 것을 권장합니다.&lt;/blockquote&gt;
&lt;p&gt;[개요] 오래된 웹사이트 중 어도비 플래시 사용하는 웹사이트의 플래시를 배너이미지로 변경요청&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기존 플래시가 어떤컨텐츠였는지 확인위해 접속했으나 지원 중단 및 컨텐츠 실행 차단하여 기존 컨텐츠 확인불가&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[목적] 기존 플래시 실행 및 확인&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[내용]&amp;nbsp;pc 시간을 2020으로 수동 설정 후 확인&lt;/p&gt;
&lt;p&gt;&amp;nbsp;1. 작업 표시줄 우측하단 시계 우클릭&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2kWnE/btqY2tqI3VI/BrUQ0Fy4HMbUN0HB3UCm1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2kWnE/btqY2tqI3VI/BrUQ0Fy4HMbUN0HB3UCm1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2kWnE/btqY2tqI3VI/BrUQ0Fy4HMbUN0HB3UCm1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2kWnE%2FbtqY2tqI3VI%2FBrUQ0Fy4HMbUN0HB3UCm1k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 수동으로 2020년으로 날짜 설정&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;날짜 및 시간 -&amp;gt; [자동으로 시간 설정] 끄기 -&amp;gt; [수동으로 날짜 및 시간 설정] 변경 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mAYOx/btqY9Zou5xx/KEMy2jwj20sdbo24xTPIK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mAYOx/btqY9Zou5xx/KEMy2jwj20sdbo24xTPIK0/img.png&quot; data-alt=&quot;* 너무 먼 과거로 설정하면 크롬에서 웹페이지를 막으니 몇달전으로 설정할 것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mAYOx/btqY9Zou5xx/KEMy2jwj20sdbo24xTPIK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmAYOx%2FbtqY9Zou5xx%2FKEMy2jwj20sdbo24xTPIK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;* 너무 먼 과거로 설정하면 크롬에서 웹페이지를 막으니 몇달전으로 설정할 것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 설정 저장 후, 해당 페이지 접속하여 플래시 팝업 차단 풀고 진행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[comment]&lt;/p&gt;
&lt;p&gt;- 위 방법은 기존 플래시 확인용임.&lt;/p&gt;
&lt;p&gt;- 익스플로러 브라우저를 제외한 브라우저(크롬,웨일,엣지 등)는 수동으로 변경한 시간대가 현재시간과 차이가 크면 웹사이트 접속을 차단하므로 익스플로러에서 확인하는것을 추천&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 오래된 웹사이트 중 플래시 사용하는 사이트가 있는지 점검해볼 것&amp;nbsp;&lt;/p&gt;</description>
      <category>Etc</category>
      <category>Adobe</category>
      <category>Adobe Flash</category>
      <category>어도비</category>
      <category>플래시 실행</category>
      <category>플래시 플레이어</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/8</guid>
      <comments>https://calicucu.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 21 Jan 2021 11:58:58 +0900</pubDate>
    </item>
    <item>
      <title>[Mysql] csv데이터 import 시, 필드 데이터 외에 빈 공백을 제거하는 방법</title>
      <link>https://calicucu.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;* 엑셀 데이터에서 데이터외에 앞/뒤 공백이 있어 import 후 where로 해당 데이터가 검색되지 않는 경우가 있음.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;csv 데이터 이전 시, 필요한 데이터 외에 빈 공백(보이지않는 특수문자/공백)을 제거하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;1. csv에서 데이터 전처리 후, import&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;- &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;엑셀 &lt;span&gt;trim&lt;/span&gt;함수 또는&lt;span&gt;&amp;nbsp;clean&lt;/span&gt;함수 사용하여 공백 제거&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2. &lt;span style=&quot;color: #333333;&quot;&gt;mysql import&lt;/span&gt;&amp;nbsp;후, &lt;/span&gt;&lt;span&gt;replace하여 일괄 update처리 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style3&quot;&gt;UPDATE 테이블 명 SET 컬럼명 = REPLACE(컬럼명, '찾을 문자열', '변경할 문자열');&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 공백 제거&amp;nbsp;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style2&quot;&gt;UPDATE 테이블 명 SET 컬럼명 = trim(컬럼명);&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 개행문자 제거&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;UPDATE&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;테이블 명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;SET&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;span style=&quot;color: #666666;&quot;&gt;REPLACE&lt;/span&gt;(&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;/span&gt;, '\r\n', '');&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;3) 탭 제거&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;UPDATE&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;테이블 명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;SET&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;span style=&quot;color: #666666;&quot;&gt;REPLACE&lt;/span&gt;(&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;/span&gt;,&lt;span&gt; &lt;/span&gt;char(9),&lt;span&gt;&amp;nbsp;&lt;/span&gt;'');&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;4) 라인피드 제거 (줄바꿈 &lt;span style=&quot;color: #000000;&quot;&gt;\n&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;UPDATE&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;테이블 명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;SET&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;span style=&quot;color: #666666;&quot;&gt;REPLACE&lt;/span&gt;(&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;/span&gt;,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;char(10),&lt;span&gt;&amp;nbsp;&lt;/span&gt;'');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;5) 캐리지리턴 제거 (줄바꿈 &lt;span style=&quot;color: #000000;&quot;&gt;\r&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;UPDATE&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;테이블 명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;SET&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;span style=&quot;color: #666666;&quot;&gt;REPLACE&lt;/span&gt;(&lt;span style=&quot;color: #666666;&quot;&gt;컬럼명&lt;/span&gt;,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;char(13),&lt;span&gt;&amp;nbsp;&lt;/span&gt;'');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;3. 엑셀 및 sql에서 데이터 공백 제거처리했는데도 빈공백이 남아있는 경우&lt;span style=&quot;color: #333333;&quot;&gt;(보이지 않는 특수문자)&lt;/span&gt;가 있을 때, 처리방법 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;1) &lt;/span&gt;해당 &lt;span&gt;csv&lt;/span&gt;파일을 에디터로 열어서 공백이 어떤 문자열인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- &lt;/span&gt;해당&lt;span&gt; csv&lt;/span&gt;파일을&lt;span&gt; vscode&lt;/span&gt;로 열어서 문제되는 공백 드래그하여 검색&lt;span&gt;(ctrl+h)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- 아래 &lt;/span&gt;예시 데이터의 공백은 스페이스공백과 다른 빈 문자열임&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ZksH/btqPNyeTv9i/DJmZUMV7N65dz9zNEl8wt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ZksH/btqPNyeTv9i/DJmZUMV7N65dz9zNEl8wt0/img.png&quot; data-alt=&quot;같은 공백처럼 보이지만 문제되는 공백 검색 시, 스페이스는 검색되지않음을 알 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ZksH/btqPNyeTv9i/DJmZUMV7N65dz9zNEl8wt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ZksH%2FbtqPNyeTv9i%2FDJmZUMV7N65dz9zNEl8wt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;같은 공백처럼 보이지만 문제되는 공백 검색 시, 스페이스는 검색되지않음을 알 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 처리방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;A. vscode&lt;/span&gt;에서 전체 바꾸기(Ctrl+&amp;lt;Alt&amp;gt;+Enter) 처리하여 해당 공백을 &lt;span&gt;&amp;lsquo;&amp;rsquo;&lt;/span&gt;으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;B. &lt;/span&gt;해당 공백을 그대로 복사하여&lt;span&gt; php &lt;/span&gt;문자열 치환처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; $empty_txt=str_replace(&lt;b&gt;&quot; &quot;&lt;/b&gt;,&quot;&quot;,$&lt;span style=&quot;color: #333333;&quot;&gt;empty_txt&lt;/span&gt;);&amp;nbsp; //(공백처럼 보이지만) vscode&lt;/span&gt;에서 복사한 문자열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터 &amp;amp; 저장소/데이터 설계 &amp;amp; 운영</category>
      <category>csv import</category>
      <category>MySQL</category>
      <category>php</category>
      <category>replace</category>
      <category>str_replace</category>
      <category>가져오기</category>
      <category>공백</category>
      <category>데이터이전</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/6</guid>
      <comments>https://calicucu.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 10 Dec 2020 00:31:45 +0900</pubDate>
    </item>
    <item>
      <title>[Mysql] 특정 데이터 우선 정렬하기</title>
      <link>https://calicucu.tistory.com/4</link>
      <description>&lt;p&gt;데이터 중 가장 상위에 표시하고 싶은 값이 있으면 다음과 같이 쓰면된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ORDER BY&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;FIELD(컬럼명,'특정값')&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;ex)&amp;nbsp; ...&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;FIELD(total_count,'999')&amp;nbsp;desc,&amp;nbsp;reg_date&amp;nbsp;desc&amp;nbsp;limit&amp;nbsp;3&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;total_count&lt;/span&gt;가 999인 row를 가장 상위에 두고 출력함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터 &amp;amp; 저장소/데이터 설계 &amp;amp; 운영</category>
      <category>db</category>
      <category>MySQL</category>
      <category>order by</category>
      <category>데이터베이스</category>
      <category>정렬</category>
      <author>얇피</author>
      <guid isPermaLink="true">https://calicucu.tistory.com/4</guid>
      <comments>https://calicucu.tistory.com/4#entry4comment</comments>
      <pubDate>Mon, 30 Nov 2020 09:32:24 +0900</pubDate>
    </item>
  </channel>
</rss>