<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>m.moon_c</title>
        <link>https://velog.io/</link>
        <description>밝고 빛나게</description>
        <lastBuildDate>Tue, 21 May 2024 06:17:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>m.moon_c</title>
            <url>https://velog.velcdn.com/images/m_moon_c/profile/2a58c4bc-1cd1-4dce-96e9-d8c8e40868c2/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. m.moon_c. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/m_moon_c" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Vue]컴포넌트와 뷰의 차이]]></title>
            <link>https://velog.io/@m_moon_c/Vue%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%99%80-%EB%B7%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@m_moon_c/Vue%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%99%80-%EB%B7%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Tue, 21 May 2024 06:17:07 GMT</pubDate>
            <description><![CDATA[<p>프론트 영역을 개발할 때,
Vue.js 프레임워크를 이용하였습니다.
여기서 Component, View 2개 폴더가 있었고, 해당 영역의 차이를 작성해놓고 싶었습니다.</p>
<ul>
<li><p>컴포넌트</p>
<ul>
<li>피그마 작업을 할 때, 원자성 형태로 요소들을 만들게 된다면, 재사용하기 편리하다고 했습니다.</li>
<li>여기서 컴포넌트는 Vue.js에서 재사용 가능한 코드 블록을 나타냅니다.</li>
<li>Vue.js 앱은 작은 컴포넌트들의 조합으로 구성됩니다.</li>
<li>각 컴포넌트는 자체 스코프를 가지며, 데이터, 메소드, 라이프사이클 훅 등을 정의할 수 있습니다.</li>
<li>컴포넌트는 재사용성과 유지보수성을 높이는데 중요한 역할을 하게됩니다.</li>
</ul>
</li>
</ul>
<p>뷰 영역을 가기전, 자체 스코프, 데이터, 메소드 라이플사이트 훅 등을 이야기하고 넘어가겠습니다.</p>
<ul>
<li><p>자체 스코프(Component Scope)</p>
<ul>
<li>이는 컴포넌트 내에서 정의된 변수, 함수, 메소드 등은 해당 컴포넌트 내에서만 유효하다는 말입니다.</li>
<li>컴포넌트 간의 간섭을 최소화하는 데 도움이 됩니다.</li>
</ul>
</li>
<li><p>데이터(Data)</p>
<ul>
<li>컴포넌트 내에서 사용되는 정보를 나타냅니다.</li>
<li><code>data</code>속성을 사용하여 Vue 인스턴스 내부에 데이터를 정의할 수 있습니다.</li>
<li>데이터는 Vue의 반응성 시스템에 의해 관리되며, 데이터가 변경될 떄 마다 화면이 자동으로 업데이트 됩니다.</li>
</ul>
</li>
<li><p>메소드(Methods)</p>
<ul>
<li>Vue 컴포넌트 내에서 사용되는 함수를 나타냅니다.</li>
<li>메소드를 사용하여 사용자 이벤트에 응답하거나 데이터를 조작하는 등의 작업을 수행할 수 있습니다.</li>
</ul>
</li>
<li><p>라이프사이클(Lifecycle)</p>
<ul>
<li>Vue 컴포넌트가 생성되고 소멸될 때 발생하는 일련의 이벤트를 나타냅니다.</li>
<li>Vue 컴포넌트의 라이프사이클 이벤트는 생성, 갱신, 소멸 등의 단계로 구분됩니다.</li>
<li>각 단계에서는 미리 정의된 훅(hook)함수를 사용하여 특정 작업을 수행할 수 있습니다.<pre><code>export default {
created() {
  console.log(&#39;컴포넌트가 생성되었습니다.&#39;);
},
updated() {
  console.log(&#39;컴포넌트가 갱신되었습니다.&#39;);
},
destroyed() {
  console.log(&#39;컴포넌트가 소멸되었습니다.&#39;);
}
}</code></pre></li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>뷰(View)</p>
<ul>
<li>뷰는 사용자에게 보여지는 화면을 나타냅니다.</li>
<li>Vue.js에서는 뷰를 효과적으로 관리하기 위해 컴포넌트를 사용합니다.</li>
<li>뷰는 사용자와 상호작용하며, 사용자 인터페이스를 나타내는 역할을 합니다.</li>
</ul>
</li>
<li><p>정리</p>
<ul>
<li>컴포넌트는 뷰를 구성하는 작은 단위이며, 뷰는 이러한 컴포넌트들이 조합되어 사용자에게 보여지는 전체적인 화면입니다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[H2 DB연결과정에서 생긴 오류]]></title>
            <link>https://velog.io/@m_moon_c/springboot-%EC%98%A4%EB%A5%98%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@m_moon_c/springboot-%EC%98%A4%EB%A5%98%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Mon, 29 Apr 2024 08:52:02 GMT</pubDate>
            <description><![CDATA[<h3 id="h2-db연결과정에서-생긴-오류">H2 DB연결과정에서 생긴 오류</h3>
<ul>
<li><p>Database &quot;C:/Users/SSAFY/jpashop&quot; not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224] </p>
</li>
<li><p>이렇게 jpashop이 없다고 할 때, 아래처럼 생성을 해주고, 접속해야했습니다.
<img src="https://velog.velcdn.com/images/m_moon_c/post/bc0703b8-30a9-492a-b543-cb2083692a66/image.png" alt=""></p>
</li>
<li><p>java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@1a1c21b4 testClass = jpabook.jpashop.MemberRepositoryTest, locations = [], classes = [jpabook.jpash 블라블라</p>
</li>
<li><p>위 오류는, application.yml 에서, datasource에 MVCC=TRUE로 해주어서 생긴 에러였습니다. 해당 영역을 삭제하고 진행하니 문제해결 , 그리고 스프링 3. 버전이기에, H2버전도 2.2버전으로 사용했습니다.</p>
<pre><code>spring:
datasource:
  url:  jdbc:h2:tcp://localhost/~/jpashop
  username: sa
  password:
  driver-class-name: org.h2.Driver</code></pre></li>
<li><p>Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended</p>
</li>
<li><p>단순 경고라고 하여, 무시</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Jenkins 빌드 상황 메타모스트로 받아보기]]></title>
            <link>https://velog.io/@m_moon_c/Jenkins-%EB%B9%8C%EB%93%9C-%EC%83%81%ED%99%A9-%EB%A9%94%ED%83%80%EB%AA%A8%EC%8A%A4%ED%8A%B8%EB%A1%9C-%EB%B0%9B%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@m_moon_c/Jenkins-%EB%B9%8C%EB%93%9C-%EC%83%81%ED%99%A9-%EB%A9%94%ED%83%80%EB%AA%A8%EC%8A%A4%ED%8A%B8%EB%A1%9C-%EB%B0%9B%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 26 Apr 2024 05:36:49 GMT</pubDate>
            <description><![CDATA[<p>개발자들의 소스코드가 서버에 잘 올라갔는지 무엇이 문제인지 파악하기 위해서 젠킨스의 빌드 상황을 공유하고자 만들게 되었습니다.</p>
<ul>
<li><p>메타모스트 설정</p>
<ul>
<li><p>통합 접속
<img src="https://velog.velcdn.com/images/m_moon_c/post/963ea105-0048-4513-a29e-5b95a4aad738/image.png" alt=""></p>
</li>
<li><p>Incoming Webhook
<img src="https://velog.velcdn.com/images/m_moon_c/post/113bbec8-8389-415c-873a-68521abe3d30/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- Webhook 추가하기
![](https://velog.velcdn.com/images/m_moon_c/post/3d4c35bf-3552-41a3-a2f6-2ee8a6235320/image.png)


- 정보 입력하기
![](https://velog.velcdn.com/images/m_moon_c/post/0a27b2e3-2009-43c2-ac4a-e55256804edf/image.png)


- 생성된 URL 복사하기 (젠킨스에 넣어줘야합니다.)
![](https://velog.velcdn.com/images/m_moon_c/post/dfa93560-a877-434a-a3c6-ec184ad11596/image.png)</code></pre><ul>
<li><p>Jenkins 설정</p>
<ul>
<li><p>Jenkins 관리에서 Plugin(Available plugins)에 Mattermost 검색 후 다운</p>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/1dc6465d-41fd-49e7-a7db-982be59461ee/image.png" alt=""></p>
</li>
<li><p>Jenkins 관리(시스템System 설정) 가장 밑에 추가되어 있습니다.
<img src="https://velog.velcdn.com/images/m_moon_c/post/170f7d30-6ff6-4703-985a-d32885a2c7e0/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p>파이프라인 수정</p>
<ul>
<li>파이프라인에서 stages {} 다음에 post{}코드를 넣어줍니다.</li>
<li>직접 변경해줘야하는 곳 message와 endpoint는 URL넣어주고, channel은 해당 mattermost채널 넣어줍니다.</li>
</ul>
</li>
</ul>
<pre><code>post {
    success {
        script {
            def Author_ID = sh(script: &quot;git show -s --pretty=%an&quot;, returnStdout: true).trim()
            def Author_Name = sh(script: &quot;git show -s --pretty=%ae&quot;, returnStdout: true).trim()
            mattermostSend (color: &#39;good&#39;, 
                message: &quot;(프론트/백)빌드 성공: ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(&lt;${env.BUILD_URL}|Details&gt;)&quot;, 
                endpoint: &#39;{Mattermost_Webhook_URL}&#39;, 
                channel: &#39;{Mattermost_Channel_Name}&#39;
            )
        }
    }
    failure {
        script {
            def Author_ID = sh(script: &quot;git show -s --pretty=%an&quot;, returnStdout: true).trim()
            def Author_Name = sh(script: &quot;git show -s --pretty=%ae&quot;, returnStdout: true).trim()
            mattermostSend (color: &#39;danger&#39;, 
                message: &quot;(프론트/백)빌드 실패: ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(&lt;${env.BUILD_URL}|Details&gt;)&quot;, 
                endpoint: &#39;{Mattermost_Webhook_URL}&#39;, 
                channel: &#39;{Mattermost_Channel_Name}&#39;
            )
        }
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Redis 도커에 띄우기, 비밀번호 설정, 0.0.0.0 설정]]></title>
            <link>https://velog.io/@m_moon_c/Redis-%EB%8F%84%EC%BB%A4%EC%97%90-%EB%9D%84%EC%9A%B0%EA%B8%B0-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%84%A4%EC%A0%95-0.0.0.0-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@m_moon_c/Redis-%EB%8F%84%EC%BB%A4%EC%97%90-%EB%9D%84%EC%9A%B0%EA%B8%B0-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%84%A4%EC%A0%95-0.0.0.0-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Thu, 25 Apr 2024 06:59:14 GMT</pubDate>
            <description><![CDATA[<p>MySQL로 DB를 관리하며, 레디스의 장점을 이용해서, 값을 가져오기 위해, Redis를 도커에  설치하고, 환경설정을 해주려고합니다.</p>
<p>Redis의 도커 설치 방법에 대해 설명하겠습니다.</p>
<p>레디스(최신버전) 불러오기</p>
<pre><code>docker pull redis</code></pre><p>레디스 이미지 확인하기</p>
<pre><code>docker images</code></pre><p>도커 볼륨 생성(로컬에서 Redis 서버에서 복제한 RDB를 관리하기 위해 볼륨을 생성)</p>
<pre><code>docker volume create redis_data</code></pre><p>도커 볼륨 MountPoint 확인</p>
<pre><code>docker volume inspect redis_data</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/0d75afe1-39e6-42c8-bf99-dd9e8e157add/image.png" alt=""></p>
<p>레디스 내부 설정과 관련한 파일인 redis.conf 생성해서 실행시 사용합니다.</p>
<pre><code>sudo vim redis.conf</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/f1a6155c-1213-48f7-9d0c-02d4268d5831/image.png" alt=""></p>
<pre><code># 연결 가능한 네트위크(0.0.0.0 = Anywhere)
bind 0.0.0.0

# 연결 포트
port 6379

# Master 노드의 기본 사용자 비밀번호
requirepass redis

# 최대 사용 메모리 용량(지정하지 않으면 시스템 전체 용량)
maxmemory 2gb

# 설정된 최대 사용 메모리 용량을 초과했을때 처리 방식
# - noeviction : 쓰기 동작에 대해 error 반환 (Default)
# - volatile-lru : expire 가 설정된 key 들중에서 LRU algorithm 에 의해서 선택된 key 제거
# - allkeys-lru : 모든 key 들 중 LRU algorithm에 의해서 선택된 key 제거
# - volatile-random : expire 가 설정된 key 들 중 임의의 key 제거
# - allkeys-random : 모든 key 들 중 임의의 key 제거
# - volatile-ttl : expire time(TTL)이 가장 적게 남은 key 제거 (minor TTL)
maxmemory-policy volatile-ttl

# == RDB 관련 설정 ==
# 저장할 RDB 파일명
dbfilename backup.rdb
# 15분 안에 최소 1개 이상의 key가 변경 되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경 되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경 되었을 때
save 60 10000
# RDB 저장 실패 시 write 명령 차단 여부
stop-writes-on-bgsave-error no</code></pre><p>redis.conf 파일 경로 확인하기</p>
<pre><code>sudo find / -name redis.conf</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/1b6515a2-736b-449d-9ec1-ba401bb0af23/image.png" alt="">
여기서 1번째는 도커 컨테이너의 데이터 볼륨이 있는 것이고, 2번째는 제가 직접 만든 redis.conf 파일의 경로입니다.
/home/ubuntu/redis.conf 로 이용!</p>
<p>레디스 컨테이너 띄우기</p>
<pre><code>docker run --restart=always -d --name redis -p 6379:6379 -v /home/ubuntu/redis.conf:/etc/redis/redis.conf -v /var/lib/docker/volumes/redis_data/_data:/data redis:latest redis-server /etc/redis/redis.conf</code></pre><p>-v /var/lib/docker/volumes/redis_data/_data:/data 은 컨테이너 종료시 레디스에 저장해둔 데이터가 날라갈 수 있기에, 볼륨 마운트를 사용해 redis 컨테이너가 호스트 머신의 파일 시스템에 데이터를 쓸수 있게 만든겁니다.</p>
<p>포트는 6379</p>
<p>잘 설치 되었는지, redis-cli로 접근해보겠습니다.</p>
<pre><code>docker exec -i -t redis redis-cli -a &quot;비밀번호&quot;</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/440a1d7e-1314-485f-878f-bce44c1627ae/image.png" alt=""></p>
<p>접속이 잘 되었고, ping을 입력하면 PONG이 나옵니다^^</p>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/2d32f04e-d541-4c62-8b18-7597cbe06d06/image.png" alt=""></p>
<p>도메인도 잘 접속된 것을 확인 할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[도커에 MySQL 8.0.36 설치, MySQL워커(로컬)과 연결하는 법]]></title>
            <link>https://velog.io/@m_moon_c/MySQL-8.0.36-%EC%84%A4%EC%B9%98-%EB%8F%84%EC%BB%A4%EB%9D%84%EC%9A%B0%EA%B8%B0</link>
            <guid>https://velog.io/@m_moon_c/MySQL-8.0.36-%EC%84%A4%EC%B9%98-%EB%8F%84%EC%BB%A4%EB%9D%84%EC%9A%B0%EA%B8%B0</guid>
            <pubDate>Thu, 25 Apr 2024 04:54:18 GMT</pubDate>
            <description><![CDATA[<p>먼저, 로컬에 MySQL프로그램을 설치하겠습니다.
<a href="https://dev.mysql.com/downloads/windows/installer/8.0.html">https://dev.mysql.com/downloads/windows/installer/8.0.html</a>
<img src="https://velog.velcdn.com/images/m_moon_c/post/3344caec-a57b-4311-a16c-4ad6d1025abb/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/5565c596-cf12-49aa-9b95-9e93b11d1d9c/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/9508ef23-d71b-41b9-9fd7-8d997b158faa/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/3c42d179-21ea-402d-98cc-cb3ca756e463/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/a6aa3d3f-1074-411b-9852-f1d2f800d24e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/9bd1d6fb-7db6-471a-b851-6cf49e8cd5d4/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/6275f3de-8687-4d13-9977-b7ae7a480f74/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/be4cd155-aef7-48fe-b1c9-5938059afd04/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/21cfd2d4-2643-4b45-81ce-ccae3f1e57bc/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/eb706bed-1bc1-4576-bcc3-cd9afcb898d8/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/d6a22ee5-b9d9-4189-a831-9f7c6c54b7ce/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/5cfad759-2510-43d6-9c54-e51bd1ec9d2c/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/22980dbd-beb1-4f5e-97ef-0ee1ee3532ba/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/8bf61b63-eb64-4655-9612-11d041d14fef/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_moon_c/post/8a6ae50d-5f93-4cbf-ae92-311cf354fd8a/image.png" alt=""></p>
<hr>
<p>여기서 잠깐, 8.0.36으로 다운받아서 도커도 설치하려는데 만약 docker pull mysql로 다운을 받게되면 8.3.0으로 받기때문에, 워커로 연결할 때 경고창이 뜬다. 만약 pull mysql로 진행하게 되었다면, 8.0.36의 mysql 컨테이너 안띄어진다. 그땐, 아래 사진 에 경로 /etc/mysql /var/lib/mysql /usr/sbin/mysqld  mysqldata를 삭제해주고 컨테이너를 띄우면 해결된다. (8.3.0이 깔려있는데, 다운그레이드 하려고 보니 에러가 뜬 듯하다.! 디렉토리 어떤 것을 삭제하고 해결되었는지는 나중에 한번 더 검토해보겠습니다.)
<img src="https://velog.velcdn.com/images/m_moon_c/post/3d4d92ce-5036-48e9-bd5a-daa988275788/image.png" alt=""></p>
<hr>
<p>도커에 mysql설치하기</p>
<pre><code> sudo apt-get update &amp;&amp; sudo apt-get upgrade
 docker pull mysql:8.0.36</code></pre><p>도커 mysql 이미지 확인</p>
<pre><code>docker images</code></pre><p>도커 컨테이너 띄우기</p>
<blockquote>
<p>docker run -d -p 3306:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=비밀번호 -v ~/mysqldata/:/var/lib/mysql mysql:8.0.36 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci</p>
</blockquote>
<p>mysql 포트열어주기</p>
<pre><code>sudo ufw allow 3306</code></pre><p>ec2에서 MySQL접속해보기</p>
<pre><code>docker exec -it mysql-container bash
mysql -u root -p
비밀번호입력</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/7e525a18-d4c9-4e87-bcb6-f7e0021e8428/image.png" alt="">
계정생성</p>
<pre><code>create user &#39;계정명&#39;@&#39;%&#39; identified by &#39;비밀번호&#39;;
select host, user from user;</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/02e3cca9-bb2a-4f91-88fa-623117d003f0/image.png" alt="">
계정에 권한 부여</p>
<pre><code>grant all privileges on *.* to &#39;계정명&#39;@&#39;%&#39;;</code></pre><p>권한 부여 메모리에 등록</p>
<pre><code>flush privileges;</code></pre><p>권한 확인</p>
<pre><code>show grants for &#39;계정명&#39;@&#39;%&#39;;</code></pre><p>포트번호 확인</p>
<pre><code>show global variables like &#39;PORT&#39;;</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/b8dbac3b-0129-4c4a-909f-56cdbeccb3a8/image.png" alt=""></p>
<p>MySQL Workbench 로 연결하기
<img src="https://velog.velcdn.com/images/m_moon_c/post/e418a660-3fe3-4fea-ab99-485787033557/image.png" alt=""></p>
<p>처럼 해주고 TEST를 하게되면,
<img src="https://velog.velcdn.com/images/m_moon_c/post/59e64dc5-2f4e-4bb2-b539-614aac3ea5d4/image.png" alt=""></p>
<p>성공한 것을 볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[가비아 도메인에서 서브도메인으로 nginx 걸어주는 법]]></title>
            <link>https://velog.io/@m_moon_c/%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%97%90%EC%84%9C-%EC%84%9C%EB%B8%8C%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9C%BC%EB%A1%9C-nginx-%EA%B1%B8%EC%96%B4%EC%A3%BC%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@m_moon_c/%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%97%90%EC%84%9C-%EC%84%9C%EB%B8%8C%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9C%BC%EB%A1%9C-nginx-%EA%B1%B8%EC%96%B4%EC%A3%BC%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Wed, 24 Apr 2024 08:17:38 GMT</pubDate>
            <description><![CDATA[<p>기존 EC2서버에서 제공 받은 도메인으로 젠킨스와 게릿을 location형태로 진행했었는데, </p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/0c7f34ac-1696-4d3f-96c1-bdbcd193ef99/image.png" alt="">
형태로 메인 도메인 서버에 location /jenkins로 진행하였습니다.
이렇게 되었을 경우는 예를 들어 /src/images/a.png 파일을 찾아서 보여줘야하는데, location block에 지정된 경로를 가지고 찾게 되기 때문에, /jenkins/src/images/a.png 형태로 찾기 때문에 오류가 나는 거라고 자문을 받았습니다.</p>
<p>여기서 알게 된 사실은</p>
<ul>
<li>화면을 띄우는 페이지의 경우 location block이 아닌 서브도메인을 이용해 가능합니다.</li>
</ul>
<p>입니다. 그래서 가비아 도메인을 이용한 서브도메인을 만드는 법을 정리해보고자 합니다.
<img src="https://velog.velcdn.com/images/m_moon_c/post/97f87fa2-555c-45cc-bcd2-c9a086f193c2/image.png" alt=""></p>
<p>이렇게 등록을 해주고, ec2 서버에서, certbot을 갱신해주는데,</p>
<pre><code>sudo certbot --nginx -d www.블라블라.com -d jenkins.블라블라.com -d gerrit.블라블라.com</code></pre><p>로 갱신해주었습니다.
그리고 , NginX sites-enabled 파일에서 </p>
<pre><code>server {
    if ($host = jenkins.블라블라.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80 ;
    listen [::]:80 ;
    server_name jenkins.블라블라.com;
    return 404; # managed by Certbot
}


server {

    #listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    server_name jenkins.블라블라.com;
    ssl_certificate /etc/letsencrypt/live/www.블라블라.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.블라블라.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://127.0.0.1:7777; 
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}</code></pre><p>을 추가해주었습니다. (위 7777포트는 젠킨스 포트)</p>
<p>입력을 하고, </p>
<pre><code>sudo systemctl restart nginx</code></pre><p>NginX 재시작 </p>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/0c5543e0-caf0-4f01-907f-d646a9e02e20/image.png" alt=""></p>
<p>접속완료!</p>
<hr>
<p>/api처럼 화면을 보여주는 것이 아닌 경우에는 location block을 사용하는게 맞지만, 아무 생각 없이 젠킨스와 게릿을 추가하게 되어 오류가 났던 것 같습니다. NginX에 대해 더 심도깊은 공부를 해야한다는 필요성을 느꼈습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VS코드에서 EC2에 설치한 NginX 폴더열기]]></title>
            <link>https://velog.io/@m_moon_c/VS%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-EC2%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%9C-NginX-%ED%8F%B4%EB%8D%94%EC%97%B4%EA%B8%B0</link>
            <guid>https://velog.io/@m_moon_c/VS%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-EC2%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%9C-NginX-%ED%8F%B4%EB%8D%94%EC%97%B4%EA%B8%B0</guid>
            <pubDate>Wed, 24 Apr 2024 03:17:54 GMT</pubDate>
            <description><![CDATA[<p>vs코드에서 remote ssh 로 ec2서버에 접속하였는데,
nginx 파일 중 sites-available을 변경하기위해서 vim을 사용했지만, 터미널에서 변경하는 것보단, 파일을 열어서 변경하고 싶어, vs코드에서 nginx를 여는 법에 대해 설명하고자 합니다.</p>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/932fada3-99e0-43a8-9c61-a7753200198a/image.png" alt=""></p>
<p>새 창으로 열어서, 
<img src="https://velog.velcdn.com/images/m_moon_c/post/7f4684a7-a473-4c9c-80b4-e852c6edc1b8/image.png" alt="">
폴더 열기 -&gt; 기본 경로 지우고 -&gt; /etc/nginx 로 확인 하면 nginx 폴더가 열립니다^^</p>
<p>해당 파일을 열어서 작성하려면 ubuntu에게 권한을 줘야합니다.</p>
<pre><code>sudo chown ubuntu:ubuntu /etc/nginx/sites-available/default</code></pre><p>해당 명령어로 권한을 주었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EC2서버 도메인에서 가비아 도메인으로 변경하는 방법]]></title>
            <link>https://velog.io/@m_moon_c/EC2%EC%84%9C%EB%B2%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%97%90%EC%84%9C-%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@m_moon_c/EC2%EC%84%9C%EB%B2%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%97%90%EC%84%9C-%EA%B0%80%EB%B9%84%EC%95%84-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 24 Apr 2024 01:25:02 GMT</pubDate>
            <description><![CDATA[<p>EC2에서 제공해주는 도메인을 가비아에 구매한 도메인으로 변경하려고 합니다.
하지만, 저는 EC2서버를 제공받은 상태여서, 홈페이지에 접속하는 것이 아닌, ssh 형태로 서버에 직접 들어가서 확인하는 방법을 진행해야합니다.</p>
<h3 id="ec2-public-ipv4-찾기">EC2 Public ipv4 찾기</h3>
<ul>
<li>인스턴스 메타데이터 검색
<a href="https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html">https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html</a></li>
<li>위에 자료에서 메타데이터를 확인할 수 있는 명령어가 있습니다.<pre><code>curl http://169.254.169.254/latest/meta-data</code></pre><img src="https://velog.velcdn.com/images/m_moon_c/post/8d470332-2c54-408a-a3a3-48f8833c5f27/image.png" alt=""></li>
</ul>
<p>이렇게 메타데이터가 나오게 되며, 가비아 DNS에 넣을 public-ipv4를 다시 검색합니다.</p>
<pre><code>curl http://169.254.169.254/latest/meta-data/public-ipv4</code></pre><p><img src="https://velog.velcdn.com/images/m_moon_c/post/defaac39-84a6-4be8-b18f-a42c2b735bc9/image.png" alt=""></p>
<hr>
<h3 id="가비아-dns-관리">가비아 DNS 관리</h3>
<p><img src="https://velog.velcdn.com/images/m_moon_c/post/4beaa3df-646a-4b77-bc57-aa03f8a2e3dd/image.png" alt=""></p>
<p>위 사진에서 DNS관리 툴에 들어가, 1번영역은 호스트 @혹은 www로 입력하고, 2번 영역은 EC2에서 찾은 ip주소를 넣어주고, 3번,4번 선택한다.</p>
<hr>
<p>이후 서버에서 certbot 을 해당 도메인으로 발급받고 nginx 구성요소를 수정해줍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코드리뷰에 대해서]]></title>
            <link>https://velog.io/@m_moon_c/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@m_moon_c/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</guid>
            <pubDate>Wed, 17 Apr 2024 00:35:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>코드리뷰를 하는 이유
다수 프로그래머가 코딩에 참여했을 때, 최선의 코드를 작성하기위해 코드리뷰를 진행합니다.</p>
</li>
<li><p>코드리뷰 받을 때
<code>코드 != 나</code>
나에 대한 평가가 아니라 <strong>그저 코드에 대한 리뷰</strong>
리뷰를 해주는 것이 당연한 것은 아니다!</p>
</li>
<li><p><em>리뷰어에 대한 감사를 느껴야합니다.*</em></p>
</li>
</ul>
<h2 id="코드리뷰">코드리뷰</h2>
<p>프로그래머도 사람인지라, 코드리뷰를 하게되면 나에대한 평가로 느껴질 수 있습니다. 해당 Pn룰을 접목시켜서 코드리뷰를 진행하면 좋습니다.</p>
<ul>
<li>P1 : 이번에 반드시 반영되어야 하는 중대한 코드 수정 의견(Request Changes)
버그 가능성이 있거나 잘못된 구현인 경우, 만약 반영되지 않는다면 이에 대한 반대 의견도 낼 수 있어야 합니다.</li>
<li>P2 : 적극적으로 이야기했으면 하는 의견(Request Changes)
잠재적인 이슈나 확장성을 고려해야 하는 경우. 토론하며 의견 조율할 수 있습니다.</li>
<li>P3 : 가능하다면 반영해주었으면 하는 의견(Request Changes)
지금 구현보다 더 나은 방향이 있는 경우. 이번 반영이 어렵다면 다음 작업에서도 고려해볼 수 있도록 합니다.</li>
<li>P4 : 다음에 반영해도 되는 의견 (Approve)
반영이 되지 않거나 반대 의견을 적극적으로 할 필요 없습니다.</li>
<li>P5 : 사소한 의견(Approve)
무시해도 됨. 혹은 관련 나누고 싶은 점 나눌 수 있다.</li>
</ul>
<p>nit 줄이기</p>
<ul>
<li>사소하고 작은 문제로 주로 스타일 가이드 준수, 가독성 개선 등을 의미</li>
<li>전체적으로는 중요하지 않지만 품질 향상에 도움이 될 수 있는 부분에서 사용</li>
</ul>
<p>크롬 익스텐션</p>
<ul>
<li>WorkerB for Pull requests</li>
<li>PR 화면에 대략적인 리뷰 시간 계산, slack 공유용 링크도 자동으로 생성 해줍니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자율주행 V2X통신 플랫폼 기술]]></title>
            <link>https://velog.io/@m_moon_c/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-V2X%ED%86%B5%EC%8B%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%88%A0</link>
            <guid>https://velog.io/@m_moon_c/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-V2X%ED%86%B5%EC%8B%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%88%A0</guid>
            <pubDate>Fri, 12 Apr 2024 00:35:46 GMT</pubDate>
            <description><![CDATA[<p>운전자 시야를 방해하는 다양한 요인, 안개 , 많은 비가 내릴 때 야간운행할 때, 터널을 진입할 때 , 운전자가 판단을 못해서 사고나는 경우가 많다.
You Can See That You Cannot See</p>
<h2 id="v2i통신">V2I통신</h2>
<ul>
<li><p>Vehicle-to-Infrastructure (V2I)통신</p>
<ul>
<li>차량과 인프라간 무선통신 기술</li>
<li>노변센서에서 도로 장애물 등을 검지하여 인접한 기지국을 통해 후방에 있는 모든 차량에게 주의, 운전 메시지를 차내단말기를 통해 제공하여 2차 추돌 사고를 예방</li>
<li>도로 빙판/장애물 등으로 인한 교통사고 방지</li>
</ul>
</li>
</ul>
<h2 id="v2v-통신">V2V 통신</h2>
<ul>
<li><p>Vehicle-to-Vehicle (V2V)통신</p>
<ul>
<li>차량과 차량간 무선 통신 기술</li>
<li>전방차량의 급정거, 급감속, 차량 고장 등에 대한 정보를 후방차량의 차내단말기내에서 실시간으로 수신하여 서서히 감속하여 2차 사고를 방지하는 기술</li>
<li>서해대교, 영종대교 등의 대형추돌사고 방지</li>
</ul>
</li>
</ul>
<h2 id="v2x-통신">V2X 통신</h2>
<ul>
<li><p>Vehicle-to-Everything (V2X)통신</p>
<ul>
<li>V2V 차량과 차량</li>
<li>V2D 차량과 오토바이,자전거</li>
<li>V2P 차량과 보행자</li>
<li>V2H 차량과 집</li>
<li>V2G 차량과 그리드(전봇대)</li>
<li>V2I 차량과 인프라</li>
</ul>
</li>
</ul>
<h2 id="물리-계층-기술">물리 계층 기술</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>DSRC</th>
<th>C-V2X(LTE-V2X)</th>
<th>5G-V2X</th>
<th>802.11bd(표준화 중)</th>
</tr>
</thead>
<tbody><tr>
<td>명칭</td>
<td>단거리 전용 통신</td>
<td>셀룰러 V2X</td>
<td>5G-V2X(NR-V2X)</td>
<td>차세대 차량통신</td>
</tr>
<tr>
<td>표준화시점</td>
<td>2010.05</td>
<td>2017.03</td>
<td>2021년</td>
<td>2021년 목표</td>
</tr>
<tr>
<td>통신표준</td>
<td>IEEE 802.11p</td>
<td>3GPP Rel. 14,15</td>
<td>3GPP Rel. 16</td>
<td>IEEE 802.11bd</td>
</tr>
<tr>
<td>V2X 사용주파수</td>
<td>5.9GHz</td>
<td>5.9GHz</td>
<td>5.9GHz</td>
<td>5.9GHz</td>
</tr>
<tr>
<td>통신 거리</td>
<td>300m</td>
<td>수 km</td>
<td>수 km</td>
<td>1km</td>
</tr>
<tr>
<td>주행속도</td>
<td>&lt;200km/h</td>
<td>&lt;160km/h</td>
<td>&lt;500km/h</td>
<td>&lt;250km/h</td>
</tr>
<tr>
<td>활용</td>
<td>안전서비스, C-ITS</td>
<td>안전서비스, C-ITS,V2V,V2I</td>
<td>자율주행</td>
<td>자율주행</td>
</tr>
<tr>
<td>사용 기술</td>
<td>변조:OFDM</td>
<td>변조:SC-FDMA/OFDMA</td>
<td>변조:CP-OFDM/OFDMA</td>
<td>변조:OFDM</td>
</tr>
</tbody></table>
<h2 id="cooperative-itsc-its">Cooperative-ITS(C-ITS)</h2>
<ul>
<li><p>V2X 통신을 도입한 차세대 지능형교통시스템</p>
<ul>
<li>차량이 주행 중 운전자에게 주변 교통상황과 급정거, 낙하물 등의 사고 위험정보를 실시간으로 제공하는 시스템</li>
</ul>
</li>
<li><p>지능형교통시스템의 패러다임 변화</p>
<ul>
<li>사고 처리 -&gt; 사고 예방</li>
<li>대표 서비스<ul>
<li>위치기반 데이터 수집<ul>
<li>위치기반 교통정보 제공</li>
<li>도로위험구간 정보제공</li>
<li>노면 기상정보 제공</li>
<li>도로작업구간 주행지원</li>
<li>교차로신호위반 위험경고</li>
<li>우회전 안전운행지원</li>
<li>버스운행관리</li>
<li>옐로우버스 운행 안내</li>
<li>스쿨존 속도제어</li>
<li>보행자 충돌방지 경고</li>
<li>차량 추돌방지 지원</li>
<li>긴급차량 접근경고</li>
<li>차량 긴급상황 경고</li>
<li>군집 주행</li>
<li>군집주행 시스템</li>
<li>차량을 열을 지어 이동하는 형태</li>
</ul>
</li>
<li>차량 거리를 좁히면 연료효율이 높아지고, 위치와 상태정보를 실시간으로 제공받아야한다. V2X차량거리 최소화 할 수 있는 군집주행이다.<ul>
<li>자율 협력 주행</li>
<li>기존 차량에 라이다, 레이다, 카메라 설치된 차량 내에 V2X통신을 넣어 통신을 한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p>ETTIFOS 정구민 교수님 강연</p>
<p>과연 V2X가 필요한가?
자율주행 테스트하면서, 딜레마 존일 때 차량이 갈까 말까 급정거 하고 뒤로 가는 경우가 있는데, 신뢰주행에 있어 필요하다고 생각한다.</p>
<p>자율주행이 위기인가?
애플 자율주행 철수, 구글 웨이모 해고 진행, Argo AI 셧다운, GM 크루즈 하루 500만 달러 손실
자율주행이 기회인가?
완전 자율주행 단계
자동차사의 현실적인 자율주행 단계는 성장하고있다.
자율주행 프로세스와 라이다가 국내에 도입되어 , 고속도로에서 도심으로 들어오는게 얼마안남았다.
자율주행 EESW 구조 안정화 되어가고있다. 25~27년에 안정화가 될 것 같다.
테슬라 구조와 유사하며 도심 모델링 및 자율주행 서비스로의 진화
자율주행 발전이 엄청나게 속도를 붙으며 성장할 것이다.</p>
<h2 id="ces-2023과-자율주행">CES 2023과 자율주행</h2>
<ul>
<li><p>CV3-AD685, Ambarella, Inc.</p>
<ul>
<li>AI도메인 컨트롤러 SoC 제품</li>
<li>CES 2023 미디어 데이에서 콘티넨탈과 협업 발표</li>
<li>콘티넨탈 SDV의 자율주행 플랫폼 프로세서</li>
</ul>
</li>
<li><p>EyeQ5, Mobileye</p>
<ul>
<li>Mobileye Drive와 SuperVision에 탑재되는 프로세서</li>
<li>ST마이크로일렉트로닉스와 공동개발</li>
</ul>
</li>
<li><p>Drive Orin, Nvidia</p>
<ul>
<li>자율주행 차량을 위한 SoC</li>
<li>여러 자동차 어플리케이션을 병렬로 실행 가능</li>
<li>Volvo EX90 탑재</li>
</ul>
</li>
<li><p>Snapdragon Ride Flex, Qualcomm</p>
<ul>
<li>23년 1월 5일 공개한 차량용 SoC(24년 양산 예정)<ul>
<li>디지털 콕핏, ADAS, 자율주행 기능을 하나의 SoC에서 처리</li>
</ul>
</li>
<li>기존 Snapdragon Ride 플랫폼의 진화형</li>
</ul>
</li>
<li><p>자율주행 센서의 진화</p>
<ul>
<li><p>주요 부품사 라이다 양산 발표</p>
</li>
<li><p>차량의 다양한 위치에 부착되는 LiDAR</p>
<ul>
<li>지붕 앞부분(루미나, 이노비즈, 허사이, 이노뷰전)</li>
<li>차창 내(셉톤, 와이드아이, 옵시스)</li>
<li>헤드 램프(SOS랩)</li>
<li>그릴(SOSLAB,AutoL,AEVA)</li>
<li>Ettifos</li>
</ul>
</li>
<li><p>세계 최초 5G NR V2X 모뎀 전시</p>
</li>
<li><p>ARM 계열 AP에 SW를 올려 V2X모뎀으로 사용이 가능한 플랫폼</p>
</li>
<li><p>LTE-V2X 방식에 비해 5배 더 빠른 속도</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>도심 주행과 V2X의 필요성</p>
<ul>
<li>사람이 직관적으로 판단하기 어려운 상황에 대하여 객관적인 정보와 판단 제공 기능<ul>
<li>전방 교촤로 좌우도로 차량 접근 시나리오<ul>
<li>전방 교차로 우회전 시 사각지대 사고차량 미인식 시나리오</li>
<li>전방 사각지대에서 보행자 접근 시나리오</li>
<li>전방 차량으로 인한 역주행 차량 미인식 시나리오</li>
</ul>
</li>
</ul>
</li>
<li>딜레마 존 상황에서 V2X 기술의 필요성<ul>
<li>딜레마 존 : 신호가 황색으로 바뀌는 시간에 운전자가 교차로를 통과 혹은 정지하기를 결정하기 어려운 구간</li>
<li>V2X 통한 딜레마 존 극복</li>
</ul>
</li>
<li>도심 주행 최적화<ul>
<li>에너지 최적화<ul>
<li>인간이 운전할 때보다, V2X로 운전할 때의 에너지 절약 효율이 40%높다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[젠킨스 파이프라인(리액트)]]></title>
            <link>https://velog.io/@m_moon_c/%EC%A0%A0%ED%82%A8%EC%8A%A4-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EB%A6%AC%EC%95%A1%ED%8A%B8</link>
            <guid>https://velog.io/@m_moon_c/%EC%A0%A0%ED%82%A8%EC%8A%A4-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EB%A6%AC%EC%95%A1%ED%8A%B8</guid>
            <pubDate>Tue, 02 Apr 2024 02:15:53 GMT</pubDate>
            <description><![CDATA[<pre><code>pipeline {
    agent any
    tools {nodejs &quot;nodejs&quot;}

    environment {
        imageName = &quot;이미지이름 넣기&quot;
        registryCredential = &#39;dockerhub&#39; //젠킨스에 등록해놓은 자격증명서
        dockerImage = &#39;&#39;

        releaseServerAccount = &#39;ubuntu&#39;
        releaseServerUri = &#39;서비스 URL EC2서버&#39;
        releasePort = &#39;리액트가 사용하는 포트&#39;
    }

    stages {
        stage(&#39;Git Clone&#39;) {
            steps {
                git branch: &#39;FE&#39;,
                    credentialsId: &#39;gitlab&#39;, //젠킨스에 등록해놓은 자격증명서
                    url: &#39;URL.git&#39;  //git clone할 때 사용하는 url
            }
        }
        stage(&#39;Image Build &amp; DockerHub Push&#39;) {
            steps {
                dir(&#39;frontend&#39;) {
                    script {
                        docker.withRegistry(&#39;&#39;, registryCredential) {
                            sh &quot;docker buildx create --use --name mybuilder&quot;
                            sh &quot;docker buildx build --platform linux/amd64,linux/arm64 -t $imageName:latest --push .&quot;
                        }
                    }
                }
            }
        }
        stage(&#39;Before Service Stop&#39;) {
            steps {
                sshagent(credentials: [&#39;ubuntu-c106&#39;]) {
                    sh &#39;&#39;&#39;
                    if test &quot;`ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest&quot;`&quot;; then
                    ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker stop $(docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest)&quot;
                    ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker rm -f $(docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest)&quot;
                    ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker rmi mooncheolhwan/frontend:latest&quot;
                    fi
                    &#39;&#39;&#39;
                }
            }
        }
        stage(&#39;DockerHub Pull&#39;) {
            steps {
                sshagent(credentials: [&#39;ubuntu-c106&#39;]) {
                    sh &quot;ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &#39;sudo docker pull $imageName:latest&#39;&quot;
                }
            }
        }
        stage(&#39;Service Start&#39;) {
            steps {
                sshagent(credentials: [&#39;ubuntu-c106&#39;]) {
                    sh &#39;&#39;&#39;
                    ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;sudo docker rm -f fe&quot;
                    ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;sudo docker run -i -e TZ=Asia/Seoul --name fe -p $releasePort:$releasePort -d $imageName:latest&quot;
                    &#39;&#39;&#39;
                }
            }
        }
        stage(&#39;Service Check&#39;) {
            steps {
                sshagent(credentials: [&#39;ubuntu-c106&#39;]) {
                    sh &#39;&#39;&#39;
                        #!/bin/bash

                        for retry_count in \$(seq 20)
                        do
                          if curl -s &quot;URL&quot; &gt; /dev/null
                          then
                              curl -d &#39;{&quot;text&quot;:&quot;Release Complete&quot;}&#39; -H &quot;Content-Type: application/json&quot; -X POST 메타모스트 웹훅
                              break
                          fi

                          if [ $retry_count -eq 20 ]
                          then
                            curl -d &#39;{&quot;text&quot;:&quot;Release Fail&quot;}&#39; -H &quot;Content-Type: application/json&quot; -X POST 메타모스트 웹훅
                            exit 1
                          fi

                          echo &quot;The server is not alive yet. Retry health check in 5 seconds...&quot;
                          sleep 5
                        done
                    &#39;&#39;&#39;
                }
            }
        }

    }
}</code></pre><p>위 코드로 진행되었습니다.
단계는 6단계로,</p>
<ol>
<li>Git Clone : Git 저장소에서 소스 코드를 가져옵니다.</li>
<li>Image Build &amp; DockerHub Push : Docker 이미지를 빌드하고 DockerHub에 푸시합니다.</li>
<li>Before Service Stop : 이전에 실행된 Docker 컨테이너를 중지하고 제거합니다.</li>
<li>DockerHub Pull : 새로 업데이트된 Docker이미지를 서버로 가져옵니다.</li>
<li>Service Start : 새로운 Docker컨테이너를 시작합니다.</li>
<li>Service Check : 서비스가 올바르게 시작되었는지 확인합니다.</li>
</ol>
<hr>
<p>agent any : 어떤 에이전트에서든 실행될 수 있다.
tools : 파이프라인에서 사용하는 도구
environment : 환경 변수 정의함.
stages : 파이프라인의 주요 단계 정의
steps : 각 단계에서 실행할 명령, shell 스크립트로 실행됨.</p>
<hr>
<ul>
<li><p>docker buildx create --use --name mybuilder</p>
<ul>
<li>Docker Buildx 빌더를 생성하고 사용할 이름을 지정하는 명령</li>
<li><code>--use</code> : 새로 생성된 빌더를 사용하도록 설정합니다.</li>
<li><code>--name mybuilder</code> : 새로 생성된 빌더의 이름을 &quot;mybuilder&quot;로 지정합니다.</li>
<li>mybuilder 빌더를 사용하여 다중 아키텍처 이미지를 빌드할 수 있게 됩니다.</li>
</ul>
</li>
<li><p>docker buildx build --platform linux/amd64,linux/arm64 -t $imageName:latest --push .</p>
<ul>
<li>Docker Buildx를 사용하여 다중 아키텍처 이미지를 빌드하고 푸시하는 명령</li>
<li><code>--platform linux/amd64,linux/arm64</code> : 빌드할 이미지의 플랫폼을 지정합니다. 여기서는 Linux의 amd64 아키텍처와 arm64 아키텍처를 지정했습니다. 즉, 이 명령은 amd64와 arm64 아키텍처용 이미지를 동시에 빌드합니다.</li>
<li><code>-t $imageName:latest</code> : 빌드한 이미지에 태그를 지정합니다. $imageName은 환경 변수로 설정된 이미지 이름을 나타냅니다. latest는 태그로서, 이 이미지가 최신 버전임을 나타냅니다.</li>
<li><code>--push</code> : 빌드된 이미지를 레지스트리에 푸시합니다.</li>
<li><code>.</code> : 현재 디렉토리에서 Dockerfile을 사용하여 이미지를 빌드합니다.</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>if test &quot;`ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest&quot;`&quot;; then</p>
<ul>
<li>원격 서버에서 실행 중인 모든 컨테이너의 ID를 가져와서 filter 옵션을 사용하여 특정 이미지를 뽑아냅니다.</li>
<li>필터된 ID가 mooncheolhwan/frontend:latest이면 아래코득가 실행됩니다.</li>
</ul>
</li>
<li><p>&quot;ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker stop $(docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest)&quot;</p>
<ul>
<li><code>docker stop</code> 명령을 사용하여 원격 서버에서 실행 중인 특정 이미지를 기반으로한 컨테이너를 중지합니다.</li>
</ul>
</li>
<li><p>&quot;ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker rm -f $(docker ps -aq --filter ancestor=mooncheolhwan/frontend:latest)&quot;</p>
<ul>
<li><code>docker rm -f</code> 명령을 사용하여 원격 서버에서 실행 중인 특정 이미지를 기반으로한 컨테이너를 강제로 제거합니다.</li>
</ul>
</li>
<li><p>&quot;ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;docker rmi mooncheolhwan/frontend:latest&quot;</p>
<ul>
<li><code>docker rmi</code> 명령을 사용하여 해당 이미지를 원격 서버에서 제거합니다.</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;sudo docker rm -f fe&quot;</p>
<ul>
<li>원격 서버에 SSH를 통해 접속한 후, <code>sudo docker rm -f fe</code> 명령을 실행합니다.</li>
<li>이 명령은 fe라는 이름의 Docker 컨테이너를 강제로 제거합니다. </li>
<li><code>-f</code> 옵션은 강제로 컨테이너를 제거</li>
</ul>
</li>
<li><p>ssh -o StrictHostKeyChecking=no $releaseServerAccount@$releaseServerUri &quot;sudo docker run -i -e TZ=Asia/Seoul --name fe -p $releasePort:$releasePort -d $imageName:latest&quot;</p>
<ul>
<li>원격 서버에 SSH를 통해 접속한 후, 새로운 Docker 컨테이너를 실행합니다.</li>
<li><code>-i</code> : 인터랙티브 모드로 실행합니다.</li>
<li><code>-e TZ=Asia/Seoul</code> : 컨테이너 내부의 시간대를 Asia/Seoul로 설정합니다.</li>
<li><code>--name fe</code> : 컨테이너의 이름을 fe로 지정합니다.</li>
<li><code>-p $releasePort:$releasePort</code> : 호스트의 $releasePort 포트를 컨테이너의 동일한 포트로 매핑합니다.</li>
<li><code>-d</code> : 백그라운드 모드로 실행합니다.</li>
<li><code>$imageName:latest</code>: 실행할 이미지의 이름과 태그를 지정합니다. </li>
<li><code>$imageName</code>은 환경 변수로 설정된 이미지 이름을 나타냅니다.</li>
</ul>
</li>
</ul>
<hr>
<p>마지막 step인 Service Check 코드에 대해 설명하자면,</p>
<ul>
<li><code>for retry_count in \$(seq 20)</code>: 20번의 반복을 수행하는 for 루프를 시작합니다.</li>
<li><code>if curl -s &quot;URL&quot; &gt; /dev/null</code>: curl을 사용하여 특정 URL로 HTTP GET 요청을 보냅니다. -s 옵션은 silent 모드로 출력을 표시하지 않습니다. 응답은 /dev/null로 보냅니다.</li>
<li><code>curl -d &#39;{&quot;text&quot;:&quot;Release Complete&quot;}&#39; -H &quot;Content-Type: application/json&quot; -X POST 메타모스트 웹훅</code>: Release Complete 메시지를 포함한 JSON 데이터를 지정된 웹훅 URL로 POST 요청을 보냅니다.</li>
<li>break: 반복문을 종료합니다.</li>
<li><code>if [ $retry_count -eq 20 ]</code>: 20번의 시도가 모두 실패한 경우 실행합니다.</li>
<li><code>curl -d &#39;{&quot;text&quot;:&quot;Release Fail&quot;}&#39; -H &quot;Content-Type: application/json&quot; -X POST 메타모스트 웹훅</code> : Release Fail 메시지를 포함한 JSON 데이터를 지정된 웹훅 URL로 POST 요청을 보냅니다.</li>
<li>exit 1: 스크립트를 종료하고 오류 코드 1을 반환합니다.</li>
<li><code>echo &quot;The server is not alive yet. Retry health check in 5 seconds...&quot;</code>: 서버가 아직 준비되지 않았음을 나타내는 메시지를 출력합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 Dockerfile에 대해서 설명]]></title>
            <link>https://velog.io/@m_moon_c/%EB%A6%AC%EC%95%A1%ED%8A%B8-Dockerfile%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@m_moon_c/%EB%A6%AC%EC%95%A1%ED%8A%B8-Dockerfile%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Mon, 01 Apr 2024 13:21:54 GMT</pubDate>
            <description><![CDATA[<p>도커파일을 작성하는데, 각 해당 소스코드의 의미를 이해하고 싶었습니다.</p>
<p>먼저 소스코드를 보여드리자면,</p>
<pre><code>FROM node:20.11 AS build

RUN mkdir /app

WORKDIR /app

COPY package.json /app/

RUN npm install

COPY . /app/

RUN npm run build

EXPOSE 3000

CMD [&quot;npm&quot;, &quot;start&quot;]</code></pre><p>입니다.</p>
<ul>
<li><p>FROM node:20.11 AS build</p>
<ul>
<li>Node.js 20.11 버전을 기반으로 하는 Docker 이미지를 빌드 단계의 베이스 이미지로 사용</li>
<li>Node.js를 설치하고 애플리케이션을 빌드하기 위한 환경을 제공</li>
<li>AS build는 이 단계를 &quot;build&quot; 단계로 명명하는 것</li>
</ul>
</li>
<li><p>RUN mkdir /app</p>
<ul>
<li>컨테이너 내부에 &quot;/app&quot; 디렉토리를 생성</li>
<li>app 디렉토리는 애플리케이션 소스 코드 및 의존성을 저장할 곳</li>
</ul>
</li>
<li><p>WORKDIR /app</p>
<ul>
<li>app 디렉토리를 작업 디렉토리로 설정</li>
<li></li>
</ul>
</li>
<li><p>COPY package.json /app/</p>
<ul>
<li>호스트의 &quot;package.json&quot; 파일을 컨테이너의 &quot;/app/&quot; 디렉토리로 복사</li>
<li>npm install을 실행하기 전에 package.json 파일을 이미지에 복사하여 종속 항목을 설치할 준비</li>
</ul>
</li>
<li><p>RUN npm install</p>
<ul>
<li>package.json 파일에 명시된 종속 항목을 설치</li>
</ul>
</li>
<li><p>COPY . /app/</p>
<ul>
<li>현재 디렉토리의 모든 파일을 컨테이너의 &quot;/app/&quot; 디렉토리로 복사</li>
<li>소스 코드 및 기타 모든 파일을 이미지에 추가하는 단계</li>
</ul>
</li>
<li><p>RUN npm run build</p>
<ul>
<li>해당 npm 스크립트에 정의된 대로, package.json 파일 내의 &quot;scripts&quot; 섹션에서 정의된 &quot;build&quot; 스크립트를 실행</li>
</ul>
</li>
<li><p>EXPOSE 3000</p>
<ul>
<li>컨테이너 내부의 3000번 포트를 외부에 노출</li>
<li>애플리케이션이 컨테이너 내에서 실행 중인 경우 외부에서 액세스할 수 있도록 함</li>
</ul>
</li>
<li><p>CMD [&quot;npm&quot;, &quot;start&quot;]</p>
<ul>
<li>컨테이너가 시작될 때 실행되는 명령어</li>
<li>애플리케이션을 시작함</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dockerfile, npm install 오래걸릴 때, Alpine확인]]></title>
            <link>https://velog.io/@m_moon_c/Dockerfile-npm-install-%EC%98%A4%EB%9E%98%EA%B1%B8%EB%A6%B4-%EB%95%8C-Alpine%ED%99%95%EC%9D%B8</link>
            <guid>https://velog.io/@m_moon_c/Dockerfile-npm-install-%EC%98%A4%EB%9E%98%EA%B1%B8%EB%A6%B4-%EB%95%8C-Alpine%ED%99%95%EC%9D%B8</guid>
            <pubDate>Mon, 01 Apr 2024 13:12:44 GMT</pubDate>
            <description><![CDATA[<p>초기 도커파일은,</p>
<pre><code>FROM node:lts-apline
WORKDIR /src
COPY package.json .
RUN npm install 
COPY . .
EXPOSE 3000
CMD [ &quot;npm&quot;, &quot;start&quot; ]</code></pre><p>으로 작성하여 진행했습니다.</p>
<p>여기서 젠킨스가 해당 도커파일을 읽을 때 계속해서 npm install을 시도하지만,</p>
<blockquote>
<p>ERROR: failed to solve: process &quot;/bin/sh -c npm install&quot; did not complete successfully: </p>
</blockquote>
<p>해당 에러가 나면서 젠킨스 fail이 되었습니다.
문제를 해결하기 위해 구글링도 하며, 도커파일을 수없이 변경하며 진행하였지만,
해결책이 없었고, 새로운 도커파일을 만들어서 진행해보았습니다.</p>
<p>새로운 도커파일</p>
<pre><code>FROM node:20.11 AS build

RUN mkdir /app

WORKDIR /app

COPY package.json /app/

RUN npm install

COPY . /app/
RUN npm run build

EXPOSE 3000
CMD [&quot;npm&quot;, &quot;start&quot;]</code></pre><p>위 파일 처럼, alpine을 없애고, 로컬에서 작업했던 노드 버전을 입력해주었습니다.
여기서, 위에 생긴 에러가 사라지게 되었고.
이전에는 초기상태라서 npm run build가 필요 없었지만, 프로젝트를 진행하면서 애플리케이션 파일을 생성하는 데 필요한 스크립트가 package.json의 scripts 섹션에 추가되어,
npm run build를 넣었습니다.</p>
<p>정상작동 확인!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 이미지 분석, 분류 기술]]></title>
            <link>https://velog.io/@m_moon_c/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EC%84%9D-%EB%B6%84%EB%A5%98-%EA%B8%B0%EC%88%A0</link>
            <guid>https://velog.io/@m_moon_c/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%84%EC%84%9D-%EB%B6%84%EB%A5%98-%EA%B8%B0%EC%88%A0</guid>
            <pubDate>Sat, 30 Mar 2024 09:17:46 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>합성곱 신경망(CNN, Convolution Neural Networks)</p>
<ul>
<li>CNN은 이미지 처리 작업에 효과적인 딥러닝 기술</li>
<li>이미지의 특징을 자동으로 추출하고 학습할 수 있어 이미지 분류 및 인식 작업에서 많이 사용됩니다.</li>
</ul>
</li>
<li><p>전이 학습(Transfer Learning)</p>
<ul>
<li>사전에 훈련된 모델을 사용하여 새로운 작업에 적용하는 방법</li>
<li>데이터 부족 문제를 해결하고 효율적으로 모델을 학습시킬 수 있도록 도와줍니다.</li>
</ul>
</li>
<li><p>지역적인 특징 추출(Local Feature Extraction)</p>
<ul>
<li>이미지의 지역적인 특징을 추출하여 이를 기반으로 이미지를 분류하는 방법</li>
<li>SIFT(Scale-Invariant Feature Transform)</li>
<li>SURF(Speeded Up Robust Features)</li>
</ul>
</li>
<li><p>자연어 처리 기술 활용</p>
<ul>
<li>이미지에 대한 자연어 설명을 생성하거나, 이미지와 관련된 텍스트 정보를 활용하여 이미지를 분류하는 방법도 있습니다.</li>
</ul>
</li>
<li><p>지도 및 비지도 학습 기법</p>
<ul>
<li>지도 학습에서는 레이블이 달린 데이터를 사용하여 학습</li>
<li>비지도 학습에서는 레이블이 없는 데이터에서 패턴이나 특징을 찾는 방법</li>
</ul>
</li>
<li><p>강화 학습(Reinforcement Learning)</p>
<ul>
<li>이미지 분류에 적용되는 강화 학습 기술은 상태, 행동, 보상을 기반으로 학습하여 이미지를 분류하거나 처리하는 방식</li>
</ul>
</li>
<li><p>GANs(Generative Adversarial Networks) </p>
<ul>
<li>GAN은 가짜 이미지를 생성하고 진짜 이미지와 구별하는 모델로, 이미지 생성 및 변형에 사용됩니다.</li>
</ul>
</li>
<li><p>심층 학습 및 AutoML    </p>
<ul>
<li>최근에는 더욱 복잡하고 깊은 신경망 아키텍처 및 AutoML기술이 이미지 분류와 관련된 작업에 활용되고 있습니다.</li>
</ul>
</li>
</ul>
<hr>
<p>추가적으로, AutoML에 대해서 알아보겠습니다.</p>
<ul>
<li><p>AutoML</p>
<ul>
<li><p>Automated Machine Learning</p>
</li>
<li><p>기계 학습 모델을 자동으로 만들고 최적화하는 기술</p>
<ul>
<li>AutoML이 수행할 수 있는 작업</li>
</ul>
</li>
<li><p>특성 공학(Feature Engineering)</p>
<ul>
<li>데이터의 특성을 분석하고 추출하여 모델에 적합한 형태로 변환</li>
</ul>
</li>
<li><p>모델 선택 및 구성(Model Selection and Configuration)</p>
<ul>
<li>여러 가지 다양한 모델 아키텍처를 탐색하고, 최적의 하이퍼파라미터를 찾아 성능을 극대화합니다.</li>
</ul>
</li>
<li><p>하이퍼파라미터 최적화(Hyperparameter Optimization)</p>
<ul>
<li>모델의 하이퍼파라미터 값을 최적화하여 모델의 성능을 향상시킵니다.</li>
</ul>
</li>
<li><p>앙상블 학습(Ensemble Learning)</p>
<ul>
<li>여러 모델을 결합하여 더 강력한 예측 모델을 생성합니다.</li>
</ul>
</li>
<li><p>모델 평가 및 선택(Model Evaluation and Selection)</p>
<ul>
<li>생성된 모델들을 평가하고 성능을 비교하여 가장 우수한 모델을 선택</li>
</ul>
</li>
</ul>
</li>
<li><p>종류</p>
<ul>
<li>Google Cloud AutoML</li>
<li>Amazon SageMaker Autopilot</li>
<li>Microsoft Azure Automated Machine Learning</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[이미지 객체 인식 라이브러리와 프레임워크]]></title>
            <link>https://velog.io/@m_moon_c/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EA%B0%9D%EC%B2%B4-%EC%9D%B8%EC%8B%9D-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%99%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@m_moon_c/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EA%B0%9D%EC%B2%B4-%EC%9D%B8%EC%8B%9D-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%99%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Sat, 30 Mar 2024 09:06:51 GMT</pubDate>
            <description><![CDATA[<p>딥러닝 프레임워크</p>
<ul>
<li><p>TensorFlow </p>
<ul>
<li>구글에서 개발한 딥러닝 프레임워크</li>
<li>이미지 객체 인식을 위한 다양한 모델을 구현</li>
<li>TensorFlow의 Object Detection API는 객체 감지 및 분류에 사용되며, 사전 훈련된 모델을 제공</li>
</ul>
</li>
<li><p>PyTorch</p>
<ul>
<li>Facebook에서 개발한 딥러닝 프레임워크</li>
<li>텐서플로우와 유사하게 이미지 객체 인식을 위한 모델을 구현할 수 있음.</li>
<li>PyTorch는 동적 그래프를 사용하여 모델을 정의하고 훈련시킬 수 있습니다.</li>
</ul>
</li>
</ul>
<p>이미치 처리 관련 라이브러리</p>
<ul>
<li><p>OpenCV</p>
<ul>
<li>컴퓨터 비전 및 이미지 처리를 위한 가장 널리 사용되는 라이브러리 중 하나</li>
<li>객체 감지, 추적, 분할 등에 사용</li>
</ul>
</li>
<li><p>Pillow </p>
<ul>
<li>이미지 처리를 위한 파이썬 라이브러리</li>
<li>이미지 로드, 저장, 변환 등의 작업을 수행</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[라이브러리와 프레임워크의 차이는?]]></title>
            <link>https://velog.io/@m_moon_c/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%99%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94</link>
            <guid>https://velog.io/@m_moon_c/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%99%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94</guid>
            <pubDate>Sat, 30 Mar 2024 08:54:52 GMT</pubDate>
            <description><![CDATA[<h3 id="라이브러리">라이브러리</h3>
<ul>
<li>라이브러리는 재사용 가능한 코드 집합</li>
<li>특정 기능을 수행하기 위해 호출할 수 있는 함수와 클래스의 모음</li>
<li>프로그램의 다양한 부분에서 필요한 기능을 제공하거나, 특정 작업을 간편하게 처리할 수 있도록 도와줍니다.</li>
<li>개발자가 필요한 기능을 직접 호출하여 사용하며, 라이브러리는 프로그램의 제어 흐름에 직접적으로 영향을 주지 않습니다.</li>
<li>NumPy, Pandas, OpenCV</li>
</ul>
<h3 id="프레임워크">프레임워크</h3>
<ul>
<li>애플리케이션의 구조를 정의하고, 개발자가 이 구조 안에서 자신의 코드를 작성하도록 하는 뼈대나 틀을 제공합니다.</li>
<li>특정 도메인이나 플랫폼에 맞춰진 기본 구조와 규칙을 제공하여 개발자가 이를 따르도록 유도합니다.</li>
<li>개발자는 프레임워크의 규칙과 구조에 따라 코드를 작성하고, 프레임워크가 제공하는 기능을 이용하여 애플리케이션을 개발합니다.</li>
<li>프레임워크는 일반적으로 제어 흐름을 포함하여, 개발자가 프레임워크의 규칙에 따라 작성한 코드를 호출하거나 확장할 수 있습니다.</li>
<li>TensorFlow, Pytorch, Django</li>
</ul>
<hr>
<ul>
<li><p>정리</p>
<ul>
<li>라이브러리는 개발자가 필요한 기능을 호출하여 사용하는도구</li>
<li>프레임워크는 개발자가 구조와 규칙에 따라 코드를 작성하고, 제공하는 틀 안에서 애플리케이션을 개발하는 도구</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SEO(Search Engine Optimization)?]]></title>
            <link>https://velog.io/@m_moon_c/SEOSearch-Engine-Optimization</link>
            <guid>https://velog.io/@m_moon_c/SEOSearch-Engine-Optimization</guid>
            <pubDate>Sat, 30 Mar 2024 08:00:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li>Search Engine Optimization</li>
<li>검색 엔진 최적화</li>
<li>SEO는 웹사이트나 웹페이지가 검색 엔진에서 높은 순위에 나타나도록 최적화하는 과정 및 전략을 의미합니다.</li>
<li>검색 엔진 최적화를 통해 웹사이트가 검색 결과 페이지에서 높은 순위를 차지하면, 더 많은 방문자를 유치하고 홍보 및 비즈니스 목표를 달성할 수 있습니다.</li>
</ul>
<hr>
<p>검색 엔진 최적화는 아래요소들을 고려합니다.</p>
<ul>
<li><p>키워드 최적화</p>
<ul>
<li>검색어를 조사하고 해당 키워드를 웹사이트의 콘텐츠에 적절하게 통합하여 검색 결과에서 상위에 나타나도록 합니다.</li>
</ul>
</li>
<li><p>콘텐츠 품질</p>
<ul>
<li>코품질의 콘텐츠를 제공하여 사용자에게 가치를 제공하고, 검색 엔진이 해당 콘텐츠를 인식하고 평가할 수 있도록 합니다.</li>
</ul>
</li>
<li><p>메타 태그 최적화</p>
<ul>
<li>페이지의 메타 태그(타이틀, 메타 설명, 키워드 등)를 최적화하여 검색 엔진에서 페이지를 적절하게 해석하도록 합니다.</li>
</ul>
</li>
<li><p>사이트 구조 최적화</p>
<ul>
<li>웹사이트의 구조를 최적화하여 검색 엔진이 콘텐츠를 효과적으로 탐색하고 인덱싱할 수 있도록 합니다.</li>
</ul>
</li>
<li><p>모바일 최적화</p>
<ul>
<li>웹사이트가 모바일 사용자에게 적합하도록 최적화하여 모바일 검색에서 높은 순위를 유지합니다.</li>
</ul>
</li>
<li><p>사이트 속도 최적화</p>
<ul>
<li>페이지 로딩 속도를 개선하여 사용자 경험을 향상시키고 검색 엔진 순위에 긍정적인 영향을 미치도록 합니다.</li>
</ul>
</li>
<li><p>내부 링크 구조</p>
<ul>
<li>내부 링크를 적절하게 사용하여 웹사이트의 다양한 페이지 간의 관계를 강조하고 검색 엔진이 페이지의 중요성을 이해할 수 있도록 합니다.</li>
</ul>
</li>
<li><p>외부 링크 및 백링크</p>
<ul>
<li>다른 웹사이트로부터의 백링크(인터넷상에서의 다른 웹사이트에서 현재 페이지로 연결되는 링크)를 얻어서 검색 엔진에게 해당 페이지의 신뢰성을 높이도록 합니다.</li>
</ul>
</li>
</ul>
<hr>
<p>정리) 검색 엔진 최적화는 웹사이트의 발견성과 가시성을 높이고, 검색 결과에서 높은 순위를 유지하는 데 중요한 전략입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue, Vuex, VueCLI, Nuxt.js란?]]></title>
            <link>https://velog.io/@m_moon_c/Vue-Vuex-VueCLI-Nuxt.js%EB%9E%80</link>
            <guid>https://velog.io/@m_moon_c/Vue-Vuex-VueCLI-Nuxt.js%EB%9E%80</guid>
            <pubDate>Sat, 30 Mar 2024 07:45:47 GMT</pubDate>
            <description><![CDATA[<h3 id="vuejs의-특징과-사용사례">Vue.js의 특징과 사용사례</h3>
<ul>
<li><p>간결한 문법</p>
<ul>
<li>간결하고 직관적인 문법을 가지고 있습니다.</li>
<li>HTML, JavaScript, CSS를 기반으로 한 선언적인 문법을 사용하여 쉽게 이해하고 구현할 수 있습니다.</li>
</ul>
</li>
<li><p>컴포넌트 기반 구조</p>
<ul>
<li>Vue.js는 컴포넌트 기반의 아키텍처를 채택.</li>
<li>애플리케이션을 작은 단위로 나누어 재사용성을 증가시키고 유지보수를 용이하게 만듭니다.</li>
</ul>
</li>
<li><p>반응성(Reactivity)</p>
<ul>
<li>데이터의 변경에 반응하여 자동으로 화면을 업데이트할 수 있는 반응성 시스템을 제공합니다.</li>
<li>양방향 데이터 바인딩을 통해 효율적인 상태 관리를 가능하게합니다.</li>
</ul>
</li>
<li><p>유연한 라우팅</p>
<ul>
<li>Vue Router를 사용하여 애플리케이션의 라우팅을 쉽게 구현할 수 있습니다. 라우팅을 통해 여러 페이지 간의 이동 및 상태관리가 가능합니다.</li>
</ul>
</li>
<li><p>상태 관리</p>
<ul>
<li>Vuex라는 상태 관리 라이브러리를 제공하여 중대형 애플리케이션에서의 상태 관리를 효율적으로 할 수 있습니다.</li>
</ul>
</li>
<li><p>생태계</p>
<ul>
<li>Vue.js는 다양한 플러그인과 라이브러리들이 있는 생태계를 가지고 있어, 다양한 요구사항에 대응할 수 있습니다.</li>
</ul>
</li>
</ul>
<p>Vue.js는 Vue CLI와 함께 사용되어 프로젝트 구조를 설정하고 개발 서버를 실행하는 등의 기능을 제공합니다.</p>
<hr>
<p>Vuex와 Vue CLI에 대해 알아보겠습니다.</p>
<h3 id="vuex">Vuex</h3>
<ul>
<li><p>Vue.js 애플리케이션에서 상태 관리를 위한 라이브러리입니다.</p>
</li>
<li><p>애플리케이션의 상태를 중앙에서 관리하고 컴포넌트 간의 통신을 효율적으로 하기 위해 사요용됩니다.</p>
</li>
<li><p>대규모 애플리케이션 또는 상태가 복잡한 애플리케이션에서 유용합니다.</p>
<h4 id="주요-특징-및-개념">주요 특징 및 개념</h4>
</li>
<li><p>상태(State)</p>
<ul>
<li>애플리케이션의 상태를 단일 스토어에 저장합니다.</li>
<li>이 스토어는 애플리케이션의 모든 컴포넌트에서 접근 가능하며 중앙에서 관리됩니다.</li>
</ul>
</li>
<li><p>뮤테이션(Mutation)</p>
<ul>
<li>상태를 변경하는 유일한 방법으로, 뮤테이션을 통해 상태를 동기적으로 변경할 수 있습니다.</li>
<li>뮤테이션은 변이를 추적하고 디버깅하기 쉽도록 기록됩니다.</li>
</ul>
</li>
<li><p>액션(Action)</p>
<ul>
<li>비동기적인 작업이나 여러 뮤테이션들을 연속적으로 호출하는 작업을 수행할 때 사용됩니다.</li>
<li>액션은 뮤테이션을 커밋하는 역할을 하며, 비동기 로직이나 비지역적인 상태 변경에 적합합니다.</li>
</ul>
</li>
<li><p>게터(Getter)</p>
<ul>
<li>스토어의 상태를 가져오거나 계산된 값을 반환하는데 사용됩니다.</li>
<li>게터는 컴포넌트에서 스토어의 상태를 읽을 때 유용합니다.</li>
</ul>
</li>
<li><p>모듈(Modules)</p>
<ul>
<li>큰 규모의 애플리케이션에서 코드의 구조를 단순화하기 위해 모듈을 사용할 수 있습니다.</li>
<li>모듈은 각자의 상태, 뮤테이션, 액션, 게터를 가지며, 하나의 스토어에 여러 모듈을 포함할 수 있습니다.</li>
</ul>
</li>
</ul>
<h3 id="vuecli">VueCLI</h3>
<ul>
<li><p>뷰 코어 인터페이스</p>
</li>
<li><p>Vue.js 프로젝트를 구성하고 개발할 수 있도록 도와주는 커맨드 라인 인터페이스</p>
</li>
<li><p>프로젝트의 초기 설정부터 빌드, 테스트, 배포까지 다양한 작업을 지원하며, 프로젝트를 효율적으로 관리</p>
<h4 id="주요기능">주요기능</h4>
</li>
<li><p>프로젝트 생성 및 설정</p>
<ul>
<li><code>vue create</code> 새로운 프로젝트 생성, 초기설정</li>
</ul>
</li>
<li><p>개발 서버 제공</p>
<ul>
<li><code>vue serve</code> 명령으로 로컬 개발 서버를 시작하여 실시간으로 변경 사항을 확인할 수 있습니다.</li>
</ul>
</li>
<li><p>빌드 및 번들링</p>
<ul>
<li><code>vue build</code> 명령으로 프로덕션 빌드를 생성하고 번들링할 수 있습니다.</li>
</ul>
</li>
<li><p>플러그인 관리</p>
<ul>
<li>Vue CLI를 확장하기 위한 플러그인을 추가하거나 삭제할 수 있습니다.</li>
</ul>
</li>
<li><p>ESLint 및 Prettier 지원</p>
<ul>
<li>코드 스타일 및 품질을 유지하기 위한 ESLint, Prettier 설정이 내장되어 있습니다.</li>
</ul>
</li>
<li><p>테스트 및 배포</p>
<ul>
<li>유닛 테스트와 E2E(End-to-End) 테스트를 실행하고, 배포를 위한 설정을 제공합니다.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="nuxtjs">Nuxt.js</h3>
<ul>
<li>Vue.js 기반의 프레임워크</li>
<li>Nuxt.js는 Vue.js의 생태계를 기반으로 하여 서버 사이드 렌더링, 정적 사이트 생성, 라우팅, 미들웨어, 상태 관리 등의 기능을 제공합니다.</li>
</ul>
<h4 id="주요-기능과-특징">주요 기능과 특징</h4>
<ul>
<li><p>서버 사이드 렌더링(SSR)</p>
<ul>
<li>초기 로딩 속도를 개선하고 검색 엔진 최적화를 강화할 수 있습니다.</li>
</ul>
</li>
<li><p>정적 사이트 생성(SSG)</p>
<ul>
<li>페이지를 미리 렌더링하여 정적인 HTML파일을 생성하는 정적 사이트를 지원합니다.</li>
<li>이를 통해 CDN(Content Delivery Nextwork)를 활용하여 성능을 최적화할 수 있습니다.<ul>
<li>CDN은 전 세계에 분산된 서버 네트워크를 활용하여 콘텐츠를 효율적으로 제공하는 서비스.<ul>
<li>로드 밸런싱을 수행하여 서버의 부하를 분산시키고 대규모 트래픽을 처리할 수 있습니다.</li>
<li>CDN은 콘텐츠를 전 세계의 서버에서 캐싱하여 사용자들이 요청할 때 로컬 서버에서 콘텐츠를 제공합니다. 이를 통해 콘텐츠의 로딩 시간을 줄이고 대역폭을 절약할 수 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>인티그레이티드 라우팅</p>
<ul>
<li>파일 시스템 기반의 라우팅 설정을 제공하여 라우팅을 쉽게 구현할 수 있습니다.</li>
<li>페이지의 구조를 기반으로 동적인 라우팅을 자동으로 처리합니다.</li>
</ul>
</li>
<li><p>미들웨어</p>
<ul>
<li>서버와 클라이언트에서 실행되는 미들웨어를 정의할 수 있습니다.</li>
<li>요청 처리 전에 특정한 작업을 수행하거나 페이지 렌더링 전에 데이터를 가공하는 등 다양한 용도로 활용됩니다.</li>
</ul>
</li>
<li><p>자동 코드 분할</p>
<ul>
<li>페이지 단위로 코드를 분할하여 필요한 코드만 클라이언트에 전달하게 되어 초기 로딩 시간을 최적화할 수 있습니다.</li>
</ul>
</li>
<li><p>상태관리</p>
<ul>
<li>Vue.js의 Vues를 기반으로 한 상태 관리를 지원합니다.</li>
<li>서버 사이드 렌더링 시에도 일관된 상태를 유지할 수 있습니다.</li>
</ul>
</li>
<li><p>플러그인 시스템</p>
<ul>
<li>플러그인을 손쉽게 추가하고 관리할 수 있는 플러그인 시스템이 있습니다.</li>
</ul>
</li>
<li><p>ESLint 및 Prettier 지원</p>
</li>
<li><p>프로젝트 생성하는 방법</p>
<ul>
<li><code>npm install -g create-nuxt-app</code></li>
<li><code>create-nuxt-app 프로젝트이름</code></li>
<li>설정 옵션 선택</li>
<li><code>cd 프로젝트이름</code></li>
<li><code>npm install</code></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Next.js란?]]></title>
            <link>https://velog.io/@m_moon_c/Next.js%EB%9E%80</link>
            <guid>https://velog.io/@m_moon_c/Next.js%EB%9E%80</guid>
            <pubDate>Sat, 30 Mar 2024 07:22:26 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>React 기반의 웹 애플리케이션을 쉽게 개발할 수 있도록 도와주는 프레임워크입니다.</p>
</li>
<li><p>Next.js는 React의 기능을 확장하고 보완하여 개발자들이 보다 효과적으로 웹 애플리케이션을 구축할 수 있도록 합니다.</p>
</li>
<li><p>주요 특징과 기능</p>
<ul>
<li>서버 사이드 렌더링(SSR)<ul>
<li>Next.js는 서버 측에서 React 컴포넌트를 실행하여 초기 HTML을 생성하므로 검색 엔진 최적화(SEO)를 개선하고 초기 로딩 속도를 향상시킵니다.</li>
</ul>
</li>
<li>정적 사이트 생성(SSG)<ul>
<li>빌드 시점에 페이지를 미리 렌더링하여 정적인 HTML파일을 생성하는 정적 사이트 생성을 지원합니다.<ul>
<li>이를 통해 빠른 페이지 로딩 속도와 안정적인 성능을 제공할 수 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li>데이터 미리 가져오기(Prefetching Data)<ul>
<li>페이지가 로드되기 전에 필요한 데이터를 미리 가져와서 성능을 최적화 합니다.</li>
<li>getStaticProps 또는 getServerSideProps와 같은 메서드를 사용하여 데이터를 미리 가져올 수 있습니다.</li>
</ul>
</li>
<li>동적 라우팅(Dynamic Routing)<ul>
<li>파일 시스템 기반의 동적 라우팅을 제공하여 간편하게 동적 URL을 처리할 수 있습니다.</li>
</ul>
</li>
<li>개발 환경 자동 설정<ul>
<li>개발 환경을 자동으로 설정하여 빠른 개발을 지원합니다.</li>
<li>Babel, Webpack, Hot Module Replacement 등의 도구들이 이미 설정되어 있습니다.</li>
</ul>
</li>
<li>CSS-in-JS 지원<ul>
<li>styled-components, Emotion 등의 라이브러리를 통해 스타일을 관리할 수 있습니다.</li>
</ul>
</li>
<li>API 라우팅<ul>
<li>API 엔드포인트를 쉽게 작성할 수 있는 API라우팅 기능을 제공합니다.</li>
<li>pages/api 디렉토리에 API엔드포인트를 작성하여 서버리스 함수를 만들 수 있습니다.<ul>
<li>타임스크립트 지원</li>
<li>TypeScript르 사용하여 타입 안정성을 확보할 수 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx란?]]></title>
            <link>https://velog.io/@m_moon_c/Nginx%EB%9E%80</link>
            <guid>https://velog.io/@m_moon_c/Nginx%EB%9E%80</guid>
            <pubDate>Sat, 30 Mar 2024 07:10:21 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>Nginx(엔진엑스)</p>
<ul>
<li>웹 서버 소프트웨어 및 리버스 프록시 서버로 널리 사용되는 오픈 소스 소프트웨어입니다.</li>
<li>Nginx는 높은 성능, 안정성, 간결한 설정, 확장성 등의 특징이 있습니다.</li>
<li>정적인 콘텐츠 제공, 로드 밸런싱, SSL/TLS 종단 간 암호화, 리버스 프록시 등의 기능을 수행하며, 동시에 다양한 모듈을 통해 다양한 작업을 수행할 수 있습니다.</li>
</ul>
</li>
<li><p>웹서버</p>
<ul>
<li>Nginx는 정적 파일 서비스 및 동적 웹 페이지 생성에 대한 역할을 수행하는 웹 서버로 사용됩니다.</li>
</ul>
</li>
<li><p>리버스 프록시</p>
<ul>
<li>Nginx는 클라이언트의 요청을 백엔드 서버에 전달하고, 백엔드 서버의 응답을 클라이언트에게 반환하여 로드 밸런싱 및 보안을 개선하는 데 사용됩니다.</li>
</ul>
</li>
<li><p>로드 밸런서</p>
<ul>
<li>여러 웹 서버나 애플리케이션 서버 사이에서 트래픽을 분산하여 부하를 분산시키는 로드 밸런싱 기능을 제공합니다.</li>
</ul>
</li>
<li><p>SSL/TLS 종단 간 암호화</p>
<ul>
<li>HTTPS를 통한 보안 연결을 제공하며, SSL/TLS 종단 간 암호화를 통해 데이터를 안전하게 전송할 수 있습니다.</li>
</ul>
</li>
<li><p>가상 호스팅</p>
<ul>
<li>하나의 서버에서 여러 도메인이나 서브도메인에 대한 가상 호스팅을 지원하여 하나의 물리적 서버로 여러 웹사이트를 운영할 수 있습니다.</li>
</ul>
</li>
<li><p>애플리케이션 프록시</p>
<ul>
<li>백엔드 애플리케이션 서버로의 요청 및 응답을 처리하여 애플리케이션을 안정적으로 운영할 수 있도록 돕습니다.</li>
</ul>
</li>
<li><p>고성능 및 저리소스 소비</p>
<ul>
<li>Nginx는 비동기 이벤트 기반 아키텍처를 사용하여 많은 연결을 동시에 처리할 수 있으며, 낮은 메모리 사용량으로 높은 성능을 제공합니다.</li>
</ul>
</li>
</ul>
<hr>
<p>Youtube에서 본 피케이의 Nginx에 대한 링크
<a href="https://www.youtube.com/watch?v=6FAwAXXj5N0&amp;t=489s">https://www.youtube.com/watch?v=6FAwAXXj5N0&amp;t=489s</a></p>
]]></description>
        </item>
    </channel>
</rss>