<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lun_4_light.log</title>
        <link>https://velog.io/</link>
        <description>SMU CS '17</description>
        <lastBuildDate>Wed, 14 Sep 2022 08:00:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. lun_4_light.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lun_4_light" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ORM: 객체와 데이터를 연결하는 다리]]></title>
            <link>https://velog.io/@lun_4_light/ORM-%EA%B0%9D%EC%B2%B4%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94-%EB%8B%A4%EB%A6%AC</link>
            <guid>https://velog.io/@lun_4_light/ORM-%EA%B0%9D%EC%B2%B4%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94-%EB%8B%A4%EB%A6%AC</guid>
            <pubDate>Wed, 14 Sep 2022 08:00:07 GMT</pubDate>
            <description><![CDATA[<h3 id="🚀-개요">🚀 개요</h3>
<p>백엔드 서버를 운용할 때, SQL문을 직접 서버에 전달하여 쿼리를 처리하더라도 당연히 문제는 없다. 쿼리문을 깔끔하게 작성할 수 있다면 오히려 권장되는 사항일지도 모른다.</p>
<p>그렇다면 우리는 왜 ORM을 사용하고 있는 걸까? 그것은 바로 코드에서의 객체와 DB에서의 데이터 사이의 차이를 줄이기 위해서이다.</p>
<hr>
<h3 id="🤔-근데-orm이-뭔가요">🤔 근데 ORM이 뭔가요?</h3>
<p>우선 용어부터 설명하고 넘어가도록 하자. <strong>ORM</strong>이란 무엇일까?
<img src="https://velog.velcdn.com/images/lun_4_light/post/241835a3-b796-4712-b6b3-348b57bd4a3f/image.webp" alt=""></p>
<blockquote>
<p><strong>Object Relational Mapping:  객체의 관계형 맵핑</strong></p>
</blockquote>
<p>즉, 객체와 관계형 DB의 데이터를 자동으로 연결해주는 도우미라는 것이다.</p>
<p>조금 더 자세히 서술하자면, 사용자가 SQL문을 직접 작성하여 실행시키는 대신 객체 사이의 관계를 바탕으로 어떤 작업을 수행할 SQL문을 대신 작성해주는 도구이다.</p>
<p><strong>ORM</strong>을 활용할 경우, 코드에서 활용하던 <code>객체</code>를 통하여 간접적으로 DB의 <code>데이터</code>에 접근할 수 있게 되는 것이다.</p>
<p>그럼 <strong>ORM</strong>에 대한 간단한 설명은 여기까지 하고, 이것이 어떠한 장점과 단점을 가지는지 알아보자.</p>
<hr>
<h3 id="🙆-orm을-사용할-때의-장점">🙆 ORM을 사용할 때의 장점</h3>
<p>ORM을 사용할 때의 장점은 대체로 코드 내의 객체를 통하여 DB에 접근할 수 있다는 점에 기인하게 된다. 이는 아래와 같다.</p>
<ol>
<li><p><strong>직관적인 이해가 가능하다.</strong></p>
<p> 사용자 입장에서 SQL문을 따로 활용할 필요 없이 기존에 사용하던 언어를 통하여 순수 객체지향적인 코드를 작성할 수 있게 되어 통일성과 생산성이 증가한다. 또한, SQL문을 활용하기 위하여 사용하던 다른 부차적인 것들을 줄일 수 있다.</p>
</li>
<li><p><strong>재사용 및 유지보수가 편리하다.</strong></p>
<p> ORM을 통해 작성한 객체를 여러 번 사용할 수 있고, SQL문을 사용할 때보다 뭔가 수정사항이 생겼을 때 따로 고려해야 할 것들이 줄어든다. </p>
</li>
<li><p><strong>DBMS에 대한 종속성이 줄어든다.</strong></p>
<p> 객체간의 관계를 바탕으로 ORM이 대신 SQL문을 생성해주므로, 객체의 자료형 타입과 서버에서 사용하는 언어의 다양한 기능들을 바탕으로 객체를 가공할 수 있다. 또한  DB를 관리할 때 ORM이 DB에 종속적이지 않으므로 DBMS에 대한 종속성이 더더욱 줄어들게 된다.</p>
</li>
</ol>
<h3 id="🙅-orm을-사용할-때의-단점">🙅 ORM을 사용할 때의 단점</h3>
<p>ORM을 사용할 때의 단점은 ORM을 활용하여 모든 것을 만들수는 없다는 점에서 기인한다.</p>
<ol>
<li><p><strong>ORM이 모든 것을 해결해주진 않는다.</strong></p>
<p> 프로젝트가 복잡해질수록 다양한 쿼리를 사용하게 되고, 여러 복잡한 쿼리문들에서 구현 방식에 따라 속도가 저하되는 경우가 있을 수 있다. 이런 경우 쿼리를 튜닝하는 작업이 수반되는데, 이 때 순수 SQL을 사용하는 것이 더 효율적이게 된다.</p>
</li>
</ol>
<hr>
<h3 id="⭐-결론">⭐ 결론</h3>
<p>ORM은 서버단에서 DB에 접근할 때 데이터를 객체로 취급시켜주어 생산성을 늘려주는 좋은 도구이다.</p>
<p>허나 이러한 도구를 그저 사용하는 것에 그치지 않고, 어떠한 상황에서 ORM을 활용하며 어떤 상황에서는 SQL문을 활용하는 것이 더 효율적인지 사용자가 판단할 필요가 있겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BOJ 2565: 전깃줄]]></title>
            <link>https://velog.io/@lun_4_light/BOJ-2565-%EC%A0%84%EA%B9%83%EC%A4%84</link>
            <guid>https://velog.io/@lun_4_light/BOJ-2565-%EC%A0%84%EA%B9%83%EC%A4%84</guid>
            <pubDate>Sun, 06 Dec 2020 18:24:25 GMT</pubDate>
            <description><![CDATA[<h2 id="boj-2565-전깃줄">BOJ 2565: 전깃줄</h2>
<p>두 전봇대에 전깃줄이 와장창 걸려있을 때, 이 전깃줄들이 최대한 겹치지 않도록 전선들을 잘 제거하는 문제이다.</p>
<h4 id="문제-내용-전문"><a href="https://www.acmicpc.net/problem/2565">문제 내용 전문</a></h4>
<h4 id="입력">입력</h4>
<blockquote>
<p>첫째 줄에 전깃줄의 개수 (N)을 입력받고, 그 이후 N개의 줄 동안 전깃줄들이 연결되는 전봇대의 위치의 번호가 주어진다.</p>
</blockquote>
<h4 id="출력">출력</h4>
<blockquote>
<p>모든 전깃줄이 교차하지 않도록 하기 위하여 없애야 하는 전깃줄의 최소 갯수를 출력한다.</p>
</blockquote>
<hr>
<p>N개의 전깃줄을 입력받았다고 생각해보자. 우리는 전선이 합선되지 않도록, 최소한의 전선을 제거하여야 한다.</p>
<p>최소한의 전선을 제거한다는 것은, 최대한 많은 전선들이 서로 겹치지 않고 배치되어 있다는 말과 같다. 그러므로, 우리는 LIS를 이용할 수 있다. 최대한 많은 전선을 겹치지 않게 배치한다는 것은, 전선들의 위치에 대하여 최장 증가 부분수열의 크기를 구한다는 것과 같은 의미이기 때문이다. 전체 전깃줄의 개수에서 LIS의 크기를 빼면, 우리가 원하는 답을 알아낼 수 있다.</p>
<p>기준으로 삼기 위하여 두 전봇대 중 한 전봇대를 기준으로 삼아 정렬한다. 그 후, 다른 전봇대에 대하여 LIS의 크기를 구하면 된다.</p>
<blockquote>
<p>포인트</p>
</blockquote>
<ol>
<li>입력받은 전깃줄의 위치들 ((X,Y) 형태)를 정렬하면, X에 대하여 오름차순으로 정렬된다.</li>
<li>정렬한 것과 다른 좌표 (Y)에 대하여 LIS의 크기를 구한다.</li>
</ol>
<p>작성한 코드는 다음과 같다.</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
#define X first
#define Y second

using namespace std;

vector&lt; pair&lt;int, int&gt; &gt; arr;
int dp[105];
int n;
int m;

int main() {
    cin &gt;&gt; n;
    for (int i = 0; i &lt; n; i++) {
        int x, y;
        cin &gt;&gt; x &gt;&gt; y;
        arr.push_back({ x,y });
    }

    sort(arr.begin(), arr.end());

    for (int i = 0; i &lt; n; i++) {
        dp[i] = 1;
        for (int j = 0; j &lt; i; j++) {
            if (arr[j].Y &lt; arr[i].Y)
                dp[i] = max(dp[i], dp[j] + 1);
        }
        m = max(m, dp[i]);
    }

    cout &lt;&lt; n - m;

    return 0;
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>