<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_dean.log</title>
        <link>https://velog.io/</link>
        <description>새로운도전</description>
        <lastBuildDate>Sun, 13 Aug 2023 08:34:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_dean.log</title>
            <url>https://images.velog.io/images/dev_dean/profile/7c7be084-fc94-4f8d-a534-b7c6db89fbb9/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_dean.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_dean" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[댓글 불러올때 성능 저하 문제]]></title>
            <link>https://velog.io/@dev_dean/%EB%8C%93%EA%B8%80-%EB%B6%88%EB%9F%AC%EC%98%AC%EB%95%8C-%EC%84%B1%EB%8A%A5-%EC%A0%80%ED%95%98-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_dean/%EB%8C%93%EA%B8%80-%EB%B6%88%EB%9F%AC%EC%98%AC%EB%95%8C-%EC%84%B1%EB%8A%A5-%EC%A0%80%ED%95%98-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 13 Aug 2023 08:34:03 GMT</pubDate>
            <description><![CDATA[<p>개인 사이드 프로젝트를 하면서 페이스북과 같이 게시글을 포스팅하고 불러오는 웹사이트를 만들고 있다.
<img src="https://velog.velcdn.com/images/dev_dean/post/96c6ddd9-d3f4-4a2a-9109-205c54b4ad91/image.png" alt=""></p>
<p>댓글은 가장 최근거만 확인 할 수 있도록 포스팅에 전체 댓글을 useState에 저장하고, 가장 첫번째거만 보여준 후, 만일 댓글이 삭제되면 그 다음 댓글을 가져올 수 있도록 하였다.</p>
<p>근데 문제가 생겼다.</p>
<p>댓글이 많으면 가져오는데 시간이 오래걸리고, 댓글을 삭제하면 다음과 같이 4초 이상 걸리는 경우까지 발생했다.</p>
<p><img src="https://velog.velcdn.com/images/dev_dean/post/55babd30-5af9-4624-80d7-822656c495df/image.png" alt=""></p>
<p>당연히 포스트에 해당하는 댓글을 모두 가져오는건 바보같은 생각이다.</p>
<p>그렇다면 어떤 방법이 있을까</p>
<h3 id="1-각-포스트에-최신-댓글-하나만-가져오고-전체-댓글을-확인할때에만-전체를-긁어온다">1. 각 포스트에 최신 댓글 하나만 가져오고, 전체 댓글을 확인할때에만 전체를 긁어온다</h3>
<p>현재 댓글을 가져오는 api는</p>
<pre><code class="language-javascript">router.get(&quot;/:postId&quot;, async (req, res, next) =&gt; {
  const { postId } = req.params;
  try {
    const query = `
    SELECT commentId,text,c.upvote,c.createdTime,username,profile_image,userId
    FROM Comments c
    JOIN Users u ON c.userId = u.id
    WHERE postId = ${postId}
    ORDER BY createdTime DESC
    `;
    const results = await executeQuery(query);
    res.json({ message: &quot;OK&quot;, data: results });
  } catch (error) {
    next(error);
  }
});</code></pre>
<p>그렇다면 댓글 자세히 보는 API와, 댓글에 보이는 최신 댓글을 보이는 API 총 두개를 두어서 활용하면 될것이다.</p>
<p><img src="https://velog.velcdn.com/images/dev_dean/post/8eb3d10b-b9d9-4060-8243-5974e3430d53/image.png" alt=""></p>
<p>적고 보니 상식적인 이야기이다. 확실히 빨라진 것을 확인을 했는데, 문제가 되는건 댓글을 삭제했을때 이전 댓글을 보여주는 것이다.</p>
<pre><code class="language-javascript">
// Delete comment API
router.delete(&quot;/:postId/comments/:commentId&quot;, async (req, res, next) =&gt; {
  try {
    const { postId, commentId } = req.params;
    if (!commentId) {
      return res.status(400).json({ message: &quot;Invalid data&quot; });
    }

    const deleteQuery = `
      DELETE FROM Comments
      WHERE commentId = ${commentId};
    `;
    await executeQuery(deleteQuery);
    const query = `
      SELECT *
      FROM Comments a
      JOIN Users b
      ON a.userId = b.id
      WHERE postId = ${postId}
      ORDER BY createdTime DESC
      LIMIT 1
    `;

    const result = await executeQuery(query);
    res.json({ message: &quot;Comment deleted successfully!&quot;, data: result });
  } catch (error) {
    next(error);
  }
});
</code></pre>
<p>다음과 같이 DELETE가 끝나면 SELECT 쿼리를 통해 최근 댓글 하나를 보여주는 방법을 사용하였다.</p>
<p>200개가 넘는 데이터여도 데이터 삭제를 하는데 시간이 많이 걸리지 않는걸확인하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript - call signature]]></title>
            <link>https://velog.io/@dev_dean/TypeScript-call-signature</link>
            <guid>https://velog.io/@dev_dean/TypeScript-call-signature</guid>
            <pubDate>Wed, 15 Feb 2023 10:07:30 GMT</pubDate>
            <description><![CDATA[<p>이해하는데 많은 시간이 걸렸다.</p>
<p>타입스크립트는 타입을 정해줄수 있는데, 함수를 선언했을때 인풋값들의 타입, 그리고 리턴값의 타입도 정해줄 수 있다.
예를들어
<img src="https://velog.velcdn.com/images/dev_dean/post/ce2f36d4-79ee-47c7-a415-4ce7a48b885e/image.png" alt="">여기서는  함수 안에서 타입을 설정해주었지만
<img src="https://velog.velcdn.com/images/dev_dean/post/d33a963c-9337-4d3f-9681-fa6bc340266a/image.png" alt="">
다음과 같이 type으로 인풋 및 리턴값의 타입을 설정한 후, 새 function에 적용시킬 수 있다.<img src="https://velog.velcdn.com/images/dev_dean/post/4be50b9e-2282-476a-9367-cd81678f888f/image.png" alt="">
함수 명 뒤에 Add 를 적어 현재 함수의 인풋에는 a,b 가 들어가며 모두 숫자 형태라는것을 알 수 있고, 리턴값또한 숫자로 반환해야한다.</p>
<h1 id="generics">Generics</h1>
<p>다음과 같은 상황을 가정해보자
<img src="https://velog.velcdn.com/images/dev_dean/post/9d2eba76-14b8-4938-90dc-5e95d92b1271/image.png" alt="">
SuperPrint에는 숫자,boolean,string만으로 이루어진 Array를 만들 수 있다. 이때 <img src="https://velog.velcdn.com/images/dev_dean/post/af08678f-a232-47c6-861e-08e5689f82a2/image.png" alt="">
이와같은 데이터는 오류를 낸다.<img src="https://velog.velcdn.com/images/dev_dean/post/a5667157-50ee-467f-81dc-ab899d668228/image.png" alt=""></p>
<p>다음과같이 적으면 에러는 사라지는 것을 볼 수 있지만 매번 모든 경우의 수를 적어 줄 수가 없다.</p>
<p>이때 Generics라고 해서 인풋에 따라 타입을 정해줄 수가 있다.
<img src="https://velog.velcdn.com/images/dev_dean/post/9a570273-cdb2-4971-97cf-659abffe6493/image.png" alt="">
이는 function에서 어떤 데이터가 들어오든 그 타입으로 이루어진 Array 를 생성하고 리턴값은 void인것을 알 수 있다.</p>
<p>다음은 type으로 리턴하는 콜 signature이다.
<img src="https://velog.velcdn.com/images/dev_dean/post/8cf2f368-5d89-4865-b554-46953ad5c095/image.png" alt="">다음과 같이 잇풋이 여러가지가 들어오면 리턴값 또한 그에 맞는 타입으로 반환된다.</p>
<p><img src="https://velog.velcdn.com/images/dev_dean/post/4cfd9554-7c32-452e-b7c2-42eda750a190/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 자료구조 1 단어뒤집기 9093]]></title>
            <link>https://velog.io/@dev_dean/%EB%B0%B1%EC%A4%80-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0-9093</link>
            <guid>https://velog.io/@dev_dean/%EB%B0%B1%EC%A4%80-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0-9093</guid>
            <pubDate>Sun, 05 Feb 2023 05:19:29 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/9093">https://www.acmicpc.net/problem/9093</a></p>
<h1 id="문제">문제</h1>
<p>문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.</p>
<p>입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.</p>
<p>출력
각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_dean/post/ea813573-021c-4460-81c9-1ce81baf049c/image.png" alt=""></p>
<h1 id="내제출">내제출</h1>
<pre><code class="language-py">from sys import stdin

n = int(stdin.readline())

for i in range(n):
  flip = stdin.readline().split()
  for word in flip:
    print(word[::-1], end=&#39; &#39;)
  print()
</code></pre>
<h1 id="what-i-learned">What I learned</h1>
<p>이전과 마찬가지로 인풋은 stdin 을 활용하였다
string 데이터를 뒤집을 때 [::-1] 을 활용하면 뒤집혀서 저장되는 것을 알게되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 자료구조 1 스택 10828]]></title>
            <link>https://velog.io/@dev_dean/%EB%B0%B1%EC%A4%80-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EC%8A%A4%ED%83%9D-10828</link>
            <guid>https://velog.io/@dev_dean/%EB%B0%B1%EC%A4%80-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EC%8A%A4%ED%83%9D-10828</guid>
            <pubDate>Sun, 05 Feb 2023 04:59:49 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/10828">https://www.acmicpc.net/problem/10828</a></p>
<h2 id="문제">문제</h2>
<p>정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.</p>
<p>명령은 총 다섯 가지이다.</p>
<p>push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_dean/post/9c5dbcc8-9542-4a87-97f4-076c3e049ceb/image.png" alt=""></p>
<h2 id="내제출">내제출</h2>
<pre><code class="language-python">from sys import stdin

number = int(stdin.readline())
stack = []

for i in range(number):

  func_list = stdin.readline().split()

  if func_list[0] == &#39;push&#39;:
    stack.append(func_list[1])

  elif func_list[0] == &#39;top&#39;:
    if stack:
      print(stack[-1])
    else:
      print(-1)
  elif func_list[0] == &#39;size&#39;:
    print(len(stack))
  elif func_list[0] == &#39;empty&#39;:
    if not stack:
      print(1)
    else:
      print(0)
  elif func_list[0] == &#39;pop&#39;:
    if stack:
      print(stack[-1])
      stack = stack[:-1]
    else:
      print(-1)

</code></pre>
<h1 id="what-i-learned">What I learned</h1>
<pre><code class="language-python">number = int(input())
for i in range(number):
    ...</code></pre>
<p>다음과 같이 했을때 run time error 가 출력되었다.</p>
<p>Input을 이렇게 사용하지 말고 앞으로는</p>
<pre><code class="language-py">from sys import stdin
number = int(stdin.readline())</code></pre>
<p>이렇게 활용하도록 하자</p>
]]></description>
        </item>
    </channel>
</rss>