<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>devH.log</title>
        <link>https://velog.io/</link>
        <description>'잘'살고 싶은 보통사람</description>
        <lastBuildDate>Wed, 26 Apr 2023 03:44:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>devH.log</title>
            <url>https://velog.velcdn.com/images/botong_dev/profile/c5d55ed8-33d9-4be5-8683-bdd7132f8ff5/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. devH.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/botong_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[DTO (Data Transfer Object) VS VO(Value Object) ]]></title>
            <link>https://velog.io/@botong_dev/DTO-Data-Transfer-Object-VS-VOValue-Object</link>
            <guid>https://velog.io/@botong_dev/DTO-Data-Transfer-Object-VS-VOValue-Object</guid>
            <pubDate>Wed, 26 Apr 2023 03:44:20 GMT</pubDate>
            <description><![CDATA[<h3 id="1-dto-data-transfer-object">1. DTO (Data Transfer Object)</h3>
<blockquote>
<p>DTO는 계층간 데이터를 전달하기 위한 객체이다. 단순히 데이터를 주고받거나 전환하는 용도로 사용하기 때문에 로직을 갖지 않고 Getter/Setter 메소드만 갖는다.
👉 데이터를 옮기는 바구니</p>
</blockquote>
<h3 id="2-vovalue-object">2. VO(Value Object)</h3>
<blockquote>
<p>VO는 도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체이다. 로직을 포함할 수 있으며, 불변성의 보장을 위해 생성자를 사용하여야 한다.
 👉 값 그 자체</p>
</blockquote>
<h3 id="3-정리">3. 정리</h3>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="left"><center>DTO</center></th>
<th align="right"><center>VO</center></th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>목적</strong></td>
<td align="left"><center>계층간 데이터 전송/전달</td>
<td align="right"><center>값 자체를 표현</td>
</tr>
<tr>
<td align="left"><strong>동등성</strong></td>
<td align="left"><center>필드값이 같아도 다른 객체</td>
<td align="right"><center>필드값이 같으면 같은 객체</td>
</tr>
<tr>
<td align="left"><strong>가변성</strong></td>
<td align="left"><center>Setter 존재시 가변, 비 존재시 불가변</td>
<td align="right"><center>불변</td>
</tr>
<tr>
<td align="left"><strong>로직</strong></td>
<td align="left"><center>Getter/Setter 메소드만 가짐</td>
<td align="right"><center>Getter/Setter외에 메소드를 가질수 있음 <br/> / 값 초기화는 생성자를 통해서만 가능하다.</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[freeCodeCamp]
| 자바스크립트 예제 프로젝트(Counter)]]></title>
            <link>https://velog.io/@botong_dev/freeCodeCamp-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8Counter</link>
            <guid>https://velog.io/@botong_dev/freeCodeCamp-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8Counter</guid>
            <pubDate>Sun, 02 Apr 2023 12:07:56 GMT</pubDate>
            <description><![CDATA[<p>바닐라 자바스크립트 연습 기록 #2</p>
<h3 id="설명">설명</h3>
<blockquote>
<p>decrease, increase, reset 버튼을 누르면 각각 1씩 감소, 증가, 초기화가 되며 양수일때는 글씨가 초록색이 되고, 음수일때는 빨간색이 된다.</p>
</blockquote>
<h3 id="html">HTML</h3>
<pre><code class="language-html">  &lt;title&gt;Counter&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;container&quot;&gt;
      &lt;h1&gt;Counter&lt;/h1&gt;
      &lt;span id=&quot;number&quot;&gt;0&lt;/span&gt;
      &lt;div id=&quot;btn-container&quot;&gt;
        &lt;button id=&quot;decrease&quot;&gt;decrease&lt;/button&gt;
        &lt;button id=&quot;reset&quot;&gt;reset&lt;/button&gt;
        &lt;button id=&quot;increase&quot;&gt;increase&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;</code></pre>
<h3 id="css">CSS</h3>
<pre><code class="language-css">body {
  width: 100%;
  height: 100%;
  background-color: rgb(226, 236, 235);
  display: flex;
  justify-content: center;
  align-items: center;
}
.container {
  width: 400px;
  height: 250px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
h1 {
  font-size: 70px;
  margin-bottom: 10px;
}
#number {
  font-size: 70px;
  font-weight: bold;
}
#btn-container {
  width: 100%;
  display: flex;
  justify-content: space-between;
  gap: 10px;
}
button {
  flex: 1;
  height: 40px;
  background-color: transparent;
  border: 1px solid #000;
  border-radius: 10px;
  cursor: pointer;
}
button:hover,
button:active {
  background-color: #333;
  color: #fff;
}</code></pre>
<h3 id="js">JS</h3>
<pre><code class="language-javascript">let container = document.querySelector(&#39;#btn-container&#39;);
const increaseBtn = container.querySelector(&#39;#increase&#39;);
const decreaseBtn = container.querySelector(&#39;#decrease&#39;);
const resetBtn = container.querySelector(&#39;#reset&#39;);
const number = document.getElementById(&#39;number&#39;);

increaseBtn.addEventListener(&#39;click&#39;, function () {
  let count = Number(number.textContent);
  count = count + 1;
  number.textContent = count;
  numberColor(count);
});
decreaseBtn.addEventListener(&#39;click&#39;, function () {
  let count = Number(number.textContent);
  count = count - 1;
  number.textContent = count;
  numberColor(count);
});
resetBtn.addEventListener(&#39;click&#39;, function () {
  let count = Number(number.textContent);
  count = 0;
  number.textContent = count;
  numberColor(count);
});

function numberColor(count) {
  if (count &lt; 0) {
    number.style.color = &#39;red&#39;;
  } else if (count &gt; 0) {
    number.style.color = &#39;green&#39;;
  } else {
    number.style.color = &#39;black&#39;;
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[가상머신(Virtual Machine) VS 컨테이너(Container)]]></title>
            <link>https://velog.io/@botong_dev/%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0Virtual-Machine-VS-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Container</link>
            <guid>https://velog.io/@botong_dev/%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0Virtual-Machine-VS-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Container</guid>
            <pubDate>Thu, 30 Mar 2023 13:10:32 GMT</pubDate>
            <description><![CDATA[<h3 id="가상머신vm이란">가상머신(VM)이란?</h3>
<p>물리적 컴퓨팅 환경을 소프트웨어로 구현한 것으로 즉, 컴퓨터 시스템을 에뮬레이션(가상현실화) 하는 소프트웨어 이며, 각 가상머신상에서 운영체제나 응용프로그램을 설치 및 실행하는 것</p>
<h3 id="컨테이너container란">컨테이너(Container)란?</h3>
<p>개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말합니다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공하는 것</p>
<h3 id="차이점">차이점</h3>
<p>가상 머신(VM)은 하드웨어 기반의 여러 게스트 운영 체제로, 하이퍼바이저를 통해 에뮬레이션됩니다. 컨테이너는 애플리케이션 수준 구성이며 커널 하나를 공유하는 여러 가상 환경을 에뮬레이션합니다.</p>
<ul>
<li><p>시스템 성능
가상머신을 사용하는 기존 가상화는 각 가상머신마다 운영체제가 있기 때문에 가상머신에 구축된 애플리케이션을 실해할 때 메모리 사용량이 필요이상으로 많아진다. 반면에, 컨테이너는 한 운영체제 환경을 공유하여 사용하기 때문에 메모리 사용량이 상대적으로 적고 빠르다.</p>
</li>
<li><p>유지관리
가상머신은 운영 체제를 업데이트하거나 패치할 경우 기존 컴퓨터를 하나씩 업데이트해야 하고 각 게스트 OS를 개별적으로 패치해야 합니다.
컨테이너의 경우에는 컨테이너 호스트(컨테이너를 호스트하는 컴퓨터)의 운영 체제만 업데이트하면 됩니다. 따라서 유지관리가 매우 간소화됩니다.</p>
</li>
</ul>
<ul>
<li>보안성
가상머신은 보안적으로 문제가 생겨도 각각의 VM이 분리되어 있기 때문에 서로 피해가 가지 않지만 컨테이너는 보안적으로 문제가 생길 수 있다.</li>
</ul>
<h3 id="정리">정리</h3>
<ul>
<li>기존의 가상머신보다 컨테이너를 선호하는 이유는?
가상머신은 한 대 마다 자체적인 운영체제, 하드웨어를 구축하여 격리된 방식의 컴퓨팅 환경으로 크기가 커서 메모리 사용이 비효율적이고 느리다.
반면에 컨테이너는 하드웨어에 설치된 커널(운영체제) 하나를 공유하여 애플리케이션 코드, 라이브러리, 바이너리가 패키징된 컨테이너를 실행한다.
따라서 자원들 끼리의 이동성과 유연성이 높고 메모리를 많이 차지하지 않고 실행속도가 빨라 성능이 우수하고 커널 하나를 관리하면 변경사항이 모든 컨테이너에 적용되어 서버를 더 효율적으로 유지관리 할 수 있습니다.</li>
</ul>
<p>**단, 컨테이너는 커널을 공유하기 때문에, 보안적인 문제가 있다. 
     물리적으로 격리한 가상머신에 비해서는 보안이 취약 할 수 밖에 없다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Jump To SB] | Optional을 사용하는 이유]]></title>
            <link>https://velog.io/@botong_dev/Optional%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@botong_dev/Optional%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Mon, 27 Mar 2023 13:08:59 GMT</pubDate>
            <description><![CDATA[<h3 id="궁금증">궁금증</h3>
<p>점프투 스프링부트(2-05)를 공부하던중 findById를 통해 데이터를 조회하는 리포지터리의 메서드를 사용하면서 [Optional]은 무엇인가 궁금해졌다.
(왜 객체를 저렇게 받는거지..?) 라고 생각했다.
알아보자!</p>
<h3 id="optional은-왜-사용해야-할까">Optional은 왜 사용해야 할까?</h3>
<p>Optional은 null 처리를 유연하게 처리하기 위해 사용하는 클래스라고 한다.
즉, NPE 발생을 방지하기 위함이다.
*NPE(NullPointerException) 실제 값이 아닌 null을 가지고 있는 객체/변수를 호출할 때 발생하는 예외다.</p>
<h3 id="궁금증-해결">궁금증 해결</h3>
<p>id값을 조회할때 객체가 없을경우(Null)를 방지하고자 Optional 클래스를 사용하여 아래와 같이 isPresent로 null이 아닌지를 확인한 후에 get으로 실제 Question 객체 값을 얻어야 한다.</p>
<pre><code class="language-java"> @Test
    void testJpa() {
        Optional&lt;Question&gt; oq = this.questionRepository.findById(1);
        if(oq.isPresent()) {
            Question q = oq.get();
            assertEquals(&quot;sbb가 무엇인가요?&quot;, q.getSubject());
        }
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[freeCodeCamp]
| 자바스크립트 예제 프로젝트(Color Flipper)]]></title>
            <link>https://velog.io/@botong_dev/freeCodeCamp-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8Color-Flipper</link>
            <guid>https://velog.io/@botong_dev/freeCodeCamp-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8Color-Flipper</guid>
            <pubDate>Fri, 24 Mar 2023 12:53:47 GMT</pubDate>
            <description><![CDATA[<p>바닐라 자바스크립트 연습 기록 #1</p>
<h3 id="설명">설명</h3>
<blockquote>
<p>버튼을 누르면 랜덤으로 배경색이 바뀌는 Color Flipper</p>
</blockquote>
<h3 id="사용개념">사용개념</h3>
<p>• arrays
• document.getElementById()
• document.querySelector()
• addEventListener()
• document.body.style.backgroundColor
• Math.floor()
• Math.random()
• array.length</p>
<h3 id="html">HTML</h3>
<pre><code class="language-html"> &lt;title&gt;Color Flipper&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;container&quot;&gt;
      &lt;div class=&quot;contents&quot;&gt;
        &lt;p&gt;Background Color : &lt;span&gt;purple&lt;/span&gt;&lt;/p&gt;
        &lt;button class=&quot;btn&quot;&gt;CLICK ME&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;</code></pre>
<h3 id="css">CSS</h3>
<pre><code class="language-css">body {
  margin: 0;
}
.container {
  width: 100vw;
  height: 100vh;
  background-color: purple;
  display: flex;
  justify-content: center;
  align-content: center;
}
.contents {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 25px;
}
p {
  padding: 30px 90px;
  font-size: 30px;
  border-radius: 10px;
  background-color: #000;
  font-weight: bold;
  color: white;
}
span {
  text-transform: capitalize;
  color: purple;
}
button {
  padding: 20px 90px;
  font-size: 20px;
  border: 1px solid black;
  border-radius: 10px;
  background-color: transparent;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
  transition: all 0.3s linear;
  cursor: pointer;
}
button:hover,
button:active {
  background-color: #333;
  color: white;
}</code></pre>
<h3 id="js">JS</h3>
<pre><code class="language-javascript">const background = document.querySelector(&#39;.container&#39;);
const changeText = document.querySelector(&#39;.contents span&#39;);
const btn = document.querySelector(&#39;.btn&#39;);

const colors = [
  { id: 1, name: &#39;red&#39;, color: &#39;#ea052d&#39; },
  { id: 2, name: &#39;orange&#39;, color: &#39;#ea7805&#39; },
  { id: 3, name: &#39;yellow&#39;, color: &#39;#eac805&#39; },
  { id: 4, name: &#39;green&#39;, color: &#39;#a1ea05&#39; },
  { id: 5, name: &#39;skyblue&#39;, color: &#39;#05c1ea&#39; },
  { id: 6, name: &#39;blue&#39;, color: &#39;#0545ea&#39; },
  { id: 7, name: &#39;violet&#39;, color: &#39;#7c05ea&#39; },
  { id: 8, name: &#39;pink&#39;, color: &#39;#ffc0cb&#39; },
  { id: 9, name: &#39;salmon&#39;, color: &#39;#fa8072&#39; },
];

const clickHandler = () =&gt; {
  const randomNumber = Math.floor(Math.random() * colors.length);
  background.style.backgroundColor = colors[randomNumber].color;
  changeText.textContent = colors[randomNumber].name;
  changeText.style.color = colors[randomNumber].color;
};

btn.addEventListener(&#39;click&#39;, clickHandler);</code></pre>
]]></description>
        </item>
    </channel>
</rss>