<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yeseo_52.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 09 Apr 2026 14:53:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yeseo_52.log</title>
            <url>https://velog.velcdn.com/images/yeseo_052/profile/f61ab689-8d73-4535-ae35-90b1c47faa9c/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yeseo_52.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yeseo_052" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[코딩테스트][python] 팩토리얼 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/TIL-6trdjyde</link>
            <guid>https://velog.io/@yeseo_052/TIL-6trdjyde</guid>
            <pubDate>Thu, 09 Apr 2026 14:53:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/8f2c1522-b901-4994-9e11-16031d1073ef/image.png" alt=""></p>
<p>Python 정답</p>
<pre><code>def solution(n):
    fact = 1
    i = 1

    while True:
        fact *= i

        if fact &gt; n:
            return i - 1

        i += 1</code></pre><p>이번 소스는 “팩토리얼을 누적하다가 n을 넘기기 직전의 i를 찾는다” 그래서 return값이 저렇게 풀이된다.! <del>졸려서 설명이 작아졌어요..ㅎ</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][python] 최빈값 구하기 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98-Level-0</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98-Level-0</guid>
            <pubDate>Wed, 08 Apr 2026 15:41:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/2d666490-0faa-49e7-b8af-20f499f3831a/image.png" alt="">
python풀이</p>
<pre><code>def solution(array):
    count = [0] * (max(array) + 1)

    for i in array:
        count[i] += 1

    max_count = max(count)

    if count.count(max_count) &gt; 1:
        return -1

    return count.index(max_count)</code></pre><p>사실 오류가 많이 생겨서 ai랑 함께 풀어보았습니다,,,,,
array의 max값만큼 배열을 만들어서 for문으로 count 배열에다가 횟수추가를 합니다!
but 최빈값이 여러개라면? -1으로 return하는 로직으로 구현하였습니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL]]></title>
            <link>https://velog.io/@yeseo_052/TIL-t43pbqxg</link>
            <guid>https://velog.io/@yeseo_052/TIL-t43pbqxg</guid>
            <pubDate>Wed, 08 Apr 2026 13:13:56 GMT</pubDate>
            <description><![CDATA[<p>오! 늘! 도! 소스해석!</p>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/68bebf56-201e-43d8-9a5a-d16e20c16b2c/image.png" alt="">
먼저 이 함수는 총 가격을 계산하는 로직입니다!</p>
<pre><code>document.querySelectorAll(&#39;.placed-sticker&#39;).forEach(sticker =&gt; {
  const price = parseInt(sticker.dataset.price) || 0;
  total += price;
});</code></pre><p>.placed-sticker 클래스를 가진 모든 요소를 가져옴
각 요소의 data-price 값을 읽어서 숫자로 변환
parseInt(...) || 0 → 값이 없거나 NaN이면 0 처리
total에 계속 더함</p>
<p><strong>즉, 화면에 놓인 스티커들의 가격을 모두 더하는 부분</strong></p>
<pre><code>document.getElementById(&#39;totalPrice&#39;).textContent = total;</code></pre><p>id=&quot;totalPrice&quot; 요소에 총합을 텍스트로 출력</p>
<pre><code>const btn = document.getElementById(&#39;completeBtn&#39;);</code></pre><p>완료 버튼 가져오기</p>
<pre><code>if (total &gt; currentPoints) {
  btn.disabled = true;
  btn.textContent = &#39;완료 (포인트 부족)&#39;;
}</code></pre><p>총 가격이 현재 보유 포인트(currentPoints)보다 크면</p>
<p>버튼 비활성화
텍스트: &quot;완료 (포인트 부족)&quot;</p>
<pre><code>else {
  btn.disabled = false;
  btn.textContent = &#39;완료&#39;;
}</code></pre><p>포인트가 충분하면</p>
<p>버튼 활성화
텍스트: &quot;완료&quot;</p>
<p>return total; 총 가격을 반환합니다!! 끄읕</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL]]></title>
            <link>https://velog.io/@yeseo_052/TIL</link>
            <guid>https://velog.io/@yeseo_052/TIL</guid>
            <pubDate>Tue, 07 Apr 2026 14:42:24 GMT</pubDate>
            <description><![CDATA[<p>오늘은 JobFit이라는 웹사이트를 만들어보려고 기획하고 있었다.
역할분담으로 더 좋은 아이디어를 주셨다.
웹 크롤링, 분류, 템플릿 &amp; 이력서, 지원 담당을 정해서 구성을 하라고 하셔서 
처음으로 웹 크롤링을 하게되었다...아직 시작은 안 했지만 쫌 걱정이 많이된다. <del>가장 쉽다는데 난 잘 모르겟다....</del></p>
<h3 id="소스-해석">소스 해석</h3>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/d9609eb9-cc0f-460c-a952-cd01e3c448e4/image.png" alt=""></p>
<pre><code>document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {</code></pre><p>HTML 문서가 다 로드된 뒤에 코드 실행</p>
<pre><code>const container = document.getElementById(&#39;imageContainer&#39;);</code></pre><p>imageContainer라는 id를 가진 요소(이미지 영역)를 가져옴</p>
<pre><code>container.addEventListener(&#39;click&#39;, (e) =&gt; {</code></pre><p>컨테이너를 클릭하면 아래 로직 실행</p>
<pre><code>if (e.target.classList.contains(&#39;placed-sticker&#39;) ||
    e.target.classList.contains(&#39;resize-handle&#39;)) {
  return;
}</code></pre><p>이미 배치된 스티커(placed-sticker)
또는 크기 조절 핸들(resize-handle)
👉 이걸 클릭한 경우는 스티커 추가를 하지 않고 종료</p>
<p>but!! if는 사용자가 스티커를 선택하지 않았다면? alert로 경고표시하기</p>
<pre><code>const rect = container.getBoundingClientRect();
const x = ((e.clientX - rect.left) / rect.width) * 100;
const y = ((e.clientY - rect.top) / rect.height) * 100;</code></pre><p>rect = 컨테이너의 위치와 크기 정보
clientX, clientY = 클릭한 화면 좌표
(좌표 - 컨테이너 시작점) / 크기
👉 <strong>클릭 위치를 0~100% 비율 값으로 변환</strong></p>
<pre><code>addSticker(selectedSticker, x, y, 1.0);</code></pre><p>선택된 스티커를
(x, y) 위치에
크기 1.0으로 추가</p>
<p>=&gt; 정리
스티커를 선택하고
이미지 영역을 클릭하면
클릭 위치에 스티커가 추가됨</p>
<p>프로젝트와 더 다양한 소스가 궁금하다면?
=&gt; <a href="https://github.com/Yeseo0502/np_mypic">https://github.com/Yeseo0502/np_mypic</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Supabase 알아가기]]></title>
            <link>https://velog.io/@yeseo_052/Supabase-%EC%95%8C%EC%95%84%EA%B0%80%EA%B8%B0</link>
            <guid>https://velog.io/@yeseo_052/Supabase-%EC%95%8C%EC%95%84%EA%B0%80%EA%B8%B0</guid>
            <pubDate>Mon, 06 Apr 2026 14:40:33 GMT</pubDate>
            <description><![CDATA[<p>오늘은 짧게! 한 소스만 해석해보겠숩니다 <del>어제 저녁에 이력서 포폴을 수정했더니 너무 졸려요ㅠ</del></p>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/a57fac62-a877-42b1-8b8a-ee879093e2af/image.png" alt="">
function 먼저 MygetMember()은 그룹의 구성원을 관리하는 메소드 입니다.
groupId에 속한 그룹 멤버 목록 조회 함수 (MygetMember)</p>
<p><strong>.from(&#39;필요한 테이블명 작성&#39;)</strong> =&gt; 위에 소스로는 조회할 테이블은 group_members</p>
<p>.<strong>select**</strong>(&#39;테이블 안에 있는 필요한 애들 가져오기)**
*<em>but *</em> profiles 테이블과 관계(join)된 nickname도 같이 가져옴
.eq() 같을 때만 true로 반환.!
error라면? 성공실패 or error 메시지를 반환해줍니다.</p>
<p>but 성공이라면? members 사용자의 id값과 이름을 저장합니다!
return으로는 성공, members를 가져와서 반환해줍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScipt 기초]]></title>
            <link>https://velog.io/@yeseo_052/TypeScipt-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@yeseo_052/TypeScipt-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Thu, 02 Apr 2026 15:22:13 GMT</pubDate>
            <description><![CDATA[<p>먼저 딱 요약하자면&#39;</p>
<h4 id="타입----설명-">타입    설명 :</h4>
<p>number    숫자    10, 3.14
string    문자열    &quot;hello&quot;
boolean    참/거짓    true, false
any    모든 타입 허용 (권장 X)    자유롭게 사용</p>
<h3 id="2-조건문-if">2. 조건문 (if)</h3>
<p>조건에 따라 코드 실행을 분기할 때 사용한다.</p>
<p>기본 문법</p>
<pre><code>if (조건) {
  // 실행 코드
} else if (조건) {
  // 다른 조건
} else {
  // 위 조건이 모두 아닐 때
}</code></pre><p>python처럼 if문 형태가 바뀌진 않아서 좋네오!!</p>
<h3 id="3-반복문-for">3. 반복문 (for)</h3>
<p>특정 코드를 반복 실행할 때 사용한다.</p>
<pre><code>for (초기값; 조건; 증감식) {
  // 반복 실행 코드
}</code></pre><blockquote>
<p>처음 공부하는 언어라 형태가 많이 달라서 어려울까봐 걱정 많이 했는데 생각보다 js랑 유사해서 좋았습니다&gt;&lt;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][python] 문자열이 몇 번 등장하는지 세기 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4-%EB%AA%87-%EB%B2%88-%EB%93%B1%EC%9E%A5%ED%95%98%EB%8A%94%EC%A7%80-%EC%84%B8%EA%B8%B0-Level-0</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4-%EB%AA%87-%EB%B2%88-%EB%93%B1%EC%9E%A5%ED%95%98%EB%8A%94%EC%A7%80-%EC%84%B8%EA%B8%B0-Level-0</guid>
            <pubDate>Wed, 01 Apr 2026 17:17:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/7540ce9b-7a09-4d26-bc8d-dfe7ab60b385/image.png" alt="">
Python 풀이 소스</p>
<pre><code>def solution(myString, pat):
    answer = 0
    for i in range(len(myString) - len(pat) +1) :
        if myString[i:i+len(pat)] == pat:
            answer+=1
    return answer</code></pre><p>핵심 반복문
pat 길이만큼 잘라야 하니까
끝까지 가면 안 되고 자를 수 있는 마지막 위치까지만 반복</p>
<p>if문은 현재 위치 i부터 pat 길이만큼 잘라서 비교하는 로직으로 만들었습니당!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][python] 잘라서 배열로 저장하기 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EC%9E%98%EB%9D%BC%EC%84%9C-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0-Level-0</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EC%9E%98%EB%9D%BC%EC%84%9C-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0-Level-0</guid>
            <pubDate>Tue, 31 Mar 2026 16:08:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/d662d8b2-9d6a-4fb9-9058-daa48df55d8e/image.png" alt="">
Python 풀이 소스</p>
<pre><code>def solution(my_str, n):
    answer = []
    for i in range(0,len(my_str),n) :
        answer.append(my_str[i:(i+n)])
    return answer</code></pre><p>난이도가 낮은 문제라도 완료한 사람이 적으면 괜히 도전하기가 망설여졌는데,
이번 &quot;잘라서 배열로 저장하기&quot; 문제는 직접 시도해보니 생각보다 어렵지 않았다.</p>
<p>위에는 i값으로 0부터 my_str의 길이값을 n값씩 더하며 반복하는 for문이다.
append 안에 있는 것은 my_str의 문장의 길이들을 i에서 i+n값 까지 출력해 answer배열에다가 넣는 설계를 해보았다.</p>
<h4 id="error-발생">&lt;error 발생&gt;</h4>
<p>JavaScript에서 push()를 사용하던 습관 때문에 Python에서도 push를 사용했는데 오류가 발생했다. Python에서는 리스트에 값을 추가할 때 <strong>append()</strong>를 사용해야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스 수행평가...]]></title>
            <link>https://velog.io/@yeseo_052/C</link>
            <guid>https://velog.io/@yeseo_052/C</guid>
            <pubDate>Mon, 30 Mar 2026 14:39:20 GMT</pubDate>
            <description><![CDATA[<p>오늘 프로세스 스케줄링 수행을 했는데,,,,,
 <img src="https://velog.velcdn.com/images/yeseo_052/post/f4e40992-6fa8-4dab-9d9b-ace73be133e0/image.png" alt=""></p>
<h3 id="-아니-글쎄-문제로-프로세스가-p1p6까지-있는거에오">??????? 아니 글쎄 문제로 프로세스가 P1~P6까지 있는거에오</h3>
<p>아닣ㅎ 뭐 FCFS나 우선순위는 괜찮았지만... <del>안 괜찮았어요</del>
라운드로빈을 하려니 진짜 진땀이 나더라구요,,,,
프로세스가 p1~p6이 있어도 숫자가 크지 않으면 풀 수 있다고 생각했는데</p>
<h2 id="실행시간-p1-20ms-p2-7ms-p3-30ms-">실행시간 P1: 20(ms) P2: 7(ms) P3: 30(ms) ....</h2>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/6677aa31-5800-4bd1-8d4c-7eab27f8c0f4/image.png" alt="">
네...? 저 수학 못해요...(집중력도 안 좋음)
하하 그렇다고 수행을 포기할 순 없어서 풀이 과정을 쓰며 하고 있는데 
처음에는 우선순위로 그래프 그리기 이런 거라 집중력만 좋으면 척척 수월하게 풀어갈 수 있었어요...
다행히 <strong>도착시간은 다 0ms</strong>로 끝나서 평균 대기 값 구하는 것도 수월할 수 있었어요&gt;&lt;</p>
<h3 id="아직-남았다-라운드로빈">아직 남았다. 라운드로빈</h3>
<p>하핳하 6ms로 할당 시간값을 가지고 풀어나가는데 6개나 되니까 뭔 그래프가....ㅎㅋㅎㅋ
<img src="https://velog.velcdn.com/images/yeseo_052/post/55b55478-1725-49ac-ad17-623165ac7275/image.gif" alt="">
진짜 정신이 하나도 없고 하나라도 실수하면 끝이기에....너무 힘들었던 시간인 것 같습니다..ㄴ..네...</p>
<h2 id="시간이-남았다면">시간이 남았다면</h2>
<p>열심히 풀어 검토할 시간이 있었는데 진짜...문제 꼼꼼히 보시고...공부도 꾸준히 해야 한다는 걸 깨달았습니다. 전 4번 문제 있는 줄도 모르고 제출하고... 프로세스 대기 값도 라운드로빈 쪽 잘 못 계산해서 망했습니다!!!!하하하핳 <del>부분점수 많이 주세요....제발</del></p>
<blockquote>
<p>다들 꼼꼼히 보는 하루가 되시길....Good Bye</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[DB 설계 or ER모델]]></title>
            <link>https://velog.io/@yeseo_052/DB-%EC%84%A4%EA%B3%84-or-ER%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@yeseo_052/DB-%EC%84%A4%EA%B3%84-or-ER%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Wed, 25 Mar 2026 15:09:24 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터베이스-설계">데이터베이스 설계</h3>
<p>데이터의 구조와 관계를 미리 정의하는 과정!
=&gt; 설계 없이 생성하면 트러블 슈팅이 생길 위험이 있어 구현전에 설계 과정이 필요하다.</p>
<ol>
<li><strong>데이터베이스 설계 단계</strong></li>
</ol>
<p>요구사항 분석: 필요한 데이터 파악 → 요구사항 명세서</p>
<p>개념적 설계: 정보 구조화(추상화), DBMS 독립적(무시) → ER 다이어그램
논리적 설계: ERD를 테이블 구조로 변환 → 논리적 스키마
          - 엔티티 =&gt; 사각형
          - 애트리뷰트 =&gt; 타원
          - 기본키 : 타원 안에 밑줄을 그어 표시
          - 관계 =&gt; 마름모
물리적 설계: 실제 저장 구조, 인덱스 설정 → 물리적 스키마</p>
<p>구현: SQL로 실제 DB 생성</p>
<ol start="2">
<li>ER 모델의 구성 요소와 기호</li>
</ol>
<p>엔티티(Entity): 관리 대상 (사각형, 명사형)</p>
<p>애트리뷰트(Attribute): 엔티티의 속성 (타원, 기본키는 밑줄)</p>
<p>관계(Relationship): 엔티티 간 연결 (마름모, 동사형)</p>
<ol start="3">
<li>카디널리티 (관계의 수)</li>
</ol>
<p>1:1: 한 사람이 하나의 주민번호를 가짐.</p>
<p>1:N: 한 선생님이 여러 학생을 지도함.</p>
<p>N:M: 여러 학생이 여러 과목을 수강함.</p>
<ol start="4">
<li>논리적 설계의 핵심 (변환 규칙)</li>
</ol>
<p>엔티티 → 테이블 / 애트리뷰트 → 컬럼</p>
<p>N:M 관계의 처리: 관계형 DB에서는 직접 표현이 불가능하여, 두 테이블 사이를 연결하는 <strong>&#39;중간 테이블&#39;</strong>이 반드시 필요함.</p>
<ol>
<li><p>데이터베이스 설계의 목적 (좋은 설계란?)
핵심: 데이터의 중복을 최소화하고 일관성을 유지하는 것.
효과: 갱신 이상 방지, 정확성 유지, 효율적인 데이터 처리.</p>
</li>
<li><p>정보의 중복과 갱신 이상 (Anomaly)
설계가 잘못되어 데이터가 중복되면 다음과 같은 3가지 <strong>&#39;이상 현상&#39;</strong>이 발생합니다. (시험 단골 문제!)</p>
</li>
</ol>
<ul>
<li>수정 이상: 중복된 데이터 중 일부만 수정되어 데이터가 서로 맞지 않게 됨.</li>
<li>삽입 이상: 원하지 않는 정보를 함께 입력하지 않으면 필요한 정보를 저장할 수 없음.</li>
<li>삭제 이상: 특정 정보를 삭제할 때 삭제되어서는 안 될 유용한 정보까지 함께 삭제됨.</li>
</ul>
<ol start="3">
<li><p>함수적 종속성 (Functional Dependency)
정규화의 기준이 되는 아주 중요한 개념입니다.정의: 어떤 속성 A의 값을 알면 다른 속성 B의 값을 유일하게 결정할 수 있는 상태 
예시: 학번을 알면 이름을 알 수 있으므로, 이름은 학번에 함수적으로 종속되어 있다고 합니다.</p>
</li>
<li><p>정규화 (Normalization) 단계복잡한 테이블을 무단계적으로 쪼개어 이상 현상을 제거하는 과정입니다.
① 제1정규형 (1NF)조건: 모든 속성값이 <strong>원자값(Atomic Value)</strong>이어야 함.의미: 한 칸(셀)에 값이 여러 개 들어있으면 안 되고, 무조건 하나씩만 들어가야 합니다.</p>
<p>② 제2정규형 (2NF)조건: 제1정규형을 만족하고, 완전 함수적 종속이어야 함.핵심: 기본키가 여러 속성으로 합쳐진 경우(복합키), 기본키의 일부에만 종속되는 속성(부분 함수적 종속)을 제거하는 단계입니다.쉽게 말해: &quot;기본키 전체에 걸려있지 않고 일부에만 빌붙어 있는 애들을 따로 떼어내서 새 테이블을 만든다!&quot;</p>
</li>
</ol>
<p> ③ 제3정규형 (3NF)조건: 제2정규형을 만족하고, 이행적 함수적 종속을 제거해야 함.이행적 종속이란?: $A \rightarrow B$이고 $B \rightarrow C$일 때, 결과적으로 $A \rightarrow C$가 성립하는 관계.핵심: 기본키가 아닌 속성들끼리 서로 종속 관계가 있는 경우를 분리합니다. (예: 학번 $\rightarrow$ 학과명, 학과명 $\rightarrow$ 학과 사무실 번호)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DBP정리]]></title>
            <link>https://velog.io/@yeseo_052/DBP%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yeseo_052/DBP%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 25 Mar 2026 12:03:22 GMT</pubDate>
            <description><![CDATA[<h2 id="관계-데이터-모델과-제약조건">관계 데이터 모델과 제약조건</h2>
<h3 id="관계-데이터-모델">관계 데이터 모델?</h3>
<p>데이터를 테이블 형태로 표현한다.</p>
<ul>
<li>데이터는 행(row)과 열(column)로 구성.</li>
<li>SQL을 사용하여 데이터 검색 가능.</li>
<li>데이터 독립성을 제공하여 데이터와 프로그램의 관리가 독립적.</li>
</ul>
<h4 id="릴레이션">릴레이션</h4>
<p>데이터를 저장한느 기본 구조로 <strong>2차원 테이블 형태</strong>의 데이터 집합을 의미합니다.
릴레이션 == 테이블 (릴레이션을 실제 데이터베이스 시스템에서는 테이블이라고 부름)
&lt;릴레이션의 특징&gt;</p>
<ul>
<li>튜플과 애트리뷰트의 순서는 의미가 없음</li>
<li>각 애트리뷰트는 하나의 값만 가짐.</li>
<li>관계 모델에서는 동일 튜플 존재 불가
=&gt; BUT 실제 DBMS에서는 가능하기 때문에 제약조건을 걸어야한다!</li>
</ul>
<h4 id="튜플">튜플</h4>
<p>릴레이션(테이블)의 각 행(row)
<img src="https://velog.velcdn.com/images/yeseo_052/post/ee46b5e8-980c-4bf6-8137-ecf5471ed58e/image.png" alt=""> 튜플 == 레코드</p>
<h4 id="애트리뷰트">애트리뷰트</h4>
<p>릴레이션(테이블)의 열(column)
애트리뷰트는 “값들을 묶는 기준(이름)” 의미를 알 수 있도록 이름을 부여한 것
<img src="https://velog.velcdn.com/images/yeseo_052/post/19527de2-fdcc-433b-b598-4181a635e850/image.png" alt=""></p>
<h4 id="도메인">도메인</h4>
<p>애트리뷰트 값의 허용 가능한 범위를 의미한다.</p>
<blockquote>
<p>INT =&gt; 정수
VARCHAR =&gt; 문자열
DATE =&gt; 날짜</p>
</blockquote>
<h4 id="null-값">NULL 값</h4>
<p>릴레이션(데이터)에 튜플(레코드)을 삽입할 때 일부 애트리뷰트(속성) 값을 지정하지 않았다면 null값을 사용한다. (숫자 0 / 공백 문자 &quot; &quot; / 빈 문자열)</p>
<p>-- NULL의미 : 값 없음/해당 값이 존재X/해당 속성 적용
일반값 or null 다르게 연산에 참여하면 결과는 <strong>NULL</strong></p>
<h3 id="릴레이션-스키마-or-인스턴스">릴레이션 스키마 or 인스턴스</h3>
<p><strong>릴레이션 스키마</strong>
짧게 설명하자면 테이블의 설계도(틀)
ex) 튜플 테이블을 보면 사용자(이름, 나이, 성별)
사용자 = 테이블 이름
이름, 나이, 성별 = 애트리뷰트들</p>
<p><strong>릴레이션 인스턴스</strong>
실제 데이터 튜플 테이블의 있는 철수,영희,민수,지은이의 데이터 값들을 설명하는 것이 릴레이션 인스턴스라고 합니다.</p>
<h3 id="릴레이션-키">릴레이션 키?</h3>
<p>릴레이션에서 각 튜플(레코드)을 고유하게 식별하기 위해 사용되는 애트리뷰트(속성)이다.</p>
<ul>
<li><p><strong>슈퍼키(Super Key)</strong> </p>
<ul>
<li>튜플(레코드)을 고유하게 식별할 수 있는 속성 집합</li>
<li>튜플을 식별할 수 있다면 모두 슈퍼키가 될 수 있다.</li>
<li>but 불필요한 속성이 포함될 수 있다.</li>
</ul>
</li>
<li><p><strong>후보키(Candidate Key)</strong> </p>
<ul>
<li>슈퍼키 중에 불필요한 속성을 제거한 것이 후보키이다.</li>
<li>후보키는 속성 삭제 가능.</li>
<li>모든 릴레이션(데이터)에는 최소 한 개 이상 존재해야함</li>
</ul>
</li>
<li><p><strong>기본키(Primary Key)</strong> : 후보키 중에서 하나를 선택하여 사용하는 키
&lt;조건&gt;</p>
<ul>
<li>NULL 값 불가</li>
<li>중복 값 불가</li>
</ul>
</li>
<li><p><strong>왜래키(Foreign Key)</strong></p>
<ul>
<li>다른 데이터(릴레이션) 기본키를 참조하는 애트리뷰트
ex) 만약 사용자의 테이블이 있고, 수강과목 테이블이 있다면 수강과목에 있는 사용자의 &quot;이름&quot;은 참조한(왜래키)이다. </li>
</ul>
</li>
</ul>
<h3 id="무결성-제약조건">무결성 제약조건</h3>
<p>데이터베이스에 저장되는 데이터가 항상 올바른 상태로 유지되도록 제한하는 규칙이다.
종류로는 도메인, 엔티티, 참조 무결성이 있다.</p>
<h4 id="도메인-무결성">도메인 무결성</h4>
<blockquote>
<p>속성이 가질 수 있는 값의 범위를 제한하는 것</p>
</blockquote>
<h4 id="엔티티-무결성">엔티티 무결성</h4>
<blockquote>
<p>기본키(NULL값을 가질 수 없다, 중복될 수 없다)</p>
</blockquote>
<h4 id="참조-무결성">참조 무결성</h4>
<blockquote>
<p>외래키 값이 참조하는 테이블의 기본키 값과 일치해야 한다는 규칙
외래키로 사용되는 값은 반드시 참조하는 테이블에 존재하는 값이어야 함</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[DBP 데이터베이스시스템]]></title>
            <link>https://velog.io/@yeseo_052/DBP-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@yeseo_052/DBP-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Tue, 24 Mar 2026 14:50:27 GMT</pubDate>
            <description><![CDATA[<p>DBMS(데이터베이스 관리 시스템) 관련된 기능 및 장단점, 데이터 독립성, 그리고 관계형 데이터베이스의 구조를 설명해보도록 하겠숩니다!</p>
<h4 id="데이터란">데이터란?</h4>
<p>데이터는 가공되지 않은 사실이나 값(원시적 값)</p>
<h4 id="정보란">정보란?</h4>
<p>정보는 데이터를 처리하여 얻는 결과로 의미 있는 해석을 포함합니다.</p>
<h3 id="데이터베이스">데이터베이스</h3>
<p>데이터베이스는 조직에서 필요한 데이터를 체계적으로 저장하고 관리하는 데이터의 집합.
데이터베이스의 특징으로는 4가지가 있습니다.</p>
<ul>
<li><strong>공유 데이터</strong> : 여러 사용자와 프로그램의 동시 사용 가능한 <strong>공유 자원</strong></li>
<li><strong>통합된 데이터</strong> : 파일 여러개 생성하지 않고! <strong>통합해 데이터 관리(데이터 중복 최소화)</strong></li>
<li><strong>메타데이터 포함</strong> : 데이터(구조+특성)에 대한 정보를 함께 저장</li>
<li><strong>데이터 독립성</strong> : 데이터 구조가 바뀌어도 프로그램은 거의 영향을 받지 않도록 분리하는 것</li>
</ul>
<h3 id="dbms">DBMS</h3>
<p>DBMS는 데이터를 효율적으로 관리하고, 데이터 중복 및 불일치를 줄이며, 데이터 공유 및 동시 접근을 가능하게 합니다.
<strong>DBMS의 기능</strong>: 데이터베이스 생성 및 구조 정의, 데이터 접근 제어 및 보안 관리, 시스템 복구. </p>
<pre><code>사용자와 응용 프로그램이 데이터를 안전하고 효율적으로 사용할 수 있는 환경을 제공</code></pre><h4 id="dbms-장단점">DBMS 장단점</h4>
<p><strong>장점</strong>
    1. 데이터 중복 및 불일치 감소
    2. 데이터 공유 및 동시 접근 가능
    3. 데이터 독립성 향상
    4. 데이터 무결성 유지
    5. 개발 및 유지보수 효율 향상
    =&gt; 중복은 낮고, 공유 높고, 정확성-보안성-표준화도 좋다.
<strong>단점</strong>
    1. 시스템 구축 비용(운영비)
    2. 구조의 복잡성
    3. 전문적인 관리자 필요
    4. 장애 발생 시 전체 시스템에 영향
    =&gt; 비용 비싸고 복잡도 높고 장애 위험이 높다.</p>
<h3 id="스키마">스키마</h3>
<p>외부 스키마 :  사용자가 보는 화면
내부 스키마 : DBMS가 관리하는 물리적 저장구조(파일,저장, 등등)</p>
<p>테이블의 스키마란
이 명령은 테이블의 틀(=뼈대, 스키마)만 나타낼 뿐, 테이블 안에 어떤 자료가 실제로 들어있는지는 말하지 않음. =&gt;스키마는 뼈대, 인스턴스는 값이다.</p>
<h3 id="상태">상태</h3>
<p>특정 시점에서 데이터베이스에 실제로 저장되어 있는 데이터의 내용
시간이 지나면서 계속 변경 가능
데이터베이스의 <strong>현재 상태</strong>를 의미한다.</p>
<h3 id="dbms-언어">DBMS 언어</h3>
<h4 id="ddl데이터-정의어">DDL(데이터 정의어)</h4>
<p>오브젝트(object)정의 BUT 변경하기 위해 사용.</p>
<h4 id="dml데이터-조작어">DML(데이터 조작어)</h4>
<p>데이터베이스 저장값 검색을 하거나 수정하기 위해 사용하는 언어.</p>
<ul>
<li><strong>데이터베이스 안에 있는 자료들 (M→조작)</strong>  DML이 가장 중요!!<ul>
<li><strong>select   (조회(검색))</strong></li>
<li><strong>delete   (삭제)</strong></li>
<li><strong>update   (변경)</strong></li>
<li><strong>insert   (삽입)</strong><h4 id="dcl데이터-제어어">DCL(데이터 제어어)</h4>
데이터베이스 접근 권한을 관리하기 위해 사용하는 언어.
(제어 : 권한관리)</li>
</ul>
</li>
</ul>
<p><strong>데이터 독립성</strong>: 데이터 구조 변경 시 응용 프로그램에 미치는 영향을 최소화하는 특성.</p>
<p><em>Insights</em></p>
<blockquote>
<p>데이터베이스 시스템은 현대 정보 시스템의 핵심 요소로, 데이터의 효율적인 관리와 접근을 통해 조직의 의사결정 및 운영 효율성을 높이는 데 기여합니다. DBMS의 도입은 데이터 중복과 불일치를 줄이고, 데이터 공유를 용이하게 하여 협업을 촉진합니다. 그러나 시스템 구축 비용과 복잡성, 전문 관리자의 필요성은 도전 과제가 될 수 있습니다. 데이터 독립성은 데이터베이스의 유연성을 높여주며, 이는 변화하는 비즈니스 요구에 신속하게 대응할 수 있는 기반을 제공합니다.</p>
</blockquote>
<p>수행평가를 위해 겸사겸사 정리해봤는데 db는 참 어려운 것 같네오,,,,ㅜ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스 스케줄링]]></title>
            <link>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</link>
            <guid>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</guid>
            <pubDate>Mon, 23 Mar 2026 14:58:32 GMT</pubDate>
            <description><![CDATA[<p>프로세스 스케줄링에 여러 알고리즘 중에 3개를 공부했기 때문에 3개를 알려드리겠습니다!!<del>정확한 계산법이 아닐 수 있음</del></p>
<h3 id="1-fcfs-scheduling">1. FCFS Scheduling</h3>
<p>FCFS 스케줄링은 First Come First Served의 약자로 CPU에 도착하는 순서대로 프로세스를 할당해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/9a19073a-717b-4a3f-8fa7-724a756bb2bc/image.png" alt="">
이렇다면 그래프로는
<img src="https://velog.velcdn.com/images/yeseo_052/post/ee9b8ade-9325-4c24-a2ab-e92fb6b72866/image.png" alt="">
이렇게 표현됩니다. 
계산법은 Waiting Time: P1=0, P2=5, P3=10이므로
Average Waiting Time = (0+5+10) / 3 = 5(ms)가 됩니다.</p>
<h3 id="2-라운드로빈round-robin">2. 라운드로빈(Round Robin)</h3>
<p>라운드로빈은 동일한 크기의 할당 시간을 갖게됩니다. 할당시간이 끝난다면 프로세스는 자동으로 선점당하고, 다시 Ready queue의 제일 뒤에 가서 다시 줄을 선다.</p>
<p><img src="https://velog.velcdn.com/images/yeseo_052/post/d90974b3-221c-47e2-a668-9974edc9e192/image.png" alt="">
만약 이렇게 그래프가 있다면 
A대기 값은 = (10-4)+(15-14) = 6 + 1 =7(ms)
B대기 값은 = 4+(14-8) = 4 + 6 = 10(ms)
C대기 값은 = 8
Average Waiting Time = (7+10+8)/3 = 8.3(ms)가 됩니다.</p>
<h3 id="3-우선순위">3. 우선순위</h3>
<p>우선순위 스케줄링은 특정 기준으로 프로세스에게 우선순위를 부여해 우선순위가 제일 높은 프로세스에게 CPU를 할당하는 방식입니다.
<img src="https://velog.velcdn.com/images/yeseo_052/post/a45ee8c3-3794-4040-a52e-ad962c0f35d2/image.png" alt="">
위 그래프처럼 우선순위 순서대로 그려집니다.
A = 20(ms)
B =  5(ms)
C =  2(ms)
평균대기값은 (0+5+25) / 3 = 10(ms)가 됩니다.</p>
<blockquote>
<p>처음에는 프로세스 스케줄링 관련한 지식이 없어 불안했지만 책과 구글서치로 더 쉽게 이해할 수 있었습니다!!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래밍 JS]]></title>
            <link>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-JS</link>
            <guid>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-JS</guid>
            <pubDate>Fri, 20 Mar 2026 02:32:32 GMT</pubDate>
            <description><![CDATA[<h2 id="배열-메서드map-filter-reduce-foreach">배열 메서드(map, filter, reduce, forEach)</h2>
<p>오늘은 배열의 map, filter, reduce, forEach를 공부해보도록 하겠습니당</p>
<h3 id="map">map</h3>
<p>map은 배열의 각 원소를 변환하여 새로운 배열을 생성합니다.</p>
<pre><code>const num = [1, 2, 3];
const doubled = numbers.map(num =&gt; num*2);
console.log(doubled);</code></pre><blockquote>
<p>출력: [2, 4, 6]</p>
</blockquote>
<p>왜 다들 <strong>map</strong>을 쓸까요?</p>
<pre><code>Js뿐만 아니라 다른 언어에서도 map을 선호하는 이유는 &lt;무엇을(What)할 것인가&gt;에 집중하기 때문입니다.</code></pre><p>map 장점으로는 원본 데이터를 건드리지 않고 새로운 데이터를 만들어주고, for 루프처럼 인덱스를 관리할 필요가 없어 가독성이 좋습니다. map().filter().reduce()처럼 여러 기능을 엮어서 사용하기에도 편리해 map을 자주 사용합니다!</p>
<h3 id="filter">filter</h3>
<p>filter()란?
filter은 말 그대로 <strong>거름망</strong>입니다. 배열의 각 요소를 하나씩 살펴보며, 내가 정한 <strong>조건에 맞는(True)</strong> 요소들만 모아 새로운 배열을 만듭니다.</p>
<p>filter또한 원본 데이터를 건드리지 않고 조건에 맞는 게 없다면 에러가 아닌 빈 배열([])을 출력합니다.</p>
<p>숫자 배열 예제로 한 번 보자면</p>
<pre><code>const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(num =&gt; num%2 === 0);
console.log(evenNumbers);</code></pre><blockquote>
<p>출력 : [2, 4]</p>
</blockquote>
<p>⚠️find()와 헷갈리지 마세요
filter() : 조건을 만족하는 <strong>모든 요소</strong>를 찾아 <strong>배열</strong>로 반환합니다.
find() : 조건을 만족하는 <strong>가장 첫 번째 요소 하나</strong>만 찾아 값(객체)으로 반환합니다.</p>
<p>데이터를 삭제하거나 검색 기능을 구현할 때는 꼭! filter를 사용하시는 것을 추천드립니다!!!</p>
<h3 id="reduce">reduce</h3>
<p>reduce는 배열의 하나의 값으로 축소합니다. 대부분 사람들은 합계, 평균 구하기 할 때 사용합니다. 
reduce로 합계, 평균 구하기? _식은 죽 먹기_입니다.</p>
<h4 id="reduce누적-값현재-값">reduce((&quot;누적 값&quot;,&quot;현재 값&quot;))</h4>
<pre><code>const numbers = [1, 2, 3];
const sum = numbers.reduce((acc, num) =&gt; acc + num, 0);
console.log(sum); </code></pre><blockquote>
<p>출력 : 6</p>
</blockquote>
<p>초기값을 설정하세요! 두 번째 인자인 0이나 {}, []를 빼먹으면 배열의 첫 번째 요소가 초기값이 됩니다.</p>
<h3 id="foreach">forEach</h3>
<p>forEach는 배열의 각 원소를 반복적으로 처리하지만, <strong>새로운 배열</strong>을 생성하지는 않습니다.</p>
<pre><code>map이나 filter처럼 무언가 거창한 결과를 만들어내기보다, 배열의 요소를 하나씩 꺼내서 &quot;그냥 일을 시킬 때&quot; 가장 많이 쓰이는 녀석이죠.</code></pre><p><strong>배열을 새로 만들지 않습니다.</strong> 단순히 반복문(for)을 대체하는 용도에도 가깝게 느껴집니다.</p>
<p>기본적인 사용법입니다.</p>
<pre><code>const numbers = [1, 2, 3];

// 각 원소를 하나씩 꺼내서 출력만 하고 끝!
numbers.forEach((num, index) =&gt; {
  console.log(`${index}번째 숫자는 ${num}입니다.`);
});</code></pre><blockquote>
<p>출력:
0번째는 숫자는 1입니다.
1번째 숫자는 2입니다.
2번째 숫자는 3입니다.</p>
</blockquote>
<p>⚠️forEach 사용 시 주의할 점!</p>
<ol>
<li>break or continue는 못 쓴다.<pre><code>일반 for문과 달리 중간에 **멈출 수 없습니다**. forEach는 끝까지 다 돌아야 합니다.</code></pre></li>
<li>map과 헷갈리면 안 됩니다!!<pre><code>값을 변환해서 새로운 배열을 얻고 싶으면 map</code></pre><pre><code>작업만 수행하고 싶으면 forEach</code></pre></li>
</ol>
<p>도움이 되셨나요? 드디어 배열 메서드 4대장 시리즈가 끝났습니다! 
궁금한 점이나 틀린 부분은 <strong>댓글</strong> 환영입니당!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래밍 기능사(파이썬)]]></title>
            <link>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B8%B0%EB%8A%A5%EC%82%AC%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@yeseo_052/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B8%B0%EB%8A%A5%EC%82%AC%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Thu, 19 Mar 2026 14:32:59 GMT</pubDate>
            <description><![CDATA[<p>먼저 프로그래밍 기능사란? 정보시스템 구축에 필요한 기초 프로그래밍, UI 구현,
SQL 활용, 테스트 등의 업무 능력을 평가하는 국가기술자격 시험입니다.</p>
<p>프로그래밍 언어에서 가장 많이 활용되는 것이 Java와 Python이라고 해서 Python으로 짠 코드 중에서 틀린 3문제를 복습해보려고 합니다!</p>
<h4 id="1-다음-코드의-출력-결과를-예측하시오">1. 다음 코드의 출력 결과를 예측하시오.</h4>
<pre><code>a = [1, 2, 3]
b = a * 2
print(b)</code></pre><p>정답은? [1, 2, 3, 1, 2, 3] 입니다.
*2으로 숫자를 곱하면 내부 요소에 연산 수행을 하여 [2, 4, 6]이라고 생각했는데 리스트 자체를 복제하여 연결되는 것이라고 하네요!!</p>
<h4 id="2다음-리스트-연산의-결과로-출력되는-것은">2.다음 리스트 연산의 결과로 출력되는 것은?</h4>
<pre><code>list = [10, 20, 30, 40, 50]
print(list[-2])</code></pre><p>정답은? 40입니다.
항상 배열 조회는 0부터라고 생각해 뒤에서 가져올 때도 -0,-1,-2라고 생각해 30을 적었는데 뒤로 가져올 때는 -1부터 시작한다고 생각하시고 출력값을 넣으시면 될 것 같습니다!</p>
<p><em>but 왜 -0부터 시작을 안 하는가?</em>
-0은 결국 0과 같기 때문에 첫 번째 요소를 가리키게 되어 사용할 수 없는 것!!!</p>
<h4 id="3-다음-코드의-실행-결과는">3. 다음 코드의 실행 결과는?</h4>
<pre><code>def change(x) :
    x = x+10
x = 5
change(x)
print(x)</code></pre><p>정답은? 5입니다.
change(x)로 5값을 불러와서 15가 되어도 불러왔을 때만 함수 밖에 원본 변수는 업데이트가 되는 부분은 아니기 때문에 print(x)를 하면 5가 나오는 게 맞습니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MongoDB JS로 활용하기]]></title>
            <link>https://velog.io/@yeseo_052/MongoDB-JS%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yeseo_052/MongoDB-JS%EB%A1%9C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 18 Mar 2026 14:09:24 GMT</pubDate>
            <description><![CDATA[<p>오늘은~ mongoDB를 활용해 사용자의 이름, 사진을 생성하고, 조회하고 사용자가 몇 명 있는지 사용자 수를 카운트하려고 합니다!</p>
<p> mongoose로 mongoDB의 있는 데이터에 있는 필드명의 type들을 정의해 줄 수 있습니다.
 require를 사용하여 라이브러리를 불러오고 연결합니다!</p>
<p><strong>npm install mongoose</strong>를 해줍니다.</p>
<pre><code>const mongoose = require(&quot;mongoose&quot;);
const FishSchema = new mongoose.Schema(
    {
        name: {
            type : String,
            required : true
        },
        image: {
            type : String,
            required : true
        }
    }
);
const FishContact = mongoose.model(&quot;FishDB&quot;,FishSchema);
module.exports = FishContact;</code></pre><p> 저는 name(이름)과 image(사진)을 정의 해줬습니다!</p>
<p> 그리고 이 FishDB를 활용할 router 소스를 만들어봅시다.</p>
<pre><code>const ex = require(&quot;express&quot;);
const router = ex.Router(); 
const Fish = require(&quot;../models/FishDB&quot;);

//Get 물고기 개수 조회(사용자 수 카운트)
router
    .route(&quot;/fish/count&quot;)
    .get(async(req,res)=&gt;{
        try{
            const userCount = await Fish.countDocuments();
            res.json(userCount);
        }catch(error){
            res.status(500)
        }
    });

//POST 물고기 생성
router
    .route(&quot;/fish&quot;)
    .post(async(req,res)=&gt;{
        try{
            const {name,image} = req.body;
            const fish = new Fish({
                name,
                image
            });
            const savedFish = await fish.save(); //추가 사용자 저장하기
            res.status(201).json(savedFish);
        }catch(error){
            console.error(error);
            res.status(400).json({message: error.message});
        }
    });

//Get 물고기 목록 조회
router
    .route(&quot;/fish&quot;)
    .get(async(req,res)=&gt;{
        try{
            const fishes = await Fish.find();
            res.json(fishes);
        }catch(error){
            console.error(error);
            res.status(500)
        }
    });
module.exports = router;</code></pre><p>mongoDB를 라우터로 조회,추가,사용자 수 카운트를 처음 해봐서 찾아보니!</p>
<h3 id="사용자-추가">사용자 추가</h3>
<blockquote>
<p>Model.save()</p>
</blockquote>
<h3 id="사용자-조회">사용자 조회</h3>
<blockquote>
<p>Model.find()</p>
</blockquote>
<h3 id="사용자-수-카운트">사용자 수 카운트</h3>
<blockquote>
<p>Model.countDocuments()</p>
</blockquote>
<p>근데 항상 await가 앞에 있는 이유는??
=&gt; DB 처리는 시간이 걸리기 때문에 데이터가 확실히 돌아온 후에 다음 로직을 처리하기 위해서 await를 사용합니다!</p>
<p>ai한테 소스 검사를 맡겼더니 /fish보다 /fish/count가 위에 있는 게 좋다고 하네요! Express는 위에서부터 읽기 때문에 주소가 겹치면 혼동할 수 있기 때문에 추천한다고 합니다!</p>
<p>MongoDB를 사용한 코드가 더 궁금하시다면?
<a href="https://github.com/Yeseo0502/Sebastian_Server">https://github.com/Yeseo0502/Sebastian_Server</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][python] 문자열 뒤집기]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8python-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Tue, 23 Sep 2025 13:36:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/23290533-80d2-4bd5-bd37-05e853d6bd09/image.png" alt=""></p>
<p>python 풀이</p>
<pre><code>def solution(my_string, s, e):
    answer = &#39;&#39;
    for i in range(0,s) :
        answer+=my_string[i]
    for i in range(e,s-1,-1) :
        answer+=my_string[i]
    for i in range(e+1,len(my_string)) :
        answer+=my_string[i]
    return answer</code></pre><p>처음에 있는 for문은 s값 앞에있는 문자열들을 answer값 안에다가 넣어주고,
2번째 for문은 s와 e값의 사이를 거꾸로 문자열을 뒤집어서 answer값에 넣어주고,
마지막 for문은 e 다음에 담아있는 문자열들을 answer값에 넣으면 문자열 뒤집기 완성~~
가독성은 떨어지지만 혼자 코테소스 완성 시켰다는 것만으로도 뿌듯하다....
가독성 있는 소스도 생각해보려고 한다 ^0^</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][JavaScript,Python] 7의 개 ]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8JavaScriptPython-7%EC%9D%98-%EA%B0%9C</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8JavaScriptPython-7%EC%9D%98-%EA%B0%9C</guid>
            <pubDate>Mon, 15 Sep 2025 16:06:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/3c75df8f-7b94-4a93-83a3-e5ef2e9e84ac/image.png" alt=""></p>
<p>JavaScript 문제풀이</p>
<pre><code>function solution(array) {
    var answer = 0;
    for (let i of array){
        for(let j of i.toString()){
            if (j==&quot;7&quot;)
                answer++;
        }
    }
    return answer;
}</code></pre><p>Python 문제풀이</p>
<pre><code>def solution(array):
    answer = 0
    for i in range(len(array)) :
        for j in str(array[i]) :
            if j in &quot;7&quot; :
                answer+=1
    return answer</code></pre><p>이차원 배열도 아닌 단순 배열임에도 불구하고, 배열 안의 문자열을 또 잘라서 &#39;7&#39;이 두 개 이상 포함돼 있으면 answer 값을 1씩 증가시켜야 하는 조건에서 조금 고민을 많이 했습니다.</p>
<p>JavaScript에서는 toString() 함수를 활용해 배열을 문자열로 변환해 해결했는데, Python에서는 배열 안의 값을 str로 변환하고 문자열로 구분하니까 오히려 더 수월하게 문제를 풀 수 있었습니다.</p>
<p>언어마다 제공하는 기능과 접근 방식의 차이를 다시 한 번 체감한 문제였습니다!</p>
<blockquote>
<p>피드백은 print(&quot;Welcome&quot;)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][java,javascript] 배열 자르 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8javajavascript-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4-Level-0</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8javajavascript-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4-Level-0</guid>
            <pubDate>Thu, 10 Apr 2025 15:15:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeseo_052/post/7d0e7ca1-8d49-439e-921d-7107e1ee3933/image.png" alt=""></p>
<p>java문제풀이</p>
<pre><code>class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = new int[num2-num1+1];
        for(int i=num1; i&lt;=num2; i++){
            answer[i-num1]=numbers[i];
        }
        return answer;
    }
}</code></pre><p>JavaScript문제풀이</p>
<pre><code>function solution(numbers, num1, num2) {
    var answer = [num2-num1+1];
    for(var i=num1; i&lt;=num2; i++){
        answer[i-num1]=numbers[i];
    }
    return answer;
}</code></pre><p>처음에는 뇌정지였는데ㅋㅋㅋㅋㅋ
또 막상 풀어보니까 for문과 배열에 대해 더 배울 수 있는 뜻 깊은 시간이었던 것 같습니당!</p>
<blockquote>
<h4 id="피드백은-printwelcome">피드백은 print(&quot;Welcome&quot;)</h4>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트][java,javascript] 약수의 합 - (Level 0)]]></title>
            <link>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%95%BD%EC%88%98%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@yeseo_052/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%95%BD%EC%88%98%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Tue, 01 Apr 2025 14:14:35 GMT</pubDate>
            <description><![CDATA[<h4 id="java문제풀이">java문제풀이</h4>
<p>문제 설명 : 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요!</p>
<pre><code>class Solution {
    public int solution(int n) {
        int answer = 0;
        for(int i=1; i&lt;=n; i++){
            if(n%i==0){
                answer+=i;
            }
        }
        return answer;
    }
}</code></pre><p>i를 1부터 for문(반복문)해서 i가 n값 숫자와 될 때 까지 계속 반복! 그래서 n%i==0이라면 n의 약수이므로 n의 약수값 i를 int answer값에다가 더하기</p>
<h4 id="javascript문제풀이">javaScript문제풀이</h4>
<pre><code>function solution(n) {
    var answer = 0;
    for(let i=1; i&lt;=n; i++){
        if(n%i==0){
            answer+=i;
        }
    }
    return answer;
}</code></pre>]]></description>
        </item>
    </channel>
</rss>