<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bear_with_me.log</title>
        <link>https://velog.io/</link>
        <description>React, Tailwind, Pytorch, FastAPI, Docker, MySQL, Firebase, Next.js</description>
        <lastBuildDate>Fri, 10 May 2024 01:28:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bear_with_me.log</title>
            <url>https://velog.velcdn.com/images/bear_with_me/profile/9ba33337-3ba2-419e-966d-358b96dc49a7/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bear_with_me.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bear_with_me" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[파워쉘 Tab 자동완성 기능]]></title>
            <link>https://velog.io/@bear_with_me/%ED%8C%8C%EC%9B%8C%EC%89%98-Tab-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@bear_with_me/%ED%8C%8C%EC%9B%8C%EC%89%98-Tab-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Fri, 10 May 2024 01:28:25 GMT</pubDate>
            <description><![CDATA[<h2 id="파워쉘--71-버전-다운로드">파워쉘 &gt;= 7.1 버전 다운로드</h2>
<p>예측형 명령어 자동완성(<code>predictive text completion</code>) 기능은 파워쉘<code>7.1 버전</code>부터 지원된다. 해당기능은 파워쉘 커멘드라인 수정 환경 커스터마이징 모듈인 <code>PSReadLine</code>이 <code>2.2.0-beta1</code>로 업그레이드되면서 추가되었다.</p>
<ol>
<li>아래 명령어를 파워쉘에서 실행해서 파워쉘의 버전을 확인할 수 있다.</li>
</ol>
<pre><code class="language-bash">$PSVersionTable.PSVersion # 5.1 버전 파워쉘 


# Major  Minor  Build  Revision
# -----  -----  -----  -------- 
# 5      1      22621  2506</code></pre>
<p><strong>이미 7.1 버전 이상이라면 <a href="#%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%A0%95--%ED%83%AD-%EC%99%84%EC%84%B1">다음 섹션</a>으로 이동</strong></p>
<ol start="2">
<li>파워쉘 최신 버전은 아래 명령어를 통해 다운받을 수 있다.</li>
</ol>
<pre><code class="language-bash">winget install --id Microsoft.Powershell --source winget</code></pre>
<ol start="3">
<li><code>win+s</code>키를 누른 후 <code>PowerShell 7</code>를 입력하여 설치 여부를 확인한다. </li>
</ol>
<p><img src="https://velog.velcdn.com/images/bear_with_me/post/aefc2d2f-13e1-4fdb-8a54-3512929fdcfa/image.png" alt=""></p>
<h2 id="프로파일-설정--탭-완성">프로파일 설정 &amp; 탭 완성</h2>
<p>기존에 사용하던 프로파일 설정(<a href="https://velog.io/@bear_with_me/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%84-%EA%BE%B8%EB%A9%B0%EB%B3%B4%EC%9E%90Oh-My-Posh">oh-my-posh</a>, posh-git 등)이 존재한다면 새로 설치한 파워쉘에 옮겨야한다.</p>
<ol>
<li><p><strong>기존 파워쉘</strong>에서 프로파일 복사</p>
<pre><code class="language-bash">type $PROFILE # 나오는 내용을 복사하면 된다.</code></pre>
</li>
<li><p><strong>새로운 파워쉘로 이동</strong> 후 프로파일 생성</p>
<pre><code class="language-bash">Test-Path $PROFILE # 이미 존재하는지 확인. 있으면 생성 X
New-Item -Path $PROFILE -Type File -Force # 프로파일 생성</code></pre>
</li>
<li><p>앞서 1번에서 복사한 프로파일을 새로 생성한 파일에 붙여넣는다</p>
</li>
</ol>
<pre><code class="language-ps">note $PROFILE 
# ---- or ------ VScode를 사용할경우 
code $PROFILE</code></pre>
<h3 id="탭-완성">탭 완성</h3>
<p>안타깝게도 파워쉘은 디폴트로 <code>오른쪽 화살표키</code>를 눌러야 자동완성이 된다. 불편하기 때문에 탭 버튼으로 대체한다. 
새로 설치한 <code>파워쉘 7.x 버전</code>에서 다시 <code>code $PROFILE</code>를 실행한 후 아래 명령어를 붙여넣으면  <code>탭으로 자동완성</code>을 할 수 있다.</p>
<pre><code class="language-bash"># $Profile 파일
&lt;다른 프로파일 설정들 ...&gt;
Set-PSReadLineKeyHandler -Chord &quot;Tab&quot; -Function ForwardWord</code></pre>
<p><img src="https://velog.velcdn.com/images/bear_with_me/post/61da669b-91ba-433f-ae15-c7c7affb5aa1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[윈도우 터미널을 꾸며보자(Oh My Posh)]]></title>
            <link>https://velog.io/@bear_with_me/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%84-%EA%BE%B8%EB%A9%B0%EB%B3%B4%EC%9E%90Oh-My-Posh</link>
            <guid>https://velog.io/@bear_with_me/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%84-%EA%BE%B8%EB%A9%B0%EB%B3%B4%EC%9E%90Oh-My-Posh</guid>
            <pubDate>Thu, 14 Mar 2024 04:33:42 GMT</pubDate>
            <description><![CDATA[<p><img src="blob:https://velog.io/5122bf89-7c29-46fe-b119-466f27bf2eda" alt="아름다운 위도우 파워쉘 터미널"></p>
<blockquote>
<p>개발의 재미를 더하는 윈도우 터미널 꾸미기</p>
</blockquote>
<hr>
<h2 id="터미널-폰트-설정">터미널 폰트 설정</h2>
<p><code>Oh My Posh</code>의 경우 아이콘을 많이 사용하기 때문에 많은 아이콘이 폰트에 포함되어있는 <strong><code>Nert Font</code>라는 개발자 친화적인 폰트</strong> 계열을 사용한다. 해당 폰트를 사용하지 않을 경우 <strong>아이콘이 깨지는 경우</strong>가 발생하기 때문에 꼭 설치해야한다.</p>
<p><img src="https://velog.velcdn.com/images/bear_with_me/post/26e7db13-a475-4206-8449-e073a6889d56/image.png" alt="Nerd Font 구조"></p>
<ol>
<li><p>폰트 <a href="https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/JetBrainsMono.zip"><strong>다운로드</strong></a></p>
<p> 위 다운로드 링크를 누르면 자동적으로  <code>JetBrainsMono Nerd Font</code>가 받아짐. 
 <a href="https://www.nerdfonts.com/"><strong>다른 폰트 둘러보기</strong></a></p>
</li>
<li><p>다운받은 폰트 파일 <strong>압축 풀기</strong></p>
</li>
<li><p>압출 해제된 폴더에서 <strong><code>JetBrainsMonoNerdFontMono-</code></strong> 로 시작하는 모든 폰트를 <strong>더블 클릭해서 설치</strong></p>
<blockquote>
<p>다른 폰트를 설치한 경우에도 일부 터미널은 <code>mono</code> 폰트만 허용하기 때문에 <strong>반드시</strong> <code>mono</code>라고 적혀있는 폰트를 설치해야함.</p>
</blockquote>
</li>
<li><p>파워쉘 폰트 바꾸기:</p>
<ol>
<li><code>윈도우 터미널</code> 열기</li>
<li>설정 단축키 누르기: <code>ctrl + ,</code></li>
<li>왼쪽 패널의 <code>Windows PowerShell</code> 선택</li>
<li><code>모양</code> 클릭</li>
<li>설치한 폰트(<code>JetBrainsMono Nerd Font Mono</code>) 선택</li>
</ol>
</li>
</ol>
<h2 id="oh-my-posh-설치">Oh My Posh 설치</h2>
<ol>
<li>파워쉘에서 다음 명령어 실행: </li>
</ol>
<pre><code class="language-bash">winget install JanDeDobbeleer.OhMyPosh -s winget</code></pre>
<h2 id="터미널-oh-my-posh-테마-설정">터미널 Oh My Posh 테마 설정</h2>
<ol>
<li>터미널 유저 정보 파일 열기:</li>
</ol>
<pre><code class="language-shell"># A. VS code를 사용하는 경우
code $PROFILE 
#----------------------------------
# B. VS code를 사용하지 않는 경우
echo $PROFILE # 나오는 경로의 파일을 텍스트 에디터로 열기
</code></pre>
<ol start="2">
<li>열려진 파일에 다음 <strong>명령어를 붙여넣은 후 저장</strong>: <pre><code class="language-shell"># 다른 테마를 원하는 경우 아래에서 atomic.omp.json을 원하는 테마로 변경하면 됨
oh-my-posh --init --shell pwsh --config &quot;$env:POSH_THEMES_PATH\atomic.omp.json&quot; | Invoke-Expression</code></pre>
</li>
</ol>
<blockquote>
<p><a href="https://ohmyposh.dev/docs/themes">다른 테마 둘러보기</a></p>
</blockquote>
<hr>
<h2 id="보너스">보너스</h2>
<h3 id="vs-code-터미널에-폰트-반영하기">VS code 터미널에 폰트 반영하기</h3>
<ol>
<li>VS code 실행</li>
<li>설정 페이지 단축키 누르기: <strong><code>ctrl + ,</code></strong> </li>
<li>오른 쪽 위의 <code>설정 열기</code> 버튼을 눌러서 <code>settings.json</code> 파일 열기</li>
<li><code>settings.json</code> 파일에 다음 값을 추가: <pre><code class="language-py">{
...
&quot;terminal.integrated.fontFamily&quot;: &quot;JetBrainsMono Nerd Font Mono&quot;,
&quot;terminal.integrated.fontSize&quot;: 14,
...
}</code></pre>
</li>
</ol>
<h3 id="pycharm-터미널에-적용하기">PyCharm 터미널에 적용하기</h3>
<ol>
<li>PyCharm 실행</li>
<li><code>File</code> &gt; <code>Settings</code> &gt; <code>Editor</code> &gt; <code>Font</code></li>
<li>Font: <code>JetBrainMono Nerd Font Mono</code> 선택</li>
<li><code>Enable ligatures</code> 선택</li>
</ol>
<p>+만약 <code>Conda</code>를 사용해서 <code>(base)</code> 과 같은 파이썬 환경 이름이 파워쉘(터미널)에 나타난다면 터미널에서 아래 명령어 실행</p>
<pre><code class="language-bash">conda config --set changeps1 False</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[DTO, POJO, 자바 빈(Java Bean) 이해하기]]></title>
            <link>https://velog.io/@bear_with_me/DTO-POJO-%EC%9E%90%EB%B0%94-%EB%B9%88Java-Bean-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bear_with_me/DTO-POJO-%EC%9E%90%EB%B0%94-%EB%B9%88Java-Bean-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 22 Nov 2022 08:26:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 문서는 Brian Vermeer의 <a href="https://dev.to/snyk/how-to-use-java-dtos-to-stay-secure-31gg">How to use Java DTOs to stay secure</a>를 번역한 문서입니다.</p>
</blockquote>
<h1 id="도입">도입</h1>
<p><img src="https://velog.velcdn.com/images/bear_with_me/post/1bf2372b-3a05-46e4-a8e9-2a2362bb5725/image.jpg" alt=""></p>
<p>자바에서 데이터 전송 객체(DTOs)는 하위 시스템들 사이에서 데이터를 운반하는 객체로, 데이터를 종합적으로 관리하기위한 엔터프라이즈 디자인 패턴이다. DTO를 사용하는 주요한 이유 중 하나는 하위 시스템 간의 호출 숫자를 줄여 서비스의 시스템 비용(overhead)을 감소시키기 위해서다. </p>
<p>이 글은 DTO가 어떻게 자바 어플리케이션에서 사용되고 DTO의 사용이 어떻게 데이터 유출을 방지하는지를 설명한다. </p>
<hr>
<h1 id="pojo-자바-빈-value-object란-뭘까">POJO, 자바 빈, Value Object란 뭘까?</h1>
<p>__</p>
<h2 id="pojo-plain-old-java-object">POJO (Plain Old Java Object)</h2>
<p>영문 이름에서 알수있듯, POJO(Plain Old Java Object = 그냥 평범한 자바 객체)는 우리와 친숙한 아주 일반적인 자바 객체이다. 아무 클래스나 POJO가 될 수 있으며 자바 언어가 제한하는 사항들 빼고는 특별한 제약이나 조건도 존재하지 않는다. POJO는 코드의 재사용과 가독성을 위해 만들어졌다.</p>
<pre><code class="language-java">public class CoffeePOJO {

   public String name;
   private List&lt;String&gt; ingredients;

   public CoffeePOJO(String name, List&lt;String&gt; ingredients) {
       this.name = name;
       this.ingredients = ingredients;
   }

   void addIngredient(String ingredient) {
       ingredients.add(ingredient);
   }
}</code></pre>
<p>__</p>
<h2 id="자바-빈java-bean">자바 빈(Java Bean)</h2>
<p><a href="https://www.oracle.com/java/technologies/javase/javabeans-spec.html">공식 자바 빈 문서</a>에 따르면 자바 빈은 아래의 조건을 모두 충족하는 POJO이다. </p>
<ol>
<li><strong>모든 객체 변수는 Private 제한자를 가지며 getter 와 setter 함수를 통해서 접근 가능하다.</strong></li>
<li>아무런 입력값을 받지 않는 생성자(constructor)가 존재하여야 한다.</li>
</ol>
<p><em>자세한 조건은 공식 문서를 참조</em></p>
<pre><code class="language-java">public class CoffeeBEAN implements Serializable {

   private String name;
   private List&lt;String&gt; ingredients;

   public CoffeeBEAN() {
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public List&lt;String&gt; getIngredients() {
       return ingredients;
   }

   public void setIngredients(List&lt;String&gt; ingredients) {
       this.ingredients = ingredients;
   }
}</code></pre>
<p>__</p>
<h2 id="값-객체value-object">값 객체(Value Object)</h2>
<p>값 객체는 간단한 데이터 개체(entity)를 나타내는 작은 객체(object)이다. DTO나 POJO와는 다르게 생소하게 들릴수도 있는데, 이는 현재(2022-11-22) 자바에서 값 객체를 제공하지 않기 때문이다(JDK 관리자들이 JEP 401에 추가하려는 움직임이 있긴하다). 결국 값 객체가 자바 언어에 존재하지 않기 때문에 POJO를 통하여 이 기능을 대신하여야한다. </p>
<hr>
<h1 id="dto-구현하기">DTO 구현하기</h1>
<p>__</p>
<p>DTO는 자바 빈과 같은 POJO의 형식으로 구현될 수 있다. 여기서 가장 중요한 것은 DTO가 프레젠테이션 층(presentation layer)과 도메인 모델과 같은 개체(entity)들을 분리시킨다는 것이다.</p>
<p>소규모  REST 서비스를 가지고 이해해보자. 커피와 손님이라는 객체를 가진 카페가 있다고 가정했을 때 이객체들(커피, 손님)은 시스템 속 서로 다른 도메인의 개체들이다. 만약에 우리가 한 손님의 최애 커피를 알고싶다고 할 때, 우리는 FavoriteCoffeeDTO에 나타나있는 종합적인 정보(손님 - 커피)를 제공하는 API를 만들 것이다. </p>
<p><img src="https://velog.velcdn.com/images/bear_with_me/post/98d7a9bf-f82c-4225-b156-81fab7de78ab/image.jpg" alt=""></p>
<p>위 구조를 표현한 코드는 아래와 같다.</p>
<pre><code class="language-java">public class Coffee {

   private Long id;
   private String name;
   private List&lt;String&gt; ingredients;
   private String preparation;

}

public class Customer {

   private Long id;
   private String firstName;
   private String lastName;
   private List&lt;Coffee&gt; coffees;

}

public class FavoriteCoffeeDTO {

   private String name;
   private List&lt;String&gt; coffees;

}</code></pre>
<p>위와 같이 도메인 층과 프레젠테이션 층은 분리되어 있어서 컨트롤러가 두 도메인 개체를 DTO에 맵핑 할 수 있다.</p>
<blockquote>
<p>*DTO는 자바 빈 외의 객체로도 구현 가능하다. *</p>
</blockquote>
<p>이 예시에서 변수들은 모두 Private임으로 변수 접근을 위해 getter와 setter를 생성하여야한다. 사용자들은 대다수의 경우 자바 빈 표준을 따라 DTO를 만드는데, 꼭 이 기준을 따라야 할 필요는 없다. 다른 선택지로는 아래와 같이 모든 변수를 Public으로 만든 다음 직접 접근하거나, 객체를 불변(immutable)하게 만들고 모든 변수를 입력값으로 받는 생성자와 몇개의 getter를 이용하는 것도 가능하다. </p>
<pre><code class="language-java">public class FavoriteCoffeeDTO {

   public String name;
   public List&lt;String&gt; coffees;

}

String name = favCoffeeDTO.name;</code></pre>
<p>마지막으로, 만약 자바를 비교적 최신 버전으로 업데이트 하였다면 자바 레코드(Java records)로 DTO를 만들 수 있다. 자바 레코드는 간단히 말하자면 자동적으로 모든 변수를 입력 값으로 받는 생성자와 접근 함수, toString() 함수와 hashCode()까지 제공하는 불변형 클래스이다. 이러한 특징 때문에 코드는 좀 더 짧아지고 가독성이 높아지는 효과가 있다. 자바 레코드는 자바 빈의 형태을 따르지 않는 것을 볼 수 있다. </p>
<pre><code class="language-java">public record FavoriteCoffeeDTO(String name, List&lt;String&gt; coffees) {}

String name = favoriteCoffeeDTO.name();</code></pre>
<hr>
]]></description>
        </item>
    </channel>
</rss>