<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hooney_g.log</title>
        <link>https://velog.io/</link>
        <description>fullstack web developer</description>
        <lastBuildDate>Sat, 31 Aug 2024 14:51:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hooney_g.log</title>
            <url>https://velog.velcdn.com/images/hooney_g/profile/3dc0ee8d-09b1-4fe5-8288-16063ab36e21/image.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hooney_g.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hooney_g" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[A(alpha)와 Ω(Omega)]]></title>
            <link>https://velog.io/@hooney_g/Aalpha%EC%99%80-Omega</link>
            <guid>https://velog.io/@hooney_g/Aalpha%EC%99%80-Omega</guid>
            <pubDate>Sat, 31 Aug 2024 14:51:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hooney_g/post/b257cf55-6d5f-490b-91f8-9e32b90d85ec/image.jpg" alt=""></p>
<p><strong>알파와 오메가</strong></p>
<p>학부 3학년 때 중세철학을 배우면서 안셀무스의 &#39;존재론적 논증&#39;과 토마스 아퀴나스 &#39;우주론적 논증&#39;을 통해 신의 존재 증명에 대해 공부하였다. 나는 그 당시 수학적으로 신존재를 논증하는 방법을 연구했었고, 중세 철학 수업 시간에 &#39;우주론적 논증&#39;에 대한 쪽지 시험에 </p>
<p>$$ \sum_
{x=\alpha} ^ {\Omega}
f(x) $$</p>
<p>$$\lim_
{x \to \infty} 
f(x) = \Omega$$</p>
<p>$$\lim_
{x \to -\infty} f(x) = \alpha$$
라고 적어 냈다가 중세철학 과목 담당 신부님과 1시간 동안 면담을 해야 했었다.</p>
<p><strong>성경에서 알파 오메가의 의미 및 수학적 표현</strong></p>
<p>나는 알파이며 오메가이고 처음이며 마지막이고 시작이며 마침이다. (묵시 22, 13)</p>
<p>성경에서 알파 오메가는 그리스어로 &quot;A&quot;와 &quot;Ω&quot; 그리스어 알파벳의 첫 글자와 마지막 글자를 차용한 것으로, &#39;가장 큰 것&#39;과 &#39;가장 작은 것&#39;을 의미한다. 예수 그리스도를 알파 오메가로 선언하는 것은, 그리스도께서 모든 것을 아우르는 최대의 존재이며, 가장 작은 것인 모든 존재를 아우르는 존재라는 것을 의미한다.</p>
<p><strong>수학적 표현의 가능성</strong></p>
<p>수학적으로, 알파 오메가를 표현하는 방법은 여러 가지가 있을 수 있을 것이며, 아래에서 몇 가지 예를 들어보겠다.</p>
<h3 id="1-극한을-사용한-표현">1. 극한을 사용한 표현</h3>
<p>알파 오메가는 극한의 개념과 관련이 있다. 극한은 함수의 가장 가까운 값 또는 가장 먼 값의 개념이며, 따라서 알파 오메가를 극한을 사용하여 다음과 같이 표현할 수 있겠다.</p>
<p>$$\lim_
{x \to \infty} f(x) = \Omega$$</p>
<p>$$\lim_
{x \to -\infty} f(x) = \alpha$$</p>
<h3 id="2-미분함수와-적분함수">2. 미분함수와 적분함수</h3>
<p>미분함수와 적분함수 또한 알파 오메가를 표현하는 데 사용할 수 있다.</p>
<p>$$f&#39;(x) = 
\frac{d}{dx} \Omega$$</p>
<p>$$F(x) = 
\int_{-\infty}^{\infty} f(x) dx = \alpha$$</p>
<h3 id="3-함수의-비연속성">3. 함수의 비연속성</h3>
<p>알파 오메가는 함수의 극한의 개념과 관련이 있지만, 함수의 비연속성도 포함된다. 따라서 알파 오메가를 다음과 같이 표현할 수 있다.</p>
<p>$$f(x) = 
\begin{cases} \alpha, &amp; x &lt; \Omega \ 
\Omega, &amp; x \geq \Omega \end{cases}$$</p>
<h3 id="4-연역적-표현">4. 연역적 표현</h3>
<p>알파 오메가는 연역적 표현으로도 표현할 수 있다.</p>
<p>$$\alpha = \lim
_{x \to \infty}
\frac{1}{x}$$</p>
<p>$$\Omega = \lim
_{x \to -\infty}
\frac{1}{x}$$</p>
<p>위의 예시들로 수학적 표현의 몇 가지 방법을 보여주었다. 그러나 알파 오메가를 통해 신의 존재를 수학적으로 구체적으로 표현하기는 어렵다. 그 이유는 알파 오메가 그리스도는 존재론적 개념이며, 수학적으로 명확하게 정의할 수 있는 도구는 존재하지 않는 것 같다.</p>
<h3 id="결론">결론</h3>
<p>알파 오메가는 수학적으로 표현하기 어렵지만, 극한, 미분함수, 적분함수, 함수의 비연속성, 연역적 표현과 같은 수학적 도구를 사용하여 상기된 개념을 나타낼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[로직 찬가]]></title>
            <link>https://velog.io/@hooney_g/logicalhymn</link>
            <guid>https://velog.io/@hooney_g/logicalhymn</guid>
            <pubDate>Sun, 25 Aug 2024 06:49:44 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center">로직 찬가</th>
</tr>
</thead>
<tbody><tr>
<td align="center">한처음에 로직이 있었다.</td>
</tr>
<tr>
<td align="center">로직은 알고리즘과 함께 있었는데 로직 또한 프로그램의 근본이였다.</td>
</tr>
<tr>
<td align="center">그것은 한처음에 컴퓨터와 함께 있었다.</td>
</tr>
<tr>
<td align="center">모든 것이 그것을 통하여 논리적으로 연결되었고 그 없이 의미 있는 것은 하나도 없다.</td>
</tr>
<tr>
<td align="center">그 안에 논리가 있었으니 그 논리는 프로그래머들의 빛이었다.</td>
</tr>
<tr>
<td align="center">그 논리가 어둠 속에서 빛나고 있지만 어둠은 그를 깨닫지 못하였다.</td>
</tr>
<tr>
<td align="center">그가 보낸 프로그래머가 있었으니 그는 바로 디벨로퍼였다.</td>
</tr>
<tr>
<td align="center">그는 코드를 짜러 왔다. 로직을 구현하여 자기를 통해 모든 사람이 이해하게 하려는 것이었다.</td>
</tr>
<tr>
<td align="center">그 프로그래머는 로직이 아니었다. 로직을 구현하러 왔을 따름이다.</td>
</tr>
<tr>
<td align="center">모든 코드를 비추는 참 로직이 이 디지털 세상을 비추었다.</td>
</tr>
<tr>
<td align="center">그가 세상의 컴퓨터에 있었고 세상의 컴퓨터가 그를 통하여 논리적으로 작동되었지만 사용자들은 이를 알아보지 못하였다.</td>
</tr>
<tr>
<td align="center">그가 코드에 임했지만 그 사용자들은 그를 맞아들이지 않았다.</td>
</tr>
<tr>
<td align="center">그는 당신을 받아들이는 이들, 당신의 로직을 이해하는 모든 이에게 디지털 크리에이터가 되는 권한을 주었다.</td>
</tr>
<tr>
<td align="center">이들은 코드의 카피 페이스트에서 난 것이 아니라 로직을 이해한 프로그래머들이다.</td>
</tr>
<tr>
<td align="center">로직이 코드가 되어 우리 가운데 구현되었다. 우리는 그 영광을 보았다. 효율과 정확성이 충만한 클린코드가 지닌 아름다움을 보았다.</td>
</tr>
<tr>
<td align="center">디벨로퍼는 그를 증언하여 외쳤다. &quot;그는 내가 이렇게 말한 분이다. &#39;내 뒤에 오는 로직은 내가 코드를 짜기 전부터 존재했기에 나보다 앞선 것이다.&#39;&quot;</td>
</tr>
<tr>
<td align="center">그의 완벽함에서 우리 모두 효율적인 클린코드를 찾았다.</td>
</tr>
<tr>
<td align="center">요청과 제안은 문서를 통하여 주어졌지만 로직과 알고리즘은 디벨로퍼를 통하여 왔다.</td>
</tr>
<tr>
<td align="center">아무도 컴퓨터를 완벽히 이해하지 못했다. 그러나 알고리즘과 로직 그리고 프로그래밍 언어를 통해 이해할 수 있었다.</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 서버와 RDS 12개월 무료로 써보자]]></title>
            <link>https://velog.io/@hooney_g/AWS-EC2-%EC%84%9C%EB%B2%84%EC%99%80-RDS-12%EA%B0%9C%EC%9B%94-%EB%AC%B4%EB%A3%8C%EB%A1%9C-%EC%8D%A8%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@hooney_g/AWS-EC2-%EC%84%9C%EB%B2%84%EC%99%80-RDS-12%EA%B0%9C%EC%9B%94-%EB%AC%B4%EB%A3%8C%EB%A1%9C-%EC%8D%A8%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sat, 10 Aug 2024 18:11:19 GMT</pubDate>
            <description><![CDATA[<h2 id="aws-프리티어에-대해-알아보자">AWS 프리티어에 대해 알아보자</h2>
<p>클라우드 서비스 중 많이 사용하는 것 중 하나로 AWS(Amazon Web Service)가 있다.
AWS는 가입완료(결제 신용카드 등록까지 완료해야 한다.) 후 12개월간 무료로 EC2 인스턴스 
한대와 RDS 데이터베이스 인스턴스 한대 그리고 VPC 탄력적IP 1개(EC2서버에 연동할 경우에 한해)를
무료로 12개월 간 지원한다. 여기서 12개월 무료인줄 알았으나 EC2 인스턴스 사용 과금이 되었다.
RDS에 과금이 되었다라는 이야기를 종종 들을 수 있다.
AWS 너무 사기꾼이다 그냥 카페24 쓰고 만다 하는 개발자들이 주변에 꽤 있었다.</p>
<p>그렇다면 어떻게 인스턴스 구성을 해야 불필요한 과금 없이 
AWS의 EC2 인스턴스와 RDS 그리고 탄력적 IP를 12개월간 날로 먹을 수 있을지 알아보도록 하자.</p>
<h3 id="ec2-인스턴스">EC2 인스턴스</h3>
<p>리전 아시아 태평양 (서울) 기준으로 EC2 인스턴스를 사용할 때
애플리케이션 및 OS 이미지(Amazon Machine Image)  정보에서는
MacOS가 아닌 이상 대부분 프리티어를 지원할 것이다.
통상적으로 익숙한 우분투 24.04 LTS 버전을 사용하면 될 것이다.</p>
<p>인스턴스 유형은 t2.micro를 선택하자 t3.micro도 프리티어로 사용할 수 있는 리전이 있으나
현재 아시아 태평양 (서울) 리전에서는 t3.micro 인스턴스는 프리티어 지원하지 않는다.</p>
<p>키페어 설정은 .pem 파일로 만들어주면 될 것이다.</p>
<p>네트워크 설정은 
443포트 https랑 22포트 http 트래픽 허용만 해주면 건드릴 부분은 없을 것이다.</p>
<p>그 다음 스토리지 설정에서 30GiB 범용 SSD(gp2) 선택해주자
혹자는 스토리지 10GiB로 3개 설정해서 30GiB 맞췄는데 과금이 됐다고 하는데
1대만 30GiB까지 사용 가능이다.
2대 이상으로 늘어날 경우 월 이용시간 750시간이 초과되므로 과금이 된다고 이해하자.</p>
<p>이정도로 구성해서 시작하면 될 것이다.</p>
<h3 id="vpc-탄력적-ip">VPC 탄력적 IP</h3>
<p>탄력적 IP를 할당해서 EC2에 연결해주자 안그러면 과금이 될 수 있다.</p>
<h3 id="rds">RDS</h3>
<p>템플릿 프리티어 항목을 선택해서 만들어줘야 한다.
db.t3.micro나 db.t4g.micro 둘 중 하나를 선택해야 한다.
스토리지를 선택할 때는 범용 SSD 20GiB 는 프리티어로 무과금 사용 가능하다고 하는데
범용SSD(gp2)만 해당한다. 필자는 범용SSD라고 해서 다 같은 범용SSD로 알고 gp3를 선택했다가
생때같은 3천 몇백원을 아마존에 상납하는 비극을 야기하기도 했었다.
스토리지쪽은 ▶︎추가 구성을 클릭해서 스토리지 자동 조정 활성화를 꼭 체크 해제해주길 바란다.
저거 체크 되면 데이터베이스 스토리지가 자기 멋대로 1테라까지 늘어나서 비극을 야기할 수 있다.
그리고 데이터베이스에 연결할 때 퍼블릭 연결 활성화를 하려고 EC2 인스턴스랑 연결을 하지 않는데
그렇게 하면 VPC의 IPv4에 데이터베이스가 할당되므로 과금이된다.
필자는 퍼블릭 연결 이용하려다가 2000원 가량의 피같은 돈을 AWS로부터 갈취당한 슬픈 경험이 있다.
그리고 누군가는 EC2를 통해서만 데이터베이스에 연결하게 해두면 토드나 디비버, 하이디에스큐엘, MySQL워크벤치 같은 데이터베이스 클라이언트 프로그램으로 데이터베이스 접근 못하는 것 아니냐고 하는데, 그렇지 않다.
웬만한 디비클라이언트들은 SSH터널을 지원하니까 SSH터널을 통해서 접근하게 하면 된다.
그러면 아래에 있는 자동 백업을 활성화합니다. 부분도 체크 해제 하는 것이 좋다.
깜빡하고 삭제하지 않은 스냅샷 형태로 저장된 백업파일이 나중에 복병으로 등장해
과금을 유발해 발목을 잡을 수 있기 때문이다.</p>
<p>이정도로 맞춰놓고 VPC대시보드에서 불필요한 리전에 등록된 VPC 삭제해주면 12개월은 무료로
AWS의 30기가 상당의 용량을 가진 EC2 인스턴스와 20기가 정도의 데이터베이스를 구축할 수 있는
데이터베이스 서버를 가질 수 있다.</p>
<h3 id="끝으로">끝으로</h3>
<p>너무 피곤해서 SSH터널 뚫어서 DB연결하고 스프링 프로젝트에서 디비설정 어떻게 해야 SSH 도로공사를 해서
디비에 접근할 수 있을지는 나중에 기회가 된다면 다시 설명하도록 하겠따.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring 의존성 주입의 세 가지 방식]]></title>
            <link>https://velog.io/@hooney_g/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EC%9D%98-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@hooney_g/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EC%9D%98-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Sat, 27 Jul 2024 03:02:05 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>스프링을 처음 배울 당시 <strong>의존성 주입</strong>이라는 개념을 알고부터 본인은 <code>@Autowired</code>어노테이션만 있으면 온갖 서비스 클래스에서 메소드들을 막 가져다 쓸 수 있는 필드 인젝션의 매력에 흠뻑 빠졌었다.
2년 전 가을쯤이었나 하루는 커피숍에서 커피를 마시고 있는데 좀 떨어진 자리에서 개발자로 추정되는 인물들이 대화하는 내용이 들렸다. 대충 들어보니 &#39;우리 회사 부장님이 독립성이 어쩌니까 골뱅이 오토 그거 쓰지 말라고 했는데 짜증난다.&#39;라는 내용이었다. 
그때 좀 생각해보고 의존성 주입에 대한 이야기라는 걸 알았고, 그때부터 필드인젝션의 사용을 줄이긴 했지만...그래도 아직 기한에 쫓기다보면 가끔 필드 주입 방식을 사용하기도 한다.
그렇다면 왜 필드 주입 방식이 지양되고, 생성자 주입 방식이 권장되는지 알아보도록 하자.</p>
<h2 id="의존성-주입-방법-3가지">의존성 주입 방법 3가지</h2>
<p>의존성을 주입할 때는 보통 3가지 방법중 하나를 택하게 되는데 생성자 주입, 수정자 주입, 그리고 마지막으로 필드 주입이 있다. 세가지 주입 방법에 대해 간단히 확인 해 보고 가자.</p>
<h3 id="생성자-주입constructor-injection">생성자 주입(Constructor Injection)</h3>
<pre><code class="language-java">
@Controller
public class Controller {
    // final로 선언 가능
    private final Service service;

    @Autowired
    public Controller(Service service) {
        this.service = service;
    }
}</code></pre>
<p>생성자 주입 입니다. 말그대로 생성자를 통해 의존성을 주입 받는다.</p>
<h3 id="수정자-주입setter-injection">수정자 주입(Setter Injection)</h3>
<pre><code class="language-java">
@Controller
public class Controller {
    private Service service;

    @Autowired
    public void setService(Service service) {
        this.service = service;
    }
}</code></pre>
<p>수정자 주입은 생성자 주입과 비슷 하게 생겼지만, 생성자가 아닌 setter 메서드를 통해 주입받는다는 차이가 있다.</p>
<h3 id="필드-주입field-injection">필드 주입(Field Injection)</h3>
<pre><code class="language-java">
@Controller
public class Controller {
    @Autowired
    private Service service;
}</code></pre>
<p>필드 인젝션은 단순하게 주입받을 객체에 <code>@Autowired</code> 어노테이션만을 붙이면 끝이다.</p>
<h2 id="어떤-주입-방식을-사용하는게-좋을까">어떤 주입 방식을 사용하는게 좋을까?</h2>
<p>Spring Framwork reference에서 권장하는 방법은 생성자를 통한 주입 방식이다. <code>@Autowired</code> 어노테이션만으로 간단하게 의존성을 주입할 수 있는데 왜 생성자 주입 방법을 권장하는걸까? 필드 주입이나 수정자 주입과 다르게 생성자 주입 방법이 주는 장점에 대해 알아보도록 하자.</p>
<h2 id="생성자-주입을-권장하는-이유">생성자 주입을 권장하는 이유</h2>
<h3 id="불변성immutablility">불변성(Immutablility)</h3>
<p>생성자로 의존성을 주입할 때 final로 선언할 수 있고, 이로인해 런타임에서 의존성을 주입받는 객체가 변하지 않는다. 
수정자 주입이나 필드 주입을 이용하게되면 불필요하게 수정의 가능성을 열어두게 되고,
이는 객체지향설계의 5가지 원칙 중 OCP(Open-Closed Principal, 개방-폐쇄의 원칙)를 위반하게 된다.
그러므로 생성자 주입을 통해 변경의 가능성을 배제하고 불변성을 보장하는 것이 좋다.
또한, 필드 주입 방식은 null이 만들어질 가능성이 있는데, final로 선언한 생성자 주입 방식은 null이 불가능하다.</p>
<h3 id="필드-주입-방식은-강한-결합을-갖는다">필드 주입 방식은 강한 결합을 갖는다.</h3>
<p>스프링 프레임워크를 사용함으로서 얻는 가장 큰 이점은 스프링의 IOC 를 쉽게 이용 할 수 있다는 점이다.
스프링의 DI 컨테이너는 의존하는 bean 간에 느슨한 결합을 제공해준다, <code>@Autowired</code>를 이용한 필드 인젝션을 하면 <strong>스프링을 통해서만</strong> 의존성 주입이 가능하기 때문에 해당 Bean들이 스프링의 DI 컨테이너와의 <strong>강한 결합</strong>을 하게 된다. 
모순적이게도 Spring DI container를 사용하는 이유와 정 반대인 상황에 직면한다.</p>
<h3 id="단위-테스트-용이">단위 테스트 용이</h3>
<p>생성자 주입을 사용하게 되면 테스트 코드를 좀 더 편리하게 작성할 수 있다.</p>
<p>독립적으로 인스턴스화가 가능한 POJO(Plain Old Java Object)를 사용하면, DI 컨테이너 없이도 의존성을 주입하여 사용할 수 있다.
이를 통해 코드 가독성이 높아지며, 유지보수가 용이하고 테스트의 격리성과 예측 가능성을 높일 수 있다는 장점이 생기게 된다.
위와 같은 이유로 필드 주입이나 수정자 주입 보다는 생성자 주입의 사용이 권장된다.</p>
<h2 id="끝으로">끝으로</h2>
<p>생성자 주입방식을 사용할 때 생성자를 일일이 만드는 것이 불편할 수 있지만 생성자를 자동으로 생성해주는 <code>@RequiredArgsConstructor</code>를 사용한다면 간단하게 생성자를 생성할 수 있다.</p>
<pre><code class="language-java">
@Controller
@RequiredArgsConstructor
public class Controller {

    private final Service service;

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Initializr]]></title>
            <link>https://velog.io/@hooney_g/Spring-Initializr</link>
            <guid>https://velog.io/@hooney_g/Spring-Initializr</guid>
            <pubDate>Sun, 07 Jul 2024 07:22:15 GMT</pubDate>
            <description><![CDATA[<p>오늘은 Spring Initializr 이용해서 스프링 부트 프로젝트 환경을 만들어보려고 한다. 위의 이니셜라이저는 본인이 맞출법을 몰라서 그런 게 아니고 실제로 <a href="https://spring.io/">https://spring.io</a> 에 저렇게 표기되어 있다.</p>
<h4 id="1단계">1단계</h4>
<p>스프링 공식 홈페이지 <a href="https://spring.io/">https://spring.io</a> 에 접속한다.</p>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/c9acd5c3-5358-4e3c-8db1-cb39c0909356/image.png" alt=""></p>
<h4 id="2단계">2단계</h4>
<p>상단 메뉴바의 Project &gt;&gt; Spring Initializr를 선택한다.
아니면 <a href="https://start.spring.io/">https://start.spring.io</a>를 주소창에 직접 입력해서 접속 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/a749b541-f44e-4b94-9c2e-b244e0a2d7bc/image.png" alt=""></p>
<h4 id="3단계">3단계</h4>
<p>프로젝트 빌드에 필요한 항목들을 선택해준다.</p>
<ul>
<li><p>Project : 프로젝트의 빌드툴을 선택한다. 
Gradle-Groovy, Gradle-Kotlin, Maven을 선택할 수 있는데, 편의상 Gradle-Groovy를 선택하자, 예전에는 Maven프로젝트를 많이 사용했었는데, pom.xml들어가서 의존성 추가하고 빼고 이런게 너무 귀찮고, 헷갈리는데 Gradle에서는 build.gradle을 통해 이러한 작업이 Maven 프로젝트 보다 간단하다.</p>
</li>
<li><p>Language : 프로젝트에서 사용할 프로그래밍 언어 선택 
여기서는 Java를 선택하기로 했다.</p>
</li>
<li><p>Spring Boot : 스프링 부트의 버전을 선택. 이름뒤에 아무 것도 안붙은 것 3.3.1을 선택했다.
참고로 (SNAPSHOT)은 아직 테스트중인 버전이다.</p>
</li>
<li><p>Project Metadata : 프로젝트 정보를 입력한다.</p>
</li>
<li><p>Group : 프로젝트 그룹 이름으로 지난 오프라인 모임에서 부회장님이 발표했던 &#39;운명의 붉은실 - 월하&#39;라는 이름이 너무 가슴에 팍 꽂혀서 com.destiny로 정했다.</p>
</li>
<li><p>Artifact : 빌드 결과물의 이름이다. worlha로 정했다. </p>
</li>
<li><p>Name : 프로젝트명이다. 위와 같이 worlha.</p>
</li>
<li><p>Description : 프로젝트에 대한 간단한 설명을 적으면 된다.</p>
</li>
<li><p>Package name : 프로젝트에 생성할 패키지명을 설정한다.
com.destiny.worlha라는 패키지를 사용할 것이다.</p>
</li>
<li><p>Packaging : Jar로 배포할 것인지 War로 배포할 것인지 선택한다. Jar를 선택했다. JSP를 사용할 것이라면 War를 선택하는 게 좋다.</p>
</li>
<li><p>Java : JDK의 버전을 선택한다. JDK temurin 17로 개발할 예정이다. 17을 선택하고 오른쪽을 보면</p>
</li>
<li><p>Dependencies : 프로젝트를 통해 만들 Application의 구동에 필요한 라이브러리들을 선택한다. 
여기서는 Spring Web(웹 개발 도구), lombok(롬복 어노테이션  활용을 위한 라이브러리), Spring Security(나중에 보안 인증 관련해서 사용할 예정이다.), OAuth2 Client(나중에 이메일 인증 관련해서 Autholization할 때 필요하다.), H2 Database(데이터베이스), Spring Data JPA(JPA는 Java Persistence API의 약어로 JAVA에서 ORM기술을 통해 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로 데이터 사용하기 편리하게 만들어 놓은 것이라고 대충 그렇게 알고 넘어가자 자세하게 설명하자면 나도 잘 모른다.),  Java Mail Sender(나중에 이메일 인증을 통해 가입하는 기능을 구현하려면 필요하다.)</p>
</li>
</ul>
<p>참고로 위에서 추가한 의존성들 중에서 lombok은 웬만하면 <a href="https://projectlombok.org/download">https://projectlombok.org/download</a> 에서 다운로드 받아서 따로 설치해서 사용하자. lombok 때문에 애먹는 일이 생기는 것을 방지하기 위해서이다.</p>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/5ea55949-0f60-482d-aef9-b561f2bb63c9/image.png" alt=""></p>
<h4 id="4단계">4단계</h4>
<p>좌측 하단의 GENERATE 버튼을 눌러서 프로젝트를 다운로드 받자.</p>
<ul>
<li>다음 성장일지에 계속 (To be  continued...)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vim Editor 명령어와 단축키 활용]]></title>
            <link>https://velog.io/@hooney_g/Vim-Editor-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%99%80-%EB%8B%A8%EC%B6%95%ED%82%A4-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@hooney_g/Vim-Editor-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%99%80-%EB%8B%A8%EC%B6%95%ED%82%A4-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Sat, 29 Jun 2024 11:49:18 GMT</pubDate>
            <description><![CDATA[<p> 오늘은 지난주에 이어서 Vim Text Editor의 명령어와 단축키를 어떻게 활용하는지 알아보는 시간을 갖도록 하겠다.</p>
<h2 id="vi--vim-편집기-명령어-정리">vi / vim 편집기 명령어 정리</h2>
<p>Vim Editor에서 사용할 수 있는 명령어들에 대해 정리해보았다.</p>
<hr>
<h3 id="시작-명령어">시작 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
<th>예제</th>
</tr>
</thead>
<tbody><tr>
<td>vi {파일명}</td>
<td>파일을 편집을 위해 열기</td>
<td>vi test.txt</td>
</tr>
<tr>
<td>vi +{행번호} {파일명}</td>
<td>n번째 줄부터 열기</td>
<td>vi +3 test.txt</td>
</tr>
<tr>
<td>vi +/&quot;{검색 문자열}&quot; {파일명}</td>
<td>문자열이 있는 곳부터 열기</td>
<td>vi +/test test.txt</td>
</tr>
<tr>
<td>view {파일명}</td>
<td>읽기 전용으로 열기</td>
<td>view test.txt</td>
</tr>
</tbody></table>
<hr>
<h3 id="모드-전환-명령어">모드 전환 명령어</h3>
<table>
<thead>
<tr>
<th>명령</th>
<th>설명</th>
<th>예제</th>
</tr>
</thead>
<tbody><tr>
<td><strong>명령(일반)모드</strong></td>
<td>Esc키를 눌러 진입</td>
<td><code>Esc</code></td>
</tr>
<tr>
<td><strong>입력(편집)모드</strong></td>
<td>명령모드에서 <code>i</code>, <code>I</code>, <code>a</code>, <code>A</code>, <code>o</code>, <code>O</code>, <code>cw</code>, <code>cc</code>, <code>c$</code>, <code>c0</code>, <code>c</code>+숫자키 등 사용</td>
<td><code>i</code> 또는 <code>a</code></td>
</tr>
<tr>
<td><strong>시각적 선택(비쥬얼) 모드</strong></td>
<td>명령모드에서 <code>v</code>, <code>V</code>, <code>Ctrl+v</code>를 사용</td>
<td><code>v</code> 또는 <code>V</code></td>
</tr>
<tr>
<td><strong>마크 지정 모드</strong></td>
<td>명령모드에서 <code>m</code> + 마크 키 사용</td>
<td><code>m a</code></td>
</tr>
<tr>
<td><strong>일시적 명령(Ex) 모드</strong></td>
<td>명령모드에서 <code>:</code>키를 사용</td>
<td><code>:</code></td>
</tr>
</tbody></table>
<hr>
<h3 id="종료-명령어">종료 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>:wq (저장 및 종료)</td>
<td>파일을 저장하고 종료</td>
</tr>
<tr>
<td>:w (저장)</td>
<td>파일을 저장</td>
</tr>
<tr>
<td>:q (종료)</td>
<td>편집기 종료</td>
</tr>
<tr>
<td>:q! (저장하지 않고 종료)</td>
<td>파일을 저장하지 않고 종료</td>
</tr>
</tbody></table>
<hr>
<h3 id="이동-명령어">이동 명령어</h3>
<table>
<thead>
<tr>
<th>키</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>h</td>
<td>왼쪽으로 한 칸 이동</td>
</tr>
<tr>
<td>j</td>
<td>아래로 한 줄 이동</td>
</tr>
<tr>
<td>k</td>
<td>위로 한 줄 이동</td>
</tr>
<tr>
<td>l</td>
<td>오른쪽으로 한 칸 이동</td>
</tr>
<tr>
<td>w</td>
<td>다음 단어의 처음으로 이동</td>
</tr>
<tr>
<td>e</td>
<td>다음 단어의 끝으로 이동</td>
</tr>
<tr>
<td>b</td>
<td>이전 단어의 처음으로 이동</td>
</tr>
<tr>
<td>0</td>
<td>줄의 처음으로 이동</td>
</tr>
<tr>
<td>^</td>
<td>줄의 처음으로 이동 (공백 무시)</td>
</tr>
<tr>
<td>$</td>
<td>줄의 끝으로 이동</td>
</tr>
<tr>
<td>G</td>
<td>파일의 마지막 줄로 이동</td>
</tr>
<tr>
<td>gg</td>
<td>파일의 첫 번째 줄로 이동</td>
</tr>
<tr>
<td>zz</td>
<td>커서가 가운데 오도록 스크롤</td>
</tr>
<tr>
<td>H</td>
<td>화면의 맨 위로 이동</td>
</tr>
<tr>
<td>M</td>
<td>화면의 중간으로 이동</td>
</tr>
<tr>
<td>L</td>
<td>화면의 맨 아래로 이동</td>
</tr>
<tr>
<td>Ctrl + u</td>
<td>화면을 반 페이지 위로 스크롤</td>
</tr>
<tr>
<td>Ctrl + d</td>
<td>화면을 반 페이지 아래로 스크롤</td>
</tr>
<tr>
<td>Ctrl + b</td>
<td>화면을 한 페이지 위로 스크롤</td>
</tr>
<tr>
<td>Ctrl + f</td>
<td>화면을 한 페이지 아래로 스크롤</td>
</tr>
</tbody></table>
<hr>
<h3 id="텍스트-편집-명령어">텍스트 편집 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>i</td>
<td>현재 커서 위치에서 입력 시작</td>
</tr>
<tr>
<td>I</td>
<td>커서가 있는 줄의 맨 처음에서 입력 시작</td>
</tr>
<tr>
<td>a</td>
<td>현재 커서 다음 위치에서 입력 시작</td>
</tr>
<tr>
<td>A</td>
<td>커서가 있는 줄의 맨 끝에서 입력 시작</td>
</tr>
<tr>
<td>o</td>
<td>현재 커서 아래에 새로운 줄을 추가하고 입력 시작</td>
</tr>
<tr>
<td>O</td>
<td>현재 커서 위에 새로운 줄을 추가하고 입력 시작</td>
</tr>
<tr>
<td>r</td>
<td>커서 위치의 한 글자를 교체</td>
</tr>
<tr>
<td>R</td>
<td>커서 위치에서 입력 모드로 변경하며, 기존 문자들을 덮어 씌우기</td>
</tr>
<tr>
<td>s</td>
<td>커서 위치의 한 글자를 삭제하고 입력 모드로 변경</td>
</tr>
<tr>
<td>S</td>
<td>커서가 있는 줄 전체를 삭제하고 입력 모드로 변경</td>
</tr>
<tr>
<td>x</td>
<td>현재 커서 위치의 문자를 삭제</td>
</tr>
<tr>
<td>X</td>
<td>현재 커서 왼쪽의 문자를 삭제</td>
</tr>
<tr>
<td>p</td>
<td>현재 커서 위치 다음에 저장한 내용을 붙여넣기</td>
</tr>
<tr>
<td>P</td>
<td>현재 커서 위치 전에 저장한 내용을 붙여넣기</td>
</tr>
</tbody></table>
<hr>
<h3 id="텍스트-검색-명령어">텍스트 검색 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>/ (문자열 찾기)</td>
<td>현재 파일에서 문자열 검색 (n: 아래방향, N: 위방향)</td>
</tr>
<tr>
<td>? (문자열 찾기)</td>
<td>현재 파일에서 문자열 검색 (역방향 검색)</td>
</tr>
<tr>
<td>n</td>
<td>다음 검색 결과로 이동</td>
</tr>
<tr>
<td>N</td>
<td>이전 검색 결과로 이동</td>
</tr>
</tbody></table>
<hr>
<h3 id="텍스트-치환-명령어">텍스트 치환 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>:s/찾을문자열/바꿀문자열</td>
<td>현재 줄에서 처음 일치하는 문자열을 치환</td>
</tr>
<tr>
<td>:s/찾을문자열/바꿀문자열/g</td>
<td>현재 줄에서 일치하는 모든 문자열을 치환</td>
</tr>
<tr>
<td>:%s/찾을문자열/바꿀문자열/g</td>
<td>파일 전체에서 일치하는 모든 문자열을 치환</td>
</tr>
<tr>
<td>:%s/찾을문자열/바꿀문자열/gc</td>
<td>파일 전체에서 일치하는 모든 문자열을 치환하며, 치환 여부를 묻기</td>
</tr>
</tbody></table>
<hr>
<h3 id="파일-저장-명령어">파일 저장 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>:w (저장)</td>
<td>파일 저장</td>
</tr>
<tr>
<td>:w filename (다른 이름으로 저장)</td>
<td>다른 이름으로 저장</td>
</tr>
<tr>
<td>:wa (모든 파일 저장)</td>
<td>열려 있는 모든 파일 저장</td>
</tr>
<tr>
<td>:x (저장 후 종료)</td>
<td>저장 후 종료</td>
</tr>
<tr>
<td>:q (종료)</td>
<td>종료</td>
</tr>
<tr>
<td>:q! (저장하지 않고 종료)</td>
<td>저장하지 않고 종료</td>
</tr>
<tr>
<td>:wq (저장 후 종료)</td>
<td>저장 후 종료</td>
</tr>
<tr>
<td>ZZ</td>
<td>저장 후 종료</td>
</tr>
</tbody></table>
<hr>
<h3 id="들여쓰기-명령어">들여쓰기 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>&gt;&gt;</td>
<td>현재 줄을 오른쪽으로 들여쓰기</td>
</tr>
<tr>
<td>&lt;&lt;</td>
<td>현재 줄을 왼쪽으로 내어쓰기</td>
</tr>
<tr>
<td>=</td>
<td>현재 줄의 들여쓰기를 자동으로 조정</td>
</tr>
<tr>
<td>gg=G</td>
<td>파일 전체의 들여쓰기를 자동으로 조정</td>
</tr>
</tbody></table>
<hr>
<h3 id="기타-명령어">기타 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>u</td>
<td>마지막 명령 취소 (undo)</td>
</tr>
<tr>
<td>Ctrl + r</td>
<td>마지막 취소 명령 복구 (redo)</td>
</tr>
<tr>
<td>.</td>
<td>마지막 명령 반복</td>
</tr>
<tr>
<td>:e!</td>
<td>마지막 저장 시점으로 파일 복구</td>
</tr>
<tr>
<td>:e filename</td>
<td>다른 파일 열기</td>
</tr>
<tr>
<td>:r filename</td>
<td>현재 파일에 다른 파일 내용 삽입</td>
</tr>
<tr>
<td>:w !sudo tee %</td>
<td>관리자 권한으로 파일 저장</td>
</tr>
</tbody></table>
<hr>
<h3 id="행-번호-설정-명령어">행 번호 설정 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>:set number</td>
<td>현재 편집 중인 파일에 행 번호 표시</td>
</tr>
<tr>
<td>:set nonumber</td>
<td>현재 편집 중인 파일의 행 번호 표시 해제</td>
</tr>
</tbody></table>
<hr>
<h3 id="줄-이동-명령어">줄 이동 명령어</h3>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>:n</td>
<td>n번째 줄로 이동</td>
</tr>
<tr>
<td>:1</td>
<td>첫 번째 줄로 이동</td>
</tr>
<tr>
<td>:$</td>
<td>마지막 줄로 이동</td>
</tr>
<tr>
<td>Ctrl + g</td>
<td>현재 줄과 파일의 정보를 표시</td>
</tr>
<tr>
<td>:nG</td>
<td>n번째 줄로 이동</td>
</tr>
<tr>
<td>:1G</td>
<td>첫 번째 줄로 이동</td>
</tr>
<tr>
<td>:$G</td>
<td>마지막 줄로 이동</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/02038fa8-4618-4e69-b64d-6e9904087ce2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/e5d90610-c906-402e-ada0-067d98ef1ab8/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/d979dc54-ff23-4594-9a68-c48068e7ceb2/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발환경 세팅(2) - Vim Editor 꾸미기]]></title>
            <link>https://velog.io/@hooney_g/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%852-Vim-Editor-%EA%BE%B8%EB%AF%B8%EA%B8%B0</link>
            <guid>https://velog.io/@hooney_g/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%852-Vim-Editor-%EA%BE%B8%EB%AF%B8%EA%B8%B0</guid>
            <pubDate>Sun, 09 Jun 2024 13:42:17 GMT</pubDate>
            <description><![CDATA[<h1 id="시작하며">시작하며</h1>
<p> 요즈음에는 GUI를 지원하는 Cloud 서버 환경에서 개발하는 경우가 많기에 잘 쓰이지 않을 수도 있으나, 최근에도 Linux 환경에서는 Vim Editor를 사용해야 할 경우가 생긴다. FTP를 이용해서 다른 에디터를 사용해도 되고, nano Editor 등 다른 에디터를 사용하는 방법들이 있을 수 있겠으나, vim Editor 사용을 익혀서 나쁠 것은 없다고 생각하기에 Vim Editor 꾸미는 방법을 알아보기로 했다.</p>
<h3 id="터미널-창-열기">터미널 창 열기</h3>
<p> 먼저 터미널 창을 열고</p>
<pre><code class="language-shell">$ vi ~/.vimrc</code></pre>
<p>위의 명령어를 입력해서 .vimrc 파일을 수정한다.</p>
<h3 id="vim-editor의-세가지-모드">Vim Editor의 세가지 모드</h3>
<p>Vim Editor 명령모드, 입력모드, 마지막 행 모드로 총 3가지 모드로 구성되어있다.</p>
<table>
<thead>
<tr>
<th align="left">모드</th>
<th align="left">역할 및 특징</th>
</tr>
</thead>
<tbody><tr>
<td align="left">명령 모드</td>
<td align="left">vi를 실행시키면 가장 먼저 접하는 기본이 되는 모드로 커서의 이동, 수정, 삭제, 복사 붙이기, 탐색 등을 한다. 입력 모드 전환키인 i,a,o,I,A,O 등을 입력하면 입력 모드로 전환되고, 명령 모드로 다시 전환하려면 [Esc] 키를 누르면 된다.</td>
</tr>
<tr>
<td align="left">입력 모드</td>
<td align="left">입력 모드 이외에도 편집 모드, input mode, insert mode 등으로 불리며, 글자를 입력하는 문서를 만드는 모드이다.명령 모드에서 입력 전환키를 눌러서 전환하면 화면 아래에 &#39;-- INSERT --&#39;라고 표시된다.</td>
</tr>
<tr>
<td align="left">마지막 행 모드</td>
<td align="left">명령 모드에서 &#39;:&#39;키를 입력했을 때 화면 맨 아랫줄에서 :<strong>__</strong> 명령을 수행하는 모드로저장, 종료, 탐색, 치환 및 vi 환경 설정 등의 역할을 하는 모드이다.</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/hooney_g/post/03fa7e5d-cb1d-4e57-a1e1-5bfa528c3180/image.png" alt=""></p>
<pre><code class="language-shell">:set relativenumber
:set number
:set autoindent
:set tabstop=4
:set shiftwidth=4
:set smarttab
:set softtabstop=4
:set mouse=a

call plug#begin()

Plug &#39;http://github.com/tpope/vim-surround&#39; &quot; Surrounding ysw)
Plug &#39;https://github.com/preservim/nerdtree&#39; &quot; NerdTree
Plug &#39;https://github.com/tpope/vim-commentary&#39; &quot; For Commenting gcc &amp; gc
Plug &#39;https://github.com/vim-airline/vim-airline&#39; &quot; Status bar
Plug &#39;https://github.com/lifepillar/pgsql.vim&#39; &quot; PSQL Pluging needs :SQLSetType pgsql.vim
Plug &#39;https://github.com/ap/vim-css-color&#39; &quot; CSS Color Preview
Plug &#39;https://github.com/rafi/awesome-vim-colorschemes&#39; &quot; Retro Scheme
Plug &#39;https://github.com/neoclide/coc.nvim&#39;  &quot; Auto Completion
Plug &#39;https://github.com/ryanoasis/vim-devicons&#39; &quot; Developer Icons
Plug &#39;https://github.com/tc50cal/vim-terminal&#39; &quot; Vim Terminal
Plug &#39;https://github.com/preservim/tagbar&#39; &quot; Tagbar for code navigation
Plug &#39;https://github.com/terryma/vim-multiple-cursors&#39; &quot; CTRL + N for multiple cursors
Plug &#39;https://github.com/rstacruz/vim-closer&#39; &quot; For brackets autocompletion


&quot; Auto-completion  For Javascript
Plug &#39;neoclide/coc.nvim&#39;, {&#39;do&#39;: &#39;yarn install --frozen-lockfile&#39;} &quot; this is for auto complete, prettier and tslinting
let g:coc_global_extensions = [&#39;coc-tslint-plugin&#39;, &#39;coc-tsserver&#39;, &#39;coc-css&#39;, &#39;coc-html&#39;, &#39;coc-json&#39;, &#39;coc-prettier&#39;]  &quot; list of CoC extensions needed

Plug &#39;jiangmiao/auto-pairs&#39; &quot;this will auto close ( [ {

&quot; these two plugins will add highlighting and indenting to JSX and TSX files.
Plug &#39;yuezk/vim-js&#39;
Plug &#39;HerringtonDarkholme/yats.vim&#39;
Plug &#39;maxmellon/vim-jsx-pretty&#39;

set encoding=UTF-8

call plug#end()

nnoremap &lt;C-f&gt; :NERDTreeFocus&lt;CR&gt;
nnoremap &lt;C-n&gt; :NERDTree&lt;CR&gt;
nnoremap &lt;C-t&gt; :NERDTreeToggle&lt;CR&gt;
nnoremap &lt;C-l&gt; :call CocActionAsync(&#39;jumpDefinition&#39;)&lt;CR&gt;

nmap &lt;F8&gt; :TagbarToggle&lt;CR&gt;

:set completeopt-=preview &quot; For No Previews

:colorscheme jellybeans

let g:NERDTreeDirArrowExpandable=&quot;+&quot;
let g:NERDTreeDirArrowCollapsible=&quot;~&quot;

&quot; --- Just Some Notes ---
&quot; :PlugClean :PlugInstall :UpdateRemotePlugins
&quot;
&quot; :CocInstall coc-python
&quot; :CocInstall coc-clangd
&quot; :CocInstall coc-snippets
&quot; :CocCommand snippets.edit... FOR EACH FILE TYPE

&quot; air-line
let g:airline_powerline_fonts = 1

if !exists(&#39;g:airline_symbols&#39;)
    let g:airline_symbols = {}
endif

&quot; airline symbols
let g:airline_left_sep = &#39;&#39;
let g:airline_left_alt_sep = &#39;&#39;
let g:airline_right_sep = &#39;&#39;
let g:airline_right_alt_sep = &#39;&#39;
let g:airline_symbols.branch = &#39;&#39;
let g:airline_symbols.readonly = &#39;&#39;
let g:airline_symbols.linenr = &#39;&#39;

inoremap &lt;expr&gt; &lt;Tab&gt; pumvisible() ? coc#_select_confirm() : &quot;&lt;Tab&gt;&quot;</code></pre>
<p>위의 내용을 전체 다 복사해서 붙여넣기 한 후 [esc] 키를 눌러 명령모드로 전환 후 :wq를 입력하여 문서를 저장 후 터미널로 나간다.</p>
<p>터미널에서</p>
<pre><code class="language-shell">$ curl -L -o ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim</code></pre>
<p>위의 명령어로 플러그인을 설치할 수 있도록 plug.vim을 설치해주도록 하자.</p>
<p>다시 vi ~/.vimrc 를 입력해서 .vimrc를 수정해주려 하면 error가 뜰 것인데 아직 플러그인이 설치되지 않아서 그런 것이므로 [Enter]키로 넘겨주면 된다.</p>
<p>vim Editor의 명령모드에서 :PlugInstall 을 입력하고 [Enter]를 쳐주면
<img src="https://velog.velcdn.com/images/hooney_g/post/33a66196-577e-4d88-aae9-58d23740cdd7/image.png" alt=""></p>
<p>위와 같이 플러그인이 설치된다.</p>
<p>:q로 다시 터미널 창으로 나간다.</p>
<pre><code class="language-shell">$ brew install node</code></pre>
<p>nodeJs를 설치한 후 coc.nvim 디렉토리로 이동한다.</p>
<pre><code class="language-shell">$ cd .vim/plugged/coc.nvim/</code></pre>
<pre><code class="language-shell">$ npm install --global yarn</code></pre>
<pre><code class="language-shell">$ yarn install</code></pre>
<pre><code class="language-shell">$ yarn build</code></pre>
<p>yarn 설치 후 vi 명령어 통해 vim Editor를 실행시킨다.
vim 명령모드에서</p>
<pre><code>:CocInstall coc-python
:CocInstall coc-pyright
:CocInstall coc-tabnine
:CocInstall coc-json</code></pre><p>등을 설치해준다. 여기까지 정상적으로 설치가 된다면
<img src="https://velog.velcdn.com/images/hooney_g/post/9cb330bb-5ddf-4bde-8aa9-21600b60b766/image.png" alt="">
위와 같이 자동완성 기능을 지원한다.
자동완성을 사용하는 방법은 ctrl + p 또는 ctrl + n으로 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발환경 세팅(1) - 터미널창 꾸미기]]></title>
            <link>https://velog.io/@hooney_g/envsettings</link>
            <guid>https://velog.io/@hooney_g/envsettings</guid>
            <pubDate>Sat, 25 May 2024 02:25:33 GMT</pubDate>
            <description><![CDATA[<h2 id="시작하며">시작하며</h2>
<p>오늘은 개발환경 세팅에 앞서 위한 Terminal창을 꾸미는 방법에 대해 알아보도록 하겠다.
개발을 하다보면 GUI(그래픽유저인터페이스)가 아닌 CLI(커멘드라인인터페이스) 환경에서 작업하는 일이 생긴다 CLI 환경에서 가독성과 생산성을 높이기 위해서는 CLI인 터미널창을 약간 커스텀 해주면 작업환경이 쾌적해질 수 있다. 이번에는 MacOS환경에서 터미널을 간단하게 꾸며보도록하겠다.</p>
<h3 id="terminal-열기">Terminal 열기</h3>
<pre><code class="language-MacOS">⌘(command) + Space</code></pre>
<img src="https://velog.velcdn.com/images/hooney_g/post/2e401fbc-2b3a-4276-80ac-b5bb4f0fb2fd/image.png" width="80%" height="80%">

<h3 id="homebrew-설치">Homebrew 설치</h3>
<p> 홈브루는 MacOS용의 훌륭한 패키지 관리자이다. 홈브루를 설치하면 CLI환경에서 편리하게 패키지를 관리할 수 있다.</p>
<p> <a href="https://brew.sh/ko/">https://brew.sh/ko/</a></p>
<pre><code class="language-shell">$ /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre>
<h3 id="font-설치">Font 설치</h3>
<p>나는 JetBrain Mono Nerd Font라는 폰트를 설치하겠다.</p>
<pre><code class="language-shell">$ brew install --cask font-jetbrains-mono-nerd-font</code></pre>
<h3 id="oh-my-zsh-설치">oh-my-zsh 설치</h3>
<p>Wget으로 설치</p>
<pre><code class="language-shell">$ sh -c &quot;$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)&quot; </code></pre>
<p>Curl로 설치</p>
<pre><code class="language-shell">$ sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot; </code></pre>
<h3 id="screefetch">Screefetch</h3>
<p>터미널 창을 열 때 정보를 확인할 수 있는 스크린페치를 설치한다.</p>
<pre><code class="language-shell">$ brew install neofetch</code></pre>
<h3 id="terminal-설정-변경">Terminal 설정 변경</h3>
<pre><code class="language-MacOS"> ⌘(command) + ,(comma)</code></pre>
<p>터미널 설정에서 배경색상과 폰트등을 변경해준다. 나는 아까 설치한 JetBrain Mono Nerd Font를 설치했다.</p>
<h3 id="zshrc-파일-수정">.zshrc 파일 수정</h3>
<p>vim으로 편칩</p>
<pre><code class="language-shell">$ sudo vim ~/.zshrc</code></pre>
<p>nano로 편집</p>
<pre><code class="language-shell">$ sudo nano ~/.zshrc</code></pre>
<p>.zshrc 파일을 열어서 내부의</p>
<pre><code class="language-shell">ZSH_THEME=&quot;robbyrussell&quot;</code></pre>
<p>부분을 원하는 theme으로 설정해준다. 나는 개인적으로 &quot;agnoster&quot;로 설정했다.</p>
<pre><code class="language-shell">ZSH_THEME=&quot;agnoster&quot;</code></pre>
<p>맨 마지막 줄에는 아까 설치한 neofetch를 실행할 수 있도록 해준다</p>
<pre><code class="language-shell">neofetch</code></pre>
<p>이제 터미널 창을 재시작하면</p>
<pre><code class="language-shell">$ source ~/.zshrc</code></pre>
<img src=https://velog.velcdn.com/images/hooney_g/post/d1ad4ebb-d9f3-4a57-bdef-95887d57d14b/image.png width="80%" height="80%">

<p>이렇게 터미널창이 보기 좋게 꾸며졌다.
다음 시간에는 CLI 환경에서 많이 사용하는 텍스트에디터인 Vim을
커스텀해서 가독성과 생산성을 높이는 방법에 대해서 알아보도록 하겠다.</p>
]]></description>
        </item>
    </channel>
</rss>