<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>vipstar-_-.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 02 Aug 2023 08:26:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>vipstar-_-.log</title>
            <url>https://images.velog.io/images/vipstar-_-/profile/d3ccc1d5-4c06-4cd9-87d0-fdb636126a64/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. vipstar-_-.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/vipstar-_-" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[C#] LINQ Any, All, Exists]]></title>
            <link>https://velog.io/@vipstar-_-/C-LINQ-Any-All-Exists</link>
            <guid>https://velog.io/@vipstar-_-/C-LINQ-Any-All-Exists</guid>
            <pubDate>Wed, 02 Aug 2023 08:26:42 GMT</pubDate>
            <description><![CDATA[<h2 id="any-메서드">Any 메서드</h2>
<ul>
<li>시퀀스에 요소가 하나라도 있는지 또는 특정 조건에 맞는 요소가 있는지 확인한다.
즉, 조건에 해당하는 값이 1개라도 존재한다면 true 이다.</li>
</ul>
<pre><code class="language-csharp">        /// 조건에 해당하는 값이 1개라도 존재한다면 true
        public static void AnyRun()
        {
            var arr1 = new int[] { 1, 2, 3, 4, 5 };
            var arr2 = new int[] { 4, 5, 6, 7, 8};

            bool result1 = arr1.Any(l =&gt; l == 3);
            Console.WriteLine($&quot;단일 값 비교 : {result1}&quot; );

            bool result2 = arr1.Any(l =&gt; arr2.Contains(l));
            Console.WriteLine($&quot;다중 값 비교 : {result1}&quot; );

            // 중복된 값을 찾는방법
            var list = arr2.Where(m =&gt; arr1.Any(a1 =&gt; a1 == m)).ToList();
            Console.WriteLine($&quot;중복 갯수 : { list.Count }&quot;);

            foreach (var i in list)
            {
                Console.Write(i + &quot; &quot;);
            }

            Console.WriteLine(&quot;\n&quot;);
        }</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/48fb5887-0e75-4104-a454-93900318a5e4/image.png" alt=""></p>
<hr>

<h2 id="all-메서드">All 메서드</h2>
<ul>
<li>시퀀스의 모든 요소가 특정 조건에 맞는지 확인한다.
즉, 전체 값이 조건에 전부 해당한다면 true 이다.</li>
</ul>
<pre><code class="language-csharp">   public static void AllRun()
        {
            var arr1 = new List&lt;int&gt; {1, 2, 3, 4, 5};
            var arr2 = new List&lt;int&gt; {4, 5};

            bool result1 = arr1.All(l =&gt; l &gt; 3);
            Console.WriteLine($&quot;모두 3 이상의 숫자인가? : {result1}&quot;);

            bool result2 = arr2.All(l =&gt; arr1.Contains(l));
            Console.WriteLine($&quot;arr2가 arr1의 부분집합인가? : {result2}&quot;);

            Console.WriteLine(&quot;\n&quot;);
        }</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ef65878e-9560-442f-96e2-37ed6da581b9/image.png" alt=""></p>
<hr>

<h2 id="참고">참고</h2>
<ul>
<li><a href="https://learn.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable.all?view=net-7.0">https://learn.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable.all?view=net-7.0</a></li>
<li><a href="https://learn.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable.any?view=net-7.0">https://learn.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable.any?view=net-7.0</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Alogrithm] BOJ1026 보물 C# ]]></title>
            <link>https://velog.io/@vipstar-_-/Alogrithm-BOJ1026-%EB%B3%B4%EB%AC%BC-C</link>
            <guid>https://velog.io/@vipstar-_-/Alogrithm-BOJ1026-%EB%B3%B4%EB%AC%BC-C</guid>
            <pubDate>Tue, 17 Jan 2023 08:30:59 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/dd09d04c-dc20-495f-8391-2d33300422a2/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.</p>
<br>

<p><strong>출력</strong>
첫째 줄에 S의 최솟값을 출력한다.</p>
<br>

<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>5
1 1 1 6 0
2 7 8 3 1</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>18</p>
</blockquote>
<p>*<em>예제 입력 2 *</em></p>
<blockquote>
<p>3
1 1 3
10 30 20</p>
</blockquote>
<p>*<em>예제 출력 2 *</em></p>
<blockquote>
<p>80</p>
</blockquote>
<p>*<em>예제 입력 3 *</em></p>
<blockquote>
<p>9
5 15 100 31 39 0 0 3 26
11 12 13 2 3 4 5 9 1</p>
</blockquote>
<p>*<em>예제 출력 3 *</em></p>
<blockquote>
<p>528</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> public class Boj1026_1
    {
        static void Main(String[] args)
        {
            int n = Convert.ToInt32(Console.ReadLine());

           List&lt;int&gt; list1 = Console.ReadLine().Split().Select(int.Parse).ToList();
           List&lt;int&gt; list2 = Console.ReadLine().Split().Select(int.Parse).ToList();

            list1.Sort();

           int result = 0;

           for (int i = 0; i &lt; n; i++)
           {
               result += list1[i] * list2.Max();
               list2.Remove(list2.Max());
           }

           Console.WriteLine(result);
        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/1026">https://www.acmicpc.net/problem/1026</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Alogrithm] BOJ1541 잃어버린괄호 C# 양식]]></title>
            <link>https://velog.io/@vipstar-_-/Alogrithm-BOJ1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0%EA%B4%84%ED%98%B8-C-%EC%96%91%EC%8B%9D</link>
            <guid>https://velog.io/@vipstar-_-/Alogrithm-BOJ1541-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0%EA%B4%84%ED%98%B8-C-%EC%96%91%EC%8B%9D</guid>
            <pubDate>Tue, 17 Jan 2023 08:25:12 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f00b1f7b-607e-425f-9e6a-b07dde506327/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.</p>
<br>

<p><strong>출력</strong>
첫째 줄에 정답을 출력한다.</p>
<br>

<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>55-50+40</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>-35</p>
</blockquote>
<p>*<em>예제 입력 2 *</em></p>
<blockquote>
<p>10+20+30+40</p>
</blockquote>
<p>*<em>예제 출력 2 *</em></p>
<blockquote>
<p>100</p>
</blockquote>
<p>*<em>예제 입력 3 *</em></p>
<blockquote>
<p>00009-00009</p>
</blockquote>
<p>*<em>예제 출력 3 *</em></p>
<blockquote>
<p>0</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp">  public class Boj1541
    {
        // 최소 값을 얻기 위해서는 +를 먼저하고 -를 해주면 최소값이 된다.
        static void Main(String[] args)
        {
            int result = 0;
            List&lt;String&gt; a = new List&lt;string&gt;();
            String aa = Console.ReadLine();

            // 문자열에 - 가 포함된 경우
            if (aa.Contains(&quot;-&quot;))
            {
                // -를 기준으로 분리하고 List에 넣어준다.
                a = aa.Split(&quot;-&quot;).ToList();


                // 각 요소들에 + 가 있으면 안에있는 수들을 더해준다.
                for (int i = 0; i &lt; a.Count; i++)
                {
                    a[i] = a[i].Split(&quot;+&quot;).Select(int.Parse).Sum().ToString();

                    // 0번 요소를 제외하고 -를 붙여준다.
                    if (i &gt; 0)  a[i] = &quot;-&quot; + a[i];
                }
            }
            // 문자열에 +만 있는 경우
            else
            {
                a = aa.Split(&quot;+&quot;).ToList();
            }

            // 계산된 리스트를 모두 더함
            result = a.Select(int.Parse).Sum();

            Console.WriteLine(result);
        }

    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/1541">https://www.acmicpc.net/problem/1541</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BOJ11047 동전0 C#]]></title>
            <link>https://velog.io/@vipstar-_-/Algorithm-BOJ11047-%EB%8F%99%EC%A0%840-C</link>
            <guid>https://velog.io/@vipstar-_-/Algorithm-BOJ11047-%EB%8F%99%EC%A0%840-C</guid>
            <pubDate>Fri, 13 Jan 2023 07:05:16 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/727d2759-5cd9-4a30-a274-64f81fdcb169/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)</p>
<p>둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)</p>
<br>

<p><strong>출력</strong>
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.</p>
<br>

<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>10 4200
1
5
10
50
100
500
1000
5000
10000
50000</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>6</p>
</blockquote>
<p>*<em>예제 입력 2 *</em></p>
<blockquote>
<p>10 4790
1
5
10
50
100
500
1000
5000
10000
50000</p>
</blockquote>
<p>*<em>예제 출력 2 *</em></p>
<blockquote>
<p>12</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> // 동전 0 
    public class Boj11047
    {
        static void Main(String[] args)
        {
            List&lt;int&gt; intList = new List&lt;int&gt;();
            var nums = Console.ReadLine().Split().Select(int.Parse).ToArray();

            int n = nums[0];
            int k = nums[1];
            int money, result = 0;


            for (int i = 0; i &lt; n; i++)
            {
                intList.Add(Convert.ToInt32(Console.ReadLine())); 
            }

            // 오름차순으로 정렬된 상태로 입력되기 때문에  최소값을 얻기위해 큰 수부터
            // 필터링 해야하므로 뒤집어준다.
            intList.Reverse();

            for (int i = 0; i &lt; n; i++)
            {
                money = k / intList[i];

                if (money &gt; 0)
                {
                    k -= money * intList[i];
                    result += money;
                }
            }

            Console.WriteLine(result);


        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/11047">https://www.acmicpc.net/problem/11047</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BOJ_13904 과제 C#]]></title>
            <link>https://velog.io/@vipstar-_-/Algorithm-BOJ13904-%EA%B3%BC%EC%A0%9C-C</link>
            <guid>https://velog.io/@vipstar-_-/Algorithm-BOJ13904-%EA%B3%BC%EC%A0%9C-C</guid>
            <pubDate>Fri, 13 Jan 2023 05:50:28 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/45d15c8f-95be-4235-9e3e-c9ece4361ec5/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong></p>
<blockquote>
<p>첫 줄에 정수 N (1 ≤ N ≤ 1,000)이 주어진다.
다음 줄부터 N개의 줄에는 각각 두 정수 d (1 ≤ d ≤ 1,000)와 w (1 ≤ w ≤ 100)가 주어진다. d는 과제 마감일까지 남은 일수를 의미하며, w는 과제의 점수를 의미한다.</p>
</blockquote>
<br>

<p><strong>출력</strong></p>
<blockquote>
<p>얻을 수 있는 점수의 최댓값을 출력한다.</p>
</blockquote>
<br>

<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>7
4 60
4 40
1 20
2 50
3 30
4 10
6 5</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>185</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> public class Boj13904
    {
        static void Main(String[] args)
        {

            int n = Convert.ToInt32(Console.ReadLine());

            Homework[] works = new Homework[n];

            for (int i = 0; i &lt; n; i++)
            {
                String[] strArr = Console.ReadLine().Split();
                works[i] = new Homework(Convert.ToInt32(strArr[0]), Convert.ToInt32(strArr[1]));
            }

            works = works.OrderByDescending(i =&gt; i.deadline).ToArray();
            int idx = 0, result = 0;

            // 우선순위 큐 : 큐에서 우선 순위가 가장 낮은 항목이 제거된다.
            PriorityQueue&lt;Homework, int&gt; queue = new PriorityQueue&lt;Homework, int&gt;();

            for (int i = 100; i &gt; 0; i--)
            {
                // 인덱스가 개수 n 을넘어가지 않으면서 데드라인이 i일보다 큰 데드라인만 큐에 넣는다.
                while (idx&lt;n &amp;&amp; works[idx].deadline&gt;=i)
                {
                    // 큐에 집어넣고 배열의 인덱스를 증가시킨다.
                    queue.Enqueue(works[idx], -works[idx++].score); 
                }

                // 우선순위 큐에 담긴 갯수가 1개라도 있으면 결과값에 누적합을 한다.
                if (queue.Count &gt; 0)
                {
                    result += queue.Dequeue().score; // 우선순위가 낮은 항목부터 나옴
                }
            }

            Console.WriteLine(result);

        }
    }

    public class Homework
    {
        public int  deadline { get; set; }
        public int  score { get; set; }

        public Homework()
        {
        }

        public Homework(int deadline, int score)
        {
            this.deadline = deadline;
            this.score = score;
        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/source/52179515">https://www.acmicpc.net/source/52179515</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BOJ2839 설탕배달 C#]]></title>
            <link>https://velog.io/@vipstar-_-/Algorithm-BOJ2839-%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC-C</link>
            <guid>https://velog.io/@vipstar-_-/Algorithm-BOJ2839-%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC-C</guid>
            <pubDate>Thu, 12 Jan 2023 00:53:57 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/6379cf5f-a6bc-4777-848e-790d46632373/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)</p>
<br>

<p><strong>출력</strong>
상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
<br></p>
<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>18</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>4</p>
</blockquote>
<p>*<em>예제 입력 2 *</em></p>
<blockquote>
<p>4</p>
</blockquote>
<p>*<em>예제 출력 2 *</em></p>
<blockquote>
<p>-1</p>
</blockquote>
<p>*<em>예제 입력 3 *</em></p>
<blockquote>
<p>6</p>
</blockquote>
<p>*<em>예제 출력 3 *</em></p>
<blockquote>
<p>2</p>
</blockquote>
<p>*<em>예제 입력 4 *</em></p>
<blockquote>
<p>9</p>
</blockquote>
<p>*<em>예제 출력 4 *</em></p>
<blockquote>
<p>3</p>
</blockquote>
<p>*<em>예제 입력 5 *</em></p>
<blockquote>
<p>11</p>
</blockquote>
<p>*<em>예제 출력 5 *</em></p>
<blockquote>
<p>3</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> internal class Boj2839_2
    {
        static void Main(String[] args)
        {
            int n = Convert.ToInt32(Console.ReadLine());
            int result = 0;

            while (n&gt;=0)
            {
                if (n % 5 == 0)
                {
                    result += n / 5;
                    Console.WriteLine(result);
                    break;
                }

                // 3키로 씩 빼면서 봉지를 1개씩 증가시킨다.
                n -= 3;
                result += 1;

                // 3키로봉지를 빼다보면 n%5 조건문에 걸려서 break 되거나 n=0에 딱 맞아서 반복문이 중지된다.
                // 정확히 무게가 맞지 않으면 n이 -가 되는데 이때 -1을 출력한다.
                if (n &lt; 0)
                {
                    result = -1;
                    Console.WriteLine(result);
                    break;
                }
            }
        }
    }
        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/2839">https://www.acmicpc.net/problem/2839</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BOJ9237 C# 이장님 초대]]></title>
            <link>https://velog.io/@vipstar-_-/Algorithm-BOJ</link>
            <guid>https://velog.io/@vipstar-_-/Algorithm-BOJ</guid>
            <pubDate>Thu, 12 Jan 2023 00:48:17 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/fbedd736-b1f8-4158-a745-49d2222ecf60/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
입력은 두 줄로 이루어져 있다. 첫째 줄에는 묘목의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄에는 각 나무가 다 자라는데 며칠이 걸리는지를 나타낸 ti가 주어진다. (1 ≤ ti ≤ 1,000,000)</p>
<br>

<p><strong>출력</strong>
첫째 줄에 며칠에 이장님을 초대할 수 있는지 출력한다. 답이 여러 가지인 경우에는 가장 작은 값을 출력한다. 묘목을 구입한 날이 1일이다.
<br></p>
<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>4
2 3 4 3</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>7</p>
</blockquote>
<p>*<em>예제 입력 2 *</em></p>
<blockquote>
<p>6
39 38 9 35 39 20</p>
</blockquote>
<p>*<em>예제 출력 2 *</em></p>
<blockquote>
<p>42</p>
</blockquote>
<hr>
<br>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> public class Boj9237
    {
        static void Main(String[] args)
        {
            // 입력받기 
            int n = Convert.ToInt32(Console.ReadLine());
            String[] arr = Console.ReadLine().Split();

            //입력받은 배열 int형 배열로 변환
            int[] intArr = arr.Select(x =&gt; Convert.ToInt32(x)).ToArray();

            // 배열 내림차순으로 정렬
            Array.Sort(intArr);
            Array.Reverse(intArr);

            int result = 0;

            for (int i = 0; i &lt; intArr.Length; i++)
            {
                // 첫째날을 시작으로 i 값과 첫째날 묘목이 자라는 시간을 더한다.
                if (result &lt; (i + 1) + intArr[i]) result = (i + 1) + intArr[i];
            }

            Console.WriteLine(result + 1);
        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/9237">https://www.acmicpc.net/problem/9237</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BOJ_11399 (ATM) C#]]></title>
            <link>https://velog.io/@vipstar-_-/Algirithm-BOJ11399-ATM-C</link>
            <guid>https://velog.io/@vipstar-_-/Algirithm-BOJ11399-ATM-C</guid>
            <pubDate>Wed, 11 Jan 2023 07:35:27 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/3fb2cd2d-6c63-413e-9488-e706b6e9e9fe/image.png" alt=""></p>
<hr>


<h2 id="입력-출력">입력 출력</h2>
<p><strong>입력</strong>
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)</p>
<br>

<p><strong>출력</strong>
첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.
<br></p>
<h3 id="예제">예제</h3>
<hr>



<p>*<em>예제 입력 1 *</em></p>
<blockquote>
<p>5
3 1 4 3 2</p>
</blockquote>
<p>*<em>예제 출력 1 *</em></p>
<blockquote>
<p>32</p>
</blockquote>
<hr>
<br>


<h2 id="설명">설명</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/687bca3e-0ffa-4b18-a224-41a60320b70e/image.png" alt="">
 인출하는 속도가 빠른 사람먼저 앞으로 배치하게되면 시간이 가장 최소로 든다. 그렇기 때문에 정렬을 먼저 한 후
 앞 사람부터 인출하는데 걸리는 시간을 누적하면 된다.
<br></p>
<hr>

<h2 id="풀이-및-코드">풀이 및 코드</h2>
<pre><code class="language-csharp"> public class Boj11399
    {
        static void Main(string[] args)
        {
            // 입력받기
            int n = Convert.ToInt32(Console.ReadLine());
            string[] arr = Console.ReadLine().Split();

            // 입력받은 배열 int형 배열로 변환후 오름차순(Sort의 Default는 오름차순) 정렬한다.
            int[] intArray = arr.Select(int.Parse).ToArray();
            Array.Sort(intArray);

            int sum = 0;

           for(int i=0; i&lt;intArray.Length; i++)
            {
              for(int j=0; j&lt;i+1; j++)    
                {
                    sum += intArray[j];
                }
            }

            Console.WriteLine(sum);


        }
    }
</code></pre>
<br>
<br>
<br>

<hr>

<h2 id="출처">출처</h2>
<p><a href="https://www.acmicpc.net/problem/11399">https://www.acmicpc.net/problem/11399</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C#] SharpPcap 사용해보기]]></title>
            <link>https://velog.io/@vipstar-_-/C-SharpPcap-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@vipstar-_-/C-SharpPcap-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 02 Nov 2022 06:09:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/0ad14a39-a40c-4199-95a2-4a377a1da96f/image.png" alt="">spring으로 된 소스코드를 .net6로 포팅하는중 스프링에서는 jnetpcap 이란걸사용해서
NIC정보를 가져왔다. C#에서는 비슷한 기능을 하는 SharpPcap 이란걸 많이 쓰길래 사용해보았다. 
device 이름, Ip, Description 이 필요해서 누겟에서 설치한 후 사용을 했다. Nuget 검색창에서 
&quot;SharpPcap&quot; 을 검색한 후 설치를 해주자. 사용법은 간단하다.</p>
<hr>

<h2 id="사용">사용</h2>
<pre><code class="language-csharp">
// 디바이스 리스트를 먼저 구해온 후 foreach문을 돌려보면 정보가 주루룩 나오게된다.

var deviceIp = LibPcapLiveDeviceList.Instance; 

            foreach (var dev in deviceIp)
            {
                Console.WriteLine(dev);

            }
</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/df12d1b7-c4b0-421a-ae08-1187fd61cbbc/image.png" alt=""></p>
<pre><code class="language-csharp">             //SharpPcap
            var deviceIp = LibPcapLiveDeviceList.Instance; 

            // 필요한 정보만 빼오기
            foreach (var dev in deviceIp)
            {
                //Console.WriteLine(dev);
                Console.WriteLine(
                $&quot;{dev.Name} 
                /  {dev.Description}  
                /  {(dev.Addresses.Count != 0 ? dev.Addresses[1].Addr:&quot;NULL&quot;)} 
                / {dev.MacAddress}  \n&quot;);
            }</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/eaa34414-0b90-4779-99d6-1057ce5e2217/image.png" alt=""></p>
<p>추가적으로 아래 SharpPcap Github에 가면 더 많은 정보가 있다.</p>
<hr>



<h2 id="참고">참고</h2>
<p><a href="https://github.com/dotpcap/sharppcap">https://github.com/dotpcap/sharppcap</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C#] 전체 메모리 사용량 얻어오기]]></title>
            <link>https://velog.io/@vipstar-_-/C-%EC%A0%84%EC%B2%B4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%9F%89-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@vipstar-_-/C-%EC%A0%84%EC%B2%B4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%9F%89-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Wed, 28 Sep 2022 06:07:33 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-csharp">using System;
using System.Diagnostics;
using System.Threading;
using System.Management;

namespace ConsoleApp1
{

    class Program
    {

        static void Main(string[] args)
        {

            while (true)
            {

             GetTotalUsedMemory();


                int milliseconds = 10000;
                Thread.Sleep(milliseconds);

            }
        }

        public static void GetTotalUsedMemory()
        {
            ManagementClass cls = new ManagementClass(&quot;Win32_OperatingSystem&quot;);
            ManagementObjectCollection instances = cls.GetInstances();

            foreach (ManagementObject info in instances)
            {
                double total_physical_memeory = double.Parse(info[&quot;TotalVisibleMemorySize&quot;].ToString());
                double free_physical_memeory = double.Parse(info[&quot;FreePhysicalMemory&quot;].ToString());
                double remain_physical_memory = total_physical_memeory - free_physical_memeory;
                double remain_physical_memory_MB = (total_physical_memeory - free_physical_memeory)/1024;

                Console.WriteLine(&quot;Memory Information ================================&quot;);

                Console.WriteLine(&quot;Total Physical Memory :{0:#.###} GB&quot;, total_physical_memeory/ (1024 * 1024));
                Console.WriteLine(&quot;Total Physical Memory :{0:#,###} MB&quot;, total_physical_memeory/1024);
                Console.WriteLine(&quot;Total Physical Memory :{0:#,###} KB&quot;, total_physical_memeory);

                Console.WriteLine(&quot;Free Physical Memory :{0:#,###} GB&quot;, free_physical_memeory/(1024 * 1024));
                Console.WriteLine(&quot;Free Physical Memory :{0:#,###} MB&quot;, free_physical_memeory/1024);
                Console.WriteLine(&quot;Free Physical Memory :{0:#,###} KB&quot;, free_physical_memeory);

                Console.WriteLine(&quot;Remain Physical Memory : {0:0.00} GB&quot;, remain_physical_memory / (1024 * 1024));
                Console.WriteLine(&quot;Remain Physical Memory : {0:#,###} MB&quot;, remain_physical_memory / 1024);
                Console.WriteLine(&quot;Remain Physical Memory : {0:#,###} KB&quot;, remain_physical_memory);

                Console.WriteLine(&quot;Memory Usage Percent = {0} %&quot;, 100 *(int) remain_physical_memory / (int)total_physical_memeory);

                Console.WriteLine();
            }

        }


    }

}
</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/9bdbdcb8-31dd-4d58-814e-1d6c2ba8481c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴파일타임, 런타임이란?]]></title>
            <link>https://velog.io/@vipstar-_-/%EC%BB%B4%ED%8C%8C%EC%9D%BC%ED%83%80%EC%9E%84-%EB%9F%B0%ED%83%80%EC%9E%84%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@vipstar-_-/%EC%BB%B4%ED%8C%8C%EC%9D%BC%ED%83%80%EC%9E%84-%EB%9F%B0%ED%83%80%EC%9E%84%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Wed, 24 Aug 2022 01:47:02 GMT</pubDate>
            <description><![CDATA[<h2 id="컴파일타임compile-time">컴파일타임(compile time)</h2>
<blockquote>
<p>C, Java 같은 소스코드가 컴파일러에 의한 컴파일 과정을 통해 기계어로 변환되어 실행가능한 프로그램이 되는 과정 컴파일 타임에 수행되는 동작은 구문분석, 다양한 종류의 의미분석(타입검사 등) 그리고 코드생성이 있다.</p>
</blockquote>
<p><br><br></p>
<h2 id="런타임이란runtime">런타임이란(Runtime)</h2>
<blockquote>
<p>컴파일 과정을 마친 응용 프로그램이 사용자에 의해서 실행되어지는 때를 의미한다. 프로그래밍 언어가 구동되는 환경. 예를들면 JS가 Browser에서 실행 된다면 Browser는 런타임 환경이 된다.</p>
</blockquote>
<p><br><br></p>
<h2 id="런타임에러-컴파일타임에러">런타임에러, 컴파일타임에러</h2>
<h3 id="런타임에서-발생하는-오류들">런타임에서 발생하는 오류들</h3>
<ul>
<li>0 나누기 오류</li>
<li>널 참조 오류</li>
<li>메모리 부족 오류</li>
</ul>
<h3 id="컴파일타임에서-발생하는-오류들">컴파일타임에서 발생하는 오류들</h3>
<ul>
<li>구문 오류(Syntax Error)</li>
<li>타입 참조 오류 (Type Check Error)</li>
</ul>
<p><br><br><hr></p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://wooono.tistory.com/362">런타임이란?</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EB%9F%B0%ED%83%80%EC%9E%84">위키백과 : 런타임</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8C%8C%EC%9D%BC_%ED%83%80%EC%9E%84">컴파일타임</a></li>
<li><a href="https://velog.io/@yejin20/%EB%9F%B0%ED%83%80%EC%9E%84%EA%B3%BC-%EC%BB%B4%ED%8C%8C%EC%9D%BC%ED%83%80%EC%9E%84-%EC%B0%A8%EC%9D%B4%EC%A0%90">런타임과 컴파일타임 차이점</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 직렬화(Serialization) vs 마샬링(Marshalling)]]></title>
            <link>https://velog.io/@vipstar-_-/CS-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-vs-%EB%A7%88%EC%83%AC%EB%A7%81Marshalling</link>
            <guid>https://velog.io/@vipstar-_-/CS-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-vs-%EB%A7%88%EC%83%AC%EB%A7%81Marshalling</guid>
            <pubDate>Wed, 20 Jul 2022 05:46:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f6da1f4e-b4a5-41eb-8491-38af0c49889e/image.png" alt=""></p>
<h1 id="직렬화-와-마샬링">직렬화 와 마샬링</h1>
<h2 id="직렬화serialization">직렬화(Serialization)</h2>
<blockquote>
<p>객체의 필드를 바이너리 형식이나 바이트스트림으로 바꾸는 작업을 말하지만 바이트 스트림이 아니어도 DB, 메모리, 파일 등으로 바꾸는 작업도 포함한다. 반대로 바이트스트림을 원래대로 바꾸는 작업은 역직렬화(Deserialization)이다.</p>
</blockquote>
<h2 id="마샬링marshalling">마샬링(Marshalling)</h2>
<blockquote>
<p>한 객체의 메모리에서 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환하는 과정이다. 
<strong>어떤 언어(C#)로 작성된 프로그램의 출력 매개변수들(Object, Struct, Data 등)을 다른 언어(C++)로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다.</strong> 언마샬링(Unmarshalling)은 이러한 마샬링 개념으로 묶어진 데이터, 즉. 마샬링을 통해 보내진 데이터들을 원래 구조(묶음 풀기)로 복원시키는 것이다.</p>
</blockquote>
<blockquote>
<ul>
<li>C# 에서의 직렬화와 역직렬화가 마샬링 방법중 하나인 것이다.</li>
</ul>
</blockquote>
<ul>
<li>닷넷에서의 마샬링은 값 마샬링(Marshal By Value)와 참조 마샬링(Marshal By Reference)가 있다.</li>
</ul>
<p><br><br><hr></p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://ko.wikipedia.org/wiki/%EB%A7%88%EC%83%AC%EB%A7%81_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)">위키피디아 마샬링</a></li>
<li><a href="https://donghyeon.dev/2020/11/07/%EC%A7%81%EB%A0%AC%ED%99%94%EC%99%80-%EB%A7%88%EC%83%AC%EB%A7%81/">직렬화와 마샬링</a></li>
<li><a href="https://devjaya.tistory.com/1">C# 마샬링( Marshalling ) 그리고 직렬화(Serialization)와 역직렬화(Deserialization)
</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core 2.1] 9-12. Mapping ~ _Layout 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-9-12.-Mapping-Layout-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-9-12.-Mapping-Layout-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 13 Jul 2022 01:29:07 GMT</pubDate>
            <description><![CDATA[<h1 id="개발환경">개발환경</h1>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<br>

<h1 id="db와-model-class-mappingdataannotation-ef-fluent-api">DB와 Model Class Mapping(DataAnnotation, EF Fluent API)</h1>
<blockquote>
<p>DB -&gt; s_users
App -&gt; Users</p>
</blockquote>
<p>개발자가 사용하는 규칙이 있고 
DBA가 사용하는 규칙과 습관 있기때문에 매핑을 해줘야한다.</p>
<h2 id="ef">EF</h2>
<h3 id="1-annotation-mapping">1. Annotation mapping</h3>
<p>[XXXXX]
class</p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/0051c786-d64a-4325-98d0-98df1ef8f488/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/4254571e-fc4f-4756-ad45-1d305639e75e/image.png" alt=""></p>
<p><br><br></p>
<h3 id="2-dbcontext---onmodelcreating---fluent-api">2. DbContext -&gt; OnModelCreating() -&gt; Fluent-API</h3>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/cec8b518-b167-4a78-8abe-20c4b6186a8b/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>이런 식으로 출력해 주면 DBA는 DBA 나름대로 네이밍 전략을 사용할 수 있고
개발자도 개발자 나름대로 네이밍 전략을 사용할 수 있다.
MS에서는 Fluent-API를 권장 하지만 개발 토끼는 개인적으로 직관적인 Annotation을 사용하는 걸 추천</p>
<p><br><br><hr></p>
<h1 id="controller에서-view로-데이터-전달하기">Controller에서 View로 데이터 전달하기</h1>
<h2 id="viewbag---dynamic-typelist-user-숫자-truefalse-문자열">ViewBag -&gt; dynamic type(List, User, 숫자, true/false, 문자열)</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/2d7adfc0-6cba-4182-ac79-0bfdd7ec511f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/e0824aea-c3a3-4bfd-b684-219ceac6cd1b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/289b552c-f81b-470b-add9-2d93c08ebb14/image.png" alt=""></p>
<blockquote>
<ul>
<li>약한 형식의 데이터</li>
</ul>
</blockquote>
<ul>
<li>Controller에 정의가 되지 않아도 View에 표시가 될 경우 오류가 발생하지 않는다.</li>
<li>실수를 할 여지가 많다 InteliSense  작동안함, 간단하고 빠르게 개발할때 사용한다. </li>
<li>값이 가변형이기 때문에 처음에 값을 대입 한 이후로 형 변환 할 필요가 없다.</li>
</ul>
<p><br><br></p>
<h2 id="viewdata">ViewData[&quot;&quot;]</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/7048b7c8-e741-4ea4-ab66-e1a65227c433/image.png" alt=""></p>
<blockquote>
<ul>
<li>약한 형식의 데이터</li>
</ul>
</blockquote>
<ul>
<li>Dictionary&lt;string, object&gt; 타입으로 키값 접근 할 수 있다.</li>
<li>ViewBag보다 성능상 우위에 있다.</li>
<li>값이 오브젝트이기 때문에 형변환 처리를 해주어야 한다.</li>
</ul>
<p><br><br></p>
<h2 id="viewmodel">ViewModel</h2>
<blockquote>
<ul>
<li>강력한 형식의 데이터</li>
</ul>
</blockquote>
<ul>
<li>인텔리 센스 작동</li>
</ul>
<pre><code class="language-csharp">// Controller
var vm = new UserViewModel
            {
                UserName = &quot;홍길순&quot;,
                UserAge = 100
            };

            return View(vm); // 뷰에 모델을 담아준다.</code></pre>
<pre><code class="language-cshtml">&lt;!-- Index.cshtml--&gt;

@model UserViewModel

&lt;h1&gt;@Model.UserAge&lt;/h1&gt;</code></pre>
<p><br><br><hr></p>
<h1 id="razor-template-기능-알아보기razor-syntax">Razor Template 기능 알아보기(Razor Syntax)</h1>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/75cd6b79-fbb0-418d-a139-af2a29f7090f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/9e8f6c6b-34fd-4bab-b39c-5f65ae7408d5/image.png" alt=""></p>
<blockquote>
<p>Razor 페이지 주석처리는 렌더링시 표시되지 않지만 
html 주석처리는 개발자도구에서 표시가 된다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/fe319706-7cb0-416c-a489-f11a2805206c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/5a50b454-237a-43f7-87e8-c3b9c78754ec/image.png" alt=""></p>
<blockquote>
<p>이외에도 for, foreach, if, switch, function, try~catch 등을 구현 할 수 있다.</p>
</blockquote>
<p><br><br><hr></p>
<h1 id="layout-사용하기-_layoutcshtml">Layout 사용하기 (_Layout.cshtml)</h1>
<blockquote>
<p>공통적인 부위를 따로 관리하지 않게 제공하는 Layout이 있다.
신속성과 유지보수성이 좋아지고 복잡성이 낮아진다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ca470573-0048-48b5-9ff0-6c333afbcfec/image.png" alt=""></p>
<blockquote>
<p>CDN으로 사용 하는데 CDN사용시 CDN서버가 죽으면 내 UI도 표시가 되지 않는다.
테스트를 통과시에는 CDN으로 사용하고 하나라도 검증되지 않으면 그 아래경로의 파일로 실행된다.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/b5aafeb7-8641-4a9a-be54-84eb4bd8d4b8/image.png" alt=""></p>
<blockquote>
<p>특정 뷰만 레이아웃을 적용하고 싶지않으면 null을 하면된다.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f05e07a4-6af4-4f28-9129-5a7f243a4bf1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/78647b9e-0204-42cd-a2e9-773cba1be5f1/image.png" alt=""></p>
<p><br><br><hr></p>
<h1 id="참고">참고</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=mcgPyc6lT68&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=10">[ASP.NET Core 2.1] 9. DB와 Model Class Mapping(DataAnnotation, EF Fluent API)</a></li>
<li><a href="https://www.youtube.com/watch?v=mcgPyc6lT68&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=10">[ASP.NET Core 2.1] 10. Controller에서 View로 데이터 전달하기</a></li>
<li><a href="https://www.youtube.com/watch?v=Qiz7Jai-YQE&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=11">[ASP.NET Core 2.1] 11. Razor Template 기능 알아보기(Razor Syntax)</a></li>
<li><a href="https://www.youtube.com/watch?v=WmByAs7rFfQ&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=12">[ASP.NET Core 2.1] 12. Layout 사용하기(_Layout.cshtml)</a></li>
<li><a href="https://nameybs.tistory.com/32">[ASP.NET CORE/MVC] #6 VIEW로 데이터 가져오기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core 2.1] 5-8. Linq 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-5</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-5</guid>
            <pubDate>Tue, 12 Jul 2022 07:07:18 GMT</pubDate>
            <description><![CDATA[<h1 id="개발환경">개발환경</h1>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<br>

<blockquote>
<p>*<em>Linq를 사용하면 sql 쿼리를 몰라도 EF에 대한 이해도가 있다면<br>쉽고 빠르게 작성 할 수 있다.
*</em></p>
</blockquote>
<h1 id="linq로-select-insert-update-delete-사용하기">Linq로 Select, Insert, Update, Delete 사용하기</h1>
<h2 id="1-select-쿼리">1. Select 쿼리</h2>
<blockquote>
<ul>
<li><strong>SELECT * FROM User
1개, 리스트</strong></li>
</ul>
</blockquote>
<pre><code class="language-csharp">var selectList = db.Users;
1. DbSet&lt;User&gt; selectList = db.Users; 
2. List&lt;User&gt; selectList = db.Users.ToList().Where().OrderBy();
3. IEnumerable&lt;User&gt; selectList = db.Users.AsEnumerable();
4. IQueryable&lt;User&gt; selectList = from user in db.Users select user; // Linq to Sql -&gt; Stackoverflow에서 사용한다.</code></pre>
<h3 id="ienumerable-vs-iqueryable">IEnumerable vs IQueryable</h3>
<blockquote>
<p>** Extension Query =&gt; 작성이 가능</p>
</blockquote>
<ol>
<li>IEnumerable =&gt; 쿼리 =&gt; 데이터(10명) =&gt; Client =&gt; 느리다.</li>
<li>IQueryable =&gt; 쿼리 =&gt;데이터(10명) =&gt; Server =&gt; 빠르다.
동작 방식이 달라서 때에 따라서 잘 쓰면 성능향상에 도움이 된다.**</li>
</ol>
<h4 id="ienumerable">IEnumerable</h4>
<blockquote>
<p> IEnumerable 시퀀스로 변경하기 때문에 데이터베이스가 아니라 로컬 컴퓨터에서 더 많은 작업을 수행하고 LINQ to Objects 구현체와 델리게이트를 이용해서 수행된다.</p>
</blockquote>
<h4 id="iqueryable">IQueryable</h4>
<blockquote>
<p>IQueryable&amp;ltT&amp;gt는 LINQ-to-SQL이 작동 할 수 있도록 하는 인터페이스
 LINQ to SQL 라이브러리가 모든 쿼리문을 결합하여 단번에 SQL 결과를 생성한다.</p>
</blockquote>
<p><br><br><br></p>
<h2 id="2-insert-쿼리">2. Insert 쿼리</h2>
<blockquote>
<ul>
<li>INSERT INTO User(UserId, UserName) Values(1, “홍길동”)</li>
</ul>
</blockquote>
<blockquote>
<p>db.Users.Add(User);
db.SaveChanges(); </p>
</blockquote>
<pre><code class="language-csharp">db.Users.Add(new User
{
    UserId =3,
    UserName = &quot;홍길동&quot;,
       Birth = &quot;801010&quot;
});

db.SaveChanges(); // commit(이 부분을 실행해야 DB에 반영이된다.)</code></pre>
<p><br><br><br></p>
<h2 id="3-update-쿼리">3. Update 쿼리</h2>
<blockquote>
<ul>
<li>기존 정보를 수정</li>
</ul>
</blockquote>
<ul>
<li>UPDATE User SET UserName=’홍길동’ WHERE UserId = 1</li>
</ul>
<pre><code class="language-csharp">// 되도록 분리 합치면 코드가 너무 길어진다.
&gt;ar user = new User { UserId = 1, UserName = &quot;장길동&quot; }; 

db.Entry(user).State = EntityState.Modified;
db.SaveChanges();*/</code></pre>
<p><br><br><br></p>
<h2 id="4-delete-쿼리">4. DELETE 쿼리</h2>
<blockquote>
<ul>
<li>DELETE FROM User WHERE UserId =1</li>
</ul>
</blockquote>
<pre><code class="language-csharp">var user = new User{UserId = 2};
db.Users.Remove(user);
db.SaveChanges();</code></pre>
<h2 id="var">var</h2>
<blockquote>
<ul>
<li>변수의 자료형을 자동으로 저장하는 것</li>
</ul>
</blockquote>
<ul>
<li>var &quot;변수명&quot; = &quot;초기화 해줄 값&quot;</li>
<li><strong>지역 변수로  선언</strong>하지 않으면 &quot;형식 또는 네임스페이스 이름을 찾을 수 없다고&quot; 오류가 뜸</li>
<li><strong>선언과 동시에 초기화</strong> 해야함</li>
</ul>
<p><br><br><hr></p>
<h1 id="linq로-where와-orderby-사용하기">Linq로 Where와 OrderBy 사용하기</h1>
<h2 id="where---조건절---리스트가-가능">Where -&gt; 조건절 -&gt; 리스트가 가능</h2>
<blockquote>
<p>var list = db.Users.ToList(); // 전체출력
var list = db.Users.Where(u =&gt; u.UserName == &quot;뚱이&quot;); // 특정 값</p>
</blockquote>
<p><br><br></p>
<h2 id="게시물-1개-수정---데이터-가져옴-특정-데이터-1개-가져오기">게시물 1개 수정 -&gt; 데이터 가져옴 특정 데이터 1개 가져오기</h2>
<blockquote>
<p><strong>.First(), .FirstOrdDefault(), SIngle(), .SIngleOrDefault() 등 이 있다.</strong></p>
</blockquote>
<pre><code class="language-csharp">var user = db.Users.First(); // SELECT TOP 1 * FROM  Users

// ()안에 람다식을 넣어서 딱 1개를 조회 할 수 있다.
var user = db.Users.First(u =&gt; u.UserId == 1); // SELECT TOP 1 * FROM Users WHERE UserNAme = &quot;임길동&quot;</code></pre>
<p><br><br></p>
<h3 id="singleordefulat-vs-firstordefault">SingleOrDefulat() vs FirstOrDefault()</h3>
<blockquote>
<ul>
<li><strong>Single() : 데이터가 0이거나 1개 초과 면 오류가 발생한다. ( 1만 가능)</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>SingleOrDefault() : 1개 초과 이면 오류가 발생한다. (0 또는 1)</strong></li>
<li>*<em>First() : 결과값이 안나오면 오류가 뜬다. *</em></li>
<li><strong>FirstOrDefault() : 결과값이 null 일때만 오류가 발생한다.</strong></li>
</ul>
<blockquote>
<p>실무에서는  SingleOrDefulat()를 사용하면 Exception 발생할 가능성이 있기 때문에 FirstOrDefault를 많이 쓴다. FD는 두개 이상이어도 하나만 가져오기 때문에 더 사용한다. 물론 여러 결과가 나올 때 나는 두번째 결과 값을 원하는데 첫번째 결과값을 반환 해줄 수 있다. 그 값이 내가 원하는 값이 맞나에 대한 문제점이 있긴하다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/942a8369-4ba7-4151-b419-9b3e29c15bf2/image.png" alt=""></p>
<p><br><br></p>
<h2 id="orderby-decendingby">OrderBy(), DecendingBy()</h2>
<blockquote>
<p>OrderBy() :  1, 2, 3, 4, 5 오름차순
DecendingBy() : 5, 4, 3, 2, 1 내림차순</p>
</blockquote>
<pre><code class="language-csharp">// 이름을 기준으로 오름차순
var list = db.Users.OrderBy(u=&gt; u.UserName).ToList();</code></pre>
<p><br><br><hr></p>
<h1 id="linq로-테이블-join하기">Linq로 테이블 JOIN하기</h1>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/0e9b809f-eb68-4a8e-bb28-af233e351cba/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/4d2ccd46-7222-45c7-bdfb-1bf675c9d5b1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/c9df26ef-3d52-4162-a3f4-2fcdbf78599a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/2bcbfb32-286d-4300-8c96-6700e3d772c7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/d7a51a23-585e-443d-83f9-d77f2ddf1372/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/991b6cf0-1214-4072-81c1-f4d821781074/image.png" alt=""></p>
<blockquote>
<p>특정 테이블 특정 칼럼 데이터만 필요로 하는데 Include()를 사용하면 <strong>데이터를 전부 불러오기 때문에</strong> 대용량 데이터일 경우는 성능상 문제점이 있다 그래서 <strong>성능 향상을 위해 Linq에서 쿼리 구문을 권장</strong>한다. 간단하게 할 때는 Include로 사용해도 큰 부담 없이 무방하다~</p>
</blockquote>
<p><br><br><hr></p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=U4ECPwltzvk&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=5">[ASP.NET Core 2.1] 5. EntityFramework 2.1 기본 설정하기</a></li>
<li><a href="https://www.youtube.com/watch?v=--Qk7rxI4A0&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=6">[ASP.NET Core 2.1] 6. Linq로 Select, Insert, Update, Delete 사용하기</a></li>
<li><a href="https://www.youtube.com/watch?v=YtfolIybA14&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=7">[ASP.NET Core 2.1] 7. Linq로 Where와 OrderBy 사용하기</a></li>
<li><a href="https://www.youtube.com/watch?v=t0iSoYb-sIE&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=8">[ASP.NET Core 2.1] 8. Linq로 테이블 JOIN하기(Feat. Include)</a></li>
<li><a href="https://just-my-blog.tistory.com/80">IEnumerable<T> 데이터 소스와 IQueryable<T> 데이터 소스를 구분하라</a></li>
<li><a href="https://whyprogrammer.tistory.com/241">C# - var 키워드는 무엇인가 (초기화, 사용법)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core 2.1] 1-4. 소개~데이터 타입과 컬렉션  정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-1-2-.net-core-SDK-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%91%98%EB%9F%AC%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-2.1-1-2-.net-core-SDK-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%91%98%EB%9F%AC%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 11 Jul 2022 05:08:19 GMT</pubDate>
            <description><![CDATA[<h2 id="개발환경">개발환경</h2>
<ul>
<li><strong>Visual Studio Community 2017</strong></li>
<li><strong>ASP.NET Core 2.2</strong></li>
</ul>
<p><br><br></p>
<h2 id="net-core-aspnet-core">.net core ASP.NET Core</h2>
<blockquote>
<p><strong>1) MVC
2) Web API
3) vNext -&gt; Razor Pages cshtml 안에 cs파일 이 있음</strong></p>
</blockquote>
<p><br><br></p>
<p><strong>BLOG ASP.NET</strong></p>
<blockquote>
<p>소 잡는 칼로 닭을 잡는 격이다. Blog같은 단순 웹 사이트는 MVC로 만들기에는 너무 과하다.</p>
</blockquote>
<p><br><br></p>
<h2 id="linux-웹-서버">Linux 웹 서버</h2>
<blockquote>
<p><strong>1) apache + tomcat + spring mvc
2) nginx + kestrel + asp.net core</strong></p>
</blockquote>
<p><br><br></p>
<h2 id="aspnet-core-21-spa-templates">ASP.NET Core 2.1 SPA Templates</h2>
<blockquote>
<p>*<em>1. Angulars.js
2. React.js
3. React.js + redux
4. Vue
5. aurelia
*</em></p>
</blockquote>
<p><br><br><hr></p>
<h2 id="localdb-소개">LocalDB 소개</h2>
<h3 id="로컬-db사용-이유">로컬 DB사용 이유</h3>
<blockquote>
<p><strong>간단한 개발하는데 필요한 중요한 기능들이 들어있음.
개발 편의성, ASP.NET Core설치시 자동으로 설치</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ad93364c-4e0c-4d88-8440-6f0997009937/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/7474ac3d-f183-407c-992d-1a5facdecd2e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/389d8e1a-9f55-4501-acec-1e53d90d9072/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/1292da58-0d06-45e8-8ef2-379c0fdca725/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/d7dd5ad5-a7db-4900-8dfc-dd2fd6cb2270/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/1e432e9e-46b7-47ac-8968-5d881739a988/image.png" alt=""></p>
<p><br><br><hr></p>
<h2 id="c-데이터-타입과-컬랙션">C# 데이터 타입과 컬랙션</h2>
<h3 id="기본-자료형">기본 자료형</h3>
<blockquote>
<p><strong><em>byte, int, string, double, long, float</em></strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ceccd347-a5b8-4ecc-a78e-32cb5fc12e10/image.png" alt=""><a href="https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/built-in-types">그림참조</a></p>
<h3 id="리스트">리스트</h3>
<blockquote>
<p><strong><em>var list = List<T>(); 
  list.Add(new User{Name=&quot;&quot;, Birth=930706}</em></strong></p>
</blockquote>
<h4 id="1-non-generic-collection">1. Non-generic-Collection</h4>
<blockquote>
<p>C#에서 지원하는 자료구조 클래스</p>
</blockquote>
<ul>
<li>ArrayList</li>
<li>SortedList</li>
<li>HashTable</li>
<li>BitArray</li>
<li>Queue</li>
<li>Stack<ul>
<li>Object 형식을 사용해서 데이터를 관리 </li>
<li>박싱(Boxing), 언박싱(Unboxing)이 발생 컬렉션을 많이 사용하면 성능 저하가 온다. </li>
</ul>
</li>
<li>현재는 성능상의 이유로 컬렉션을 잘 사용 X </li>
</ul>
<h4 id="2generic-collection">2.Generic Collection</h4>
<blockquote>
<p>*<em>제네릭으로 만들어진 컬랙션 *</em></p>
</blockquote>
<ul>
<li><p><strong>using System.Collections.Generic을 포함해야 한다.</strong></p>
</li>
<li><p><strong>데이터 형식을 일반화 하여 컬렉션에 비해 성능문제 적음.</strong></p>
</li>
<li></li>
<li><p><em>List&amp;ltT&amp;gt, Dictionary&amp;ltT&amp;gt, Stack&amp;ltT&amp;gt 등의 클래스가 있다.*</em></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/c54e9ea3-4c73-4a71-b0ac-15b5335564b7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/00ff7ebe-7bf7-4c13-8309-c7e4d31ee753/image.png" alt=""></p>
</li>
</ul>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/42e5110b-1bd1-40c6-b86b-ce5a1a0c98c5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/a6f165f7-a937-4282-bc3b-9b35cfd38b92/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/33b30e20-6ca2-4e45-8b32-0dee9db99dce/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/9eef48de-c15e-41ac-a077-a5f2a9397760/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/336014f3-e4f3-49ba-ad65-a7df175e6d31/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/18389477-2e65-4256-bc82-b9d8f5c7af0c/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/76cf95a0-f539-4673-afb6-75fd3c6ca7d0/image.png" alt=""></p>
<p>  IEnumerable 에서는 카운트, 삭제, 추가 등을 할 수없고 ICollection으로 넘어와야 할 수 있다.</p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/86166bf9-d5f4-4f40-8ef5-13ce338676bb/image.png" alt="">list는 list에 정의된 Count를 사용하지만 enumerableList는 .Count를 지원하지않고 굳이 사용하고 싶으면 Linq의 Count() 메서드를 사용해야 한다.</p>
<p>  <img src="https://velog.velcdn.com/images/vipstar-_-/post/78b28770-e713-4698-9eb5-14961fa69552/image.png" alt="">ICollection으로 사용하면 .Count를 사용할 수있다.</p>
<h3 id="이걸-왜-사용하는가">이걸 왜 사용하는가?</h3>
<blockquote>
<ul>
<li>*<em>큰 범주를 사용할 수록 기능이 많지만 성능상 제약을 많이받음 *</em></li>
</ul>
</blockquote>
<ul>
<li><p>*<em>서버에서 많은 메모리를 차지하는 것도 비용이기때문에 아끼기위해 적절하게 사용한다. *</em></p>
<p><br><br><hr></p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=aO6zRXo48Oc&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=1">[ASP.NET Core 2.1] 소개</a></li>
<li><a href="https://www.youtube.com/watch?v=SxHKyzPBZKE&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=2">[ASP.NET Core 2.1] 2. .net core SDK 설치 및 프로젝트 둘러보기</a></li>
<li><a href="https://www.youtube.com/watch?v=6_qwalmWg-I&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=3">[ASP.NET Core 2.1] 3. LocalDB 소개</a></li>
<li><a href="https://www.youtube.com/watch?v=cdI9ArwNd9A&amp;list=PLbPz1r_wDPhHfd9TFy89ulvwI_MLEZJ8C&amp;index=4">[ASP.NET Core 2.1] 4. C# 데이터 타입과 컬렉션</a></li>
<li><a href="https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B0%95%EC%A2%8C-21-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%BB%AC%EB%A0%89%EC%85%98General-Collection">제네릭컬랙션</a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core MVC] 22-25. ASP.NET Core Identity 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-22-25.-ASP.NET-Core-Identity-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-22-25.-ASP.NET-Core-Identity-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 06 Jul 2022 08:56:42 GMT</pubDate>
            <description><![CDATA[<h1 id="개발환경">개발환경</h1>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<h1 id="aspnet-core-identity">ASP.NET Core Identity</h1>
<blockquote>
<ul>
<li><strong>쿠키기반인증</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>로그인, 로그아웃, 개별인증(관리자, 일반 사용자)</strong></li>
<li><strong>일반 사용자(나이가 19세 이상)</strong></li>
</ul>
<h2 id="identity-테이블-구조">IDentity 테이블 구조</h2>
<blockquote>
<p><strong>1. dbo.AspNetUsers =&gt; ApplicationUser(유저클래스)</strong>
 <strong>ID, PW, 사용자 이름</strong></p>
<p><strong>2. dbo.AspNetRoles =&gt; ApplicationRole(역할 클래스)</strong>
 <strong>회원 분류 - 슈퍼관리자, 관리자, 특별 사용자, 일반사용자</strong></p>
<p><strong>3. dbo.AspNetUserRoles</strong>
 <strong>1번 사용자(pk1) -&gt; 관리자(1)</strong>
 <strong>2번 사용자(pk2) -&gt; 일반 사용자(4)</strong></p>
<p><strong>4. dbo.AspNetClaims =&gt; 5명의 사용자 -&gt; 일반 사용자(Role)</strong>
<strong>2명이 나이 20세 미만 -&gt; 20세 미만은 특정 게시판 진입금지
 Age, 20 [HttpGet, Authorize(Claims… Age&gt;20)]</strong></p>
<p>*<em>5. dbo.AspNetRoleClaims
관리자 -1등, 2등, 3등 
*</em></p>
<p>** 6. dbo.AspNetUserLogins =&gt; 외부 로그인 Oauth 1.0/2.0**</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/e305b7bd-6b14-49cd-a55a-9407da7e12c9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/5a1dfe00-a42c-48a4-9d2e-3e66760522bc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/347f8cef-bc4d-4d9f-a459-2aaed33469e0/image.png" alt="">구현이 다 되어있는상태이다.</p>
<p><br><br><hr></p>
<h1 id="identity-생성-테이블-pk-타입-변경하기">Identity 생성 테이블 PK 타입 변경하기</h1>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/4a5371c9-6bc8-4549-9780-cde585be83c4/image.png" alt=""></p>
<blockquote>
<p>왼쪽은 강의 화면이고 오른쪽은 나의 프로젝트인데 버전이 다르다 보니 초기 생성되는 파일이 다르다.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f446e70d-5f04-4e38-b226-d9a87bbafa0c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/3f113c67-8593-4f99-95b9-663b9088104e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/fec4574e-be49-4c13-be60-6d35dc143e78/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/21ffb94c-0ca2-47cd-b3c2-a6e97ef930e1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f971f2ee-0e88-4c53-9d8c-0374ef7d9745/image.png" alt=""></p>
<p><a href="https://stackoverflow.com/questions/53749631/change-id-type-of-asp-net-core-2-2-identityuser">https://stackoverflow.com/questions/53749631/change-id-type-of-asp-net-core-2-2-identityuser</a></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/2d368a05-4c54-4f1e-8501-0b3b6c22930b/image.png" alt=""></p>
<blockquote>
<p><strong>User기본키와 Role기본키를 int형으로 바꾸기 위해 IdentityUser&lt;int&amp;gt, IdentityRole&amp;ltint&amp;gt, int 를 작성해준다.</strong></p>
</blockquote>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/e5624fb8-7fdd-420f-a512-5841be0db1a1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/2f040b11-52c8-4829-b279-1850aba7ea23/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/a9f6fc06-28c3-43da-a2ef-625acb7a34f0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ded64ae5-f148-42d7-bd85-3c828c1f283f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/b2287216-03f3-4d62-922d-58783417a157/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/00a22bbb-2ed6-46b8-9ca1-e3d4158f25f2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/d2de06ce-95d6-479d-b89f-0ab60ac0bb89/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/6e628447-5872-4867-b66b-ae1ed542da18/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/9e9acc13-1f84-47e6-b870-924abed3c133/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/9bd676e2-31ed-4b16-95d4-b6b2a6beca61/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/05fbb6ec-05ca-4925-8831-7662f08626ab/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/c50b8835-8009-43d5-a4ca-101a2a99306c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core MVC] 21. async, await 비동기 처리 프로그래밍 구현하기]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-21.-async-await-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-21.-async-await-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 06 Jul 2022 02:50:49 GMT</pubDate>
            <description><![CDATA[<h2 id="개발환경">개발환경</h2>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<p><br><br></p>
<h2 id="쓰레드thread란">쓰레드(thread)란?</h2>
<blockquote>
<p>*<em>쓰레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 하나의 프로세스는 여러개의 쓰레드로 구성이 가능하다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다
*</em></p>
</blockquote>
<blockquote>
<ul>
<li>하나의 프로세스를 구성하는 쓰레드들은 프로세스에 할당된 <strong>메모리, 자원 등을 공유</strong>한다.</li>
</ul>
</blockquote>
<ul>
<li>프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 가지며
실행 <strong>상태가 변할때마다 쓰레드 문맥교환(context switching)</strong>을 수행한다.</li>
<li>각 쓰레드별로 <strong>자신만의 스택과 레지스터</strong>를 가진다.</li>
</ul>
<p><br><br></p>
<h3 id="장점">장점</h3>
<blockquote>
<ul>
<li>프로세스보다 생성 및 종료시간, 전환시간이 짧음</li>
</ul>
</blockquote>
<ul>
<li>프로세스의 메모리, 자원등을 공유하므로 커널의 도움없이 상호간에 통신이 가능</li>
</ul>
<p><br><br></p>
<h3 id="쓰레드와-프로세스-차이">쓰레드와 프로세스 차이</h3>
<blockquote>
<p>프로세스는 운영체제로부터 자원을 할당받는 작업 단위이고
쓰레드는 프로세스가 할당받은 자원을 이용하는 실행 단위이다.</p>
</blockquote>
<p><br><br></p>
<h2 id="멀티-스레드-멀티프로세싱">멀티 스레드? 멀티프로세싱?</h2>
<h3 id="멀티-쓰레드">멀티 쓰레드</h3>
<ul>
<li>하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/8f5f022d-7341-476c-901c-62b72c2f41b7/image.png" alt=""><a href="https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/">그림참조</a></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/63c97271-c8e3-4fc9-a7a2-a4ad77c4bf24/image.png" alt=""><a href="https://velog.io/@hoo00nn/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C">그림참조</a></p>
<p><br><br></p>
<h3 id="멀티-프로세스">멀티 프로세스</h3>
<ul>
<li>두개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것이다. (병렬처리)
<img src="https://velog.velcdn.com/images/vipstar-_-/post/b959a13f-271b-45e8-b492-02d3c2a14a40/image.png" alt=""></li>
</ul>
<p><br><br><br><hr></p>
<h2 id="동기적-프로그래밍">동기적 프로그래밍</h2>
<blockquote>
<p>*<em>Method1() : 3초
Method2() : 3초
Method3() : 4초 *</em></p>
<p><strong>3→3→4 = 총 10초 소요</strong></p>
</blockquote>
<p><br><br></p>
<h2 id="비동기적-프로그래밍">비동기적 프로그래밍</h2>
<blockquote>
<p><strong>Method1() : 3초
Method2() : 3초
Method3() : 4초</strong></p>
<p><strong>→3
→3
→4
총 4초 소요
메서드가 각각 독립적으로 동작 해야한다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/320e88e0-521b-46cf-aee0-883384a18ba9/image.png" alt=""><a href="https://velog.io/@jminkyoung/TIL-15-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%9E%80-Feat.-async-await">그림참조</a></p>
<p><br><br></p>
<h2 id="c-비동기적-프로그래밍을-위한-키워드">C# 비동기적 프로그래밍을 위한 키워드</h2>
<blockquote>
<p><strong>async, await, Task, Task &lt; T&gt;</strong>
Task : 쓰레드 안에서 과업의 단위
async 와 await는 쌍으로 적어줘야 한다.</p>
</blockquote>
<p><br><br></p>
<h2 id="homecontrollercs">HomeController.cs</h2>
<pre><code class="language-csharp">
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using Microsoft.AspNetCore.Mvc;
using AsyncAwaitTest.Models;
using System.Threading.Tasks;

namespace AsyncAwaitTest.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {

        // # 테스트 방법  - 전통적인 방식
        Stopwatch watch = new Stopwatch();
            watch.Start();

        // # 새로운 테스트 방식? - &gt; VS Diagonostics Tools
            Test1();
            Test2();
            Test3();
            //watch.Stop();
            //var result = watch.ElapsedMilliseconds;
            return View();
        }

        public async Task&lt;IActionResult&gt; Contact()
        {
            /* await Test1Async();
               await Test2Async();
               await Test3Async(); 
               await 키워드를 만나면 여기서 걸리게 되기 때문에 아래처럼 선언해야한다.*/

            Stopwatch watch = new Stopwatch();
            watch.Start();
            var test1 =  Test1Async();
            var test2 = Test2Async();
            var test3 = Test3Async(); 

            var result1 = await test1; // var result1 = await Test1Async() 처럼 적으면 여기서 걸려버림
            var result2 = await test2;
            var result3 = await test3;
            //var result = watch.ElapsedMilliseconds;
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }

        public int Test1()
        {
            Thread.Sleep(3000);
            return 0;
        }

        public int Test2()
        {
            Thread.Sleep(3000);
            return 0;
        }

        public int Test3()
        {
            Thread.Sleep(4000);
            return 0;
        }

        public async Task&lt;int&gt;  Test1Async()
        {
            await Task.Delay(3000);
            return 0;
        }

        public async Task&lt;int&gt; Test2Async()
        {
            await Task.Delay(3000);
            return 0;

        }

        public async Task&lt;int&gt; Test3Async()
        {
            await Task.Delay(4000);
            return 0;
        }
    }
}

</code></pre>
<p><br><br></p>
<h2 id="실행화면">실행화면</h2>
<h3 id="동기">동기</h3>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/61cfb590-43cd-4423-a732-885f493ff033/image.png" alt=""></p>
<h3 id="비동기">비동기</h3>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/2d32e554-6ab1-4b79-8bc3-72ef3cbfd110/image.png" alt=""></p>
<p><br><br></p>
<h2 id="비동기적으로-처리했을때-과연-성능이-좋아질까">비동기적으로 처리했을때 과연 성능이 좋아질까?</h2>
<blockquote>
<p><strong>성능상 좋아진 것처럼 보이지만 컴퓨터의 남는 자원을 사용해서 병렬적으로 처리할 수 있는 것들은 처리한 것이고 실제로 성능상 좋아진 게 아니라 응답속도가 빨라진 것이다.</strong></p>
</blockquote>
<p><br><br><hr></p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=T-XskK2kBmg&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=31">[ASP.NET] 21. aync, await 비동기 처리 프로그래밍 구현하기 - 개발토끼</a></li>
<li><a href="https://goodgid.github.io/What-is-Thread/">쓰레드(Thread)란 무엇인가?</a></li>
<li><a href="https://velog.io/@jminkyoung/TIL-15-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%9E%80-Feat.-async-await">동기, 비동기 란?</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core MVC] 19-20. MVC5에서 Unity Container를 이용한 DI, appsettings.json를 통한 ConnectionString 처리 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-19-20.-MVC5%EC%97%90%EC%84%9C-Unity-Container%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-DI-appsettings.json%EB%A5%BC-%ED%86%B5%ED%95%9C-ConnectionString-%EC%B2%98%EB%A6%AC-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-19-20.-MVC5%EC%97%90%EC%84%9C-Unity-Container%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-DI-appsettings.json%EB%A5%BC-%ED%86%B5%ED%95%9C-ConnectionString-%EC%B2%98%EB%A6%AC-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 06 Jul 2022 01:31:46 GMT</pubDate>
            <description><![CDATA[<h1 id="개발환경">개발환경</h1>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<p><br><br></p>
<h1 id="mvc5에서-unity-container를-이용한-dependency-injection">MVC5에서 Unity Container를 이용한 Dependency Injection</h1>
<h2 id="unity-container--ms에서-만든-ioc컨테이너-net">Unity Container : MS에서 만든 IoC컨테이너 .NET</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/324ac650-7aa4-40db-9166-c0e42922123d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/db6e0da7-97f4-4eae-8c77-c8fe0ec44802/image.png" alt=""></p>
<blockquote>
<p><strong>이전에 했던 MVC6에서는 Startup.cs에 IoC컨테이너가 내장되어있어 객체를 주입할수 있었는데 MVC5에는 MS에서 만든 IoC컨테이너 Unity Container를 사용하여 의존성 주입을 하는 방법이 있다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/f0d6ad9e-154c-4439-9f79-224ad5c66236/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/a65b1bbe-84e4-4b04-b7e2-60e259f2eda8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/cb686d77-8adf-4f4c-8a77-241aa682e547/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/b092893d-fd7b-4eb7-92ae-49c33478b5f1/image.png" alt=""></p>
<p><br><br><hr></p>
<h1 id="appsettingsjson를-통한-connectionstring-처리하기">appsettings.json를 통한 ConnectionString 처리하기</h1>
<h2 id="inoticedalcs">INoticeDal.cs</h2>
<pre><code class="language-csharp">
using Note.Model;
using System.Collections.Generic;

namespace Note.IDAL
{
    public interface INoticeDal
    {

        /// &lt;summary&gt;
        /// 1. 공지사항 게시물 리스트 출력
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        List&lt;Notice&gt; GetNoticeList();

        /// &lt;summary&gt;
        ///  2. 공지사항 상세 출력
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        Notice GetNotice(int noticeNo);

        /// &lt;summary&gt;
        /// 3. 공지사항 등록
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        bool PostNotice(Notice notice);

        /// &lt;summary&gt;
        /// 4. 공지사항 수정
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        bool UpdateNotice(Notice notice);

        /// &lt;summary&gt;
        /// 5. 공지사항 삭제
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// bool DeleteNotice(Notice notice); 객체를 넘겨줄 수  도 있다.
        bool DeleteNotice(int noticeNo);



    }
}
</code></pre>
<p><br><br></p>
<h2 id="noticedalcs">NoticeDal.cs</h2>
<pre><code class="language-csharp">
using Microsoft.Extensions.Configuration;
using Note.DAL.DataContext;
using Note.IDAL;
using Note.Model;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Note.DAL
{
    public class NoticeDal : INoticeDal
    {
        private readonly IConfiguration _configuration;

        public NoticeDal(IConfiguration configuration)
        {
            _configuration = configuration;
        }

    /// &lt;summary&gt;
    /// 1. 공지사항 게시물 리스트 출력
    /// &lt;/summary&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public List&lt;Notice&gt; GetNoticeList()
    {
            using (var db = new NoteDbContext(_configuration)) 
            {
                return db.Notices
                    .OrderByDescending(n=&gt;n.NoticeNo)
                    .ToList();
            }
    }

    /// &lt;summary&gt;
    ///  2. 공지사항 상세 출력
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public Notice GetNotice(int noticeNo)
    {
        throw new NotImplementedException();
    }

    /// &lt;summary&gt;
    /// 3. 공지사항 등록
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public bool PostNotice(Notice notice)
    {
        throw new NotImplementedException();
    }


    /// &lt;summary&gt;
    /// 4. 공지사항 수정
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public bool UpdateNotice(Notice notice)
    {
        throw new NotImplementedException();
    }

    /// &lt;summary&gt;
    /// 5. 공지사항 삭제
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// bool DeleteNotice(Notice notice); 객체를 넘겨줄 수  도 있다.
    public bool DeleteNotice(int noticeNo)
    {
        throw new NotImplementedException();
    }
    }
}</code></pre>
<h2 id="noticebllcs">NoticeBll.cs</h2>
<pre><code class="language-csharp">using Note.IDAL;
using Note.Model;
using System;
using System.Collections.Generic;

namespace Note.Bll
{
    public class NoticeBll 
    {
        private readonly INoticeDal _noticeDal;

        public NoticeBll(INoticeDal noticeDal)
        {
            _noticeDal = noticeDal;
        }

        /// &lt;summary&gt;
        /// 1. 공지사항 게시물 리스트 출력
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public List&lt;Notice&gt; GetNoticeList()
        {
            return _noticeDal.GetNoticeList();
        }

        /// &lt;summary&gt;
        ///  2. 공지사항 상세 출력
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public Notice GetNotice(int noticeNo)
        {
            if (noticeNo &lt;= 0) throw new ArgumentException();
            return _noticeDal.GetNotice(noticeNo);
        }

        /// &lt;summary&gt;
        /// 3. 공지사항 등록
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public bool PostNotice(Notice notice)
        {
            if (notice == null) throw new ArgumentNullException();
            return _noticeDal.PostNotice(notice);
        }


        /// &lt;summary&gt;
        /// 4. 공지사항 수정
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;notice&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public bool UpdateNotice(Notice notice)
        {
            if (notice == null) throw new ArgumentNullException();
            return _noticeDal.UpdateNotice(notice);
        }

        /// &lt;summary&gt;
        /// 5. 공지사항 삭제
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;noticeNo&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        /// bool DeleteNotice(Notice notice); 객체를 넘겨줄 수  도 있다.
        public bool DeleteNotice(int noticeNo)
        {
            if (noticeNo &lt;= 0) throw new ArgumentNullException();
            return _noticeDal.DeleteNotice(noticeNo);
        }
    }
}
</code></pre>
<p><br><br></p>
<h2 id="startupcs">Startup.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/c2919772-1e5e-4eca-9a51-19d9cf74528b/image.png" alt=""></p>
<p><br><br></p>
<h2 id="notedbcontextcs">NoteDbContext.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/b2ed6893-f3ab-4b88-861a-0136b73706b6/image.png" alt=""></p>
<h2 id="appsettingsjson">appsettings.json</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/5765db3d-d8f9-4d18-8159-b739d692e90d/image.png" alt=""></p>
<blockquote>
<p><strong>DB정보 같은 민감 정보들은 C#코드에 직접 작성하지 않고
appsetting.json에 DB정보들을 적는걸 권장한다.</strong></p>
</blockquote>
<h2 id="startupcs-1">Startup.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/997b102f-2051-44a3-b243-8a95530cdabf/image.png" alt=""></p>
<h2 id="notedbcontextcs-1">NoteDbContext.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/6f0c61eb-411c-4f52-9a31-8e5017add1d5/image.png" alt=""></p>
<h2 id="notedalcs">NoteDal.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/a343e3cb-7e25-4261-bc70-b93ab0ab5337/image.png" alt=""></p>
<p><br><br><hr></p>
<h1 id="참조">참조</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=UACohTbIfpM&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=30">[ASP.NET MVC] 20. appsettings.json를 통한 ConnectionString 처리하기 - 개발토끼</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core MVC] 17-18. Enterprise Architecture 프로젝트 구성, DI, IOC 사용 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-17.-Enterprise-Architecture-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-17.-Enterprise-Architecture-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 05 Jul 2022 02:07:54 GMT</pubDate>
            <description><![CDATA[<h2 id="개발환경">개발환경</h2>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<p><br><br></p>
<h1 id="ea-enterprise-architecture">EA (Enterprise Architecture)</h1>
<blockquote>
<ul>
<li><strong>대형 솔루션, 프로그램 개발 사용하는 프로젝트 구성 방식(큰 틀을 구성)</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>다양한 플랫폼을 지원하는 재사용성이 높은 코드를 작성하는 방식</strong></li>
<li>**Enterprise Architecture 대로 구성이 안되면 웹은 웹대로 따로 써야한다.</li>
<li>*</li>
</ul>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/c461adce-db8f-468c-ac81-da2e5c3eec31/image.png" alt=""></p>
<p>자주 조회가 되는 정보라면 메모리에 저장</p>
<p><br><br></p>
<h2 id="cache">Cache</h2>
<ul>
<li>목적 : 자주 불러오는 데이터를 메모리에 담아서 출력</li>
<li>장점 : 컴퓨팅 비용이 ↓, 데이터 출력하는 속도↑</li>
<li>단점 : 메모리를 많이 필요로 하게 됨8</li>
</ul>
<p><br><br></p>
<h2 id="classlibrary--dll-동적연결-라이브러리">ClassLibrary = <a href="https://goddaehee.tistory.com/185">DLL</a> (동적연결 라이브러리)</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/10bf5996-31a9-4d3b-ab29-45c2b5aafa1d/image.png" alt=""></p>
<h3 id="classlibrary-종류">ClassLibrary 종류</h3>
<blockquote>
<p><strong>1 .net Framework
2 .net core
3 .net Framework(portable) - Xamarin
4 .net Standard</strong></p>
</blockquote>
<p>하는 일은 같은데 직접 접근을 할 수 없고 참조를 추가해 줘야 한다.</p>
<p><br><br></p>
<h2 id="구조">구조</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/0c7001ad-6d47-4c03-9f2a-baddc522d9d6/image.png" alt=""></p>
<p><br><br></p>
<h2 id="접근-순서">접근 순서</h2>
<blockquote>
<p>*<em>클라이언트 버튼 → ASP.NET MVC 리스트 출력 호출 → BLL → IDAL → DAL  *</em></p>
</blockquote>
<p><br><br></p>
<h2 id="장점">장점</h2>
<blockquote>
<ul>
<li><strong>DB를 Oracle로 바꾼다고 치면 DAL만 교체 해주면 된다.</strong></li>
</ul>
</blockquote>
<ul>
<li>**Note라는 솔루션에 PresentationLayer 이외의 Layer들은 클래스 라이브러리로 작성이 되고 고객의 변덕으로 인해서 코드의 유연성이 필요할 경우 같은 소스코드로 웹뿐만 아니라 Winform, WPF, Xamarin 등 다양한 플랫폼을 지원할 수 있다는 매우 큰 장점이 있다.</li>
<li>*</li>
</ul>
<p><br><br><hr></p>
<h1 id="di-ioc-사용">DI, IOC 사용</h1>
<h2 id="didependency-injection">DI(Dependency Injection)</h2>
<blockquote>
<p><strong>의존성주입</strong></p>
</blockquote>
<ul>
<li>프로그래밍에서 구성요소가 의존관계가 소스코드 <strong>내부가 아닌 외부의 설정파일</strong> 등을 통해 정의되게 하는 디자인 패턴 </li>
</ul>
<p><br><br></p>
<h2 id="적용유형">적용유형</h2>
<blockquote>
<p><strong>마틴 파울러는 세가지 의존성 주입 패턴을 제시</strong></p>
</blockquote>
<ul>
<li><strong>생성자 주입 : 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입</strong></li>
<li><strong>Setter를 통한 주입 : 의존성을 입력받는 Setter 메소드를 만들고 이를 통해 의존성 주입 (WPF쪽에서 많이 사용)</strong></li>
<li><strong>Interface를 통한 주입 : 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고  이 인터페이스를 구현하도록 함으로써 실행시에 이를 통하여 의존성을 주입</strong></li>
</ul>
<p><br><br></p>
<h2 id="iocinversion-of-control">IoC(Inversion of Control)</h2>
<blockquote>
<ul>
<li><strong>프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름제어를 받게되는 소프트웨어 디자인 패턴을 말한다.</strong></li>
</ul>
</blockquote>
<p><br><br></p>
<h2 id="userbllcs">UserBll.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ad9d16f9-836d-407e-9d6f-b4b55373335a/image.png" alt=""></p>
<blockquote>
<p><strong>직접 UserDal클래스에 의존
추후 코드 변경사항이 생길때 참조되어 있는 모든 부분을 찾아 수정해야하는 단점이 있다.</strong></p>
</blockquote>
<br>

<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/d5625939-b32b-442f-9710-89cff7e9b4a8/image.png" alt=""></p>
<blockquote>
<p>*<em>인터페이스를 생성 후 생성자에 의존성 주입을 해주면 객체를 직접 참조하는 강한결합을 해제하고 느슨한 결합을 시킬 수 있다.
*</em></p>
</blockquote>
<p><br><br><br></p>
<h2 id="startupcs">Startup.cs</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/b493969c-a65a-47a2-9ee0-d815694f7ccc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/0ece6411-55aa-4473-bdda-3601d0d1513e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/e416c251-312e-4849-a089-469ea2937aa7/image.png" alt=""></p>
<pre><code class="language-csharp">services.AddTransient&lt;UserBll&gt;();

/* 인터페이스와 구현체 매칭시켜줌 */
services.AddTransient&lt;IUserDal, UserDal&gt;();</code></pre>
<blockquote>
<p><strong>Startup.cs에서 참조만 바꿔주면
BLL은 고치지 않아도 인터페이스를 사용하면 MSSQL에서 Oracle로 변경된다. 항상 일관된 기능 등을 정의할 수 있다.</strong></p>
</blockquote>
<p><br><br><br></p>
<h2 id="addsingletone-addscoped-addtransient">AddSingletone(), AddScoped(), AddTransient()</h2>
<h3 id="addsingletone">AddSingletone()</h3>
<blockquote>
<p><strong>클라이언트의 접속상태와 상관없이 웹 서비스 시작 때 생성되고 종료될때까지 유지된다. 모든 호출에서 같은 오브젝트를 재사용한다. 따라서 결과값을 전체 모든 호출하는 사람들과 공유하는 효과를 얻고 보통 누적된 방문자 수를 보여줄 때 사용한다.</strong></p>
</blockquote>
<h3 id="addscoped">AddScoped()</h3>
<blockquote>
<p><strong>각 HTTP 요청 당 하나의 인스턴스를 생성하며, 클라이언트의 Request 시작부터, Response 종료까지 유지된다. 같은 주소의 웹 화면에서 여러번 이를 사용할 경우 같은 인스턴스를 재사용 한다.</strong></p>
</blockquote>
<h3 id="addtrasient">AddTrasient</h3>
<blockquote>
<p>*<em>매 사용때 마다 새로운 객체를 생성한다. 비유지(stateless) 서비스에 가장 적합
*</em></p>
</blockquote>
<p><br><br><br><hr></p>
<h2 id="참조">참조</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=dKvCZUec100&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=27">https://www.youtube.com/watch?v=dKvCZUec100&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=27</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98">https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85">의존성주입 위키피디아</a></li>
<li><a href="https://ddochea.tistory.com/165">Singleton, Scoped, Transient</a></li>
<li><a href="https://medium.com/@jang.wangsu/di-inversion-of-control-container-%EB%9E%80-12ecd70ac7ea">IoC 란?</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ASP.NET Core MVC] 16. 자바스크립트 텍스트 에디터 이미지 업로드 정리]]></title>
            <link>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-16.-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%97%90%EB%94%94%ED%84%B0-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@vipstar-_-/ASP.NET-Core-MVC-16.-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%97%90%EB%94%94%ED%84%B0-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 29 Jun 2022 07:47:27 GMT</pubDate>
            <description><![CDATA[<h2 id="개발환경">개발환경</h2>
<ul>
<li>Visual Studio Community 2017</li>
<li>ASP.NET Core 2.2</li>
</ul>
<p><br><br></p>
<h1 id="텍스트에디터-이미지-업로드">텍스트에디터 이미지 업로드</h1>
<blockquote>
<p>*<em>GUID(전역고유식별자) :  응용 소프트웨어에서 사용되는 유사난수이다. GUID는 생성할 때 항상 유일한 값이 만들어진다는 보장은 없지만, 사용할 수 있는 모든 값의 수가 2128 = 3.4028×1038개로 매우 크기 때문에, 적절한 알고리즘이 있다면 같은 숫자를 두 번 생성할 가능성은 매우 적다.
*</em></p>
</blockquote>
<br>

<h2 id="controller">Controller</h2>
<pre><code class="language-csharp"> public class UploadController : Controller
    {
        /* IHostingEnvironment 추가 : 환경을 추적할 수 있는 매개체가 되어준다. */
        private readonly IHostingEnvironment _environment;

        /* 생성자 생성 */
        public UploadController(IHostingEnvironment environment)
        {
            _environment = environment;
        }

        /* Route(&quot;api/upload&quot;) : 경로 재정의를 해준다.
           http://www.example.com/Upload/ImageUpload
        -&gt; http://www.example.com/api/upload    */
        [HttpPost, Route(&quot;api/upload&quot;)]
        public async Task&lt;IActionResult&gt; ImageUpload(IFormFile file)  // 비동기 처리 async Task&lt;T&gt;
        {
            // 이미지나 파일을 업로드 할때 필요한 구성
            //1. Path(경로) - 어디에다 저장할지 결정
            /* Path.Combine() : 여러 문자열을 한 경로로 결합합니다. */
            var path = Path.Combine(_environment.WebRootPath, @&quot;images\upload&quot;); 

            // 2. Name(이름) - DateTime 으로 많이쓰지만 사용자가 많으면 적합하지 않다. 충돌날 수 있음
               // GUID + GUID  (전역고유식별자)
            // 3. Extension(확장자) - jpg, png... txt 

            var fileFullName = file.FileName.Split(&#39;.&#39;);
            var fileName = $&quot;{Guid.NewGuid()}.{fileFullName[1]}&quot;;

            using (var fileStream = new FileStream(Path.Combine(path, fileName), FileMode.Create)) // FileMode.Create로 파일 새롭게 생성
            {
              /* async - await 한짝으로 같이 쓴다.                 
                 단순히 CopyTo를 사용하면 대용량이미지 업로드시 
                 병목현상이 생길 수 도 있어서 CopyToAsync로 비동기 처리한다. 
                 CopyToAsync : 현재 스트림에서 모든 바이트를 비동기적으로 읽어 다른 스트림에 씁니다*/
                 await file.CopyToAsync(fileStream); 
            }
                return Ok(new { file = &quot;/images/upload/&quot; + fileName, success = true });
        }
    }
}

</code></pre>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ee684257-3b90-49c4-b52b-0b34144b16dc/image.png" alt="">
<img src="https://velog.velcdn.com/images/vipstar-_-/post/05172a20-da5f-4539-b877-e61ab2a24f2d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/ee5371f3-dfa3-4aae-91f8-2a371c84c138/image.png" alt=""></p>
<p><br><br></p>
<h2 id="_layoutcshtml-trumbowyguploadjs">_Layout.cshtml, trumbowyg.upload.js</h2>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/26728e07-d45f-4d47-9e7c-7a70944ff7c3/image.png" alt=""><img src="https://velog.velcdn.com/images/vipstar-_-/post/f873b7e7-ed20-45a9-8806-10e2a640c1a2/image.png" alt=""></p>
<blockquote>
<p><strong>1. 사용하기 위해 경로에 trumbowyg.upload.js 추가해줌
    2. lib/trumbowyg/dist/plugin/upload/trumbowyg.upload.js에 들어가서
    serverPath를 업로드할 주소로 변경하고 fileFieldName을 파라미터 이름으로 변경</strong></p>
</blockquote>
<p><br><br></p>
<h2 id="sitejs">site.js</h2>
<blockquote>
<p><strong>API에서 정해진 버튼기능을 사용자가 정의해서 커스텀 할 수 있다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/vipstar-_-/post/72303612-a26e-45a2-8c4d-4375332f105b/image.png" alt=""><img src="https://velog.velcdn.com/images/vipstar-_-/post/86042ac7-b5e4-4f60-9108-0114abea622b/image.png" alt=""><img src="https://velog.velcdn.com/images/vipstar-_-/post/069cb7ff-01bd-4fb8-b749-fe909533e77f/image.png" alt=""></p>
<p><br><br><hr></p>
<h2 id="참조">참조</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=7cKA-lEqDjM&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=26">https://www.youtube.com/watch?v=7cKA-lEqDjM&amp;list=PLbPz1r_wDPhEcKDJbOBw_3h5c2gtyDicX&amp;index=26</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%A0%84%EC%97%AD_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90">https://ko.wikipedia.org/wiki/%EC%A0%84%EC%97%AD_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90</a></li>
<li><a href="https://docs.microsoft.com/ko-kr/dotnet/api/system.io.stream.copytoasync?view=net-6.0">https://docs.microsoft.com/ko-kr/dotnet/api/system.io.stream.copytoasync?view=net-6.0</a></li>
<li><a href="https://docs.microsoft.com/ko-kr/dotnet/api/system.io.path.combine?view=net-6.0">https://docs.microsoft.com/ko-kr/dotnet/api/system.io.path.combine?view=net-6.0</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>