<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>CodeMonkey</title>
    <link>https://code-monkey7.tistory.com/</link>
    <description>웹개발,전자정부프레임워크, 넥사크로, jsavascript, java, sqlserver, oracle, SQLP, DAP</description>
    <language>ko</language>
    <pubDate>Sun, 28 Jun 2026 06:47:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ahki</managingEditor>
    <item>
      <title>[JavaScript]배열 메소드 forEach(), map(),filter(),find(),reduce()</title>
      <link>https://code-monkey7.tistory.com/30</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처음 자바스크립트를 입문하는 사용자에게는 익숙한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;for()&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;background-color: #dddddd;&quot;&gt;for()&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;을 대체할 수 있는지 하나씩 살펴 보자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;for vs forEach&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;span style=&quot;color: #006dd7;&quot;&gt;forEach&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;( (&lt;span style=&quot;color: #ee2323;&quot;&gt;처리할 현재 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt; 처리할 현재 요소의 &lt;/span&gt;인덱스&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt; forEach()를 호출한 &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: #8a3db6;&quot;&gt;return&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;});&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;- 배열의 인자수 만큼 반복되는 For문으로 이해하면 편하다.&lt;/p&gt;
&lt;pre id=&quot;code_1596354674079&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [3, 9, 4, 2, 7, 6];

/*arrow function*/
arr.forEach( (currentValue,index,array) =&amp;gt; {
    if (currentValue % 2 == 0) {
        console.log(&quot;currentValue:&quot;+currentValue);
        console.log(&quot;index:&quot;+index);
        console.log(&quot;array:&quot;+array);
        /*console.log
         &quot;currentValue:4&quot;
         &quot;index:2&quot;
         &quot;array:3,9,4,2,7,6&quot;
         &quot;currentValue:2&quot;
         &quot;index:3&quot;
         &quot;array:3,9,4,2,7,6&quot;
         &quot;currentValue:6&quot;
         &quot;index:5&quot;
         &quot;array:3,9,4,2,7,6&quot;
        */
    }
});

/*normal*/
arr.forEach( function(currentValue,index,array){
    if (currentValue % 2 == 0) {
        console.log(&quot;currentValue:&quot;+currentValue);
        console.log(&quot;index:&quot;+index);
        console.log(&quot;array:&quot;+array);
    }
});

/*for*/
for (var i = 0; i &amp;lt; arr.length; i++) {
    if (arr[i] % 2 == 0) {
        console.log(arr[i]);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;코드라인의 수나 구문을 읽을때 가독성은 for문이나, foreach나 큰 차이는 없어보인다.&lt;/p&gt;
&lt;p&gt;하지만 2가지의 다른 부분이 존재한다.&lt;/p&gt;
&lt;p&gt;1. 스코프가 간섭받지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;for&lt;/span&gt;&lt;/b&gt; 예제에서 임시 변수&amp;nbsp;&lt;span style=&quot;background-color: #9d9d9d;&quot;&gt; &lt;b&gt;i &lt;/b&gt;&lt;/span&gt;에 대해서 사용을 하였다, 이는 메모리나 성능에는 아주 미미한 간섭정도이나 추후 언제&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;사용할지 모르게 되는 &lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;i&amp;nbsp;&lt;/b&gt;&lt;/span&gt;로 인해 가독성의 문제가 생길 여지는 존재&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 값에 대한 접근 방법의 차이&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #9d9d9d;&quot;&gt;foreach&lt;/span&gt;&lt;/b&gt;의 경우 &lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;&lt;b&gt;currentValue&lt;/b&gt;&lt;/span&gt;로 첫 번째 인자 값이 들어오므로 좀더 손쉽게 요소의 값을 얻을 수 있으나,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;for&lt;/span&gt;&lt;/b&gt;문의 경우 &lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #9d9d9d;&quot;&gt;arr[i]&lt;/span&gt;&lt;/b&gt;로 값을 얻어야 하므로 조금 더 불편한 점이 분명 존재&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;map&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인덱스&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&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: #8a3db6;&quot;&gt;return&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;});&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1595926227944&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arrValue = [1,2,3,4];

let result = arrValue.map((returnVal) =&amp;gt; { 
        return returnVal+1;
    });

console.log(arrValue);	//[1, 2, 3, 4]
console.log(result);	//[2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;map&lt;/span&gt;&lt;/b&gt;은 해당 배열의 &lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;/span&gt;만큼 반복문을 돌며 해당 요소를 순서대로 불러와 매핑을 시켜줍니다. 이때 요소로 사용된 배열은 영향을 받지 않는것이 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;의 특징이며 이 특징으로 인해 콜백의 값을 모아 &lt;b&gt;새로운 배열&lt;/b&gt;을 만들때 사용됨&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;filter&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인덱스&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&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: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;조건 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;});&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1597223723379&quot; class=&quot;javascript&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const words = ['computer', 'ace', 'coffe', 'axe', 'kinfe', 'present'];

const result = words.filter(word =&amp;gt; word.length &amp;gt; 6);
console.log(result); //[&quot;computer&quot;, &quot;present&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;filter&lt;/span&gt;&lt;/b&gt;는 &lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;/span&gt;만큼 반복문을 돌며 해당 조건 true/false에 해당하는 것만 &lt;b&gt;배열&lt;/b&gt;로 반환해 준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;find&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인덱스&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&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: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;});&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1597728524940&quot; class=&quot;javascript&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = [4, 15, 377, 395, 400, 1024, 3000];

let arr2 = arr.find((n) =&amp;gt; (n % 5 === 0));
/* 
let arr2 = arr.find(function( n ){
  //if(n%5===0);
  //console.log(n%5);
  console.log(&quot;n:&quot;+n);
  return n%5===0;
});
*/
console.log(arr2);	// 15&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;find&lt;/span&gt;&lt;/b&gt;는 조건에 해당하는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;요소 &lt;/span&gt;하나만 반환한다.&lt;/p&gt;
&lt;p&gt;(배열의 인덱스를 반환하고 싶다면 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;findIndex()&lt;/span&gt;&lt;/b&gt;, &lt;span style=&quot;color: #333333;&quot;&gt;배열 요소의 위치를 찾고싶다면 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;indexOf()&lt;/span&gt;&lt;/b&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;reduce&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;reduce는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;map&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;find&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;filter&lt;/span&gt;의 대체로 사용이 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;reduce&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(( &lt;span style=&quot;color: #ee2323;&quot;&gt;이전값&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;현재값&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span&gt; 현재인덱스, &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: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;});&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1597741533891&quot; class=&quot;javascript&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = [9, 2, 8, 5, 7]
let sum = arr.reduce((pre, val) =&amp;gt; pre + val)
console.log(sum)	// 31

// map
var arr = ['foo', 'hello', 'diamond', 'A']
var arr2 = arr.reduce((pre, value) =&amp;gt; {
    pre.push(value.length)
    return pre
}, [])
console.log(arr2)   // [3, 5, 7, 1]

// filter
var arr = [4, 15, 377, 395, 400, 1024, 3000]
var arr2 = arr.reduce((pre, value) =&amp;gt; {
    if (value % 5 == 0) {
        pre.push(value);
    }
    return pre;
}, []);
console.log(arr2)    // [15, 395, 400, 3000]

// find
var arr = [4, 15, 377, 395, 400, 1024, 3000]
var arr2 = arr.reduce((pre, value) =&amp;gt; {
    if (typeof pre == 'undefined' &amp;amp;&amp;amp; value % 5 == 0) {
        pre = value;
    }
    return pre;
}, undefined);
console.log(arr2)  // 15&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/JavaScript</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/30</guid>
      <comments>https://code-monkey7.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 18 Aug 2020 18:08:41 +0900</pubDate>
    </item>
    <item>
      <title>[오라클 성능 고도화] 오라클 아키텍처 - 02. DB 버퍼 캐시</title>
      <link>https://code-monkey7.tistory.com/29</link>
      <description>&lt;p&gt;&lt;b&gt;SGA(System Global Area)&lt;/b&gt;는 빠른 입출력을 위해 사용된다. 그 구성요소중 하나가 바로 DB버퍼 캐시&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) 블록 단위 I/O&lt;br /&gt;&amp;nbsp;하나의 레코드에서 하나의 컬럼만 읽게 되더라도 레코드 전체가 속한 &lt;b&gt;블록 전체를 읽게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 버퍼 캐시의 구조&lt;/p&gt;
&lt;p&gt;&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/n1xT3/btqGywqeEub/nt5mz18qyHkWtPGuF4k4Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1xT3/btqGywqeEub/nt5mz18qyHkWtPGuF4k4Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1xT3/btqGywqeEub/nt5mz18qyHkWtPGuF4k4Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1xT3%2FbtqGywqeEub%2Fnt5mz18qyHkWtPGuF4k4Pk%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* 데이터 블록을 해싱 하기위해서 사용되는 것이 &lt;b&gt;데이터 블록 주소(DBA, Data Block Address)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;* 각각의 버퍼 헤더를 연결 하는것이 &lt;b&gt;해시 체인(hash chain)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;* 해시 체인은 &lt;b&gt;래치(Latch)&lt;/b&gt;에 의해 보호된다.(같은 리소스에 대한 액세스를 직렬화하는 일종의 Lock)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* cache buffers chains래치&lt;/b&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; - 버퍼 헤더에 Pin을 설정할때도 사용된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* LRU(least recently used)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; - 사용빈도가 높은 데이터 블록이 위주로 사용되도록 하는 알고리즘(빈도가 낮은 데이터 블록 부터 밀어냄)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; - MRU(Most Recently Used) end&amp;nbsp; ----&amp;gt; LRU&lt;span style=&quot;color: #333333;&quot;&gt;(least recently used)&amp;nbsp;&lt;/span&gt; end&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 1) Dirty 리스트(=LRUW(LRU Write)) : 캐시 내에서 변경 됐지만, 아직 디스크에 기록되지 않은 Dirty 버퍼 블록을 관리.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 2) LRU 리스트 : 아직 Dirty 리스트로 옮겨지지 않은 나머지 버퍼 블록을 관리&lt;/p&gt;
&lt;p&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;(해당 리스트를 보호하기 위한 래치 : cache buffers lru chain래치)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* 버퍼 상태&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 1) Free 버퍼 : 비어있는 상태이거나, 언제든 사용되어도 무방한 상태(사용될 시 Dirty 버퍼로 변경)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 2) Dirty 버퍼 : 버퍼 캐시되어으나 아직 디스크에 기록되지 않은 버퍼 블록(디스크에 기록될시 Free버퍼로 변경)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 3) Pinned 버퍼 : 읽기,쓰기 작업을 위해 액세스 되고 있는 버퍼 블록&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;b&gt;출처&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;span&gt;조시형,『오라클 성능 고도화 원리와 해법Ⅰ』&lt;/span&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>DB 버퍼캐시</category>
      <category>SGA</category>
      <category>SQLP</category>
      <category>디비 버퍼 캐시</category>
      <category>버퍼 캐시</category>
      <category>오라클 성능 고도화 해법</category>
      <category>오라클 아키텍쳐</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/29</guid>
      <comments>https://code-monkey7.tistory.com/29#entry29comment</comments>
      <pubDate>Wed, 12 Aug 2020 00:30:34 +0900</pubDate>
    </item>
    <item>
      <title>[오라클 성능 고도화] 오라클 아키텍처 - 01. 기본 아키텍처</title>
      <link>https://code-monkey7.tistory.com/28</link>
      <description>&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/NxcuB/btqFZNUL6iF/HCZ2ulkmhOe2coPfUevZIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NxcuB/btqFZNUL6iF/HCZ2ulkmhOe2coPfUevZIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NxcuB/btqFZNUL6iF/HCZ2ulkmhOe2coPfUevZIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNxcuB%2FbtqFZNUL6iF%2FHCZ2ulkmhOe2coPfUevZIk%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;&lt;span style=&quot;color: #333333;&quot;&gt;오라클은 데이터베이스와 이를 액세스하는 프로세스 사이에 SGA(System Global Area)라고 하는 메모리 캐시 영역을 두고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;데이터베이스 : Datafile, Redo Log File, Control File 등의 집합&lt;/p&gt;
&lt;p&gt;인스턴스 : SGA 공유 메모리 영역과 이를 액세스 하는 프로세스의 집합&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로세스 : 서버 프로세스와 백그라운드 프로세스의 집합&lt;/p&gt;
&lt;p&gt;- 서버 프로세스&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;1) 최적화 수행 및 SQL을 실행하면서 결과 집합을 만듬&lt;/p&gt;
&lt;p&gt;&amp;nbsp;2) 네트워크를 통해 전송하는 일련의 작업들을 모두 서버 프로세스 가 처리&lt;/p&gt;
&lt;p&gt;&amp;nbsp;3) 서버프로세스만을 위한 독립적인 공간을 PGA(Program Global Area)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 백그라운드 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;1) 데이터 파일로부터 DB버퍼 캐시로 블록을 적재&lt;/p&gt;
&lt;p&gt;&amp;nbsp;2) Dirty 블록을 캐시에서 밀어냄으로써 Free 블록을 확보&lt;/p&gt;
&lt;p&gt;&amp;nbsp;3) Redo 로그 버퍼를 비움&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/b0sgUs/btqFXIGUeX2/TyUq0JCPJTp1k1dbmuJy60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0sgUs/btqFXIGUeX2/TyUq0JCPJTp1k1dbmuJy60/img.png&quot; data-alt=&quot;오라클 인스턴스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0sgUs/btqFXIGUeX2/TyUq0JCPJTp1k1dbmuJy60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0sgUs%2FbtqFXIGUeX2%2FTyUq0JCPJTp1k1dbmuJy60%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;&lt;b&gt;◎ 오라클 접속 과정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 1. LISTENER로 연결 요청&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 2. LISTENER에서 프로세스 생성 연결요청 상속&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 3. PGA(Program Global Area *서버 프로세스만을 위한 독립적인 공간) 에 메모리 생성&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 4. SERVER에서 사용자에게 RESEND 패킷 전송&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 5. 연결&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/JBuLo/btqFZ6mkgW8/AxGBZTysl0nTWeUf4YG6bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBuLo/btqFZ6mkgW8/AxGBZTysl0nTWeUf4YG6bK/img.png&quot; data-alt=&quot;오라클 접속 시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBuLo/btqFZ6mkgW8/AxGBZTysl0nTWeUf4YG6bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBuLo%2FbtqFZ6mkgW8%2FAxGBZTysl0nTWeUf4YG6bK%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;- 리스너에 연결요청을 하는 순간 하나의 프로세스를 띄우고 PGA 메모리를 할당한다.&lt;/p&gt;
&lt;p&gt;- 오라클에 접속하는 어플리케이션을 구축할 때 반드시 커넥션 풀(Connection Pool) 기능이 필요하다&lt;/p&gt;
&lt;p&gt;&amp;nbsp; (래치획득 과정을 줄임으로써 성능개선)&lt;/p&gt;
&lt;p&gt;- 한번 커녁션을 맺으면 작업을 완료하더라도 이를 해제하지 않고 어플리케이션 서버에 Pooling하고 있다가&lt;/p&gt;
&lt;p&gt;&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/ZYtiv/btqF3T7ml9H/eKlhZb7258olPmervDFnC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZYtiv/btqF3T7ml9H/eKlhZb7258olPmervDFnC0/img.png&quot; data-alt=&quot;RAC(Real Application Cluster) 환경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZYtiv/btqF3T7ml9H/eKlhZb7258olPmervDFnC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZYtiv%2FbtqF3T7ml9H%2FeKlhZb7258olPmervDFnC0%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;RAC(Real Application Cluster) 환경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 기본적인 구성으로 오라클을 설치 시 하나의 데이터베이스에 접근하는 하나의 인스턴스가 생성되나 RAC환경에서는&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 하나의 데이터베이스를 액세스하는 다중 인스턴스로 구성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- RAC는 공유 캐시 방식(Shared Cache)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; *과거에는 공유 디스크 방식(디스크 방식을 사용함으로써 생기는 동기화 과정을 핑(Ping)이라 불렀다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 글로벌 캐시 개념을 사용하므로 로컬 캐시에 없는 데이터블록을 이웃 노드에 전송받아 서비스 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 다른 인스턴스에서 갱신하고 아직 커밋하지 않은 Active상태의 블록까지도 디스크를 경유하지 않고 Dirty버퍼 상태에&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 서 네트워크를 통해 서로 주고받으며 수행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 여러개의 인스턴스가 하나의 데이터베이스를 액세스하는 것은 가능하지만, 하나의 인스턴스가 여러개의 데이터베이스&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 를 액세스 하는것은 불가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; * DB Link는 일반 클라이언트 세션과 동일하게 Oracle Net을 이용해 SQL 기반으로 데이터를 읽고 쓰는 구조이므로&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; 아키텍처와는 별개로 이해가 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;b&gt;출처&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;span&gt;조시형,『오라클 성능 고도화 원리와 해법Ⅰ』&lt;/span&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>db버퍼캐시</category>
      <category>PGA</category>
      <category>rac</category>
      <category>SGA</category>
      <category>SQLP</category>
      <category>오라클 성능 고도화</category>
      <category>오라클 아키텍처</category>
      <category>인스턴스</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/28</guid>
      <comments>https://code-monkey7.tistory.com/28#entry28comment</comments>
      <pubDate>Mon, 27 Jul 2020 09:01:50 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript]값  - 1.2 문자열</title>
      <link>https://code-monkey7.tistory.com/27</link>
      <description>&lt;p&gt;&lt;b&gt;문자열&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;자바스크립트 문자열은 실제로 생김새만 비슷하지, 문자 배열과 같지 않다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595554058919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = &quot;abc&quot;;
var b = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;];

//배열과 마찬가지로 문자열도 length, indexOf(),concat() 메서드를 사용할 수 있다.
console.log(a.length);	//3
console.log(b.length);	//3

console.log(a.indexOf(&quot;b&quot;)); //1
console.log(b.indexOf(&quot;b&quot;)); //1

var c = a.concat(&quot;eng&quot;); // &quot;abceng&quot;
var d = b.concat(&quot;eng&quot;); // [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;e&quot;,&quot;n&quot;,&quot;g&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 예시만 봤을때는 문자의 배열이라고 이해할수 있으나, &lt;b&gt;문자열&lt;/b&gt;은 &lt;b&gt;불변 값&lt;/b&gt;, &lt;b&gt;배열&lt;/b&gt;은 &lt;b&gt;가변 값&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p&gt;문자열 메서드는 새로운 문자열을 생성한 후 반환한다. 반면 배열 메서드는 그 자리에서 원소를 변경한다.&lt;/p&gt;
&lt;p&gt;그러므로 문자열에 대부분의 배열 메서드는 사용할 수 없으나, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;문자열에 대한 &lt;b&gt;불변 배열 메서드&lt;/b&gt;를 빌려쓰기는&amp;nbsp;가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595556657060&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = &quot;test&quot;;

console.log(a.join);  //undefined
console.log(a.map);   //undefined

//불변 배열 메서드
var c = Array.prototype.join.call( a, &quot;_&quot;);
var d = Array.prototype.map.call(a, function(v){
    return v.toUpperCase()+&quot;.&quot;;
}).join( &quot;&quot; );

console.log(c);//&quot;t_e_s_t&quot;
console.log(d);//&quot;T.E.S.T.&quot;

//문자열 거꾸로 뒤집기, 가변 배열 메서드라 사용 불가
console.log(Array.prototype.reverse.call(a)); //TypeError&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;reverse&lt;/span&gt;같은 경우에는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;call&lt;/span&gt;을 통해서도 사용이 불가능 한데, 아래와 같은 꼼수로는 해결이 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;단, 복잡한 문자(유니코드,특수문자 등등) 이 섞여있다면 라이브러리 유틸이 필요하다. ex:에스레베르)&lt;/p&gt;
&lt;pre id=&quot;code_1595562272897&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//1) 'a'를 문자의 배열로 분할
//2) 문자 배열의 순서를 reverse처리
//3) 문자배열을 합쳐 다시 문자열로 돌린다.
var e = a.split(&quot;&quot;).reverse().join(&quot;&quot;);
console.log(e); // &quot;tset&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;문자열에서는 왠만한 함수는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;Array.prototype.call()&lt;/span&gt;을 통해 배열 메서드가 사용 가능하다.&lt;/p&gt;
&lt;p&gt;다만 가변 배열 메서드인&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;reverse()&lt;/span&gt;의 경우에는 사용 불가하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배열을 문자열로 표현할때는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;join(&quot;&quot;)&lt;/span&gt; 메서드를 활용하자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/JavaScript</category>
      <category>javascript</category>
      <category>javascript call</category>
      <category>javascript join</category>
      <category>javascript 값</category>
      <category>javascript 문자열</category>
      <category>문자열 reverse</category>
      <category>문자열 배열 메서드</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/27</guid>
      <comments>https://code-monkey7.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 24 Jul 2020 12:49:35 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript]값 - 1.1 배열</title>
      <link>https://code-monkey7.tistory.com/26</link>
      <description>&lt;p&gt;자바스크립트 배열은 다른언어와는 다르게 어떤 타입의 값이던, 객체던 상관없이 모두 담을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1594882357578&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = [1, &quot;2&quot;, [3] ];

a.length; //3
a[0] === 1; //true
a[2][0] === 3; //true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배열의 크기를 미리 정하지 않고도 선언할 수 있으나, 빠진 슬롯이 있는 배열을 사용한다면 주의가 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1594882889533&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = [];

a[0] = 1;
a[2] = [5];

a[1]; //undefined
a.length; // 3
a[2]; // [5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배열 인덱스는 숫자인데, 배열 자체도 하나의 객체이므로 키/프로퍼티 문자열을 추가할 수 있다.&lt;/p&gt;
&lt;p&gt;하지만 배열자체의 length가 증가하지 않으므로 사용이 까다로울 수 있다. 또한, 키로 넣은 문자열 값이 표준 10진수 숫자로 타입이 바뀌면, 문자열 키가 아닌 숫자 키를 사용한것과 같은 결과가 초래되니 주의가 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1594884570831&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = [];

a[&quot;testjs&quot;] = 2;

a[&quot;testjs&quot;];  //2
a.testjs;  //2

/*배열 length는 증가되지 않는다.*/
a.length;  //0

var b = [];
b[&quot;9&quot;] = 21; 
 
b[&quot;9&quot;];   //21
//length 호출 시 &quot;9&quot;가 형변환을 통해 숫자로 인식하게됨
b.length; //10&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;유사배열&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;i&gt;배열이 아닌데 배열과 같은 형태를 취하고 있는 것&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;특정 돔을 찾아서 그 아래의 자식을 리턴하는 예제이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595385261966&quot; class=&quot;html xml&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;kr&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&quot;init&quot;&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
    let outer = document.querySelector('#init').children;
    console.log(init);	//해당하는 돔 아래의 객체 조회
    console.log(typeof init);	//돔의 타입
    console.log(Array.isArray(init));	//돔은 배열인가?
    console.log(init instanceof Array);		//배열과 같은가?
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;실행결과&lt;/b&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/bejaUR/btqFS0tatYh/zXAoJ9AOL1TKBBkq2Ws070/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bejaUR/btqFS0tatYh/zXAoJ9AOL1TKBBkq2Ws070/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bejaUR/btqFS0tatYh/zXAoJ9AOL1TKBBkq2Ws070/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbejaUR%2FbtqFS0tatYh%2FzXAoJ9AOL1TKBBkq2Ws070%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;이와같이 유사배열은 배열은 아니지만 배열과 같은 형태를 취하고있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유사배열을 직접 만들수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1595386434444&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = { 
    0 : 't',
    1 : 'e',
    2 : 's',
    3 : 't',
    length : 4 //유사배열은 반드시 length 가 선언되어있어야 한다.
}

console.log(typeof arr); //&quot;object&quot;
console.log(Array.isArray(arr)); //&quot;false&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;유사배열은 앞서 말했듯이, 배열의 형태를 띄고있는것이지 배열자체는 아니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;그러므로 배열과 관련된 함수(array method)를 사용할 수 없다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유사배열을 배열과같이 사용하려면 아래와 같이 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;a style=&quot;background-color: #dddddd;&quot; href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Array.from()&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;을 활용하자.(es6이상)&lt;/p&gt;
&lt;pre id=&quot;code_1595398427652&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function fn_getArr(){
    let arr = Array.from(arguments);

    arr.forEach((value, key) =&amp;gt; {
        console.log(`${value} : ${key}`);
        /*
          &quot;t : 0&quot;
          &quot;e : 1&quot;
          &quot;s : 2&quot;
          &quot;t : 3&quot;
        */
    });
    console.log(typeof(arr));	//&quot;object&quot;
    console.log(Array.isArray(arr));//&quot;true&quot;
}

fn_getArr('t','e','s','t');&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/JavaScript</category>
      <category>array from</category>
      <category>array method</category>
      <category>Array.isArray</category>
      <category>javascript 배열</category>
      <category>유사배열</category>
      <category>자바스크립트 배열</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/26</guid>
      <comments>https://code-monkey7.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 22 Jul 2020 15:47:50 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] type,typeof</title>
      <link>https://code-monkey7.tistory.com/25</link>
      <description>&lt;p&gt;&lt;b&gt;type&lt;/b&gt; *어떤 값을 다른 값과 분별할 수 있는, 고유한 내부 특성의 집합&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우리가 보기에는 &quot;1&quot;과 1은 동일한 값으로 볼 수 있지만, ECMAScript에서의 해당 값들은 서로 타입이 다르다.(문자,숫자열)&lt;/p&gt;
&lt;p&gt;해당 내용은 자바스크립트뿐 아닌 프로그래밍 언어를 접한 누구나 다 다르다고 알고 있지만, 오늘은 기본적인 타입에 대한 내용이 아닌 흔히 잘 사용하지 않는 부분에 대해 서술하고자 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;[내장 타입]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;자바스크립트에는 아래&lt;span style=&quot;color: #333333;&quot;&gt;와 같은 7가지의&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내장 타입이 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;null&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;undefined&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;number&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;object&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;symbol (ES6부터 추가)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이러한 내장 타입은 typeof 연산자를 통해 결과를 확인 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1594282535309&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typeof undefined === &quot;undefined&quot;; //true
typeof true === &quot;boolean&quot;; //true
typeof 11 === &quot;number&quot;; //true
typeof &quot;11&quot; === &quot;string&quot;; // true
typeof { sample : 11 } === &quot;object&quot;; //true
typeof null === &quot;object&quot;; //true

//ES6 이후
typeof Symbol() === &quot;symbol&quot;; //true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;분명 자바스크립트 타입에는 null이 존재하지만 실제로 null을 typeof 연산자를 통하여 반환하면 null이 아닌 object가 반환된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;typeof연산자를 통해 null값을 체크하려면 강제 형변환을 이용하여 아래와 같이 선언되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1594283461227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typeof null //&quot;object&quot;
typeof !null //&quot;boolean&quot;

(!null &amp;amp;&amp;amp; typeof null === &quot;object&quot;); //true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;null의 타입은 object이지만, false의 성격을 띠고 있는 null을 !연산자를 통한 강제 형변환 시 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;boolean타입&lt;/span&gt;으로 변환된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;function(함수)&lt;/b&gt;의 경우에는 typeof 호출 시 어떻게 나올까?&lt;/p&gt;
&lt;pre id=&quot;code_1594284898856&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typeof function a(){} // &quot;function&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;앞서 얘기한 7가지의 타입이 아닌 &lt;b&gt;function&lt;/b&gt;이라는 문자열이 나왔다. 완전 새로운 타입의 타입으로 이해할 수도 있겠으나, 사실 function은 object(객체)의 하위 타입이다. 즉 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;function&lt;/b&gt;은 객체이므로 아래와 같은 프로퍼티를 이용한 함수의 인자 개수도 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1594356231317&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function a(b,c){
	/*...*/
}

a.length; //2 해당 function에서의 인자 개수&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;[undefined, undeclared]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;undefined&lt;/b&gt;(값이 없는), &lt;b&gt;undeclared(&lt;/b&gt;선언되지 않은)의 의미를 숙지 후 아래의 실행 결과를 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1594358370223&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var x;

typeof x; //&quot;undefined&quot;
//존재하지 않는 변수
typeof y; //&quot;undefined&quot;
y;        //&quot;ReferenceError: y is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변수는 선언되었으나 값이 존재하지 않는 x의 typeof 결과는 우리가 예상 하듯이 &quot;undefined&quot;이다.&lt;br /&gt;하지만 &lt;b&gt;선언되지 않은 변수y&lt;/b&gt;의 typeof 결과 또한 &lt;b&gt;&quot;undefined&quot;&lt;/b&gt;로 나온다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;typeof는 선언되지 않은 변수인지, 변수에 값이 할당되지 않았는지 구분없이 결과는 모두 &quot;undefined&quot;이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;선언되지 않은 변수의 결과를 &quot;undeclared&quot;라고 명명 했으면 헷갈릴 일도 없었겠지만, 아쉬운 부분이다.&lt;/p&gt;
&lt;p&gt;typeof가 갖는 특이한 점은 또 있다. 변수y를 typeof 쓰지않고 호출 시 브라우저는 &lt;b&gt;오류&lt;/b&gt;로 인식하지만,&lt;/p&gt;
&lt;p&gt;typeof를 이용한 결과는 &lt;b&gt;safety guard(안전가드)&lt;/b&gt;로 인해 오류로 처리되지 않고 &quot;undefined&quot;라는 결과를 호출하며, &lt;br /&gt;&lt;b&gt;오류없이&lt;/b&gt; 예외사항을 체크 할 수 있게 도와준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1594598448227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function setData(){
	var convertDt = (typeof castDate !== &quot;undefined&quot;) ? 
    	castDate : 
        /*해당함수가 없으면 생성*/
        function(){
        	
        }
	var val = convertDt();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;setData 함수는 castDate라는 함수가 존재하면 해당 함수를 사용, 없으면 해당 함수를 정의하는 예시 코드이다.&lt;/p&gt;
&lt;p&gt;위와같이 typeof연산자를 이용하여 선언되지 않은 함수의 존재여부를 체크할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/JavaScript</category>
      <category>javascript type</category>
      <category>typeof</category>
      <category>undeclared</category>
      <category>undefined</category>
      <category>내장타입</category>
      <category>자바스크립트 타입</category>
      <category>타입</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/25</guid>
      <comments>https://code-monkey7.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 13 Jul 2020 10:39:44 +0900</pubDate>
    </item>
    <item>
      <title>[MSSQL] OPENROWSET ,OPENDATASOURCE,OPENQUERY / Linked Server(연결된서버) 개념 및 장단점, 사용방법</title>
      <link>https://code-monkey7.tistory.com/24</link>
      <description>&lt;p&gt;같은 네트워크(물리적인 서버)가 동일하다면 걱정할 필요없이 단순히 [서버].[dbo].[테이블명]을 통해 조회가 가능하지만,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다른 DB정보를 가져올때는 다른 여러 방법을 통하여 정보를 가져올 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[연결된 서버(LINKED SERVER)]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 다른 외부 서버와의 연결&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;자주 사용되는 경우 성능적인 측면이 요구되므로 해당 방법이 최우선 고려 대상&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1593997744319&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   /* MSSQL 연결된 서버 생성 */
   EXEC sp_addlinkedserver
      @server = '[연결된 서버별칭]',
      @srvproduct = '',
      @provider = 'SQLOLEDB',
      @datasrc = '[서버 아이피]',
      @catalog = '[데이터 베이스명]'
      
   /* MSSQL 연결계정 생성 */
   EXEC sp_addlinkedsrvlogin
      @rmtsrvname= '[연결된 서버별칭]',
      @useself= 'false',
      @rmtuser = '[사용자 이름]',
      @rmtpassword = '[사용자 암호]'
   
   /* MSSQL 연결된 서버 확인*/
   SELECT * FROM master.dbo.sysservers WHERE srvname = '[연결된 서버별칭]'
   
   /* MSSQL 연결계정 확인 */
   SELECT * FROM master.sys.linked_logins WHERE remote_name = '[사용자 이름]'   
   
   /*연결된 서버 사용*/
   SELECT [컬럼명] FROM [연결된 서버별칭].[데이터 베이스명].[데이터베이스 소유자명].[테이블명] WHERE [조건절]   
   
   /*연결된 서버 삭제[연결된 계정이 있을경우 계정먼저 삭제]*/
   EXEC sp_dropserver
      @server = '[연결된 서버별칭]'   
      
   /*연결된 계정 삭제*/
   EXEC sp_droplinkedsrvlogin
      @rmtsrvname= '[연결된 서버별칭]',
      @locallogin = NULL

   &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[OPENROWSET &amp;amp; &lt;b&gt;OPENDATASOURCE &lt;/b&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* LINKED SERVER를 이용하지 않고, 커넥션스트링을 이용하여 바로 연결한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; 자주 사용되지 않는 연결시에는 OPENROWSET을 활용하게되며, LINKED SERVER에 비해 성능은 부족하다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* txt,json 등 물리파일을 읽어서 대용량(BULK) INSERT 가능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* &lt;span&gt;OPENDATASOURCE는 변수를 인수로 받아들이지 않음&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1593993261844&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*OPENROWSET 활성화를 위한 아래 구문 실행
EXEC SP_CONFIGURE'show advanced options', 1
EXEC SP_CONFIGURE'Ad Hoc Distributed Queries', 1
*/

--파일 전체 내용 읽기(BULK)
INSERT INTO myTable(content)   
   SELECT BulkColumn
          FROM OPENROWSET(BULK N'C:\Text1.txt', SINGLE_BLOB) AS Document;
          
 --json 파일 읽기 
 --openrowset(bulk)를 이용하여 json파일 전체 내용을 읽기 쉽도록 표시, 
 --json구문을 분석하고 열을 반환하는 oepnjson 함수에 BulkColumn을 제공 
   SELECT book.*
     FROM OPENROWSET (BULK 'C:\JSON\Books\books.json', SINGLE_CLOB) as j
          CROSS APPLY OPENJSON(BulkColumn)
          WITH( id nvarchar(100), name nvarchar(100), price float,
                pages int, author nvarchar(100)) AS book
                
--원격 연결 정보 가져오기
SELECT * FROM 
OPENROWSET('SQLOLEDB','IP정보';'유저ID';'PWD', 'SELECT * FROM 원격테이블')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[OPENQUERY]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MSSQL간의 연결이 아닌 다른기종의 데이터베이스와 데이터 정보 조회 시 이용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(선행조건: 연결된서버(LINKED SERVER))&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1594000460288&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 타기종 DB와의 정보조회 */
SELECT [컬럼명] FROM OPENQUERY ([연결된 서버별칭], 'SELECT [컬럼명] FROM [테이블명]')&lt;/code&gt;&lt;/pre&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;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15&quot;&gt;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1593997889434&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;OPENROWSET(Transact-SQL) - SQL Server&quot; data-og-description=&quot;OPENROWSET(Transact-SQL)OPENROWSET (Transact-SQL) 이 문서의 내용 --&amp;gt; 적용 대상: SQL Server Azure SQL Database Azure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL &quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15&quot; data-og-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/openrowset-transact-sql?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;OPENROWSET(Transact-SQL) - SQL Server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;OPENROWSET(Transact-SQL)OPENROWSET (Transact-SQL) 이 문서의 내용 --&amp;gt; 적용 대상: SQL Server Azure SQL Database Azure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://sodocumentation.net/ko/sql-server/topic/7330/%EB%8C%80%EB%9F%89-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0&quot;&gt;https://sodocumentation.net/ko/sql-server/topic/7330/%EB%8C%80%EB%9F%89-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1593999424488&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Microsoft SQL Server - 대량 가져 오기 | sql-server Tutorial&quot; data-og-description=&quot;sql-server documentation: 대량 가져 오기&quot; data-og-host=&quot;sodocumentation.net&quot; data-og-source-url=&quot;https://sodocumentation.net/ko/sql-server/topic/7330/%EB%8C%80%EB%9F%89-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0&quot; data-og-url=&quot;https://sodocumentation.net/ko/sql-server/topic/7330/대량-가져-오기&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://sodocumentation.net/ko/sql-server/topic/7330/%EB%8C%80%EB%9F%89-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sodocumentation.net/ko/sql-server/topic/7330/%EB%8C%80%EB%9F%89-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Microsoft SQL Server - 대량 가져 오기 | sql-server Tutorial&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;sql-server documentation: 대량 가져 오기&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;sodocumentation.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql?view=sql-server-ver15&quot;&gt;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql?view=sql-server-ver15&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1594000033218&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;OPENDATASOURCE(Transact-SQL) - SQL Server&quot; data-og-description=&quot;OPENDATASOURCE(Transact-SQL)OPENDATASOURCE (Transact-SQL) 이 문서의 내용 --&amp;gt; 적용 대상: SQL Server azure sql Managed Instance AZURE Synapse Analytics (SQL DW) 아니요 병렬 데이터 웨어하우스APPLIES TO: SQL Server Azure SQL Managed Inst&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql?view=sql-server-ver15&quot; data-og-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql?view=sql-server-ver15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/ko-kr/sql/t-sql/functions/opendatasource-transact-sql?view=sql-server-ver15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;OPENDATASOURCE(Transact-SQL) - SQL Server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;OPENDATASOURCE(Transact-SQL)OPENDATASOURCE (Transact-SQL) 이 문서의 내용 --&amp;gt; 적용 대상: SQL Server azure sql Managed Instance AZURE Synapse Analytics (SQL DW) 아니요 병렬 데이터 웨어하우스APPLIES TO: SQL Server Azure SQL Managed Inst&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB/MsSql</category>
      <category>DB연결</category>
      <category>OPENDATASOURCE</category>
      <category>OPENQUERY</category>
      <category>OPENROWSET</category>
      <category>다른 db 연결</category>
      <category>연결된 서버</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/24</guid>
      <comments>https://code-monkey7.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 6 Jul 2020 10:55:06 +0900</pubDate>
    </item>
    <item>
      <title>[Window] 명령어를 통한 압축구현</title>
      <link>https://code-monkey7.tistory.com/23</link>
      <description>&lt;p&gt;cmd 명령어 중 forfiles와 zip.exe를 통해 다양한 형태로 파일을 압축할 수있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[FORFILES] * cmd에서 forfiles /? 입력시 아래와 같은 도움말 정보를 확인 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1592580133442&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FORFILES [/P pathname] [/M searchmask] [/S]
         [/C command] [/D [+ | -] {yyyy-MM-dd | dd}]

설명:
    파일(또는 파일 집합)을 선택하고 파일에 명령을
    실행합니다. 일괄 작업에 유용합니다.

매개 변수 목록:
    /P    pathname      검색을 시작할 경로를 지정합니다.
                        현재 작업 디렉터리(.)가 기본
                        폴더입니다.

    /M    searchmask    검색 마스크에 따라 파일을 검색합니다.
                        '*'이 기본 검색 마스크입니다.

    /S                  하위 폴더를 포함하도록
                        지정합니다. 예, &quot;DIR /S&quot;

    /C    command       각 파일에 실행할 명령을 지정합니다.
                        명령 문자열을 큰따옴표로 묶어야
                        합니다.

                        &quot;cmd /c echo @file&quot;이 기본 명령입니다.

                        명령 문자열에 다음 변수를 사용할 수
                        있습니다.
                        @file    - 파일 이름을 반환합니다.
                        @fname   - 확장명 없이 파일 이름을
                                   반환합니다.
                        @ext     - 파일의 확장명만
                                   반환합니다.
                        @path    - 파일의 전체 경로를 반환합니다.
                        @relpath - 파일의 상대 경로를
                                   반환합니다.
                        @isdir   - 파일 형식이 디렉터리인 경우 &quot;TRUE&quot;를
                                   반환하고 파일인 경우 &quot;FALSE&quot;를 반환합니다.
                        @fsize   - 파일의 크기(바이트)를
                                   반환합니다.
                        @fdate   - 파일을 마지막으로 수정한 날짜를
                                   반환합니다.
                        @ftime   - 파일을 마지막으로 수정한 시간을
                                   반환합니다.

                        명령줄에 특수 문자를 포함하려면
                         0xHH 형식의 16진수 코드(예, 탭은 0x09)를
                        사용하십시오. 내부 CMD.exe 명령
                        앞에는 &quot;cmd /c&quot;를 사용해야
                        합니다.

    /D    date          지정한 날짜와 마지막 수정한 날짜가 늦거나
                        같은(+) 또는 빠르거나 같은(-) 파일을
                        찾습니다.
                        날짜 포맷은 &quot;yyyy-MM-dd&quot;입니다.
                        또한 마지막 수정한 날짜가 현재 날짜에
                        &quot;dd&quot;일을 더한 날짜보다 늦거나 같은(+)
                         또는 현재 날짜에서 &quot;dd&quot;일을 뺀 날짜보다
                        작거나 같은(-) 파일을 찾습니다.
                        유효한 &quot;dd&quot; 범위는 0에서 32768까지입니다.
                        부호를 지정하지 않으면 &quot;+&quot;가 기본값입니다.

    /?                  이 도움말 메시지를 표시합니다.

예:
    FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C &quot;cmd /c type @file | more&quot;
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C &quot;cmd /c echo @path 0x09 was changed 30 days ago&quot;
    FORFILES /D 2001-01-01
             /C &quot;cmd /c echo @fname is new since Jan 1st 2001&quot;
    FORFILES /D +2020-6-20 /C &quot;cmd /c echo @fname is new today&quot;
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C &quot;cmd /c echo @fsize&quot;
    FORFILES /M *.txt /C &quot;cmd /c if @isdir==FALSE notepad.exe @file&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;FORFILES 명령어는 다양한 정보의 파일들을 검색하는데 있어서 도움을 주는데, 특히 LOG파일과 같이 많은 text파일이 생성되어 삭제가 필요할 경우에도 해당 명령어를 활용하여 검색, 제거가 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번에는 특정 파일명이 포함된 파일을 원하는 경로로 압축 후 압축된 파일은 제거하는 cmd 명령어를 찾아보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* zip.exe가 내장되어있지 않은 경우 구글에서 검색 후 다운로드 해야하며,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; c:\window\system32에 넣어두는게 추후 명령어 사용에도 편리하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래의 예시문은 upload폴더안에 있는 파일중, 202001이 포함된 파일을 압축 후 ddddd폴더로 이동하는 예시문이다.&lt;/p&gt;
&lt;p&gt;*-rm명령어를 사용하면 압축대상 파일은 압축된 후 삭제된다.&lt;/p&gt;
&lt;pre id=&quot;code_1592547237148&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;forfiles /p c:\backupTest\tomcat_source\ROOT\upload /M 202001* 
/c &quot;cmd /c C:\zip.exe -rm c:\ddddd/@file.zip @file&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이와같이 comman line 명령어를 활용 하여 bat프로그램을 만든다면 파일을 정리할때 용이하게 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;예시와 같은 파일명 검색이 아닌 파일이 수정된 날짜를 기준으로도 처리가 가능한데,&lt;/p&gt;
&lt;p&gt;해당부분은 구글 검색 시 많은 정보를 얻을 수 있으니 참조하셔서 작업해보시길..&lt;/p&gt;</description>
      <category>Language/Window</category>
      <category>cmd 압축</category>
      <category>cmd 압축 후 파일삭제</category>
      <category>cmd 파일명 검색 후 압축</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/23</guid>
      <comments>https://code-monkey7.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 20 Jun 2020 00:32:49 +0900</pubDate>
    </item>
    <item>
      <title>[MSSQL] 구성 요소 'Ad Hoc Distributed Queries'이(가) SQL Server 보안 구성의 일부로 해제 오류</title>
      <link>https://code-monkey7.tistory.com/22</link>
      <description>&lt;p&gt;&lt;b&gt;[문제점]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SQL Server에서 임시 분산 쿼리를 허용하는 옵션을 사용하였으나, 해당 옵션이 활성화 되지 않아서 생기는 문제&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[해결방안]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SQL Server에서 아래와 같은 구문을 실행하여 옵션을 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1591666382447&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sp_configure 'show advanced options', 1;

RECONFIGURE;

go

sp_configure 'Ad Hoc Distributed Queries', 1;

RECONFIGURE;

GO


sp_configure

GO&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DB/MsSql</category>
      <category>Ad Hoc Distributed Queries</category>
      <category>MsSQL 오류</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/22</guid>
      <comments>https://code-monkey7.tistory.com/22#entry22comment</comments>
      <pubDate>Tue, 9 Jun 2020 10:40:04 +0900</pubDate>
    </item>
    <item>
      <title>테이블 컬럼 코멘트 및 정보 확인 SQL</title>
      <link>https://code-monkey7.tistory.com/21</link>
      <description>&lt;p&gt;MS-SQL에서 제공하는 SSMS는 UI기반의 편한 툴이지만 테이블 정보 등 코멘트를 봐야할때는 불편한 경우가 많아&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와같은 쿼리를 작성하여 사용중이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590718793280&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT A.TABLE_NAME, 
		C.VALUE AS TABLE_COMMENT,
		A.COLUMN_NAME, A.DATA_TYPE, 
		ISNULL(CAST(A.CHARACTER_MAXIMUM_LENGTH AS VARCHAR),  
				CAST(A.NUMERIC_PRECISION AS VARCHAR) + ',' +	
				CAST(A.NUMERIC_SCALE AS VARCHAR)) AS COLUMN_LENGTH,
					A.COLUMN_DEFAULT, A.IS_NULLABLE,
					B.VALUE AS COLUM_COMMENT
	FROM INFORMATION_SCHEMA.COLUMNS A 
	LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES B
	ON B.MAJOR_ID = OBJECT_ID(A.TABLE_NAME) 
	AND A.ORDINAL_POSITION = B.MINOR_ID
	LEFT OUTER JOIN
(SELECT OBJECT_ID(OBJNAME) AS TABLE_ID, VALUE
	FROM ::FN_LISTEXTENDEDPROPERTY(NULL, 'USER','DBO','TABLE',NULL, NULL, NULL)) C
		ON OBJECT_ID(A.TABLE_NAME) = C.TABLE_ID
	WHERE A.TABLE_NAME = '테이블명'
	ORDER BY A.TABLE_NAME, A.ORDINAL_POSITION &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB/MsSql</category>
      <category>mssql</category>
      <category>MSSQL 컬럼</category>
      <category>MSSQL 코멘트</category>
      <category>MSSQL 테이블 정보</category>
      <category>sqlserver</category>
      <author>Ahki</author>
      <guid isPermaLink="true">https://code-monkey7.tistory.com/21</guid>
      <comments>https://code-monkey7.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 29 May 2020 11:22:43 +0900</pubDate>
    </item>
  </channel>
</rss>