<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>기획자에서 개발자로</title>
    <link>https://nextmoveon.tistory.com/</link>
    <description>항상 어제보다 좋은 코드를 지향합니다.
https://github.com/LimDongHyun99</description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 16:32:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>달마루</managingEditor>
    <image>
      <title>기획자에서 개발자로</title>
      <url>https://tistory1.daumcdn.net/tistory/5378939/attach/54c7057bd0fc4a618d12dd8b2e8ee25a</url>
      <link>https://nextmoveon.tistory.com</link>
    </image>
    <item>
      <title>ORACLE DB LINK 정의 및 사용 방법</title>
      <link>https://nextmoveon.tistory.com/356</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle DB link 란? 말그래도 'LINK', 서로 다른 DB를 연결한다는 뜻.&lt;br /&gt;그리고 연결을 위한 타DB 접속설정을 정의하는 오라클 객체 를 DB Link라고 함.&lt;br /&gt;그냥 쉽게 다른 DB에 접근하는 걸 DB Link라 이해하면 쉽다.&lt;br /&gt;&lt;br /&gt;1. 모든 DB LINK 목록 조회&lt;br /&gt;SELECT *&lt;br /&gt;&amp;nbsp; &amp;nbsp;FROM DBA_DB_LINKS; &lt;br /&gt;&lt;br /&gt;2. DB LINK 사용 방법&lt;br /&gt;SELECT A.*&lt;br /&gt;&amp;nbsp; &amp;nbsp;FROM 테이블명@DB_LINK명 A; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. DB LINK 두 개이상 조회 방법&lt;br /&gt;SELECT A.*, B.* &lt;br /&gt;&amp;nbsp; FROM 테이블1명@DB_LINK1명 A, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;테이블2명@DB_LINK2명 B &lt;br /&gt;WHERE A.ID = B.ID &lt;br /&gt;&amp;nbsp; &amp;nbsp; AND A.NO = B.NO&lt;/p&gt;</description>
      <category>개념 창고/Database</category>
      <category>database link</category>
      <category>db link</category>
      <category>LinK</category>
      <category>oracle</category>
      <category>데이터베이스링크</category>
      <category>디비링크</category>
      <category>디비링크란</category>
      <category>오라클</category>
      <category>오라클 dblink</category>
      <category>오라클디비링크</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/356</guid>
      <comments>https://nextmoveon.tistory.com/356#entry356comment</comments>
      <pubDate>Sun, 15 Sep 2024 16:32:35 +0900</pubDate>
    </item>
    <item>
      <title>JSON.stringify(value, replacer, space) 설명</title>
      <link>https://nextmoveon.tistory.com/355</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JSON.stringify(value, replacer, space) &lt;br /&gt;메서드는 JavaScript 객체를 JSON 문자열로 변환할 때 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;value:&amp;nbsp;JSON&amp;nbsp;문자열로&amp;nbsp;변환할&amp;nbsp;객체. &lt;br /&gt;replacer:&amp;nbsp;포함할&amp;nbsp;속성을&amp;nbsp;정의하거나&amp;nbsp;속성을&amp;nbsp;변환하는&amp;nbsp;함수&amp;nbsp;또는&amp;nbsp;배열. &lt;br /&gt;space: 반환된 JSON 문자열의 가독성을 높이기 위한 공백 또는 문자열 (들여쓰기).&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723079056213&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = { name: &quot;Alice&quot;, age: 30, city: &quot;Wonderland&quot;, password: &quot;secret&quot; };

// replacer 함수: 'password' 속성을 제외
function replacer(key, value) {
  if (key === &quot;password&quot;) {
    return undefined;
  }
  return value;
}

// space 매개변수: 들여쓰기를 사용하여 포맷
const jsonString = JSON.stringify(obj, replacer, 4);
console.log(jsonString);
/* 출력:
{
    &quot;name&quot;: &quot;Alice&quot;,
    &quot;age&quot;: 30,
    &quot;city&quot;: &quot;Wonderland&quot;
}
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PS. Json 타입으로 로그 출력도 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1723079177293&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(JSON.stringify(myJsonData, null, 2));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개념 창고/JS</category>
      <category>JavaScript</category>
      <category>javascript 객체</category>
      <category>javascript 객체 제이슨</category>
      <category>json</category>
      <category>JSON.stringify</category>
      <category>json.stringify 변경</category>
      <category>stringify</category>
      <category>자바스크립트제이슨변환</category>
      <category>제이슨</category>
      <category>제이슨 변환</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/355</guid>
      <comments>https://nextmoveon.tistory.com/355#entry355comment</comments>
      <pubDate>Thu, 8 Aug 2024 10:06:35 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 문자열(String) 비교시 equals()와 == 차이</title>
      <link>https://nextmoveon.tistory.com/354</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우선 두 가지의 정의 후에 차이를 보겠습니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;ldquo;equals&amp;rdquo;&amp;nbsp;메서드 &lt;br /&gt;원래 equals()의 경우 Object 클래스의 메서드이고&lt;br /&gt;이는 == 연산자와 동일하게 주소 값을 비교를 수행하는 메서드 이다. &lt;br /&gt;흔히 문자열 비교를 위해 사용하는 equals()의 경우 String 클래스에서 &lt;br /&gt;오버라이딩을 함으로써 문자열 간의 비교가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &amp;ldquo;==&amp;rdquo; 연산자&lt;br /&gt;== 연산자의 경우 객체의 주소값을 비교합니다.&lt;br /&gt;그래서 비교하는 객체가 동일한 객체인지를 판별합니다.&lt;br /&gt;Primitive Type의 객체에 대해서는 값 비교가 가능하고,&lt;br /&gt;Reference Type에 대해서는 주소 비교를 수행합니다. &lt;br /&gt;&lt;br /&gt;정리하면,&lt;br /&gt;Primitive Type의 객체는 Constant Pool의 특정한 값을 참조하는 변수이기에,&lt;br /&gt;결국 Constant Pool내의 동일한 주소를 비교합니다.(해당 주소가 동일하기에 == 을 사용해서 비교가 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 값 비교(equals)과 주소값 비교(==)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;==연산자와&amp;nbsp;equals()메서드의&amp;nbsp;차이점은&amp;nbsp;==&amp;nbsp;연산자는&amp;nbsp;비교하는&amp;nbsp;두&amp;nbsp;대상의&amp;nbsp;주소값을&amp;nbsp;비교하는데&amp;nbsp;반해&amp;nbsp;String&amp;nbsp;클래스의&amp;nbsp;equals()&amp;nbsp;메서드는&amp;nbsp;비교하는&amp;nbsp;두&amp;nbsp;대상의&amp;nbsp;값을&amp;nbsp;비교하는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;기본 타입의 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용되지만,&lt;br /&gt;String은 일반적인 타입이 아니라 클래스이다.&lt;br /&gt;클래스는 기본적으로 Call by Reference형태로 객체 생성 시 주소값이 부여된다.&lt;br /&gt;그래서 String 타입을 선언했을때는 같은 값을 부여하더라도 서로의 주소값이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 코드1&lt;/p&gt;
&lt;pre id=&quot;code_1722312496739&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
    
    	String str1 = &quot;test&quot;;
		String str2 = &quot;test&quot;;
		String str3 = new String(&quot;test&quot;);
		String str4 = new String(&quot;test&quot;);

		System.out.println(str1==str3); //false		
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 보면 ==으로 비교한 두개의 값은 서로 다른것을 확인 할 수 있다.&lt;br /&gt;== 연산자의 경우 참조 타입 변수들 간의 연산은 동일한 객체를 참조하는지,&lt;br /&gt;다른 객체를 참조하는지 알아볼 때 사용된다.&lt;br /&gt;참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 서로 다른 주소값을 비교하게 되어,&lt;br /&gt;자바에서 문자열을 비교하려면 equals()이라는 메서드를 활용하여 두 개의 값을 비교해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예시 코드2&lt;/p&gt;
&lt;pre id=&quot;code_1722312606931&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
    
    	String str1 = &quot;test&quot;;
		String str2 = &quot;test&quot;;
		String str3 = new String(&quot;test&quot;);
		String str4 = new String(&quot;test&quot;);
		
        System.out.println(str1.equals(str3)); //true
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교 대상의 '주소'가 아닌 데이터 '값'을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 값 비교를 할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;마무리 &lt;br /&gt;결국 문자열을 비교할 땐 equals() 메소드를 사용하는 것이 바람직하다.&lt;br /&gt;우리가 문자열을 비교하는 이유는 대부분, 동일한 리터럴 값을 가지냐를 판단하기 위해서이지,&lt;br /&gt;동일한 주소값을 가지는지 파악하려는 것이 아니기 때문이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>개념 창고/JAVA</category>
      <category>==와 equals 차이</category>
      <category>call by reference</category>
      <category>call by value</category>
      <category>equals</category>
      <category>equals()</category>
      <category>java equals</category>
      <category>java equals()</category>
      <category>java equals()와 ==차이</category>
      <category>primitive type</category>
      <category>주소와 값 비교</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/354</guid>
      <comments>https://nextmoveon.tistory.com/354#entry354comment</comments>
      <pubDate>Tue, 30 Jul 2024 13:12:39 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] ==, === 비교 연산자 차이</title>
      <link>https://nextmoveon.tistory.com/353</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript를&amp;nbsp;사용&amp;nbsp;중에&amp;nbsp;값을&amp;nbsp;비교시엔 &lt;br /&gt;비교연산자인&amp;nbsp;==연산자와&amp;nbsp;===연산자를&amp;nbsp;사용한다. &lt;br /&gt;&lt;br /&gt;두 연산자 모두 비교한 피연산자 값이 일치하면 ture값을 반환하고,&lt;br /&gt;비교한&amp;nbsp;피연산자&amp;nbsp;값이&amp;nbsp;일치하지&amp;nbsp;않으면&amp;nbsp;false를&amp;nbsp;반환한다. &lt;br /&gt;&lt;br /&gt;하지만 값을 비교할 때&lt;br /&gt;== 연산자보다는 === 연산자를 사용할 것을 권장하고 있다. &lt;br /&gt;&lt;br /&gt;그 이유가 뭘까?&amp;nbsp;&lt;br /&gt;&lt;br /&gt;==&amp;nbsp;연산자는&amp;nbsp;Equal&amp;nbsp;Operator(비교연산자), &lt;br /&gt;===연산자는&amp;nbsp;Strict&amp;nbsp;Equal&amp;nbsp;Operator(엄격한&amp;nbsp;비교&amp;nbsp;연산자)이기&amp;nbsp;때문이다. &lt;br /&gt;&lt;br /&gt;두&amp;nbsp;연산자를&amp;nbsp;코드를&amp;nbsp;통해&amp;nbsp;쉽게&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;보자면&amp;nbsp;아래와&amp;nbsp;같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. == 연산자&lt;/p&gt;
&lt;pre id=&quot;code_1722310722411&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;100 == 100        // true
100 == '100'      // true
1 == true         // true
true == 'true'    // true
null == undefined // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;== 비교 연산자는 두 값을 비교해서 같으면 true 다르면 false 값을 리턴&lt;br /&gt;두 피연산자 값이 서로 타입이 다를 경우에는 자동으로 일부 피연산자의 타입을 변환한 후에 값을 비교한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. === 비교 연산자&lt;/p&gt;
&lt;pre id=&quot;code_1722310703258&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;100 === 100        // true
100 === '100'      // false
1 === true         // false
true === 'true'    // false
null === undefined // false
NaN === NaN        // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피연산자 값의 타입이 서로 다르면 자동으로 타입을 반환해 주는 == 연산자와 달리&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;=== 연산자는 두 피연산자 값의 타입이 서로 다르더라도 변환하지 않고&lt;br /&gt;있는 그대로의 값을 비교하는 방식으로 엄격하게 값을 비교한다.&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;또한 NaN 값은 자기 자신을 포함하여 어떠한 값과도 일치하지 않는다.&lt;br /&gt;즉, NaN 값과 비교하게 되면 항상 false의 값이 반환된다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;== 연산자에서 타입이 다르면 알아서 변환해주기 때문에&lt;br /&gt;숫자 1 과 문자 '1'을 동일하게 판단할 수 있다. 결과가 달라진다는 것이다.&lt;br /&gt;그럼 확인과 검증이 무의미해지는 것이고,&amp;nbsp;&lt;br /&gt;비즈니스로직에서 해당 값으로 분기처리를 한다면 완전히 다른 결과를 낼 것이다.&lt;br /&gt;&lt;br /&gt;Fe 에서 Be로 보낼 때 데이터 타입이 달라서 나는 오류는 자주 겪을 것이다.&lt;br /&gt;자동으로 변환해주는 자바스크립트의 편리함(?)으로&lt;br /&gt;에러는 피하더라도 오히려 혼선을 가져올 수 있다.&lt;br /&gt;&lt;br /&gt;그래서 타입을 지정해서 타입스크립트를 쓰는 것이다.&amp;nbsp;&lt;br /&gt;컴파일 단계에서 오류 포착을 할 수 있다는 장점도 있지만 일단 넘어가고&lt;br /&gt;불명확하게 지정해버릴 수 있는게 JS의 장점이자 단점, 양날의 검이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;프로그래밍은 확실해야하니까, 확실하고 명확하게 지정하는 것이 좋다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>개념 창고/JS</category>
      <category>==</category>
      <category>== ===</category>
      <category>===</category>
      <category>==와 ===</category>
      <category>==와 === 차이</category>
      <category>javascript 비교연산자 차이</category>
      <category>JS</category>
      <category>비교연산자</category>
      <category>비교연산자차이</category>
      <category>자바스크립트</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/353</guid>
      <comments>https://nextmoveon.tistory.com/353#entry353comment</comments>
      <pubDate>Tue, 30 Jul 2024 12:48:09 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 프로세스(Process)와 쓰레드(Thread)의 차이</title>
      <link>https://nextmoveon.tistory.com/352</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스(Process) &lt;br /&gt;운영체제에&amp;nbsp;의해&amp;nbsp;메모리&amp;nbsp;공간을&amp;nbsp;할당받아&amp;nbsp;CPU에서&amp;nbsp;실행/제어되고&amp;nbsp;있는&amp;nbsp;프로그램이다. &lt;br /&gt;데이터(data)&amp;nbsp;+&amp;nbsp;자원(memory)&amp;nbsp;+&amp;nbsp;스레드(Thread)로&amp;nbsp;구성돼&amp;nbsp;실제로&amp;nbsp;프로그램이&amp;nbsp;실행되기까지는 &lt;br /&gt;스레드가&amp;nbsp;데이터+자원을&amp;nbsp;활용하여&amp;nbsp;작업을&amp;nbsp;수행한다. &lt;br /&gt;- 프로그램은 컴퓨터가 특정 작업을 수행하기 위해 따르는 명령어의 모음&lt;br /&gt;&lt;br /&gt;쓰레드(Thread) &lt;br /&gt;하나의&amp;nbsp;프로세스&amp;nbsp;내에서&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;실행&amp;nbsp;흐름(단일,&amp;nbsp;동시적,&amp;nbsp;병렬적)을&amp;nbsp;두어&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;처리하기&amp;nbsp;위한&amp;nbsp;모델이다. &lt;br /&gt;프로그램&amp;nbsp;실행하면&amp;nbsp;JVM이&amp;nbsp;시작되고&amp;nbsp;JVM이&amp;nbsp;시작되면&amp;nbsp;자바&amp;nbsp;프로세스가&amp;nbsp;시작된다. &lt;br /&gt;이&amp;nbsp;프로세스&amp;nbsp;안에&amp;nbsp;스레드가&amp;nbsp;있다. &lt;br /&gt;여러&amp;nbsp;프로세스가&amp;nbsp;공유하는&amp;nbsp;하나의&amp;nbsp;스레드가&amp;nbsp;수행되는&amp;nbsp;일은&amp;nbsp;없다. &lt;br /&gt;어떤&amp;nbsp;프로세스든&amp;nbsp;하나&amp;nbsp;이상의&amp;nbsp;스레드가&amp;nbsp;수행된다. &lt;br /&gt;두&amp;nbsp;개&amp;nbsp;이상의&amp;nbsp;스레드를&amp;nbsp;가지는&amp;nbsp;프로세스를&amp;nbsp;멀티스레드&amp;nbsp;프로세스라고&amp;nbsp;한다. &lt;br /&gt;멀티스레드는&amp;nbsp;주어진&amp;nbsp;자원을&amp;nbsp;극한으로&amp;nbsp;사용하기&amp;nbsp;위한&amp;nbsp;모델이다. &lt;br /&gt;&lt;br /&gt;프로세스(Process)와&amp;nbsp;쓰레드(Thread)의&amp;nbsp;차이점 &lt;br /&gt;프로세스는&amp;nbsp;완벽히&amp;nbsp;독립적이기&amp;nbsp;때문에&amp;nbsp;메모리&amp;nbsp;영역을&amp;nbsp;다른&amp;nbsp;프로세스와&amp;nbsp;공유를&amp;nbsp;하지&amp;nbsp;않지만 &lt;br /&gt;스레드는&amp;nbsp;해당&amp;nbsp;스레드를&amp;nbsp;위한&amp;nbsp;스택을&amp;nbsp;생성할&amp;nbsp;뿐&amp;nbsp;프로세스&amp;nbsp;내의&amp;nbsp;메모리를&amp;nbsp;공유해서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;</description>
      <category>개념 창고/CS</category>
      <category>CS</category>
      <category>process</category>
      <category>Thread</category>
      <category>스레드</category>
      <category>스레드와프로세스</category>
      <category>쓰레드</category>
      <category>쓰레드와프로세스차이</category>
      <category>컴퓨터사이언스</category>
      <category>프로세스</category>
      <category>프로세스와스레드차이</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/352</guid>
      <comments>https://nextmoveon.tistory.com/352#entry352comment</comments>
      <pubDate>Fri, 26 Jul 2024 00:40:35 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] COUNT(*) 과 COUNT(1) 과 COUNT(칼럼명)과 COUNT(DISTINCT 칼럼명)의 차이</title>
      <link>https://nextmoveon.tistory.com/351</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQL작성시 자주 쓰게 되는 것이&lt;br /&gt;집계함수 중 COUNT 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 구절에서&lt;br /&gt;지정된 조건의 ROW들의 수를&lt;br /&gt;가져오기 위해 사용하는 것으로&lt;br /&gt;&lt;br /&gt;COUNT(*) 과 COUNT(1) 과 COUNT(칼럼명)의 차이는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;COUNT(*) - NULL 값을 포함한 모든 ROW의 수&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;COUNT (1) - NULL 값을 포함한 모든 ROW의 수 &amp;nbsp;&lt;br /&gt;COUNT (칼럼명)&lt;span&gt; - NULL 값의 행은 제외한 ROW의 수&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번외로 칼럼에 DISTINCT를 사용한 결과값은 아래와 같다.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;COUNT (DISTINCT&amp;nbsp;칼럼명)&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- NULL값의 행, 중복을 제외한 ROW의 수&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개념 창고/Database</category>
      <category>count</category>
      <category>count(*)</category>
      <category>COUNT(1)</category>
      <category>COUNT(칼럼)</category>
      <category>distinct</category>
      <category>distinct column</category>
      <category>sql count</category>
      <category>sql count 차이</category>
      <category>sql 집계함수</category>
      <category>집계함수</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/351</guid>
      <comments>https://nextmoveon.tistory.com/351#entry351comment</comments>
      <pubDate>Wed, 24 Jul 2024 01:44:15 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] MyBatis의 Query 수정 후 WAS서버 재시작없이 반영하기</title>
      <link>https://nextmoveon.tistory.com/350</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring과 mybatis 환경에서&amp;nbsp;&lt;br /&gt;MyBais를 사용할때 쿼리를 바꾸고 적용시키기위해서는&lt;br /&gt;서버를 재기동해야 적용되는 것이 번거로울 때가 있다.&lt;br /&gt;&lt;br /&gt;하지만 RefreshableSqlSessionFactoryBean 를 사용하면&lt;br /&gt;서버를 재시작하지않고 수정된 쿼리를 적용할 수 있다.&lt;br /&gt;&lt;br /&gt;이를 사용시 xml mapper 파일들의 수정으로 인한&lt;br /&gt;재기동이 없기에 재기동시 발생할 수 있는 오류와&lt;br /&gt;번거로움이 줄어들어 더 편하게 개발할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 설정 및 적용시 필요한 코드다.&lt;br /&gt;&lt;br /&gt;1. RefreshableSqlSessionFactoryBean.java 생성&lt;/p&gt;
&lt;pre id=&quot;code_1721743383256&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.core.io.Resource;
 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class RefreshableSqlSessionFactoryBean extends SqlSessionFactoryBean implements DisposableBean {

    private static final Log log = LogFactory.getLog(RefreshableSqlSessionFactoryBean.class);

    private SqlSessionFactory proxy;
    private int interval = 500;

    private Timer timer;
    private TimerTask task;

    private Resource[] mapperLocations;

    /**
     * 파일 감시 쓰레드가 실행중인지 여부.
     */
    private boolean running = false;

    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock r = rwl.readLock();
    private final Lock w = rwl.writeLock();

    public void setMapperLocations(Resource[] mapperLocations) {
        super.setMapperLocations(mapperLocations);
        this.mapperLocations = mapperLocations;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    /**
     * @throws Exception
     */
    public void refresh() throws Exception {
        if (log.isInfoEnabled()) {
            log.info(&quot;refreshing sqlMapClient.&quot;);
        }
        w.lock();
        try {
            super.afterPropertiesSet();

        } finally {
            w.unlock();
        }
    }

    /**
     * 싱글톤 멤버로 SqlMapClient 원본 대신 프록시로 설정하도록 오버라이드.
     */
    public void afterPropertiesSet() throws Exception {
        super.afterPropertiesSet();

        setRefreshable();
    }

    private void setRefreshable() {
        proxy = (SqlSessionFactory) Proxy.newProxyInstance(
                SqlSessionFactory.class.getClassLoader(),
                new Class[]{SqlSessionFactory.class},
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method,
                                         Object[] args) throws Throwable {
                        // log.debug(&quot;method.getName() : &quot; + method.getName());
                        return method.invoke(getParentObject(), args);
                    }
                });

        task = new TimerTask() {
            private Map&amp;lt;Resource, Long&amp;gt; map = new HashMap&amp;lt;Resource, Long&amp;gt;();

            public void run() {
                if (isModified()) {
                    try {
                        refresh();
                    } catch (Exception e) {
                        log.error(&quot;caught exception&quot;, e);
                    }
                }
            }

            private boolean isModified() {
                boolean retVal = false;

                if (mapperLocations != null) {
                    for (int i = 0; i &amp;lt; mapperLocations.length; i++) {
                        Resource mappingLocation = mapperLocations[i];
                        retVal |= findModifiedResource(mappingLocation);
                    }
                }

                return retVal;
            }

            private boolean findModifiedResource(Resource resource) {
                boolean retVal = false;
                List&amp;lt;String&amp;gt; modifiedResources = new ArrayList&amp;lt;String&amp;gt;();

                try {
                    long modified = resource.lastModified();

                    if (map.containsKey(resource)) {
                        long lastModified = ((Long) map.get(resource))
                                .longValue();

                        if (lastModified != modified) {
                            map.put(resource, new Long(modified));
                            modifiedResources.add(resource.getDescription());
                            retVal = true;
                        }
                    } else {
                        map.put(resource, new Long(modified));
                    }
                } catch (IOException e) {
                    log.error(&quot;caught exception&quot;, e);
                }
                if (retVal) {
                    if (log.isInfoEnabled()) {
                        log.info(&quot;modified files : &quot; + modifiedResources);
                    }
                }
                return retVal;
            }
        };

        timer = new Timer(true);
        resetInterval();

    }

    private Object getParentObject() throws Exception {
        r.lock();
        try {
            return super.getObject();

        } finally {
            r.unlock();
        }
    }

    public SqlSessionFactory getObject() {
        return this.proxy;
    }

    public Class&amp;lt;? extends SqlSessionFactory&amp;gt; getObjectType() {
        return (this.proxy != null ? this.proxy.getClass()
                : SqlSessionFactory.class);
    }

    public boolean isSingleton() {
        return true;
    }

    public void setCheckInterval(int ms) {
        interval = ms;

        if (timer != null) {
            resetInterval();
        }
    }

    private void resetInterval() {
        if (running) {
            timer.cancel();
            running = false;
        }
        if (interval &amp;gt; 0) {
            timer.schedule(task, 0, interval);
            running = true;
        }
    }

    public void destroy() throws Exception {
        timer.cancel();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. context-mapper.xml 설정&lt;/p&gt;
&lt;pre id=&quot;code_1721744034920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;gt;--&amp;gt;
&amp;lt;bean id=&quot;sqlSessionFactory&quot; class=&quot;패키지경로.RefreshableSqlSessionFactoryBean&quot;&amp;gt;
&amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&amp;gt;
&amp;lt;property name=&quot;configLocation&quot; value=&quot;classpath:/mybatis-config.xml&quot; /&amp;gt;
&amp;lt;property name=&quot;mapperLocations&quot; value=&quot;classpath:/mapper/**/*.xml&quot; /&amp;gt;
&amp;lt;property name=&quot;interval&quot; value=&quot;1000&quot; /&amp;gt;&amp;lt;/bean&amp;gt; &amp;lt;!-- mapper xml 파일을 재로딩 하는 간격 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interval 속성은 &quot;1000&quot;으로, Refresh를 해주는 주기이다.&amp;nbsp;&lt;br /&gt;단위는 ms로, 1000으로 설정시 1초마다 계속 Refresh를 하는 것이며&lt;br /&gt;WAS 가동된 상태에서 수정후 특정 쿼리 수정후 결과가 잘 반영되는지 확인하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RefreshableSqlSessionFactoryBean 관련 서버 로그를 보고 update 문구가 나오면 성공이다.&lt;/p&gt;</description>
      <category>개념 창고/Spring</category>
      <category>mybatis</category>
      <category>refreshablesqlsessionfactorybean</category>
      <category>Spring</category>
      <category>sql반영</category>
      <category>WAS재기동</category>
      <category>xml비동기반영</category>
      <category>서버재기동없이반영하기</category>
      <category>서버재시작없이query반영</category>
      <category>서버재시작없이sql반영</category>
      <category>서버재실행</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/350</guid>
      <comments>https://nextmoveon.tistory.com/350#entry350comment</comments>
      <pubDate>Tue, 23 Jul 2024 23:22:39 +0900</pubDate>
    </item>
    <item>
      <title>SDK와 JDK의 차이점</title>
      <link>https://nextmoveon.tistory.com/349</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; SDK(Software Development Kit, &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;소프트웨어 개발 도구)&lt;/b&gt;&lt;br /&gt;- 일반적으로 소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미, 소프트웨어 프레임워크, 하드웨어 플랫폼, 컴퓨터 시스템, 운영체제 등을 위한 응용 프로그램 등을 만들 수 있게 해주는 개발 도구 집합.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JDK(Java Development Kit, 자바 개발 도구)&lt;/b&gt;&lt;br /&gt;- Java EE, Java SE, Java ME 플랫폼 중 하나를 구현한 것&lt;br /&gt;- Window, Linux, mac java 개발 대상으로 오라클에 의해 바이너리 제품으로 제공 됨.&lt;br /&gt;- Java만 개발할 수 있는 SDK 를 JDK 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트(MS) 등의 다른 회사에서도 SDK라는 이름으로 개발 도구들을 많이 발표함.&lt;/p&gt;</description>
      <category>개념 창고</category>
      <category>java development kit</category>
      <category>jdk</category>
      <category>JDK차이</category>
      <category>sdk</category>
      <category>SDK JDK 차이</category>
      <category>SDK와JDK차이</category>
      <category>SDK차이</category>
      <category>software development kit</category>
      <category>소프트웨어개발도구</category>
      <category>자바개발도구</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/349</guid>
      <comments>https://nextmoveon.tistory.com/349#entry349comment</comments>
      <pubDate>Fri, 19 Apr 2024 10:30:42 +0900</pubDate>
    </item>
    <item>
      <title>CI/CD 도구</title>
      <link>https://nextmoveon.tistory.com/348</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD 도구는 소프트웨어 개발 및 배포 프로세스를 자동화하고 관리하기 위한 도구들로, 다양한 기능과 특성을 제공합니다. 아래는 대표적인 CI/CD 도구 몇 가지에 대한 간단한 설명입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Jenkins:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;특징:&lt;/b&gt; 오픈 소스이며 확장성이 뛰어나고, 다양한 플러그인을 제공하여 다양한 개발 환경에 적용 가능.&lt;br /&gt;&lt;b&gt;활용:&lt;/b&gt; 지속적인 빌드, 테스트, 배포 작업을 자동화하는 데 사용.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. GitLab CI/CD:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;특징: &lt;/b&gt;GitLab 내에서 통합된 CI/CD 기능을 제공하여 코드 리포지토리와 통합된 단일 플랫폼에서 전체 CI/CD 프로세스를 관리할 수 있음.&lt;br /&gt;&lt;b&gt;활용:&amp;nbsp;&lt;/b&gt;GitLab에서 코드 관리, CI/CD, 협업을 통합하여 사용자에게 편리한 환경을 제공함.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Travis CI:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;특징:&lt;/b&gt; 클라우드 기반으로 호스팅되는 CI/CD 서비스로, GitHub과 연동하여 사용할 수 있음.&lt;br /&gt;&lt;b&gt;활용:&amp;nbsp;&lt;/b&gt;GitHub 프로젝트에서의 지속적인 빌드 및 테스트 작업을 수행하며, 배포까지 관리할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Circle CI: &lt;/b&gt;&lt;br /&gt;&lt;b&gt;특징:&lt;/b&gt; 클라우드 기반의 CI/CD 서비스로, 손쉽게 설정이 가능하며, 빠른 속도와 확장성을 제공.&lt;br /&gt;&lt;b&gt;활용:&lt;/b&gt; 소프트웨어 개발에서 지속적인 빌드, 테스트, 배포를 자동화하는 데 사용.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. GitHub Actions: &lt;/b&gt;&lt;br /&gt;&lt;b&gt;특징:&lt;/b&gt; GitHub 내에서 호스팅되는 CI/CD 서비스로, 코드 리포지토리와 통합되어 사용자 편의성을 제공. &lt;br /&gt;&lt;b&gt;활용:&lt;/b&gt; GitHub에서 코드 변경에 대한 자동 빌드, 테스트, 배포 작업을 설정하고 관리하는 데 사용.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. AWS CodePipeline: &lt;/b&gt;&lt;br /&gt;&lt;b&gt;특징:&lt;/b&gt; 아마존 웹 서비스에서 제공하는 서비스로, 다양한 AWS 서비스와 통합되어 풍부한 기능을 제공. &lt;br /&gt;&lt;b&gt;활용:&amp;nbsp;&lt;/b&gt;AWS 환경에서 소프트웨어 개발 프로세스의 자동화를 위한 통합된 CI/CD 서비스로 사용.&lt;br /&gt;&lt;br /&gt;다양한 CI/CD 도구들은 프로젝트의 요구사항과 환경에 따라 선택되며,&lt;br /&gt;각각의 특징에 따라 다양한 유용한 기능을 제공함.&lt;br /&gt;&lt;br /&gt;CI/CD의 상세 개념은 아래 링크에 있습니다.&lt;br /&gt;&lt;a href=&quot;https://nextmoveon.tistory.com/347&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextmoveon.tistory.com/347&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707149617464&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;CI(Continuous Integration)와 CD(Continuous Deployment / Continuous Delivery)&quot; data-og-description=&quot;CI/CD 는 지속적 통합(Continuous Integration)과 지속적 배포(Continuous Deployment), 지속적 제공 (Continuous Delivery)의 약어입니다. 각 개념에 대한 자세한 사항은 아래 정리합니다. 지속적 통합 (Continuous Integrat&quot; data-og-host=&quot;nextmoveon.tistory.com&quot; data-og-source-url=&quot;https://nextmoveon.tistory.com/347&quot; data-og-url=&quot;https://nextmoveon.tistory.com/347&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bubKFL/hyVf2urMjJ/9zKwU2ON7vLAlZFfbRJNI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bOOf8W/hyVgbSsPCS/jhqtaP1dx7mWdNevFn9S3k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://nextmoveon.tistory.com/347&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nextmoveon.tistory.com/347&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bubKFL/hyVf2urMjJ/9zKwU2ON7vLAlZFfbRJNI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bOOf8W/hyVgbSsPCS/jhqtaP1dx7mWdNevFn9S3k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;CI(Continuous Integration)와 CD(Continuous Deployment / Continuous Delivery)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD 는 지속적 통합(Continuous Integration)과 지속적 배포(Continuous Deployment), 지속적 제공 (Continuous Delivery)의 약어입니다. 각 개념에 대한 자세한 사항은 아래 정리합니다. 지속적 통합 (Continuous Integrat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nextmoveon.tistory.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;</description>
      <category>개념 창고</category>
      <category>AWS CodePipeline</category>
      <category>CI/CD</category>
      <category>CI/CD 도구</category>
      <category>CI/CD 방법</category>
      <category>CI/CD란?</category>
      <category>Circle CI</category>
      <category>github actions</category>
      <category>GitLab</category>
      <category>jenkins</category>
      <category>Travis CI</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/348</guid>
      <comments>https://nextmoveon.tistory.com/348#entry348comment</comments>
      <pubDate>Tue, 6 Feb 2024 01:13:50 +0900</pubDate>
    </item>
    <item>
      <title>CI(Continuous Integration)와 CD(Continuous Deployment / Continuous Delivery)</title>
      <link>https://nextmoveon.tistory.com/347</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;CI/CD 는&lt;br /&gt;지속적 통합(Continuous Integration)과&lt;br /&gt;지속적 배포(Continuous Deployment),&lt;br /&gt;지속적 제공 (Continuous Delivery)의 약어입니다.&lt;br /&gt;&lt;br /&gt;각 개념에 대한 자세한 사항은 아래 정리합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;지속적 통합 (Continuous Integration - CI) :&lt;/b&gt; &lt;br /&gt;&lt;b&gt;개념:&lt;/b&gt; 코드 변경 사항을 지속적으로 통합하여 품질을 유지하고 향상시키는 프로세스. &lt;br /&gt;&lt;b&gt;동작&amp;nbsp;방식:&lt;/b&gt;&amp;nbsp;개발자들이&amp;nbsp;코드를&amp;nbsp;개발하는&amp;nbsp;동안,&amp;nbsp;변경된&amp;nbsp;코드가&amp;nbsp;공유&amp;nbsp;리포지토리에&amp;nbsp;통합되고,&amp;nbsp;자동으로&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;테스트가&amp;nbsp;실행됨. &lt;br /&gt;&lt;b&gt;목적:&amp;nbsp;&lt;/b&gt;개발자들이&amp;nbsp;자주&amp;nbsp;코드를&amp;nbsp;통합하여&amp;nbsp;충돌을&amp;nbsp;최소화하고&amp;nbsp;품질을&amp;nbsp;지속적으로&amp;nbsp;검증함으로써&amp;nbsp;빠르게&amp;nbsp;소프트웨어를&amp;nbsp;개발하고&amp;nbsp;배포하는&amp;nbsp;것.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;지속적&amp;nbsp;제공&amp;nbsp;(Continuous&amp;nbsp;Delivery&amp;nbsp;-&amp;nbsp;CD):&lt;/b&gt;&lt;br /&gt;&lt;b&gt;개념:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;지속적 제공은 지속적 통합의 확장으로, 자동으로 빌드 및 테스트를 통해 배포 가능한 소프트웨어를 생성하되, 프로덕션 환경으로의 배포는 자동화되지 않음.&lt;br /&gt;&lt;b&gt;동작 방식:&lt;/b&gt;코드 변경이 발생하면 자동으로 빌드 및 테스트를 실행하여 배포 가능한 소프트웨어를 생성하나, 프로덕션 배포는 수동으로 진행.&lt;br /&gt;&lt;b&gt;목적:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;안정적이고 신뢰성 있는 소프트웨어를 지속적으로 생성하면서도 배포 과정의 투명성과 효율성을 높여, 언제든지 배포할 수 있는 소프트웨어를 개발자들이 관리할 수 있도록 합니다. 이는 비즈니스 요구에 따라 적절한 시점에 배포를 수행할 수 있도록 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지속적 배포 (Continuous Deployment - CD):&lt;/b&gt;&lt;br /&gt;&lt;b&gt;개념:&lt;/b&gt;&amp;nbsp;코드&amp;nbsp;변경이&amp;nbsp;자동으로&amp;nbsp;프로덕션&amp;nbsp;환경으로&amp;nbsp;배포되는&amp;nbsp;프로세스. &lt;br /&gt;&lt;b&gt;동작&amp;nbsp;방식:&lt;/b&gt;&amp;nbsp;CI에서&amp;nbsp;통합된&amp;nbsp;코드가&amp;nbsp;자동으로&amp;nbsp;배포&amp;nbsp;파이프라인을&amp;nbsp;통과하여&amp;nbsp;프로덕션&amp;nbsp;환경에&amp;nbsp;자동으로&amp;nbsp;배포됨. &lt;br /&gt;&lt;b&gt;목적:&amp;nbsp;&lt;/b&gt;프로덕션&amp;nbsp;배포의&amp;nbsp;자동화를&amp;nbsp;통해&amp;nbsp;소프트웨어를&amp;nbsp;신속하게,&amp;nbsp;안정적으로,&amp;nbsp;반복적으로&amp;nbsp;배포함. &lt;br /&gt;CI/CD는 다양한 도구와 자동화 기술을 활용하여 이러한 개념을 실현합니다. 이를 통해 개발자들은 빠르게 변경 사항을 통합하고 배포할 수 있으며, 소프트웨어의 품질을 지속적으로 모니터링하고 향상시킬 수 있음.&lt;br /&gt;&lt;br /&gt;최종 정리 :&lt;br /&gt;CI/CD는 빌드, 테스트, 배포 등을 자동화하여 품질을 향상시키고 빠르게 소프트웨어를 개발하고 배포하는 데 중점을 둔다.&lt;br /&gt;CI는 통합만을, CD는 그 중에서도 배포 단계의 자동화 여부에 따라 두 가지로 나눠진다.&lt;/p&gt;</description>
      <category>개념 창고</category>
      <category>CD</category>
      <category>CD(Continuous Delivery)</category>
      <category>CI</category>
      <category>CI(Continuous Integration)</category>
      <category>CI(Continuous Integration) CD(Continuous Deployment)</category>
      <category>CI/CD</category>
      <category>CI/CD 란?</category>
      <category>CI/CD 설명</category>
      <category>CI/CD 차이</category>
      <category>Continuous Integration</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/347</guid>
      <comments>https://nextmoveon.tistory.com/347#entry347comment</comments>
      <pubDate>Tue, 6 Feb 2024 01:05:44 +0900</pubDate>
    </item>
    <item>
      <title>Nods.js란?</title>
      <link>https://nextmoveon.tistory.com/346</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는&amp;nbsp;Chrome&amp;nbsp;V8&amp;nbsp;JavaScript&amp;nbsp;엔진으로&amp;nbsp;빌드된&amp;nbsp;JavaScript&amp;nbsp;런타임&amp;nbsp;환경입니다.&amp;nbsp;주로&amp;nbsp;서버&amp;nbsp;사이드&amp;nbsp;애플리케이션을&amp;nbsp;개발하는&amp;nbsp;데&amp;nbsp;사용되며,&amp;nbsp;비동기적이고&amp;nbsp;이벤트&amp;nbsp;기반의&amp;nbsp;특성을&amp;nbsp;갖고&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;주요 특징과 개념&lt;br /&gt;&lt;b&gt;1. JavaScript 런타임:&lt;/b&gt; Node.js는 JavaScript를 실행하는 환경을 제공합니다. 기존에는 브라우저에서만 실행되는 JavaScript를 서버 사이드에서 실행할 수 있도록 해줍니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 비동기적 프로그래밍:&lt;/b&gt; Node.js는 비동기 이벤트 처리를 강조합니다. 이벤트 기반의 비동기 모델을 사용하여 여러 작업을 효율적으로 처리할 수 있습니다. 이를 통해 다수의 요청을 동시에 처리하고, I/O 작업이 완료될 때까지 블로킹하지 않고 계속 다른 작업을 수행할 수 있습니다. &lt;br /&gt;&lt;br /&gt;3. 모듈 시스템: Node.js는 모듈 시스템을 갖고 있어 코드를 여러 파일로 구성하여 개발할 수 있습니다. 이로써 코드의 유지보수와 재사용성이 향상됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 패키지 매니저 (npm):&lt;/b&gt; Node.js는 npm이라는 패키지 매니저를 통해 모듈 및 패키지를 손쉽게 관리할 수 있습니다. 다양한 라이브러리와 프레임워크를 npm을 통해 설치하고 사용할 수 있습니다. &lt;br /&gt;&lt;br /&gt;5. 서버 사이드 개발: 주로 웹 서버를 비롯한 서버 사이드 애플리케이션을 개발하는 데 사용됩니다. Express.js와 같은 프레임워크를 사용하면 빠르게 웹 애플리케이션을 구축할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Cross-platform 지원:&lt;/b&gt; Node.js는 Windows, macOS, Linux 등 다양한 플랫폼에서 실행될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 Node.js 코드 예시&lt;/p&gt;
&lt;pre id=&quot;code_1707066954110&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 웹 서버 생성 예시 (Express.js를 사용한 경우)
const express = require('express');
const app = express();

app.get('/', (req, res) =&amp;gt; {
  res.send('Hello, World!');
});

app.listen(3000, () =&amp;gt; {
  console.log('Server is running on port 3000');
});&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개념 창고</category>
      <category>node</category>
      <category>Node JS 설명</category>
      <category>Node JS 특징</category>
      <category>node.js</category>
      <category>node.js 사용법</category>
      <category>node.js 설명</category>
      <category>Nods.js란?</category>
      <category>노드</category>
      <category>노드js</category>
      <category>노드제이에스</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/346</guid>
      <comments>https://nextmoveon.tistory.com/346#entry346comment</comments>
      <pubDate>Mon, 5 Feb 2024 02:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] id 속성과 class 속성의 차이?</title>
      <link>https://nextmoveon.tistory.com/345</link>
      <description>&lt;p id=&quot;html의-대표-속성인-id-속성과-class-속성&quot; style=&quot;color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;한줄로 정리하면&lt;br /&gt;ID는 한 요소에만 사용이 가능하고,&lt;br /&gt;CLASS는 여러 요소에 중복 사용이 가능합니다.&lt;/p&gt;
&lt;p style=&quot;color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;고유하게 전체 페이지에서 단 한가지에만 적용이 목적이라면&lt;br /&gt;구분이 가능하지만, 반복이 불가능한 ID를 사용할 수 있고,&amp;nbsp;&lt;br /&gt;중복으로 전체 페이지에서 반복적으로 적용이 목적이라면&lt;br /&gt;구분이 가능하지만, 반복이 가능한 CLASS를 사용하면 됩니다.&lt;br /&gt;CLASS는 반복적으로 쓰이는 유형들을 동일한 CLASS로 분류하여&lt;br /&gt;편하게 관리할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;CSS에서의 사용법&lt;/h4&gt;
&lt;p style=&quot;color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 사용하기 위해서는&lt;br /&gt;#id&lt;br /&gt;.class&lt;br /&gt;형식으로 사용하면 됩니다.&lt;br /&gt;id 속성은 유일하기 때문에 클래스보다 우선적으로 적용됩니다.&lt;br /&gt;&lt;br /&gt;표로 정리합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;# 으로 선택&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;. 으로 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;한 문서에 단 하나의 요소에만 적용&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;동일한 값을 갖는 요소가 많음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;특정 요소에 이름을 붙일 때 사용&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;스타일의 분류(classification)에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예제 코드&lt;/p&gt;
&lt;pre id=&quot;code_1706723826402&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;id, class 적용 예제&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* id 사용시 id 앞에 #을 붙여 사용 */
        #footer {
            clear: both;
            background-color: #333333;
            color: white; /* 흰색 텍스트 예제 추가 */
            padding: 10px; /* 패딩 추가 */
        }
        /* class 사용시 class 앞에 .을 붙여 사용 */
        .box {
            text-align: center;
            background-color: #333333;
            color: white; /* 흰색 텍스트 예제 추가 */
            padding: 10px; /* 패딩 추가 */
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;div class=&quot;box&quot;&amp;gt;
        &amp;lt;!-- box의 1번째 class --&amp;gt;
        &amp;lt;p&amp;gt;This content is in a box 1.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;box&quot;&amp;gt;
        &amp;lt;!-- box의 2번째 class --&amp;gt;
        &amp;lt;p&amp;gt;This content is in a box 2.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;box&quot;&amp;gt;
        &amp;lt;!-- box의 3번째 class --&amp;gt;
        &amp;lt;p&amp;gt;This content is in a box 3.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div id=&quot;footer&quot;&amp;gt;
        &amp;lt;!-- footer의 유일한 사용처--&amp;gt;
        &amp;lt;p&amp;gt;This is the footer.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>개념 창고/HTML &amp;amp; CSS</category>
      <category>class</category>
      <category>css id와 class 차이</category>
      <category>html css</category>
      <category>html id와 class 차이</category>
      <category>ID</category>
      <category>id class 예제</category>
      <category>id class 차이</category>
      <category>id속성 class속성 차이</category>
      <category>id속성과 class속성 차이</category>
      <category>ID와 CLASS 차이</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/345</guid>
      <comments>https://nextmoveon.tistory.com/345#entry345comment</comments>
      <pubDate>Thu, 1 Feb 2024 02:59:34 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Unsigned  int 구현 방법</title>
      <link>https://nextmoveon.tistory.com/343</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 C와 같은 언어에서처럼 명시적으로 unsigned int를 지원하지 않습니다.&lt;br /&gt;자바에서는 모든 정수 타입이 부호를 가지며, 음수와 양수를 모두 표현할 수 있습니다.&lt;br /&gt;&lt;br /&gt;그러나 구현을 한다면, 버전별로 쉽게 두 가지 방법이 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;자바 8 이전(기존 방식)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706693279025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;long unsignedIntValue = Integer.toUnsignedLong(signedIntValue);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Java&amp;nbsp;8&amp;nbsp;이후&amp;nbsp;(Unsigned&amp;nbsp;클래스&amp;nbsp;사용)&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706693418824&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

// 부호 없는 int
int unsignedIntValue = Integer.toUnsignedInt(signedIntValue);

// 부호 없는 long
long unsignedLongValue = Integer.toUnsignedLong(signedLongValue);

// 또는 Atomic 클래스를 사용하여 부호 없는 정수 얻기
int unsignedIntValueAtomic = new AtomicInteger(signedIntValue).get();
long unsignedLongValueAtomic = new AtomicLong(signedLongValue).get();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;Java&amp;nbsp;8부터는&amp;nbsp;Integer.toUnsignedInt&amp;nbsp;및&amp;nbsp;Integer.toUnsignedLong&amp;nbsp;메서드를&amp;nbsp;사용하여&amp;nbsp;부호&amp;nbsp;없는&amp;nbsp;정수로&amp;nbsp;변환할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;또한,&amp;nbsp;AtomicInteger&amp;nbsp;및&amp;nbsp;AtomicLong&amp;nbsp;클래스를&amp;nbsp;사용하여&amp;nbsp;부호&amp;nbsp;없는&amp;nbsp;정수&amp;nbsp;값을&amp;nbsp;얻을&amp;nbsp;수도&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;결국 &lt;br /&gt;1. 부호 없는 정수로 직접 만든다.&lt;br /&gt;2. AtomicInteger 클래스를 쓴다.&lt;br /&gt;두 가지인데&lt;br /&gt;&lt;br /&gt;현재 사용 가능한 방법은 아래 코드와 같습니다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;Unsigned 클래스 사용 및 직접 부호 없는 정수 변환(&lt;b&gt;Java 8 이후)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706693530449&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.concurrent.atomic.AtomicInteger;

public class AtomicVsUnsigned {
    public static void main(String[] args) {
        int signedValue = -1;

        // 사용 예제 1: AtomicInteger 사용
        AtomicInteger atomicInt = new AtomicInteger(signedValue);
        int unsignedValue1 = atomicInt.get();
        System.out.println(&quot;Using AtomicInteger: &quot; + unsignedValue1); // -1

        // 사용 예제 2: 부호 없는 정수로 직접 변환
        int unsignedValue2 = Integer.toUnsignedInt(signedValue);
        System.out.println(&quot;Using toUnsignedInt: &quot; + unsignedValue2); // 4294967295
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AtomicInteger는 자바의 멀티스레딩 환경에서 안전하게 증가 또는 감소하는 등의 연산을 수행하기 위한 클래스로, AtomicInteger 클래스는 내부적으로 CAS(Compare-And-Swap) 연산을 사용하여 원자성을 보장합니다.&lt;br /&gt;따라서 여러 스레드가 동시에 해당 변수에 접근해도 안전하게 값을 변경할 수 있습니다.&lt;br /&gt;&lt;br /&gt;반면,&amp;nbsp;AtomicInteger를&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;부호&amp;nbsp;없는&amp;nbsp;정수로&amp;nbsp;변환하는&amp;nbsp;용도와는&amp;nbsp;조금&amp;nbsp;다릅니다.&amp;nbsp;AtomicInteger는&amp;nbsp;부호&amp;nbsp;있는&amp;nbsp;정수&amp;nbsp;값을&amp;nbsp;다루는&amp;nbsp;데&amp;nbsp;주로&amp;nbsp;사용되며,&amp;nbsp;부호&amp;nbsp;없는&amp;nbsp;정수로&amp;nbsp;변환하는&amp;nbsp;데&amp;nbsp;직접적으로&amp;nbsp;적합하지는&amp;nbsp;않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개념 창고/JAVA</category>
      <category>AtomicInteger</category>
      <category>AtomicLong</category>
      <category>CAS</category>
      <category>CAS(Compare-And-Swap)</category>
      <category>java atomic</category>
      <category>java atomic int</category>
      <category>java AtomicInteger</category>
      <category>java unsigned int</category>
      <category>unsigned</category>
      <category>unsigned int</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/343</guid>
      <comments>https://nextmoveon.tistory.com/343#entry343comment</comments>
      <pubDate>Wed, 31 Jan 2024 18:37:55 +0900</pubDate>
    </item>
    <item>
      <title>MSB(Most Significant Bit) &amp;amp; LSB(Least Significant Bit)</title>
      <link>https://nextmoveon.tistory.com/342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;MSB.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkRjPj/btsEdINXDxD/V3IhDaiRLvSZYk0FB7mhyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkRjPj/btsEdINXDxD/V3IhDaiRLvSZYk0FB7mhyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkRjPj/btsEdINXDxD/V3IhDaiRLvSZYk0FB7mhyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkRjPj%2FbtsEdINXDxD%2FV3IhDaiRLvSZYk0FB7mhyK%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;950&quot; height=&quot;305&quot; data-filename=&quot;MSB.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 요약 :&amp;nbsp;&lt;br /&gt;&lt;b&gt;MSB(Most&amp;nbsp;Significant&amp;nbsp;Bit)&lt;/b&gt;는 정보를 나타내는 비트, 해당 이진수의 가장 왼쪽에 위치한 비트를 가리킵니다.&amp;nbsp; &lt;br /&gt;&lt;b&gt;LSB(Less&amp;nbsp;Significant&amp;nbsp;Bit)&lt;/b&gt;는&amp;nbsp;이진수에서&amp;nbsp;가장&amp;nbsp;낮은&amp;nbsp;자리에&amp;nbsp;있는&amp;nbsp;비트를&amp;nbsp;나타냅니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;컴퓨터에서 수를 표현할 때, MSB가 부호를 결정하며, 1이면 음수, 0이면 양수임을 뜻합니다.&lt;br /&gt;즉, 맨 앞의 비트는 부호를 나타내고, 두번째부터 끝까지 비트로 수 자체를 나타냅니다. &lt;br /&gt;&lt;br /&gt;개념 설명&amp;nbsp;&lt;br /&gt;&lt;b&gt;MSB(Most Significant Bit)&lt;/b&gt;는 정보를 나타내는 이진수에서 가장 중요한 비트를 나타냅니다. 이진수는 0과 1로 이루어진 수 체계이며, MSB는 해당 이진수의 가장 왼쪽에 위치한 비트를 가리킵니다. 이진수의 각 비트는 2의 거듭제곱을 나타내며, MSB는 가장 큰 값을 나타내므로 해당 비트의 상태가 전체 값에 큰 영향을 미칩니다.&lt;br /&gt;MSB는 데이터를 해석하거나 전송할 때 중요한 역할을 합니다. 특히, 컴퓨터 아키텍처, 데이터 통신, 이미지 처리 및 오디오 신호 처리와 같은 다양한 분야에서 사용됩니다.&lt;br /&gt;다양한 응용 분야에서 MSB의 중요성은 다르게 나타날 수 있습니다. 예를 들어, 부호 있는 정수를 나타내는 데 MSB는 해당 수의 부호를 결정하는 데 사용됩니다. MSB가 0이면 양수이고, 1이면 음수입니다.&lt;br /&gt;이진수에서 MSB의 위치는 해당 데이터의 해석과 처리에 영향을 미치므로, 프로그래밍, 디지털 신호 처리, 컴퓨터 아키텍처 등의 분야에서 이 개념을 이해하고 활용하는 것이 중요합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LSB(Less Significant Bit)&lt;/b&gt;는 이진수에서 가장 낮은 자리에 있는 비트를 나타냅니다. 이진수에서 오른쪽 끝에 위치한 비트이며, 가장 작은 가치를 나타냅니다. LSB의 값은 해당 이진수의 전체 값에 영향을 미치는데, 가장 낮은 자리이기 때문에 해당 비트의 상태가 바뀌면 전체 값도 크게 변할 수 있습니다. &lt;br /&gt;LSB는 주로 데이터의 민감도가 낮거나 정밀도가 낮을 때 중요성이 떨어지는 경우에 활용됩니다. 예를 들어, 이미지의 색상 정보 중에서 LSB는 색상의 민감도가 낮은 부분을 표현하거나, 음악 파일에서 LSB는 소리의 낮은 주파수 성분을 나타낼 수 있습니다. &lt;br /&gt;암호학 분야에서는 LSB 스테가노그래피(Steganography)라는 기술이 사용되는데, 이는 이미지나 오디오와 같은 미디어 파일에 정보를 숨기는 기술 중 하나입니다. 여기서 LSB를 이용하여 적은 변화를 유도하면서 정보를 숨길 수 있습니다. &lt;br /&gt;&lt;br /&gt;전체적으로,&amp;nbsp;MSB와&amp;nbsp;마찬가지로&amp;nbsp;LSB도&amp;nbsp;이진수에서&amp;nbsp;특정&amp;nbsp;비트의&amp;nbsp;위치에&amp;nbsp;따라&amp;nbsp;데이터의&amp;nbsp;해석과&amp;nbsp;처리에&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;중요한&amp;nbsp;개념&amp;nbsp;중&amp;nbsp;하나입니다.&lt;/p&gt;</description>
      <category>개념 창고</category>
      <category>Less Significant Bit</category>
      <category>LSB(Least Significant Bit)</category>
      <category>most significant bit</category>
      <category>MSB</category>
      <category>MSB LSB</category>
      <category>MSB LSB 구분</category>
      <category>MSB LSB 차이</category>
      <category>MSB 용도</category>
      <category>MSB(Most Significant Bit)</category>
      <category>MSB와 LSB</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/342</guid>
      <comments>https://nextmoveon.tistory.com/342#entry342comment</comments>
      <pubDate>Wed, 31 Jan 2024 18:25:36 +0900</pubDate>
    </item>
    <item>
      <title>Signed &amp;amp; Unsigned 정의 및 차이</title>
      <link>https://nextmoveon.tistory.com/341</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;언어들에서 어렵지 않게 자주 접하게 되는 이 keyword,&lt;br /&gt;개념을 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;쉽게 이해하는 방법은 두 가지가 있습니다.&lt;br /&gt;&lt;b&gt;1. SIGN =&amp;gt; 부호가 있다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; UNSIGN =&amp;gt; 부호가 없다.&lt;br /&gt;즉, '-' 가 있냐, 없냐로 이해하기&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;2. '음수까지 표현하느냐, 음수를 표현하지 않느냐' 로 이해하기&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;nbsp; -&amp;nbsp;&amp;nbsp;signed : 양수, 음수가 있는 수 (부호를 가지는 값, 양수/음수 구분 O) &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;unsigned : 양수만 있는 수 (부호를 갖지 않는 값, 양수/음수 구분 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부호를 보는 한 MSB(Most Significant Bit)를 부호로 사용하게 되는데,&lt;br /&gt;그 부분을 숫자의 부분으로 활용하여 음수를 표현하지 못하는 대신,&lt;br /&gt;양수의 범위가 늘어나는 것이다.&lt;br /&gt;&lt;br /&gt;ex)&lt;br /&gt;signed char =&amp;gt; -128~127의 범위 표현 가능&lt;br /&gt;unsigned char =&amp;gt; 0~255의 범위 표현 가능&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;signed&lt;span&gt; int =&amp;gt; -2,147,483,648 ~ 2,147,483,647 의 범위 표현 가능 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;unsigned&lt;span&gt; int&amp;nbsp; =&amp;gt; 0 ~ 4,294,967,295 의 범위 표현 가능&lt;br /&gt;&lt;br /&gt;참조용으로 Java에서 구현하는 방법 까지 올려둡니다.&lt;br /&gt;&lt;a href=&quot;https://nextmoveon.tistory.com/343&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextmoveon.tistory.com/343&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706722235470&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] Unsigned  int 구현 방법&quot; data-og-description=&quot;자바에서는 C와 같은 언어에서처럼 명시적으로 unsigned int를 지원하지 않습니다. 자바에서는 모든 정수 타입이 부호를 가지며, 음수와 양수를 모두 표현할 수 있습니다. 그러나 구현을 한다면, 버&quot; data-og-host=&quot;nextmoveon.tistory.com&quot; data-og-source-url=&quot;https://nextmoveon.tistory.com/343&quot; data-og-url=&quot;https://nextmoveon.tistory.com/343&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PtkLY/hyVf9MSFyM/ECVNz6PwgUj6deJP8gJhMk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/doCsDi/hyVb9A0mAf/vDx9wlrarJvaHt431xSoy0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://nextmoveon.tistory.com/343&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nextmoveon.tistory.com/343&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PtkLY/hyVf9MSFyM/ECVNz6PwgUj6deJP8gJhMk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/doCsDi/hyVb9A0mAf/vDx9wlrarJvaHt431xSoy0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Java] Unsigned int 구현 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바에서는 C와 같은 언어에서처럼 명시적으로 unsigned int를 지원하지 않습니다. 자바에서는 모든 정수 타입이 부호를 가지며, 음수와 양수를 모두 표현할 수 있습니다. 그러나 구현을 한다면, 버&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nextmoveon.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개념 창고</category>
      <category>MSB</category>
      <category>signed</category>
      <category>Signed char Unsigned char 차이</category>
      <category>signed int</category>
      <category>Signed int Unsigned int 차이</category>
      <category>Signed Unsigned 차이</category>
      <category>unsigned</category>
      <category>unsigned char</category>
      <category>unsigned int</category>
      <category>unsigned int 범위</category>
      <author>달마루</author>
      <guid isPermaLink="true">https://nextmoveon.tistory.com/341</guid>
      <comments>https://nextmoveon.tistory.com/341#entry341comment</comments>
      <pubDate>Wed, 31 Jan 2024 18:03:40 +0900</pubDate>
    </item>
  </channel>
</rss>