<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bi_sz.log</title>
        <link>https://velog.io/</link>
        <description>https://li-yo.tistory.com/          티스토리 블로그 이전 하였습니다.</description>
        <lastBuildDate>Mon, 03 Jun 2024 08:45:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bi_sz.log</title>
            <url>https://images.velog.io/images/bi-sz/profile/7ebe7c97-9dd9-49e5-8060-9e61da3a32b9/KakaoTalk_20200619_214212124.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bi_sz.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bi-sz" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Spring Boot] ResourceCloseHelper Class 생성 - 리소스 관리]]></title>
            <link>https://velog.io/@bi-sz/Spring-Boot-ResourceCloseHelper-Class-%EC%83%9D%EC%84%B1-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@bi-sz/Spring-Boot-ResourceCloseHelper-Class-%EC%83%9D%EC%84%B1-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Mon, 03 Jun 2024 08:45:09 GMT</pubDate>
            <description><![CDATA[<p><strong>Spring Boot</strong> 에서 사용한 유틸클래스여서 해당 카테고리에 넣었지만, <strong>Spring</strong> 에서도 적용 가능합니다!</p>
<p>아래의 유틸 클래스를 적용하여 생성한 클래스입니다.
<strong><code>BasicLogger 클래스</code></strong> - <a href="https://velog.io/@bi-sz/Spring-Boot-BasicLogger-Class-%EC%83%9D%EC%84%B1-%EB%94%94%EB%B2%84%EA%B9%85-%EC%A0%95%EB%B3%B4-%EA%B8%B0%EB%A1%9D-%EA%B4%80%EB%A6%AC">https://velog.io/@bi-sz/Spring-Boot-BasicLogger-Class</a></p>
<hr>
<h2 id="⭐-resourceclosehelperjava">⭐ ResourceCloseHelper.java</h2>
<p><code>Closeable</code>, <code>JDBC</code>, <code>Socket</code> 등의 <strong>리소스</strong>를 안전하게 닫아 <em>리소스 누수</em> 를 방지하고, 애플리케이션의 안정성을 높이기 위해 <strong>ResourceCloseHelper</strong> 클래스를 생성해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d9f746ad-646e-434e-b78e-79c8c07a8938/image.png" alt=""></p>
<p><strong><code>close(Closeable... resources</code></strong> </p>
<ul>
<li><strong>Closeable</strong>타입의 리소스 (<em>예: <code>InputStream</code>, <code>OutputStream</code> 등..</em>) 를 안전하게 닫습니다.</li>
<li><strong>IOException</strong>과 일반 <strong>Exception</strong>이 발생해도 무시하고 계속 진행합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/338d879d-0840-4a58-9a00-00f13519fd05/image.png" alt=""></p>
<p><strong><code>closeDBObjects(Wrapper... objects)</code></strong> </p>
<ul>
<li><strong>JDBC</strong> 관련 리소스(<code>ResultSet</code>, <code>Statement</code>, <code>Connection</code>)를 안전하게 닫습니다.</li>
<li><strong>SQLException</strong>과 일반 <strong>Exception</strong>이 발생해도 무시하고 계속 진행합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/ea42270a-8e42-4a46-96bd-53420517947a/image.png" alt=""></p>
<p><strong><code>closeSocketObjects(Socket socket, ServerSocket server)</code></strong> </p>
<ul>
<li><strong>Socket</strong>과 <strong>ServerSocket</strong> 리소스를 안전하게 닫습니다.</li>
<li><strong>IOException</strong>과 일반 <strong>Exception</strong>이 발생해도 무시하고 계속 진행합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/6badf0e5-38d1-471c-b9f7-62c23cc7be06/image.png" alt=""></p>
<p><strong><code>closeSockets(Socket... sockets)</code></strong> </p>
<ul>
<li><strong>Socket</strong> 리소스를 안전하게 닫습니다.</li>
<li><strong>IOException</strong>과 일반 <strong>Exception</strong>이 발생해도 무시하고 계속 진행합니다.</li>
</ul>
<pre><code class="language-java">package com.liyo.cmm.util;

import java.io.Closeable;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Wrapper;

public class ResourceCloseHelper {
    /**
     * Resource close 처리.
     * 
     * @param resources
     */
    public static void close(Closeable... resources) {
        for (Closeable resource : resources) {
            if (resource != null) {
                try {
                    resource.close();
                } catch (IOException ignore) {
                    BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
                } catch (Exception ignore) {
                    BasicLogger.ignore(&quot;Occurred Exception to close resource is ingored!!&quot;);
                }
            }
        }
    }

    /**
     * JDBC 관련 resource 객체 close 처리
     * 
     * @param objects
     */
    public static void closeDBObjects(Wrapper... objects) {
        for (Object object : objects) {
            if (object != null) {
                if (object instanceof ResultSet) {
                    try {
                        ((ResultSet) object).close();
                    } catch (SQLException ignore) {
                        BasicLogger.ignore(&quot;Occurred SQLException to close resource is ingored!!&quot;);
                    } catch (Exception ignore) {
                        BasicLogger.ignore(&quot;Occurred Exception to close resource is ingored!!&quot;);
                    }
                } else if (object instanceof Statement) {
                    try {
                        ((Statement) object).close();
                    } catch (SQLException ignore) {
                        BasicLogger.ignore(&quot;Occurred SQLException to close resource is ingored!!&quot;);
                    } catch (Exception ignore) {
                        BasicLogger.ignore(&quot;Occurred Exception to close resource is ingored!!&quot;);
                    }
                } else if (object instanceof Connection) {
                    try {
                        ((Connection) object).close();
                    } catch (SQLException ignore) {
                        BasicLogger.ignore(&quot;Occurred SQLException to close resource is ingored!!&quot;);
                    } catch (Exception ignore) {
                        BasicLogger.ignore(&quot;Occurred Exception to close resource is ingored!!&quot;);
                    }
                } else {
                    throw new IllegalArgumentException(&quot;Wrapper type is not found : &quot; + object.toString());
                }
            }
        }
    }

    /**
     * Socket 관련 resource 객체 close 처리
     * 
     * @param objects
     */
    public static void closeSocketObjects(Socket socket, ServerSocket server) {
        if (socket != null) {
            try {
                socket.shutdownOutput();
            } catch (IOException ignore) {
                BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
            } catch (Exception ignore) {
                BasicLogger.ignore(&quot;Occurred Exception to shutdown ouput is ignored!!&quot;);
            }

            try {
                socket.close();
            } catch (IOException ignore) {
                BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
            } catch (Exception ignore) {
                BasicLogger.ignore(&quot;Occurred Exception to close resource is ignored!!&quot;);
            }
        }

        if (server != null) {
            try {
                server.close();
            } catch (IOException ignore) {
                BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
            } catch (Exception ignore) {
                BasicLogger.ignore(&quot;Occurred Exception to close resource is ignored!!&quot;);
            }
        }
    }

    /**
     * Socket 관련 resource 객체 close 처리
     * 
     * @param sockets
     */
    public static void closeSockets(Socket... sockets) {
        for (Socket socket : sockets) {
            if (socket != null) {
                try {
                    socket.shutdownOutput();
                } catch (IOException ignore) {
                    BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
                } catch (Exception ignore) {
                    BasicLogger.ignore(&quot;Occurred Exception to shutdown ouput is ignored!!&quot;);
                }

                try {
                    socket.close();
                } catch (IOException ignore) {
                    BasicLogger.ignore(&quot;Occurred IOException to close resource is ingored!!&quot;);
                } catch (Exception ignore) {
                    BasicLogger.ignore(&quot;Occurred Exception to close resource is ignored!!&quot;);
                }
            }
        }
    }
}</code></pre>
<p><strong>JDBC</strong>와 <strong>Socket</strong> 관련 리소스 관리에 유용한 <code>ResourceCloseHelper</code> 클래스를 정리해보았습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring Boot] BasicLogger  Class 생성 - 디버깅, 정보 기록 관리]]></title>
            <link>https://velog.io/@bi-sz/Spring-Boot-BasicLogger-Class-%EC%83%9D%EC%84%B1-%EB%94%94%EB%B2%84%EA%B9%85-%EC%A0%95%EB%B3%B4-%EA%B8%B0%EB%A1%9D-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@bi-sz/Spring-Boot-BasicLogger-Class-%EC%83%9D%EC%84%B1-%EB%94%94%EB%B2%84%EA%B9%85-%EC%A0%95%EB%B3%B4-%EA%B8%B0%EB%A1%9D-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Mon, 03 Jun 2024 08:35:11 GMT</pubDate>
            <description><![CDATA[<p><strong>Spring Boot</strong> 프로젝트에 사용하여서 <strong>Spring Boot</strong> 카테고리에 있지만 <strong>Spring</strong> 에서도 적용 가능한 유틸 클래스입니다.</p>
<h2 id="⭐-basiclogger">⭐ BasicLogger</h2>
<p>애플리케이션의 <strong>디버깅</strong>, <strong>정보 기록</strong> 등을 체계적으로 관리하기 위해 <strong>로깅 레벨</strong>을 정의하고, 각 레벨에 해당하는 <strong>로거</strong>를 제공하는 <strong>BasicLogger</strong> 클래스를 생성해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/050ab6ba-42da-42a2-a081-4f33789f014c/image.png" alt=""></p>
<p><strong><code>ignore</code></strong></p>
<ul>
<li>기록이나 처리가 불필요한 경우 사용합니다.</li>
<li>메시지와 예외를 로깅합니다.</li>
</ul>
<p><strong><code>debug(String message, Exception exception)</code></strong></p>
<ul>
<li>디버그 정보를 기록하는 경우 사용합니다.</li>
<li>메시지와 예외를 로깅합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/bcc9b56c-41cd-43f4-bdda-24b5252e67a6/image.png" alt=""></p>
<p><strong><code>debug(String message)</code></strong></p>
<ul>
<li>디버그 정보를 기록하는 경우 사용합니다.</li>
<li>메시지만 로깅합니다.</li>
</ul>
<p><strong><code>info(String message)</code></strong></p>
<ul>
<li>일반적인 정보를 기록하는 경우 사용합니다.</li>
<li>메시지를 로깅합니다.</li>
</ul>
<pre><code class="language-java">package com.liyo.cmm.util;

import java.util.logging.Level;
import java.util.logging.Logger;

public class BasicLogger {
    private static final Level IGNORE_INFO_LEVEL = Level.OFF;
    private static final Level DEBUG_INFO_LEVEL = Level.FINEST;
    private static final Level INFO_INFO_LEVEL = Level.INFO;

    private static final Logger ignoreLogger = Logger.getLogger(&quot;ignore&quot;);
    private static final Logger debugLogger = Logger.getLogger(&quot;debug&quot;);
    private static final Logger infoLogger = Logger.getLogger(&quot;info&quot;);

    /**
     * 기록이나 처리가 불필요한 경우 사용.
     * @param message
     * @param exception
     */
    public static void ignore(String message, Exception exception) {
        if (exception == null) {
            ignoreLogger.log(IGNORE_INFO_LEVEL, message);
        } else {
            ignoreLogger.log(IGNORE_INFO_LEVEL, message, exception);
        }
    }

    /**
     * 기록이나 처리가 불필요한 경우 사용.
     * @param message
     * @param exception
     */
    public static void ignore(String message) {
        ignore(message, null);
    }

    /**
     * 디버그 정보를 기록하는 경우 사용.
     * @param message
     * @param exception
     */
    public static void debug(String message, Exception exception) {
        if (exception == null) {
            debugLogger.log(DEBUG_INFO_LEVEL, message);
        } else {
            debugLogger.log(DEBUG_INFO_LEVEL, message, exception);
        }
    }

    /**
     * 디버그 정보를 기록하는 경우 사용.
     * @param message
     * @param exception
     */
    public static void debug(String message) {
        debug(message, null);
    }

    /**
     * 일반적이 정보를 기록하는 경우 사용.
     * @param message
     * @param exception
     */
    public static void info(String message) {
        infoLogger.log(INFO_INFO_LEVEL, message);
    }
}
</code></pre>
<p>로깅 레벨을 체계적으로 관리하여 애플리케이션의 <code>디버깅</code>, <code>모니터링</code>, <code>문제 해결</code> 등에 유용하게 사용될 수 있는 로깅 유틸 클래스를 정리해보았습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 환경변수 설정]]></title>
            <link>https://velog.io/@bi-sz/Vue-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@bi-sz/Vue-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Thu, 23 May 2024 08:25:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bi-sz/post/15836916-aa43-403f-b736-c24eab4d119a/image.png" alt=""></p>
<p>&#39;vue&#39;은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/e335c401-23ae-4222-8ba6-452da8337f2b/image.png" alt=""></p>
<pre><code>&gt; npm install -g @vue/cli</code></pre><p><code>Vue</code> 프로젝트를 생성하기 위해 <code>vue</code> 를 <strong>install</strong> 한 후 버전을 확인해보니 명령어 실행이 불가능하였다.</p>
<p>환경변수 설정을 하지 않아 <code>vue</code> 경로를 찾지 못하는 경우이다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1d274d1c-814a-434f-bd05-713931695b32/image.png" alt=""></p>
<p><code>C:\Users\사용자\AppData\Roaming\npm</code> 경로에 <strong><code>Vue</code></strong> 가 설치되어있다.</p>
<hr>
<h2 id="환경변수-설정하기">환경변수 설정하기</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d3947621-9d65-4567-a21b-5b188b2aa3f7/image.png" alt=""></p>
<h3 id="1-윈도우11-기준-검색창에-환경을-검색해서-시스템-환경-변수-편집-을-열어줍니다">1. 윈도우11 기준 검색창에 환경을 검색해서 <code>시스템 환경 변수 편집</code> 을 열어줍니다.</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/339e123c-66f3-415f-bf8e-b81fbb9edebc/image.png" alt=""></p>
<h3 id="2-환경-변수로-들어가줍니다">2. 환경 변수로 들어가줍니다.</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7a30d3c2-7eec-48e1-b11c-99427a99a15d/image.png" alt=""></p>
<h3 id="3-시스템-변수의-path-를-눌러줍니다">3. 시스템 변수의 <code>Path</code> 를 눌러줍니다.</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/2c579595-d095-4675-ad62-fdf7c36adf67/image.png" alt=""></p>
<h3 id="4-vue-경로를-추가해줍니다">4. vue 경로를 추가해줍니다.</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1ee1639f-7732-4296-9bf1-ce5b36aec792/image.png" alt=""></p>
<p>cmd 관리자 권한에서 명령어를 입력하면 실행됩니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/9f6bfb75-4b36-4685-b8f5-8a63fdd3381b/image.png" alt=""></p>
<p>vsCode에서는 여전히 실행이 안 되서 결국 컴퓨터를 재부팅하니까 됐습니다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[
[Window] AGSService.exe 서비스 사용 안 함 설정]]></title>
            <link>https://velog.io/@bi-sz/Window-AGSService.exe-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%82%AC%EC%9A%A9-%EC%95%88-%ED%95%A8-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@bi-sz/Window-AGSService.exe-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%82%AC%EC%9A%A9-%EC%95%88-%ED%95%A8-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 10 May 2024 00:46:01 GMT</pubDate>
            <description><![CDATA[<p>윈도우가 반복적으로 멈추거나 버벅이는 것 같아서 이벤트 뷰어를 봤더니 오류 투성이다 .. </p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/5f79585c-cc87-43ea-8ce1-f3c759f0be53/image.png" alt=""></p>
<p>다음 오류로 인해 <strong>AGSService</strong> 서비스를 시작하지 못했습니다. 
서비스가 시작이나 제어 요청에 빠르게 응답하지 않았습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/6d259d21-4169-4451-a0ad-91cc114fd99e/image.png" alt=""></p>
<p>AGSService 서비스 연결을 기다리는 동안 제한 시간에 도달했습니다(45000밀리초).</p>
<hr>
<h2 id="agsserviceexe">AGSService.exe</h2>
<p>해당 파일은 <code>Adobe</code>에서 제공하는 <code>Adobe</code> 제품군 라이센스, 인증 관련 프로그램이다.</p>
<p><strong>System Service</strong>로 윈도우가 시작할 때마다 자동으로 실행된다.
서비스 이름은 <strong>AGSService</strong> 이다.</p>
<h2 id="서비스-중지하기">서비스 중지하기</h2>
<p><strong>cmd</strong>에서 다음 명령어를 통해 서비스를 사용 안 함으로 변경해준다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/ccc8badc-0abc-405d-ab46-00046d5b27a3/image.png" alt=""></p>
<pre><code class="language-shell">&gt; sc stop &quot;AGSService&quot;
&gt; sc config &quot;AGSService&quot; start= disabled</code></pre>
<p>서비스 실행을 종료하고, 부팅시 실행되지 않도록 설정을 변경해주었습니다.</p>
<p>오류로 인해 실행되지 못해서 서비스가 시작되지도 못 했네요..</p>
<hr>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/da6b9367-5a97-4232-99d1-33b822fb071e/image.png" alt=""></p>
<p>명령프롬포트에서 적용이 안 되는 경우 서비스에서 해당 항목을 우클릭하여 서비스를 중지하고, 시작유형을 사용 안 함 으로 설정해주면 된다.</p>
<hr>
<h2 id="완전-삭제하기">완전 삭제하기</h2>
<pre><code class="language-shell">&gt; sc delete &quot;AGSService&quot;</code></pre>
<p>해당 명령어로 서비스를 완전히 삭제할 수 있다.</p>
<p>서비스가 실행중인 상태에서는 재부팅을 해야 적용되며, 종료된 상태에서는 바로 적용된다.</p>
<p>혹시나 삭제가 안 된다면, 명령 프롬포트를 관리자 권한으로 실행했는지 확인!</p>
<hr>
<p>저는 <strong>Adobe</strong> 를 사용하고있지 않아서 서비스는 자동 실행되지 않도록 설정하고, 완전 삭제하지는 않았습니다.</p>
<p>언제 사용하게될 지 모르니,, 하지만 당분간은 사용할 일 없을듯.. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[정보처리기사] 실기대비 내용 정리 (2)]]></title>
            <link>https://velog.io/@bi-sz/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0%EB%8C%80%EB%B9%84-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC-2</link>
            <guid>https://velog.io/@bi-sz/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0%EB%8C%80%EB%B9%84-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC-2</guid>
            <pubDate>Mon, 15 Apr 2024 08:08:50 GMT</pubDate>
            <description><![CDATA[<h1 id="🌟-인증기술의-유형">🌟 인증기술의 유형</h1>
<ul>
<li><strong><code>지식 기반 인증</code></strong> : 사용자가 기억하고 있는 지식 <strong>( ID / PW )</strong></li>
<li><strong><code>소지 기반 인증</code></strong> : 소지하고 있는 사용자 물품 <strong>( 공인인증서 / OTP )</strong></li>
<li><strong><code>생체 기반 인증</code></strong> : 고유한 사용자의 생체 정보 <strong>( 홍채 / 정맥 / 얼굴 / 지문 )</strong></li>
<li><strong><code>특징 기반 인증</code></strong> : 사용자의 특징을 활용 <strong>( 서명 / 발걸음 / 몸짓 )</strong></li>
</ul>
<hr>
<h1 id="🌟-서버-프로그램-구현">🌟 서버 프로그램 구현</h1>
<ul>
<li><strong><code>프론트엔드(Front-end)</code></strong> : 화면 구현</li>
<li><strong><code>백엔드(Back-end)</code></strong> : DTO/VO 구현 -&gt; SQL문 구현 -&gt; DAO 구현 -&gt; Service 구현 -&gt; Controller 구현</li>
</ul>
<hr>
<h1 id="🌟-eai-구축-유형">🌟 EAI 구축 유형</h1>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0715a6d7-cf6c-4c58-9dcb-ee8760bea073/image.png" alt=""></p>
<h3 id="✡️-포인트-투-포인트point-to-point">✡️ 포인트 투 포인트(Point-to-Point)</h3>
<ul>
<li>가장 기초적인 애플리케이션 통합 방법</li>
<li>1:1 단순 통합 방법<h3 id="✡️-허브-앤-스포크hub--spoke">✡️ 허브 앤 스포크(Hub &amp; Spoke)</h3>
</li>
<li>단일한 접점의 허브 시스템을 통하여 데이터를 전송하는 중앙 집중식 방식<h3 id="✡️-메시지-버스message-bus">✡️ 메시지 버스(Message Bus)</h3>
</li>
<li>애플리케이션 사이 미들웨어(버스)를 두어 연계하는 미들웨어 통합 방식</li>
<li>뛰어난 확장성과 대용량 데이터 처리 가능<h3 id="✡️-하이브리드hybrid">✡️ 하이브리드(Hybrid)</h3>
</li>
<li>그룹 내부는 허브 앤 스포크, 그룹 간에는 메시지 버스 방식</li>
</ul>
<hr>
<h1 id="🌟-스크럼-scrum">🌟 스크럼 (SCRUM)</h1>
<ul>
<li>매일 정해진 시간, 장소에서 짧은 시간의 개발을 하는 팀을 위한 프로젝트 관리 중심 방법론</li>
<li><strong><code>스트린트 (Sprint)</code></strong> : 2~4 주의 짧은 개발 기간</li>
<li><strong><code>번 다운 차트 (Burn Down Chart)</code></strong> : 백로그 대비 시간을 그래픽 적으로 표현한 차트 </li>
</ul>
<hr>
<h1 id="🌟-서비스-지향-아키텍처--soa--service-oriented-architecture-">🌟 서비스 지향 아키텍처 ( SOA : Service Oriented Architecture )</h1>
<ul>
<li>프로세스 수행을 지원하는 정보 시스템의 구현을 위해 <strong>가장 선진화된 소프트웨어 아키텍처</strong></li>
<li>서비스라고 정의되는 분할된 애플리케이션 조각들을 <code>Loosely-coupled</code> 하게 연결해 하나의 완성된 <strong>Application</strong> 구현</li>
</ul>
<hr>
<h1 id="🌟-피코넷--piconet-">🌟 피코넷 ( PICONET )</h1>
<ul>
<li>여러개의 독립된 통신 장치가 블루투스 기술이나 UWB 통신 기술을 사용하여 통신망을 형성하는 무선 네트워크 기술 </li>
</ul>
<blockquote>
<p>*<em>특징 *</em></p>
</blockquote>
<ul>
<li>네트워크를 구성하는 장비 간에 사전에 네트워크의 정의와 계획이 없이 상황에 따라 조정 프로토콜에 의하여 <code>마스터와 슬레이브의 역할</code>을 하면서 네트워크를 형성</li>
<li>주로 수십미터 이내의 <code>좁은 공간</code>에서 네트워크를 형성</li>
<li><code>정지</code> 또는 <code>이동</code>하고 있는 장치를 모두 포함</li>
</ul>
<hr>
<h1 id="🌟-지그비--zigbee-">🌟 지그비 ( Zigbee )</h1>
<ul>
<li><strong>저속 전송 속도</strong>를 갖는 <strong>홈 오토메이션</strong> 및 네트워크를 위한 표준 기술</li>
<li>버튼 하나로 하나의 동작을 잡아 집안 어느 곳에서나 전등 제어 및 홈 보안시스템 VCR on/off </li>
<li>인터넷을 통한 전화 접속으로 홈 오토메이션을 더욱 편리하게 이용하려는 것에서 부터 출발한 기술</li>
<li><strong>IEEE 802.15</strong> 표준 기반, <strong>메시 네트워크</strong> 방식 사용</li>
</ul>
<hr>
<h1 id="🌟-리뷰의-유형">🌟 리뷰의 유형</h1>
<h3 id="✡️-동료-검토-peer-reiview">✡️ 동료 검토 (Peer Reiview)</h3>
<ul>
<li>2~3 명이 진행하는 리뷰의 형태로 <strong>작성자</strong>가 <strong>요구사항 명세서</strong>를 설명하고, <strong>이해관계자들</strong>이 <strong>설명</strong>을 들으면서 <strong>결함을 발견</strong>하는 형태로 진행하는 검토 기법</li>
</ul>
<h3 id="✡️-워크스루-work-through">✡️ 워크스루 (Work Through)</h3>
<ul>
<li>검토 자료를 <strong>회의 전에 배포</strong>해서 <strong>사전 검토</strong>한 후 짧은 시간 동안 회의를 진행하는 형태 </li>
<li>리뷰를 통해 오류를 검출하고 문서로 만드는 기법</li>
</ul>
<h3 id="✡️-인스펙션-inspection">✡️ 인스펙션 (Inspection)</h3>
<ul>
<li>소프트웨어 요구, 설계, 원시 코드 등의 저작자 외의 다른 전문가 또는 팀이 검사하여 오류를 찾아내는 공식적 검토 </li>
</ul>
<hr>
<h1 id="🌟-json">🌟 JSON</h1>
<ul>
<li><code>&quot;속성-값 쌍&quot;</code>, <code>&quot;키-값 쌍&quot;</code> 으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 <strong>개방형 표준 표맷</strong></li>
</ul>
<blockquote>
</blockquote>
<p><strong>JSON의 주요 특징</strong></p>
<blockquote>
</blockquote>
<ul>
<li><strong>AJAX (Asynchronous JavaScript and XML)</strong> 에서 많이 사용</li>
<li><strong>XML(eXtensible Markup Language)을 대체</strong>하는 주요 데이터 포맷</li>
<li>언어 독립형 데이터 포맷으로 다양한 데이터 프로그래밍 언어에서 사용</li>
<li>사람이 읽고 쓰기에 쉬우며, 기계가 분석하고 생성하기에 용이</li>
</ul>
<hr>
<h1 id="🌟-요구사항-명세-단계-주요-기법">🌟 요구사항 명세 단계 주요 기법</h1>
<h3 id="✡️-비정형-명세기법">✡️ 비정형 명세기법</h3>
<ul>
<li>사용자의 요구를 표현할 때 <strong>자연어</strong>를 기반으로 서술하는 기법</li>
<li>사용자와 개발자의 이해가 용이</li>
<li>명확성 및 검증에 문제</li>
</ul>
<h3 id="✡️-정형-명세기법">✡️ 정형 명세기법</h3>
<ul>
<li>사용자의 요구를 표현할 때 <strong>수학적인 원리와 표기법</strong>으로 서술하는 기법</li>
<li>정형 명세 언어인 <strong>Z-스키마</strong>, <strong>Petri-Net</strong>, <strong>상태 차트</strong> 활용</li>
<li>표현이 간결하고 명확성 및 검증에 용이</li>
<li>기법의 이해가 어려움</li>
</ul>
<hr>
<h1 id="🌟-vtlvirtual-tape-library">🌟 VTL(Virtual Tape Library)</h1>
<ul>
<li>대용량 백업 및 데이터 소산에 강점이 있는 <strong>테이프 방식</strong>의 장점을 취하기 위해서 디스크를 <strong>가상의 테이프 미디어로 모방</strong>하는 방식</li>
</ul>
<hr>
<h1 id="🌟-가상화-백업">🌟 가상화 백업</h1>
<ul>
<li>하이퍼바이저에서 관리되는 <strong>가상서버(VM)</strong>의 <strong>이미지 파일</strong>을 백업하는 방식으로 백업환경을 백업 에이전트 중심의 가상화 서버 또는 프록시 서버 레벨에서 <strong>SW와 HW를 일체형</strong>으로 통합 구축하는 방식</li>
</ul>
<hr>
<h1 id="🌟-디지털-포렌식">🌟 디지털 포렌식</h1>
<ul>
<li><p>범죄 행위에 대한 사실을 사법기관에 제출하기 위해 디지털 증거자료를 획득, 분석, 보관, 제출, 기록하는 일련의 과정을 지침</p>
</li>
<li><p>원칙으로는 <strong><code>정당성</code></strong>, <strong><code>재현성</code></strong>, <strong><code>연계성</code></strong>, <strong><code>신속성</code></strong>, <strong><code>무결성</code></strong></p>
</li>
</ul>
<hr>
<h1 id="🌟-개발환경-인프라-구성방식">🌟 개발환경 인프라 구성방식</h1>
<h3 id="✡️-온프레미스on-premise-방식">✡️ 온프레미스(On-Premise) 방식</h3>
<ul>
<li><p><strong>외부 인터넷망이 차단</strong>된 상태에서 <strong>인트라넷 망</strong>만을 활용하여 개발환경을 구축하는 방식</p>
</li>
<li><p>데이터와 정보의 외부 유출이 민감한 경우 해당 장비를 자체 구매하고 특정 공간에 개발환경을 구축</p>
</li>
</ul>
<h3 id="✡️-클라우드cloud-방식">✡️ 클라우드(Cloud) 방식</h3>
<ul>
<li>아마존, 구글, 마이크로소프트 등 클라우드 공급 서비스를 하는 회사들의 서비스를 임대하여 개발환경 구축</li>
</ul>
<h3 id="✡️-하이브리드hybrid-방식">✡️ 하이브리드(Hybrid) 방식</h3>
<ul>
<li>온프레미스와 클라우드 방식을 혼용하는 방식</li>
</ul>
<hr>
<h1 id="🌟-분석-자동화-도구-case">🌟 분석 자동화 도구 CASE</h1>
<blockquote>
<p><strong>상위 CASE</strong>  </p>
</blockquote>
<ul>
<li>계획 수립 요구분석, 기본 설계 단계를 다이어그램으로 표현</li>
<li>모델들 사이의 모순 검사 및 모델의 오류 검증, 일관성 검증 지원</li>
<li>자료 흐름도 프로토타이핑 작성 지원 및 UI 설계 지원</li>
</ul>
<blockquote>
<p><strong>하위 CASE</strong></p>
</blockquote>
<ul>
<li>구문 중심 편집 및 정적/동적 테스트 지원</li>
<li>시스템 명사서 생성 및 소스코드 생성 지원</li>
</ul>
<hr>
<h1 id="🌟-dao-data-access-object">🌟 DAO (Data Access Object)</h1>
<ul>
<li>특정 타입의 테이터베이스에 추상 인터페이스를 제공하는 객체로 세부내용 노출없이 데이터를 조작하는 객체</li>
</ul>
<hr>
<h1 id="🌟-dto-data-transfer-object">🌟 DTO (Data Transfer Object)</h1>
<ul>
<li>프로세스 사이에서 데이터를 전송하는 객체로 데이터 저장, 회수 외에 다른 기능이 없는 객체</li>
</ul>
<hr>
<h1 id="🌟-vo-value-object">🌟 VO (Value Object)</h1>
<ul>
<li>간단한 엔티티를 의미하는 작은 객체</li>
<li>가변 클래스인 DTO와 달리 고정 클래스를 가지는 객체</li>
</ul>
<hr>
<h1 id="🌟-외부-단편화를-해결하기-위한-기법">🌟 외부 단편화를 해결하기 위한 기법</h1>
<h3 id="✡️-버디-메모리-할당-budy-memory-allocation">✡️ 버디 메모리 할당 (Budy Memory Allocation)</h3>
<ul>
<li>요청한 프로세스 크기에 가장 알맞은 크기를 할당하기 위해 메모리를 <strong>2ⁿ</strong>의 크기로 분할하여 메모리를 할당하는 기법</li>
</ul>
<h3 id="✡️-통합-coalescing">✡️ 통합 (Coalescing)</h3>
<ul>
<li>인접한 단편화 영역을 찾아 하나로 통합하는 기법</li>
</ul>
<h3 id="✡️-압축-compation">✡️ 압축 (Compation)</h3>
<ul>
<li>메모리의 모든 단편화 영역을 하나로 압축하는 기법</li>
</ul>
<hr>
<h1 id="🌟-hipo-차트의-종류">🌟 HIPO 차트의 종류</h1>
<ul>
<li><strong><code>가시적 도표(Visual Table of Contents)</code></strong> : 시스템의 <strong>전체적인 기능과 흐름</strong>을 보여주는 <strong>계층(Tree) 구조도</strong></li>
<li><strong><code>총체적 도표(OverView Diagram)</code></strong> : 프로그램을 구성하는 <strong>기능을 기술</strong>한 것으로, 입력, 처리, 출력에 대한 전반적인 정보를 제공하는 도표</li>
<li><strong><code>세부적 도표(Detail Diagram)</code></strong> : 총체적 도표에 표시된 기능을 구성하는 기본 요소들을 <strong>상세히 기술</strong>하는 도표</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[정보처리기사] 실기대비 내용 정리 (1)]]></title>
            <link>https://velog.io/@bi-sz/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0%EB%8C%80%EB%B9%84-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@bi-sz/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0%EB%8C%80%EB%B9%84-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Thu, 11 Apr 2024 07:44:59 GMT</pubDate>
            <description><![CDATA[<h1 id="🌟-데이터-흐름도-dfd--data-flow-diagram">🌟 데이터 흐름도 (DFD : Data Flow Diagram)</h1>
<ul>
<li>데이터 흐름도(DFD)는 시스템 구성요소인 프로세스와 프로세스 간 <strong>데이터 흐름</strong>을 표현하는 주요 도구</li>
<li>자료 흐름 그래프 또는 <strong>버블(Bubble)</strong>차트라고 부르기도 함</li>
<li><strong>구조적 분석 기법</strong>에 사용</li>
<li>자료 흐름과 기능을 자세히 표현하기 위해 단계적으로 세분화</li>
</ul>
<h2 id="💫-데이터-흐름도-구성-요소">💫 데이터 흐름도 구성 요소</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a251237b-b6db-4cd2-883b-d9166fbc7f13/image.png" alt=""></p>
<ul>
<li><strong><code>처리기 (Process)</code></strong> : 입력된 데이터를 원하는 형태로 변환하여 출력하기 위한 과정 / <strong><code>원(○)</code></strong>으로 표시</li>
<li><strong><code>데이터 흐름 (Data Flow)</code></strong> : DFD의 구성요소들 간의 주고받는 <strong>데이터 흐름</strong> / <strong><code>화살표(→)</code></strong>로 표시</li>
<li><strong><code>데이터 저장소 (Data Store)</code></strong> : 데이터가 저장된 장소 / <strong><code>평핸선(=)</code></strong>으로 표시</li>
<li><strong><code>단말 (Terminator)</code></strong> : 프로세스 처리과정에서 데이터가 발생하는 시작과 종료를 나타냄 / <strong><code>사각형(□)</code></strong>으로 표시</li>
</ul>
<hr>
<h1 id="🌟-데이터-모델링-절차">🌟 데이터 모델링 절차</h1>
<p><strong><code>요구사항 분석</code></strong> -&gt; <strong><code>개념 모델링</code></strong> -&gt; <strong><code>논리 모델링</code></strong> -&gt; <strong><code>물리 모델링</code></strong></p>
<h3 id="✡️-요구사항-분석">✡️ 요구사항 분석</h3>
<ul>
<li>데이터 모델링 작업을 시작하기 전, 시스템 또는 애플리케이션의 요구사항 분석</li>
<li>필요한 데이터와 해당 데이터의 속성, 관계 등을 이해하고 문서화</li>
</ul>
<h3 id="✡️-개념-모델링">✡️ 개념 모델링</h3>
<ul>
<li>요구사항을 기반으로 개념적 모델을 구축</li>
<li>개념적 모델은 엔티티와 엔티티 간의 관계를 나타내는 <strong>엔티티-관계 다이어그램(ERD)</strong> 으로 표현</li>
</ul>
<h3 id="✡️-논리-모델링">✡️ 논리 모델링</h3>
<ul>
<li>개념적 모델을 바탕으로 논리적 모델 개발</li>
<li>논리적 모델은 개념적 모델을 데이터베이스 시스템의 특정 구현 방식에 맞게 변환</li>
<li>엔티티를 테이블로 변환하고, 속성을 열(Column)로 매핑</li>
<li>관계를 외래 키(Foreign Key)로 표현하여 테이블 간의 관계 설정</li>
</ul>
<h3 id="✡️-물리-모델링">✡️ 물리 모델링</h3>
<ul>
<li>논리적 모델을 기반으로 물리적 모델 설계</li>
<li>물리적 모델은 실제 데이터베이스 시스템에서 사용될 구조 정의</li>
<li>테이블 간의 관계, 인덱스, 제약조건 등을 정의</li>
<li>각 열의 데이터 유형, 크기, 제약조건 등을 명시</li>
</ul>
<hr>
<h1 id="🌟-isoiec-9216isoiec-25010--2011로-변경의-소프트웨어-품질-특성">🌟 ISO/IEC 9216(ISO/IEC 25010 : 2011로 변경)의 소프트웨어 품질 특성</h1>
<h3 id="✡️-기능성-functionality">✡️ 기능성 (Functionality)</h3>
<ul>
<li>명시된 요구와 내제된 요구를 만족하는 기능 제공 </li>
</ul>
<h3 id="✡️-신뢰성-reliability">✡️ 신뢰성 (Reliability)</h3>
<ul>
<li>명시된 조건에서 사용될 때 성능 수준을 유지할 수 있는 소프르웨어 제품의 능력</li>
<li>옳고 일관된 결과를 얻기 위하여 요구된 기능을 수행할 수 있는 정도</li>
<li>주어진 시간동안 주어진 기능을 오류없이 수행하는 정도</li>
</ul>
<h3 id="✡️-사용성-usability">✡️ 사용성 (Usability)</h3>
<ul>
<li>사용자에 의해 이해되고, 학습되고, 사용되고 성호될 수 잇는 소프트웨어 제품의 능력</li>
</ul>
<h3 id="✡️-효율성-efficiency">✡️ 효율성 (Efficiency)</h3>
<ul>
<li>사용되는 자원의 양에 따라 요구된 선능을 제공하는 소프트웨어 제품의 능력</li>
</ul>
<h3 id="✡️-유지보수성-maintainability">✡️ 유지보수성 (Maintainability)</h3>
<ul>
<li>환경과 요구사항 및 기능적 명세에 따른 소프트웨어의 수정, 개선 혹은 개작 포함 </li>
</ul>
<h3 id="✡️-이식성-portability">✡️ 이식성 (Portability)</h3>
<ul>
<li>한 환경에서 다른 환경으로 전이될 수 있는 소프트웨어 제품의 능력</li>
</ul>
<hr>
<h1 id="🌟-데크-duquedouble-ended-ended-queue">🌟 데크 (Duque:Double Ended Ended Queue)</h1>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/146e9fdd-ac07-4303-a342-d45c792f6537/image.png" alt=""></p>
<p>큐의 양쪽 끝에서 삽입과 삭제를 할 수 있는 구조</p>
<hr>
<h1 id="🌟-uwd-ultra-wide-band--초광대역-무선">🌟 UWD (Ultra Wide Band : 초광대역 무선)</h1>
<ul>
<li><strong>중심 주파수의 20% 이상</strong>의 점유 대역폭을 가지는 신호, 또는 점유 대역폭과 상관없이 <strong>500MHz 이상</strong>의 대역폭을 갖는 <strong>신호와 수 GHz 대의 초광대역</strong>을 사용하는 <em>초고속의 무선 데이터 전송기술</em></li>
</ul>
<hr>
<h1 id="🌟-킬-스위치-kill-switch">🌟 킬 스위치 (kill Switch)</h1>
<ul>
<li>스마트폰 이용자가 도난당한 스마트폰의 작동을 웹사이트를 통해 정지할 수 있도록 하는 일종의 자폭 기능</li>
<li>스마트폰의 유통, 도난이나 분실을 어느 정도 막을 수 있음</li>
<li>원격 잠금, 개인 정보 삭제 기능 등이 있으며 단말기의 펌웨어나 운영체제에 탑재</li>
</ul>
<hr>
<h1 id="🌟-검증과-확인">🌟 검증과 확인</h1>
<h2 id="💫-검증-verification">💫 검증 (Verification)</h2>
<ul>
<li>소프트웨어 <strong>개발 과정</strong>을 테스트</li>
<li>올바른 제품을 <em>생산</em> 하고 있는지 <em>검증</em></li>
<li>이전 단계에서 설정된 개발규격과 요구충족 판단</li>
<li><strong>개발자 혹은 시험자</strong>의 시각으로 소프트웨어가 명세화된 기능을 올바로 수행하는지 알아보는 과정<h2 id="💫-확인-validation">💫 확인 (Validation)</h2>
</li>
<li>소프트웨어 <strong>결과</strong>를 테스트</li>
<li><em>만들어진</em> 제품이 제대로 <em>동작</em> 하는지 <em>확인</em></li>
<li>최종 사용자 요구 또는 소프트웨어 요구에 적합한지 판단</li>
<li><strong>사용자</strong> 시각으로 올바른 소프트웨어가 개발되었는지 <em>입증</em> 하는 과정</li>
</ul>
<hr>
<h1 id="🌟-자료-사전-data-dictionary--dd">🌟 자료 사전 (Data Dictionary : DD)</h1>
<ul>
<li>데이터 흐름도(Data Flow Diagram) 에 기술된 자료들에 대해 정의하는 것 </li>
</ul>
<h2 id="💫-자료사전-기호">💫 자료사전 기호</h2>
<p><code>=</code> : 정의 (is conposed of)
<code>+</code> : 연결 (and)
<code>{}</code> : 반복 (interation of)
<code>[]</code> : 선택 (choose only one of)
<code>()</code> : 생략 (optional)
<code>**</code>  : 주석 (comment)</p>
<h2 id="💫-자료사전-작성-목적">💫 자료사전 작성 목적</h2>
<ul>
<li>조직에 속해잇는 다은 사람들에게 특정한 자료 용어가 무엇을 의미하는지를 알려주기 위해 용어의 정의를 조정하고, 취합하고 문서로 명확히 하는 목적 </li>
</ul>
<hr>
<h1 id="🌟-zing-초고속-근접-무선통신기술">🌟 Zing (초고속 근접 무선통신기술)</h1>
<ul>
<li>기기를 키오스크에 갖다 대면 원하는 데이터를 바로 가져올 수 있는 기술</li>
<li>10cm 이내 근접 거리에서 기가급 속도로 데이터 전송이 가능한 초고속 근접 무선통신 기술</li>
</ul>
<hr>
<h1 id="🌟-애드-혹-네트워크-ad-hoc-network">🌟 애드-혹-네트워크 (Ad-hoc Network)</h1>
<ul>
<li>네트워크의 구성 및 유지를 위해 기지국이나 액세스 포인트와 같은 기반 네트워크 장치를 필요로 하지 않는 네트워크</li>
<li><strong>노드(Node)</strong>들에 의해 자율적으로 구성되는 구조</li>
<li>활용분야는 긴급 구조, 긴급회의, 전쟁터에서의 군사 네트워크</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Arc] 아크 브라우저 살펴보기 _ 윈도우 베타]]></title>
            <link>https://velog.io/@bi-sz/Arc-%EC%95%84%ED%81%AC-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/Arc-%EC%95%84%ED%81%AC-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 19 Mar 2024 05:06:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bi-sz/post/d61c7270-2677-44fe-a3b1-a7147c04f5b1/image.png" alt=""></p>
<p>기다리고 기다리던 !! 
아크 브라우저 윈도우 버전을 사용할 수 있게 되었습니다.
<code>iOS 는 대기 없이 사용할 수 있습니다!</code></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d8f196d8-6715-4ec3-a969-7bb5b40a174d/image.png" alt=""></p>
<p>안내사항도 같이 나와있었습니다.</p>
<p>계정 및 다운로드 링크를 공유하지 말라고 나와있네요.
베타 기간 동안 윈도우 11에서만 사용 가능하며, 추후 10도 지원할 계획이라고 합니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/f0d0fdb0-2de1-4376-9f7c-5d96932b6111/image.png" alt=""></p>
<p>아이콘도 너무 귀엽네요. 택배를 뜯은 기분.. </p>
<p>이름과 이메일을 입력하고 가입할 수 있었습니다. 
회원가입 자체가 해당 베타 초대 메일을 받은 이메일로만 가입이 가능하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/66f199fd-79e4-4e47-b9b4-5e5669a9bf74/image.png" alt=""></p>
<p><a href="https://arc.net/">https://arc.net/</a></p>
<p>공식 홈페이지에서 <code>Join Windows Waitlist</code> 버튼을 클릭하여 윈도우 버전 대기가 가능합니다. </p>
<hr>
<h2 id="⭐-아크브라우저-살펴보기">⭐ 아크브라우저 살펴보기</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/6adb4d57-9e8c-46d2-86ec-5e271a3bba95/image.png" alt=""></p>
<p>브라우저가 이렇게 예쁠 일이라니.. </p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c1185edb-7c4d-458e-9f77-72263617033f/image.png" alt=""></p>
<p>너무 예뻐서 다운로드까지 받아주었습니다..</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/2d322efd-5d3d-4837-aeab-356faffc01fb/image.png" alt=""></p>
<p>아직 커스텀을 하지 않아 조촐한 모습입니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c650bd09-7b63-4153-900e-ed0637ffc269/image.png" alt=""></p>
<p>회원가입을 하고 로그인을 하면서, 기존에 사용하던 크롬과 연동이 되는지 구글 계정과 북마크 정보를 가져올 수 있었습니다.</p>
<p><code>Imported From Chrome</code> 폴더에 사용하던 북마크가 보입니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/2b9a636e-5d34-48c6-b758-b6e7c09958b9/image.png" alt=""></p>
<p>좌측 상단에 있는 왼쪽 구글은 <strong><code>Gmail</code></strong> 오른쪽 구글은 <strong><code>캘린더</code></strong> 였습니다.</p>
<p>크롬에서도 창 하나 더 열어서 메일과 캘린더는 확인할 수 있었으니, 편리할지는 사용해 봐야 알 것 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c6398407-d14f-4a3b-b681-4ab81336a613/image.png" alt=""></p>
<p>좌측 상단에 보이는 <strong><code>Space1</code></strong> 은 북마크나 다른 앱? 이라 표현해야할지, 
원하는 것들을 모아다가 분류를 할 수 있는 것 같습니다.</p>
<p>죄측 하단에 있는 <strong><code>New Tab</code></strong> 을 클릭하니 새 창을 열 수 있었습니다.</p>
<p>구글 계정 정보도 같이 넘어간 줄 알았는데 로그인 정보는 남아있지 않아, 새로 로그인 하고 인증도 했습니다..</p>
<p>계정정보 바로 _Save.. _</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/f617e79e-dee4-4e12-9871-71eaa4e37e48/image.gif" alt=""></p>
<p><strong><code>Space</code></strong> 영역과 <strong><code>Tab</code></strong> 영역이 구분되는 게 기존 브라우저와의 차이점 같네요.</p>
<p>메뉴 부분을 닫아서 전체화면으로 했을때 왼쪽으로 당겨지는것 같은 오른쪽이 비는 현상은 오류인 것 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d14fdbf7-b05e-4556-ae49-f929a2278f93/image.gif" alt=""></p>
<p>아직 초기버전이라 그런지 약간의 버벅임은 있네요.</p>
<blockquote>
<p><em>단축키</em> : <strong><code>ctrl</code></strong> + <strong><code>s</code></strong> </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/8a37a6a9-0367-4c37-8372-b43857cd5aad/image.png" alt=""></p>
<p>크롬같은 경우에는 탭이 많아지면 위 사진처럼 분리해서 비슷한 것들끼리 모아두고 보곤 했습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/4feb82f4-b4ae-4e0f-ba20-90a02f71f4ab/image.gif" alt=""></p>
<p>좌측 하단을 보면, <strong><code>Space</code></strong> 가 메뉴 영역? 북마크, 연동 앱 <strong><code>Tab</code></strong> 과 분리된 무언가. .ㅋㅋ 정도로 생각했는데, 크롬 자체를 여러개 켜서 분리한 것 처럼 새로운 작업 공간을 열어주는 <strong><code>Space</code></strong> 였습니다.</p>
<p><strong><code>Space</code></strong> 별로 설정을 달리해줄 수 있어 좋은것 같습니다.</p>
<p>업무용, 학습용, 일상용 등 구분해서 사용하면 이전 기록들을 보거나 자료를 저장하기 너무 좋을 것 같습니다.</p>
<hr>
<h3 id="💫-profile">💫 Profile</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a3747610-9100-4900-b490-cdbe0de9f6e0/image.png" alt=""></p>
<p><strong><code>Space</code></strong> 영역에서 마우스 우클릭을 해주니 프로필을 설정할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/cc0cd5e9-6c58-4bea-8610-d5e2a38fa19c/image.png" alt=""></p>
<p><strong><code>Turn &quot;Space&quot; into Folder</code></strong> 에서는 다른 <strong><code>Space</code></strong> 에 있는 폴더를 자유자재로 이동하여 사용할 수 있습니다.</p>
<hr>
<h3 id="💫-theme">💫 Theme</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d051632d-4c91-4bf3-a673-016c6e751418/image.png" alt=""></p>
<p>마지막으로 가장 기대했던 <strong><code>Theme</code></strong> !! <strong><code>Space</code></strong> 별로 테마를 사용할 수 있어서 너무 좋은것 같아요 .</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1224d23a-e908-4ad9-bb81-f0984170db77/image.png" alt=""></p>
<p>테마를 클릭하니 나오는 창입니다. 
벌써부터 파스텔 색상보이는게 너무 예쁘네요.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1d5004d4-4ddb-4aaf-9a80-8af350a4130c/image.gif" alt=""></p>
<p>배속을 하지 않은 영상입니다. 
녹화를 하기 전에는 괜찮았는데 끊김이 조금 있네요.
그래도 예뻐요 성능적인 부분은 따로 정리하려합니다. ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7fd4f955-891e-46cf-b543-d68cf481266d/image.gif" alt=""></p>
<p><strong><code>Space</code></strong> 별로 색상을 넣어주었습니다.</p>
<hr>
<h3 id="💫-keep">💫 keep</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b56f0fde-d357-41d6-b498-838db0acf934/image.gif" alt=""></p>
<p>아이콘이 보관함 모양이라 <strong><code>keep</code></strong> 이라고 쓰긴 했지만 휴지통에 가까운 것 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b90f7135-8408-4640-8063-485fe0040e3e/image.gif" alt=""></p>
<p>종료하고 재실행 해 보았는데 그대로 남아있네요!
개수 제한, 기간은 아직 모르겠지만 따로 설정이 있을거 같네요!</p>
<hr>
<h3 id="💫-탭-고정--즐겨찾기-">💫 탭 고정 ( 즐겨찾기 )</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/f9d73a9c-0cfe-48db-afbb-2d24160f12d2/image.gif" alt=""></p>
<p><strong><code>Tab</code></strong> 을 끌어다가 메일과 캘린더가 있던 부분에 올려 바로가기 아이콘처럼 생성할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0bed4ccd-452e-4abb-98db-94073e242a5c/image.gif" alt=""></p>
<p>아이콘이 아니어도, 라인 위로 올려주면 고정할 수 있습니다.
녹화영상에는 폴더로 들어갔지만 자유롭게 사용할 수 있습니다.</p>
<p>라인 하단에 있는 <strong><code>Tab</code></strong> 은 12시간 이후 자동 삭제됩니다.
지속적으로 사용할 <strong><code>Tab</code></strong> 들은 라인 위로 올려 고정하여 사용하면 유용할 것 같습니다.</p>
<hr>
<h3 id="💫-탭-전환">💫 탭 전환</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/22321510-4200-4e73-b963-bad9d6642c93/image.gif" alt=""></p>
<p>윈도우의 전환과 유사하네요.
아크브라우저 내의 <strong><code>Tab</code></strong> 을 빠르게 전환할 수 있습니다.</p>
<blockquote>
<p><em>단축키</em> : <strong><code>ctrl</code></strong> + <strong><code>s</code></strong> </p>
</blockquote>
<hr>
<h3 id="💫-화면-분할">💫 화면 분할</h3>
<blockquote>
<p><em>단축키</em> : <strong><code>ctrl</code></strong> + <strong><code>shift</code></strong>  + <strong><code>+</code></strong> </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/9c188eab-35a7-4831-acf2-1deadbcf6e48/image.png" alt=""></p>
<p>분할됐을때 좌측 사이드바에서도 <strong><code>Tab</code></strong>이 분할되어 있는게 마음에 드네요.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c815ffba-b4fb-46ad-8a45-0f7f2b1c2884/image.png" alt=""></p>
<p>윈도우 베타 버전에서는 4개까지 분할이 가능하네요.
세로 말고 가로로도 추가하고 싶은데,, 아직 방법을 모르겠습니다.</p>
<hr>
<h3 id="🌠-정리">🌠 정리</h3>
<p>예쁘다!!</p>
<p>iOS 버전에서는 이젤을 사용하여, 노트 및 이미지 등 다양하게 활용할 수 있는데 윈도우 베타 버전에서는 아직 해당 기능이 보이지 않네요.</p>
<p>AI 검색 등 다양한 기능이 업데이트될 예정입니다.</p>
<p>크롬외에 다른 브라우저는 불편해서 잘 사용을 하지 않았는데, 아크브라우저는 예뻐서 마음에 드네요 ㅎㅎ 기대가 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] Log4j2 - 로깅(Logging) 해보기]]></title>
            <link>https://velog.io/@bi-sz/JAVA-Log4j2-%EB%A1%9C%EA%B9%85Logging-%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/JAVA-Log4j2-%EB%A1%9C%EA%B9%85Logging-%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 05 Feb 2024 02:06:53 GMT</pubDate>
            <description><![CDATA[<p>개발을 하면서 항상 마주하는 에러.. </p>
<p>오류를 해결하기 위해 코드를 분석하던 도중 디버깅을 하려 해도 감이 잡히지 않는 경우를 종종 맞닥뜨리게 되는 것 같다.</p>
<p><strong>Logging</strong> 을 통해서 아주 간단하게 원인을 파악하고 해결할 수 있어 살짝 허무했던 경험을 살려 기록을 남깁니다 ..</p>
<hr>
<h2 id="⭐-로그--log---로깅--logging-">⭐ 로그 ( Log ) , 로깅 ( Logging )</h2>
<p><strong>Log</strong> 란 시스템 동작 시 <strong><code>시스템 상태</code></strong>, <strong><code>작동 정도</code></strong> 를 시간의 경과에 따라서 기록한 것입니다.</p>
<p><strong>Logging</strong> 이란 정보를 제공하는 일련의 기록인 <strong>Log</strong>를 생성하는 과정입니다.</p>
<blockquote>
</blockquote>
<p>*<em>Logging 의 장점 *</em></p>
<blockquote>
</blockquote>
<ul>
<li>개발 프로그램의 디버깅</li>
<li>예기치 못한 문제의 원인 파악</li>
<li>시스템 및 사용자의 동작 패턴 분석</li>
<li>해커(침입)의 비정상 동작의 기록 감지</li>
<li>분석을 통한 통계화</li>
</ul>
<hr>
<h2 id="⭐-로깅-라이브러리">⭐ 로깅 라이브러리</h2>
<p><strong><code>Logback</code></strong>, <strong><code>Log4J</code></strong>, <strong><code>Log4J2</code></strong> 등의 로그 관련 작업을 할 수 있는 라이브러리들이 있습니다.</p>
<p><em>Spring Boot</em> 에서는 위의 라이브러리들을 통합하여 인터페이스로 제공하는 <strong><code>SLF4J</code></strong> 라이브러리도 제공합니다.</p>
<p><strong><code>SLF4J</code></strong> 를 사용하게 된다면 다른 로깅 프레임워크로 전환하더라도 소스 코드 자체의 변경을 막을 수 있습니다.</p>
<hr>
<h2 id="⭐-로그-레벨">⭐ 로그 레벨</h2>
<p><em>log level</em> 은 아래와 같다</p>
<p><strong><code>trace</code></strong> &lt; <strong><code>debug</code></strong> &lt; <strong><code>info</code></strong> &lt; <strong><code>warn</code></strong> &lt; <strong><code>error</code></strong></p>
<p><strong><code>error</code></strong> 가 가장 심각한 로그 레벨이다.</p>
<p>일반적으로 개발서버는 <strong><code>debug</code></strong>, 운영서버는 <strong><code>info</code></strong> 로 설정하며 설정된 <em>level</em> 이하의 상태는 출력되지 않는다.</p>
<hr>
<h2 id="⭐-사용해보기">⭐ 사용해보기</h2>
<p>현재 작업하고있는 프로젝트에서 <strong><code>Log4J2</code></strong> 를 사용하고있어 해당 예시를 통해 정리하였습니다.</p>
<h3 id="💫-dependency-의존성-추가">💫 dependency 의존성 추가</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b457feb9-f77c-41f5-933c-2f7a63a695eb/image.png" alt=""></p>
<pre><code>&lt;dependency&gt;
    &lt;groupId&gt;org.bgee.log4jdbc-log4j2&lt;/groupId&gt;
    &lt;artifactId&gt;log4jdbc-log4j2-jdbc4.1&lt;/artifactId&gt;
    &lt;version&gt;1.16&lt;/version&gt;
&lt;/dependency&gt;</code></pre><p><strong>maven</strong> 프로젝트에서 <strong>pom.xml</strong> 파일에 <em>dependency</em> 를 추가해주었습니다.</p>
<pre><code class="language-java">dependencies {
    implementation &#39;org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16&#39;
}</code></pre>
<p><strong>gradle</strong> 프로젝트의 경우 <strong>build.gradle</strong> 에서 <em>dependency</em> 를 추가해주었습니다.</p>
<p><a href="https://mvnrepository.com/">https://mvnrepository.com/</a>
레포지토리 저장소에서 쉽게 원하는 라이브러리와 버전에 맞는 <em>dependency</em> 를 찾아볼 수 있습니다.</p>
<h3 id="💫-설정하기">💫 설정하기</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/fa56f88d-9e2d-4125-b359-cff4a76b2092/image.png" alt=""></p>
<p><strong>resources</strong> 폴더 안에 <em>properties</em> 파일을 생성하여 다양한 설정들을 할 수 있습니다.</p>
<ul>
<li>프로퍼티들을 개별 설정 </li>
<li>로그 레벨 설정</li>
<li>파일 최대 용량 설정 </li>
<li>에러일 경우의 로그처리는 어떻게 할 것인지</li>
<li>root 레벨 설정</li>
<li>로그파일을 저장할 경로 설정</li>
</ul>
<p>이 외에도 너무 많고 다양한 설정들이 있지만 상세한 코드나 설정 방법에 대해서는 생략하겠습니다.. ㅎㅎ </p>
<h3 id="💫-코드-작성">💫 코드 작성</h3>
<pre><code class="language-java">import org.apache.logging.log4j.Logger;
import lombok.extern.log4j.Log4j2;</code></pre>
<p>사용할 라이브러리들을 <strong>import</strong> 해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d44d0456-5a00-4fe6-862d-ae6eb67fa2d1/image.png" alt=""></p>
<p><em>Spring Boot</em> 프로젝트에서 <em>Service</em> 클래스에서 사용해주었습니다.</p>
<p><strong><code>@Log4j2</code></strong> 를 통해 사용을 선언해주었습니다.</p>
<pre><code class="language-java">log.debug(&quot;sendSatusUpdate service&quot;);
log.info(&quot;batchStatusUpdate err : {}&quot;, err);
log.error(&quot;error: {}&quot;, mapping);</code></pre>
<p>코드에서 자유롭게 용도게 맞게 사용해줄 수 있습니다. </p>
<h3 id="💫-올바른-로그-사용법">💫 올바른 로그 사용법</h3>
<pre><code class="language-java">// worst
log.trace(&quot;trace log=&quot; + error);

// best
log.trace(&quot;trace log={}&quot;, error);</code></pre>
<p><em>worst</em> 의 방식으로 <strong>trace</strong> 를 출력한다면 로그 출력 자체에는 문제가 없지만</p>
<p>자바 문법상 <code>&quot;trace log = &quot; + error</code> 이라는 문자열 <em>더하기</em> 연선이 먼저 일어난 후 <strong>log level</strong> 을 확인하게됩니다.</p>
<p>해당 프로젝트의 <strong>log level</strong> 설정이 <strong><code>debug</code></strong> 인 경우, <strong><code>trace</code></strong> 는 <strong><code>debug</code></strong> 이하의 <strong>log level</strong> 이므로 출력되지 않지만 이미 불필요한 연산이 일어난 경우가 됩니다.</p>
<p><em>best</em> 방식은 <strong>SLF4J</strong> 치환문자를 사용하는 방십입니다.</p>
<p>문자열에 중괄호를 넣어 순서대로 출력하고자 하는 데이터들을 <code>,</code> 로 구분한 후 전달하여 치환해주는 방식이므로 불필요한 연산이 발생하지 않습니다.</p>
<hr>
<h2 id="🌠-정리">🌠 정리</h2>
<p>코드를 분석하면서 어디서 디버깅을 하고 오류를 수정해야하는지 조차 모를 정도로 정보가 없을 때, 직관적으로 코드에 <strong>log</strong> 를 찍어보면서 시간을 단축할 수 있었습니다.</p>
<p>오류가 있어 특정한 기능이 작동하지 않지만, 콘솔에 오류가 나타나지 않아 답답했던 상황에서 <strong>error log</strong> 를 찍어보니 어떤 코드에서, 어떤 오류가 발생하였는지 숨겨져있던 오류가 출력되었습니다.</p>
<p><strong>log level</strong> 설정 단계에서 생략되어 보이지 않았던 오류를 출력하여 해결한 경우라고 볼 수도 있겠습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] Eclipse 구동에러 - 'Publishig to Server...' has encountered a problem..]]></title>
            <link>https://velog.io/@bi-sz/Error-Eclipse-%EA%B5%AC%EB%8F%99%EC%97%90%EB%9F%AC-Publishig-to-Server...-has-encountered-a-problem</link>
            <guid>https://velog.io/@bi-sz/Error-Eclipse-%EA%B5%AC%EB%8F%99%EC%97%90%EB%9F%AC-Publishig-to-Server...-has-encountered-a-problem</guid>
            <pubDate>Wed, 17 Jan 2024 01:13:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bi-sz/post/8c3fd284-467f-4b9d-9f53-b57344d98b14/image.png" alt=""></p>
<pre><code class="language-system">&#39;Publishig to Server...&#39; has encountered a problem..

Could not delete C:\Users\KwonBi\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\
tmp0\wtpwebapps\Project\WEB-INF\lib\spring-social-web-1.1.4.RELEASE.jar. 
May be locked by another process.</code></pre>
<p>프로젝트를 실행하기 전 서버를 클린하려는 데 해당 오류가 발생하였습니다. </p>
<hr>
<h3 id="해결-방법">해결 방법</h3>
<p>톰캣이 실행되면서 이전에 쌓인 <code>tmp0</code> 폴더의 파일들이 삭제되지 않아 발생한 문제입니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0a5d27d7-37ab-4187-932b-1a4269cab6d7/image.png" alt=""></p>
<p>보통 서버 구동에서 문제가 생기면 서버 클린을 해주는데, 저는 클린을 진행하다 발생한 오류이고 삭제되어야될 파일이 삭제되지 않아 발생한 오류이므로, <strong>Clean Tomcat Work Directory</strong> 를 진행해주었습니다.</p>
<p><strong>Clean Tomcat Work Directory</strong> 를 진행하고 <strong>Clean</strong> 해주니 오류가 사라졌습니다.</p>
<p>위의 방법으로 해결이 되지 않는 경우 물리적으로 <strong>.metadata</strong> 디렉토리에 들어가 직접 삭제해주면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/02c659ad-abd0-4748-b822-a45b6732dded/image.png" alt=""></p>
<p><strong>.metadata</strong> 디렉토리는 사용하는 <em>workspace</em> 디렉토리에 존재합니다.
저는 기본 경로에서 <em>workspace</em> 를 사용하고 있어 
<code>C:\Users\KwonBi\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core</code>
경로에서 확인할 수 있었습니다.</p>
<p>해당 디렉토리의 <strong>tmp</strong> 폴더를 삭제해줍니다.</p>
<p>저는 서버가 4 개여서 <code>tmp0</code>, <code>tmp1</code>, <code>tmp2</code>, <code>tmp3</code> 으로 데이터가 쌓이는 것 같습니다.</p>
<p>오류가 발생한 서버는 가장 마지막 서버로 <code>tmp3</code>으로 추정되지만 서버를 실행할 때 자동으로 생성되어 데이터가 쌓이는 부분이니 4 개를 전부 다 삭제해도 무관합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MQTT] Mosquitto 설치 및 테스트]]></title>
            <link>https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Thu, 11 Jan 2024 01:25:41 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@bi-sz/MQTT-MQTT-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0">https://velog.io/@bi-sz/MQTT알아보기</a>
지난 게시글에서 <strong>MQTT</strong> 에 대하여 학습하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/e148bffb-6e8e-42b1-ad70-e90d5518eeb1/image.png" alt=""></p>
<p>앞서 정리한 다양한 <strong>Broker</strong> 중에 <code>Mosquitto</code> 를 선택하여 설치및 테스트를 진행하였습니다.</p>
<h2 id="⭐-mosquitto-설치하기">⭐ Mosquitto 설치하기</h2>
<p><strong>Mosquitto</strong> 는 <strong>MQTT</strong> <code>3.1</code>과 <code>3.1.1</code>을 구현한 오픈소스 메세지 브로커이며 <strong>QOS 2</strong>를 지원합니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/6a0688cf-a343-4d2e-b551-4fc0cad34f5d/image.png" alt=""></p>
<p><a href="https://mosquitto.org/download/">https://mosquitto.org/download/</a>
공식 홈페이지에서 다운받을 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/37d2ec54-89f4-4fda-9df4-dd806eacd1ab/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/474ae6d8-ca2c-48fe-b052-2d2f3eb4e1d3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/755ac3e4-3338-4a0a-bc9a-0441b63f7630/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0ac0905c-b5f1-4195-a12c-837a4c933d80/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0ca5757e-8619-4dfe-ba07-ff630f2c6234/image.png" alt=""></p>
<p>별다른 설정사항 없이 설치가 완료되었습니다.</p>
<hr>
<h2 id="⭐-설치완료-테스트">⭐ 설치완료 테스트</h2>
<p><em>cmd(명령 프롬프트)</em> 를 관리자 권한으로 실행합니다.</p>
<h4 id="1-mosquitto-설치-폴더로-이동한-후-mosquitto--v-를-실행해줍니다">1. <strong>mosquitto</strong> 설치 폴더로 이동한 후 <code>mosquitto -v</code> 를 실행해줍니다.</h4>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/bae3f47d-b8a0-4354-98f9-8245effbffff/image.png" alt=""></p>
<h4 id="2-tcp-1883-활성을-확인합니다">2. Tcp 1883 활성을 확인합니다.</h4>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/52ab4044-364b-4a18-b3b1-e93723a436e1/image.png" alt=""></p>
<p><strong>cmd</strong> 창에서 <code>netstat -an</code> 를 실행해줍니다.</p>
<h4 id="3-서비스-시작">3. 서비스 시작</h4>
<p><strong>cmd</strong> 창에서 <code>net start mosquitto</code> 를 실행해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/30dcd27e-cb52-428d-8827-cc8015f7c103/image.png" alt=""></p>
<p>이미 서비스가 시작되어있는 상태네요.</p>
<h4 id="4-subscriber-구독자-실행">4. Subscriber (구독자) 실행</h4>
<p><strong>cmd</strong> 창에서 <code>mosquitto_sub -h localhost -t /testTopic</code> 를 실행해줍니다.</p>
<blockquote>
</blockquote>
<p><strong>mosquitto_sub -h 호스트 -t 토픽명</strong></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/cfe2c66e-c846-4bbe-a954-1fc08e285347/image.png" alt=""></p>
<h4 id="5-publisher-공급자-로-메시지-전송">5. Publisher (공급자) 로 메시지 전송</h4>
<p>새로운 <strong>cmd</strong> 창을 열어 실행해줍니다.</p>
<p><code>mosquitto_pub -h localhost -t /testTopic -m &quot;Hello liyo&quot;</code></p>
<blockquote>
</blockquote>
<p><strong>mosquitto_pub -h 호스트 -t 토픽명 -m 메시지</strong></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/989f342e-8e3e-4e05-ab26-ee86b54cdaaa/image.png" alt=""></p>
<p>이전에 실행해둔 <code>구독자</code> 의 <em>cmd</em> 창을 확인해보면 <em>Hello Liyo</em> 메시지를 확인할 수 있습니다.</p>
<h4 id="6-서비스-종료">6. 서비스 종료</h4>
<p><strong>cmd</strong> 창에서 <code>net stop mosquitto</code> 를 실행해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/5b720619-adca-43ec-a682-c8dbdf63a1c2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MQTT] MQTT 알아보기]]></title>
            <link>https://velog.io/@bi-sz/MQTT-MQTT-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/MQTT-MQTT-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Thu, 11 Jan 2024 01:08:05 GMT</pubDate>
            <description><![CDATA[<h1 id="⭐-mqtt--message-queue-for-telemetry-transport-">⭐ MQTT ( Message Queue for Telemetry Transport )</h1>
<p><strong>MQTT</strong> 는 <em>M2M</em> 또는 <em>IoT</em> 를 위한 경량 <strong>Protocol</strong> 로서 저전력 장비에서도 운용이 가능하며, <em>Network bandwidth</em> 가 작은 곳에서도 충분히 운용 가능하도록 설계된 <strong>Protocol</strong> 입니다.</p>
<h2 id="💫-mqtt-특징">💫 MQTT 특징</h2>
<h3 id="🔹-connection-oriented">🔹 Connection Oriented</h3>
<p><em>MQTT Broker</em> 와 연결을 요청하는 <em>클라이언트</em> 는 <em>TCP/IP</em> 소켓 연결을 한 후 명시적으로 연결을 끊거나 네트워크 사정에 의해 연결이 끊어질 때까지 상태를 유지합니다.</p>
<p>하트비트인 <strong>Live</strong> 와 <strong>Topic</strong> 에 발행되는 메시지를 통해 연결을 유지하고 메시지 송수신을 하게됩니다.</p>
<h3 id="🔹-broker">🔹 Broker</h3>
<p><em>MQTT Protocol</em> 을 사용하여 <strong>Publisher</strong> 와 <strong>Subscriber</strong> 사이에서 메시지를 관리하며 전송해주는 역할을 합니다.</p>
<ul>
<li><a href="https://mosquitto.org/"><code>Mosquitto</code></a></li>
<li><a href="https://www.mosca.io/"><code>Mosca</code></a></li>
<li><a href="https://www.hivemq.com/"><code>HiveMQ</code> </a></li>
<li><a href="https://www.rabbitmq.com/mqtt.html"><code>RabbitMQ MQTT Plugin</code></a></li>
</ul>
<p>등의 <em>MQTT Broker</em> 가 있습니다.</p>
<p><a href="https://github.com/mqtt/mqtt.org/wiki/server-support">https://github.com/mqtt/mqtt.org/wiki/server-support</a>
해당 깃 페이지에서 다양한 브로커에 대한 지원 기능 목록을 확인해볼 수 있습니다.</p>
<h3 id="🔹-pubsub-model">🔹 Pub/Sub Model</h3>
<p><em>Broker</em> 를 통한 발행/구독 메세징 패턴입니다.</p>
<ul>
<li><code>발행</code> : <em>Broker</em> 에 메시지를 전송</li>
<li><code>구독</code> : <em>Broker</em> 가 구독하고있는 <strong>클라이언트</strong>에게 메세지를 전송</li>
</ul>
<p><em>일대일</em> 혹은 <em>일대다</em> 통신 가능</p>
<h3 id="🔹-qos--quality-of-service-">🔹 Qos ( Quality of Service )</h3>
<p>3가지의 _QoS Level 이 있습니다.</p>
<ul>
<li><code>0</code> : <strong>최대 한 번 전송</strong>하며 메시지를 전달합니다. 구독하는 클라이언트가 받는 것을 <strong>보장하지 않습니다.</strong></li>
<li><code>1</code> : <strong>최소 한 번 전송</strong>합니다. 구독하는 클라이언트가 메시지를 받았는지 불확실하면 정해진 횟수만큼 <strong>재전송</strong>합니다.</li>
<li><code>2</code> : 구독하는 클라이언트가 요구된 메시지를 <strong>정확히 한 번</strong> 수신할 수 있도록 보장합니다.</li>
</ul>
<h3 id="🔹-topic">🔹 Topic</h3>
<p>메시지를 발행/구동하는 행위는 채널단위로 일어나며 이 단위를 <strong>Topic</strong> 이라고 합니다.</p>
<p><strong>Topic</strong> 은 슬래시(/) 로 구분되는 계층 구조를 가집니다.</p>
<p>최상위 토픽은 슬래시(/) 로 시작하지 않아야하며 와일드 카드 문자를 사용할 수 있습니다.</p>
<ul>
<li><code>+</code> : One-Level Wild Card</li>
<li><code>#</code> : Multi-Level Wild Card</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1340cd8c-35d6-4a45-9d74-e8cf42de649c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/8803011d-8601-4eda-97d9-2bcf989e5135/image.png" alt=""></p>
<h3 id="🔹-lwt--last-will-and-testment-">🔹 LWT ( Last will and testment )</h3>
<p><strong>MQTT</strong> 는 신뢰할 수 없는 네트워크를 포함하는 경우에 자주 사용되기 때문에 비정상적으로 연결이 끊어질 수 있다고 가정하는 것이 합리적입니다.</p>
<p><strong>LWT</strong> 는 유언, 유언장 이라는 의미로서 <strong>Broker</strong>와 <strong>Client</strong>가 연결이 끊어지면 자동으로 다른 구독자들에게 메시지가 전송되는 기능입니다.</p>
<p>일반적으로 <strong>Broker</strong>에 연결을 시도하는 시점에 <code>will topic</code>, <code>will message</code>, <code>will qos</code>  등을 지정합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Ubuntu] 세팅하기 - 계정만들기]]></title>
            <link>https://velog.io/@bi-sz/Ubuntu-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-%EA%B3%84%EC%A0%95%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/Ubuntu-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-%EA%B3%84%EC%A0%95%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 10 Jan 2024 06:51:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bi-sz/post/6a543846-95d6-403a-b239-23d3a85cca41/image.png" alt=""></p>
<p><code>Enter new UNIX usename</code> : 우분투에서 사용할 닉네임을 입력해줍니다.
<code>New password</code> : 사용할 패스워드를 입력해줍니다.
<code>Retype new password</code> : 패스워드를 재 입력해줍니다.</p>
<p>계정을 생성하고 성공적으로 세팅이 완료되었다는 문구과 함께 여러 정보가 출력됩니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TypeScript] ESLint 알아보기]]></title>
            <link>https://velog.io/@bi-sz/TypeScript-ESLint-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/TypeScript-ESLint-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 05 Jan 2024 07:25:46 GMT</pubDate>
            <description><![CDATA[<h1 id="⭐-eslint">⭐ ESLint</h1>
<p><em>ECMA SCript</em> 와 <em>Lint</em> 를 합친 용어로 문법상 에러를 먼저 검출 해낼 수 있는 도구입니다.
<strong>Typescript</strong> 와 함께 많이 사용됩니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/ce3b76c2-9f90-4a5b-b08d-7febb0f1323b/image.png" alt=""></p>
<p><code>useEffect</code> 나 <code>useCallback</code> 에서의 <em>dependency array</em> 가 빠졌거나, 코딩 스타일이 지정한 것과 다른 경우 <strong>Error</strong>로 인식하여 검출하거나, <strong>Warning</strong> 형태로 경고해줍니다.</p>
<p>예기치 않은 코딩 스타일을 방지하고, 팀의 코딩스타일을 하나로 맞출 수 있도록 도와주는 툴입니다.</p>
<h3 id="💫-eslint-config">💫 ESLint Config</h3>
<p>가장 유명한 것중 하나인 <em>airbnb</em> 의 <strong>ESLint Config</strong> 입니다.</p>
<p>Airbnb Javascript Style Guide
<a href="https://airbnb.io/javascript">https://airbnb.io/javascript</a></p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/23d5239a-e75e-462e-b8b0-8618c047b6e8/image.png" alt=""></p>
<p>싱글 캐릭터를 가급적 피해주고, 함수 명은 카멜케이스로 작성하기를 권장합니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c35954da-c6bb-4510-ab6b-4bd32102be53/image.png" alt=""></p>
<p><em>function</em> 이라는 키워드를 제외하고 <em>Arrow Function</em> 형태로 만드는 것을 추천합니다.</p>
<h3 id="🔹-prettier">🔹 Prettier</h3>
<p>코딩 스타일을 변환해주는 <em>Tool</em> 입니다.</p>
<pre><code class="language-js">const text = &quot;TEXT&quot; 
const text= &#39;TEXT&#39; </code></pre>
<p>등 스타일이 다른 것을 하나로 통일해줍니다.</p>
<p><a href="htpps://prettier.io/">htpps://prettier.io/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tomcat] 톰캣 서버 배포하기]]></title>
            <link>https://velog.io/@bi-sz/ApacheTomcat-%ED%86%B0%EC%BA%A3-%EC%84%9C%EB%B2%84-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/ApacheTomcat-%ED%86%B0%EC%BA%A3-%EC%84%9C%EB%B2%84-%EC%98%AC%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Tue, 26 Dec 2023 05:06:43 GMT</pubDate>
            <description><![CDATA[<h2 id="⭐-톰캣-서버-구동하기">⭐ 톰캣 서버 구동하기</h2>
<p><a href="https://tomcat.apache.org/">https://tomcat.apache.org/</a>
톰캣 홈페이지에서 톰캣을 설치해줍니다.</p>
<p>저는 설치파일을 갖고있어서 빠르게 압축까지 풀어주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b88b8256-bf20-4d0c-935a-43d42afebc25/image.png" alt=""></p>
<p><a href="https://velog.io/@bi-sz/Tomcat-%EA%B8%B0%EB%B3%B8-%ED%8F%B4%EB%8D%94-%EA%B5%AC%EC%A1%B0-context.xml">https://velog.io/@bi-sz/Tomcat</a>
톰캣의 기본 폴더 구조 관련해서는 지난 게시글에서 한 번 다루었기 때문에 넘어가겠습니다.</p>
<p><a href="https://velog.io/@bi-sz/Java-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">https://velog.io/@bi-sz/Java환경변수설정</a>
<a href="https://velog.io/@bi-sz/Java-JRE-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">https://velog.io/@bi-sz/Java-JRE-환경변수설정</a>
새로 추가한 서버여서 아무 환경세팅이 되어 있지 않아 <strong>JAVA</strong> 설치와 환경변수 설정도 해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b8f9ac24-3493-4b13-9d4f-98d3a8e63f77/image.png" alt=""></p>
<p><em>cmd</em> 에서 <em>tomcat</em> 의 <em>bin</em> 경로로 들어가서 <code>startup.bat</code> 명령을 입력하여 실행해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/be78e3e5-4650-4f7d-a862-ae72255c5329/image.png" alt=""></p>
<p><a href="http://localhost:8080/">http://localhost:8080/</a> 
로컬로 접속하면 톰캣이 실행되어 기본 화면이 보이는 모습입니다.</p>
<hr>
<h2 id="⭐-war-파일-배포하기">⭐ war 파일 배포하기</h2>
<p>저는 <em>Jenkins</em> 를 사용하고 있어서 <em>git repository</em> 에서 자동으로 <em>war</em> 파일을 던져주기 때문에 추출하는 작업을 하지 않았습니다.</p>
<blockquote>
</blockquote>
<p><code>프로젝트 우클릭</code> -&gt; <code>export 클릭</code> -&gt; <code>war 검색 후 선택</code> -&gt; <code>war파일 이름과 저장 경로 선택</code> </p>
<blockquote>
</blockquote>
<p>의 과정으로 작업 툴에서 <em>export</em> 를 통해서 <em>war</em> 파일을 추출할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7deeb390-3cbd-45be-940a-22b2236821ec/image.png" alt=""></p>
<p>추출한 <em>war</em> 파일을 <code>C:\ApacheTomcat85_infra\webapps</code> 경로에 넣어줍니다.</p>
<p>톰캣이 실행되면 <em>war</em> 파일을 풀어서 폴더로 풀어주고 배포되는 방식입니다.</p>
<h3 id="💫-파일-명을-rootwar-로-생성한-경우">💫 파일 명을 ROOT.war 로 생성한 경우</h3>
<p><code>C:\ApacheTomcat85_infra\webapps</code> 경로에 있는 기존 <strong>ROOT</strong>파일의 이름을 다른것으로 변경해준 후 생성한 <strong>ROOT.war</strong> 파일을 넣어줍니다.</p>
<p>tomcat은 별도의 설정이 없으면 자동으로 _webapps_내 <strong>ROOT</strong>폴더를 <strong>root</strong>로 실행하기 때문에 파일명을 <strong>ROOT</strong> 로 지어주면 별도의 설정을 할 필요가 없습니다.</p>
<h3 id="💫-임의의-파일명으로-war을-생성한-경우">💫 임의의 파일명으로 war을 생성한 경우</h3>
<p><code>C:\ApacheTomcat85_infra\webapps</code> 경로에 <em>war</em> 파일을 넣어줍니다. </p>
<p><em>tomcat</em> 의 설치폴더인 <code>C:\ApacheTomcat85_infra\conf</code> 경로에서 
<strong>server.xml</strong> 을 수정해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/cddbcbc9-a472-42c3-b9b1-cafa12080088/image.png" alt=""></p>
<p><strong>Host</strong> 태그 내부에 경로를 추가해줍니다.</p>
<pre><code>&lt;Context path=&quot;[경로]&quot; docBase=&quot;[war파일의 이름]&quot;  reloadable=&quot;false&quot; &gt; &lt;/Context&gt;</code></pre><p>이 설정은 _tomcat_서버에서 하나의 가상경로를 추가하는 방법으로 <code>path=&quot;/&quot;</code> 로 설정하면 <strong>ROOT</strong> 폴더 대신 등록한 폴더가 실행됩니다.</p>
<hr>
<h2 id="⭐-톰캣-윈도우-데몬-서비스-등록">⭐ 톰캣 윈도우 데몬 서비스 등록</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b8f9ac24-3493-4b13-9d4f-98d3a8e63f77/image.png" alt=""></p>
<p>톰캣 실행을 위해서 매번 <em>cmd</em> 에서 <em>tomcat</em> 의 <em>bin</em> 경로로 들어가서 <code>startup.bat</code> 명령을 입력하기 번거롭기 때문에 컴퓨터를 재부팅할 때마다 서버가 고정적으로 실행되도록 데몬 서비스를 등록해주려합니다.</p>
<h3 id="1-톰캣-기본-포트-변경">1. 톰캣 기본 포트 변경</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a7783c0a-78ac-49ed-9ac8-6817b38e4bd1/image.png" alt=""></p>
<p><em>tomcat</em> 의 설치폴더인 <code>C:\ApacheTomcat85_infra\conf</code> 경로에서 
<strong>server.xml</strong> 을 수정해줍니다.</p>
<p>톰캣의 기본 포트가 <code>8080</code>으로 설정되어있는데 추후에 다른 것들과 겹칠 우려가 있기 때문에 <code>8081</code>로 변경해주었습니다.</p>
<h3 id="2-servicebat-설치">2. service.bat 설치</h3>
<p>관리자 권한으로 <em>cmd</em> 를 실행하여 <code>C:\ApacheTomcat85_infra\bin</code> 톰캣의 경로에서 아래 명령을 실행해줍니다.</p>
<pre><code class="language-shell">&gt; service.bat install</code></pre>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/408979a2-dd61-4800-a78c-187c6ee84f9e/image.png" alt=""></p>
<h3 id="3-윈도우-서비스에서-확인하기">3. 윈도우 서비스에서 확인하기</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/34bfd332-7d1a-4e7b-a2c4-232fb57a166e/image.png" alt=""></p>
<p><em>service.bat</em> 설치가 완료되면 윈도우 실행창 ( 윈도우 + r ) 을 실행창에서 <strong>services.msc</strong> 를 실행하여 윈도우 서비스 창을 열어줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/e6944233-c0a6-403b-9730-be22c22d3b26/image.png" alt=""></p>
<p>서비스 창에서 <strong>Apache Tomcat</strong> 이 추가된 것을 확인할 수 있습니다.</p>
<h3 id="4-데몬-실행하기">4. 데몬 실행하기</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/2c5e1ec2-997b-4216-88d4-71ea27d7174b/image.png" alt=""></p>
<p><strong>Apache Tomcat</strong> 서비스를 더블클릭하거나 우클릭하여 속성을 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0bb7c7e7-2be1-44b2-bb95-0fd1820503dc/image.png" alt=""></p>
<p>속성창에서 시작 유형을 <strong>자동</strong>으로 변경하고, 서비스를 시작하고 확인을 눌러줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/cb124051-1079-4464-86e0-bc380464477b/image.png" alt=""></p>
<p>서버의 상태가 실행중으로 변경됨을 확인하였습니다.</p>
<hr>
<h2 id="⭐-배포-완료">⭐ 배포 완료</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/f41e0093-15e9-406e-bc8f-2d9b9903b202/image.png" alt=""></p>
<p>배포가 잘 된 모습입니다.</p>
<p>서버 자체에서 로컬로 확인을 해 주었으니 외부접속을 위한 포트포워드 설정을 해 주어야합니다.</p>
<p><a href="https://velog.io/@bi-sz/Network-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%8F%AC%ED%8A%B8%ED%8F%AC%EC%9B%8C%EB%93%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">https://velog.io/@bi-sz/Network포트포워드설정</a>
포트포워딩 관련해서는 위의 게시글에 정리해두었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a7d4dd26-2eae-4006-b722-5361e044f8a6/image.png" alt=""></p>
<p>포트포워딩 설정 후 IP를 통한 접근에서도 배포한 서버에 잘 접근되는 모습입니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/e2a0dd00-9a94-4417-993b-7b8db0d1f38b/image.png" alt=""></p>
<p>외부 접속 가능한 도메인 주소로도 잘 접근되네요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 외부접속을 위한 포트포워드 설정하기]]></title>
            <link>https://velog.io/@bi-sz/Network-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%8F%AC%ED%8A%B8%ED%8F%AC%EC%9B%8C%EB%93%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/Network-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%8F%AC%ED%8A%B8%ED%8F%AC%EC%9B%8C%EB%93%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 26 Dec 2023 04:54:04 GMT</pubDate>
            <description><![CDATA[<p>마인크래프트 서버열때 자주 하던 설정인데 웹 서버를 구동하면서도 사용하게 되네요. </p>
<p>외부 접근을 위해 설정했던 포트포워딩작업을 정리하였습니다.</p>
<hr>
<h2 id="⭐-포트포워드">⭐ 포트포워드</h2>
<p>외부 접속을 위해서는 외부의 기기가 내부에 있는 컴퓨터나 서버가 연결된 공유기를 통과해야합니다.</p>
<p>공유기는 방화벽 역할을 하기때문에 내부 컴퓨터에 접근이 가등하도록 하려면 특정 포트를 열어줘야합니다.</p>
<p>외부의 기기에는 고정된 <strong>IP</strong> 만 전달하고, 외부 기기가 내부에 접근할 수 있도록 내부의 공유기 관리자에서 설정하는 과정이 포트포워드입니다.</p>
<p>허가된 포트로 접근한 외부 사용자만이 해당 서버 혹은 PC로 접근이 가능하도록 설정해주는 것입니다.</p>
<hr>
<h2 id="⭐-포트포워드-설정하기">⭐ 포트포워드 설정하기</h2>
<p>저는 <strong>ipTIME</strong> 을 사용하고 있어 해당 방법을 정리하였습니다.</p>
<h3 id="1-공유기-설정-페이지-접속">1. 공유기 설정 페이지 접속</h3>
<p><a href="http://192.168.0.1">http://192.168.0.1</a>
공유기 설정 페이지에 접속해줍니다.</p>
<p>초기 계정은 아래와 같습니다.
ID : admin
PW : admin</p>
<p>따로 설정해 놓은 계정을 잃어버렸다면 공유기의 <em>reset</em> 버튼을 10초 정도 눌러 초기화할 수 있습니다.</p>
<h3 id="2-시스템-요약-정보">2. 시스템 요약 정보</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/ed829068-e211-4bc9-8226-e5708e861914/image.png" alt=""></p>
<p>로그인 후 화면에서 관리 도구로 들어가줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/f70bdc92-ebad-4b12-a534-fbfc19b87d26/image.png" alt=""></p>
<p>외부 IP 주소를 확인할 수 있습니다.</p>
<h3 id="3-포트포워드-설정">3. 포트포워드 설정</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/763d2274-2ee9-4436-94c1-1f2f986bec25/image.png" alt=""></p>
<p><strong><code>고급설정</code></strong> -&gt; <strong><code>NAT/라우터관리</code></strong> -&gt; <strong><code>포트포워드설정</code></strong> 에서 규칙을 추가하여 포트포워딩 작업을 해줄 수 있습니다.</p>
<blockquote>
<p><em>예시</em></p>
</blockquote>
<p><strong>규칙 이름</strong> : TEST
<strong>내부 IP 주소</strong> : 192.168.0.77 (해당 컴퓨터의 ip 주소, cmd -&gt; ipconfig )
<strong>외부 포트</strong> : 7890:7890
<strong>내부 포트</strong> : 3000:3000</p>
<h3 id="4-포트포워드-확인하기">4. 포트포워드 확인하기</h3>
<p><a href="https://yuip.org/en/port-check">https://yuip.org/en/port-check</a>
위의 사이트에서 포트포워드가 되어있는지 확인할 수 있습니다. </p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/0bc83e83-be6a-432a-8f07-2de644bf37f5/image.png" alt=""></p>
<p>외부에서 접속을 위한 <strong><code>외부 IP</code></strong>, <strong><code>포트번호</code></strong> 를 입력하고 <strong>TEST</strong> 버튼을 클릭하면 포트포워드 여부를 알려줍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] JRE 환경 변수 설정하기]]></title>
            <link>https://velog.io/@bi-sz/Java-JRE-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/Java-JRE-%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 26 Dec 2023 01:10:13 GMT</pubDate>
            <description><![CDATA[<p><em>Apache Tomcat</em> 으로 서버를 구동하려는 도중 jre의 경로를 찾지 못해 오류가 발생했습니다.</p>
<p>평소에 jdk 만 사용하여 jre는 따로 환경변수 설정한 적이 없는거 같아서 생소하였습니다.</p>
<hr>
<h2 id="⭐-jre-java-runtime-environment">⭐ JRE (Java Runtime Environment)</h2>
<p>자바 실행환경으로 자바 프로그램을 실행하는데 필요한 것입니다.</p>
<p><strong>jre</strong> 자체는 자바 프로그램을 실행하는 데 필요한 것으로, 자바 프로그램을 실행시키는데는 문제가 없지만, 자바 프로그램을 코딩할 때 <strong>jdk</strong>가 아니라 <strong>jre</strong>를 사용하면 컴파일이 정상적으로 되지 않는 등의 문제점이 생길 수 있습니다.</p>
<h2 id="⭐-jdk-java-development-kit">⭐ JDK (Java Development Kit)</h2>
<p>자바 개발 키트입니다. 자바를 개발하는데 필요한 기능들을 모아둔 것입니다.</p>
<p>자바 프로그램 개발을 위해서는 <strong>jdk</strong> 를 다운받아 자바 기능을 사용하고 컴파일 해주어야합니다. </p>
<p><strong>jdk</strong> 에는 <strong>jre</strong> 도 포함되어있습니다.</p>
<hr>
<h2 id="⭐-jre-환경변수-설정">⭐ jre 환경변수 설정</h2>
<h3 id="1-작업표시줄-검색창에-환경-변수를-검색하여-시스템-환경-변수-편집으로-들어갑니다">1. 작업표시줄 검색창에 환경 변수를 검색하여 시스템 환경 변수 편집으로 들어갑니다.</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/61614694-7f82-4e96-b682-762a9ea06d30/image.png" alt=""></p>
<hr>
<h3 id="2-시스템-속성의-고급-탭에서-우측-하단의-환경-변수를-클릭합니다">2. 시스템 속성의 고급 탭에서 우측 하단의 환경 변수를 클릭합니다.</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a63e9fb4-2924-4e4a-ad9f-4a19976068e2/image.png" alt=""></p>
<hr>
<h3 id="3-환경-변수에서-새로-만들기-버튼을-클릭하여-아래-정보를-입력하고-확인버튼을-클릭합니다">3. 환경 변수에서 새로 만들기 버튼을 클릭하여 아래 정보를 입력하고 확인버튼을 클릭합니다.</h3>
<p><strong>변수 이름(N) : JRE_HOME</strong></p>
<p><strong>변수 값(V) : JRE가 설치된 폴더의 경로</strong></p>
<p>저의 경우에는 자바 <code>1.8</code> 버전을 다운받아 <em>C:\Program Files\Java\jre1.8.0_181</em> 해당 값을 입력해 주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/cbea7f8a-e63b-47b0-a7e5-6ae2ab1e8062/image.png" alt=""></p>
<hr>
<h3 id="4-시스템-변수s-에서-path를-더블클릭하여-환경-변수-편집-창으로-들어갑니다">4. 시스템 변수(S) 에서 Path를 더블클릭하여 환경 변수 편집 창으로 들어갑니다.</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/28f580fe-96b7-4783-9bfd-b92104ebaec1/image.png" alt=""></p>
<hr>
<h3 id="5-환경-변수-편집-탭에서-아래와-같이-설정해줍니다">5. 환경 변수 편집 탭에서 아래와 같이 설정해줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/21810794-4420-4d01-8af2-00dec8958219/image.png" alt=""></p>
<ul>
<li><p>좌측 상단의 새로 만들기 버튼을 클릭한 후 %JRE_HOME%\bin 을 입력해줍니다.</p>
</li>
<li><p>우측 중단의 위로 이동 버튼으로 위로 옮겨줍니다.</p>
</li>
<li><p>우측 하단의 확인 버튼으로 저장해줍니다.</p>
</li>
</ul>
<hr>
<h3 id="🌠-정리">🌠 정리</h3>
<p><strong><code>jre</code></strong> : 자바 프로그램을 실행시키는 데 필요한 것
<strong><code>jdk</code></strong> : 자바 프로그램을 개발하는 데 필요한 것</p>
<p><strong><code>jdk</code></strong>를 다운로드 받으면 <strong><code>jre</code></strong> 도 포함되어 있기 때문에, 개발한 자바 프로그램을 실행시키는 것까지 가능합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ReactNative] Functional Component - TypeScript 로 변환]]></title>
            <link>https://velog.io/@bi-sz/ReactNative-Functional-Component-TypeScript-%EB%A1%9C-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@bi-sz/ReactNative-Functional-Component-TypeScript-%EB%A1%9C-%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 21 Dec 2023 01:56:23 GMT</pubDate>
            <description><![CDATA[<p>기존에 사용하고 있던 <strong>Functional Component</strong> 를 <em>TypeScript</em> 로 변환해주려고 합니다.</p>
<h1 id="⭐-프로젝트-생성">⭐ 프로젝트 생성</h1>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/968b3b63-eb9c-4e09-ac80-ac1e9148dca4/image.png" alt=""></p>
<pre><code class="language-shell">&gt; npx create-expo-app -t expo-template-blank-typescript
&gt; What is your app named? ... my-first-typescript-app</code></pre>
<p>프로젝트 생성시의 옵션을 달리하여 타입스크립트 템플릿의 <em>expo</em> 프로젝트를 생성해주었고, <em>Functional Component</em> 로 미리 만들어둔 <strong>component</strong> 들을 가져와주었습니다.</p>
<hr>
<h2 id="✡️-기본-컴포넌트-변환">✡️ 기본 컴포넌트 변환</h2>
<h3 id="💫-typography">💫 Typography</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/8bae57be-74fa-4567-ad21-36f75bad67b1/image.png" alt=""></p>
<p>파일 명을 <em>Typography.js</em> -&gt; <em>Typography.tsx</em> 로 변경해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a7e623f8-98db-4ec7-b861-07225c91153b/image.png" alt=""></p>
<p>불필요한 코드들을 주석처리 해주었습니다.</p>
<p><em>props</em> 를 선언하기 위해서 <em>React.FC</em> 로 <em>Typography</em> 컴포넌트를 정의해줍니다.</p>
<p><em>props</em> 명을 선언하고 타입을 지정합니다. <code>?</code> 는 값이 없을 수도 있는 경우 사용합니다.</p>
<h4 id="🌠-typescript-test">🌠 TypeScript Test</h4>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7ee63da5-3007-42da-a05a-4695723f9f9f/image.png" alt=""></p>
<p><em>package.json</em> 의 <em>script</em> 에 <code>&quot;test:typescript&quot;:&quot;tsc&quot;</code> 를 추가해줍니다.
하단의 <em>devDependencies</em> 의 <code>&quot;typescript&quot;: &quot;^5.1.3&quot;</code> 부분은 프로젝트를 생성할 때 자동으로 추가된 부분입니다.</p>
<pre><code class="language-shell">&gt; npm run test:typescript</code></pre>
<p>명령어를 치게되면 <em>tsc</em> 라고 응답해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a1c808dc-f6a4-457e-ba12-5791992e3375/image.png" alt=""></p>
<p><em>numberOfLines</em> 부분의 타입을 <code>number</code> 에서 <code>string</code> 으로 변경해주었습니다.
코드상에도 바로 빨간줄이 보이지만 </p>
<pre><code class="language-shell">&gt; npm run test:typescript</code></pre>
<p>명령어를 치게되면 잘못되었다고 오류를 알려줍니다.</p>
<hr>
<h3 id="💫-localimage">💫 LocalImage</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/47c3e5c9-ac45-4738-9e9b-0b1841e57422/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<h3 id="💫-remoteimage">💫 RemoteImage</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7b77896e-ca13-4c41-b2ec-00980f22d884/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/33ec70e4-0695-40d2-a248-3222a5e9be18/image.png" alt=""></p>
<p>테스트도 한 번 실행해보았습니다. 문제 없네요!</p>
<hr>
<h3 id="💫-singlelineinput">💫 SingleLineInput</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/e9cf4517-9409-4ca8-b40b-db09ce998372/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<h3 id="💫-multilineinput">💫 MultiLineInput</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/9dd263cd-6085-438b-b427-34c9c0a140b4/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<hr>
<h3 id="💫-icon">💫 Icon</h3>
<pre><code class="language-shell">&gt; npm install @expo/vector-icons --save</code></pre>
<p><code>@expo/vector-icon</code> 라이브러리를 설치해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/50e301ff-f9cb-4884-a2e3-5d24cbe284ad/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/dc5e77b9-9d8d-4b66-9fe9-745a585df878/image.png" alt=""></p>
<p><code>name</code> 부분에서 타입에러가 뜹니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/d40e84b3-7203-4a47-b31e-88d87bf80a50/image.png" alt=""></p>
<p><code>IconName</code> 을 별도로 지정해주면서 해결하였습니다.</p>
<h3 id="💫-tabicontsx">💫 TabIcon.tsx</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/84bc11ee-e8f2-40f9-94f2-5a4eb3db9a83/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<hr>
<h3 id="💫-spacer">💫 Spacer</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/16973adb-2c3f-499a-978d-e878d9a174a8/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<hr>
<h3 id="💫-divider">💫 Divider</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/1e0a0a89-63f7-4f0d-8719-e38dc1dca608/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<p>따로 설정해줄 부분이 없어서 <em>props</em> 에 대한 <em>Generic</em> 선언도 하지 않았습니다.</p>
<hr>
<h3 id="💫-button">💫 Button</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/7478048c-bd2c-4902-98b8-0d211fcf08f4/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<h3 id="💫-badge">💫 Badge</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/51db8291-5536-4170-b4d3-9bf4f9821d33/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<p><em>Typography</em> 에서 오류가 발생했습니다.
안에 <em>count</em> 값, <em>children</em> 이 설정되어있지 않아 오류가 발생하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a97eded7-1d30-44cb-98b2-4cfbd93c826c/image.png" alt=""></p>
<p><em>count</em> 값이 있냐 없냐를 기준으로 분기를 해주었습니다. </p>
<p>기본 컴포넌트들을 전부 수정해주었습니다.</p>
<hr>
<h2 id="✡️-헤더-컴포넌트-변환">✡️ 헤더 컴포넌트 변환</h2>
<h3 id="💫-headertitle">💫 HeaderTitle</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/bd7b7c07-868e-4df2-9749-1a1227bbca91/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<h3 id="💫-headergroup">💫 HeaderGroup</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a517fa74-a3ed-4641-91e7-e8f16d8881b3/image.png" alt=""></p>
<p>파일을 <strong>tsx</strong> 로 변경해주었고, <em>React.FC</em> 를 사용하여 변환해주었습니다.</p>
<h3 id="💫-headericon">💫 HeaderIcon</h3>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/c6c15acc-a9ec-41ba-8412-27a8ce96af98/image.png" alt=""></p>
<h3 id="💫-header">💫 Header</h3>
<pre><code class="language-shell">&gt; npm install react-native-safe-area-context --save</code></pre>
<p>헤더에서는 <em>react-native-safe-area-context</em> 를 사용하고있기 때문에 라이브러리를 설치해주었습니다.</p>
<p><em>Compound Components</em> 패턴으로 되어있기 때문에 수정해야할 부분이 조금 더 많습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/3c0df00e-984d-4232-9d3e-b064faf22eea/image.png" alt=""></p>
<p>우선 <em>Header Component</em> 부터 수정해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b4c332e3-9f36-4c9b-ac03-5d51feb4c498/image.png" alt=""></p>
<p>사용할 <em>Compound Components</em> 들의 타입 정의를 해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/87f557c3-2b0a-4e76-815b-ba0a2a193c80/image.png" alt=""></p>
<p>마지막으로 테스트! 문제 없네요!</p>
<hr>
<p><a href="https://github.com/bi-sz/my-first-typescript-app.git">https://github.com/bi-sz/my-first-typescript-app.git</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 에서의 TypeScript ]]></title>
            <link>https://velog.io/@bi-sz/React-%EC%97%90%EC%84%9C%EC%9D%98-TypeScript</link>
            <guid>https://velog.io/@bi-sz/React-%EC%97%90%EC%84%9C%EC%9D%98-TypeScript</guid>
            <pubDate>Wed, 20 Dec 2023 04:37:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@bi-sz/TypeScript-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4">https://velog.io/@bi-sz/TypeScript</a> 
지난 게시글에서 <em>TypeScript</em> 에 대해 간단하게 알아보았습니다.</p>
<p>이번 게시글에서는 <em>React</em> 에서의 <em>TypeScript</em> 를 다루어 보려고 합니다!</p>
<hr>
<h2 id="⭐-generic">⭐ Generic</h2>
<p>자료형을 먼저 정의하지 않고 여러 타입들을 사용할 수 있도록 열어두는 것입니다.</p>
<pre><code class="language-js">const item = &lt;T&gt;(arg:T[]):T[] =&gt; {
   return arg;
 }</code></pre>
<h2 id="⭐-컴포넌트-정의">⭐ 컴포넌트 정의</h2>
<h3 id="💫-reactfctype-reactfunctioncomponenttype💫">💫 <code>React.FC&lt;Type&gt;, React.FunctionComponent&lt;Type&gt;</code>💫</h3>
<pre><code class="language-js">const ComponentA: React.FC&lt;Type&gt; = (props) =&gt; {
  return &lt;ComponentCode {...etc}/&gt;;
}</code></pre>
<p><code>props</code> 선언이 맞지 않는다면 다른 결과값이 나타날 수 있습니다.</p>
<p><strong>FC</strong>는 <em>Generic</em> 으로 선언되어 있어 안에 타입을 지정해주면 props 에 대한 타입 추론을 하도록 되어있습니다.</p>
<h3 id="💫-usestate">💫 useState</h3>
<pre><code class="language-js">const [data, setData] = useState&lt;string&gt;(&quot;&quot;&quot;&quot;)</code></pre>
<p><strong>useState</strong> 도 마찬가지로 <em>Generic</em> 의 형태로 선언되어있습니다.</p>
<p><em>Generic</em> 으로 선언된 <code>&lt;String&gt;</code> 을 통해 <strong>state</strong> 가 가지고 있는 값이 <code>String</code> 인것을 알 수 있습니다.</p>
<h3 id="💫-usecallback">💫 useCallback</h3>
<pre><code class="language-js">const onPressed = useCallback &lt;(text:string)=&gt;void&gt;((text)=&gt;{
  {/* do something */}
}, [])</code></pre>
<p>함수 자체를 <em>Generic</em> 로 선언해둔 형태입니다.</p>
<h3 id="💫-usememo">💫 useMemo</h3>
<pre><code class="language-js">const onPressed = useMemo&lt;string&gt;(()=&gt;{
  return &quot;text&quot;
}, [])</code></pre>
<p><em>Generic</em> 의 형태로 선언되어있습니다.</p>
<h3 id="💫-flatlist">💫 FlatList</h3>
<pre><code class="language-js">&lt;FlatList&lt;TypeFlatListITem&gt;
  data = { /* some data */ }
  renderItem = {()=&gt;{ /* render */ }}
/&gt;</code></pre>
<p>위와 같은 형태로 <em>item</em> 의 <strong>Type</strong> 을 추론할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript 에 대한 이해]]></title>
            <link>https://velog.io/@bi-sz/TypeScript-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@bi-sz/TypeScript-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Wed, 20 Dec 2023 02:43:49 GMT</pubDate>
            <description><![CDATA[<h1 id="⭐-typescript">⭐ TypeScript</h1>
<ul>
<li>JavaScript + Type check = TypeScript</li>
<li>Microsoft 에서 개발</li>
<li>Javascript와 다르게 <code>정적 타입 언어</code></li>
</ul>
<blockquote>
</blockquote>
<p>** 정적 타입 언어 **
-컴파일시 에러가 발생하게 되면서 잘못 되었음을 알려줍니다.
-높은 진입장벽과 여러명이  작업하더라도 유지되는 생산성을 보입니다.</p>
<blockquote>
</blockquote>
<p>** 동적 타입 언어 **
-컴파일 단계 없이 프로그램이 구동될 때 타입체크가 됩니다.
-낮은 진입장벽과 혼자 작업할 때에는 높은 생산성을 보입니다.</p>
<hr>
<h2 id="💫-typescript-를-사용해야하는-이유">💫 TypeScript 를 사용해야하는 이유</h2>
<ol>
<li>동적 타입 언어의 경우 해당 타입이 어떠한 상황에 따라서 전체가 바뀌는 경우가 있습니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/a4b72921-115c-42a5-baa0-bca42d7f0601/image.png" alt=""></p>
<p>최초에는 <code>Number</code> 형태로 있다가 이후 <code>String</code> 값이 추가되면서 전체 <strong>Type</strong> 이 <code>String</code> 으로 변환되는 경우입니다.</p>
<p><strong>Type</strong> 이 의도치 않게 변경되었기 때문에 알지 못하는 <em>Undefined 에러</em> 혹은 <em>Type 에러</em> 가 발생할 수 있습니다.</p>
<p>정적 타입 언어를 사용하게 된다면 컴파일 시 타입체크를 하게 되어있기 때문에 해당 에러들을 사전에 방지할 수 있습니다.</p>
<ol start="2">
<li><code>IDE</code> 에서 제공되는 <strong>Type</strong> 추론</li>
</ol>
<p>_동적 타입 언어_의 경우 _컴파일_을 하지 않기 때문에 해당 객체 내부에 어떤 _프로퍼티_가 있는지에 대해서 매번 찾아봐야합니다.</p>
<p><strong>TypeScript</strong> 의 경우에는 이미 컴파일이 되어있기 때문에 <em>IDE</em> 에서 자동으로 찾아줍니다.</p>
<hr>
<h2 id="💫-primitive-types">💫 Primitive Types</h2>
<p>기본으로 제공해주는 타입을 <em>Primitive Types</em> 이라합니다.</p>
<ul>
<li><code>String</code> : 문자열 <strong>Type</strong></li>
<li><code>Number</code> : 숫자 <strong>Type</strong></li>
<li><code>Boolean</code> : <strong>true</strong>, <strong>false</strong> 등</li>
<li><code>null</code> : 데이터가 없는 것</li>
<li><code>enum</code> : 열거형 데이터 </li>
</ul>
<h3 id="🔹-선언-방법">🔹 선언 방법</h3>
<pre><code class="language-js">const a:string = &quot;Keep calm and code react-native&quot;</code></pre>
<p>변수 명을 선언한 뒤 <code>:(콜론)</code> 뒤에 해당 타입 명을 지정해 줍니다.</p>
<h4 id="🔻-string-number-boolean">🔻 <code>string</code>, <code>number</code>, <code>boolean</code></h4>
<pre><code class="language-js">const a:string = &#39;Test code ${variable}` (OK)
const a:string = 0 (ERROR)
const a:number = 10 + 2 (OK)
const a:number = 10 + &quot;2&quot; (ERROR)
const a:boolean = a === 10 (OK)
const a:boolean = list.length (ERROR)</code></pre>
<h4 id="🔻-enum">🔻 <code>enum</code></h4>
<pre><code class="language-js">enum COCLORS {
  Red,
  Blue,
}
const a:COLORS = COLORS.Red (OK)
const a:COLORS = &#39;red&#39; (ERROR)</code></pre>
<h4 id="🔻-list">🔻 <code>list</code></h4>
<pre><code class="language-js">const strList:string [] = [&quot;&quot;A&quot;&quot;, &quot;&quot;B&quot;&quot;, &quot;&quot;C&quot;&quot;] (OK)
const numList:number[] = [0, 1, 2,&quot;3&quot;] (ERROR)</code></pre>
<hr>
<p><a href="https://velog.io/@bi-sz/React-%EC%97%90%EC%84%9C%EC%9D%98-TypeScript">https://velog.io/@bi-sz/React에서의 TypeScript</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] RestTemplate 사용해보기]]></title>
            <link>https://velog.io/@bi-sz/Spring-RestTemplate-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bi-sz/Spring-RestTemplate-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 19 Dec 2023 08:35:45 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@bi-sz/Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-%EC%99%B8%EB%B6%80-API-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0">https://velog.io/@bi-sz/Spring-API</a>
지난 게시글에서 외부API 호출 도구를 살펴 보았습니다.
<strong>WebClient</strong> 를 적용해보고 싶은데 <em>Spring5</em> 를 적용한 프로젝트가 없어서 우선은 <strong>RestTemplate</strong> 을 선택하였습니다.</p>
<hr>
<h2 id="⭐-resttemplate-사용을-위해-의존성-추가">⭐ RestTemplate 사용을 위해 의존성 추가</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/21e378c0-cd08-40b5-9dac-b92e09d83c44/image.png" alt=""></p>
<p><em>Maven</em> 프로젝트 이므로 <strong>pom.xml</strong> 파일에 의존성을 추가해주었습니다. </p>
<p><strong>apache</strong>에서 제공하는 <code>httpcore</code>, <code>httpclient</code> 의존성을 추가해주었습니다.</p>
<p><em>RestTemplate</em> 을 생성할 때 어떠한 <code>HTTP Client</code> 를 사용할 것인지 <em>ClientHttpRequestFactorty</em> 를 전달하여 지정할 수 있습니다. 
기본 생성자의 경우 내부적으로는 <em>ClientHttpRequestFactory</em> 의 구현체인 <em>SimpleClientHttpRequestFactory</em> 를 사용하여 초기화 합니다. 
<strong>jdk</strong>가 기본으로 제공하는 <em>HttpURLConnection</em> 을 통해 <em>ClientHttpRequest</em> 객체를 생성합니다.
<em>HttpComponentsClientHttpRequestFactory</em> 를 생성자에 넘겨 사용할 수 있습니다.</p>
<hr>
<h2 id="⭐-resttemplate">⭐ RestTemplate</h2>
<pre><code class="language-java">package egovframework.com.api.RestTemplateUtil;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateUtil {

    public HashMap&lt;String, Object&gt; send(Map&lt;String, String&gt; param, String url, HttpHeaders header) {

        // 결과값을 담을 객체 생성
        HashMap&lt;String, Object&gt; result = new HashMap&lt;String, Object&gt;();
        if(ObjectUtils.isEmpty(param)) {
            result.put(&quot;ERROR&quot;, &quot;수신 패킷 전송 오류&quot;);
            return result;
        }
        if(StringUtils.isEmpty(url)) {
            result.put(&quot;ERROR&quot;, &quot;수신 패킷 전송 오류&quot;);
            return result;
        }
        if(header == null) {
            result.put(&quot;ERROR&quot;, &quot;수신 패킷 전송 오류&quot;);
            return result;
        }

        try {
            // 타임아웃 설정 시 HttpComponentsClientHttpRequestFactory 객체 생성
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
            factory.setConnectTimeout(5000); //타임아웃 설정 5초
            factory.setReadTimeout(5000);//타임아웃 설정 5초

//            //Apache HttpComponents : 각 호스트(IP와 Port의 조합)당 커넥션 풀에 생성가능한 커넥션 수
//            HttpClient httpClient = HttpClientBuilder.create()
//                                                    .setMaxConnTotal(50)//최대 커넥션 수
//                                                    .setMaxConnPerRoute(20).build();
//            factory.setHttpClient(httpClient);

            // RestTemplate 객체 생성
            RestTemplate restTemplate = new RestTemplate(factory);

            // 설정한 Header와 Body를 가진 HttpEntity 객체 생성
            HttpEntity&lt;?&gt; entity = new HttpEntity&lt;&gt;(param, header);     // 요청하기 위해 body와 header합치기
            // HTTP POST 요청
            ResponseEntity&lt;String&gt; response = restTemplate.exchange(new URI(url), HttpMethod.POST, entity, String.class);            
            // result로 응답받은 결과를 출력
            JSONObject jsonObj = new JSONObject(response.getBody());

            if(!ObjectUtils.isEmpty(jsonObj)) {
                result.put(&quot;result&quot;, jsonObj);
            }

        } catch (Exception e) {
            result.put(&quot;ERROR&quot;, &quot;api 호출 에러&quot;);
            e.printStackTrace();
            return result;
        }

        return result;
    }
}</code></pre>
<hr>
<h2 id="⭐-요청-url-설정">⭐ 요청 URL 설정</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/5521d491-0f90-401a-acf9-bd48c4dca6b5/image.png" alt=""></p>
<p><strong>properties</strong> 파일에 <em>url</em> 정보를 추가해주었습니다.</p>
<hr>
<h2 id="⭐-resttemplate-butilder-util">⭐ RestTemplate Butilder Util</h2>
<p><em>Builder</em> 패턴을 이용하여 <em>RestTemplate</em> 으로 <em>HTTP</em> 요청을 할 <strong>Util</strong> 클래스를 생성해주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/07821f35-fc80-419f-bc0f-e0a10aa82d0d/image.png" alt=""></p>
<p><code>url</code>을 설정하고, <code>헤더</code>를 설정하고, <code>파라미터</code>를 설정하고 <strong>API</strong> 를 호출해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/319bedfd-4293-45be-a100-7f3e204add74/image.png" alt=""></p>
<p><strong>API</strong> 호출을 통해 받은 <strong>response</strong> 값을 <em>Map</em> 으로 변환, 시간 포맷, <em>String, JSON</em> 타입 변환 등의 작업도 아래에 추가해주었습니다. </p>
<p><em>Util</em> 파일에 메시지를 전송하는 <strong>API</strong>를 호출하는 <em>sendMessage</em> 함수를 만들어주었고 이제 함수를 호출하여 <strong>API</strong>를  사용할 수 있습니다.</p>
<h2 id="⭐-api-호출-함수-사용하기">⭐ API 호출 함수 사용하기</h2>
<p><img src="https://velog.velcdn.com/images/bi-sz/post/b90c4d95-18d3-4bdd-9a72-46ac3c9ad1c7/image.png" alt=""></p>
<p><em>Controller</em> 에서 호출하여 사용해주었습니다.</p>
<hr>
<p>잘 동작하였고,, 추후에 쓸 일이 많을거 같아서 갖다 쓰려고 정리한 글 ..</p>
]]></description>
        </item>
    </channel>
</rss>