<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>시행착오와 배움을 기록하는 공간</title>
    <link>https://renee.tistory.com/</link>
    <description>시행착오와 배움을 기록하는 공간</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 20:25:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>whoAmI_</managingEditor>
    <item>
      <title>인터프리터 언어는 변수 선언이 불가능 하다 ?</title>
      <link>https://renee.tistory.com/89</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;인터프리터 언어는 변수 선언이 불가능 하다 ?&lt;/span&gt;&lt;/h3&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;b&gt;명시적인 자료형 선언이 없는 경우가 많고, 변수 선언과 동시에 값을 할당하는 방식&lt;/b&gt; 이 일반적 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말이 무슨 말이냐면, 프로그래밍단에서 JavaScript 에서는 변수 선언만 하는 것이 가능해 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. JavaScript에서는 변수 선언만 하는 것이 가능해 보인다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;let x;
console.log(x);  // 출력: undefined
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 선언만 하고 값을 할당하지 않아도 에러는 발생하지 않습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 하지만 선언만 하면, 자바스크립트 엔진이 자동으로 undefined 값을 할당한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 핵심입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript는 변수 선언 시 &lt;b&gt;자동으로 undefined를 초기값으로 할당&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;&quot;변수만 메모리에 올리는 것&quot;이 아니라&lt;/b&gt;, &quot;변수 + undefined 값을 같이 할당&quot;하는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;let x;  // 실제로는 let x = undefined; 와 비슷하게 동작
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 &lt;b&gt;호이스팅(hoisting)&lt;/b&gt; 개념과도 연결됩니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;console.log(a); // undefined
var a = 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;var a;가 &lt;b&gt;코드 실행 전에 메모리에 올라가고&lt;/b&gt;, 값은 undefined로 세팅 됩니다.&amp;nbsp; &lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 왜 이렇게 하냐?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript는 &lt;b&gt;인터프리터 언어&lt;/b&gt;로서, &lt;b&gt;동적 타이핑 및 느슨한 초기화 규칙&lt;/b&gt;을 가지고 있기 때문에,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기화되지 않은 변수에 접근했을 때 치명적 오류를 피하고자&lt;/b&gt; undefined를 기본값으로 할당합니다.&lt;/li&gt;
&lt;li&gt;이는 런타임 오류를 줄이려는 목적도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파이썬은 변수에 값을 할당하지 않으면 변수로 보지 않는다?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맞습니다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python은 변수를 사용하려면 반드시 &lt;b&gt;값을 할당&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;li&gt;x = 10 # Python: 변수 선언 + 값 할당&lt;/li&gt;
&lt;li&gt;그렇지 않으면 &lt;b&gt;존재하지 않는 변수로 간주&lt;/b&gt;해서 오류가 발생합니다.&lt;/li&gt;
&lt;li&gt;변수는 &lt;b&gt;할당되기 전까지 존재하지 않으며&lt;/b&gt;, 참조하면 &lt;b&gt;NameError&lt;/b&gt;가 발생합니다.&lt;/li&gt;
&lt;li&gt;print(x) # NameError: name 'x' is not defined&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 파이썬 에서 변수에 아무 값도 없음을 표현하고 싶을 때는 None을 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;x = None
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;None 이란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python에는 &lt;b&gt;null이라는 키워드가 없습니다&lt;/b&gt;. 대신 None을 사용합니다.&lt;/li&gt;
&lt;li&gt;None은 Python의 &lt;b&gt;객체&lt;/b&gt;이며, 이는 null과 비슷한 역할이지만 &lt;b&gt;다릅니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;None은 객체이고, null은 아무것도 없는 것이다 ?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;None (Python)&lt;/b&gt;: NoneType 클래스의 &lt;b&gt;객체&lt;/b&gt;입니다. 이는 &quot;값이 없다&quot;를 표현할 &lt;b&gt;명시적인 객체&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;null (Java, JavaScript 등)&lt;/b&gt;: &lt;b&gt;객체를 참조하지 않는 상태&lt;/b&gt;를 나타냅니다. 일반적으로 &quot;값 없음&quot; 또는 &quot;초기화되지 않은 참조&quot;를 의미합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java: null은 참조 타입의 기본값&lt;/li&gt;
&lt;li&gt;JavaScript: null은 의도적으로 &quot;값 없음&quot;을 표현하는 값&lt;/li&gt;
&lt;li&gt;Python: None은 같은 목적이지만 &lt;b&gt;엄연한 객체&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이렇게 하는 이유는 무엇일까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;인터프리터는 바로 실행해야하는데, 변수만 선언하면 안되겠지 ! &amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터프리터 언어의 핵심은 &quot;실행과 해석이 동시에&quot; 이루어진다는 것&lt;/b&gt;인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 상황에서 변수만 '껍데기'로 만들어 놓고 값도 없으면, &lt;b&gt;&quot;이거 뭐 하자는 거지?&quot;&lt;/b&gt; 하고 애매해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자바스크립트는 &lt;b&gt;&quot;일단 undefined라도 넣어줄게~&quot;&lt;/b&gt; 하면서 실행 가능한 상태로 만들어주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp; &lt;b&gt;변수만 덩그러니 선언해 놓는 건 인터프리터 입장에서 불안정&lt;/b&gt;하고, &lt;br /&gt;그래서 자바스크립트는 항상 undefined라는 기본값으로 '완성된 상태' 를 보장하려는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 점이 &lt;b&gt;컴파일 언어랑 동작 철학이 다른 부분&lt;/b&gt;이라 재미있습니다.&lt;/p&gt;</description>
      <category>ALL/Javascript</category>
      <category>undefined</category>
      <category>VAR</category>
      <category>네임스페이스</category>
      <category>변수 선언</category>
      <category>변수 선언과 할당</category>
      <category>인터프리터</category>
      <category>인터프리터 언어</category>
      <category>자바스크립트</category>
      <category>파이썬</category>
      <category>호이스팅</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/89</guid>
      <comments>https://renee.tistory.com/89#entry89comment</comments>
      <pubDate>Fri, 2 May 2025 15:50:18 +0900</pubDate>
    </item>
    <item>
      <title>SQL JOIN 시 드라이빙 테이블을 좌변에 두는 것이 좋을까</title>
      <link>https://renee.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;278&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;정말 기본적인 생각임에도 불구하고, 처음부터 다시 생각해보는 의미로 작성하게 되었다.&lt;/p&gt;
&lt;p data-end=&quot;278&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;SQL에서 JOIN을 사용할 때 ON 조건을 작성하는 방식은 개발자마다 다를 수 있다. 하지만 &lt;b&gt;드라이빙 테이블(Driving Table)을 JOIN 조건의 좌변에 두는 것이 더 좋은지&lt;/b&gt;에 대한 고민은 필요하다.&lt;/p&gt;
&lt;p data-end=&quot;373&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;드라이빙 테이블의 개념과 JOIN 조건에서 좌변과 우변의 차이&lt;/b&gt;를 살펴보고, &lt;b&gt;어떤 방식이 가독성과 유지보수에 유리한지&lt;/b&gt; 정리해 보았다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;360&quot; data-start=&quot;340&quot; data-ke-size=&quot;size23&quot;&gt;1. 드라이빙 테이블이란?&lt;/h3&gt;
&lt;p data-end=&quot;476&quot; data-start=&quot;361&quot; data-ke-size=&quot;size16&quot;&gt;JOIN이 실행될 때, SQL 옵티마이저는 &lt;b&gt;어떤 테이블을 기준으로 다른 테이블과 매칭할지&lt;/b&gt; 결정한다. 이때 &lt;b&gt;먼저 처리되는 테이블을 드라이빙 테이블(Driving Table)&lt;/b&gt; 이라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;490&quot; data-start=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;예제를 살펴보겠다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1740021422672&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT o.order_id, o.order_date, c.customer_name, c.email
  FROM orders o
  JOIN customers c
    ON o.customer_id = c.customer_id
 ORDER BY o.order_date DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;761&quot; data-start=&quot;656&quot; data-ke-size=&quot;size16&quot;&gt;위 SQL에서 orders 테이블이 &lt;b&gt;드라이빙 테이블&lt;/b&gt;이다. 즉, orders 테이블에서 데이터를 먼저 읽고, 이후 customers 테이블과 매칭하는 방식으로 동작한다.&lt;/p&gt;
&lt;p data-end=&quot;761&quot; data-start=&quot;656&quot; data-ke-size=&quot;size16&quot;&gt;customers 테이블과 매칭하는 방식으로 동작한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;796&quot; data-start=&quot;768&quot; data-ke-size=&quot;size23&quot;&gt;2. JOIN 시 좌변과 우변의 차이&lt;/h3&gt;
&lt;p data-end=&quot;827&quot; data-start=&quot;797&quot; data-ke-size=&quot;size16&quot;&gt;아래 두 가지 방식의 JOIN을 비교해 보겠다.&lt;/p&gt;
&lt;h4 data-end=&quot;857&quot; data-start=&quot;829&quot; data-ke-size=&quot;size20&quot;&gt;방식 1: 드라이빙 테이블을 우변에 둠&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1740021474390&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;ON c.customer_id = o.customer_id&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;998&quot; data-start=&quot;902&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;949&quot; data-start=&quot;902&quot;&gt;c.customer_id가 좌변, o.customer_id가 우변이다.&lt;/li&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;950&quot;&gt;옵티마이저가 내부적으로 실행 순서를 정하지만, &lt;b&gt;가독성이 떨어질 수 있다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1028&quot; data-start=&quot;1000&quot; data-ke-size=&quot;size20&quot;&gt;방식 2: 드라이빙 테이블을 좌변에 둠&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1740021452801&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ON o.customer_id = c.customer_id&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1160&quot; data-start=&quot;1073&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1120&quot; data-start=&quot;1073&quot;&gt;o.customer_id가 좌변, c.customer_id가 우변이다.&lt;/li&gt;
&lt;li data-end=&quot;1160&quot; data-start=&quot;1121&quot;&gt;&lt;b&gt;드라이빙 테이블이 기준이 되어 직관적이고 가독성이 좋다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1255&quot; data-start=&quot;1162&quot; data-ke-size=&quot;size16&quot;&gt;SQL 옵티마이저가 실행 순서를 자동으로 최적화하기 때문에 성능 차이는 크지 않다. 하지만 개발자가 코드를 읽을 때 이해하기 쉬운 방식으로 작성하는 것이 중요하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1296&quot; data-start=&quot;1262&quot; data-ke-size=&quot;size23&quot;&gt;3. 드라이빙 테이블을 좌변에 두는 것이 좋은 이유&lt;/h3&gt;
&lt;p data-end=&quot;1312&quot; data-start=&quot;1298&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;가독성 향상&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1382&quot; data-start=&quot;1316&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1343&quot; data-start=&quot;1316&quot;&gt;JOIN을 읽을 때 흐름이 직관적이다.&lt;/li&gt;
&lt;li data-end=&quot;1382&quot; data-start=&quot;1347&quot;&gt;데이터를 먼저 읽는 테이블을 좌변에 두면 이해하기 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1406&quot; data-start=&quot;1384&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;SQL 스타일 가이드 권장&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1494&quot; data-start=&quot;1410&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1460&quot; data-start=&quot;1410&quot;&gt;많은 스타일 가이드에서 &lt;b&gt;기준이 되는 테이블을 좌변에 배치하는 것&lt;/b&gt;을 권장한다.&lt;/li&gt;
&lt;li data-end=&quot;1494&quot; data-start=&quot;1464&quot;&gt;유지보수 시 가독성이 좋아지고 협업이 쉬워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1524&quot; data-start=&quot;1496&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;실행 계획(EXPLAIN) 확인 필요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1629&quot; data-start=&quot;1528&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1592&quot; data-start=&quot;1528&quot;&gt;SQL 옵티마이저가 실행 순서를 최적화하므로, &lt;b&gt;실제 실행 방식은 EXPLAIN으로 확인해야 한다&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;1629&quot; data-start=&quot;1596&quot;&gt;필요하면 &lt;b&gt;인덱스를 추가하여 최적화할 수 있다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1644&quot; data-start=&quot;1636&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;1712&quot; data-start=&quot;1645&quot; data-ke-size=&quot;size16&quot;&gt;결론적으로, &lt;b&gt;드라이빙 테이블을 JOIN 조건의 좌변에 배치하는 것이 가독성과 유지보수성 측면에서 유리하다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1728&quot; data-start=&quot;1714&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1894&quot; data-start=&quot;1729&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1757&quot; data-start=&quot;1729&quot;&gt;드라이빙 테이블은 먼저 처리되는 테이블이다.&lt;/li&gt;
&lt;li data-end=&quot;1801&quot; data-start=&quot;1758&quot;&gt;JOIN 시 드라이빙 테이블을 좌변에 두면 코드 가독성이 좋아진다.&lt;/li&gt;
&lt;li data-end=&quot;1853&quot; data-start=&quot;1802&quot;&gt;SQL 옵티마이저가 실행 순서를 최적화하지만, 가독성을 고려해 좌변 배치를 권장한다.&lt;/li&gt;
&lt;li data-end=&quot;1894&quot; data-start=&quot;1854&quot;&gt;EXPLAIN을 활용하여 실행 계획을 확인하는 것이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;1979&quot; data-start=&quot;1896&quot; data-ke-size=&quot;size16&quot;&gt;SQL을 작성할 때 단순히 실행만 고려할 것이 아니라, 협업과 유지보수를 위해 &lt;b&gt;더 읽기 좋은 SQL을 작성하는 방법&lt;/b&gt;도 고민해야 한다.  &lt;/p&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;1979&quot; data-start=&quot;1896&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ALL</category>
      <category>join 좌변 우변</category>
      <category>join시 좌변</category>
      <category>SQL</category>
      <category>드라이빙 테이블</category>
      <category>드리븐 테이블</category>
      <category>실행 순서</category>
      <category>실행계획</category>
      <category>옵티마이저</category>
      <category>옵티마이저 실행 순서</category>
      <category>최적화</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/88</guid>
      <comments>https://renee.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 20 Feb 2025 12:19:52 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스 멀티프로세싱과 멀티스레딩 : 오라클과 MySQL 비교</title>
      <link>https://renee.tistory.com/87</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;b&gt;멀티프로세싱이냐 멀티스레딩이냐&lt;/b&gt; 에 대한 개념들도 나오게 되었고, 오라클(Oracle)과 MySQL이 각각 어떤 방식을 쓰는지, 그리고 그게 실제 성능에 어떤 영향을 주는지 알아려고 한다. &lt;br /&gt;&amp;rarr; &lt;b&gt;DBMS는 기본적으로 여러 코어를 활용하며, 코어 수에 따라 성능이 좌우된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 잠깐, &lt;b&gt;멀티프로세싱이랑 멀티스레딩이 뭐야?&lt;/b&gt;  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 멀티프로세싱 vs 멀티스레딩, 뭐가 다른데?&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 멀티프로세싱 (Multi-processing)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉽게 말해서 &lt;b&gt;여러 개의 독립된 프로세스를 만들어서 동시에 작업하는 방식&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로세스끼리는 &lt;b&gt;메모리를 따로 갖고 있어서 안전&lt;/b&gt;하지만, 서로 데이터를 주고받으려면 **IPC(Inter-Process Communication, 프로세스 간 통신)**이 필요해서 오버헤드가 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여러 개의 CPU 코어를 활용할 수 있어서 병렬 처리에 유리함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  질문: &quot;그럼 멀티코어를 써야 멀티프로세싱이 가능하다는 거야?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다. 단일 코어에서는 멀티프로세싱을 하더라도 사실상 &lt;b&gt;CPU가 빠르게 왔다 갔다(Switching) 하는 거지, 진짜 병렬이 아니다.&lt;/b&gt; 멀티코어가 있어야 각 프로세스가 진짜로 동시에 실행될 수 있음.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잠깐! CPU 코어(Core)와 스레드(Thread)의 관계에 대해서도 잠깐 짚고가자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;121&quot; data-start=&quot;93&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;CPU는 여러 개의 코어(Core)로 구성됨&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;163&quot; data-start=&quot;125&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;각 코어는 &lt;b&gt;동시에 하나 이상의 스레드&lt;/b&gt;를 실행할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;241&quot; data-start=&quot;167&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;하이퍼스레딩(Hyper-Threading, HT) 기술&lt;/b&gt;이 적용된 경우, &lt;b&gt;1코어당 2개의 스레드&lt;/b&gt;를 실행할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 멀티스레딩 (Multi-threading)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로세스 안에서 &lt;b&gt;여러 개의 스레드를 만들어서 동시에 작업하는 방식&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스레드끼리는 메모리를 공유&lt;/b&gt;하니까 데이터 전달이 빠름&lt;/li&gt;
&lt;li&gt;하지만 &lt;b&gt;한 스레드가 문제 생기면 다른 스레드에도 영향을 줄 수 있음 (안정성이 낮음)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  질문: &quot;그럼 멀티스레딩은 멀티코어 없어도 가능해?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 코어에서는 CPU가 스레드를 번갈아가면서 실행하는 것이기 때문에 실제 &lt;b&gt;병렬은 아니고, 논리적인 동시 실행이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티코어가 있으면 진짜 동시에 병렬로 실행되면서 성능이 올라갈 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 오라클과 MySQL의 멀티프로세싱 &amp;amp; 멀티스레딩 차이점 ?&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 오라클(Oracle)은 멀티프로세싱 기반&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 하나가 멀티프로세스로 실행되며, 각 프로세스 내부에서 멀티스레딩으로 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;멀티프로세싱(Multi-Processing)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오라클 인스턴스는 여러 개의 **백그라운드 프로세스(예: DB Writer, Log Writer, Checkpoint, Shared Server 등)**로 구성됨.&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;하나의 인스턴스가 여러 개의 프로세스로 실행되므로 멀티프로세싱 환경&lt;/b&gt;임.&lt;/li&gt;
&lt;li&gt;여러 개의 프로세스는 &lt;b&gt;여러 개의 CPU 코어에 분산&lt;/b&gt;되어 실행됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;멀티스레딩(Multi-Threading)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스 내부에서 &lt;b&gt;여러 개의 스레드를 실행&lt;/b&gt;할 수 있음.&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;각 프로세스가 멀티스레딩을 지원&lt;/b&gt;하여 내부적으로 병렬 처리를 수행함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;오라클의 코어 활용 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티프로세싱이기 때문에 &lt;b&gt;각 프로세스는 여러 개의 CPU 코어에 할당됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;각 프로세스 내부에서 다시 &lt;b&gt;멀티스레딩을 사용하여 병렬 작업을 수행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;멀티프로세싱 + 멀티스레딩이 동시에 이루어지는 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB Writer 프로세스(1코어 할당) &amp;rarr; 내부적으로 4개 스레드 실행&lt;/li&gt;
&lt;li&gt;Log Writer 프로세스(1코어 할당) &amp;rarr; 내부적으로 2개 스레드 실행&lt;/li&gt;
&lt;li&gt;Shared Server 프로세스(2코어 할당) &amp;rarr; 내부적으로 다수의 세션 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  오라클의 동작 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 쿼리를 보내면, 오라클이 &lt;b&gt;별도의 서버 프로세스(Server Process)를 생성해서 처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;그리고 이 서버 프로세스들은 &lt;b&gt;각각 독립적으로 실행되니까 안정적임&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;백그라운드 프로세스도 따로 있어서 &lt;b&gt;캐시 관리, 로그 저장, 복구 작업 같은 걸 별도로 수행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPU 코어가 많을수록 프로세스를 잘 분산할 수 있어서 성능이 올라감&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✅ 오라클의 장점 &amp;amp; 단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로세스 간 격리&lt;/b&gt;가 돼서 안정성이 높음&lt;/li&gt;
&lt;li&gt;대규모 트랜잭션 처리(OLTP)에 최적화됨&lt;/li&gt;
&lt;li&gt;CPU 코어를 &lt;b&gt;병렬로 활용 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로세스 간 통신(IPC) 때문에 오버헤드 발생&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로세스를 여러 개 띄우니까 &lt;b&gt;메모리 사용량 증가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) MySQL은 멀티스레딩 기반&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 MySQL은 &lt;b&gt;멀티스레딩을 기본 구조로 가져간다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 하나가 하나의 프로세스로 실행되지만, 내부적으로 여러 개의 스레드를 생성하여 여러 코어를 활용&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  MySQL의 동작 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 쿼리를 보내면, MySQL은 &lt;b&gt;하나의 프로세스 안에서 새로운 스레드를 만들어 처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;오라클처럼 &lt;b&gt;프로세스를 여러 개 만드는 게 아니라, 하나의 프로세스에서 여러 개의 스레드를 생성하는 구조&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;스레드끼리 메모리를 공유하니까 &lt;b&gt;데이터 처리 속도가 빠름&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;하지만 &lt;b&gt;하나의 스레드가 장애가 나면 다른 스레드에도 영향을 줄 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  질문: &quot;그럼 MySQL은 멀티코어를 못 쓰는 거야?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니지! MySQL도 멀티코어를 활용하는데, &lt;b&gt;각 스레드가 여러 코어에 분산돼서 실행되는 방식이야.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 멀티코어 환경에서는 &lt;b&gt;MySQL도 병렬 처리가 가능함!&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✅ MySQL의 장점 &amp;amp; 단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로세스에서 동작하므로 &lt;b&gt;프로세스 간 통신(IPC) 오버헤드가 없음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;스레드 간 공유 메모리를 활용하여 &lt;b&gt;빠른 데이터 처리 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;경량화된 구조로 인해 &lt;b&gt;비교적 적은 리소스로도 실행 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스레드 간 충돌 문제 발생 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;하나의 프로세스에서 모든 작업을 하다 보니, 안정성이 상대적으로 낮음&lt;/li&gt;
&lt;li&gt;대규모 시스템에서는 &lt;b&gt;멀티프로세싱 기반인 오라클보다 성능이 떨어질 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 오라클과 MySQL의 멀티코어 활용 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;오라클과 MySQL 모두 단일 코어에서 실행되지 않고, 여러 개의 코어를 활용한다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 오라클의 멀티코어 활용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스 하나에 여러 개의 &lt;b&gt;서버 프로세스와 백그라운드 프로세스가 분산 실행됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;각 프로세스는 &lt;b&gt;여러 개의 CPU 코어를 활용하여 멀티프로세싱을 수행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;내부적으로도 멀티스레딩을 지원하지만, 주된 방식은 &lt;b&gt;멀티프로세싱&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) MySQL의 멀티코어 활용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스 하나가 &lt;b&gt;하나의 프로세스로 실행되지만, 내부적으로 여러 개의 스레드가 다양한 코어에서 실행됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티스레딩 기반으로 멀티코어를 활용&lt;/b&gt;하여 성능을 최적화&lt;/li&gt;
&lt;li&gt;CPU 코어가 많을수록 성능 향상이 가능하지만, &lt;b&gt;스레드 동기화 문제 발생 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 결론: 오라클 vs MySQL, 언제 무엇을 사용할까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;오라클이 더 적합한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 시스템, 트랜잭션이 많은 서비스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성이 중요한 금융, 엔터프라이즈 환경&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티코어를 적극 활용해서 확장성을 높여야 하는 경우&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;MySQL이 더 적합한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 서비스, 스타트업, 가벼운 애플리케이션&lt;/li&gt;
&lt;li&gt;적은 리소스로 빠르게 데이터 처리를 해야 하는 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OLTP보다는 OLAP(분석/조회)에 더 초점이 맞춰진 경우&lt;/b&gt; &amp;rarr; &lt;b&gt;OLTP에서는 오라클보다 안정성이 좀 떨어진다는 느낌 &amp;rarr;&lt;/b&gt; 가벼운 쿼리 중심의 데이터조회(OLAP)에 유리한 면이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;오라클은 멀티프로세싱 기반이라 안정적이고 대규모 트랜잭션에 강하고, MySQL은 멀티스레딩 기반이라 가볍고 빠르게 처리할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 대규모 트랜잭션이면 오라클, 가볍고 빠른 웹 서비스면 MySQL&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 DB를 선택할지는 &lt;b&gt;서비스 특성과 운영 환경에 따라 달라지게 된다는 것!&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;129&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 공부하면서 단순히 쿼리를 잘 작성하는 것만이 아니라, &lt;b&gt;&lt;u&gt;DBMS가 하드웨어에서 어떻게 동작하는지&lt;/u&gt;&lt;/b&gt; 궁금해졌다. 그러다 보니 자연스럽게 &lt;b&gt;&lt;u&gt;멀티프로세싱 vs 멀티스레딩, 그리고 오라클과 MySQL의 차이&lt;/u&gt;&lt;/b&gt;점까지 알아보게 되었다.&lt;/p&gt;
&lt;p data-end=&quot;452&quot; data-start=&quot;131&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;오라클&lt;/b&gt;은 멀티프로세싱 기반&lt;/u&gt;으로 여러 개의 프로세스를 독립적으로 실행하며, &lt;u&gt;&lt;b&gt;MySQL&lt;/b&gt;은 멀티스레딩 기반&lt;/u&gt;으로 하나의 프로세스 내에서 여러 스레드가 공유된 자원을 활용하는 방식이다. 이때 CPU의 &lt;span style=&quot;color: #8a3db6;&quot;&gt;멀티코어 및 하이퍼스레딩(HT)&lt;/span&gt; 기술이 중요한 역할을 한다. &lt;b&gt;멀티코어&lt;/b&gt;는 여러 개의 코어를 활용해 다수의 프로세스를 병렬로 실행할 수 있게 해주며, &lt;b&gt;하이퍼스레딩&lt;/b&gt;은 하나의 코어가 두 개의 논리적 스레드를 실행하도록 최적화된다. 이런 구조 덕분에 오라클은 여러 프로세스를 코어 단위로 분산 처리하는 데 유리하고, MySQL은 하나의 프로세스에서 여러 스레드를 실행하는 데 최적화되어 있다.&lt;/p&gt;
&lt;p data-end=&quot;576&quot; data-start=&quot;454&quot; data-ke-size=&quot;size16&quot;&gt;결국, 어떤 DBMS를 선택하느냐는 시스템의 특성과 요구 사항에 따라 달라진다. 이제 단순히 &amp;ldquo;어떤 DB가 더 빠를까?&amp;rdquo;가 아니라, &amp;ldquo;내가 설계하는 시스템에 적합한 DB는 무엇일까?&amp;rdquo;라는 질문을 던져볼 수 있을 것이다.&lt;/p&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;638&quot; data-start=&quot;578&quot; data-ke-size=&quot;size16&quot;&gt;앞으로도 DB 성능 최적화와 구조적인 이해를 계속해서 쌓아가며, 더 나은 데이터 처리 방식을 고민해봐야겠다.&lt;/p&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;638&quot; data-start=&quot;578&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ALL/Database</category>
      <category>database</category>
      <category>MySQL</category>
      <category>Oracle</category>
      <category>데이터베이스</category>
      <category>멀티스레딩</category>
      <category>멀티코어</category>
      <category>멀티프로세싱</category>
      <category>성능최적화</category>
      <category>최적화</category>
      <category>하이퍼스레딩</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/87</guid>
      <comments>https://renee.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 19 Feb 2025 12:31:49 +0900</pubDate>
    </item>
    <item>
      <title>[분석, 설계] 객체 모델링, 유스케이스 다이어그램, 액터</title>
      <link>https://renee.tistory.com/86</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;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;52&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유스케이스 다이어그램&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유스케이스 다이어그램은 먼저 개발하고자 하는 시스템의 대표 기능을 검색해서 작성한다.&lt;/li&gt;
&lt;li&gt;모든 기능을 다 유스케이스로 뽑아내지 않아야 한다.&lt;/li&gt;
&lt;li&gt;유스케이스의 범위는 하나의 기능이며 이는 서브 시스템 정도이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;193&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;클래스 다이어그램&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 다이어그램에서 클래스는 유스 케이스 기반으로 식별한다.&lt;/li&gt;
&lt;li&gt;클래스는 객체들의 분류한 기준이다.&lt;/li&gt;
&lt;li&gt;클래스는 기능을 기반으로 추출해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;296&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유스케이스 다이어그램 작성 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;유스케이스는&amp;nbsp; 개발할 시스템을 기준으로 시스템 밖의 액터를 기준으로 시스템 내부의 서브 시스템의 기능인 유스케이스를 찾아서 정리한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;110&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시스템 (Systems)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;125&quot; data-ke-size=&quot;size16&quot;&gt;개발하고자 하는 것 그 자체이며, 웹사이트가 될 수도 있고, 소프트웨어 컴포넌트, 애플리케이션 등 다양한 시스템이 될 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;125&quot; data-ke-size=&quot;size16&quot;&gt;시스템의 범위를 정의하며 흐름이 일어나는 영역의 경계를 정의합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;239&quot; data-ke-size=&quot;size16&quot;&gt;좀 더 쉽게 설명하자면 사각형 범위 안에 있는 흐름은 시스템 안에서만 일어나고, 범위 밖에 있는 흐름은 시스템 안에서 일어나지 않습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;317&quot; data-ke-size=&quot;size16&quot;&gt;사각형의 형태로 표시하고, 상단에 시스템의 이름을 정의합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Ef90/btsHYLsGuJP/O6lwHj6kQ08kl5T1dNOz81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Ef90/btsHYLsGuJP/O6lwHj6kQ08kl5T1dNOz81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Ef90/btsHYLsGuJP/O6lwHj6kQ08kl5T1dNOz81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Ef90%2FbtsHYLsGuJP%2FO6lwHj6kQ08kl5T1dNOz81%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;310&quot; height=&quot;714&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;353&quot; data-ke-size=&quot;size16&quot;&gt;예시에선 검은색 사각형이 시스템에 해당하는 영역입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;389&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;액터 (Actors)&lt;br /&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXutOi/btsHYpwNp42/IqH8Bywi6zau1Fxc1WHCrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXutOi/btsHYpwNp42/IqH8Bywi6zau1Fxc1WHCrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXutOi/btsHYpwNp42/IqH8Bywi6zau1Fxc1WHCrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXutOi%2FbtsHYpwNp42%2FIqH8Bywi6zau1Fxc1WHCrK%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;404&quot; height=&quot;221&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt;시스템 외부에서 시스템과 상호작용하여 특정한 목적을 취하는 객체를 뜻합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;액터는 사람이 될 수도 있고, 회사, 다른 시스템, 또는 외부 장비가 될 수도 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;497&quot; data-ke-size=&quot;size16&quot;&gt;액터는 반드시 하나 이상의 유스케이스들과 상호작용해야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;533&quot; data-ke-size=&quot;size16&quot;&gt;또한 액터 이름은 개인적이거나 무언가를 특정해서 지정하면 안 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;573&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;575&quot; data-ke-size=&quot;size16&quot;&gt;액터에는 두 가지 종류가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프라이머리 액터 (Primary Actor) : 시스템을 사용하고, 직접 이득을 보는 액터이며 졸라맨으로 표기합니다. 보통 시스템의 왼쪽에 표시합니다.&lt;/li&gt;
&lt;li&gt;세컨더리 액터 (Secondary Actor) : 프라이머리 액터가 목적을 달성하기 위해 도움을 주는 액터이며 사각형 박스에 &amp;lt;&amp;lt;actor&amp;gt;&amp;gt;를 입력하여 표기합니다. 보통 시스템의 오른쪽에 표시합니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;804&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;806&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유스케이스 (Use Cases)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;825&quot; data-ke-size=&quot;size16&quot;&gt;시스템 내에서 일련의 작업을 수행하기 위한 행위들을 나타내며, 타원형으로 표기합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7kfS7/btsHXwi4Enr/HVe78VW8hFkEHOQksYkFE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7kfS7/btsHXwi4Enr/HVe78VW8hFkEHOQksYkFE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7kfS7/btsHXwi4Enr/HVe78VW8hFkEHOQksYkFE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7kfS7%2FbtsHXwi4Enr%2FHVe78VW8hFkEHOQksYkFE0%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;438&quot; height=&quot;287&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;886&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;관계 (Relationships)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;906&quot; data-ke-size=&quot;size16&quot;&gt;선 또는 화살표로 나타내며, 이어진 2개의 액터 또는 유스케이스들이 서로 상호작용함을 나타냅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;962&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;978&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유스케이스 명세서 작성 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;997&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;999&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유스케이스 명세 작성 요령&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1015&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 대상 시스템이 제공하여야 할 서비스를 시간이 경과되는 순서로 정렬하여 기술 한 것.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; SW에 대한 요구정의를 사용자 관점으로 바꾸어 상호작용 사건의 시나리오로 나타내는 것.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1119&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 시나리오가 시작될때 외부 시스템이나 사용자가 기대하는 것.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1155&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 시나리오에 일어나는 사건에 대한 기본 흐름&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1183&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 문제가 발생되는 비정상적인 사건에 대한 대안 흐름&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1215&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 동시에 병행으로 일어나는 다른 활동에 관한 정보&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1246&quot; data-ke-size=&quot;size16&quot;&gt;l&amp;nbsp; 시나리오가 종료되었을 때 시스템의 상태에 대한 정보&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;296&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;간단한 예시&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;296&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;쇼핑몰 고객관리 유스케이스 명세서&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;296&quot; data-ke-size=&quot;size16&quot;&gt;쇼핑몰 고객관리 시스템은 고객의 정보를 관리하고, 고객과 관련된 다양한 작업을 수행하는 시스템입니다. 아래는 고객관리 유스케이스와 각 유스케이스에 대한 명세서입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유스케이스 목록&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객 등록 (Customer Registration)&lt;/li&gt;
&lt;li&gt;고객 정보 수정 (Update Customer Information)&lt;/li&gt;
&lt;li&gt;고객 정보 조회 (View Customer Information)&lt;/li&gt;
&lt;li&gt;고객 계정 삭제 (Delete Customer Account)&lt;/li&gt;
&lt;li&gt;고객 주문 내역 조회 (View Customer Order History)&lt;/li&gt;
&lt;li&gt;고객 문의 처리 (Handle Customer Inquiry)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 유스케이스: 고객 등록 (Customer Registration)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유스케이스 이름:&lt;/b&gt; 고객 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;행위자: &lt;/b&gt;고객 (Customer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명:&lt;/b&gt; 고객이 쇼핑몰에 새로운 계정을 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사전조건: &lt;/b&gt;고객은 쇼핑몰 홈페이지에 접근할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후기조건: &lt;/b&gt;새로운 고객 계정이 시스템에 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 시나리오:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객이 쇼핑몰 홈페이지에 접속한다.&lt;/li&gt;
&lt;li&gt;고객이 '회원가입' 메뉴를 선택한다.&lt;/li&gt;
&lt;li&gt;고객이 필요한 정보를 입력한다 (이름, 이메일, 비밀번호, 주소 등).&lt;/li&gt;
&lt;li&gt;고객이 입력한 정보를 확인하고 제출한다.&lt;/li&gt;
&lt;li&gt;시스템이 입력된 정보를 검증한다.&lt;/li&gt;
&lt;li&gt;시스템이 새로운 고객 계정을 저장한다.&lt;/li&gt;
&lt;li&gt;시스템이 등록 완료 메시지를 고객에게 표시한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대체 시나리오:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5a.&lt;/b&gt; 입력된 정보가 유효하지 않은 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템이 오류 메시지를 표시하고 고객이 정보를 수정 후 다시 제출한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>액터</category>
      <category>액터다이어그램</category>
      <category>유스케이스</category>
      <category>유스케이스 다이어그램</category>
      <category>유스케이스 명세서</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/86</guid>
      <comments>https://renee.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 14 Jun 2024 02:45:21 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 실습환경 구성하기 - 서버설치</title>
      <link>https://renee.tistory.com/85</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;1. 아래 사이트에서 MySQL설치파일을 내려받습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1716340247341&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MySQL :: Download MySQL Installer&quot; data-og-description=&quot;Note: MySQL 8.0 is the final series with MySQL Installer. As of MySQL 8.1, use a MySQL product's MSI or Zip archive for installation. MySQL Server 8.1 and higher also bundle MySQL Configurator, a tool that helps configure MySQL Server.&quot; data-og-host=&quot;dev.mysql.com&quot; data-og-source-url=&quot;https://dev.mysql.com/downloads/installer/&quot; data-og-url=&quot;https://dev.mysql.com/downloads/installer/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/downloads/installer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.mysql.com/downloads/installer/&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; data-ke-size=&quot;size16&quot;&gt;MySQL :: Download MySQL Installer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Note: MySQL 8.0 is the final series with MySQL Installer. As of MySQL 8.1, use a MySQL product's MSI or Zip archive for installation. MySQL Server 8.1 and higher also bundle MySQL Configurator, a tool that helps configure MySQL Server.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.mysql.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnFuqY/btsHxjDzDsp/CT0Crh7FYVKon7T4yEbPX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnFuqY/btsHxjDzDsp/CT0Crh7FYVKon7T4yEbPX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnFuqY/btsHxjDzDsp/CT0Crh7FYVKon7T4yEbPX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnFuqY%2FbtsHxjDzDsp%2FCT0Crh7FYVKon7T4yEbPX1%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;294&quot; height=&quot;27&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;27&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;3. 저는 기존에 workbench가 설치되어있어 관련 upgrade를 진행 한 후 아래와 같은 창이 떴습니다.&lt;br /&gt;여기서 설치하고자 하는 Products를 선택해줍니다.&lt;br /&gt;저는 MySQL Server 와 MySQL Router, Sample and Examples 를 택했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bspGuJ/btsHwqpR3jX/drjx44dvRSLhq8K3kE2YBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bspGuJ/btsHwqpR3jX/drjx44dvRSLhq8K3kE2YBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bspGuJ/btsHwqpR3jX/drjx44dvRSLhq8K3kE2YBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbspGuJ%2FbtsHwqpR3jX%2Fdrjx44dvRSLhq8K3kE2YBK%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;603&quot; height=&quot;453&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;584&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;4. 설치를 시작합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTQu2/btsHvXuXrLS/mg0Q5uew9EvngLYXnmLEmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTQu2/btsHvXuXrLS/mg0Q5uew9EvngLYXnmLEmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTQu2/btsHvXuXrLS/mg0Q5uew9EvngLYXnmLEmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTQu2%2FbtsHvXuXrLS%2Fmg0Q5uew9EvngLYXnmLEmK%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;606&quot; height=&quot;458&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;587&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;5. 그 다음 MySQL 서버에 관한 환경 설정을 수행하는 화면이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdxIeX/btsHwhmmEaH/N2xi9JyW6wxTJNuRVontAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdxIeX/btsHwhmmEaH/N2xi9JyW6wxTJNuRVontAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdxIeX/btsHwhmmEaH/N2xi9JyW6wxTJNuRVontAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdxIeX%2FbtsHwhmmEaH%2FN2xi9JyW6wxTJNuRVontAK%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;615&quot; height=&quot;461&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;583&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;6. 기본포트는 3306인데 3355포트로 변경해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEHYUl/btsHvYm6lg7/kN6EX1HKtJPXwLMWdnJVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEHYUl/btsHvYm6lg7/kN6EX1HKtJPXwLMWdnJVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEHYUl/btsHvYm6lg7/kN6EX1HKtJPXwLMWdnJVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEHYUl%2FbtsHvYm6lg7%2FkN6EX1HKtJPXwLMWdnJVk1%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;607&quot; height=&quot;453&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;583&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;7. 루트계정에 대한 비밀번호를 입력합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgcKWG/btsHvX2PwAA/seVZrgmP0CTwkvfO4Dizsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgcKWG/btsHvX2PwAA/seVZrgmP0CTwkvfO4Dizsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgcKWG/btsHvX2PwAA/seVZrgmP0CTwkvfO4Dizsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgcKWG%2FbtsHvX2PwAA%2FseVZrgmP0CTwkvfO4Dizsk%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;617&quot; height=&quot;462&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;584&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;8. 나머지단계는 그대로 Next 진행하고, 마지막으로 지금까지 적용한 환경설정 목록을 확인하고 Excute 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqwxb/btsHwv5KNo3/7fJ8Zge0FEZyP1bZJqjMt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqwxb/btsHwv5KNo3/7fJ8Zge0FEZyP1bZJqjMt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqwxb/btsHwv5KNo3/7fJ8Zge0FEZyP1bZJqjMt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foqwxb%2FbtsHwv5KNo3%2F7fJ8Zge0FEZyP1bZJqjMt0%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;633&quot; height=&quot;476&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;587&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;9. 다음으로 MySQL Router 설정을 시작합니다. 별다른 추가 설정 없이 Finish 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZxin/btsHxIQnI0c/5TLTgwiIfwojJtGlmsJMC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZxin/btsHxIQnI0c/5TLTgwiIfwojJtGlmsJMC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZxin/btsHxIQnI0c/5TLTgwiIfwojJtGlmsJMC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZxin%2FbtsHxIQnI0c%2F5TLTgwiIfwojJtGlmsJMC1%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;638&quot; height=&quot;481&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;587&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;10. 다음으로 Samples and Examples 를 설정합니다. 샘플 데이터를 실행할 환경에 대한 접속계정을 입력하는 화면입니다.&lt;br /&gt;여기서는 실습용 샘플 데이터를 적용할 DB 서버와 접속계정(root)과 패스워드를 입력한 뒤 Check버튼을 클릭하여 화면의 상태가 녹색으로 바뀌는지 확인 후 Next 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTRyRL/btsHwCp34FG/CAimkkkWkVMUnH07zKycuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTRyRL/btsHwCp34FG/CAimkkkWkVMUnH07zKycuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTRyRL/btsHwCp34FG/CAimkkkWkVMUnH07zKycuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTRyRL%2FbtsHwCp34FG%2FCAimkkkWkVMUnH07zKycuK%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;640&quot; height=&quot;480&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;585&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 설치를 모두 마친 후, MySQL DB에 접속해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 환경에서 키보드 윈+R 을 누른뒤 cmd를 입력하여 커맨트 창을 켭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9x7i2/btsHwuskk18/RZ5JOfSJWpgZnpEdj7fkZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9x7i2/btsHwuskk18/RZ5JOfSJWpgZnpEdj7fkZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9x7i2/btsHwuskk18/RZ5JOfSJWpgZnpEdj7fkZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9x7i2%2FbtsHwuskk18%2FRZ5JOfSJWpgZnpEdj7fkZ0%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;343&quot; height=&quot;171&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;197&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;12. MySQL 파일이 위치한 C:\Program Files\MySQL 까지 오면 아래와 같은 디렉터리를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKyC7E/btsHxHYe7UW/qMEMk0M1jF1a2hgEayuG00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKyC7E/btsHxHYe7UW/qMEMk0M1jF1a2hgEayuG00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKyC7E/btsHxHYe7UW/qMEMk0M1jF1a2hgEayuG00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKyC7E%2FbtsHxHYe7UW%2FqMEMk0M1jF1a2hgEayuG00%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;526&quot; height=&quot;133&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Program Files\MySQL\MySQL Router 8.0\bin&amp;gt; 으로 이동 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 접속계정(root)과 접속포트(3355)를 mysql -uroot -p --port 3355 와 같이 입력하고 엔터를 누릅니다.&lt;br /&gt;만약 아까 접속포트 변경 없이 기본적인 접속포트 3306으로 설치했다면 mysql -uroot -p 또는 mysql -uroot -p --port 3306 으로 입력하고 엔터를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXx97/btsHv4ARzwn/7DtmUE87pk10Ag8FJXm1t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXx97/btsHv4ARzwn/7DtmUE87pk10Ag8FJXm1t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXx97/btsHv4ARzwn/7DtmUE87pk10Ag8FJXm1t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXx97%2FbtsHv4ARzwn%2F7DtmUE87pk10Ag8FJXm1t0%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;576&quot; height=&quot;37&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql&amp;gt; 프롬프트가 나오면 show databases; 명령어를 입력하고 엔터키를 눌러 출력 결과를 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHCxAJ/btsHym0oZF8/cqdDSk5OTR6o4pQO0CBhPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHCxAJ/btsHym0oZF8/cqdDSk5OTR6o4pQO0CBhPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHCxAJ/btsHym0oZF8/cqdDSk5OTR6o4pQO0CBhPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHCxAJ%2FbtsHym0oZF8%2FcqdDSk5OTR6o4pQO0CBhPk%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;586&quot; height=&quot;438&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 로컬에 설치된 데이터베이스 목록이 나오면 무사히 설치된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MySQL</category>
      <category>mysql 8.0</category>
      <category>mysql community 8.0</category>
      <category>mysql 데이터베이스 조회</category>
      <category>mysql 서버</category>
      <category>mysql 서버 설치</category>
      <category>mysql 설치</category>
      <category>show databases;</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/85</guid>
      <comments>https://renee.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 22 May 2024 10:47:50 +0900</pubDate>
    </item>
    <item>
      <title>데이터 / 데이터베이스 / DBMS / 파일시스템 / 스토리지 관련 용어정리</title>
      <link>https://renee.tistory.com/84</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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로그래밍이나 데이터 관련 공부를 하다보면 관련 용어들이 많이 등장하는데 용어들이 서로 비슷하기도 하고 서로간에 어떠한 관계가 있는지 정리할 필요성을 느껴 기록하게 되었다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;용어들이 점차 확장되도록 정리하려고 했다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;데이터란 ?&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;데이터는 실세계의 가공되지 않는 모든 자료들을 말한다.&lt;/span&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;우리는 실세계에서 가공되지 않은 자료들이 넘쳐나는 시대에 살고 있는데, 그 중에는 우리에게 유의미한 자료들도 있을것이고, 필요하지 않은 무의미한 정보들도 섞여 있을 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;정보란 ?&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;그 많은 데이터들 중 우리에게 쓸모있고 의미있는 내용으로 추출하고 가공하여 체계적으로 조직한 데이터를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;데이터베이스(Database, DB) 란 무엇일까 ?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 한마디로 '데이터의 집합'이라고 할 수 있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위에서 얘기한 수많은 방대한 데이터들을 정보로 처리하기 이전에 어떻게 체계적으로 관리할 수 있을지에 대한 고민이 데이터베이스의 시발점이다. 이 수많은 데이터들을 &lt;u&gt;어떤 특정한 조직에서 여러 명의 사용자 또는 응용 시스템들이 공유하고 동시에 접근하여 사용할 수 있도록 구조적으로 통합하여 저장한 운영 데이터의 집합&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;=&amp;gt; 데이터베이스의 의미를 정리하면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터베이스는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1) 공유데이터(shared data) 이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2) 통합된 데이터(integrated data) 이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3) 저장된 데이터(stored data) 이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4) 운영 데이터(operational data) 이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; * &lt;u&gt; DB는 실시간으로 모두가 공유하는 데이터를 내용에 따라 참조하여 변화시킬 수 있어야 한다.&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;DBMS(Database Management System, 데이터베이스 관리 시스템) 란 ?&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XGts1/btsHq41AWuo/HmYihw5E29yhbHpkDDstCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XGts1/btsHq41AWuo/HmYihw5E29yhbHpkDDstCK/img.png&quot; data-alt=&quot;https://medium.com/@erpinformation/what-is-database-management-system-dbms-6-advantages-a3904e8f9989&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XGts1/btsHq41AWuo/HmYihw5E29yhbHpkDDstCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXGts1%2FbtsHq41AWuo%2FHmYihw5E29yhbHpkDDstCK%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;431&quot; height=&quot;359&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://medium.com/@erpinformation/what-is-database-management-system-dbms-6-advantages-a3904e8f9989&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;데이터베이스를 운영하고 관리하는 소프트웨어&lt;/u&gt;를 DBMS라고 한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이를 이용하여 데이터베이스에 접근하여 데이터를 조작할 수 있도록 도와준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;즉, 사용자는 DB에 직접 접근하여 데이터를 다루는 것이 아니라, DBMS의 도움으로 데이터를 다루고 변화시킬 수 있다.&lt;br /&gt;그렇기 때문에 다양한 데이터가 저장되어 있는 데이터베이스는 여러 명의 사용자나 응용 프로그램과 공유하고 동시에 접근이 가능해야 한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;데이터베이스 시스템(Database System) 이란 ?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTIdk/btsHso5QUpn/3iwRHszEnUCO0tIrQTrpZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTIdk/btsHso5QUpn/3iwRHszEnUCO0tIrQTrpZk/img.png&quot; data-alt=&quot;https://jgtonys.github.io/school/2018/10/20/database-1/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTIdk/btsHso5QUpn/3iwRHszEnUCO0tIrQTrpZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTIdk%2FbtsHso5QUpn%2F3iwRHszEnUCO0tIrQTrpZk%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;423&quot; height=&quot;472&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://jgtonys.github.io/school/2018/10/20/database-1/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;데이터베이스 시스템은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;데이터를 데이터베이스에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;u&gt;구조화하고 저장하며 관리하는 전체 시스템&lt;/u&gt;을 가리킨다.&lt;br /&gt;이는 데이터베이스 관리 시스템(DBMS)과 관련된 소프트웨어뿐만 아니라 데이터베이스를 구성하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;하드웨어, 소프트웨어, 데이터, 사용자 등을 모두 포함&lt;/u&gt;한다.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;- 데이터베이스 관리 시스템&lt;/span&gt; (DBMS) 의 정의를 다시 짚고 가자.&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;데이터베이스 관리 시스템(DBMS)은&amp;nbsp;&lt;u&gt;데이터베이스 시스템의 핵심 구성 요소 중 하나&lt;/u&gt;로,&amp;nbsp;&lt;u&gt;데이터를 구조화하고 저장하며 관리하는&amp;nbsp;소프트웨어&lt;/u&gt;를 가리킨다. 이는 사용자가 데이터베이스에 접근하고 데이터를 검색, 추가, 수정, 삭제하는 등의 작업을 수행할 수 있도록 한다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;br /&gt;DBMS는 데이터베이스의 구조를 정의하고 유지하는 데 사용되며, 데이터의 보안, 무결성, 공유, 백업 및 복원 등을 관리한다. 일반적인 DBMS 종류로는 Oracle, MySQL, SQL Server, PostgreSQL, MongoDB 등이 있다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;- 데이터베이스 시스템과 DBMS 의 차이 ?&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;요약하면, &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;데이터베이스 시스템은 데이터를 구조화하고 저장하며 관리하는 전체 시스템&lt;/span&gt;&lt;/b&gt;을 가리키는 반면, &lt;span style=&quot;color: #ee2323;&quot;&gt;데이터베이스 관리 시스템(DBMS)은 데이터를 구조화하고 저장하며 관리하는 소프트웨어&lt;/span&gt;를 가리킨다. DBMS는 데이터베이스 시스템의 일부분으로서 데이터 관리와 관련된 주요 기능을 담당한다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;데이터 언어&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;데이터 언어는 사용자 또는 응용 프로그램과 DBMS 간에 의사소통(데이터를 정의하고 조작)을 하기위한 언어이다. &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;데이터 정의 언어(DDL), 데이터 조작 언어(DML), 데이터 제어 언어(DCL)&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;로 구성되어 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;- 데이터 정의 언어 (DDL, Data Definition Language)&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DDL은 데이터베이스의 구조를 정의하고 변경하는 데 사용되는 언어이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테이블, 인덱스, 뷰와 같은 데이터베이스 객체를 생성(create), 수정(alter), 삭제(drop)하는 데 사용된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;- 데이터 조작 언어 (DML, Data Manipulation Language)&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DML은 데이터베이스에 저장된 데이터를 검색(select), 삽입(insert), 수정(update), 삭제(delete)하는 데 사용되는 언어이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DML 명령어는 주로 데이터의 조작과 관련된 작업을 수행한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- &lt;b&gt;데이터 제어 언어 (DCL, Data Control Language)&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DCL은 데이터베이스에 대한 접근 권한을 제어(grant, revoke)하는 데 사용되는 언어이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DCL 명령어는 데이터베이스 보안과 권한 관리와 관련된 작업을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;SQL(Structured Query Language) 란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;구조화된 질의 언어라는 뜻으로 관계형 데이터베이스에서 사용되는 언어이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;일반적으로 SQL(Structured Query Language)이 가장 널리 사용되는 위에서 언급한 데이터 언어이다.&lt;/span&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;style8&quot; /&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: #0593d3; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그럼 전반적인 데이터베이스 관련 개념들의 정의는 알아보았다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이제 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;파일시스템 / 스토리지 / 데이터베이스 시스템&lt;/b&gt;&lt;/span&gt; 과의 관계를 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;파일&amp;nbsp;시스템&amp;nbsp;(File&amp;nbsp;System)&lt;/span&gt;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&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/ec5iUd/btsHrXHwUhb/c3777EXFZhQkhBKCkrivMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec5iUd/btsHrXHwUhb/c3777EXFZhQkhBKCkrivMk/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;445&quot; data-is-animation=&quot;false&quot; width=&quot;430&quot; height=&quot;273&quot; style=&quot;width: 48.4353%; margin-right: 10px;&quot; data-widthpercent=&quot;49.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec5iUd/btsHrXHwUhb/c3777EXFZhQkhBKCkrivMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec5iUd%2FbtsHrXHwUhb%2Fc3777EXFZhQkhBKCkrivMk%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;700&quot; height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1B4Md/btsHqLH1mOD/WeXqRcrmMs9Dl9vFsiXwSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1B4Md/btsHqLH1mOD/WeXqRcrmMs9Dl9vFsiXwSK/img.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;336&quot; data-is-animation=&quot;false&quot; width=&quot;437&quot; style=&quot;width: 50.4019%;&quot; data-widthpercent=&quot;50.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1B4Md/btsHqLH1mOD/WeXqRcrmMs9Dl9vFsiXwSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1B4Md%2FbtsHqLH1mOD%2FWeXqRcrmMs9Dl9vFsiXwSK%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;550&quot; height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;https://www.geeksforgeeks.org/linux-file-system/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;파일 시스템은 &lt;u&gt;운영 체제에서 데이터를 저장하고 조직하는 방법&lt;/u&gt;이다. 파일 시스템은 파일과 디렉터리를 관리하고, 파일을 생성, 읽기, 쓰기, 삭제하는 기능을 제공한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 파일과 디렉터리의 생성, 삭제 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 파일의 읽기, 쓰기, 수정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 파일의 권한 및 접근 제어 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;종류로는 NTFS, FAT32, ext4 등이 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;오브젝트 스토리지(object storage)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오브젝트 스토리지(Object Storage)는 파일 시스템과 다른 형태의 스토리지이다. 오브젝트 스토리지는 &lt;u&gt;데이터를 객체(Object)로 저장하고 관리&lt;/u&gt;한다. 객체는 데이터와 메타데이터의 조합으로 구성되며, 파일 시스템의 폴더 구조와는 다릅니다. 오브젝트 스토리지는 &lt;u&gt;클라우드 환경에서 주로 사용되며, 대용량의 데이터를 효율적으로 저장하고 접근하는 데 사용&lt;/u&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: #5733b1; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;스토리지&amp;nbsp;(Storage)&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;스토리지는 &lt;u&gt;데이터를 물리적으로 저장하는 하드웨어 장치 또는 솔루션&lt;/u&gt;이다. 하드 드라이브(HDD), 솔리드 스테이트 드라이브(SSD), 클라우드 스토리지 등으로 구성될 수 있다. &amp;nbsp;(HDD, SSD, NAS, SAN, 클라우드 스토리지 등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;파일시스템과 오브젝트 스토리지, 스토리지의 관계는?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;데이터를 파일로 관리하면 파일 시스템&lt;/u&gt;을 사용하고, &lt;u&gt;데이터를 객체로 관리하면 오브젝트 스토리지&lt;/u&gt;를 사용한다. 파일 시스템과 오브젝트 스토리지는 둘 다 스토리지의 형태이며, &lt;u&gt;스토리지는 데이터를 실제로 저장하는 물리적인 장치나 서비스&lt;/u&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;데이터베이스 시스템 (Database System) 의 정의를 다시 한번 내려보자&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터를 체계적으로 저장, 관리, 검색하는 시스템으로, &lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;파일 시스템과 스토리지&lt;/span&gt; 위에 구축된 시스템&lt;/u&gt; 이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;데이터베이스 시스템의 구성요소&lt;/u&gt;를 살펴보자면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- &lt;b&gt;데이터베이스 관리 시스템(DBMS) &lt;/b&gt;: 데이터를 관리하고, 쿼리를 처리하고, 트랜잭션을 관리하는 소프트웨어 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- &lt;b&gt;데이터베이스 &lt;/b&gt;: 테이블, 열, 행 등 구조화된 데이터가 저장된 논리적 집합 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- &lt;b&gt;메타데이터&lt;span style=&quot;color: #ef6f53;&quot;&gt;(시스템 데이터베이스) &lt;/span&gt;&lt;/b&gt;: 데이터베이스 구조, 제약 조건, 권한 등의 정보를 저장 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- &lt;b&gt;하드웨어 &lt;/b&gt;: 데이터베이스를 저장하는 물리적 스토리지와 이를 지원하는 서버 및 네트워크 인프라&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;들이 모여 데이터베이스 시스템을 이룬다고 볼 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;시스템 데이터베이스 란 ?&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;데이터베이스는 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;시스템 데이터베이스 (데이터 사전, System Database or Data Dictionary) + 저장 데이터베이스 (Stored Database)&lt;/u&gt;&lt;/span&gt; &lt;/b&gt;로 이루어 진다고 볼 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 시스템 데이터베이스&lt;/b&gt;&lt;br /&gt;시스템&amp;nbsp;데이터베이스는&amp;nbsp;데이터베이스&amp;nbsp;&lt;u&gt;시스템의 메타데이터를 저장하는 특수한 데이터베이스&lt;/u&gt;이다. &lt;u&gt;데이터 사전(Data Dictionary)&lt;/u&gt; 이라고도 불린다. &lt;br /&gt;- 메타데이터 : 데이터베이스 구조, 스키마, 데이블 정의, 열 정보, 데이터 타입, 인덱스, 제약 조건 등 데이터베이스의 구조와 관련된 정보를 저장한다.&lt;br /&gt;- 관리정보 : 사용자 계정, 권한, 데이터베이스 설정, 트랜잭션 로그 등의 데이터베이스 관리 정보를 포함한다.&lt;br /&gt;- 시스템 관리도구 : 쿼리 최적화, 성능 모니터링, 데이터 무결성 유지 등의 작업에 사용&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;- 저장&amp;nbsp;데이터베이스&lt;br /&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: #6164c6; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;그럼 파일시스템과 스토리지, 데이터베이스 시스템의 관계는 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;스토리지와&amp;nbsp;파일&amp;nbsp;시스템&lt;/span&gt;&lt;/b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스토리지는 데이터를 저장하는 물리적 장치이다.&lt;br /&gt;&lt;u&gt;파일&amp;nbsp;시스템은&amp;nbsp;이러한&amp;nbsp;스토리지&amp;nbsp;장치&amp;nbsp;위에&amp;nbsp;구축&lt;/u&gt;되어, 데이터를 파일과 디렉터리로 조직하고 관리한다. &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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;br /&gt;파일&amp;nbsp;시스템과&amp;nbsp;데이터베이스&amp;nbsp;시스템&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;파일 시스템&lt;/span&gt;은 &lt;span style=&quot;color: #006dd7;&quot;&gt;데이터베이스 시스템&lt;/span&gt;의 &lt;span style=&quot;color: #ee2323;&quot;&gt;기초를 형성&lt;/span&gt;&lt;/u&gt;한다. &lt;u&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;데이터베이스 시스템&lt;/span&gt;은 &lt;span style=&quot;color: #ee2323;&quot;&gt;파일 시스템을 사용&lt;/span&gt;하여 &lt;span style=&quot;color: #006dd7;&quot;&gt;데이터를 물리적으로 저장&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;한다&lt;/span&gt;. &lt;br /&gt;데이터베이스 시스템은 파일 시스템 위에 구축되어, 더 높은 수준의 데이터 관리 기능을 제공한다. 파일 시스템은 데이터베이스의 물리적 저장소로 사용되며, DBMS는 이를 통해 데이터를 관리하고 쿼리를 처리한다.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;예를 들어, &lt;span style=&quot;color: #8a3db6;&quot;&gt;데이터베이스 시스템&lt;/span&gt;에서 테이블에 대한 데이터를 파일 시스템의 파일로 저장한다. DBMS는 이 파일들을 관리하고, 사용자가 SQL 쿼리를 통해 데이터를 접근할 수 있도록 한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;마지막으로 요약하자면,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;스토리지는 데이터를 물리적으로 저장하는 장치이다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;파일 시스템은 스토리지 위에 구축된 소프트웨어 계층으로, 데이터를 파일과 디렉터리로 조직하고 관리한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;데이터베이스 시스템은 파일 시스템 위에 구축된 소프트웨어 시스템으로, 데이터를 구조화된 방식으로 저장, 관리, 검색하는 기능을 제공한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>ALL/Data</category>
      <category>dbms</category>
      <category>데이터</category>
      <category>데이터베이스</category>
      <category>데이터베이스 시스템</category>
      <category>데이터베이스 시스템 뜻</category>
      <category>스토리지</category>
      <category>시스템 데이터베이스</category>
      <category>오브젝트 스토리지</category>
      <category>용어정리</category>
      <category>파일시스템</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/84</guid>
      <comments>https://renee.tistory.com/84#entry84comment</comments>
      <pubDate>Fri, 17 May 2024 12:00:51 +0900</pubDate>
    </item>
    <item>
      <title>How to backup a postgres database using java / 자바로 postgres DB 백업하기(pg_dump)</title>
      <link>https://renee.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;자바로 백업모듈을 만들어야 했는데, 자바에서 pg_dump를 실행해 sql파일을 떨구는 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 가져가고자 하는 백업 프로세스를&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;간단히&lt;span&gt; 말하자면&lt;br /&gt;전체백업은 하루에 한번, 특정 테이블 데이터는 데이터특성에 따른 주기별로&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;1) 기존 백업스키마 데이터 삭제&lt;br /&gt;2) 백업테이블 갱신&lt;br /&gt;3) 백업스키마 sql 백업&lt;br /&gt;4) DB 전체 sql 백업&lt;br /&gt;순으로 이루어 진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 리눅스에 쉘스크립트 생성후 cron으로 돌려 파일백업, 전체백업을 진행했는데 이번에는 자바모듈안에서 해결했으면 좋겠다고 하셨다. 백업모듈은 데몬으로 돌아야하는데, 이렇게 실행하나 저렇게 실행하나 데몬역할을 하는거라고 보면 된다고 하셨는데, 서비스로 띄우는것과 약간 차이가 있지 않나 더 알아봐야 할 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 작업을 하기 위해 자바에서 커맨드명령어를 날려 pg_dump를 실행하는 방법을 찾아보았고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 stackoverflow를 통해 해답을 얻을 수 있었다. 8년전 글이기 때문에, 지금 자바에서 pg_dump를 연동하려면 더 나은 방법이 있을지도 모르겠다.&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715651267014&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How to backup a postgres database using java&quot; data-og-description=&quot;this is the code I am using to back up my database using pg_dump 9.3 in java. The problem I have is that always the result file is empty, and the exit code is 1, any ideas? public static void back...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/36993441/how-to-backup-a-postgres-database-using-java&quot; data-og-url=&quot;https://stackoverflow.com/questions/36993441/how-to-backup-a-postgres-database-using-java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/89pTj/hyV2vi9dSN/MElAUjm6byTD4f0jzA3sKk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/36993441/how-to-backup-a-postgres-database-using-java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/36993441/how-to-backup-a-postgres-database-using-java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/89pTj/hyV2vi9dSN/MElAUjm6byTD4f0jzA3sKk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How to backup a postgres database using java&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;this is the code I am using to back up my database using pg_dump 9.3 in java. The problem I have is that always the result file is empty, and the exit code is 1, any ideas? public static void back...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트하는 로컬서버는 윈도우고, 개발서버, 운영서버는 리눅스 이기 때문에 위와같이 로컬테스트 진행 후&lt;br /&gt;리눅스에도 서비스를 띄워 sql파일 백업이 잘 진행되는지 확인해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pg_dump를 실행시키는 것이기 때문에, 경로를 잘 지정해주어야 한다. &lt;br /&gt;개발, 운영 환경에 맞게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설정파일로 분리하는것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 pg_dump 경로&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;database.pgdump.path=C:\\Program Files\\PostgreSQL\\10\\bin\\pg_dump.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;pg_dump&lt;span&gt;&amp;nbsp;경로&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;database.pgdump.path=/usr/pgsql-10/bin/pg_dump&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 전체 파일 백업과, 특정 테이블을 지정하여 sql백업을 받을 수 있다.&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;pb = new ProcessBuilder(
        dbPgdumpPath, // C:\Program Files\PostgreSQL\10\bin
        &quot;--host&quot;, dbHost,
        &quot;--port&quot;, dbPort,
        &quot;--username&quot;, dbUsername,
        &quot;--no-password&quot;,
        &quot;--format&quot;, &quot;custom&quot;,
        &quot;--blobs&quot;,
        &quot;--verbose&quot;,
        &quot;--file&quot;, fileName);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t 옵션으로 특정 테이블 지정이 가능하고, --encoding 옵션으로 인코딩포맷 지정이 가능하다.&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;pb = new ProcessBuilder(
        dbPgdumpPath, // C:\Program Files\PostgreSQL\10\bin
        &quot;--host&quot;, dbHost,
        &quot;--port&quot;, dbPort,
        &quot;--username&quot;, dbUsername,
        &quot;--no-password&quot;,
        &quot;--format&quot;, &quot;custom&quot;,
        &quot;--blobs&quot;,
        &quot;--verbose&quot;,
        &quot;--encoding&quot;, &quot;UTF-8&quot;,
        &quot;--file&quot;, fileName,
        &quot;-t&quot;, tableNm);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업파일명을 생성할 땐 주로 백업날짜를 붙여 파일명을 생성하니, 그 부분도 신경써주는 것이 좋다.&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 현재 날짜
LocalDate today = LocalDate.now();
// 파일 이름에 포맷을 지정, 오늘 날짜를 포함
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&quot;yyyyMMdd&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 날짜 생성 후 fileName 생성시 붙여주면&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;fileName = dbBackupPath + tableNm + &quot;_backup_&quot; + today.format(formatter) + &quot;.sql&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IKo3P/btsHp1WnSNd/ResSPiKgab5fpgbB9bGZCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IKo3P/btsHp1WnSNd/ResSPiKgab5fpgbB9bGZCK/img.png&quot; data-alt=&quot;백업파일생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IKo3P/btsHp1WnSNd/ResSPiKgab5fpgbB9bGZCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIKo3P%2FbtsHp1WnSNd%2FResSPiKgab5fpgbB9bGZCK%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;138&quot; height=&quot;49&quot; data-origin-width=&quot;138&quot; data-origin-height=&quot;49&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;파일이 잘 떨어지는 것을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, 인텔리제이에서 작업시, pg_dump수행 중에 한글이 깨지는 현상이 발생했는데&lt;br /&gt;프로세스의 환경 변수 맵에 LANG 설정을 해주면 한글이 정상 출력 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;div style=&quot;background-color: #212121; color: #eeffff;&quot;&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;final Map&amp;lt;String, String&amp;gt; env = pb.environment(); // 프로세스의 환경 변수 맵
env.put(&quot;PGPASSWORD&quot;, dbPassword);
env.put(&quot;LANG&quot;, &quot;en_US.UTF-8&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ALL</category>
      <category>java pg_dump 백업</category>
      <category>java pg_dump연동</category>
      <category>java 에서 백업</category>
      <category>pg_dump</category>
      <category>pg_dump sql파일 생성</category>
      <category>pg_dump 백업</category>
      <category>pg_dump 한글깨짐</category>
      <category>processbuilder</category>
      <category>리눅스 pg_dump</category>
      <category>윈도우pg_dump</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/83</guid>
      <comments>https://renee.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 14 May 2024 11:05:21 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 2급 - 과목중요도순</title>
      <link>https://renee.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무에서 리눅스 서버 설치, 서비스 배포 등 다룰일이 있어서, 관련 지식을 갖출 겸 공부를 해야겠다고 생각하고&lt;br /&gt;리눅스 마스터 2급 시험을 신청하게 되었다. 리눅스마스터 시험은 1차, 2차에 걸쳐 시행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차는 온라인(오픈북)시험, 2차는 우리가 익히 아는 실기 시험장에 가서 치루는 CBT 시험으로 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 시험을 치루기 전 가장 단기간에 효율적으로 공부하기 위한 방법을 찾아봤고, &lt;br /&gt;다행히도 1차, 2차 모두 합격했고, 빠르게 준비해서 시험을 치루고자 하는 이들을 위해 공부하는 법을 공유하고자 한다.&lt;br /&gt;&lt;br /&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 data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1차 시험&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비필요 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차시험은 집에서 pc로 시험을 치면 된다. 오픈북 시험이라고 봐도 무방하다.&lt;br /&gt;인터넷에 리눅스마스터 2급 족보 를 검색하면 이것저것 많이 나온다. &lt;br /&gt;족보들을 모아두고, &lt;span style=&quot;background-color: #9feec3; color: #666666; text-align: start;&quot;&gt;ctrl + f &lt;/span&gt;&amp;nbsp;로 시험 때 잘 찾아서 풀면 된다. 1차는 결과가 바로 나온다.&lt;br /&gt;공부 없이도 치고 합격 가능한 1차 시험.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 1차는 이렇게 쉽게 시험을 쳐도 2차는 제대로 공부해야 시험장에 가서 문제를 풀 수 있다는 점을 기억해야 한다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2차 시험&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;기출 -&amp;gt; 개념 -&amp;gt; 기출 -&amp;gt; 개념 -&amp;gt; 기출 ......&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저 리눅스마스터 2급 2차 필기 기출문제 사이트&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715782333069&quot; style=&quot;color: #333333; text-align: start;&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwMWnO/hyVVF5q9t6/paQ53xpKTpffFIGkzPanOk/img.jpg?width=290&amp;amp;height=80&amp;amp;face=0_0_290_80&quot; data-og-url=&quot;https://www.comcbt.com/xe/r2&quot; data-og-source-url=&quot;https://www.comcbt.com/xe/r2&quot; data-og-host=&quot;www.comcbt.com&quot; data-og-description=&quot;리눅스마스터 2급 필기 기출문제 전자문제집 CBT&quot; data-og-title=&quot;리눅스마스터 2급 필기 기출문제 전자문제집 CBT - 최강 자격증 기출문제 전자문제집 CBT&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.comcbt.com/xe/r2&quot; data-source-url=&quot;https://www.comcbt.com/xe/r2&quot;&gt;
&lt;div style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwMWnO/hyVVF5q9t6/paQ53xpKTpffFIGkzPanOk/img.jpg?width=290&amp;amp;height=80&amp;amp;face=0_0_290_80');&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스마스터 2급 필기 기출문제 전자문제집 CBT - 최강 자격증 기출문제 전자문제집 CBT&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스마스터 2급 필기 기출문제 전자문제집 CBT&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;www.comcbt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;최근 3년도 기출문제를 다 풀며 개념을 확인한다. 처음에는 모르는 개념이 나와 시간이 좀 걸릴 수 있는데,&lt;/u&gt;&lt;br /&gt;&lt;u&gt;한두장 정도 풀다보면 뒤에서는 같은 개념에서 문제가 반복되어 출제 된다.&amp;nbsp;&lt;/u&gt;&lt;br /&gt;물론 자격증취득용이기도 하지만, 이왕이면 따는김에 공부도 되었으면 해서 중요한 파일시스템, 소유권 그리고 중요한 개념들은 인터넷 검색해가면서 공부하며 문제를 풀었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2과목은 크게 총 9개과목으로 나뉘어지는데 1-6, 7-9 장으로 묶어서 보면 된다.&lt;br /&gt;각 과목별로 중요도와 배분된 문제수에 차이가 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 과목 문제배분과 중요도 순서이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 파일시스템 관련 명령어 (권한 및 그룹 설정 과 파일시스템 관리)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. 프로세스 관리&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3. 셸, 소프트웨어 설치&lt;/b&gt;&lt;br /&gt;&lt;b&gt;4. 에디터, 주변 장치&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2024-05-15-11-50-19 002.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX40ES/btsHrq22npq/4Db9kKUuWJKZzKFJNEZzOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX40ES/btsHrq22npq/4Db9kKUuWJKZzKFJNEZzOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX40ES/btsHrq22npq/4Db9kKUuWJKZzKFJNEZzOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX40ES%2FbtsHrq22npq%2F4Db9kKUuWJKZzKFJNEZzOK%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;502&quot; height=&quot;377&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2024-05-15-11-50-19 002.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 과목 중요도 순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 인터넷 활용&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. X-Windows&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3. 응용분야&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과목별로 중요도와 문제비중이 높은 과목순서대로 공부를 했다. &lt;br /&gt;실제로 문제풀이나 시험에서도 위와같은 비율로 출제가 된다.&lt;br /&gt;&lt;br /&gt;시험에 합격하는것도 중요하지만, 이왕이면 공부해서 머릿속에 오래 남기자는 마음으로&lt;br /&gt;모르는 개념이 나올때마다 관련 자료들을 3-5개이상 찾아보면서 공부했다.&lt;/p&gt;</description>
      <category>ALL/Linux</category>
      <category>리눅스</category>
      <category>리눅스 2급</category>
      <category>리눅스마스터</category>
      <category>리눅스마스터 2급</category>
      <category>리눅스마스터 공부</category>
      <category>리눅스마스터 시험</category>
      <category>리마 벼락치기</category>
      <category>리마2급</category>
      <category>서버</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/82</guid>
      <comments>https://renee.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 23 Apr 2024 14:48:54 +0900</pubDate>
    </item>
    <item>
      <title>Databricks 스파크 시작(내용무)</title>
      <link>https://renee.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1711436127783&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Databricks - Sign In&quot; data-og-description=&quot;&quot; data-og-host=&quot;community.cloud.databricks.com&quot; data-og-source-url=&quot;https://community.cloud.databricks.com/?o=873686684652692&quot; data-og-url=&quot;https://community.cloud.databricks.com/login.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://community.cloud.databricks.com/?o=873686684652692&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://community.cloud.databricks.com/?o=873686684652692&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; data-ke-size=&quot;size16&quot;&gt;Databricks - Sign In&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;community.cloud.databricks.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;1574&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DB88f/btsF5F9lC1m/7kHWnROTo5p57K26XVKrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DB88f/btsF5F9lC1m/7kHWnROTo5p57K26XVKrf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DB88f/btsF5F9lC1m/7kHWnROTo5p57K26XVKrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDB88f%2FbtsF5F9lC1m%2F7kHWnROTo5p57K26XVKrf0%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;755&quot; height=&quot;483&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;2008&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWxZD/btsF6GGIzFT/1uoF111jxWWH4he2OPumPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWxZD/btsF6GGIzFT/1uoF111jxWWH4he2OPumPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWxZD/btsF6GGIzFT/1uoF111jxWWH4he2OPumPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWxZD%2FbtsF6GGIzFT%2F1uoF111jxWWH4he2OPumPk%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;752&quot; height=&quot;421&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1124&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kaggle 사이트 접속, 로그인 후 데이터 내려받기&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;2314&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPk2a2/btsF8lB0Iar/Rmow8gxBXiL5H8qLa84aQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPk2a2/btsF8lB0Iar/Rmow8gxBXiL5H8qLa84aQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPk2a2/btsF8lB0Iar/Rmow8gxBXiL5H8qLa84aQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPk2a2%2FbtsF8lB0Iar%2FRmow8gxBXiL5H8qLa84aQ0%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;752&quot; height=&quot;534&quot; data-origin-width=&quot;2314&quot; data-origin-height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>kaggle</category>
      <category>Spark</category>
      <category>spark 스파크</category>
      <category>스파크</category>
      <category>스파크 실습</category>
      <category>캐글</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/81</guid>
      <comments>https://renee.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 26 Mar 2024 15:56:24 +0900</pubDate>
    </item>
    <item>
      <title>[JVM] Class Loader</title>
      <link>https://renee.tistory.com/80</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;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px; color: #000000;&quot;&gt;jvm에 대해 검색하면 자주 보이는 부분이 heap메모리 영역과 runtime data area 에 대한 글들을 많이 볼 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px; color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;나는 우리가 작성하는 소스코드가 메모리에 어떻게 올라가고 어떻게 동작하는지 궁금하여&amp;nbsp;JVM에 관한 책들을 읽게 되었다. &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;간략하게 말하자면 우리가 작성한 자바 소스코드는 먼저 자바컴파일러에 의해 컴파일 되어 JVM이 실행할수있는 class 파일로 변환되고 &lt;br /&gt;클래스 로더가&amp;nbsp;&lt;/span&gt;JVM으로 클래스를 로드 한 후 로딩, 링킹 과정을 거쳐 runtime data area에 배치한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn85uK/btsDKRyriWl/Pq86Ww7ClcPKQdENSnBctk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn85uK/btsDKRyriWl/Pq86Ww7ClcPKQdENSnBctk/img.png&quot; data-alt=&quot;Image Reference:-Oracle&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn85uK/btsDKRyriWl/Pq86Ww7ClcPKQdENSnBctk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn85uK%2FbtsDKRyriWl%2FPq86Ww7ClcPKQdENSnBctk%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;707&quot; height=&quot;466&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Image Reference:-Oracle&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;JVM에서&amp;nbsp; Class파일의 실행은 Class Loader를 통해 로딩되면서 시작되기 때문에, Class Loader에 대한 이야기를 먼저 정리해보려고 한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yVwxF/btsDSs48dY3/YKgDkRA9eKQKF9KSfudGx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yVwxF/btsDSs48dY3/YKgDkRA9eKQKF9KSfudGx1/img.png&quot; data-alt=&quot;https://www.artima.com/insidejvm/ed2/lifetype.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yVwxF/btsDSs48dY3/YKgDkRA9eKQKF9KSfudGx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyVwxF%2FbtsDSs48dY3%2FYKgDkRA9eKQKF9KSfudGx1%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;455&quot; height=&quot;317&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.artima.com/insidejvm/ed2/lifetype.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;br /&gt; Class Loader&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 특성 중 하나는 Runtime시에 동적으로 Class를 읽어온다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Class는 참조되는 순간 동적으로 Load 및 Link가 이루어진다. 이러한 방식을 Dynamic Loading 이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM에서 Dynamic Loading을 담당하는 주체는 바로 Class Loader이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Class Loader란 JVM내로 Class를 Load하고 Link를 통해 적절히 배치하는 일련의 작업을 수행하는 모듈이라고 정의할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt; &lt;b&gt;Dynamic Loading&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Load가 어느 시점에 수행되느냐에 따라 Load Time Dynamic Loading 과 Runtime Dynamic Loading으로 구분된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Load Time Dynamic Loading&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;하나의 Class를 Loading하는 과정에서 이에 관련된 Class들을 한꺼번에 Loading 하는 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Runtime Dynamic Loading&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;소스 코드에서 객체를 참조하는 순간에 동적으로 Loading 하는 방식(Reflection이라는 기술의 기본이 되어 Spring과 같은 Framework에도 널리 사용되고 있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 Class Loader란 JVM내로 Class를 Load하고 Link를 통해 적절히 배치하는 일련의 작업을 수행 한다고 하였는데, JVM은 동일한 Class를 중복해서 Loading 하지 않는다. 그렇기 때문에 해당 Class가 JVM에 이미 Load 되어 있는지 확인하는 과정이 필요하게 되는데, 이 과정에서 Class를 구별하는 방법은 &lt;b&gt;Class의 이름&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class의 이름이라고 하면 보통 Full Qualified Name(Package Name과 Class Name을 점(.)으로 연결한 이름)을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Class Loader가 Class를 인식하는 것은 여기에 Class를 Load한 Class Loader의 이름까지 포함한다. &lt;b&gt;Loader Name + Package Name + Class Name&lt;/b&gt; 까지 동일해야 같은 Class로 인식한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class Loader가 Class를 Load할 때 JVM에 있는 모든 Class를 찾아다니며 이름을 확인하는 것이 아니라 &lt;b&gt;Namespace&lt;/b&gt;라는 것을 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt;Namespace&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class Loader는 Namespace를 각각 하나씩 가지고 있어 자신이 Load한 Class의 Full Qualified Name을 저장해 놓는다. 자신의 Namespace에 이름이 없다면, 같은 Class라도 Class Loader만 다르다면 중복해서 Load가 가능하다는 것을 의미하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;그럼 언제 Class Loader가 자신의 Namespace를 검색할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 Symbolic Reference 를 수행할 때 이다. 객체의 이름으로 참조를 할 때마다 Class Loader는 해당 Class를 Load 해야 할 지의 여부를 결정하기 위해 Namespace를 참조하게 된다. 그런데 Java는 자신이 참조하는 Class를 Load할 때 &lt;b&gt;반드시 참조하는 Class와 참조되는 Class가 동일한 Class Loader를 사용&lt;/b&gt;해야만 한다는 규칙이 있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; Symbolic Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 심볼릭 레퍼런스(symbolic reference)는 &lt;b&gt;클래스 이름이나 인터페이스 이름으로&lt;/b&gt; 클래스나 인터페이스를 참조하는 방식을 말한다. 기본 자료형(primitive data type)을 제외한 모든 타입은 심볼릭 레퍼런스를 통해 참조된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;심볼릭 레퍼런스 예시 ( String 클래스를 심볼릭 레퍼런스로 참조하는 예 )&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;String str = &quot;Hello, world!&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서 str은 String 클래스의 인스턴스를 참조한다. 그러나 str은 String 클래스의 주소를 직접 참조하는 것이 아니라, String 클래스의 이름인 &quot;java.lang.String&quot;으로만 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 시점에 JVM은 &quot;java.lang.String&quot;을 통해 String 클래스를 찾고, 그 주소를 str에 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 예시, 다음 코드는 Runnable 인터페이스를 심볼릭 레퍼런스로 참조하는 예이다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;Runnable runnable = () -&amp;gt; System.out.println(&quot;Hello, world!&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서 runnable은 Runnable 인터페이스의 구현체를 참조한다. 하지만 runnable은 Runnable 인터페이스의 주소를 직접 참조하는 것이 아니라, Runnable 인터페이스의 이름인 &quot;java.lang.Runnable&quot;으로만 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 시점에 JVM은 &quot;java.lang.Runnable&quot;을 통해 Runnable 인터페이스를 찾고, 그 주소를 runnable에 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼릭 레퍼런스는 다음과 같은 경우에 사용된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스나 인터페이스를 미리 정의하지 않고 사용해야 하는 경우&lt;/li&gt;
&lt;li&gt;클래스나 인터페이스를 동적으로 로드해야 하는 경우&lt;/li&gt;
&lt;li&gt;클래스나 인터페이스를 반환해야 하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼릭 레퍼런스를 사용하면 코드의 유연성이 향상되고, 런타임 시점에 클래스나 인터페이스를 동적으로 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;메소드 호출은 런타임에 실제로 해결되지만, Symbolic Reference는 컴파일 시간에 사용된다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Class exHello {
	Class c1 = Class.forName(exem.package.jvmclass);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class Loader1, Class Loader2가 있을때, Class Loader2가 exHello를 Load하고 나서 exem.package.jvmclass 를 참조하기 위해 Class Loader1가 아닌 Class Loader2가 Load를 한다는 말 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;참조관계가 있는 Class들은 같은 Class Loader를 사용해야 한다 는 원칙이 있기 때문이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 Class Loader가 단 하나만 사용되거나 수많은 Class Loader들이 제각각 Load 하는 상황이 발생하지 않도록 &lt;b&gt;Class Loader Delegation Model&lt;/b&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;1270&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqkuRN/btsDLLSdJtZ/Vb4US8mtUCtMqgmXNkKLB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqkuRN/btsDLLSdJtZ/Vb4US8mtUCtMqgmXNkKLB0/img.png&quot; data-alt=&quot;https://www.infoworld.com/article/3700054/all-about-java-class-loaders.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqkuRN/btsDLLSdJtZ/Vb4US8mtUCtMqgmXNkKLB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqkuRN%2FbtsDLLSdJtZ%2FVb4US8mtUCtMqgmXNkKLB0%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;740&quot; height=&quot;467&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.infoworld.com/article/3700054/all-about-java-class-loaders.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;Class Loader Delegation Model&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: Load의 요청을 위계적으로 전달하는 방식을 의미한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM내에는 여러 개의 Class Loader가 있으며 Class Loader는 위계 구조, 계층 구조를 가지고 있다. Class Loader Delegation Model은 이러한 위계 구조를 바탕으로 서로에게 임무를 **위임(Delegation)**하는 일련의 방법을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class Loader는 Bootstrap Class Loader / Extension Class Loader / Application Class Loader 등으로 구별 되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bootstrap Class Loader&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모를 가지지 않는 가장 상위의 Class Loader 이다.&lt;/li&gt;
&lt;li&gt;JVM 기동 시에 가장 먼저 생성, $JAVA_HOME/jre/lib/rt.jar 를 Load 하는 작업을 수행한다. 그 이후 Object Class를 포함한 Java API들을 Load 하게 된다.&lt;/li&gt;
&lt;li&gt;Native Code로 구현되어 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; JAVA 를 수행하기 위한 Runtime 환경을 구성하는 기초 단계에 포함 된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Extention Class Loader&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BootStrap Class Loader 를 부모로 하고 기본 Java API를 제외한 $JAVA_HOME/jre/lib/ext에 위치한 확장 Class들을 Load하는 작업을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Bootstrap Class Loader 와 Extension Class Loader는 JVM을 위한 Class Loader 라고 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Application Class Loader(= System Class Loader)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;System Class Loader라는 명칭으로 부르기도 한다.&lt;/li&gt;
&lt;li&gt;System Class Loader와 User Defined Class Loader를 합쳐서 부르기도 한다.&lt;/li&gt;
&lt;li&gt;JVM이 아니라 &lt;b&gt;Application User를 위한 Class Loader&lt;/b&gt;이다. $CLASSPATH 또는 java.class.path에 위치한 Class 들을 Load 한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;User Defined Class Loader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application에서 직접 생성이 가능하다. 보통 WAS나 Framework에서는 User Defined Class Loader를 생성해서 사용하는 경우가 많다. User Defined Class Loader는 System Class Loader의 하위에 있으며 User Defined Class Loader 들 끼리도 계층을 가지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class Loader Delegation Model은 Load의 요청을 위계적으로 전달하는 방식을 의미하는데 이 요청은 &lt;b&gt;위&lt;/b&gt;로 위&lt;b&gt;임을 하게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Class를 탐색&lt;/b&gt;하는 것도 이와 유사하다. 일단 Namespace를 검색하여 이미 Load된 Class 라면 이를 반환하고 Load 되어 있지 않으면 Parent 에게 위임을 하게 된다. 만약 Parent Class Load가 이를 완료하지 못하면 자신이 Class를 Load한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Class의 Load 과정 정리&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Class Loader가 Load 요청을 받으면 내부적으로 loadClass()라는 Method가 수행된다. loadClass() : Class가 이미 Load되어있으면 반환, 아니면 Parent Class Loader에게 위임&lt;/li&gt;
&lt;li&gt;Parent Class Loader 도 이 Class를 Load 하지 않았다면 findClass() 를 호출한다. findClass() : 요청받은 Class Loader가 직접 파일 시스템을 탐색하여 Class를 Load 한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&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;System Class Loader 에게 특정 Class를 Load 하도록 하는 작업 요청했다고 가정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 특정 Class는 파일시스템 어딘가에 존재할 것이고 그 디렉토리는 $CLASSPATH 로 지정한 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1)&lt;/b&gt; 이 경우 System Class Loader는 자신의 Namespace를 찾아보고 Load 한 적이 없으면 자신이 Load를 시도하는 것이 아니라 Extension Class Loader에게 요청을 위임하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2)&lt;/b&gt; 이 Extension Class Loader도 역시 자신의 Namespace 를 검색하여 Class를 찾지 못할 경우 다시 Load 작업은 Bootstrap Class Loader로 넘어가서 같은 작업을 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3)&lt;/b&gt; 여기서도 실패하게 되면 $CLASSPATH 를 직접 찾아보고 해당 Class를 Load 하게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; JVM에서 &lt;b&gt;Default&lt;/b&gt; 로 사용하는 Class Loader는 &lt;b&gt;System Class Loader&lt;/b&gt; 이며 User Defined Class Loader를 생성할 때 별도의 Parent를 지정하지 않게 되면 System Class Loader가 부모가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  보통 WAS의 경우에는 User Defined Class Loader를 만들어 이를 주로 사용하게 된다. $WAS_HOME과 같은 특정 디렉토리를 설정하여 검색하도록 되어있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Class Loader Delegation Model의 또 한가지 원칙은 &lt;b&gt;Class Loader 자신과 자신의 Parent Class Loader의 정보는 열람이 가능하지만&lt;/b&gt; &lt;b&gt;자신보다 하위에 있거나&lt;/b&gt;, 부모가 같더라도 &lt;b&gt;형제처럼 갈라진 Class Loader에게는&lt;/b&gt; &lt;b&gt;위임도 불가능하고 Namespace의 정보를 제공받지 못한다&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 자기 역할이 아니면 완료하지 못하니 상위로 위임. 각자 자기가 맡은 것만 로딩한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 부모부터 로딩. 상속관계이면 하위는 볼 수 없다. 그러면 밑에서 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 로더에게 역할을 분배. 그리고 상위 클래스로더는 하위 클래스 로더를 보지 못하니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위에서 상위에게 일을 위임하고 상위에서 하지 못하는 것은 제일 하위가 다 하는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;상속관계의 특징은 자식은 부모를 볼 수 있다. 부모는 자식을 볼 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성자도 항상 부모 생성자부터 처리하고 자식 생성자 처리.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 하는 것은 부모 클래스를 로딩하고 난 후에 자식 클래스를 로딩해야 정상적인 관계가 만들어진다는 뜻 이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서부터 다 메모리에 로딩해야 자기가 상위를 보면서 처리한다는 표현이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이러한 특성들을 바탕으로 WAS벤더들은 나름의 Class Loader Tree를 구성하여 사용한다. WAS 라는 것은 J2EE 표준을 따른 구현체 이다. J2EE 안에는 JNDI, JMS등등의 여러 서버들이 구성되어 있기는 하지만, 가장 중요한 것은 Web Container와 EJB Container 라고 생각된다.&lt;/p&gt;</description>
      <category>ALL</category>
      <category>class loader</category>
      <category>dynamic loading</category>
      <category>jvm</category>
      <category>JVM Class Loader</category>
      <category>jvm dynamic loading</category>
      <category>jvm 메모리</category>
      <category>jvm 클래스로더</category>
      <category>namespace</category>
      <category>Runtime Data Area</category>
      <category>클래스로더</category>
      <author>whoAmI_</author>
      <guid isPermaLink="true">https://renee.tistory.com/80</guid>
      <comments>https://renee.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 21 Jan 2024 22:24:35 +0900</pubDate>
    </item>
  </channel>
</rss>