<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>코딩 여행</title>
        <link>https://velog.io/</link>
        <description>https://developer-hh.tistory.com 로 옮깁니다</description>
        <lastBuildDate>Mon, 01 May 2023 09:32:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>코딩 여행</title>
            <url>https://velog.velcdn.com/images/j_hana01/profile/b48e4c2c-2e7e-451e-b0ed-001343689396/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 코딩 여행. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/j_hana01" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[dart] Function]]></title>
            <link>https://velog.io/@j_hana01/dart-Function</link>
            <guid>https://velog.io/@j_hana01/dart-Function</guid>
            <pubDate>Mon, 01 May 2023 09:32:44 GMT</pubDate>
            <description><![CDATA[<h2 id="함수-정의하기">함수 정의하기</h2>
<pre><code>
void sayHello(String name) {
    print(&quot;hello $name!)
}
</code></pre><p>함수를 정의할 때 파라미터의 자료형과 파라미터명을 적음
함수 앞의 void는 함수가 어떤 것도 리턴하지 않는 다는 뜻임(타스랑 똑같음)
그런데 지금 문자열을 리턴하고 있으니 다음과 같이 고치면 됨</p>
<pre><code> sayHello(String name) {
    return &#39;hello $name&#39;;
}

void main () {
    print(sayHello(&#39;haha&#39;));
}

혹은 

String sayHello(String name) {
    return &#39;hello $name&#39;;
}

void main () {
    print(sayHello(&#39;haha&#39;));
}</code></pre><h2 id="named-parameter">named parameter</h2>
<pre><code>String sayHello(String name, String nickname, int age){
    return &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39; 
}


void main () {
    print(sayHello(&#39;haha&#39;, &#39;one&#39;, 1);
    // hello i am haha, people call me one and i am 1 years old. nice to meet you!
}</code></pre><p>하지만 전달해야할 요소가 많아지면 유저가 요소의 순서를 헷갈릴 수도 있고 값을 넣지 않는 상황이 생길 수도 있음</p>
<p>이를 방지하기 위해 다음과 같은 방법을 사용할 수 있음</p>
<p><strong>named argument</strong> </p>
<pre><code>
String sayHello({String name, String nickname, int age}){
    return &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39;;
}


void main () {
    print(sayHello(
    age: 1,
    name: &#39;haha&#39;,
    nickname: &#39;one&#39;,
    ));
    }</code></pre><p>함수의 파라미터 적는 곳에 중괄호를 추가한 후,
함수를 호출 할 때 순서에 상관없이 argument의 이름들을 적으면 됨</p>
<p>그런데 dart가 에러메세지를 띄움</p>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/1fd89f93-7688-4bcd-ba0c-1dcd82513438/image.png" alt=""></p>
<p>각 파라미터가 null을 가질 수 없는데 지금 보면 null이 들어올 수도 있어~ (유저가 값을 안 보내는 경우가 있을 수 있음) 
default value 설정하든가 아니면 require modifier 설정해~라고 친절하게 메세지를 보냄</p>
<pre><code>String sayHello({String name = &#39;orange&#39;, String nickname = &#39;two&#39;, int age = 5,}){
    return &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39;;
}


void main () {
    print(sayHello(
    age: 1,
    ));
    }
    //hello i am orange, people call me two. and i am 1 years old. nice to meet you!</code></pre><p><strong>default value</strong>를 설정해 유저가 까먹고 다른 값들을 안 적어 보냈을 때 기본값을 적용함</p>
<p>근데 만약 default value를 설정하기 싫거나 혹은 실제 data를 받아야하기 때문에 default value를 사용하지 못한다면 어떻게 할까?
바로 <strong>required</strong>를 사용하면 됨</p>
<pre><code>String sayHello({
 required String name, 
 required String nickname, 
 required int age,
}) {
return &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39;;
}


void main () {
    print(sayHello(
    age: 1,
    name: &#39;haha&#39;,
    nickname: &#39;one&#39;,
    ));
    }</code></pre><h2 id="optional-positional-parameters">optional positional parameters</h2>
<pre><code>String sayHello(
 String name, 
 String nickname, 
 int age,
) =&gt; &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39;;


void main () {
    print(sayHello(&#39;hh&#39;, &#39;one&#39;, 1,));
    }</code></pre><p>named argument를 적용하고 싶지 않은데 parameter 중 하나를 require 하지 않게 하려면 다음과 같이 하면 됨</p>
<pre><code>String sayHello(
 String name, 
 String nickname, 
 [int? age = 5]
) =&gt; &#39;hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!&#39;;


void main () {
    print(sayHello(&#39;hh&#39;, &#39;one&#39;,));
    }

    // hello i am hh, people call me one. and i am 3 years old. nice to meet you!</code></pre><p>하지만 자주 사용하는 방법은 아님</p>
<h2 id="qq-operator-qq-equals">QQ operator, QQ equals</h2>
<pre><code>String lowercaseName(String name) {
    return name.toLowerCase();
}

void main () {
  print(lowercaseName(&#39;ABC&#39;));
    } // abc
</code></pre><p>그런데 사용자가 null을 입력할 수 있게 하고싶음 </p>
<pre><code>String lowercaseName(String name) {
    return name.toLowerCase(null);
}

void main () {
  print(lowercaseName());
    } </code></pre><p>값이 null이 될 수도 있다는 걸 알려주기 위해서 다음과 같이 파라미터 넣는 곳에<code>?</code>을 사용해보자</p>
<pre><code>String lowercaseName(String? name) =&gt; 
  name != null? name.toLowerCase() : &#39;haha&#39;;

void main () {
  print(lowercaseName());
    } // haha</code></pre><p>삼항 연산자를 사용해 name이 null이 아니라면 name.toLowerCase()를 리턴하고 null이면 &#39;haha&#39;를 리턴하게 함
하지만 <code>??(QQ Operator)</code>를 사용해 더 간결하게 작성할 수 있음</p>
<pre><code>String lowercaseName(String? name) =&gt; 
  name?.toLowerCase() ?? &#39;haha&#39;;

void main () {
  print(lowercaseName());
    } // haha</code></pre><p><code>??</code>를 기준으로 좌측이 null이면 우측을 리턴
<code>??</code>를 기준으로 좌측이 null이 아니라면 그대로 좌측을 리턴함</p>
<p><strong>??=(QQ equals or QQ assignment operator)</strong></p>
<pre><code>void main() {
    String? name;
    name ??= &#39;haha&#39;;
    // name이 null이면 우측의 값을 할당하라는 뜻
}</code></pre><h2 id="typedef">typedef</h2>
<p>typedef는 자료형에 alias를 사용할 수 있게 해줌
하지만 좀 더 구조화된 데이터는 class를 사용하는 것이 일반적임
typedef는 간단한 데이터의 alias를 만들 때 사용함(List나 Map, set 등)</p>
<pre><code>List&lt;int&gt; reverseNumbers(List&lt;int&gt; list) {
    var reversed = list.reversed;
    return reversed.toList();
}</code></pre><p>위의 List 예시를 typedef를 통해 바꾸어보자면 다음과 같음</p>
<pre><code>typedef ListOfInts = List&lt;int&gt;

ListOfInts reverseNumbers(ListOfInts list) {
    var reversed = list.reversed;
    return reversed.toList();
}

void main() {
 print(reverseNumbers([1,2,3,4]));
}
// [4,3,2,1]</code></pre><p>ListOfInts라는 alias를 만들어 <code>List&lt;int&gt;</code> 대신 사용함 
dart는 둘 다 같은 자료형으로 받아들이기 때문에 잘 작동함</p>
<hr>
<p>자바스크립트하다가 다트하니까 재밌다... 헤헤
자료형을 저렇게 써주는 것도 재밌음...(물론 자바스크립트도 ts쓰면 되지만 ㅎ...)
내일은 드디어 class 듣는다 예이 너무 재밌을듯</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[dart] data type]]></title>
            <link>https://velog.io/@j_hana01/dart-data-type</link>
            <guid>https://velog.io/@j_hana01/dart-data-type</guid>
            <pubDate>Thu, 27 Apr 2023 07:56:21 GMT</pubDate>
            <description><![CDATA[<h2 id="basic-data-type">basic data type</h2>
<pre><code>void main () {
String catName = &quot;rey&quot;;
bool isAlive = true;
int hp = 1234578;
double mp = 2456.123456;
}</code></pre><p>숫자 자료형은 num, int, double이 있음
int와 double은 num의 클래스를 상속 받음</p>
<p>num 자료형을 사용하면 값은 integer가 될 수도 있고 double이 될 수도 있음</p>
<pre><code>void main () {
String catName = &quot;rey&quot;;
bool isAlive = true;
int hp = 1234578;
double mp = 2456.123456;
num x = 1234; // int
x = 1.12; // double
}</code></pre><h2 id="lists-collection-if-collection-for">Lists, collection if, collection for</h2>
<h3 id="list">list</h3>
<pre><code>void main () {
    var nums = [1,2,3,4];    
}</code></pre><p>list를 만드는 건 자바스크립트의 배열을 만드는 것과 같이 만들면 된다</p>
<p>자료형을 정해서 작성해줄 수 있음</p>
<pre><code>void main () {
    List&lt;int&gt; nums = 
    [1,
    2,
    3,
    4,
    ];    // int가 들어있는 list
}</code></pre><p>위와 같이 자료형을 명확히 적어줄 때는 class를 다룰 때 사용하면 됨</p>
<h3 id="collection-of">collection of</h3>
<pre><code>void main () {
    var pleaseGiveMeSix = true;
    var nums = 
    [1,
    2,
    3,
    4,
    if(pleaseGiveMeSix) 6, // pleaseGiveMeSix가 true면 list에 6을 추가할 수 있음
    ];
    print(nums) // [1,2,3,4,6]
    }
 // 위의 코드는 아래와 같음

 void main () {
    var pleaseGiveMeSix = true;
    var nums = 
    [1,
    2,
    3,
    4,
    ];
    if(pleaseGiveMeSix){
        nums.add(6);
    }
}</code></pre><p>조건에 따라 element를 추가할 수 있음</p>
<h3 id="collection-for">collection for</h3>
<pre><code>void main () {
    var oldFriend = [&#39;hans&#39;, &#39;adam&#39;];
    var newFriend = [
    &#39;apple&#39;,
    &#39;saoko&#39;,
    &#39;jane&#39;,
    for(var friend in oldFriend) &quot;😊 $friend&quot;
    ];
}

// [apple, saoko, jane, 😊 hans, 😊 adam];</code></pre><p>newFriend 리스트 안에 oldFriend가 추가된 건데,
for문을 돌면서 새로운 문자열을 생성하고 이를 newFriend 리스트의 마지막 요소들로 추가한 것임 
좋다...</p>
<h2 id="string-interpolation">String interpolation</h2>
<p>text에 변수를 추가하는 방법임</p>
<pre><code>void main () {
    var name = &quot;haha&quot;;
    var sayHello = &quot;$name 가 반갑다고 인사하네요. 안녕!&quot;;
    print(sayHello); // haha 가 반갑다고 인사하네요. 안녕!
}</code></pre><p>단순하게 변수의 값을 담고 싶은 것이라면 <code>$변수명</code> 처럼 입력하면 됨 </p>
<p>자바스크립트의 템플릿 리터럴 같이 변수명 앞에 $(달러사인)를 붙이는데 따로 중괄호와 백틱을 사용할 필요없이 작은 따옴표나 큰 따옴표 안에 달러사인을 넣고 그 뒤에 바로 변수명을 쓰면 끝임
하지만 이 방법은 이미 변수가 존재할 때 사용하는 방법임</p>
<p>변수의 값을 계산하고 싶은 거라면 $와 함께 중괄호 내에 계산할 내용을 적으면 됨</p>
<pre><code>void main () {
    var name = &quot;haha&quot;;
    var age = 0
    var sayHello = &quot;${age + 1}살인 $name 가 반갑다고 인사하네요. 안녕!&quot;;
    print(sayHello); //1살인 haha 가 반갑다고 인사하네요. 안녕!
}</code></pre><h2 id="set">set</h2>
<pre><code>void main () {
    var nums = {1,2,3,4,5}
}

or

void main () {
    set&lt;int&gt; nums = {1,2,3,4,5}
}
</code></pre><p>set에 있는 요소들은 유니크 해야함
아래 예시를 보자</p>
<pre><code>void main () {
    var nums = {1,2,3,4,5};
    nums.add(1);
    nums.add(1);
    print(nums) // {1,2,3,4,5} 1을 더해도 변경x
}</code></pre><p>list에 있는 값들은 변경 o</p>
<pre><code>void main () {
    var nums = [1,2,3,4,5];
    nums.add(1);
    nums.add(1);
    print(nums) // {1,2,3,4,5,1,1}
}</code></pre><p>요소가 항상 하나씩만 있어야하면 set을 사용하면 됨</p>
<h2 id="maps">maps</h2>
<p>자바스크립트의 object와 같음</p>
<pre><code>void main() {
    var player = {
        &#39;name&#39;: &#39;haha&#39;,
        &#39;gender&#39;: &#39;female&#39;,
        &#39;exp&#39;: 123456789,
        &#39;alive&#39;: true,
    };
}</code></pre><p>위의 예시 자료형을 보면 Map&lt;String, object&gt;라 되어있음
키가 String, value가 object라는 뜻인데 여기서 말하는 object는 어떤 값이든 올 수 있다는 뜻임(typescript의 any와 비슷)</p>
<p>하지만 key와 value를 가지는 구조로 object를 만들 때 그 object가 특정한 구조(API로 받은 데이터 등)를 가지고 있다면 class를 사용하는 걸 추천함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dart] variables]]></title>
            <link>https://velog.io/@j_hana01/Dart-variables</link>
            <guid>https://velog.io/@j_hana01/Dart-variables</guid>
            <pubDate>Wed, 26 Apr 2023 07:46:20 GMT</pubDate>
            <description><![CDATA[<h2 id="main">main</h2>
<p>main 함수는 모든 dart 프로그램의 엔트리 포인트임 -&gt; 중요
main 함수에서 내가 쓴 코드가 호출됨</p>
<pre><code class="language-dart">
void main() {
    print(&quot;cat&quot;);
}</code></pre>
<p>자스나 타스 같은 다른 프로그래밍 언어는 formmatter가 자동으로 세미콜론을 달아주지만 dart는 그런 기능이 없음 그래서 꼭 세미콜론을 붙여야함(중요!!)</p>
<h2 id="var-keyword">var keyword</h2>
<pre><code>// no.1
void main() {
   var name =&quot;haha&quot;; // 값을 업데이트 할 때 변수의 원래 타입과 일치해야함
   name = &quot;하하&quot;;
}

// no.2
void main() {
   String name =&quot;haha&quot;; // 명시적으로 변수의 타입 지정
   name = &quot;하하&quot;;
}
</code></pre><p>둘 다 변수를 생성하는 방법이다
각각의 방법은 어떨 때 사용될까?</p>
<p>첫 번째 방법은 관습적으로 함수나 메소드 내부에 지역 변수를 선언할 때 var를 사용함</p>
<p>그리고 class에서 변구나 프로퍼티를 선언할 때는 두 번째 방법같이 타입을 지정함</p>
<h2 id="dynamic-type">Dynamic type</h2>
<p>다이나믹은 여러가지 타입을 가질 수 있는 변수에 쓰는 키워드임
그러면 다이나믹은 왜 사용하는 걸까?
-&gt; 변수가 어떤 타입인지 알기 어려운 경우들이 종종 있기 때문</p>
<pre><code>void main() {
   Dynamic name;
   name = &quot;하하&quot;;
   name = 123;
   name = false;
}</code></pre><p>다이나믹은 정말 필요할 때만 사용하자</p>
<h2 id="nullable-variables">nullable variables</h2>
<p>null safty는 개발자가 null을 참조할 수 없도록 하는 것임
왜냐면 null을 참조하면 런타임 에러가 생기기 때문</p>
<p>null safty는 어떤 변수 혹은 어떤 데이터가 null이 될 수 있음을 명시하는 역할을 함</p>
<pre><code>void main () {
    String haha = &#39;haha&#39;;
    haha = null;
    if(haha != null) {
        haha.isNotEmpty
    }
}
</code></pre><p>haha라는 변수가 문자열이나 null 둘다 될 수 있게 하려면 <code>?</code>를 붙임</p>
<pre><code>void main () {
    String? haha = &#39;haha&#39;;
    haha = null;
    if(haha != null) {
        haha.isNotEmpty
    }
}</code></pre><p>이렇게 하면 dart에서 haha라는 변수가 null이 될 수 있다는 걸 알 수 있음</p>
<pre><code>void main () {
    String? haha = &#39;haha&#39;;
    haha = null;
    haha?.isNotEmpty
}</code></pre><p>변수 haha가 null이 아니라면 isNotEmpty속성을 달라는 뜻임
if문을 짧게 단축해서 작성함</p>
<h2 id="final-variables">final variables</h2>
<p>한 번 정의된 변수를 수정할 수 없게 만들려면 <code>final</code>을 사용함
자바스크립트의 const와 비슷...</p>
<pre><code>// final 사용 전
void main () {
    String name = &quot;haha&quot;;
    name = &quot;hoho&quot;;
}


// final 사용 후
void main () {
    final name = &quot;haha&quot;;
    name = &quot;hoho&quot; // Error!!!!!
}
</code></pre><p>final을 사용해서 만든 변수는 수정할 수 없음</p>
<h2 id="late-variables">Late variables</h2>
<p><code>late</code>는 초기 데이터 없이 변수를 선언할 수 있게 해줌</p>
<pre><code>void main () {
    late final String name;
    // api로 데이터를 받아서 변수에 값을 할당함
    name = &quot;haha&quot;;
}
</code></pre><p>late를 사용해 변수를 먼저 만든 후 그 안의 값(데이터 등)은 나중에 받아서 할당할 수 있는 것이다(하지만 원래 정의한 타입에 맞는 값이 들어가야함)</p>
<p>주로 API를 사용해 작업할 때 많이 사용하게 될듯</p>
<h2 id="constant-variables">constant variables</h2>
<p>다트에도 <code>const</code> 키워드가 있다 두둥
하지만 자바스크립트의 const와는 다르다
(자바스크립트의 const는 dart의 final과 비슷함)</p>
<p>dart의 const는 compile-time constant를 만들어줌
즉, const는 컴파일 할 때 값을 알 수 있는 변수를 만드는 것임
(코드를 컴파일하기 전에 알고 있어야 함)</p>
<pre><code>void main () {
    const API = fetchApi();
}</code></pre><p>const는 컴파일 시간에 알려진 상수를 선언하는 데 사용되고, final은 런타임에 알려진 상수를 선언하는 데 사용할 수 있음</p>
<pre><code>const pi = 3.14; // 컴파일 시간 상수
final currentTime = DateTime.now(); // 런타임 상수</code></pre><p>다트 재밌다...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<li>요소는 왜 <ul>요소의 자식 요소여야만 할까?]]></title>
            <link>https://velog.io/@j_hana01/li%EC%9A%94%EC%86%8C%EB%8A%94-%EC%99%9C-ul%EC%9A%94%EC%86%8C%EC%9D%98-%EC%9E%90%EC%8B%9D-%EC%9A%94%EC%86%8C%EC%97%AC%EC%95%BC%EB%A7%8C-%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@j_hana01/li%EC%9A%94%EC%86%8C%EB%8A%94-%EC%99%9C-ul%EC%9A%94%EC%86%8C%EC%9D%98-%EC%9E%90%EC%8B%9D-%EC%9A%94%EC%86%8C%EC%97%AC%EC%95%BC%EB%A7%8C-%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Fri, 07 Apr 2023 04:11:01 GMT</pubDate>
            <description><![CDATA[<p>저 질문에 답을 해보려 html에 직접 코드를 작성해보았다</p>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/b77ba4c2-a34c-4412-9e01-0161ac616c58/image.png" alt=""></p>
<p>당연하게 아무 생각 없이 <code>&lt;ul&gt;</code>이나 <code>&lt;ol&gt;</code>에 <code>&lt;li&gt;</code>를 써왔는데 직접 코드를 쳐보니 html에서 <code>&lt;li&gt;</code>를 단독으로 써도 작동을 하긴 한다
그러면 왜 <code>&lt;li&gt;</code>만 써도 화면에 잘 나오는데 <code>&lt;ul&gt;</code>이나 <code>&lt;ol&gt;</code>의 자식 요소로 <code>&lt;li&gt;</code>를 쓰는 걸까?</p>
<p><a href="https://html.spec.whatwg.org/">https://html.spec.whatwg.org/</a> 에서 li요소를 확인해보았다</p>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/f35d721c-c4a4-4b8f-9951-175a9b3b8bdf/image.png" alt=""></p>
<p><a href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element">https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element</a></p>
<p>li요소는 ol, ul, menu context 안에서 사용할 수 있다고 한다
엥 그러면 단독으로 써지는 건 뭐지?</p>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/ebf6d1a0-2fcf-4e4a-9eff-c9820805b157/image.png" alt=""></p>
<blockquote>
<p> // 위의 내용 번역
li 요소는 목록 항목을 나타냅니다. 
상위 요소가 ol, ul 또는 menu 요소인 경우 요소는 해당 요소에 대해 정의된 대로 상위 요소 목록의 항목입니다. <strong>그렇지 않으면 목록 항목에 다른 li 요소에 대해 정의된 목록 관련 관계가 없습니다.</strong></p>
</blockquote>
<p>저 말이 이해가 안 되어서 찾아보니 ul, ol태그에 목록을 나타내려면 자식 요소로 li를 사용하는 것이 규칙인데 브라우저가 이러한 규칙을 강제하지 않아서 ul과 ol을 사용하지 않은 li도 화면에 출력 될 수 있는 것이다
즉, 브라우저가 ul이나 ol태그가 없으면 자동으로 ul이나 ol태그를 생성하기 때문에 목록처럼 보여서 글머리 기호가 있는 문장으로 출력이 되는 것이다
하지만 규칙을 지켜서 사용하지 않은 html은 HTML언어 규칙을 지키지 않은(유효하지 않은) HTML문서이기 때문에 html요소에 담긴 시맨틱 정보들을 전달하지 못한다
그렇기 때문에 검색엔진에서 제대로 검색이 안 되거나 스크린 리더 등을 사용하는 사용자에게 제대로 웹사이트를 전달하지 못할 수도 있다고 한다</p>
<p>태그를 쓸 때 HTML규칙을 잘 지켜서 사용해야겠다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Semantic HTML은 왜 필요할까?]]></title>
            <link>https://velog.io/@j_hana01/Semantic-HTML%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@j_hana01/Semantic-HTML%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Thu, 06 Apr 2023 06:05:37 GMT</pubDate>
            <description><![CDATA[<p><code>Semantic HTML의 필요성을 예시를 들어 설명해주세요.</code></p>
<p>Semantic이라는 뜻은 relating to meaning 
즉, 의미있는 HTML이나 또는 HTML요소의 내용에 어떤 의미가 있는지에 관련되어 있다는 뜻이다
시맨틱 HTML을 사용하면 크롤러가 코드를 더 쉽게 알아볼 수 있다
그리고 시각장애인 등을 위한 스크린 리더를 쓰는 사람들이 좀 더 쉽게 접근할 수 있다
또한 문서의 구조와 의미를 명확하게 표현할 수 있기 때문에 코드를 이해하기 쉽고 유지보수하기 쉽다</p>
<p>Semantic HTML에는 다음과 같은 요소들이 있다</p>
<p><code>&lt;article&gt;</code> : 내용이 각자 독립적으로 구분됨. 콘텐츠 자체를 독립적으로 배포하거나 재사용할 수 있음 
ex)게시판, 뉴스 기사, 블로그 글, 포럼</p>
<pre><code>//&lt;article&gt; 예시
&lt;article&gt;
    &lt;h1&gt;강아지 인기 간식 순위&lt;/h1&gt;
    &lt;p&gt;여행 피서지로 좋은 곳&lt;/p&gt;
&lt;/article&gt;</code></pre><p><code>&lt;section&gt;</code> : 서로 관계 있는 문서를 분리하는 역할을 함.
ex: 책의 목차나 강의의 단원</p>
<pre><code>&lt;section&gt;
    &lt;h1&gt;타입스크립트&lt;/h1&gt;
    &lt;p&gt;타입스크립트로 리팩토링 하기&lt;/p&gt;
&lt;/section&gt;</code></pre><br>
내용과 서로 관계가 있다면 section을 사용하고
각 내용이 독립적이라면 article을 사용


<p><code>&lt;aside&gt;</code> : 문서의 주요 내용과 간접적으로만 연관된 부분을 나타냄. 주로 사이드바나 콜아웃 박스로 표현
<code>&lt;details&gt;</code> : <code>&lt;summary&gt;</code>태그와 같이 쓰이며 열림 상태일 때만 내용을 보여주는 위젯을 생성함
  <code>&lt;summary&gt;</code>을 <code>&lt;details&gt;</code>의 자식요소로 설정하면 <code>&lt;summary&gt;</code>가 <code>&lt;details&gt;</code>의 내용을 요약하는 레이블이 되고, <code>&lt;summary&gt;</code>을 누르면 <code>&lt;details&gt;</code>의 내용이 보임<br><code>&lt;figcaption&gt;</code> : <code>&lt;figure&gt;</code>가 포함하는 다른 요소에 대한 설명을 적을 수 있는 태그 
<code>&lt;figure&gt;</code> : 독립적인 콘텐츠를 표현. <code>&lt;figcaption&gt;</code>를 통해 설명을 붙일 수 있음
<code>&lt;footer&gt;</code> : 말 그대로 footer를 나타내는 태그
<code>&lt;header&gt;</code> : 말 그대로 header를 나타내는 태그
<code>&lt;main&gt;</code> : <code>body</code>의 주요 콘텐츠를 나타냄. 여기서 말하는 주요 콘텐츠란 문서의 핵심주제나 앱의 핵심 기능에 직접적으로 관련있는 콘텐츠를 말함
<code>&lt;mark&gt;</code> : 현재 맥락에 관련이 깊거나 중요해 표시 또는 하이라이트한 부분을 나타냄. <code>형광펜</code> 같은 역할이라고 생각하면 쉬움
<code>&lt;nav&gt;</code> : 문서의 부분 중 현재 페이지 내, 또는 다른 페이지로의 링크를 보여주는 구획을 나타냄
  주로 메뉴나 목차에 많이 사용됨</p>
<p>  <code>참고</code>
  <a href="https://developer.mozilla.org/ko/docs/Glossary/Semantics">https://developer.mozilla.org/ko/docs/Glossary/Semantics</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React의 state와 props]]></title>
            <link>https://velog.io/@j_hana01/React%EC%9D%98-state%EC%99%80-props</link>
            <guid>https://velog.io/@j_hana01/React%EC%9D%98-state%EC%99%80-props</guid>
            <pubDate>Wed, 05 Apr 2023 05:47:33 GMT</pubDate>
            <description><![CDATA[<p>React의 state와 props에 대해서 설명해주세요.</p>
<p>state는 리액트에서 사용되는데, 컴포넌트 내부에서 변경되는 값을 관리되는 상태관리 데이터이다
state가 변경 될 때마다 setState 함수를 이용해 값을 업데이트 할 수 있다</p>
<p>props는 부모컴포넌트에서 자식컴포넌트로 전달되는 데이터이다.
props는 값이 변경되지 않고 자식 컴포넌트에서는 props값만을 읽을 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[순수 함수란?]]></title>
            <link>https://velog.io/@j_hana01/%EC%88%9C%EC%88%98-%ED%95%A8%EC%88%98%EB%9E%80</link>
            <guid>https://velog.io/@j_hana01/%EC%88%9C%EC%88%98-%ED%95%A8%EC%88%98%EB%9E%80</guid>
            <pubDate>Wed, 05 Apr 2023 05:38:01 GMT</pubDate>
            <description><![CDATA[<p>순수함수는 같은 입력값을 받으면 항상 같은 결과를 리턴하고 함수 외부에 영향을 끼치지 않는 함수를 말한다
예를 들면 다음과 같다</p>
<pre><code>const multiply = (a,b) =&gt; {
    return a * b
}

let numberOne = 5;
let numberTwo = 2;
let total = sum(numberOne * numberTwo);

console.log(numberOne) // 5
console.log(numberTwo) // 2
console.log(total) // 10
</code></pre><p>위와 같이 multiply 함수는 인자로 받은 값을 변경하지 않는 순수함수다
즉 numberOne, numberTwo가 함수에 전달되고 나서도 그 값은 유지가 되고, multiply 함수는 항상 같은 결과를 반환한다. 결과적으로 multiply 함수는 인자로 받은 값의 불변성을 유지한다</p>
<p>또한 순수 함수는 함수가 호출될 때 외부 상태를 변경하거나 외부 상태에 의존하지 않는다. 따라서 다른 코드에 영향을 받지 않는다.(즉 순수 함수는 사이드 이펙트가 없다)</p>
<p>만약 위의 코드를 사이드 이펙트가 있는 함수로 바꿔 본다면 다음과 같을 것이다</p>
<pre><code>let count = 0;
const multiply = (a,b) =&gt; {
    count++
    return a * b
}</code></pre><p>위의 함수는 외부에 있는 변수 count의 값을 변경한다 즉 외부의 상태를 변경하는 것이다
때문에 같은 argument를 입력해도 다른 결과를 리턴할 수 있기 때문에 코드를 이해하고 테스트하기 어렵다</p>
<p>그렇다면 순수 함수는 왜 사용할까? 
같은 입력에 대해 항상 같은 출력을 리턴하기 때문에  테스트와 디버깅이 쉽고 예측 가능한 코드를 작성할 수 있습니다. 또한 코드가 간결하고 외부 코드에 영향을 받지 않기 때문에 재사용 가능하다.
따라서 순수 함수는 주로 비즈니스 로직 등 순수한 계산을 수행하는 함수에서 사용된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cookie의 MaxAge, Expires 옵션]]></title>
            <link>https://velog.io/@j_hana01/Cookie%EC%9D%98-MaxAge-Expires-%EC%98%B5%EC%85%98</link>
            <guid>https://velog.io/@j_hana01/Cookie%EC%9D%98-MaxAge-Expires-%EC%98%B5%EC%85%98</guid>
            <pubDate>Tue, 04 Apr 2023 05:29:15 GMT</pubDate>
            <description><![CDATA[<p><code>expire(유효일자)</code></p>
<ul>
<li>GMT(그리니치 표준시) 포맷으로 설정해야함(date.toUTCstring)으로 변경가능)</li>
<li>우효일자를 과거로 지정하면 쿠키 삭제됨</li>
</ul>
<p><code>max-age</code></p>
<ul>
<li>쿠키 만료 기간 설정가능</li>
<li>설정하고자 하는 만료일시까지 시간을 초로 환산한 값을 설정함</li>
<li>0이나 음수값을 설정하면 쿠키 삭제됨</li>
</ul>
<p>max-age(만료기간), expires(유효일자) 옵션을 설정하지 않으면 브라우저가 닫힐 때 쿠키가 함께 삭제된다
max-age, expires 옵션을 설정하면 브라우저를 닫아도 쿠키가 삭제되지 않는다
왜냐하면 쿠키의 유효일자까지 브라우저가 쿠키를 유지하다가 유효일자에 도달하면 자동으로 삭제하기 때문이다</p>
<p><code>참고</code>
<a href="https://ko.javascript.info/cookie">https://ko.javascript.info/cookie</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[const에 요소나 속성을 추가할 수 있는 이유]]></title>
            <link>https://velog.io/@j_hana01/const%EC%97%90-%EC%9A%94%EC%86%8C%EB%82%98-%EC%86%8D%EC%84%B1%EC%9D%84-%EC%B6%94%EA%B0%80%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@j_hana01/const%EC%97%90-%EC%9A%94%EC%86%8C%EB%82%98-%EC%86%8D%EC%84%B1%EC%9D%84-%EC%B6%94%EA%B0%80%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Mon, 03 Apr 2023 06:28:49 GMT</pubDate>
            <description><![CDATA[<p><code>배열, 객체를 const로 선언했는데 요소나 속성을 추가할 수 있는 이유에 대해서 설명해주세요</code></p>
<pre><code>const numbers = [1,2.3,4]
numbers.push(100) // [1,2,3,4,100]
numbers[0] = 5 // error

const cats = {name: &#39;rey&#39;, gender : &#39;female&#39;};
cats.age = 4 // {name: &#39;rey&#39;, gender : &#39;female&#39;, age:4};
obj.name = &quot;meow&quot; // error </code></pre><p>const로 선언된 변수는 할당된 메모리 주소를 가리킨다. 따라서 배열이나 객체 속성의 추가나 변경은 변수가 참조하는 메모리 주소에서 직접적인 변경을 일으키지 않고 해당 객체 또는 배열에 대한 참조를 통해 내부 값을 변경한다</p>
<p>그러나 배열 요소의 값을 아예 바꾸는 것은 값 자체를 수정하는 것으로 const로 선언된 변수에는 불가능하다.</p>
<p>따라서 const로 선언된 배열과 객체는 재할당이 불가능하지만 내부 값은 변경 가능하다 그래서 위의 예시와 같이 const로 선언한 배열이나 객체에 요소나 속성을 추가할 수 있는 것이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[require와 import의 차이]]></title>
            <link>https://velog.io/@j_hana01/require%EC%99%80-import%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@j_hana01/require%EC%99%80-import%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 03 Apr 2023 06:03:02 GMT</pubDate>
            <description><![CDATA[<p>require와 import 둘 다 모듈을 가져온다고 알고 있는데 차이는 뭘까?</p>
<pre><code>import react from&#39;react&#39;; // import를 사용

const react = require(&#39;react&#39;) // require를 사용
</code></pre><p><code>require</code> </p>
<ul>
<li>일반 node.js 환경에서 모듈을 불러올 때 사용함</li>
<li>동기 방식으로 작동 → 모듈이 완전히 로드가 될 때까지 코드 실행을 차단함</li>
<li>필요한 모듈만 선택적으로 로드할 수 없음</li>
</ul>
<p><code>import</code></p>
<ul>
<li>ES6에서 모듈을 가져오는데 사용되는 새로운 문법</li>
<li>비동기 방식으로 작동 → 모듈이 로딩되는 동안 코드 차단 안 됨</li>
<li>필요한 모듈만 선택적으로 로드할 수 있음 → 메모리 절약</li>
<li>named parameter 지원</li>
</ul>
<p>참고 </p>
<p><a href="https://stackdiary.com/require-vs-import-in-javascript/">Require vs. Import in JavaScript</a></p>
<p><a href="https://medium.com/the-node-js-collection/an-update-on-es6-modules-in-node-js-42c958b890c">An Update on ES6 Modules in Node.js</a></p>
<p><a href="https://www.freecodecamp.org/news/requiring-modules-in-node-js-everything-you-need-to-know-e7fbd119be8">Requiring modules in Node.js: Everything you need to know</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[local storage, session storage, cookie]]></title>
            <link>https://velog.io/@j_hana01/local-storage-session-storage-cookie</link>
            <guid>https://velog.io/@j_hana01/local-storage-session-storage-cookie</guid>
            <pubDate>Fri, 31 Mar 2023 06:15:27 GMT</pubDate>
            <description><![CDATA[<p>Q.<code>브라우저 저장소에 대해서 차이점을 설명해주세요(local storage, session storage, cookie)</code></p>
<p><code>로컬 스토리지</code></p>
<ul>
<li>브라우저나 os가 재시작해도 데이터가 파기되지 않음</li>
<li>동일한 오리진을 가진 모든 창에서 공유되기 때문에 한 창에서 데이터를 설정하면 다른 창에서 변동사항을 볼 수 있음</li>
</ul>
<p><code>세션 스토리지</code></p>
<ul>
<li>로컬스토리지에 비해서 자주 사용되지 않음</li>
<li>페이지를 새로 고침할 때 sessionStorage에 저장된 데이터는 사라지지 않음 
하지만 탭을 닫고 새로 열 때는 사라짐
그런데 하나의 탭에 여러 개의 iframe이 있는 경우엔 동일한 오리진에서 왔다고 취급되기 때문에 sessionStorage가 공유됩니다.</li>
</ul>
<p><code>쿠키</code></p>
<ul>
<li>4kb 용량 제한</li>
<li>서버가 HTTP 응답 헤더(header)의 Set-Cookie에 내용을 넣어 전달하면 브라우저는 이 내용을 자체적으로 브라우저에 저장</li>
<li>브라우저는 사용자가 쿠키를 생성하도록 한 동일 서버(사이트)에 접속할 때마다 쿠키의 내용을 Cookie 요청 헤더에 넣어서 함께 전달</li>
<li>쿠키는 클라이언트 식별과 같은 인증에 가장 많이 쓰임<blockquote>
<ul>
<li>사용자가 로그인하면 서버는 HTTP 응답 헤더의 Set-Cookie에 담긴 “세션 식별자(session identifier)” 정보를 사용해 쿠키를 설정함 -&gt; 사용자가 동일 도메인에 접속하려고 하면 브라우저는 HTTP Cookie 헤더에 인증 정보가 담긴 고윳값(세션 식별자)을 함께 실어 서버에 요청을 보냅니다. -&gt; 서버는 브라우저가 보낸 요청 헤더의 세션 식별자를 읽어 사용자를 식별합니다.</li>
</ul>
</blockquote>
</li>
</ul>
<p><code>참고</code>
<a href="https://ko.javascript.info/cookie">https://ko.javascript.info/cookie</a>
<a href="https://ko.javascript.info/localstorage">https://ko.javascript.info/localstorage</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[css] position]]></title>
            <link>https://velog.io/@j_hana01/css-position</link>
            <guid>https://velog.io/@j_hana01/css-position</guid>
            <pubDate>Thu, 30 Mar 2023 11:02:26 GMT</pubDate>
            <description><![CDATA[<p>position은 문서 상에 어떠한 요소를 배치하는데 사용한다</p>
<p><strong>position: static</strong>
position을 따로 설정하지 않으면 설정되는 기본 속성이다
요소들이 html에 작성된 순으로 브라우저에 나타남
static 속성은 top, bottom, left, right가 적용되지 않음</p>
<p><strong>position: relative</strong>
요소를 원래의 위치에서 벗어나서 배치할 수 있게 해줌
즉 원래의 위치를 기준으로 상대적으로 위치시켜줌</p>
<p><strong>position: absolute</strong>
자신의 상위 요소(부모라고 함)를 배치기준으로 삼음
DOM트리를 따라서 position이 static인 것을 제외한 상위요소를 기준으로 삼으며, 만약 position이 static이 아닌 상위요소가 없다면 body가 기준이 됨.
부모 요소(가까운 상위 요소)를 기준으로 top, left, bottom, right 속성을 적용해야함 
따라서 어떤 요소의 display 속성을 absolute로 설정하면 부모 요소의 display 속성을 relative로 지정해주는 것이 관례.</p>
<p><strong>position: fixed</strong>
요소를 항상 고정된 위치에 배치할 수 있음
viewport(브라우저 전체화면)을 기준으로 함</p>
<p><strong>position: sticky</strong>
최근에 업데이트 된 속성
스티키헤더 등을 만들 때 사용함
말 그대도 스티키하게 고정되어 브라우저를 스크롤할 때 한 자리에 고정되어있다
스티키 헤더 등을 검색해보면 쉽게 이해할 수 있는 속성이다</p>
<p><code>참고</code>
<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/position">https://developer.mozilla.org/en-US/docs/Web/CSS/position</a>
<a href="https://www.daleseo.com/css-position/">https://www.daleseo.com/css-position/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP란?]]></title>
            <link>https://velog.io/@j_hana01/HTTP%EB%9E%80</link>
            <guid>https://velog.io/@j_hana01/HTTP%EB%9E%80</guid>
            <pubDate>Thu, 30 Mar 2023 10:35:37 GMT</pubDate>
            <description><![CDATA[<p><code>HTTP에 대해 설명하고, 알고있다면 HTTP 메세지 구조에 대해 더 자세히 설명해주세요</code></p>
<p><strong>HTTP란?</strong>
HTML 문서와 같은 <code>리소스들을 가져올 수 있도록 해주는 프로토콜</code>입니다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다. 클라이언트-서버 프로토콜이란 (보통 웹브라우저인) 수신자 측에 의해 요청이 초기화되는 프로토콜을 의미합니다. 하나의 완전한 문서는 텍스트, 레이아웃 설명, 이미지, 비디오, 스크립트 등 불러온(fetched) 하위 문서들로 재구성됩니다.(출처 : <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Overview">mdn</a>)</p>
<p>아하 리소스를 가져올 수 있도록 하는 프로토콜이구나...
그런데 프로토콜은 또 뭘까?</p>
<p><strong>프로토콜(protocol)</strong> 은 서로 다른 <code>하드웨어 *</code> 기기 간 데이터 통신 규약을 뜻한다</p>
<ul>
<li>네트워크를 통해 통신 가능한 기기</li>
</ul>
<p>기기들은 다음과 같은 과정을 통해 통신함</p>
<p><code>TCP/IP 4계층</code> - 프로토콜을 규칙의 역할들에 따라 4개로 분류해놓은 것임
<img src="https://velog.velcdn.com/images/j_hana01/post/9dabf8d4-8007-4688-8f45-4a482539079c/image.JPG" alt=""> 출처 : <a href="https://www.slideshare.net/usdrd90/tcpip-4">https://www.slideshare.net/usdrd90/tcpip-4</a></p>
<p><strong>TCP(Transmission Control Protocol)</strong>
서버와 클라이언트 사이 통신 연결 제어
클라이언트와 서버의 연결이 잘 되었는지 확인을 위해 3way handshaking를 사용함</p>
<p><strong>Byte Stream(바이트 스트림)</strong>
큰 데이터를 잘게 쪼개서 전송하는 서비스
3way handshaking를 통해 연결을 확인했으면 데이터를 쪼개서 전송하는 것</p>
<p>↓</p>
<p><strong>IP(internet protocol)</strong>
분할된 데이터 패킷들을 서버로 전송
이때 서버의 주소는 MAC주소(위도 경도주소)로 알 수 있음
(ip주소는 주소의 방향을 알 수 있지만 믿기 힘듦(언제든 변경될 수 있기 때문에)</p>
<p><strong>ARP(Address Resolution Protocol)</strong>
주소를 찾아가는 프로토콜
마치 택배처럼 중간허브에서 다음 배송 허브만 알면 되듯이 중간에서 경유하는 네트워크 기기들이 있는데 이 기기들은 데이터를 전송할 다음 기기의 mac주소만 알면 됨(총 도착 루트는 알 수 없음)</p>
<hr>
<p><strong>HTTP 메세지 구조</strong>
http 프로토콜에서 클라이언트와 서버간의 통신이 일어남
클라이언트가 서버에 리소스를 요청하는 것을 <code>request</code>, 서버가 클라이언트에 요청을 받아 리소스를 제공하는 것을 <code>response</code>라고 함</p>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/8f1717fa-5f19-4af5-ba2b-1a8c67315b5d/image.png" alt=""></p>
<p>request는 메소드, 프로토콜 버전, 헤더, 바디로 구성되어 있음
response는 프로토콜버전, 상태코드, 상태코드 설명, 헤더, 바디로 구성되어 있음
조금 더 자세한 설명은 <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Messages">여기</a>를 참고하자
<br>
<strong>http 프로토콜 특성</strong></p>
<ul>
<li><p>stateless</p>
<ul>
<li>새로운 리퀘스트를 보낼 때마다 새로운 리스폰스를 보냄(과거정보 남기지 않음)</li>
<li>상태와 무관 -&gt; 확장이 쉬움</li>
</ul>
</li>
<li><p>리퀘스트에서 url로 리소스를 식별함(url: 리소스 식별자)</p>
</li>
</ul>
<p><code>참고</code>
<a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Overview">https://developer.mozilla.org/ko/docs/Web/HTTP/Overview</a>
<a href="https://www.youtube.com/watch?v=IjxkKQvn8Bc">https://www.youtube.com/watch?v=IjxkKQvn8Bc</a>
<a href="https://www.mobiinside.co.kr/2022/09/08/http/">https://www.mobiinside.co.kr/2022/09/08/http/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[캐시(Cache)란?]]></title>
            <link>https://velog.io/@j_hana01/%EC%BA%90%EC%8B%9CCache%EB%9E%80</link>
            <guid>https://velog.io/@j_hana01/%EC%BA%90%EC%8B%9CCache%EB%9E%80</guid>
            <pubDate>Wed, 29 Mar 2023 06:14:13 GMT</pubDate>
            <description><![CDATA[<p><code>캐시의 장단점과 어떤 부분에 활용하는지 설명해주세요. 프론트엔드에서 캐시를 사용할 수 있는 2~3가지 영역을 제시해주세요</code></p>
<p>캐시(Cache)는 가져오는데 비용이 드는 데이터를 한 번 가져온 후에 임시로 저장해두는 것이다</p>
<p><code>장점</code></p>
<ul>
<li>빠른 데이터 검색 및 액세스: 캐시에 데이터를 저장 -&gt; 데이터를 다시 가져오는 데 필요한 시간과 네트워크 대역폭을 줄일 수 있음</li>
<li>서버 부하 감소: 캐시를 사용하면 클라이언트가 데이터를 요청할 때마다 서버에서 데이터를 다시 생성하거나 가져올 필요가 없기 때문에 서버의 부하를 줄일 수 있음</li>
<li>대역폭 절약: 캐시를 사용하면, 반복적으로 요청되는 데이터의 경우 브라우저와 서버 간의 데이터 전송 양을 줄일 수 있음</li>
</ul>
<p><code>단점</code></p>
<ul>
<li>캐시 일관성 유지: 캐시에 저장된 데이터가 최신 상태인지 확인하고 유지하는 것은 복잡한 작업임</li>
<li>공간 제약: 캐시에 저장된 데이터의 크기는 메모리나 디스크 용량에 제한됨</li>
<li>데이터 무효화: 캐시에 저장된 데이터를 무효화하거나 갱신하는 방법을 정의하지 않으면 캐시된 데이터가 오래된 상태로 남아 있을 수 있음</li>
</ul>
<p>그렇다면 프론트엔드 영역에서 캐시를 사용할 수 있는 곳은 어딜까?</p>
<ol>
<li><p>이미지 캐싱: 이미지 파일은 용량이 크기 때문에 서버에서 매번 다운로드하는 것은 부담스러움. 이미지 캐싱을 통해 이미지 파일을 로컬에 저장하여 다시 다운로드하지 않도록 할 수 있음</p>
</li>
<li><p>데이터 캐싱: 서버에서 가져온 데이터를 캐시에 저장하여 다시 요청할 때마다 서버에서 데이터를 다시 가져오지 않도록 할 수 있음 이를 통해 서버 부하를 줄일 수 있으며, 빠른 데이터 로딩을 향상시킬 수 있음</p>
</li>
<li><p>코드 캐싱: 라이브러리나 프레임워크의 경우 매번 로드하는 것은 부담스러울 수 있음 
따라서, 코드 캐싱을 통해 라이브러리나 프레임워크를 로컬에 저장하여 다시 다운로드하지 않도록 코드를 캐싱함</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[프레임워크, 라이브러리 차이점]]></title>
            <link>https://velog.io/@j_hana01/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@j_hana01/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Wed, 29 Mar 2023 05:21:26 GMT</pubDate>
            <description><![CDATA[<p><code>프레임워크와 라이브러리 차이점에 대해 설명해주세요.</code></p>
<p>프레임워크와 라이브러리는 개발을 쉽게 할 수 있도록 도와주는 도구이다
하지만 분명 차이점은 있다</p>
<p>먼저 프레임워크란 말을 살펴보면 frame과 work를 합친 말이다
frame은 틀이라는 뜻인데 프레임 안에서 일을 한다고 볼 수 있다
즉, 프레임워크는 응용 프로그램이나 소프트웨어의 솔루션 개발을 수월하게 하기 위해 <code>제공된 소프트웨어 환경</code>을 말한다
프레임워크의 <code>특징</code>은 다음과 같다</p>
<ul>
<li>소프트웨어 형식을 제공</li>
<li>응용 프로그램이 수동적으로 프레임워크에 의해 사용됨</li>
<li>사용 규칙이 정해져있어 이를 따라야 함
ex: nextJS, spring framework</li>
</ul>
<p>라이브러리는 간단하게 말하자면 가져다가 사용할 수 있는 것이다
좀 더 자세하게 말해보자면 library라는 말 자체가 도서관을 의미하는데
보통 우리가 도서관에 가면 수 많은 책들을 모아놓은 도서관 안에서 자신이 필요로하는 책만 꺼내 읽거나 대출을 한다
이처럼 프로그래밍에서 사용하는 라이브러리는 응용 프로그램 개발을 위해 <code>필요한 기능을 모아놓은 소프트웨어</code>를 말한다
그래서 라이브러리에서 우리가 필요로 하는 기능(함수)만 꺼내서 사용을 하는 것이다
이런 라이브러리의 특징은 아래와 같다</p>
<ul>
<li>라이브러리는 다른 라이브러리에 의존하지 않는다(독립성을 가짐)</li>
<li>응용 프로그램이 능동적으로 라이브러리를 사용한다</li>
<li>작은 기능들을 함수 단위로 만들어 제공
ex: jQuery, React, redux</li>
</ul>
<p><code>참고</code>
<a href="https://youtu.be/t9ccIykXTCM">https://youtu.be/t9ccIykXTCM</a>
<a href="https://youtu.be/2Ja7wYIZEtI">https://youtu.be/2Ja7wYIZEtI</a>
<a href="https://youtu.be/We8JKbNQeLo">https://youtu.be/We8JKbNQeLo</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[parameter, argument란?]]></title>
            <link>https://velog.io/@j_hana01/parameter-argument%EB%9E%80</link>
            <guid>https://velog.io/@j_hana01/parameter-argument%EB%9E%80</guid>
            <pubDate>Tue, 28 Mar 2023 04:54:17 GMT</pubDate>
            <description><![CDATA[<p>parameter(매개변수)
함수 등 서브루틴의 input으로 제공되는 여러 데이터 중 하나를 가리키기 위해 사용되는 <strong>변수의 한 종류</strong></p>
<ul>
<li>서브루틴 : 하나 이상의 장소에서 필요할 때마다 반복해서 사용할 수 있는
부분적 프로그램
즉, <strong>역할에 대한 정의를 위해 선언하는 변수</strong></li>
</ul>
<p>argument
<strong>연산의 근거를 제공하기 위해 전달되는 값</strong></p>
<p>그러면 어떨 때 parameter, argument라고 해야할까?
메소드 선언부에서 정의한 변수 : parameter
메소드 호출부에서 전달하는 값 : argument</p>
<p><code>예시</code></p>
<pre><code>const addNumbers = (a,b) =&gt; {
    return a+b
}

addNumbers(1,2) // 3</code></pre><p>여기서 a,b가 parameter이고 1,2가 argument이다</p>
<p><code>참고</code>
<a href="https://youtu.be/fW1WGmj10rA">https://youtu.be/fW1WGmj10rA</a>
<a href="https://youtu.be/-oWgayStu8Q">https://youtu.be/-oWgayStu8Q</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[호이스팅, TDZ란?]]></title>
            <link>https://velog.io/@j_hana01/let-const-var-%EB%AD%90%EA%B0%80%EB%8B%A4%EB%A5%BC%EA%B9%8C</link>
            <guid>https://velog.io/@j_hana01/let-const-var-%EB%AD%90%EA%B0%80%EB%8B%A4%EB%A5%BC%EA%B9%8C</guid>
            <pubDate>Tue, 28 Mar 2023 04:36:06 GMT</pubDate>
            <description><![CDATA[<p><code>var</code></p>
<ul>
<li>한번 선언된 변수를 다시 선언할 수 있음
ex: var cat = cute
console.log(cat) // cute</li>
</ul>
<p>var cat = pretty
console.log(cat) = pretty</p>
<ul>
<li>var는 선언하기 전에 사용할 수 있음<pre><code>console.log(catName) // undefined
</code></pre></li>
</ul>
<p>carName = &#39;Rey&#39;;</p>
<pre><code>
-&gt; catName을 선언하기 전에 콘솔을 찍었는데 에러가 아니라 undefined이 나왔다 왜일까?
</code></pre><p>var catName;</p>
<p>console.log(catName); // undefined</p>
<p>catName = &#39;Rey&#39;;</p>
<p>console.log(catName); // Rey</p>
<pre><code>여기서 호이스팅이라는 개념이 나온다
즉 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것처럼 행동하는 것이 호이스팅이다
그렇다고 진짜 변수 선언을 최상단에 둔다는게 아니라 자바스크립트가 코드를 
위에서 아래로 읽어나가면서 변수 등의 정보를 환경레코드(Environment record, 식별자와 식별자에 바인딩된 값을 기록해두는 객체)에 기록해놓기 때문임

위의 예시에서 catName이라는 변수 선언은 호이스팅되고 &#39;Rey&#39;라는 할당된 값은 호이스팅이 되지 않기 때문에 두 번째 줄에서 undefined가 나오는 것이다

같은 경우 let와 const는 에러가 뜬다
그렇다면 let과 const는 호이스팅되지 않는 것일까? 아니다 !
let과 const는 TDZ의 영향을 받기 때문에 에러를 일으키는 것이다
그럼 TDZ란 뭘까? 
선언 이전에 식별자를 참조할 수 없는 구역을 뜻한다

</code></pre><h2 id="consolelogcatname--------tdz">console.log(catName);        //TDZ</h2>
<p>const catName = &#39;Ray&#39; // 선언 및 할당</p>
<p>console.log(catName); // 사용가능 </p>
<p>```
TDZ안에 선언된 변수는 사용하지 못함
따라서 맨 윗줄은 사용불가능함</p>
<p>var를 사용시 선언과 초기화가 동시에 이루어짐</p>
<ul>
<li>선언 : 메모리 공간을 확보하고 식별자와 연결</li>
<li>초기화 : 식별자에 암묵적으로 undefined 값 바인딩 </li>
</ul>
<p>let, const를 사용시 초기화를 하지 않음
따라서 할당문 직전까지는 값이 할당되지 않고 이렇게 되면 값을 읽어올 수 없기 때문에 TDZ가 생김 -&gt; 에러</p>
<p><code>참고</code>
<a href="https://youtu.be/EWfujNzSUmw">https://youtu.be/EWfujNzSUmw</a>
<a href="https://youtu.be/ocGc-AmWSnQ">https://youtu.be/ocGc-AmWSnQ</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[취업스터디] 1일차 ]]></title>
            <link>https://velog.io/@j_hana01/%EC%B7%A8%EC%97%85%EB%8C%80%EB%B9%84%EB%B0%98-1%EC%9D%BC%EC%B0%A8-cs-%EA%B3%BC%EC%A0%9C</link>
            <guid>https://velog.io/@j_hana01/%EC%B7%A8%EC%97%85%EB%8C%80%EB%B9%84%EB%B0%98-1%EC%9D%BC%EC%B0%A8-cs-%EA%B3%BC%EC%A0%9C</guid>
            <pubDate>Tue, 28 Mar 2023 00:47:56 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>웹페이지가 브라우저에 랜더링되는 과정을 설명해주세요.
<a href="https://velog.io/@j_hana01/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC">링크</a>에 정리해놓았습니다</p>
</li>
<li><p>Restful API에 대해 설명해주세요. GET,POST 외에 알고있는 메소드와 그 기준을 설명해주세요. RESTful API 가 아닌 것들은 어떤게 있나요?</p>
</li>
</ol>
<p>REST(Representational State Transfer)</p>
<ul>
<li>클라이언트와 서버의 통신 방식</li>
<li>네트워크 리소스를 정의하고 처리하는 방법을 설명하는 일련의 원칙을 기반으로 하는 아키텍처스타일
ex) 클라이언트와 서버가 데이터를 주고 받는 방식을 정리한 원칙을 기반으로하는 아키텍쳐스타일</li>
</ul>
<p>RESTful</p>
<ul>
<li>REST가 적용된 시스템
즉 REST에 대한 원칙을 준수했을 때 RESTful하다고 함</li>
</ul>
<p>REST API
: REST가 적용된 API(= REST의 아키텍쳐 스타일 적용한 API, REST-style의 API)</p>
<p>GET과 POST이외에 DELETE와 PUT, PATCH가 있다
PUT은 전체를 덮어씌워 업데이트하고 PATCH는 일부분만 업데이트한다</p>
<p>RESTful api속하지 않는 것은 다음과 같다
SOAP (Simple Object Access Protocol) API: SOAP은 REST와 달리 XML 메시지를 사용하여 데이터를 전송합니다. 또한, SOAP은 보안 및 트랜잭션 처리와 같은 고급 기능을 제공하기 위해 WSDL (Web Services Description Language)과 같은 복잡한 기술을 사용합니다.</p>
<p>RPC (Remote Procedure Call) API: RPC는 간단한 HTTP 호출보다 더 많은 처리를 필요로 하며, 일반적으로 서버-클라이언트 애플리케이션에서만 사용됩니다.</p>
<p>GraphQL API: GraphQL은 REST와 비교하여 쿼리를 더욱 유연하게 처리할 수 있습니다. 하지만, GraphQL은 단일 엔드포인트와 비동기 쿼리를 사용하므로 RESTful API와는 매우 다릅니다.</p>
<p>FTP (File Transfer Protocol): FTP는 파일 전송을 위한 프로토콜이며, RESTful API와는 직접적인 관련이 없습니다.</p>
<p>WebSocket API: WebSocket은 양방향 통신을 위한 프로토콜입니다. RESTful API는 단방향 통신을 위한 것이므로 WebSocket API는 RESTful API에 속하지 않습니다.</p>
<p>참고 : <a href="https://youtu.be/NODVCBmyaXs">https://youtu.be/NODVCBmyaXs</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스, 스레드]]></title>
            <link>https://velog.io/@j_hana01/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@j_hana01/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C</guid>
            <pubDate>Fri, 24 Mar 2023 07:00:48 GMT</pubDate>
            <description><![CDATA[<p><strong>프로그램이란?</strong>
어떤 작업을 위해 운영체제 위에서 실행할 수 있는 파일
(ex: 크롬, 카톡, 슬랙 등)</p>
<p><strong>프로세스란?</strong>
운영체제 위에서 실행중인 프로그램
프로그램 명령어와 데이터들이 메모리에 올라오고 실행 중 또는 실행 대기 중인 상태</p>
<p>프로그램이 프로세스가 되기 위해서는 다음과 같은 일이 생김
-&gt; 프로세스는 독립된 메모리를 할당받음. 프로세스가 할당받은 메모리를 관리하기 위해 관리하는 공간이 있는데 이를 <code>프로세스 주소 공간</code>이라고 함. 프로세스 주소 공간에는 <u>code, data, heap, stack*</u> 으로 구성됨</p>
<p><code>*</code>
code : 코드 자체를 구성하는 메모리 영역(실행명령 포함)
data : 정적 변수, 전역 변수
heap : 동적 메모리 영역(동적 할당 시 사용 new(), malloc()등)
stack : 지역 변수, 함수 매개변수, 반환 값 등 일시적인 데이터
기본적으로 프로세스마다 최소 1개의 스레드(main thred를 가짐)</p>
<p>-&gt; 해당 프로세스에 대한 정보를 담고 있는 <strong>PCB 블럭</strong> * 생성</p>
<ul>
<li><strong>PCB (process control block)</strong>
프로세스를 제어하기 위한 정보 모음</li>
</ul>
<p><img src="https://velog.velcdn.com/images/j_hana01/post/fd10cb92-9734-4a03-9385-3f3678b01b01/image.png" alt="">
출처 : <a href="https://www.tutorialspoint.com/what-is-process-control-block-pcb">https://www.tutorialspoint.com/what-is-process-control-block-pcb</a></p>
<p><u>프로세스 상태</u>
프로세스 상태(신규, 준비됨, 실행 중, 대기 중 또는 종료됨)를 지정</p>
<p><u>프로세스 번호</u>
특정 프로세스의 유니크한 고유 번호</p>
<p><u>프로그램 카운터</u>
프로세스에서 실행해야 하는 다음 명령어의 주소가 포함</p>
<p><u>레지스터</u>
프로세스에서 사용하는 레지스터를 지정함 
누산기, 인덱스 레지스터, 스택 포인터, 범용 레지스터 등이 포함될 수 있음</p>
<p><u>열린 파일 목록</u>
프로세스와 관련된 다양한 파일</p>
<p><u>CPU 스케줄링 정보</u>
프로세스 우선순위, 스케줄링 대기열에 대한 포인터 등은 PCB에 포함된 CPU 스케줄링 정보 여기에는 다른 스케줄링 매개변수도 포함될 수 있음</p>
<p><u>메모리 관리 정보</u>
메모리 관리 정보에는 사용된 메모리 시스템에 따라 페이지 테이블 또는 세그먼트 테이블이 포함.
기본 레지스터, 제한 레지스터 등의 값도 포함됩니다.</p>
<p><u>I/O 상태 정보</u>
프로세스에서 사용하는 I/O 장치 목록, 파일 목록 등이 포함</p>
<p><u>계정 정보</u>
시간 제한, 계정 번호, CPU 사용량, 프로세스 번호 등은 모두 PCB 계정 정보의 일부</p>
<br>

<p><strong>프로세서란?</strong>
프로세스가 동작<code>*</code> 될 수 있도록 하는 하드웨어(cpu)</p>
<p><code>*</code>동작 -&gt; 프로그램들의 자원들이 메모리에 올라오고 실행되어야 할 코드의 메모리 주소를 cpu의 레지스터로 올리는 것</p>
<p>cpu(프로세서)는 한 번에 하나의 프로세스만 실행할 수 있음
-&gt; 근데 어떻게 우리는 멀티태스킹을 할 수 있을까??
-&gt; 운영체제가 짧은 시간에 수십번에서 수천번 실행할 프로세스를 교체하고 있기 때문에 우리는 동시에 여러 개의 작업이 실행되고 있다고 느끼는 것</p>
<br>

<p><strong>스레드란?</strong>
프로세스 내에서 실행되는 작업 흐름의 단위
한 프로세스 내에서 구분지어진 실행단위
다수의 스레드가 있을 경우 공유되는 자원이 있음(스택빼고 다 공유)</p>
<p><strong>멀티 프로세스 vs 멀티 스레드</strong>
둘 다 어플리케이션에 대한 처리방식의 일종</p>
<p>예를 들면 다수의 사용자가 로그인을 요청하는 상황을 가정
한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시에 처리x
그래서 부모프로세스가 fork하여 자식 프로세스를 만들어 일을 처리하게끔 함 </p>
<p><strong>프로세스와 스레드의 장단점</strong></p>
<p><strong>프로세스</strong></p>
<ul>
<li>각 프로세스는 독립적인 메모리 공간을 가짐</li>
<li>IPC를 사용한 통신</li>
<li>자원 소모적, 개별 메모리 차지</li>
<li>컨텍스트 스위칭 비용이 큼</li>
<li>동기화 작업이 필요하지 않음</li>
</ul>
<p><strong>스레드</strong></p>
<ul>
<li>스레드끼리 긴밀하게 연결됨</li>
<li>공유된 자원으로 통신 비용 절감</li>
<li>공유된 자원으로 메모리가 효율적임</li>
<li>컨텍스트 스위칭 비용이 적음</li>
<li>공유 자원 관리를 해야함</li>
<li>한 스레드에 문제가 생기면 전체 프로세스에 영향이 감</li>
</ul>
<hr>
<p>참고로 유튜브 우아한테크 테코톡(<a href="https://youtu.be/1grtWKqTn50">https://youtu.be/1grtWKqTn50</a>, <a href="https://youtu.be/DmZnOg5Ced8)%EA%B3%BC">https://youtu.be/DmZnOg5Ced8)과</a> 쉬운코드(<a href="https://youtu.be/QmtYKZC0lMU)%EC%9D%98">https://youtu.be/QmtYKZC0lMU)의</a> 영상 내용들을 정리한 글입니다
혹시라도 문제가 있을 시 말씀해주세요</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DB, DBMS, database system]]></title>
            <link>https://velog.io/@j_hana01/DB-DBMS</link>
            <guid>https://velog.io/@j_hana01/DB-DBMS</guid>
            <pubDate>Wed, 22 Mar 2023 13:05:54 GMT</pubDate>
            <description><![CDATA[<p>유튜브 <a href="https://youtu.be/aL0XXc1yGPs">쉬운코드</a>와 스파르타코딩클럽 db특강을 정리한 내용입니다!
틀린 게 있다면 말씀해주세요</p>
<hr>
<p><strong>DB란?</strong>
전자적으로 저장되고 사용되는, 관련있는 데이터들의 조직화된 모음</p>
<p>왜 조직화 해놓을까?
-&gt; 데이터가 조직화되어있지 않고 흩어져있다면 원하는 데이터를 빠르고 쉽게 찾기 어렵고 중복된 데이터가 있는지, 관련된 데이터가 얼마나 있는 지 등을 관리하기 어려울 것이다
데이터를 조직화함으로써 원하는 데이터를 신속하게 찾을 수 있고 불필요한 데이터가 중복으로 생성되는 것도 막을 수 있음</p>
<p><strong>database system이란?</strong>
database + DBMS + 연관된 어플리케이션 -&gt; 줄여서 databse라고 부름
문맥에 따라서 무엇을 의미하는지 잘 보자</p>
<p><strong>DBMS(DataBase Management Systems)란?</strong>
사용자에게 DB를 정의하고 만들고 관리하는 기능을 제공하는 소프트웨어 시스템</p>
<p>-&gt; db는 그저 데이터가 나열된 것이기 때문에 이를 제어하거나 백업, 튜닝, 모니터링 등을 하기 위해 프로그램이 필요함. 이 프로그램이 DBMS임(ex: MySQL, Postgre SQL 등)
-&gt; 데이터베이스를 관리하고 저장하는 방식에 따라 유형이 구분됨 -&gt; RDBMS, NoSQL</p>
<p><strong>관계형 데이터 베이스(RDBMS)</strong></p>
<ul>
<li>데이터가 행과 열로 저장되고 사전에 정의한 관계로 데이터를 구성한 데이터베이스 시스템(엑셀처럼 생김)</li>
<li>테이블에 사전 정의된 내용에 부합하는 형태의 데이터만 삽입가능</li>
</ul>
<p><u>장점</u> </p>
<ul>
<li>직관적</li>
<li>테이블 간의 관계 파악하기 쉬움, 정확함</li>
</ul>
<p><u>단점</u></p>
<ul>
<li>성능을 향상시키려면 비용이 많이 듦</li>
</ul>
<br>

<p><strong>비관계형 데이터 베이스(NoSQL, Not only SQL)</strong>
RDBMS를 제외한 나머지를 비관계형 데이터베이스라고 함
RDBMS보다 유연하게 데이터를 읽고 쓸 수 있음
-&gt; 갑자기 왜 등장?
다양한 데이터를 축적하게 되면서 데이터의 복잡도와 양이 늘어남 -&gt; 기존 RDBMS의 장점인 정확성이 그렇게 중요하지 않게 되었음</p>
<br>

<p><strong>정리</strong></p>
<table>
<thead>
<tr>
<th></th>
<th>SQL(RDBMS)</th>
<th>NoSQL</th>
</tr>
</thead>
<tbody><tr>
<td>데이터 저장 구조</td>
<td>열과 행이 있는 테이블</td>
<td>Key-value, document, column, 등 다양</td>
</tr>
<tr>
<td>데이터 사전 정의</td>
<td>엄격하게 column에 대한 정의 필요</td>
<td>SQL보다 유연하다.</td>
</tr>
<tr>
<td>확장</td>
<td>Scale Up(수직 확장)</td>
<td>Scale Out(수평 확장)</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>