<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 공부중</title>
    <link>https://mmee2.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 14:00:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발자 leelee</managingEditor>
    <image>
      <title>개발 공부중</title>
      <url>https://tistory1.daumcdn.net/tistory/5513337/attach/736e058d54eb4caea79c7dce76217611</url>
      <link>https://mmee2.tistory.com</link>
    </image>
    <item>
      <title>[javascript/jquery]&amp;nbsp;자바스크립트&amp;nbsp;url&amp;nbsp;파라미터&amp;nbsp;숨기기 (history.replaceState)</title>
      <link>https://mmee2.tistory.com/135</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;history.replaceState로 URL 파라미터 숨기기&lt;/title&gt;
  &lt;style&gt;
    /* 티스토리 붙여넣기용 스타일 — &lt;style&gt; 태그째로 HTML 편집기에 붙여넣으세요 */
    .post-wrap {
      font-family: 'Noto Sans KR', 'Malgun Gothic', sans-serif;
      font-size: 15px;
      line-height: 1.85;
      color: #1e1e1e;
      max-width: 760px;
      margin: 0 auto;
      padding: 0 16px;
    }
    .post-wrap h2 {
      font-size: 22px;
      font-weight: 700;
      margin: 48px 0 16px;
      padding-bottom: 10px;
      border-bottom: 2px solid #4f46e5;
      color: #1a1a2e;
    }
    .post-wrap h3 {
      font-size: 17px;
      font-weight: 700;
      margin: 32px 0 12px;
      color: #2d2d2d;
    }
    .post-wrap p {
      margin: 12px 0;
    }
    .post-wrap pre {
      background: #1e1e2e;
      color: #cdd6f4;
      border-radius: 10px;
      padding: 20px 22px;
      overflow-x: auto;
      font-family: 'D2Coding', 'Fira Code', 'Courier New', monospace;
      font-size: 13.5px;
      line-height: 1.7;
      margin: 16px 0;
    }
    .post-wrap code.inline {
      background: #ede9fe;
      color: #4f46e5;
      padding: 2px 7px;
      border-radius: 4px;
      font-family: 'D2Coding', monospace;
      font-size: 13.5px;
    }
    .post-wrap .highlight-box {
      background: #f5f3ff;
      border-left: 4px solid #4f46e5;
      border-radius: 0 8px 8px 0;
      padding: 14px 18px;
      margin: 20px 0;
      font-size: 14.5px;
    }
    .post-wrap .tip-box {
      background: #fff7ed;
      border-left: 4px solid #f97316;
      border-radius: 0 8px 8px 0;
      padding: 14px 18px;
      margin: 20px 0;
      font-size: 14.5px;
    }
    .post-wrap table {
      width: 100%;
      border-collapse: collapse;
      margin: 16px 0;
      font-size: 14px;
    }
    .post-wrap table th {
      background: #4f46e5;
      color: #fff;
      padding: 10px 14px;
      text-align: left;
    }
    .post-wrap table td {
      padding: 9px 14px;
      border-bottom: 1px solid #e5e7eb;
    }
    .post-wrap table tr:nth-child(even) td {
      background: #f9fafb;
    }
    .post-wrap .flow-box {
      background: #f8fafc;
      border: 1px solid #e2e8f0;
      border-radius: 10px;
      padding: 18px 22px;
      margin: 16px 0;
      font-family: 'D2Coding', monospace;
      font-size: 13.5px;
      line-height: 2;
      color: #334155;
    }
    .post-wrap .flow-box .arrow {
      color: #4f46e5;
      font-size: 18px;
    }
    .post-wrap .tag-list {
      margin-top: 48px;
      font-size: 13px;
      color: #6b7280;
    }
    .post-wrap .tag-list span {
      display: inline-block;
      background: #f3f4f6;
      border-radius: 99px;
      padding: 3px 10px;
      margin: 3px 2px;
    }

    /* 코드 컬러 */
    .kw  { color: #cba6f7; }  /* 키워드: function, const 등 */
    .fn  { color: #89dceb; }  /* 함수명 */
    .str { color: #a6e3a1; }  /* 문자열 */
    .cm  { color: #6c7086; font-style: italic; }  /* 주석 */
    .prop{ color: #fab387; }  /* 프로퍼티 */
    .num { color: #f38ba8; }  /* 숫자 */
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;post-wrap&quot;&gt;

  &lt;p&gt;웹 개발 중 파라미터가 노출된 URL을 지워야하는 상황&lt;/p&gt;
  &lt;pre&gt;https://example.com/search?keyword=자바스크립트&amp;amp;userId=1234&amp;amp;token=abcxyz&lt;/pre&gt;
  &lt;p&gt;보안이 중요한 데이터가 주소창에 그대로 보이거나, URL을 깔끔하게 유지하고 싶은 상황에서 유용하게 쓸 수 있는 방법을 정리했다.&lt;/p&gt;

  &lt;div class=&quot;highlight-box&quot;&gt;
      &lt;strong&gt;history.replaceState({}, null, location.pathname)&lt;/strong&gt; 한 줄로 URL 파라미터를 숨기는 방법
  &lt;/div&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;✅ 핵심 코드 한 줄&lt;/h2&gt;

  &lt;pre&gt;&lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;({}, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);&lt;/pre&gt;

  &lt;p&gt;이 한 줄이 하는 일은 &lt;strong&gt;현재 URL에서 쿼리스트링(&lt;code class=&quot;inline&quot;&gt;?&lt;/code&gt; 이후)을 전부 제거하고, 경로(path)만 남긴다.&lt;/strong&gt; 페이지는 새로고침되지 않는다.&lt;/p&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;  인자 하나씩 뜯어보기&lt;/h2&gt;

  &lt;pre&gt;&lt;span class=&quot;fn&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;( state,  title,  url )
                      ↓       ↓       ↓
&lt;span class=&quot;fn&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;( {},     &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;,   location.pathname )&lt;/pre&gt;

  &lt;h3&gt;① {} — state 객체&lt;/h3&gt;
  &lt;p&gt;히스토리에 함께 저장할 데이터다. 빈 객체 &lt;code class=&quot;inline&quot;&gt;{}&lt;/code&gt;를 넘겼다는 건, 따로 저장할 데이터 없이 URL만 바꾸겠다는 의미다.&lt;/p&gt;
  &lt;pre&gt;&lt;span class=&quot;cm&quot;&gt;// 데이터를 함께 저장하고 싶다면 이렇게&lt;/span&gt;
&lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;({ &lt;span class=&quot;prop&quot;&gt;keyword&lt;/span&gt;: &lt;span class=&quot;str&quot;&gt;'검색어'&lt;/span&gt; }, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);&lt;/pre&gt;

  &lt;h3&gt;② null — title&lt;/h3&gt;
  &lt;p&gt;원래 페이지 타이틀을 지정하는 인자인데, &lt;strong&gt;현재 모든 브라우저가 이 값을 무시한다.&lt;/strong&gt; 관례적으로 &lt;code class=&quot;inline&quot;&gt;null&lt;/code&gt; 또는 &lt;code class=&quot;inline&quot;&gt;&quot;&quot;&lt;/code&gt;을 넣는다.&lt;/p&gt;

  &lt;h3&gt;③ location.pathname — 변경할 URL&lt;/h3&gt;
  &lt;p&gt;여기가 핵심이다. &lt;code class=&quot;inline&quot;&gt;location&lt;/code&gt; 객체의 속성들을 비교해보면 이해가 쉽다.&lt;/p&gt;

  &lt;pre&gt;&lt;span class=&quot;cm&quot;&gt;// 현재 URL: https://example.com/search?keyword=테스트&amp;amp;page=1&lt;/span&gt;

location.pathname  &lt;span class=&quot;cm&quot;&gt;→  &quot;/search&quot;                           (? 이전 경로만)&lt;/span&gt;
location.search    &lt;span class=&quot;cm&quot;&gt;→  &quot;?keyword=테스트&amp;amp;page=1&quot;   (쿼리스트링)&lt;/span&gt;
location.href      &lt;span class=&quot;cm&quot;&gt;→  &quot;https://example.com/search?keyword=테스트&amp;amp;page=1&quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;p&gt;&lt;code class=&quot;inline&quot;&gt;location.pathname&lt;/code&gt;만 넘기면 쿼리스트링이 포함되지 않으므로, URL에서 파라미터가 사라진다.&lt;/p&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;⚙️ 동작 흐름&lt;/h2&gt;

  &lt;div class=&quot;flow-box&quot;&gt;
    페이지 진입&lt;br&gt;
    &lt;span class=&quot;arrow&quot;&gt;↓&lt;/span&gt; https://example.com/search?keyword=테스트&amp;amp;page=1&lt;br&gt;&lt;br&gt;
    파라미터 읽어서 처리 (검색 실행 등)&lt;br&gt;
    &lt;span class=&quot;arrow&quot;&gt;↓&lt;/span&gt;&lt;br&gt;&lt;br&gt;
    history.replaceState({}, null, location.pathname);&lt;br&gt;
    &lt;span class=&quot;arrow&quot;&gt;↓&lt;/span&gt;&lt;br&gt;&lt;br&gt;
    주소창 URL 변경&lt;br&gt;
    &lt;span class=&quot;arrow&quot;&gt;→&lt;/span&gt; https://example.com/search &amp;nbsp;&amp;nbsp; ✅ 파라미터 사라짐&lt;br&gt;
    &lt;span style=&quot;color:#94a3b8; font-size:12px;&quot;&gt;(페이지 새로고침 없음, 히스토리 스택 교체)&lt;/span&gt;
  &lt;/div&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;  pushState vs replaceState&lt;/h2&gt;

  &lt;pre&gt;&lt;span class=&quot;cm&quot;&gt;// replaceState: 현재 히스토리를 덮어씀&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;// → 뒤로가기 해도 파라미터 있던 URL로 못 돌아감&lt;/span&gt;
&lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;({}, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);

&lt;span class=&quot;cm&quot;&gt;// pushState: 새 히스토리를 쌓음&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;// → 뒤로가기 하면 파라미터 있던 URL로 돌아감&lt;/span&gt;
&lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;pushState&lt;/span&gt;({}, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);&lt;/pre&gt;

  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;메서드&lt;/th&gt;
      &lt;th&gt;히스토리 처리&lt;/th&gt;
      &lt;th&gt;뒤로가기 시&lt;/th&gt;
      &lt;th&gt;적합한 상황&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;inline&quot;&gt;replaceState&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;현재 항목 교체&lt;/td&gt;
      &lt;td&gt;파라미터 URL 차단 ✅&lt;/td&gt;
      &lt;td&gt;파라미터 완전히 제거&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;inline&quot;&gt;pushState&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;새 항목 추가&lt;/td&gt;
      &lt;td&gt;파라미터 URL 복원&lt;/td&gt;
      &lt;td&gt;히스토리 유지 필요 시&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

  &lt;p&gt;파라미터를 &lt;strong&gt;완전히 지워버리고 싶을 때&lt;/strong&gt;는 &lt;code class=&quot;inline&quot;&gt;replaceState&lt;/code&gt;가 맞다. 뒤로가기로 파라미터가 다시 노출되는 상황을 막을 수 있기 때문이다.&lt;/p&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;  실제 활용 패턴&lt;/h2&gt;

  &lt;h3&gt;기본 패턴 — 파라미터 읽고 → 즉시 제거&lt;/h3&gt;

  &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;const&lt;/span&gt; params = &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;fn&quot;&gt;URLSearchParams&lt;/span&gt;(location.search);
&lt;span class=&quot;kw&quot;&gt;const&lt;/span&gt; keyword = params.&lt;span class=&quot;fn&quot;&gt;get&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;'keyword'&lt;/span&gt;);

&lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; (keyword) {
  &lt;span class=&quot;cm&quot;&gt;// ① 파라미터 값으로 필요한 처리 먼저&lt;/span&gt;
  &lt;span class=&quot;fn&quot;&gt;doSearch&lt;/span&gt;(keyword);

  &lt;span class=&quot;cm&quot;&gt;// ② 처리 후 URL에서 파라미터 제거&lt;/span&gt;
  &lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;({}, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);
}&lt;/pre&gt;

  &lt;div class=&quot;tip-box&quot;&gt;
    ⚠️ &lt;strong&gt;순서가 중요하다.&lt;/strong&gt; 반드시 파라미터를 읽고 처리한 후에 제거해야 한다. 제거 후 읽으면 이미 파라미터가 없으므로 &lt;code class=&quot;inline&quot;&gt;null&lt;/code&gt;이 반환된다.
  &lt;/div&gt;

  &lt;h3&gt;jQuery AJAX 조합 패턴&lt;/h3&gt;

  &lt;pre&gt;$(&lt;span class=&quot;str&quot;&gt;'#searchForm'&lt;/span&gt;).&lt;span class=&quot;fn&quot;&gt;on&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;'submit'&lt;/span&gt;, &lt;span class=&quot;kw&quot;&gt;function&lt;/span&gt;(e) {
  e.&lt;span class=&quot;fn&quot;&gt;preventDefault&lt;/span&gt;();

  &lt;span class=&quot;kw&quot;&gt;const&lt;/span&gt; keyword = $(&lt;span class=&quot;str&quot;&gt;'#keyword'&lt;/span&gt;).&lt;span class=&quot;fn&quot;&gt;val&lt;/span&gt;();

  $.&lt;span class=&quot;fn&quot;&gt;ajax&lt;/span&gt;({
    url: &lt;span class=&quot;str&quot;&gt;'/api/search'&lt;/span&gt;,
    method: &lt;span class=&quot;str&quot;&gt;'GET'&lt;/span&gt;,
    data: { keyword: keyword },
    success: &lt;span class=&quot;kw&quot;&gt;function&lt;/span&gt;(response) {
      &lt;span class=&quot;cm&quot;&gt;// AJAX로 데이터를 가져오되, URL에는 파라미터 노출하지 않음&lt;/span&gt;
      &lt;span class=&quot;prop&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;fn&quot;&gt;replaceState&lt;/span&gt;({}, &lt;span class=&quot;kw&quot;&gt;null&lt;/span&gt;, location.pathname);
      &lt;span class=&quot;fn&quot;&gt;renderResult&lt;/span&gt;(response);
    }
  });
});&lt;/pre&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;⚠️ 주의사항&lt;/h2&gt;

  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;항목&lt;/th&gt;
      &lt;th&gt;내용&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;새로고침 시 state 소멸&lt;/td&gt;
      &lt;td&gt;replaceState에 저장한 state는 새로고침하면 사라진다. 중요한 데이터는 &lt;code class=&quot;inline&quot;&gt;sessionStorage&lt;/code&gt;와 병행 사용 권장&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;서버 라우팅 주의&lt;/td&gt;
      &lt;td&gt;존재하지 않는 URL로 변경 후 새로고침하면 404 발생 가능. 서버에서 해당 경로를 처리할 수 있어야 함&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;완전한 보안 X&lt;/td&gt;
      &lt;td&gt;URL에서 숨길 뿐, 클라이언트 단의 조작이다. 민감한 데이터는 POST + HTTPS와 함께 서버 인증을 병행해야 함&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

  &lt;!-- ======================== --&gt;
  &lt;h2&gt;  한 줄 요약&lt;/h2&gt;

  &lt;div class=&quot;highlight-box&quot;&gt;
    &lt;code class=&quot;inline&quot;&gt;history.replaceState({}, null, location.pathname)&lt;/code&gt; 는 &lt;strong&gt;&quot;URL은 깔끔하게 바꾸되, 페이지는 그대로 유지&quot;&lt;/strong&gt; 하는 가장 심플한 파라미터 은닉 방법이다.
  &lt;/div&gt;


&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>javascript</category>
      <category>jQuery</category>
      <category>url파라미터</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/135</guid>
      <comments>https://mmee2.tistory.com/135#entry135comment</comments>
      <pubDate>Sun, 15 Mar 2026 21:39:58 +0900</pubDate>
    </item>
    <item>
      <title>[error] 이클립스 안 켜짐 해결방법 (로딩화면에서 응답없음)</title>
      <link>https://mmee2.tistory.com/134</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuJSLn/dJMcajnyigN/DIuCNLDCj0zz0amZ7dY36k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuJSLn/dJMcajnyigN/DIuCNLDCj0zz0amZ7dY36k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuJSLn/dJMcajnyigN/DIuCNLDCj0zz0amZ7dY36k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuJSLn%2FdJMcajnyigN%2FDIuCNLDCj0zz0amZ7dY36k%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;439&quot; height=&quot;291&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;291&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;blockquote data-ke-style=&quot;style2&quot;&gt;나의 상황&lt;/blockquote&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;blockquote data-ke-style=&quot;style2&quot;&gt;원인&amp;nbsp;&lt;/blockquote&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;이클립스가 켜지면서 그 파일이 깨져 있으니 무한 루프에 빠져버린 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해결방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd를 열어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이클립스 설치 경로로 이동하여 아래 명령어를 입력해 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1770640960622&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eclipse.exe -clearPersistedState&lt;/code&gt;&lt;/pre&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;/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;/p&gt;</description>
      <category>오류해결</category>
      <category>이클립스</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/134</guid>
      <comments>https://mmee2.tistory.com/134#entry134comment</comments>
      <pubDate>Mon, 9 Feb 2026 21:46:25 +0900</pubDate>
    </item>
    <item>
      <title>[LINUX] 서버 용량(디스크) 체크하는 방법 (du/df)</title>
      <link>https://mmee2.tistory.com/133</link>
      <description>&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;/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;서버 용량(디스크) 체크하는 방법&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;1. 서버 전체 디스크 용량 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769522771619&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1769522822868&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   46G  2.0G  96% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sdb1       100G   20G   75G  22% /home&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;size : 전체용량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;used : 사용중인 용량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;avail : 남은 용량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use % : 사용률&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mounted on : 실제 경로&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;b&gt;2. 디렉토리 별로 뭐가 제일 많이 차지하고 있는지 확인&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769522948777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;du -h | sort -rh | head -n 10&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1769523023326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;12G     ./var
9.5G    ./var/log
4.8G    ./var/log/syslog
3.9G    ./var/log/nginx/access.log
1.2G    ./var/lib/docker&lt;/code&gt;&lt;/pre&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;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;서버가 터지기 전에&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;끝&lt;/p&gt;</description>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/133</guid>
      <comments>https://mmee2.tistory.com/133#entry133comment</comments>
      <pubDate>Tue, 27 Jan 2026 23:16:40 +0900</pubDate>
    </item>
    <item>
      <title>[HTML/CSS] 홈페이지에 rss로 최신 뉴스기사 불러오기 (닷홈빌더 활용)</title>
      <link>https://mmee2.tistory.com/132</link>
      <description>&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;닷홈빌더로 만든 홈페이지에 rss로 최신 뉴스기사 불러오기&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-origin-width=&quot;1901&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZvLFD/dJMcajnszgl/ECekc5dec29KQrgADHkOQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZvLFD/dJMcajnszgl/ECekc5dec29KQrgADHkOQ1/img.png&quot; data-alt=&quot;사이트 이름은 가렸음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZvLFD/dJMcajnszgl/ECekc5dec29KQrgADHkOQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZvLFD%2FdJMcajnszgl%2FECekc5dec29KQrgADHkOQ1%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;1901&quot; height=&quot;931&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;931&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;빠르게 홈페이지를 만들고 싶어서 뭘 써볼까 고민하다가&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MkuiI/dJMcadALPH2/OhX9ceKmCPaVYlpVteCUqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MkuiI/dJMcadALPH2/OhX9ceKmCPaVYlpVteCUqk/img.png&quot; data-alt=&quot;완성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MkuiI/dJMcadALPH2/OhX9ceKmCPaVYlpVteCUqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMkuiI%2FdJMcadALPH2%2FOhX9ceKmCPaVYlpVteCUqk%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;1889&quot; height=&quot;926&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;926&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;1. 프레임을 나누고 요소 코드를 추가해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXboj/dJMcajud10r/ty7nMeenCt1i5M2naSoG5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXboj/dJMcajud10r/ty7nMeenCt1i5M2naSoG5k/img.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;885&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;58.61&quot; style=&quot;width: 57.9309%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXboj/dJMcajud10r/ty7nMeenCt1i5M2naSoG5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXboj%2FdJMcajud10r%2Fty7nMeenCt1i5M2naSoG5k%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;447&quot; height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEP7qE/dJMcaajNAPS/GLaid15LBsGjnO5EEiSaH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEP7qE/dJMcaajNAPS/GLaid15LBsGjnO5EEiSaH0/img.png&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;872&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;41.39&quot; style=&quot;width: 40.9063%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEP7qE/dJMcaajNAPS/GLaid15LBsGjnO5EEiSaH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEP7qE%2FdJMcaajNAPS%2FGLaid15LBsGjnO5EEiSaH0%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;311&quot; height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/div&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;그럼 아래처럼 화면이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qg2Ip/dJMcai29tyV/4uldwhalKZU1f3CtwyX9QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qg2Ip/dJMcai29tyV/4uldwhalKZU1f3CtwyX9QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qg2Ip/dJMcai29tyV/4uldwhalKZU1f3CtwyX9QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqg2Ip%2FdJMcai29tyV%2F4uldwhalKZU1f3CtwyX9QK%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;1895&quot; height=&quot;669&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드를 입력하고 적용하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC3i2b/dJMcaia4qQs/CP15OkCZFYhcTh2Kk44gY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC3i2b/dJMcaia4qQs/CP15OkCZFYhcTh2Kk44gY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC3i2b/dJMcaia4qQs/CP15OkCZFYhcTh2Kk44gY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC3i2b%2FdJMcaia4qQs%2FCP15OkCZFYhcTh2Kk44gY1%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;792&quot; height=&quot;432&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1769440401289&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    .news-widget-box {
        font-family: 'Malgun Gothic', sans-serif;
        border: 1px solid #ddd;
        border-radius: 10px;
        background: #fff;
        overflow: hidden;
        max-width: 100%;
        margin-bottom: 20px; /* 박스 간 간격 */
        box-shadow: 0 2px 5px rgba(0,0,0,0.05);
    }
    .news-widget-header {
        background: #0b0e23; /* 배경색 */
        color: #fff;
        padding: 15px;
        font-weight: bold;
        font-size: 16px;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }
    .news-widget-list { padding: 0; margin: 0; list-style: none; }
    .news-widget-item { padding: 15px; border-bottom: 1px solid #eee; transition: background 0.2s; }
    .news-widget-item:hover { background-color: #f9fbfc; }
    .news-widget-item a { text-decoration: none; color: #333; font-size: 15px; font-weight: 500; display: block; margin-bottom: 5px; }
    .news-widget-item a:hover { color: #1a73e8; text-decoration: underline; }
    .news-widget-meta { font-size: 12px; color: #888; }
    .news-loading { padding: 20px; text-align: center; color: #666; }
&amp;lt;/style&amp;gt;

&amp;lt;script&amp;gt;
    // 이 함수가 뉴스를 가져와서 박스에 넣어줍니다.
    function loadNewsWidget(boxId, searchKeyword, titleText) {
        // 1. 박스 찾기
        const box = document.getElementById(boxId);
        if (!box) return;

        // 2. 제목 설정
        const titleArea = box.querySelector('.widget-title-text');
        if (titleArea) titleArea.innerText = titleText || searchKeyword + &quot; 뉴스&quot;;

        // 3. RSS 주소 생성
        const baseUrl = &quot;https://news.google.com/rss/search&quot;;
        const params = `?q=${encodeURIComponent(searchKeyword)}&amp;amp;hl=ko&amp;amp;gl=KR&amp;amp;ceid=KR:ko`;
        const apiUrl = `https://api.rss2json.com/v1/api.json?rss_url=${encodeURIComponent(baseUrl + params)}`;

        // 4. 데이터 가져오기
        fetch(apiUrl)
        .then(res =&amp;gt; res.json())
        .then(data =&amp;gt; {
            const listArea = box.querySelector('.news-widget-list');
            
            if (data.status === 'ok' &amp;amp;&amp;amp; data.items.length &amp;gt; 0) {
                let html = '';
                data.items.slice(0, 5).forEach(item =&amp;gt; {
                    // 날짜 포맷
                    let dateStr = item.pubDate;
                    try {
                        const d = new Date(item.pubDate);
                        dateStr = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')} ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}`;
                    } catch(e) {}

                    html += `
                        &amp;lt;div class=&quot;news-widget-item&quot;&amp;gt;
                            &amp;lt;a href=&quot;${item.link}&quot; target=&quot;_blank&quot;&amp;gt;${item.title}&amp;lt;/a&amp;gt;
                            &amp;lt;div class=&quot;news-widget-meta&quot;&amp;gt;${dateStr} | ${item.author || '뉴스'}&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;`;
                });
                listArea.innerHTML = html;
            } else {
                listArea.innerHTML = '&amp;lt;div class=&quot;news-loading&quot;&amp;gt;검색 결과가 없습니다.&amp;lt;/div&amp;gt;';
            }
        })
        .catch(err =&amp;gt; {
            const listArea = box.querySelector('.news-widget-list');
            if(listArea) listArea.innerHTML = '&amp;lt;div class=&quot;news-loading&quot;&amp;gt;불러오기 실패&amp;lt;/div&amp;gt;';
        });
    }
&amp;lt;/script&amp;gt;

&amp;lt;div id=&quot;news-1&quot; class=&quot;news-widget-box&quot;&amp;gt;
    &amp;lt;div class=&quot;news-widget-header&quot;&amp;gt;
        &amp;lt;span class=&quot;widget-title-text&quot;&amp;gt;뉴스 로딩 중...&amp;lt;/span&amp;gt;
        &amp;lt;span style=&quot;font-size:11px; opacity:0.8;&quot;&amp;gt;Live&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;news-widget-list&quot;&amp;gt;
        &amp;lt;div class=&quot;news-loading&quot;&amp;gt;뉴스를 검색하고 있습니다...&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    // loadNewsWidget('아이디', '검색어', '박스제목');
    loadNewsWidget('news-1', '핸드볼', '핸드볼 최신 뉴스');
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 code/ 박스&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1769440447848&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;news-2&quot; class=&quot;news-widget-box&quot;&amp;gt;
    &amp;lt;div class=&quot;news-widget-header&quot;&amp;gt;
        &amp;lt;span class=&quot;widget-title-text&quot;&amp;gt;뉴스 로딩 중...&amp;lt;/span&amp;gt;
        &amp;lt;span style=&quot;font-size:11px; opacity:0.8;&quot;&amp;gt;Live&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;news-widget-list&quot;&amp;gt;
        &amp;lt;div class=&quot;news-loading&quot;&amp;gt;뉴스를 검색하고 있습니다...&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    // 아이디를 news-2 로 맞춰줍니다.
    loadNewsWidget('news-2', '여자축구', '여자축구 최신 뉴스');
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 code/ 박스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;style 과 script 는 이미 첫번째 박스에서 써서 훨씬 간단하게 작성할 수 있다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loadNewsWidget('아이디', '검색어', '박스제목');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디만 각 박스 별 div id와 맞추고,&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;/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;끝&lt;/p&gt;</description>
      <category>HTML, CSS</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/132</guid>
      <comments>https://mmee2.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 27 Jan 2026 00:29:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 의존성 주입(DI) 방식 비교와 빈(Bean) 충돌 해결하기</title>
      <link>https://mmee2.tistory.com/131</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;images_alsrb5606_post_3d2eeb25-c05e-4424-b2ed-a3e398156de6_image.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1SMe/dJMcadALmGY/ubyKuJVXzU1lDqdPvsIZ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1SMe/dJMcadALmGY/ubyKuJVXzU1lDqdPvsIZ9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1SMe/dJMcadALmGY/ubyKuJVXzU1lDqdPvsIZ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1SMe%2FdJMcadALmGY%2FubyKuJVXzU1lDqdPvsIZ9K%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;400&quot; height=&quot;279&quot; data-filename=&quot;images_alsrb5606_post_3d2eeb25-c05e-4424-b2ed-a3e398156de6_image.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성자 주입 (Constructor Injection)&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;생성되는&amp;nbsp;시점에&amp;nbsp;딱&amp;nbsp;한&amp;nbsp;번만&amp;nbsp;호출되어&amp;nbsp;부품을&amp;nbsp;끼우는&amp;nbsp;방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 안전성과 불변성을 보장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769347018338&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class Car {
    private final Engine engine; // final을 붙이기

    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;수정자&amp;nbsp;주입&amp;nbsp;(Setter&amp;nbsp;Injection)&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;객체를 먼저 만들어 놓고, 나중에 set~ 메서드를 통해 부품을 끼우는 방식입니다.&lt;br /&gt;NullPointerException 에러가 발생 가능성 높&lt;/p&gt;
&lt;pre id=&quot;code_1769347088960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class Car {
    private Engine engine; // 나중에 바꿀 수 있어서 final을 못 씀

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}&lt;/code&gt;&lt;/pre&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;blockquote data-ke-style=&quot;style2&quot;&gt;Lombok&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lombok(롬복) 라이브러리를 써서 간단하게 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1769347292161&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@RequiredArgsConstructor // final이 붙은 애들만 모아서 생성자를 자동으로 만들어줌
public class Car {
    private final Engine engine; // 생성자 직접 안 써도 됨
}&lt;/code&gt;&lt;/pre&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; 해결방법 (빈&amp;nbsp;충돌&amp;nbsp;해결)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약&amp;nbsp;Engine&amp;nbsp;인터페이스를&amp;nbsp;상속받은&amp;nbsp;GasolineEngine과&amp;nbsp;ElectricEngine이&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;스프링&amp;nbsp;빈으로&amp;nbsp;등록되어&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. @Primary&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인&amp;nbsp;부품이&amp;nbsp;정해져&amp;nbsp;있을&amp;nbsp;때&amp;nbsp;우선순위&amp;nbsp;지정&lt;/p&gt;
&lt;pre id=&quot;code_1769347544713&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@Primary  // 똑같은 엔진이 여러 개면 기본선택은 이거
public class ElectricEngine implements Engine { ... }

@Component
public class GasolineEngine implements Engine { ... }&lt;/code&gt;&lt;/pre&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;blockquote data-ke-style=&quot;style2&quot;&gt;2. @Qualifier&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러&amp;nbsp;부품을&amp;nbsp;골고루&amp;nbsp;섞어&amp;nbsp;써야&amp;nbsp;할&amp;nbsp;때&amp;nbsp;등&amp;nbsp;때에&amp;nbsp;따라서&amp;nbsp;지정&lt;/p&gt;
&lt;pre id=&quot;code_1769347678550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@Qualifier(&quot;fastEngine&quot;) // 이 부품의 별명을 'fastEngine'으로 정함
public class GasolineEngine implements Engine { ... }

// 주입받는 곳
@Component
public class Car {
    private final Engine engine;

    public Car(@Qualifier(&quot;fastEngine&quot;) Engine engine) { // 별명이 'fastEngine'인 애를 가져옴
        this.engine = engine;
    }
}&lt;/code&gt;&lt;/pre&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;blockquote data-ke-style=&quot;style2&quot;&gt;3. 필드 이름 매칭&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은&amp;nbsp;똑같은&amp;nbsp;타입이&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;있으면,&amp;nbsp;마지막&amp;nbsp;수단으로&amp;nbsp;변수(필드)&amp;nbsp;이름과&amp;nbsp;똑같은&amp;nbsp;이름의&amp;nbsp;빈이&amp;nbsp;있는지&amp;nbsp;찾음&lt;/p&gt;
&lt;pre id=&quot;code_1769347701016&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class GasolineEngine implements Engine { ... }

@Component
public class ElectricEngine implements Engine { ... }

@Component
public class Car {
    // 변수 이름을 'electricEngine'으로 지으면, 스프링이 알아서 ElectricEngine을 가져옴
    @Autowired
    private Engine electricEngine; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지 중, 공통적으로 많이 쓰는 것에 @Primary를 붙이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별한 경우에만 @Qualifier로 지목해서 쓰는 방식을 사용하기&lt;/p&gt;</description>
      <category>SPRING BOOT</category>
      <category>spring</category>
      <category>의존성주입</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/131</guid>
      <comments>https://mmee2.tistory.com/131#entry131comment</comments>
      <pubDate>Sun, 25 Jan 2026 22:33:54 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 컴포넌트 스캔 @ComponentScan @Filter @Autowired</title>
      <link>https://mmee2.tistory.com/130</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;images_alsrb5606_post_3d2eeb25-c05e-4424-b2ed-a3e398156de6_image.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTJe2O/dJMcabpqdSc/dQhkkTKxarmKC45KWxVbX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTJe2O/dJMcabpqdSc/dQhkkTKxarmKC45KWxVbX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTJe2O/dJMcabpqdSc/dQhkkTKxarmKC45KWxVbX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTJe2O%2FdJMcabpqdSc%2FdQhkkTKxarmKC45KWxVbX0%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;400&quot; height=&quot;279&quot; data-filename=&quot;images_alsrb5606_post_3d2eeb25-c05e-4424-b2ed-a3e398156de6_image.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;컴포넌트 스캔 (@ComponentScan)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 객체(Bean)를 스프링 컨테이너에 넣어달라고 직접 명시했다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 스캔은 &quot;알아서 클래스를 찾아서 자동으로 스프링 빈으로 등록하는 기능&quot;&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;@ComponentScan: 설정 정보 클래스 위 붙임&amp;nbsp;&lt;br /&gt;@Component: 등록하고 싶은 클래스 위에 붙임&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;@ComponentScan 은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;필터 (@Filter)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;includeFilters : 컴포넌트 스캔 대상을 추가로 지정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;excludeFilters :&lt;span&gt;&lt;span&gt;&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;pre id=&quot;code_1768739128497&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@ComponentScan(
// 하위 패키지까지 스캔
    basePackages = &quot;com.example.demo&quot;,
    
    // Configuration이 붙은 클래스는 스캔 대상에서 제외
    excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;오토와이어드 (@Autowired)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자에 @Autowired를&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1768739286622&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class OrderServiceImpl implements OrderService {
    
    private final MemberRepository memberRepository;

    @Autowired // 생성자가 하나라면 생략 가능 (스프링 부트)
    public OrderServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}&lt;/code&gt;&lt;/pre&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;@Component, @Controller, @Service, @ Repository, @Configuration&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;컴포넌트 스캔에서 같은 이름의 빈이 등록되는 경우&amp;nbsp;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;b&gt;1. 자동 빈 등록 vs 자동 빈 등록 &lt;/b&gt;&lt;br /&gt;만약 서로 다른 패키지에 같은 이름의 클래스(예: service.MemberService, domain.MemberService)가 있고 둘 다 @Component가 붙어있다면? 스프링은 ConflictingBeanDefinitionException 예외를 발생시킴&lt;br /&gt;&lt;br /&gt;해결: 클래스 이름을 변경하거나, @Component(&quot;customName&quot;)처럼 이름을 직접 지정하기&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;b&gt;2. 수동 빈 등록 vs 자동 빈 등록 &lt;/b&gt;&lt;br /&gt;AppConfig에 수동으로 등록한 빈 이름과, @Component로 자동 등록된 빈 이름이 충돌하면? &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;과거 스프링은 수동 등록 빈이 우선권을 가졌지만(자동 빈을 오버라이딩). &lt;br /&gt;최근 스프링 부트는 설정 실수를 방지하기 위해 기본적으로 에러를 발생시키도록 변경&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;*************************** APPLICATION FAILED TO START *************************** &lt;br /&gt;Description: &lt;br /&gt;&lt;br /&gt;The bean 'memberService', defined in class path resource [(경로)/DependencyConfig.class], could not be registered. A bean with that name has already been defined in file [(경로)/member/MemberService.class] and overriding is disabled. &lt;br /&gt;&lt;br /&gt;Action: &lt;br /&gt;&lt;b&gt;Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9v16/dJMcaiB2hGa/KkqtAnwqp95OYmcpf5Pk51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9v16/dJMcaiB2hGa/KkqtAnwqp95OYmcpf5Pk51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9v16/dJMcaiB2hGa/KkqtAnwqp95OYmcpf5Pk51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9v16%2FdJMcaiB2hGa%2FKkqtAnwqp95OYmcpf5Pk51%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;681&quot; height=&quot;73&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;73&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;Action 에 있는 메시지를 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.properties 파일에 위 코드를 입력하면 오버라이딩 가능하도록 변경됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SPRING BOOT</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/130</guid>
      <comments>https://mmee2.tistory.com/130#entry130comment</comments>
      <pubDate>Sun, 18 Jan 2026 21:44:10 +0900</pubDate>
    </item>
    <item>
      <title>[LINUX] MobaXterm에서 Alias(별칭) 설정 방법</title>
      <link>https://mmee2.tistory.com/129</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OPyhG/dJMcafL59IA/E68q96d9CXzyb5Ze2MdwuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OPyhG/dJMcafL59IA/E68q96d9CXzyb5Ze2MdwuK/img.png&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;245&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.25&quot; style=&quot;width: 48.6753%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OPyhG/dJMcafL59IA/E68q96d9CXzyb5Ze2MdwuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOPyhG%2FdJMcafL59IA%2FE68q96d9CXzyb5Ze2MdwuK%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;246&quot; height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGr5K3/dJMcac2Sn2F/Pjt2OW13b2mNbwZ9vgJrj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGr5K3/dJMcac2Sn2F/Pjt2OW13b2mNbwZ9vgJrj0/img.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;259&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.1619%;&quot; data-widthpercent=&quot;50.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGr5K3/dJMcac2Sn2F/Pjt2OW13b2mNbwZ9vgJrj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGr5K3%2FdJMcac2Sn2F%2FPjt2OW13b2mNbwZ9vgJrj0%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;268&quot; height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제상황&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PuTTY에서 사용하던 alias 설정을 MobaXterm 에서도 똑같이 사용하려니 되지 않았다. &lt;br /&gt;MobaXterm 로컬 터미널의 .bash_profile에 추가했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 찾을 수 없다는(Command not found) 오류가 발생&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. 원인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널(Shell)이&amp;nbsp;실행될&amp;nbsp;때&amp;nbsp;설정&amp;nbsp;파일을&amp;nbsp;읽어오는&amp;nbsp;우선순위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;.bashrc&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;gt;&amp;nbsp; .bash_profile&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. 해결 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.bashrc 파일에 직접 alias를 설정해주었다.&lt;/p&gt;
&lt;pre id=&quot;code_1768315271806&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .bashrc 하단에 직접 추가
alias tomcat='cd  ~~~ '&lt;/code&gt;&lt;/pre&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;끝!&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>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/129</guid>
      <comments>https://mmee2.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 13 Jan 2026 23:45:57 +0900</pubDate>
    </item>
    <item>
      <title>프론트에서 할까 백에서 할까 내가 생각한 기준 정리</title>
      <link>https://mmee2.tistory.com/128</link>
      <description>&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;1. 백단(java)에서 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프론트단(jsp)에서 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 공통으로 처리&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 백단에서 수정해야할 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 같은 api를 여러 화면/엑셀 등에서 같이 사용할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 기본값이 규칙에 가까울 때 (ex 명확한 기준 오늘 날짜로부터 3년전)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; 조회시 사용자가 값을 바꿀 수 없어서 값이 안전하고 일관됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; 화면이 바뀌어도 규칙이 유지됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;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;b&gt;2. 프론트단에서 수정해야할 경우&lt;/b&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;=&amp;gt; 빠르고 영향 범위가 좁음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; 서버를 안 내려도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; 단점, api가 다른 곳에서도 쓰이면 기본값이 달라질 수 있음&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. 공통 파일로 처리&lt;/b&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;=&amp;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;이번 경우엔 1번으로 처리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 날짜 값이 controller에 있고 수정코드가 좀 더 짧게 해결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜 기본값을 controller에서 만들고 프론트에서는 &amp;lt;input value = &quot;${data}&quot;&amp;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;style1&quot; /&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>
      <category>JAVA</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/128</guid>
      <comments>https://mmee2.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 7 Jan 2026 01:05:06 +0900</pubDate>
    </item>
    <item>
      <title>[ORACLE] CSV 파일 Import 시 무결성 제약 오류 해결 방법 (임시테이블 활용)</title>
      <link>https://mmee2.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀로 전달 받은 데이터를 CSV파일로 바꿔서 테이블에 import하는데&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;&lt;b&gt;데이터가 많을 경우, 그 중 중복 값 찾는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;b&gt;CSV를 DB에 임시로 넣고 SQL로 중복값 찾기&lt;/b&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. 임시 테이블 생성 후 CSV 데이터를 넣어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1745764423910&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE IMSI(
컬럼명 형식(크기);
...
);&lt;/code&gt;&lt;/pre&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. SQL 로 중복 조합을 찾는다.&lt;/p&gt;
&lt;pre id=&quot;code_1745764448413&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 컬럼명1, 컬럼명2, COUNT(*) 
FROM IMSI
GROUP BY 컬럼명1, 컬럼명2
HAVING COUNT(*) &amp;gt; 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;=&amp;gt; 결과를 조회하면 &lt;b&gt;중복된 조합이 나옴&lt;/b&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 style=&quot;color: #333333; text-align: start;&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 style=&quot;color: #333333; text-align: start;&quot;&gt;끝!&lt;/span&gt;&lt;/p&gt;</description>
      <category>ORACLE</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/127</guid>
      <comments>https://mmee2.tistory.com/127#entry127comment</comments>
      <pubDate>Sun, 27 Apr 2025 23:39:07 +0900</pubDate>
    </item>
    <item>
      <title>[DBeaver] There is no physical unique key defined for 해결</title>
      <link>https://mmee2.tistory.com/126</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;문제상황&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select한 화면에서 컬럼을 수정하려고 하는데,&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yFKqt/btsM1lKGRdn/ZU6s8KYVh98tNK5xb7eeyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yFKqt/btsM1lKGRdn/ZU6s8KYVh98tNK5xb7eeyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yFKqt/btsM1lKGRdn/ZU6s8KYVh98tNK5xb7eeyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyFKqt%2FbtsM1lKGRdn%2FZU6s8KYVh98tNK5xb7eeyK%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;509&quot; height=&quot;157&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;There is no physical unique key defined for '테이블명'&amp;nbsp;&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;[Use All Columns] 버튼을 누르면 내가 수정하려는 데이터 외에 다른 데이터도 변경될 수 있어서&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;오류원인&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하려는 해당 테이블에 기본키(primary key)나 고유키(unique key)가 정의되어 있지 않아서 생긴 오류.&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 기본키 또는 고유키 설정하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;b&gt;2. row조건만 잘 걸어서 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;b&gt;3. 뷰테이블&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;조인 (join), 그룹핑(group by), 서브쿼리 등이 있으면 어떤 원본 테이블을 수정해야할지 디비버가 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝!&lt;/p&gt;</description>
      <category>ORACLE</category>
      <author>개발자 leelee</author>
      <guid isPermaLink="true">https://mmee2.tistory.com/126</guid>
      <comments>https://mmee2.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 31 Mar 2025 23:45:25 +0900</pubDate>
    </item>
  </channel>
</rss>