<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>naji2-2.log</title>
        <link>https://velog.io/</link>
        <description>개발자 꿈나무 여고생</description>
        <lastBuildDate>Sat, 07 Jun 2025 12:43:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>naji2-2.log</title>
            <url>https://velog.velcdn.com/images/naji2-2/profile/a4a84177-4e69-473a-9ab2-c4569b120d8f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. naji2-2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/naji2-2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Node.js 시간 데이터 오전 오후 구분하기]]></title>
            <link>https://velog.io/@naji2-2/Node.js-%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%A4%EC%A0%84-%EC%98%A4%ED%9B%84-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Node.js-%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%A4%EC%A0%84-%EC%98%A4%ED%9B%84-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 07 Jun 2025 12:43:40 GMT</pubDate>
            <description><![CDATA[<h2 id="1-오늘의-목표">1. 오늘의 목표</h2>
<p>먼저 time 데이터는 &quot;11:00&quot;, &quot;18:00&quot; 처럼 문자열 형식으로 들어있다.</p>
<p>이 데이터를 &quot;오전 11시&quot;, &quot;오후 6시&quot;의 형태로 반환하는 것이 내 목표이다.</p>
<hr>
<h2 id="2-시간과-분-데이터-나누기">2. 시간과 분 데이터 나누기</h2>
<ul>
<li>오전, 오후를 판단하는데 필요한 시간 부분만 가져와 줍니다!</li>
</ul>
<pre><code class="language-javascript">const [hourStr, minuteStr] = reserve_info.time.split(&quot;:&quot;);
const hour = parseInt(hourStr, 10);</code></pre>
<blockquote>
<ul>
<li>*<em>split() : *</em> 지정한 문자열을 기준으로 나누어 배열로 반환해주는 함수</li>
</ul>
</blockquote>
<ul>
<li>*<em>parseInt(문자열, 진수) : *</em> 문자열을 숫자로 변환해주는 함수</li>
</ul>
<p>문자열을 숫자로 변환할때 진수까지 표현한 이유는
0n처럼 0으로 시작하는숫자가 입력 되었을 때 8진수로 착각하는 경우를 방지하기 위함이다!</p>
<p><strong>참고자료</strong>
<a href="https://blog.naver.com/ki79david/80153380823">자바스크립트 parseInt오류 관련 (08, 09형태의 문자가 0으로 되는 문제)</a></p>
<hr>
<h2 id="3-오전-오후-구분하기">3. 오전, 오후 구분하기</h2>
<ul>
<li>12보다 작으면 오전으로 12보다 크면 오후로 판단하기!</li>
</ul>
<pre><code class="language-javascript">let period = &#39;&#39;;
let displayHour = hour;

if (hour &lt; 12) {
  period = &#39;오전&#39;;
  if (hour === 0) displayHour = 12;
} else {
  period = &#39;오후&#39;;
  if (hour &gt; 12) displayHour = hour - 12;
}</code></pre>
<p>이 부분은 코드 설명이 필요없을 정도로 간단한 로직이다.
오전일 때 00시는 12시로 나타냈고,
오후일 때는 12을 빼서 원하는 형태로 변환했다. </p>
<hr>
<h2 id="4-문자-합치기">4. 문자 합치기</h2>
<ul>
<li>원하는 형태로 바꾼 시간 데이터를 합치는 코드<pre><code class="language-javascript">period.concat(&quot; &quot;, displayHour, &quot;시&quot;),</code></pre>
<blockquote>
<ul>
<li><strong>문자열1.concat(문자열2) :</strong> 문자열을 합쳐주는 함수</li>
</ul>
</blockquote>
</li>
</ul>
<p>concat을 사용해 완성된 문자열을 합쳤다!</p>
<pre><code class="language-javascript">period + &quot; &quot; + displayHour + &quot;시&quot;</code></pre>
<p>concat함수를 사용하지 않고 이렇게도 할 수 있다.
나는 날짜 계산할 때 concat을 사용해서 시간도 concat을 사용했다!</p>
<hr>
<h2 id="5-결과">5. 결과</h2>
<pre><code class="language-javascript">{
    &quot;date&quot;: &quot;2025.06.05 (목)&quot;,
    &quot;time&quot;: &quot;오전 11시&quot;,
    &quot;people_num&quot;: &quot;3명&quot;
}</code></pre>
<p>이렇게 시간까지 원하는 형태로 바꿀 수 있었다!
코딩테스트 푸는 것 같고 재미있었던 거 같다ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 날짜 변환, 요일 구하기]]></title>
            <link>https://velog.io/@naji2-2/Node.js-%EB%82%A0%EC%A7%9C-%EB%B3%80%ED%99%98-%EC%9A%94%EC%9D%BC-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Node.js-%EB%82%A0%EC%A7%9C-%EB%B3%80%ED%99%98-%EC%9A%94%EC%9D%BC-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 07 Jun 2025 12:05:43 GMT</pubDate>
            <description><![CDATA[<h2 id="1-오늘의-목표">1. 오늘의 목표</h2>
<p>DB에 날짜 데이터가 &quot;2025-06-05&quot;형식으로 저장되어있는데,
이걸 &quot;2025.06.05 (목)&quot; 형식으로 변환하여 반환하는 것이 목표이다.</p>
<hr>
<h2 id="2-원하는-형태로-변환">2. 원하는 형태로 변환</h2>
<ul>
<li><strong>&quot;2025-06-05&quot; 를 &quot;2025.06.05&quot;로 바꾸는 코드</strong><pre><code class="language-javascript">const reserve_date = reserve_info.date.replace(/-/g, &quot;.&quot;);</code></pre>
<blockquote>
<ul>
<li><strong>/-/g :</strong> global 플래그, 모든 &quot;-&quot;</li>
</ul>
</blockquote>
</li>
<li><strong>replace(a, b) :</strong>  a를 b로 변환</li>
</ul>
<p>정규표현식과 replace 함수를 사용하여 &quot;2025.06.05&quot; 형태로 바꾸었다.
이것만으로도 거의 다 됐다고 볼 수있다!!</p>
<hr>
<h2 id="3-요일-구하기">3. 요일 구하기</h2>
<ul>
<li><strong>해당 날짜의 요일을 구하는 코드</strong><pre><code class="language-javascript">const date = new Date(reserve_info.date);
const day_list = [&quot;(일)&quot;, &quot;(월)&quot;, &quot;(화)&quot;, &quot;(수)&quot;, &quot;(목)&quot;, &quot;(금)&quot;, &quot;(토)&quot;];</code></pre>
<blockquote>
<ul>
<li>*<em>new Date() : *</em> Date 객체를 만들어서 날짜/시간을 표현할 수 있게 해주는 함수</li>
</ul>
</blockquote>
</li>
</ul>
<p>내 reserve_info.date는 &quot;20205-06-05&quot;라는 값을 가지고 있기 때문에 이걸로 Date객체를 만들면 &quot;2025-06-05T00:00:00.000Z&quot;으런 형태로 나온다.</p>
<p>getDay()를 사용할 것이기 때문에 요일을 담은 배열도 만들었다
  =&gt; 요일을 0, 1, 2, 3과 같은 숫자로 반환함 (0부터 일요일)</p>
<hr>
<h2 id="4-문자-합치기">4. 문자 합치기</h2>
<ul>
<li>원하는 형태로 바꾼 날짜와 요일을 합치는 코드<pre><code class="language-javascript">reserve_date.concat(&quot; &quot;, day_list[date.getDay()]);</code></pre>
<blockquote>
<ul>
<li><strong>문자열1.concat(문자열2) :</strong> 문자열을 합쳐주는 함수</li>
</ul>
</blockquote>
</li>
</ul>
<p>concat을 사용해 완성된 문자열을 합쳤다!</p>
<pre><code class="language-javascript">reserve_date + &quot; &quot; + day_list[date.getDay()];</code></pre>
<p>concat함수를 사용하지 않고 이렇게도 할 수 있다.</p>
<hr>
<h2 id="5-결과">5. 결과</h2>
<pre><code class="language-javascript">{
    &quot;date&quot;: &quot;2025.06.05 (목)&quot;,
    &quot;time&quot;: &quot;11:00&quot;,
    &quot;people_num&quot;: &quot;3명&quot;
}</code></pre>
<p>원하던 대로 값이 잘 나오는 것을 알 수 있다!
이제 time도 변환해야겠다..ㅎㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git reset --hard HEAD~1 잘못 사용했을 때 해결]]></title>
            <link>https://velog.io/@naji2-2/git-reset-hard-HEAD1-%EC%9E%98%EB%AA%BB-%EC%82%AC%EC%9A%A9%ED%96%88%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@naji2-2/git-reset-hard-HEAD1-%EC%9E%98%EB%AA%BB-%EC%82%AC%EC%9A%A9%ED%96%88%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Fri, 06 Jun 2025 06:33:31 GMT</pubDate>
            <description><![CDATA[<h1 id="글을-쓰게-된-이유">글을 쓰게 된 이유</h1>
<blockquote>
<p>커밋 메세지를 잘못 작성한 상태로 커밋을 해버려서
원격에 올린 커밋 내역을 삭제해보기로했다.</p>
</blockquote>
<p>과거에 한 번 실패한 경험이 있지만...
<a href="https://velog.io/@naji2-2/git-rest-HEAD-%EC%9E%98%EB%AA%BB-%EC%82%AC%EC%9A%A9%ED%96%88%EC%9D%84-%EB%95%8C-%EC%BB%A4%EB%B0%8B-%EB%82%B4%EC%9A%A9-%EB%90%98%EB%8F%8C%EB%A6%AC">git rest HEAD^ 잘못 사용했을 때 커밋 내용 되돌리기</a></p>
<hr>
<h2 id="1-git-reset---hard-head1-사용법">1. git reset --hard HEAD~1 사용법</h2>
<h4 id="1---1--로컬에서-커밋-내역-삭제하기">1 - 1 ) 로컬에서 커밋 내역 삭제하기</h4>
<blockquote>
<pre><code>git reset --hard HEAD~1</code></pre></blockquote>
<pre><code>Git Bash에 해당 명령문을 작성하면
먼저 로컬에서 커밋 내역이 삭제 된다.

#### 1 - 2 ) 원격에 반영시키기
&gt; ``` 
git push origin main --force</code></pre><p>위의 명령문을 통해
변경 된 내역을 원격에 강제로 반영 시킬 수 있다.</p>
<hr>
<h2 id="2-git-reset---hard-head1-되돌리는법">2. git reset --hard HEAD~1 되돌리는법</h2>
<h4 id="2---1--작업-내역-로그하기">2 - 1 ) 작업 내역 로그하기</h4>
<blockquote>
<pre><code>git reflog</code></pre></blockquote>
<pre><code>Git Bash에 해당 명령문을 작성하면
최근 HEAD 이동 내역을 볼 수 있다.

#### 2 - 2 ) 원하는 커밋 찾기
&gt;![](https://velog.velcdn.com/images/naji2-2/post/af2d7dbb-83da-4f7e-9af2-19b6f965afa8/image.png)

명령어를 사용하면 이런 커밋 내역들을 발견할 수 있을 것이다.
노란색으로 가려진 부분이 해시인데 이부분을 복사한다

#### 2 - 3 ) 복구하기
&gt; ``` 
git reset --hard (해시)</code></pre><p>이렇게 하면 삭제했던 입력한 해시의 커밋 내역이 돌아온다.</p>
<hr>
<h1 id="후기">후기</h1>
<blockquote>
<p>왠만하면 이 기능은 사용하지 않는 게 좋겠다..
특히 협업이나, 중요한 프로젝트라면 더더욱
나는 다행히 문제가 있었던 프로젝트 둘 다 혼자 진행하는 부분이었기에 큰 문제는 없었다</p>
</blockquote>
<h4 id="하지만-괜히-사용했다가-더-큰-파장을-불러올-수-있으니까경험담">하지만 괜히 사용했다가 더 큰 파장을 불러올 수 있으니까...(경험담)</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++ / 함수 오버로딩 모호성 문제 해결]]></title>
            <link>https://velog.io/@naji2-2/C-%ED%95%A8%EC%88%98-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EB%AA%A8%ED%98%B8%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@naji2-2/C-%ED%95%A8%EC%88%98-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EB%AA%A8%ED%98%B8%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Mon, 28 Apr 2025 08:56:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>함수 오버로딩 모호성 문제에 대해 공부해보았다</p>
</blockquote>
<h1 id="1-문제-발생">1. 문제 발생</h1>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int function(int a = 5) {
    return a + 1;
}

int function(void) {
    return 10;
}

int main(void) {
    std::cout &lt;&lt; function() &lt;&lt; std::endl;
    std::cout &lt;&lt; function(3) &lt;&lt; std::endl;
    return 0;
}</code></pre>
<p>함수 시그니처가 다르기 때문에 실행될 것이라고 생각했지만, 실행되지 않았다.</p>
<blockquote>
</blockquote>
<p>이유는 디폴트 매개변수가 있는 함수의 경우</p>
<pre><code class="language-cpp">std::cout &lt;&lt; function() &lt;&lt; std::endl;
std::cout &lt;&lt; function(3) &lt;&lt; std::endl;</code></pre>
<p>인자가 없는 경우와 있는 경우 모두 실행될 수 있기 때문인데,
따라서 C++ 컴파일러는 둘 다 후보 함수로 생각하게 된다.</p>
<h1 id="2-문제-해결">2. 문제 해결</h1>
<h3 id="2-1-해결-방법-1--디폴트-인자를-제거하거나-하나만-정의">2-1) 해결 방법 1 : 디폴트 인자를 제거하거나 하나만 정의</h3>
<pre><code class="language-cpp">int function(int a) {
    return a + 1;
}</code></pre>
<p>또는</p>
<pre><code class="language-cpp">int function() {
    return 10;
}</code></pre>
<p>이렇게 수정하여 모호성 문제가 발생하지 않도록 하는 방법이 있다.</p>
<h3 id="2-2-해결-방법-2--이름을-다르게-해서-오버로딩-문제-없애기">2-2) 해결 방법 2 : 이름을 다르게 해서 오버로딩 문제 없애기</h3>
<pre><code class="language-cpp">int functionWithParam(int a = 5) {
    return a + 1;
}

int function() {
    return 10;
}</code></pre>
<p>위와 같이 함수의 이름을 바꾸게 되면 출력문도</p>
<pre><code class="language-cpp">std::cout &lt;&lt; function() &lt;&lt; std::endl;
std::cout &lt;&lt; functionWithParam(3) &lt;&lt; std::endl;</code></pre>
<p>이렇게 바뀌기 때문에 모호성 문제가 발생하지 않게 되는 방법이다.</p>
<blockquote>
<p>디폴트 매개변수를 설정한 것에는 이유가 있기 때문에 2번째 방법 처럼 이름을 바꾸는 것이 더 맞는 해결 방법인 것 같지만
함수의 이름을 같게 설정한 것에도 이유가 있을 것 같다는 생각든다...</p>
</blockquote>
<h1 id="3-느낀점">3. 느낀점</h1>
<blockquote>
<p>디폴트 매개변수가 있는 함수와 매개변수가 없는 함수를 같이 선언하면,
인자 없이 호출할 경우 둘 다 호출될 수 있어서 모호성이 생긴다는 것을 알게 되었다.</p>
</blockquote>
<p>오늘 선생님께 질문을 드렸고 실무에서는 위와 같은 모호성 문제가 발생하면 함수 이름을 수정하는 방법보다는 디폴트 인자를 제거하는 방식이 나을 것이라고 하셨다.  함수 이름이 같은 것에는 이유가 있고, 또 이름이 같은 함수는 오버로딩인 경우가 있기 때문이다.</p>
<p>이론 공부는 어렵지만 알 수록 코드를 작성하는데 도움이 되는 것 같아 더 열심히 공부하고 싶다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++ / 디폴트 매개변수를 가진 함수]]></title>
            <link>https://velog.io/@naji2-2/C-%EB%94%94%ED%8F%B4%ED%8A%B8-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A5%BC-%EA%B0%80%EC%A7%84-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@naji2-2/C-%EB%94%94%ED%8F%B4%ED%8A%B8-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A5%BC-%EA%B0%80%EC%A7%84-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 27 Apr 2025 13:57:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>디폴트 매개변수를 가진 함수에 대해 공부해보았다</p>
</blockquote>
<h1 id="1-기본-예제">1. 기본 예제</h1>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int function(int a = 5) {
     return a + 1;
}

int main(void) {
     std::cout &lt;&lt; function() &lt;&lt; std::endl;    // 6
     std::cout &lt;&lt; function(3) &lt;&lt; std::endl;    // 4
     return 0;
}</code></pre>
<blockquote>
<h4 id="디폴트-매개변수란">디폴트 매개변수란?</h4>
<p>전달되지 않은 인자를 대신하기 위한 기본 값이 설정되어 있는 변수이다</p>
</blockquote>
<pre><code class="language-cpp">std::cout &lt;&lt; function() &lt;&lt; std::endl;</code></pre>
<p>이렇게 실행하게 되면 디폴트 값이 5가 a에 들어가 실행결과가 6이 된다.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; function(3) &lt;&lt; std::endl;</code></pre>
<p>이렇게 실행하게 되면 인자인 3이 a에 들어가 실행결과가 4가 된다.</p>
<h1 id="2-발생-할-수-있는-오류">2. 발생 할 수 있는 오류</h1>
<h3 id="매개변수가-2개인-경우-발생-할-수-있는-오류">매개변수가 2개인 경우 발생 할 수 있는 오류</h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int function(int a = 5, int b) {
     return a + b +  1;
}

int main(void) {
     std::cout &lt;&lt; function(10, 2) &lt;&lt; std::endl;
     std::cout &lt;&lt; function(3) &lt;&lt; std::endl;
     return 0;
}</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-cpp">std::cout &lt;&lt; function(10, 2) &lt;&lt; std::endl;</code></pre>
<p>해당 코드는 정상적으로 13이 출력 된다.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; function(3) &lt;&lt; std::endl;</code></pre>
<p>하지만 이 코드에서 문제가 발생한다.</p>
<p>이유는 매개변수 중 a에만 디폴트 값이 들어있기 때문이다.
인자로 들어간 3은 a값에 들어가게되고, b값은 초기화되지 않았기 때문에 문제가 된다.</p>
<h3 id="해결-방법">해결 방법</h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 int function(int a, int b = 5) {
     return a + b + 1;
 }

int main(void) {
     std::cout &lt;&lt; function(10, 2) &lt;&lt; std::endl;
     std::cout &lt;&lt; function(3) &lt;&lt; std::endl;
     return 0;
}</code></pre>
<blockquote>
<p>디폴트 값을 주려면 뒤에 있는 변수에 값을 주어야 문제가 발생하지 않는다. 이렇게 디폴트 값을 주면 인자가 한 개인 경우와 두 개인 경우 모두 정상적으로 실행되기 때문이다.</p>
</blockquote>
<h1 id="3-느낀점">3. 느낀점</h1>
<blockquote>
<p>방과후 시간에 C++을 복습하며,
배웠던 개념을 정리 할 수 있어서 좋았다!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[node.js 이론 공부 / callback 함수에 대하여]]></title>
            <link>https://velog.io/@naji2-2/node.js-%EC%9D%B4%EB%A1%A0-%EA%B3%B5%EB%B6%80-callback-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@naji2-2/node.js-%EC%9D%B4%EB%A1%A0-%EA%B3%B5%EB%B6%80-callback-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Thu, 24 Apr 2025 15:02:14 GMT</pubDate>
            <description><![CDATA[<h1 id="1-콜백-함수란">1. 콜백 함수란?</h1>
<blockquote>
<p>node.js에서 callback함수는 특정 작업이 완료된 후에 호출되는 함수
다른 함수의 인수로 전달되는 함수로 비동기 작업을 처리할 때 사용</p>
</blockquote>
<h4 id="1-1-특징">1-1) 특징</h4>
<blockquote>
<ul>
<li>argument로 넘겨 받는 함수</li>
</ul>
</blockquote>
<ul>
<li>외부함수에 의해서 호출 되는 함수</li>
<li>비동기 처리에 유용함</li>
</ul>
<h1 id="2-콜백-함수를-사용하는-이유는">2. 콜백 함수를 사용하는 이유는?</h1>
<blockquote>
<p>node.js는 비동기, 논블로킹(Nom-blocking) 방식으로 작동함
IO작업(파일 읽기, 데이터베이스 쿼리 등)이 끝날 때 까지 기다리지 않고
다음 작업을 시작함.
이때, 비동기 작업이 끝난 후 실행할 코드가 필요함 -&gt;  콜백 함수
(<strong>순차적</strong>으로 진행해야하는 일이 있을 때, CPU를 효율적으로 사용하기 위해서)</p>
</blockquote>
<h1 id="3-콜백-함수의-예시">3. 콜백 함수의 예시</h1>
<h4 id="3-1-비동기-작업에-대한-콜백-함수-사용-예시-파일-읽기">3-1) 비동기 작업에 대한 콜백 함수 사용 예시 (파일 읽기)</h4>
<pre><code class="language-javascript">const fs = require(&#39;fs&#39;);

// 비동기적으로 파일을 읽는 예시
fs.readFile(&#39;example.txt&#39;, &#39;utf8&#39;, (err, data) =&gt; {
  if (err) {
    console.log(&#39;파일 읽기 오류:&#39;, err);
    return;
  }
  console.log(&#39;파일 내용:&#39;, data);
});</code></pre>
<blockquote>
<ul>
<li>파일을 비동기적으로 읽음
세번째 인수로 콜백 함수를 받아, 파일 읽기가 완료되면 호출</li>
<li><blockquote>
<p>err : 오류가 발생하면 오류 정보를 전달</p>
</blockquote>
</li>
<li><blockquote>
<p>data : 파일의 내용이 정상적으로 읽히면 내용을 전달</p>
</blockquote>
</li>
</ul>
</blockquote>
<h4 id="3-2-일반적인-함수의-콜백-함수-예시">3-2) 일반적인 함수의 콜백 함수 예시</h4>
<pre><code class="language-javascript">function greet(name, callback) {
    console.log(`Hello, ${name}!`);
    callback();  // 콜백 함수 호출
}

// 콜백 함수 정의
function sayGoodbye() {
    console.log(&#39;Goodbye!&#39;);
}

// greet 함수 호출 시 콜백 함수로 sayGoodbye 전달
greet(&#39;Alice&#39;, sayGoodbye);
</code></pre>
<blockquote>
<ul>
<li>name과 콜백 함수 callback을 인수로 받음</li>
</ul>
</blockquote>
<ul>
<li>greet 함수는 이름을 출력한 후, callback()을 호출하여 sayGoodbye를 실행</li>
</ul>
<p>&quot;Hello, Alice!&quot;가 먼저 출력 후, &quot;Goodbye!&quot;를 출력</p>
<h1 id="4-콜백-함수의-장점">4. 콜백 함수의 장점</h1>
<blockquote>
<ul>
<li><strong>비동기 작업 처리</strong>: 비동기적으로 실행되는 작업이 끝난 후 실행할 작업을 콜백 함수로 정의할 수 있어 프로그램이 대기하지 않고 다른 작업을 계속할 수 있음</li>
</ul>
</blockquote>
<ul>
<li><strong>유연성</strong>: 코드에서 필요한 부분을 콜백 함수로 전달해 재사용 가능한 구조를 만들 수 있음</li>
</ul>
<h1 id="5-콜백-지옥--콜백-함수의-단점">5. 콜백 지옥 : 콜백 함수의 단점</h1>
<blockquote>
<p>콜백 함수가 중첩되면 가독성이 떨어지고,
코드 관리가 어려워지는 상황을 콜백 지옥이라고 함</p>
</blockquote>
<h4 id="콜백-지옥의-예시">콜백 지옥의 예시</h4>
<pre><code class="language-javascript">fs.readFile(&#39;file1.txt&#39;, &#39;utf8&#39;, (err, data1) =&gt; {
if (err) throw err;
      fs.readFile(&#39;file2.txt&#39;, &#39;utf8&#39;, (err, data2) =&gt; {
    if (err) throw err;
        fs.readFile(&#39;file3.txt&#39;, &#39;utf8&#39;, (err, data3) =&gt; {
        if (err) throw err;
            console.log(data1, data2, data3);
        });
    });
});
</code></pre>
<p>이를 보완하기 위해 promise, async/await를 사용함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 실습중 오류 : ORA-01017: invalid username/password; logon denied, 오라클 연결 안 됨]]></title>
            <link>https://velog.io/@naji2-2/SpringBoot-%EC%8B%A4%EC%8A%B5%EC%A4%91-%EC%98%A4%EB%A5%98-ORA-01017-invalid-usernamepassword-logon-denied-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%97%B0%EA%B2%B0-%EC%95%88-%EB%90%A8</link>
            <guid>https://velog.io/@naji2-2/SpringBoot-%EC%8B%A4%EC%8A%B5%EC%A4%91-%EC%98%A4%EB%A5%98-ORA-01017-invalid-usernamepassword-logon-denied-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%97%B0%EA%B2%B0-%EC%95%88-%EB%90%A8</guid>
            <pubDate>Mon, 21 Apr 2025 02:37:54 GMT</pubDate>
            <description><![CDATA[<p>MyBatis를 이용한 스프링부트 실습중 오류가 발생하였다.
java.sql.SQLException: ORA-01017: invalid username/password; logon denied</p>
<p>application.properties 설정 파일의
username과 password 중 오타가 있어서 오라클에 접속하지 못해 발생한 오류였다.</p>
<pre><code class="language-sql">SELECT * FROM all_users;</code></pre>
<p>위의 명령어를 사용해 내가 적은 username 이 있는지 확인했고
목록에 없다는 걸 알게 되어 수정하였다!</p>
<p>이후에 
<img src="https://velog.velcdn.com/images/naji2-2/post/7bd29b1e-f070-445e-ac3b-e745fca10a84/image.png" alt=""></p>
<p>값을 넣어보니!</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/277aaa10-7a96-4e8b-b148-0be54771694d/image.png" alt=""></p>
<p>잘 들어가는 것을 확인 할 수 있었다!
오타가 없는지 꼼꼼히 확인하고, 에러메세지를 잘 봐야겠다는 생각을 하게되었다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot 실습중 오류 : Failed to determine a suitable driver class, 서버 끊김]]></title>
            <link>https://velog.io/@naji2-2/SpringBoot-%EC%8B%A4%EC%8A%B5%EC%A4%91-%EC%98%A4%EB%A5%98-Failed-to-determine-a-suitable-driver-class-%EC%84%9C%EB%B2%84-%EB%81%8A%EA%B9%80</link>
            <guid>https://velog.io/@naji2-2/SpringBoot-%EC%8B%A4%EC%8A%B5%EC%A4%91-%EC%98%A4%EB%A5%98-Failed-to-determine-a-suitable-driver-class-%EC%84%9C%EB%B2%84-%EB%81%8A%EA%B9%80</guid>
            <pubDate>Fri, 18 Apr 2025 02:38:23 GMT</pubDate>
            <description><![CDATA[<p>스프링 시간에 오류가 발생했다
Reason: Failed to determine a suitable driver class</p>
<p>Action:</p>
<p>Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).</p>
<pre><code>spring.datasource.username=springscott</code></pre><p><img src="https://velog.velcdn.com/images/naji2-2/post/fa67fea7-a9c1-41a5-9947-a49511092495/image.png" alt=""></p>
<p>데이터 베이스 이름을 잘못 작성해 찾을 수 없어 발생한 오류였다...
이름을 수정하니 해당 오류는 뜨지 않았지만</p>
<p>Error starting ApplicationContext. To display the condition evaluation report re-run your application with &#39;debug&#39; enabled.
2025-04-18T11:27:09.080+09:00 ERROR 18576 --- [MyBatisPrj] [  restartedMain] o.s.boot.SpringApplication               : Application run failed</p>
<p>여전히 실행되지 않고 서버가 꺼졌다.
<img src="https://velog.velcdn.com/images/naji2-2/post/73ba7205-2efd-4588-9750-c028cb4ff0da/image.png" alt=""></p>
<p>옆에서 친구가 Memo_mapper.xml 파일을 지워보라는 말을 듣고
아직 아무내용도 없던 빈 파일이었기에 지워봤는데</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/9517ea60-1d8f-4d06-93b3-dd8d95d368d0/image.png" alt=""></p>
<p>잘 실행 된다!
왜 실행 되지 않았던 건지는 알지 못하겠다..
아시는 분 있으시면 댓글 남겨주세요...ㅎㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.2] 최댓값과 최솟값]]></title>
            <link>https://velog.io/@naji2-2/Lv.2-%EC%B5%9C%EB%8C%93%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</link>
            <guid>https://velog.io/@naji2-2/Lv.2-%EC%B5%9C%EB%8C%93%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</guid>
            <pubDate>Tue, 15 Apr 2025 00:19:59 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 최댓값과 최솟값
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12939">https://school.programmers.co.kr/learn/courses/30/lessons/12939</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-javascript">function solution(s) {
    var answer = &#39;&#39;;
    let numbers = [];

    let str = s.split(&quot; &quot;);

    for(let x of str){
        numbers.push(parseInt(x));
    }

    let max = parseInt(str[0]);
    let min = parseInt(str[0]);

    for(let x of numbers){
        if(x &gt; max){
            max = x;
        } else if(x &lt; min){
            min = x;
        }
    }

    answer += min.toString().concat(&quot; &quot;, max.toString());

    return answer;
}</code></pre>
<blockquote>
<ul>
<li>split(&quot; &quot;) : 공백을 기준으로 문자열을 나눔  (arry 형태로 반환)</li>
</ul>
</blockquote>
<ul>
<li>parseInt : int 타입으로 변환</li>
<li>push() : 배열의 마지막에 값을 추가함</li>
<li>concat : 지정자를 사용해서 문자열로 합침</li>
</ul>
<p>문제 풀이가 너무 길어서 다른 방법을 통해서도 풀어보았다</p>
<pre><code class="language-javascript">function solution(s) {
    var answer = &#39;&#39;;

    answer = s.split(&quot; &quot;).map(a =&gt; parseInt(a));

    answer = Math.min(...answer) + &quot; &quot; + Math.max(...answer)

    return answer;
}</code></pre>
<blockquote>
<ul>
<li>split(&quot; &quot;) : 공백을 기준으로 문자열을 나눔 (arry 형태로 반환)</li>
</ul>
</blockquote>
<ul>
<li>.map(a =&gt; parseInt(a)) : a를 int 타입으로 변환함</li>
<li>...(arry) : 전개 연산자(배열의 모든 값을 넘김)</li>
<li>Math.min / Math.max : Math의 내장 함수 - 최솟값, 최댓값을 찾음</li>
</ul>
<p><strong>TIL</strong>
함수를 적절히 사용하면 코드도 짧아지고 가독성도 좋아진다는 것을 알 수 있었다!
map을 더 공부하고싶다는 생각이 들었다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.1] 경기도에 위치한 식품창고 목록 출력하기]]></title>
            <link>https://velog.io/@naji2-2/Lv.1-%EA%B2%BD%EA%B8%B0%EB%8F%84%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%ED%92%88%EC%B0%BD%EA%B3%A0-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.1-%EA%B2%BD%EA%B8%B0%EB%8F%84%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%ED%92%88%EC%B0%BD%EA%B3%A0-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 14 Apr 2025 23:27:36 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 경기도에 위치한 식품창고 목록 출력하기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131114">https://school.programmers.co.kr/learn/courses/30/lessons/131114</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code>SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, &#39;N&#39;)
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE &#39;경기도%&#39;;</code></pre><blockquote>
<ul>
<li>LIKE &#39;경기도%&#39; : 경기도로 시작하는 문자열 찾기</li>
</ul>
</blockquote>
<p>NULL 처리하는 함수</p>
<blockquote>
<ul>
<li>IFNULL(칼럼, 칼럼이 NULL일때 넣을 값) =&gt; MySQL에서 사용</li>
</ul>
</blockquote>
<ul>
<li>NVL(칼럼,칼럼이 NULL일때 넣을 값) =&gt; Oracle에서 사용</li>
</ul>
<p><strong>TIL</strong>
이전에 풀었던 문제와 굉장히 유사한 문제여서 금방 풀 수 있었다
NULL을 처리하는 함수를 찾다가 IFNULL이라는 새로운 함수를 알 수 있었다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - Array 내장함수 정리]]></title>
            <link>https://velog.io/@naji2-2/JavaScript-Array-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@naji2-2/JavaScript-Array-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 09 Apr 2025 13:59:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>많이 사용 되는 array 내장함수에 대해 정리해보고자합니다!</p>
</blockquote>
<p>내장 함수란?
프로그래밍 안에서 별도로 import 없이 사용 할 수 있는 함수</p>
<hr>
<h3 id="tostring--배열에-있는-내용을-문자열로-바꿔줌">toString() : 배열에 있는 내용을 문자열로 바꿔줌</h3>
<h4 id="→-ex-배열tostring">→ ex) 배열.toString()</h4>
<pre><code class="language-javascript">var fruits1 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
console.log(fruits1.toString());  // BananaOrangeApple</code></pre>
<hr>
<h3 id="join--사용자가-지정한-문자열로-이어줌">join() : 사용자가 지정한 문자열로 이어줌</h3>
<h4 id="→-ex-배열join연결할-문자">→ ex) 배열.join(&quot;연결할 문자&quot;)</h4>
<pre><code class="language-javascript">var fruits1 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
console.log(fruits1.join(&quot; &quot;));  // Banana Orange Apple</code></pre>
<hr>
<h3 id="push--배열의-가장-마지막에-새로운-항목을-추가함">push() : 배열의 가장 마지막에 새로운 항목을 추가함</h3>
<h4 id="→-ex-배열push">→ ex) 배열.push()</h4>
<pre><code class="language-javascript">var fruits2 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
fruits2.push(&quot;Kiwi&quot;);
console.log(fruits2);  // [&#39;Banana&#39;, &#39;Orange&#39;, &#39;Apple&#39;, &#39;Kiwi&#39;]</code></pre>
<hr>
<h3 id="pop--배열의-가장-마지막-항목을-리턴하며-배열에서-제외함">pop() : 배열의 가장 마지막 항목을 리턴하며 배열에서 제외함</h3>
<h4 id="→-ex-배열pop">→ ex) 배열.pop()</h4>
<pre><code class="language-javascript">var fruits2 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
var arr2 = fruits2.pop();
console.log(arr2);      // Apple
console.log(fruits2);  // [&#39;Banana&#39;, &#39;Orange&#39;]</code></pre>
<hr>
<h3 id="shift--배열의-첫번째-항목을-제거하여-리턴">shift() : 배열의 첫번째 항목을 제거하여 리턴</h3>
<h4 id="→-ex-배열shift">→ ex) 배열.shift()</h4>
<pre><code class="language-javascript">var fruits3 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
var str = fruits3.shift();
console.log(str);        // Banana
consloe.log(fruits3);    // [&#39;Orange&#39;, &#39;Apple&#39;]</code></pre>
<hr>
<h3 id="unshift--배열의-첫번째에-새로운-항목을-추가함">unshift() : 배열의 첫번째에 새로운 항목을 추가함</h3>
<h4 id="→-ex-배열unshift">→ ex) 배열.unshift()</h4>
<pre><code class="language-javascript">var fruits4 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];
fruits4.unshift(&quot;lemon&quot;);
console.log(fruits4);  // [&#39;lemon&#39;, &#39;Banana&#39;, &#39;Orange&#39;, &#39;Apple&#39;]</code></pre>
<hr>
<h2 id="배열-값-바꾸기">배열 값 바꾸기</h2>
<h4 id="기본-적인-방식">기본 적인 방식</h4>
<pre><code class="language-javascript">fruits4[0] = &quot;Grape&quot;;      // lemon ==&gt; Grape
console.log(fruits4);      // [&#39;Grape&#39;, &#39;Orange&#39;, &#39;Apple&#39;]
console.log(fruits4.length);  // 3

// 배열 마지막 인덱스에 값을 넣음
fruits4[fruits4.length -1] = &quot;Peach&quot;;
console.log(fruits4);  // [&#39;Grape&#39;, &#39;Orange&#39;, &#39;Peach&#39;]</code></pre>
<h4 id="함수를-이용한-방법">함수를 이용한 방법</h4>
<h4 id="splicea-b--a--시작위치-b--삭제할-항목-수">splice(a, b) : a = 시작위치, b = 삭제할 항목 수</h4>
<pre><code class="language-javascript">var fruits5 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;];

fruits5.splice(1, 2);
console.log(fruits5);  // [&#39;Banana&#39;]

fruits5.splice(1, 0, &quot;Lemon&quot;, &quot;Kiwi&quot;);  // 0개 제거 가능
console.log(fruits5);  // [&#39;Banana&#39;, &#39;Lemon&#39;, &#39;Kiwi&#39;]

fruits5.splice(1, 1, &quot;Lemon&quot;, &quot;Kiwi&quot;);
console.log(fruits5);  // [&#39;Banana&#39;, &#39;Lemon&#39;, &#39;Kiwi&#39;, &#39;Kiwi&#39;]</code></pre>
<hr>
<h3 id="concat--두개의-배열을-하나의-배열로-만듦">concat() : 두개의 배열을 하나의 배열로 만듦</h3>
<h4 id="→-ex-배열concat">→ ex) 배열.concat()</h4>
<pre><code class="language-javascript">var arr1 = [&#39;Hello&#39;];
var arr2 = [&#39;java&#39;, &#39;script&#39;];
var arr = arr1.concat(arr2);
console.log(arr);  // [&#39;Hello&#39;, &#39;java&#39;, &#39;script&#39;]</code></pre>
<hr>
<h3 id="sort--배열을-정렬함">sort() : 배열을 정렬함</h3>
<h4 id="→-ex-배열sort">→ ex) 배열.sort()</h4>
<pre><code class="language-javascript">var fruits8 = [&quot;Banana&quot;, &quot;Orange&quot;, &quot;Apple&quot;, &quot;Lemon&quot;, &quot;Kiwi&quot;];
console.log(fruits8.sort());  // [&#39;Apple&#39;, &#39;Banana&#39;, &#39;Kiwi&#39;, &#39;Lemon&#39;, &#39;Orange&#39;]

var points = [40, 100, 70, 21, 99];
// 숫자를 문자로 인식하여 오름차순 정렬
console.log(points.sort());  // [100, 21, 40, 70, 99]</code></pre>
<h2 id="숫자-정렬-방법">숫자 정렬 방법</h2>
<pre><code class="language-javascript">var points = [40, 100, 70, 21, 99];

points.sort( function(a,b) {
    if(a&gt;b)
        return 1;    // return true
    else
    return -1;      // return flase
});</code></pre>
<h4 id="간단하게-변환">간단하게 변환</h4>
<pre><code class="language-javascript">// 오름차순 &amp; 내림차순 정렬
points.sort( function(a, b) {
            return a-b;     // return b-a(내림차순)
        });

console.log(points);              //[21, 40, 70, 99, 100]
console.log(points.reverse());  //[100, 99, 70, 40, 21]</code></pre>
<h2 id="object-정렬-방법">object 정렬 방법</h2>
<pre><code class="language-javascript">var persons = [
            {name:&quot;유재석&quot;, point:78, city:&quot;서울&quot;},
            {name:&quot;김종국&quot;, point:92, city:&quot;대구&quot;},
            {name:&quot;양세찬&quot;, point:76, city:&quot;서울&quot;},
            {name:&quot;하 하&quot;, point:81, city:&quot;제주&quot;} 
        ];

console.log(persons.sort());</code></pre>
<blockquote>
<p>objet에는 정렬이 적용되지 않는다.</p>
</blockquote>
<pre><code class="language-javascript">//function을 이용해서 sort를 만들어야함
persons.sort( function(a,b) {
    //삼항 연산자 이용
     return (a.point &gt; b.point) ? 1 : -1
});

console.log(persons) 
// 0: {name: &#39;양세찬&#39;, point: 76, city: &#39;서울&#39;}
// 1: {name: &#39;유재석&#39;, point: 78, city: &#39;서울&#39;}
// 2: {name: &#39;하 하&#39;, point: 81, city: &#39;제주&#39;}
// 3: {name: &#39;김종국&#39;, point: 92, city: &#39;대구&#39;}</code></pre>
<hr>
<h3 id="filter--조건에-맞는-배열만-리턴">filter() : 조건에 맞는 배열만 리턴</h3>
<h4 id="→-ex-배열filter-functiona-">→ ex) 배열.filter( function(a) {()});</h4>
<pre><code class="language-javascript">// filter을 이용해 point가 80이상인 사람만 출력
   var pass = persons.filter( function(per) {
       return per.point &gt; 80;
   });
   console.log(pass)
   // 0: {name: &#39;김종국&#39;, point: 92, city: &#39;대구&#39;}
   // 1: {name: &#39;하 하&#39;, point: 81, city: &#39;제주&#39;}

// filter을 이용해 city가 서울인 사람만 출력
   var seoul = persons.filter( function(per) {
       return per.city === &quot;서울&quot;;
   })
   console.log(seoul);
   // 0: {name: &#39;유재석&#39;, point: 78, city: &#39;서울&#39;}
   // 1: {name: &#39;양세찬&#39;, point: 76, city: &#39;서울&#39;}</code></pre>
<hr>
<h3 id="reducea-c--누산기">reduce(a, c) : 누산기</h3>
<h4 id="→-ex-배열reduce-functiona-c-">→ ex) 배열.reduce( function(a, c) {()});</h4>
<blockquote>
<p>a : sccumulator = 누산기 / c : currentValue = 현재값</p>
</blockquote>
<pre><code class="language-javascript">var arr4 = [1, 2, 3, 4];
var total = arr4.reduce( function(a,c) {
    return a+c;
});

console.log(total);  // 10</code></pre>
<hr>
<h4 id="function을-사용하는-filter-reduce는-아직도-헷갈리는-것-같아요">function을 사용하는 filter(), reduce()는 아직도 헷갈리는 것 같아요</h4>
<h4 id="더-더-열심히-공부하겠습니다">더 더 열심히 공부하겠습니다</h4>
<h4 id="글-읽어주셔서-감사합니다">글 읽어주셔서 감사합니다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - String 내장함수 정리]]></title>
            <link>https://velog.io/@naji2-2/JavaScript-String-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@naji2-2/JavaScript-String-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 07 Apr 2025 14:17:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>많이 사용 되는 String  내장함수에 대해 정리해보고자합니다!</p>
</blockquote>
<p>내장 함수란?
프로그래밍 안에서 별도로 import 없이 사용 할 수 있는 함수</p>
<hr>
<h3 id="length--문자열의-길이를-리턴">length : 문자열의 길이를 리턴</h3>
<h4 id="→-ex-문자열length">→ ex) 문자열.length;</h4>
<pre><code class="language-javascript">var txt = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;
console.log(txt.length);  // 26</code></pre>
<hr>
<h3 id="indexof--serch--문자열의-위치를-찾아-리턴-찾지-못-할-시--1을-리턴">indexOf() / serch() : 문자열의 위치를 찾아 리턴, 찾지 못 할 시 -1을 리턴</h3>
<h4 id="→-ex-문자열indexof찾고-싶은-문자열">→ ex) 문자열.indexOf(찾고 싶은 문자열);</h4>
<h4 id="→-ex-문자열search찾고-싶은-문자열">→ ex) 문자열.search(찾고 싶은 문자열);</h4>
<pre><code class="language-javascript">var str = &quot;Please locate where &#39;locate&#39;&quot;;
console.log(str.indexOf(&quot;locate&quot;));  // 7
console.log(str.indexOf(&quot;jisu&quot;));  // -1</code></pre>
<blockquote>
<p>locate가 str에 두 번 들어 있지만 처음으로 발견한 위치인 7을 return함</p>
</blockquote>
<hr>
<h3 id="slice--문자열을-원하는-만큼-잘라서-리턴">slice : 문자열을 원하는 만큼 잘라서 리턴</h3>
<h4 id="→-ex-문자열slice원하는-index">→ ex) 문자열.slice(원하는 index);</h4>
<pre><code class="language-javascript">var str = &quot;Apple, Banana, Kiwi&quot;;
console.log(str.slice(7,13)); // 출력은 12번까지  // 출력값 : Banana          
console.log(str.slice(7));    // 7부터 끝까지     // 출력값 : Banana, Kiwi
console.log(str.slice(-12, -6));                // 출력값 : Banana
console.log(str.slice(-12));                    // 출력값 : Banana, Kiwi</code></pre>
<hr>
<h3 id="substring--문자열을-원하는-만큼-잘라서-리턴">substring() : 문자열을 원하는 만큼 잘라서 리턴</h3>
<h4 id="→-ex-문자열substring시작-인덱스-끝-인덱스">→ ex) 문자열.substring(시작 인덱스, 끝 인덱스);</h4>
<pre><code class="language-javascript">var str = &quot;Apple, Banana, Kiwi&quot;;
console.log(str.substring(7,13));  // 출력값 : Banana
console.log(str.substring(7));     // 출력값 : Banana, Kiwi
console.log(str.substring(-3));    // 출력값 : Apple, Banana, Kiwi
console.log(str.substring(5, -3)); // 출력값 : Apple</code></pre>
<blockquote>
<p>slice와 substring의 차이점은 입력값으로 음수가 들어왔을 때 있다.
slice는 음수가 들어왔을 때 음수 인덱스를 적용하여 리턴하지만
substring은 음수가 들어오면 해당 인덱스를 0으로 적용한다.</p>
</blockquote>
<hr>
<h3 id="substr--특정-인덱스부터-원하는-길이만큼-잘라서-리턴">substr() : 특정 인덱스부터 원하는 길이만큼 잘라서 리턴</h3>
<h4 id="→-ex-문자열substr시작-인덱스-원하는-길이">→ ex) 문자열.substr(시작 인덱스, 원하는 길이);</h4>
<pre><code class="language-javascript">var str = &quot;Apple, Banana, Kiwi&quot;;
console.log(str.substr(7,6));  // 출력값 : Banana</code></pre>
<hr>
<h3 id="replace--문자열-치환-특정-문자열을-원하는-문자열로-변환">replace() : 문자열 치환, 특정 문자열을 원하는 문자열로 변환</h3>
<h4 id="→-ex-문자열replacea-b">→ ex) 문자열.replace(&quot;a&quot;, &quot;B&quot;);</h4>
<pre><code class="language-javascript">var str1 = &quot;Plese visit here&quot;;
var str2 = str1.replace(&quot;here&quot;, &quot;there&quot;);  // 출력값 : Plese visit there</code></pre>
<h4 id="문제점">문제점</h4>
<blockquote>
<pre><code class="language-javascript">var str5 = &quot;Please visit here here here&quot;;
var str2 = str1.replace(&quot;here&quot;, &quot;there&quot;);
// 출력값 : Plese visit there here here</code></pre>
</blockquote>
<pre><code>바꾸고자 하는 특정 문자열이 여러개 있는 경우 첫번째로 만나는 문자열만 치환하게 된다.
이러한 경우에는 정규 표현식을 사용하면 해결 된다.

#### 정규 표현식 사용
```javascript
var str5 = &quot;Please visit here here here&quot;;
var str6 = str5.replace(/here/g, &quot;there&quot;);  // g = globa : 모든 &quot;there&quot;에 적용

var str7 = &quot;Please visit Here HERE here&quot;;
var str8 = str7.replace(/here/gi, &quot;there&quot;);  // i = ignore : 대소문자 무시</code></pre><hr>
<h3 id="touppercase--대문자로-변환">toUpperCase() : 대문자로 변환</h3>
<h4 id="→-ex-문자열touppercase">→ ex) 문자열.toUpperCase();</h4>
<pre><code class="language-javascript">var str9 = &quot;Please visit Here HERE here&quot;;
console.log(str9.toUpperCase());
// 출력값 : PLEASE VISIT HERE HERE HERE</code></pre>
<h3 id="tolowercase--소문자로-변환">toLowerCase() : 소문자로 변환</h3>
<h4 id="→-ex-문자열tolowercase">→ ex) 문자열.toLowerCase();</h4>
<pre><code class="language-javascript">var str9 = &quot;Please visit Here HERE here&quot;;
console.log(str9.toUpperCase());
// 출력값 : PLEASE VISIT HERE HERE HERE</code></pre>
<hr>
<h3 id="concat--문자열끼리-합침">concat() : 문자열끼리 합침</h3>
<h4 id="→-ex-문자열1concat문자열2">→ ex) 문자열1.concat(문자열2));</h4>
<pre><code class="language-javascript">var txt1 = &quot;Hello&quot;;
var txt2 = &quot;World&quot;;
console.log(txt1.concat(&quot; &quot;, txt2));            //  출력값 : Hello World
console.log(txt1.concat(&quot; &quot;, &quot; Love &quot;, txt2));  //  출력값 : Hello Love World</code></pre>
<hr>
<h3 id="padstart--현재-문자열의-시작을-다른-문자로-채워-주어진-길이로-만듦">padStart() : 현재 문자열의 시작을 다른 문자로 채워, 주어진 길이로 만듦</h3>
<h4 id="→-ex-문자열padstart원하는-길이-채울-문자">→ ex) 문자열padStart(원하는 길이, 채울 문자);</h4>
<pre><code class="language-javascript">var str11 = &quot;1234&quot;;
console.log(str11.padStart(8,0));             //  출력값 : 00001234
console.log(&quot;C-&quot; + str11.padStart(8,0));   //  출력값 : C-00001234</code></pre>
<h3 id="padend--현재-문자열의-끝을-다른-문자로-채워-주어진-길이로-만듦">padEnd() : 현재 문자열의 끝을 다른 문자로 채워, 주어진 길이로 만듦</h3>
<h4 id="→-ex-문자열padend원하는-길이-채울-문자">→ ex) 문자열.padEnd(원하는 길이, 채울 문자);</h4>
<pre><code class="language-javascript">var str11 = &quot;1234&quot;;
console.log(str11.padEnd(8,0));             //  출력값 : 12340000
console.log(&quot;C-&quot; + str11.padEnd(8,0));     //  출력값 : C-12340000</code></pre>
<hr>
<h3 id="charat--문자열에서-특정-인덱스에-위치하는-문자를-리턴함">charAt() : 문자열에서 특정 인덱스에 위치하는 문자를 리턴함</h3>
<h4 id="→-ex-문자열charat인덱스">→ ex) 문자열charAt(인덱스);</h4>
<pre><code class="language-javascript">var str13 = &quot;Hello World&quot;;
console.log(str13.charAt(1));            // 출력값 : e</code></pre>
<hr>
<h3 id="split--구분자로-문자열을-분리하여-배열로-리턴">split() : 구분자로 문자열을 분리하여 배열로 리턴</h3>
<h4 id="→-ex-문자열split구분자">→ ex) 문자열.split(구분자);</h4>
<pre><code class="language-javascript">var tags = &quot;키보드,기계식,블루투스&quot;;
var arr1 = tags.split(&quot;,&quot;);
// 출력값 : [&#39;키보드&#39;, &#39;기계식&#39;, &#39;블루투스&#39;]</code></pre>
<hr>
<h4 id="많이-사용하게-되기-때문에-저도-기억해두려고-노력하고-있어요">많이 사용하게 되기 때문에 저도 기억해두려고 노력하고 있어요!</h4>
<h4 id="자유자재로-사용할-수-있도록-더-힘내겠습니다">자유자재로 사용할 수 있도록 더 힘내겠습니다</h4>
<h4 id="글-읽어주셔서-감사합니다">글 읽어주셔서 감사합니다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - 기초 문법 정리]]></title>
            <link>https://velog.io/@naji2-2/JavaScript-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@naji2-2/JavaScript-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 05 Apr 2025 14:08:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>JavaScript 복습겸
누군가에게 도움이 되길 바라면서 이 글을 시작합니다!</p>
</blockquote>
<hr>
<h3 id="자바스크립트-출력-위치">자바스크립트 출력 위치</h3>
<pre><code class="language-javascript">&lt;script&gt;
        doucument.write(&quot;화면에 메세지를 출력합니다.&quot;)   // 화면에 출력
        console.log(&quot;콘솔창에 출력합니다.&quot;)             // 콘솔에 출력
&lt;/script&gt;</code></pre>
<hr>
<h3 id="변수-선언-방법-var-let-const">변수 선언 방법 (var, let, const)</h3>
<h4 id="--var">- var</h4>
<pre><code class="language-javascript">  var x = 5;
  var y = 6;
  var z = x+y;

  var x = 23;  // var는 또 선언 가능
  z = x + 1;</code></pre>
<blockquote>
<p>변수명의 재선언이 가능하며 값을 자유롭게 바꿀 수 있음</p>
</blockquote>
<h4 id="--let">- let</h4>
<pre><code class="language-javascript">  let x1 = 5;
  let y1 = 6;
  let z1 = x1 + y1;

  // let x1 = 7;  --&gt; 변수명의 재사용시 에러발생
  x1 = 7;  // 정상적으로 실행됨</code></pre>
<blockquote>
<p>변수명의 재선언은 불가능하지만
값을 다시넣는 것은 가능하다</p>
</blockquote>
<h4 id="--const">- const</h4>
<pre><code class="language-javascript">  const PI = 3.41592;

  // PI = 3.14  --&gt; 에러발생
  // const PI = 3.14  --&gt; 에러발생</code></pre>
<blockquote>
<p>변수명의 재선언이 불가능하며
한번 지정된 값을 바꾸는 것도 불가능하다</p>
</blockquote>
<hr>
<h3 id="데이터-타입string-number-object-array-undefined-null-boolean">데이터 타입(String, Number, Object, Array, Undefined, Null, Boolean)</h3>
<h4 id="--string">- String</h4>
<pre><code class="language-javascript">let name1 = &quot;홍길동&quot;;
let name2 = &#39;홍길순&#39;;


// *문장 안에 따옴표 넣기표 넣기*
let str1 = &quot;저의 이름은 &quot; + &#39;name1&#39; + &quot; 입니다.&quot;;

// 실행결과 --&gt; 저의 이름은 name1 입니다. (&#39;&#39;가 보이지 않음)

let str2 = &#39;저의 이름은 &quot;name1&quot; 입니다&#39;;
let str3 = &quot;저의 이름은 \&quot;name1\&quot; 입니다&quot;;

// 실행결과 --&gt; 저의 이름은 &quot;name1&quot; 입니다</code></pre>
<h4 id="--number">- Number</h4>
<pre><code class="language-javascript">let x = 3;
let y = 3.14;</code></pre>
<h4 id="--object">- Object</h4>
<pre><code class="language-javascript">let person = {};  // 선언
person.firstName = &quot;나&quot;;
person.lastName = &quot;지수&quot;;
person.age = 18;

console.log(person1);

// 실행결과 --&gt; {firstName: &#39;나&#39;, lastName: &#39;지수&#39;, age: 18}</code></pre>
<h4 id="--array">- Array</h4>
<pre><code class="language-javascript">let arr = [];
arr.push(&quot;나지수&quot;);
arr.push(2.25);
arr.push(null);
arr.push(undefined);</code></pre>
<h4 id="--boolean">- Boolean</h4>
<pre><code class="language-javascript">let isAdult = true;
let num1 = 5;
let num2 = 7;

consloe.log(num1 &gt; num2);

// 실행결과 --&gt; false
</code></pre>
<h4 id="--undefined">- Undefined</h4>
<pre><code class="language-javascript">let u1;
console.log(u1);

// 실행결과 --&gt; 에러발생 ul is not defined

let u2 = undefined;
console.log(u2);

// 실행결과 --&gt; undefined</code></pre>
<h4 id="--null">- Null</h4>
<pre><code class="language-javascript">let n1 = null;
console.log(n1);

// 실행결과 --&gt; null</code></pre>
<h3 id="--타입-확인-방법">- 타입 확인 방법</h3>
<pre><code class="language-javascript">let num1 = 5;
console.log(typeof num1);

// 실행결과 --&gt; number

let isAdult = true;
console.log(typeof isAdult);
// 실행결과 --&gt; boolean
</code></pre>
<blockquote>
<p>type of 를 사용하면 해당 데이터의 타입이 무엇인지 알 수 있습니다!</p>
</blockquote>
<hr>
<h4 id="자바스크립트의-기본적인-문법에-대한-글을-적어봤습니다">자바스크립트의 기본적인 문법에 대한 글을 적어봤습니다!</h4>
<h4 id="다음에는-내장함수들에-대한-내용을-정리해볼게요">다음에는 내장함수들에 대한 내용을 정리해볼게요</h4>
<h4 id="글-읽어주셔서-감사합니다">글 읽어주셔서 감사합니다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.1] 흉부외과 또는 일반외과 의사 목록 출력하기]]></title>
            <link>https://velog.io/@naji2-2/Lv.1-%ED%9D%89%EB%B6%80%EC%99%B8%EA%B3%BC-%EB%98%90%EB%8A%94-%EC%9D%BC%EB%B0%98%EC%99%B8%EA%B3%BC-%EC%9D%98%EC%82%AC-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.1-%ED%9D%89%EB%B6%80%EC%99%B8%EA%B3%BC-%EB%98%90%EB%8A%94-%EC%9D%BC%EB%B0%98%EC%99%B8%EA%B3%BC-%EC%9D%98%EC%82%AC-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 20 Mar 2025 13:05:57 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 흉부외과 또는 일반외과 의사 목록 출력하기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/132203">https://school.programmers.co.kr/learn/courses/30/lessons/132203</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT DR_NAME, DR_ID, MCDP_CD,
    DATE_FORMAT(HIRE_YMD, &#39;%Y-%m-%d&#39;) AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD LIKE &#39;CS&#39; OR MCDP_CD LIKE &#39;GS&#39;
ORDER BY HIRE_YMD DESC, DR_NAME ASC;</code></pre>
<blockquote>
<ul>
<li>MCDP_CD = &#39;CS&#39; OR MCDP_CD = &#39;GS&#39; : 해당 코드를 사용해도 진료과가 CS 혹은 GS인 의사가 잘 나온다</li>
</ul>
</blockquote>
<p><strong>TIL</strong></p>
<pre><code>DATE_FORMAT(HIRE_YMD, &#39;%Y-%M-%D&#39;) AS HIRE_YMD</code></pre><p>위의 코드로 작성하면 달과 일이 숫자가 아닌 영어로 나온다는 것을 알 수 있었다
<img src="https://velog.velcdn.com/images/naji2-2/post/dea36aea-739b-4039-be8e-3ea31fd862fc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.2] 이름에 el이 들어가는 동물 찾기]]></title>
            <link>https://velog.io/@naji2-2/Lv.2-%EC%9D%B4%EB%A6%84%EC%97%90-el%EC%9D%B4-%EB%93%A4%EC%96%B4%EA%B0%80%EB%8A%94-%EB%8F%99%EB%AC%BC-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.2-%EC%9D%B4%EB%A6%84%EC%97%90-el%EC%9D%B4-%EB%93%A4%EC%96%B4%EA%B0%80%EB%8A%94-%EB%8F%99%EB%AC%BC-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sun, 16 Mar 2025 13:57:28 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 이름에 el이 들어가는 동물 찾기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59047">https://school.programmers.co.kr/learn/courses/30/lessons/59047</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE &#39;%EL%&#39;
AND ANIMAL_TYPE LIKE &#39;Dog&#39;
ORDER BY NAME ASC;</code></pre>
<blockquote>
<ul>
<li>LIKE &#39;%el%&#39; : 앞 뒤 상관없이 el의 포함여부를 확인</li>
</ul>
</blockquote>
<p><strong>TIL</strong>
%의 활용에 대해 알게 되었다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.1] 역순 정렬하기 ]]></title>
            <link>https://velog.io/@naji2-2/Lv.1-%EC%97%AD%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.1-%EC%97%AD%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 13 Mar 2025 14:41:58 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 역순 정렬하기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59035">https://school.programmers.co.kr/learn/courses/30/lessons/59035</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC</code></pre>
<blockquote>
<ul>
<li>ORDER BY (칼럼명) DESC : 역순으로 정렬하기</li>
</ul>
</blockquote>
<p><strong>TIL</strong>
ORDER BY를 사용해서 정렬했다
그냥 사용하면 오름차순으로 정렬 되지만
DESC를 사용해 역순으로 정렬되도록했다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL 사용자 권한 수정]]></title>
            <link>https://velog.io/@naji2-2/MySQL-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C-%EC%88%98%EC%A0%95</link>
            <guid>https://velog.io/@naji2-2/MySQL-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C-%EC%88%98%EC%A0%95</guid>
            <pubDate>Wed, 12 Mar 2025 15:22:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/naji2-2/post/704ad96c-2891-454d-8b1a-4dd70a315133/image.jpg" alt=""></p>
<blockquote>
<p>프로젝트 협업을 위해 친구와 mysql workbench에서 연동하는 중
공유하려던 schema뿐만 아니라, 나의 모든 schema가 친구에게 공유되는 문제가 발생하였다</p>
</blockquote>
<p>문제를 해결하기 위해 먼저 cmd에 들어가 mysql에 접속한다</p>
<pre><code>mysql -u root -p</code></pre><h2 id="1-사용자의-현재-권한-확인">1. 사용자의 현재 권한 확인</h2>
<pre><code>SHOW GRANTS FOR &#39;user&#39;@&#39;%&#39;;</code></pre><p>문제가 있었던 user라는 계정이
현재 어떤 권한을 가지고 있는지를 확인 할 수 있는 코드이다</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/3f296b25-6507-4118-957c-23644f578a00/image.png" alt=""></p>
<p>위 문장이 있다면 모든 DB에 접근 가능한 상태이다.</p>
<h2 id="2-모든-db에-대한-권한-제거">2. 모든 DB에 대한 권한 제거</h2>
<pre><code>REVOKE ALL PRIVILEGES, GRANT OPTION FROM &#39;user&#39;@&#39;%&#39;;</code></pre><p>모든 데이터베이스에 대한 권한을 제거하는 코드이다</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/b7654e1d-cf7d-4895-bcb2-58aba96ee798/image.png" alt=""></p>
<p>위의 코드를 사용하면 user의 모든 권한을 제거 할 수 있다</p>
<h2 id="3-gullap-스키마만-접근-허용">3. gullap 스키마만 접근 허용</h2>
<pre><code>GRANT ALL PRIVILEGES ON `gullap`.* TO &#39;user&#39;@&#39;%&#39;;</code></pre><p>user 계정에 gullap 데이터베이스의 접근만 허용하는 코드이다</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/7a1ba7b3-264f-420d-8fdb-e98b1e6ff9e0/image.png" alt=""></p>
<p>위의 코드를 사용하면 user 계정이 gullap 데이터베이스만 사용할 수 있다
만약 읽기 전용 권한만 주고 싶다면 ALL PRIVILEGES 대신 SELECT 같은 권한만 주면 된다</p>
<blockquote>
<ul>
<li>ALL PRIVILEGES : 모든 권한을 줌 (gullap에 대한 모든 권한)</li>
</ul>
</blockquote>
<h2 id="4-변경-사항-적용">4. 변경 사항 적용</h2>
<blockquote>
<p>FLUSH PRIVILEGES;</p>
</blockquote>
<p>마지막으로 위의 코드를 사용하면 권한이 다시 설정된다</p>
<p>다음과정을 다 마치고 다시 접속해보면</p>
<p><img src="https://velog.velcdn.com/images/naji2-2/post/1de878bb-0888-4122-bfc8-6ab8c93aaea2/image.jpg" alt=""></p>
<p>이렇게 gullap만 표시되는 것을 볼 수 있다</p>
<blockquote>
<p>어렵게만 생각했던 DB연결이었는데 다른 분들의 글을 참고하니 빠르게 성공 할 수 있었다! 
DB연결에 참고한 글 : <a href="https://we-always-fight-with-code.tistory.com/6">https://we-always-fight-with-code.tistory.com/6</a> </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.1] 동명 동물 수 찾기]]></title>
            <link>https://velog.io/@naji2-2/Lv.1-%EB%8F%99%EB%AA%85-%EB%8F%99%EB%AC%BC-%EC%88%98-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.1-%EB%8F%99%EB%AA%85-%EB%8F%99%EB%AC%BC-%EC%88%98-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Tue, 11 Mar 2025 15:47:43 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 동명 동물 수 찾기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59041">https://school.programmers.co.kr/learn/courses/30/lessons/59041</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT &gt; 1
ORDER BY NAME</code></pre>
<blockquote>
<ul>
<li>COUNT(*) : 조건에 해당하는 모든 행의 갯수를 세는 명령문</li>
</ul>
</blockquote>
<ul>
<li>GROUP BY (칼럼명) : 특정 컬럼을 기준으로 그룹화하는 명령문</li>
<li>HAVING : GROUP BY절에서 조건을 주는 경우 사용</li>
</ul>
<p><strong>TIL</strong>
GROUP BY와 HAVING이라는 명령문을 처음으로 사용해보았다
아직 많이 어색하고 어려워서 비슷한 문제를 많이 풀어봐야겠다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.2] 최솟값 구하기]]></title>
            <link>https://velog.io/@naji2-2/Lv.2-%EC%B5%9C%EC%86%9F%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@naji2-2/Lv.2-%EC%B5%9C%EC%86%9F%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 09 Mar 2025 15:14:20 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 최솟값 구하기
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59038">https://school.programmers.co.kr/learn/courses/30/lessons/59038</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT MIN(DATETIME) AS 시간
FROM ANIMAL_INS </code></pre>
<blockquote>
<ul>
<li>MIN(칼럼명) : 칼럼에서 최솟값을 반환하는 명령문</li>
</ul>
</blockquote>
<p><strong>TIL</strong>
AS를 이용해 반환하는 칼럼의 이름을 시간으로 지정했다! 신기하다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Lv.1] 이름이 있는 동물의 아이디]]></title>
            <link>https://velog.io/@naji2-2/Lv.1-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EC%9E%88%EB%8A%94-%EB%8F%99%EB%AC%BC%EC%9D%98-%EC%95%84%EC%9D%B4%EB%94%94</link>
            <guid>https://velog.io/@naji2-2/Lv.1-%EC%9D%B4%EB%A6%84%EC%9D%B4-%EC%9E%88%EB%8A%94-%EB%8F%99%EB%AC%BC%EC%9D%98-%EC%95%84%EC%9D%B4%EB%94%94</guid>
            <pubDate>Sat, 08 Mar 2025 13:52:28 GMT</pubDate>
            <description><![CDATA[<p>*<em>푼 문제 : 이름이 있는 동물의 아이디
*</em><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59407">https://school.programmers.co.kr/learn/courses/30/lessons/59407</a></p>
<p><strong>문제 풀이</strong></p>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC</code></pre>
<blockquote>
<ul>
<li>IS NOT NULL : null이 아닌 값만 가져오는 명령문</li>
</ul>
</blockquote>
<ul>
<li>ORDER BY (칼럼명) ASC : 해당 칼럼을 오름차순하는 명령문</li>
</ul>
<p><strong>TIL</strong>
방금 풀었던 문제와 비슷한 문제였다! 비어있는지 확인 할때는 IS NULL 안 비어있는지 확인 할 때는 IS NOT NULL을 사용한다는 것을 알 수 있었다</p>
]]></description>
        </item>
    </channel>
</rss>