<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Lazyro.log</title>
        <link>https://velog.io/</link>
        <description>모르면배우면되지.</description>
        <lastBuildDate>Wed, 06 Mar 2024 09:07:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Lazyro.log</title>
            <url>https://velog.velcdn.com/images/jin_zero/profile/d3460c22-4deb-436a-b42e-bf112f6ce364/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Lazyro.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jin_zero" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[파이썬 기초문법 02 - 함수, 지역변수와 전역변수 ]]></title>
            <link>https://velog.io/@jin_zero/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%95-02-%ED%95%A8%EC%88%98-%EC%A7%80%EC%97%AD%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@jin_zero/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%95-02-%ED%95%A8%EC%88%98-%EC%A7%80%EC%97%AD%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98</guid>
            <pubDate>Wed, 06 Mar 2024 09:07:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jin_zero/post/ea48b3e1-6cc0-4bd7-9e00-29be3f21cd78/image.jpg" alt=""></p>
</br>

<h2 id="함수">함수</h2>
<ul>
<li>어떤 입력 값을 받아서 결과를 만들어 주는 것</li>
<li>엑셀 함수를 생각하면 쉬움</li>
<li>프로그래밍에서 <strong>함수란 특정 기능을 수행하는 코드</strong></li>
<li>엑셀에서는 이미 만들어진 함수를 주로 호출함</li>
<li>파이썬(프로그래밍)에서는 필요한 함수를 프로그래머가 직접 개발할 수 있음.</li>
</ul>
<h2 id="파이썬에서-함수-만들기">파이썬에서 함수 만들기</h2>
<ul>
<li><p>프로그래밍에서는 함수를 만드는 것을 = 함수를 정의한다 , 라고 표현함.</p>
</li>
<li><p>파이썬 함수를 정의할 때 규칙</p>
<ul>
<li><p>def 키워드를 사용하여 함수를 만들 수 있음.</p>
</li>
<li><p>함수의 이름이 필요(변수 이름과 같은 규칙)</p>
</li>
<li><p>함수의 입력이 있는 경우 입력 값들을 바인딩할 변수를 적어 줌</p>
</li>
<li><p>들여쓰기 후 함수가 호출될 때 수행할 문장을 기술함.</p>
<pre><code class="language-python">def 함수이름():
  코드 

def sum(A1, A2, A3): #첫째 값을 A1, 두번째는 A2 등 바인딩할 변수 = 인자값
  코드 #앞에 들여쓰기 하고, 호출될 때 수행할 문장을 기술함. </code></pre>
</li>
</ul>
</li>
</ul>
<h2 id="함수-정의">함수 정의</h2>
<ul>
<li>함수 이름은 별찍기<ul>
<li>함수의 기능은 별을 출력</li>
<li>함수 이름은 들여쓰기 된 코드를 바인딩</li>
<li>그러니까 별찍기는 들여쓰기 된 코드들을 바인딩하게됨.</li>
</ul>
</li>
</ul>
<h2 id="파이썬-변수와-함수의-차이점">파이썬 변수와 함수의 차이점</h2>
<ul>
<li><p>파이썬 변수는 값에 대한 이름표</p>
<ul>
<li>어떤 값이 자주 사용될 때 값에 이름표를 붙이는 개념임.</li>
<li>변수는 값을 바인딩 함.</li>
</ul>
</li>
<li><p>파이썬 함수는 어떤 코드에 대한 이름표</p>
<ul>
<li>어떤 코드가 자주 사용될 때 코드에 이름표를 붙이는 개념.</li>
<li>함수는 코드를 바인딩 함.</li>
</ul>
</li>
</ul>
<h2 id="파이썬-함수-호출">파이썬 함수 호출</h2>
<ul>
<li>파이썬 함수의 이름은 코드 객체를 바인딩</li>
<li>함수 이름이 바인딩하고 있는 코드를 수행하는 것을 함수 호출이라고 부름</li>
<li>함수 호출 방법<ul>
<li>함수 이름()</li>
<li>소괄호가 함수 호출을 의미함</li>
</ul>
</li>
</ul>
<h2 id="함수-호출의-이해">함수 호출의 이해</h2>
<ul>
<li>파이썬 코드는 기본적으로 위에서 아래로 순차적으로 실행 됨</li>
<li>파이썬 인터프리터는 def 키워드를 만나면 코드를 메모리에 할당하고 이를 함수 이름이 바인딩</li>
</ul>
<pre><code class="language-python">def mysum(a,b):
    ret = a+b
    return ret</code></pre>
<ul>
<li>함수를 호출할 때, 정의에서 2개를 받기로 했으면 두개를 받아줘야 함.</li>
<li>mysum은 코드 객체를 바인딩하고 있음.</li>
<li>하지만 메모리에 위치만 알고 있는 상태기 때문에, 내가 함수를 사용하기 위해 함수를 호출할 때는 인자값을 넣어줘서 불러내야함.</li>
</ul>
<h2 id="함수-호출의-이해2">함수 호출의 이해(2)</h2>
<ul>
<li>함수 이름에 ‘()’를 붙이면 해당 함수가 호출 됨<ul>
<li>함수의 호출이란 함수 이름이 가리키는 코드의 실행을 의미함</li>
<li>인터프리터는 코드를 실행하기 위해 함수로 이동</li>
</ul>
</li>
</ul>
<pre><code class="language-python">def mysum(a,b):
    ret = a+b
    return ret

ret1 = mysum(3,4)
#ret1은 7이 되는거겠지? </code></pre>
<h2 id="함수-호출의-이해3">함수 호출의 이해(3)</h2>
<ul>
<li>함수 호출의 1단계 : <strong>입력 값 바인딩</strong><ul>
<li>함수 정의부의 변수(파라미터)는 함수 호출부에 전달한 값(인자/Argument)를 바인딩한다.</li>
<li>a = 3, b =4</li>
</ul>
</li>
<li>함수 호출의 2단계 :  함수 실행<ul>
<li>함수 내에 들여쓰기 된 코드가 수행됨.</li>
<li>ret = a + b / 3+4 , 이제 ret는 7을 바인딩하게 됨.</li>
</ul>
</li>
<li>함수 호출의 3단계 : 결괏값 리턴<ul>
<li>함수 내에서 사용된 변수 소멸 / a,b,ret가 다 없어짐</li>
<li>바인딩 되지 않은 객체(참조되지 않은 값)는 소멸됨.</li>
<li>인터프리터는 함수 호출부로 돌아감.</li>
<li>여기서 ret가 소멸되므로 mysum(3,4)는 7인데 왼쪽에 있던 ret1이 7이라는 값을 바인딩하게 됨.</li>
<li>리턴이 되면서, 3과 4는 아무도 가리키지 않기 때문에 지워지게 되지만 7은 함수 바깥쪽에 있는 ret1이라는 변수가 가리키고 있기 때문에</li>
<li>결과값은 계속 남아있게 되는 것!!</li>
</ul>
</li>
<li>= 함수를 호출할 때 결과값을 바깥에서 바인딩 해주는 이유!</li>
</ul>
<h2 id="연습문제">연습문제</h2>
<pre><code class="language-python">num = 10

def foo()
    num = 20

foo()
print(num)</code></pre>
<ul>
<li>다음 코드를 실행할 때 출력되는 값은?<ul>
<li>정답<ol>
<li>num은 10을 바인딩하게 됨. </li>
<li>foo라는 함수는 들여쓰기 된 코드를 바인딩 하는 중 </li>
<li>foo() 인터프리터가 foo를 수행함. 이 때 num이 20을 가르키게 된다. 명시적으로 리턴하지 않았을 때 return none이 리턴됨. 
하지만! 이 num은 함수 foo안에서의 num이다. 인자값이 없으므로 foo()를 실행했을 때, return none이 되면서 
함수 내에 사용된 변수 소멸(num 소멸), 참조되지 않은 값도 소멸(20 소멸) </li>
<li>함수 foo() 호출이 끝나고, 여전히 함수 바깥에서 num은 10을 가리키고 있기에 print(num)은 10이다. </li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="전역-변수와-지역-변수">전역 변수와 지역 변수</h2>
<ul>
<li>전역 변수<ul>
<li>함수 밖에서 정의한 변수</li>
<li>특정 파이썬 파일에 정의된 변수 / 파일 단위로 계속 유지</li>
</ul>
</li>
<li>지역 변수<ul>
<li>함수 내에서 정의된 변수</li>
<li>함수가 호출되는 그 순간에만 존재함</li>
</ul>
</li>
</ul>
<pre><code class="language-python">a = 10 # 전역 변수

def test():
    b = 20 # 지역 변수 / 함수 호출 끝나면 없어짐. 
    print(b)

test()</code></pre>
<h2 id="legb-규칙">LEGB 규칙</h2>
<ul>
<li>LGEB 규칙(rule)<ul>
<li>파이썬에서 변수에 값을 바인딩하거나 변수를 참조할 때 LEGB 규칙을 따름.</br>


</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th>SCOPE</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>local</td>
<td>local의 약자로 함수 안을 의미한다.</td>
</tr>
<tr>
<td>enclosing</td>
<td>enclossed function locals의 약자로 내부 함수에서 자신의 외부 함수의 범위를 의미한다. 함수와 함수 사이</td>
</tr>
<tr>
<td>global</td>
<td>global의 약자로 함수 바깥쪽을 의미한다.</td>
</tr>
<tr>
<td>built-in</td>
<td>built-in의 약자로 open, range등과 같은 파이썬 내장 함수를 의미한다.</td>
</tr>
</tbody></table>
 </br>
 [파이썬 강의 참고](https://youtu.be/jkwNBOyzSvQ?feature=shared)


 </br>
 궁금하신 점은 댓글 달아주세요!
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 문법 01. 데이터 타입 ~ 반복문]]></title>
            <link>https://velog.io/@jin_zero/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-01.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@jin_zero/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-01.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Mon, 29 Jan 2024 09:28:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jin_zero/post/5f4e28d1-7f6d-4438-a415-5183e4b60c17/image.png" alt=""></p>
<h2 id="파이썬-기본-데이터-타입">파이썬 기본 데이터 타입</h2>
<ul>
<li><p>파이썬 기본 데이터 타입</p>
<ul>
<li><p>각 데이터를 효율적으로 다루기 위해 타입(type)으로 나눔</p>
<table>
<thead>
<tr>
<th>데이터 타입</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>정수(int)</td>
<td>양의 정수, 음의 정수 (0,1,2,-1,-2 …)</td>
</tr>
<tr>
<td>실수(float)</td>
<td>0.03, 3.14232…</td>
</tr>
<tr>
<td>문자열(float)</td>
<td>- 작은 따옴표나 큰 따옴표로 둘러싸인 문자</td>
</tr>
</tbody></table>
</li>
<li><p>문자와 문자열을 구분하지 않음</p>
</li>
<li><p>“p”,”python3”,”3”</p>
</li>
<li><p>따옴표로 둘러싸인 것은 다 문자 </p>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="파이썬-변수variable">파이썬 변수(variable)</h2>
<ul>
<li><p>변수란?</p>
<ul>
<li><p>파이썬에서 <strong>자주 사용하는 값에 대한 이름표</strong></p>
</li>
<li><p>변수(이름)을 통해 값에 접근할 수 있음</p>
</li>
<li><p>아이스크림 = 1500 이면, 아이스크림이라는 변수에 1500이라는 메모리를 할당한 것</p>
</li>
<li><p>그리고 이 때 아이스크림이라는 변수는 1500이라는 값의 위치를 바인딩 하는 것이다.</p>
</li>
<li><p>아이스크림 * 10 = 15000 , 이렇게 더 쉽게 코드 해석이 가능해짐</p>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="바인딩의-의미">바인딩의 의미</h2>
<ul>
<li><p>변수는 값을 바인딩 함</p>
<ul>
<li>값이 메모리에 할당된 주소를 기억함</li>
</ul>
</li>
</ul>
<pre><code>- 아이스크림 = 1500 이면,

- id(아이스크림) , 140525831715600가 아이스크림의 주소
- 64비트면 0부터 2의 64승-1 까지의 메모리 주소를 가짐. (32비트면 32승)</code></pre><br/>

<h2 id="변수-바인딩">변수 바인딩</h2>
<pre><code class="language-jsx">a = 2
a = 4
print(a)</code></pre>
<ul>
<li><p>파이썬은 위에서 아래로 인터프리터함.</p>
</li>
<li><p>a는 원래 2의 값의 위치를 바인딩했지만, 4의 위치를 바인딩하게 됨.</p>
<ul>
<li><p>이 때 2의 위치는 그럼 어떻게 되느냐?
  -** GC라는 garbage collector**가 알아서 처리해줌</p>
<ul>
<li>참조하지 않은 값, 레퍼런스 카운터를 알아서 GC가 처리해준다.</li>
<li>이 말은, <strong>참조하지 않은 값을 직접 올렸다가 해제할 필요가 없다</strong>는 뜻.</li>
<li>사용자가 메모리 값을 명시적으로 관리하지 않아도 파이썬에서 알아서 해줌.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="자료-구조">자료 구조</h2>
<ul>
<li>여러 데이터를 효과적으로 다룰 수 있는 것</li>
<li>파이썬에서는 기본 타입으로 제공 됨</li>
<li>다른 객체들의 컬렉션</li>
</ul>
<table>
<thead>
<tr>
<th>자료구조</th>
<th>예시</th>
<th>순서</th>
<th>수정 가능</th>
</tr>
</thead>
<tbody><tr>
<td>리스트(LIST)</td>
<td>[1,2,3]</td>
<td>O</td>
<td>O</td>
</tr>
<tr>
<td>튜플(tuple)</td>
<td>(1,2,3)</td>
<td>O</td>
<td>X</td>
</tr>
<tr>
<td>딕셔너리(dict)</td>
<td>{”사과”:2000, “배”:3000}</td>
<td>X</td>
<td>O</td>
</tr>
<tr>
<td>- 리스트 = 기차, 좌석마다 번호 있지만 중간에 내리면 다른 사람이 탈 수 있음 = 수정가능</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>- 튜플 = 비행기 , 좌석을 다른 사람에게 줄 수 없음.</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<ul>
<li>딕셔너리 = 데이터가 여러개 일때 여러 정보를 저장할 수 있는 데이터,<ul>
<li>[100,200,300]일 때, 가격말고 이 가격에 해당하는 과일에 대한 정보는?</li>
<li>이럴 때 딕셔너리를 사용한다.</li>
<li><strong>가격의 값뿐만 아니라 레이블의 정보 또한 같이 저장하는 것.</strong></li>
<li>사과는 2000원, 배는 3000원.</li>
<li>파이썬은 딕셔너리 안 만들어도 기본 자료구조 타입으로 저장하고 있어서 편리함. (C타입은 직접 만들어야 됨)</li>
<li>레이블 KEY 값이 유니크해야 해당하는 값을 저장할 수 있겠지? (사과가 2개면 안됨)</li>
<li>딕셔너리는 순서 없음.</li>
</ul>
</li>
</ul>
<br/>

<h2 id="인덱싱">인덱싱</h2>
<pre><code class="language-python">아이스크림 = [&quot;구구콘&quot;,&quot;메로나&quot;,&quot;비비빅&quot;]

print(아이스크림[0])

#구구콘</code></pre>
<p>인덱싱은 값을 가져오는 것</p>
<ul>
<li>순서가 있다면 ! (리스트나 튜플의 경우), 정수값으로 인덱싱 할 수 있다.</li>
</ul>
<br/>

<h2 id="슬라이싱">슬라이싱</h2>
<ul>
<li>어떤 범위를 가져오는 것</li>
</ul>
<pre><code class="language-python">아이스크림 = [&quot;구구콘&quot;,&quot;메로나&quot;,&quot;비비빅&quot;]

print(아이스크림[0:2])

# &quot;구구콘&quot; &quot;메로나&quot;</code></pre>
<ul>
<li><p>학교 청소시, 1번부터 5번까지 테니스장 청소 해주세요 ~</p>
</li>
<li><p>리스트나 튜플은 순서가 있으니 특정 범위에 있는 값들을 가져올 수 있음.</p>
</li>
<li><p>주의점은 슬라이싱은 머리 위에 붙은 값이 아니라 사이사이 값을 의미함.</p>
</li>
<li><p>그래서 0:2 , 0부터 2면 비비빅 까지 아니라 0구구콘1메로나2비비빅3 이므로,</p>
</li>
<li><p>“구구콘”, “메로나”가 출력됨.</p>
</li>
</ul>
<br/>

<h2 id="반복문">반복문</h2>
<ul>
<li>반복문은 데이터가 여러개 일 때, 이 데이터에 대한 처리를 해주는 것이다.</li>
<li>반복문은 for와 while로 생성이 가능하고,<ul>
<li>보통의 경우 for문 사용</li>
<li>무한루프의 경우 while문을 사용함.</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># &quot;포 아이 인&quot; 리스트 / 리스트 안에 있는 값 i에 대해서 라는 뜻!
for i in list:
    수행할 문장 1
    수행할 문장 2
    ...</code></pre>
<pre><code class="language-python">카트 = [&quot;과자&quot;,&quot;음료수&quot;,&quot;과일&quot;]

fot i in 카트:
    print(i)

#카트 안에 있는 각각의 아이에 대해서, 아이를 프린트 해라. </code></pre>
<ul>
<li>일반적으로 파이썬은 위에서 아래로 수행되지만, 반복문을 만나면</li>
<li>위에서 아래로 아래에서 위로, 계속 반복하게된다.</li>
</ul>
<pre><code class="language-python">카트 = [&quot;과자&quot;,&quot;음료수&quot;,&quot;과일&quot;]

fot i in 카트:
    print(i)

#sudo 코드

for i in 카트:
 print(i)

# i는 카트 안의 변수, 카트 안의 i에 대해서 프린트 해라 =&gt; &quot;과자&quot;
# 반복문 이므로 다시 위로 돌아감. i는 음료수 바인딩. =&gt; &quot;음료수&quot;
# 다시 돌아감 =&gt; &quot;과일&quot;
# 다시 올라갔는데, i가 바인딩할 값이 더이상 없으면 for문이 종료됨. 
# &quot;과자&quot; &quot;음료수&quot; &quot;과일&quot;</code></pre>
<br/>

<h2 id="while-문">while 문</h2>
<ul>
<li>while 문은 while다음에 조건이 붙는다. 이것이 중요함</li>
</ul>
<pre><code class="language-python">num = 0

while num&lt;5:
    print(num)
     num = num + 1</code></pre>
<ul>
<li><p>먼저 조건에 사용될 값 초기화, num은 0</p>
<ul>
<li><p>num은 5보다 작으니 print 되고, num = num+1 이므로 1이된다.</p>
</li>
<li><p>4까지 반복적으로 수행됨.</p>
</li>
<li><p><strong>중요한 것은 이 때 num = num + 1이런 값을 넣어주지 않으면 무한으로 식이 반복됨.</strong></p>
</li>
<li><p>출력은 0,1,2,3,4가 됨.</p>
</li>
<li><p>num = num + 1은 num += 1과 같은 식임.</p>
</li>
</ul>
</li>
</ul>
<br/>
[파이스탁 - 파이썬 기초문법 핵심정리](https://youtu.be/jkwNBOyzSvQ?feature=shared)

<p>동영상 강의를 토대로 정리했습니다. 
궁금한 점은 댓글 남겨주세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React / 페이지 라우팅 - React SPA & CSR]]></title>
            <link>https://velog.io/@jin_zero/React-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%9D%BC%EC%9A%B0%ED%8C%85-React-SPA-CSR</link>
            <guid>https://velog.io/@jin_zero/React-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%9D%BC%EC%9A%B0%ED%8C%85-React-SPA-CSR</guid>
            <pubDate>Thu, 12 Oct 2023 10:02:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>PAGE ROUTING</p>
</blockquote>
<p>*<em>라우팅은 무엇인가? *</em></p>
<ul>
<li>어떤 네트워크 내에서 통신 데이터를 보낼 경로를 선택하는 일련의 과정<ul>
<li>카카오톡으로 친구한테 야 뭐해?</li>
<li>친구에게 데이터를 전송하는 과정</li>
<li>데이터는 직통으로 전송되지 않는다. (라인이 완전 일자가 아니다.)</li>
<li>데이터들도 지하철을 타듯이 네트워크 장치들을 거쳐서 이동</li>
<li>네트웍 장치 = 지하철 역</li>
<li>ROUTER = 데이터의 경로를 실시간으로 지정해주는 역할을 해주는 무언가</li>
<li>그렇다면 ROUTING 은?</li>
<li>경로를 정해주는 행위 자체와 그런 과정들을 다 포함하여 일컫는 말</li>
</ul>
</li>
</ul>
<p><strong>페이지 라우팅이란 무엇인가?</strong> </p>
<ul>
<li>인터넷을 통해서 웹사이트에 접속한다는 것은 브라우저를 통해 웹서버에게 경로의 요청을 날리고 웹 문서를 받아보는 과정이다.</li>
<li>단순히 어떤 요청에 따라 어떤 페이지를 반환해줄지 결정하는 과정.</li>
<li>경로에 알맞는 페이지를 선별해서 웹 서버가 돌려준다, 이 요청에 명시되어 있는 과정에 따라서 알맞은 페이지를 선택하고, 그 페이지를 반환해서 사용자가 페이지에 접속하는 과정 자체 = 페이지 라우팅</li>
<li>보통 웹 사이트들은 MPA (multi page application) 사용, 새로고침 하듯이 깜박이면서 다른 페이지를 보여줌</li>
</ul>
<p>그런데 <strong>리액트</strong>는 </p>
<ul>
<li>SPA (single page application) 마이 페이지든 요청 페이지든 똑같은 index.html을 반환하는 것임</li>
<li>이럴때 routing을 잘 활용해야한다!!</li>
<li>페이지 이동이 아주 빠르고 쾌적하다 새로고침처럼 안되니까..</li>
<li>페이지 이동이 리액트에서는 페이지 업데이트가 되는 것임 → 시간 단축</li>
<li>페이지 이동할때마다 서버가 기다리는 시간 자체가 없음.</li>
<li>SPA를 사용한 페이지 이동은 데이터가 없다면 로딩을 잠깐 띄어놓으면 되니까.. 그냥 전체적으로 페이지 이동이 엄청 빠르다.</li>
<li>이런 렌더링을 클라이언트들이 직접 렌더링 한다고 해서 <code>CSR (client side rendering)</code> 이라고 부른다!</li>
</ul>
<p><strong>라우터 사용법</strong></p>
<ol>
<li>라우터 설치하기<pre><code>npm install react-router-dom
</code></pre></li>
</ol>
<pre><code>

2. 라우터 임포트 하기</code></pre><p>import { BrowserRouter as Router, Route, Switch, Link } from &#39;react-router-dom&#39;;</p>
<pre><code>사용할 리액트 라우터를 임포트 하기 

&gt; BrowserRouter as Router: 브라우저에서의 라우팅을 위한 컴포넌트.
Route: 어떤 경로에 어떤 컴포넌트를 렌더링할지 정의한다.
Switch: 여러 Route 중 경로가 일치하는 첫 번째 Route만을 렌더링하게 도와줌.
Link: 페이지를 새로고침하지 않고 경로를 변경.


3. 페이지를 임포트!
</code></pre><p>import Home from &quot;./Home&quot;</p>
<p>function Home() {
  return <h2>홈 페이지</h2>;
}</p>
<p>function About() {
  return <h2>소개 페이지</h2>;
}</p>
<p>function Users() {
  return <h2>사용자 페이지</h2>;
}</p>
<pre><code>
함수로 되어있지만 홈, 소개, 사용자가 각각 페이지 컴포라고 했을때 메인(ex.App.jsx)페이지에 임포트 해줌.

4. 라우트로 설정해주기 
</code></pre><p>function App() {
  return (
    <Router>
      <div>
        {/* 네비게이션 */}
        <nav>
          <ul>
            <li>
              <Link to="/">홈</Link>
            </li>
            <li>
              <Link to="/about">소개</Link>
            </li>
            <li>
              <Link to="/users">사용자</Link>
            </li>
          </ul>
        </nav></p>
<pre><code>    {/* 라우트 설정 */}
    &lt;Switch&gt;
      &lt;Route path=&quot;/&quot; exact component={Home} /&gt;
      &lt;Route path=&quot;/about&quot; component={About} /&gt;
      &lt;Route path=&quot;/users&quot; component={Users} /&gt;
    &lt;/Switch&gt;
  &lt;/div&gt;
&lt;/Router&gt;</code></pre><p>  );
}</p>
<p>export default App;</p>
<pre><code>

리액트 라우터 에서는 페이지 관련한 여러가지 기능들이 있는데
사용법이 아주 간단하므로 한번 익혀두면 안 까먹고 쓸 수 있다.
다만 아예 처음 사용할때는 컴포넌트 분리하는 구조가 좀 헷갈릴 수 있다. 
근데 이것도 개발하는 사람마다의 성향에 따라 조금 차이가 있는 듯 하여, 어떤 교과서적인 방법이 있는 건 아닌듯 하다.. 
이래서 더 헷갈리나? ㅜㅜ



![](https://velog.velcdn.com/images/jin_zero/post/da66f5ca-eb10-4c3e-8f9f-3b244a7676eb/image.jpeg)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[React / Props]]></title>
            <link>https://velog.io/@jin_zero/React-Props</link>
            <guid>https://velog.io/@jin_zero/React-Props</guid>
            <pubDate>Thu, 12 Oct 2023 09:34:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>컴포넌트에 데이터를 전달하는 방법</p>
</blockquote>
<p>⇒ 부모 컴포넌트에서 자식 컴포넌트에게 이름을 붙여서 값을 전달하는 것 : <strong>Props</strong></p>
<p>prop = property</p>
<p>부모 컴포넌트에서 받아온 props를 </p>
<p>자식 컴포넌트에서는 매개변수(파라미터)로 사용한다. </p>
<p>리액트는 부모 자식 사이에서만 props를 전달할 수 있다. </p>
<blockquote>
<p>프로퍼티(property): 객체에 속한 변수를 의미. 예를 들어, 자동차라는 객체가 있다면 그 자동차의 색깔이나 브랜드, 최대속도 같은 것들이 프로퍼티.
비유를 들자면, 집에 있는 각종 물건들(텔레비전, 소파, 냉장고) 같은 것.
파라미터(parameter): 함수가 작동할 때 필요한 정보를 받기 위한 변수. 함수를 호출할 때 값을 넘겨주는데, 그 값을 받는 부분이 파라미터.
이건 친구한테 물건을 전달할 때, 너가 그 물건을 받을 손을 내밀면 그 손이 파라미터라고 생각하면 됨(?)</p>
</blockquote>
<pre><code class="language-jsx">const Counter = (props) =&gt; {
    ....</code></pre>
<p>변화되는 값으로 사용하고 싶다면 useState() 옆에서 사용하면 된다.</p>
<pre><code class="language-jsx">const [count, setCount] = useState(props.initialValue);</code></pre>
<pre><code class="language-jsx">// import &#39;./App.css&#39;;
import MyHeader from &quot;./MyHeader&quot;;
import Counter from &quot;./Counter&quot;;

function App() {


  const counterProps = {
    a : 1,
    b : 2,
    c : 3,
    d : 4,
    e : 5,
    initialValue : 5
  }

  return (
    &lt;div &gt;
      &lt;MyHeader /&gt;
     &lt;Counter {...counterProps} /&gt;
    &lt;/div&gt;
  );
}

export default App;
//부모 컴포넌트에서 자식 컴포넌트에게 이름을 붙여서 값을 전달하는 것 = Props</code></pre>
<p>Counter 태그 안에 너무 많은 Props를 전달하면 지저분하니까 저렇게 변수명을 걸어서 선언해줌. 
그리고 나서 스프레드 연산자 {…counterProps}로 펼쳐주면 
그대로 복사되니가 쉽게 사용 가능하다 !!</p>
<p>*<em>그 다음에 Counter 파일에서는 *</em></p>
<pre><code class="language-jsx">import React, {useState} from &quot;react&quot;;

const Counter = ({initialValue}) =&gt; {


  //0에서 출발
  //1씩 증감하는
  //count 상태(state)

  const [count, setCount] = useState(initialValue);</code></pre>
<p>비구조화 할당으로 App.js 에서 객체로 선언된 initialValue를 Props 대신에 가져와서 사용해도 된다. </p>
<p>만약 부모 컴포넌트에서 깜박하고 props 값을 안 넣어줬다면?</p>
<p>자식 컴포넌트에서 <code>defaultProps</code>로 Props 값을 설정해주면 된다. </p>
<p>그러면 똑같이 Counter 에서 자식 컴포넌트에서만 설정해준 값이라도 화면에 잘 뜬다. </p>
<p><strong><em>부모 컴포넌트에서 props안 넣어준 경우</em></strong></p>
<pre><code>function Page() {
  return &lt;Button /&gt;;
}</code></pre><p><strong><em>자식 컴포넌트에서 defaultProps 설정</em></strong></p>
<pre><code>function Button(props) {
  return &lt;button style={{ backgroundColor: props.color }}&gt;클릭해봐!&lt;/button&gt;;
}

Button.defaultProps = {
  color: &#39;blue&#39;
};
</code></pre><p>부모 컴포에서 따로 설정안해줘도 자식 컴포에서 사용가능함!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React / Virtual DOM]]></title>
            <link>https://velog.io/@jin_zero/React-Virtual-DOM</link>
            <guid>https://velog.io/@jin_zero/React-Virtual-DOM</guid>
            <pubDate>Thu, 12 Oct 2023 06:44:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>DOM이란?</p>
</blockquote>
<p>웹 페이지의 구성 요소는 HTML, CSS, Javascript</p>
<p>이 HTML를 트리 형태로 표현한 것이 DOM, 즉 객체로 문서 구조를 표현하는 방법이다. </p>
<p>각 HTML 태그를 하나의 객체로 보고 그 객체가 여러 ‘속성’과 ‘메소드’를 가지도록 한다. </p>
<p>HTML 태그, elements 들을 담고 있는 것을 문서(document)라고 한다. 브라우저는 이 페이지에 해당하는 html을 분석해서 화면에 띄워준다. </p>
<p>이 DOM 트리 안에는 각각의 엘리먼트의 사용하는 노드들이 들어있다. 우리는 이 돔이 제공하는 api를 통해서 돔 구조에 접근하고 변경시킬 수 있다 = DOM 조작 (querySelector)</p>
<blockquote>
<p>DOM은 느리다?</p>
</blockquote>
<p>DOM API 는 수많은 플랫폼과 웹 브라우저에서 사용, 그러나 한가지 큰 문제점이 있다. </p>
<p>바로 동적 UI에 최적화 되어 있지 않다는 점. HTML 은 자체적으로 정적이기 때문, 우리는 자바스크립트를</p>
<p>사용해서 이를 동적으로 만든다.</p>
<p>하지만 큰 규모의 웹 애플리케이션 등을 다룰때 DOM에 직접 접근하여 변화를 주다 보면 성능 이슈가 발생함.</p>
<p>“자바스크립트 엔진은 매우 빠른 반면, DOM은 느리다?” ⇒ X</p>
<p>DOM은 자체적으로는 빠르다. DOM 자체를 읽고 쓸 때의 성능은 자바스크립트 객체를 처리할 때의 성능과 비교하여 다르지 않다. 하지만 웹 브라우저 단에서 변화가 일어나면 css를 다시 연산하고, 레이아웃을 구성하고, 페이지를 리페인트 한다. 이 과정에서 시간이 허비된다. </p>
<blockquote>
<p>해결법</p>
</blockquote>
<p>HTML 마크업을 시각적인 형태로 변환하는 것은 웹 브라우저가 하는 주 역할이므로 컴퓨터 자원 사용은 어쩔수 없다. </p>
<p>그렇기에 DOM을 조작할 때마다 엔진이 웹 페이지를 새로 그리기 때문에 업데이트가 잦으면 성능은 저하됨. </p>
<p>그렇다면 DOM을 최소한으로 조작해서 작업해보자! ⇒ Virtual DOM</p>
<p><img src="https://velog.velcdn.com/images/jin_zero/post/65bdfa41-e6d5-4ea2-9e6c-9f8741ec907d/image.jpeg" alt=""></p>
<blockquote>
<p>Virtual DOM</p>
</blockquote>
<p>실제 DOM 에 접근해서 조작하는 대신, 이를 추상화한 자바스크립트 객체를 구성해서 사용한다. </p>
<p>실제 DOM의 복사본 같은 것. 그리고 이 복사본은 자바스크립트 객체 형태로 ‘메모리’안에 저장되어 있다. </p>
<p>가상돔은 실제돔과 같은 엘리먼트들과 속성을 갖지만 브라우저에 있는 문서에 직접 접근이 불가능하다. </p>
<p>= 화면에 보여지는 내용 직접 수정 불가능.</p>
<p>리액트에서 데이터가 변해서 실제 DOM 업데이트를 할 때는 세가지의 절차를 밟는다. </p>
<ol>
<li>데이터를 업데이트 하면 전체 UI 를 Virtual DOM에 리렌더링한다. </li>
<li>이전 Virtual DOM에 있던 내용과 현재 내용을 비교하고 찾아낸다(Diffing).</li>
<li>바뀐 부분만 실제 DOM에 적용한다.(Reconciliation, 재조정) / 한꺼번에 바뀐 모든 부분들을 집단으로 변경해준다.(Batch Update)  </li>
</ol>
<p>이렇게 리액트는 업데이트 처리 간결성을 가져가게 된다. </p>
<p>(+) 초기 렌더링과 리렌더링, </p>
<p>초기 렌더링을 통해 HTML 마크업을 한다. </p>
<p>리액트는 사실 업데이트라기 보단 조화 과정을 거친다, 라고 봐야 한다. </p>
<p>우리가 보기엔 뷰 변형 같지만, 사실은 새로운 요소로 갈아끼우는 것이기 때문. </p>
<p>리렌더링에서도 새로운 데이터를 가지고 render함수를 호출, 그 데이터를 지닌 뷰 생성.</p>
<p>이때 함수의 반환 결과를 DOM에 바로 반영 X, 이 전과 현재를 비교한다. </p>
<aside>
💡 리액트는 왜 매번 새 웹페이지를 그릴까?
기존의 MVC 구조들을 데이터가 변할때마다 업데이트 하는 항목에 따라 어떤 부분을 찾아서 변경할지 , 어떤 변화를 줄지 고민해야 했다. 변경 규칙을 정하는 작업은 간단하지만 규모가 크면 클수록 복잡해지고, 성능이 떨어질 위험이 있었음. 

<p>그래서 페이스북 개발 팀은 그냥 기존 뷰를 날려버리는 방식을 채택, 업데이트 시 처음부터 새로 렌더링 하기로 했다. 더 이상 어떤 변화를 줄지 신경 쓸 필요가 없고, 그저 뷰가 어떻게 생길지를 선언하고, 데이터에 변화가 있으면 기존에 있던 것은 버리고 정해진 규칙에 따라 새로 렌더링 하면 되기 때문.</p>
<p>하지만 기존의 방식대로 한다면 DOM은 느려지고, 메모리도 많이 사용하게 됨. 
사용자가 인풋 박스에 텍스트를 입력할때마다 기존에 렌더링 된 글은 사라짐. 
그래서 virtual DOM을 쓰게 됐다!</p>
<p>  출처 : <a href="https://product.kyobobook.co.kr/detail/S000001792882">리액트를 다루는 기술</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 / State, useState]]></title>
            <link>https://velog.io/@jin_zero/%EB%A6%AC%EC%95%A1%ED%8A%B8-State-useState</link>
            <guid>https://velog.io/@jin_zero/%EB%A6%AC%EC%95%A1%ED%8A%B8-State-useState</guid>
            <pubDate>Thu, 12 Oct 2023 06:34:07 GMT</pubDate>
            <description><![CDATA[<h2 id="state">State</h2>
<blockquote>
<p>state는 왜 불변성을 갖는가?</p>
</blockquote>
<ol>
<li>예측 가능성과 추적 가능성을 위해, 상태가 계속 변경된다면 코드 실행 흐름을 예측하기 어렵기 때문</li>
<li>순수성과 테스트 용이성, 불변한 상태를 사용하면 순수 함수를 더 쉽게 작성할 수 있다. 순수 함수는 외부의 상태를 변경하지 않고 동일한 입력에 동일한 출력을 내놓는 함수를 말한다. 이렇게 되면 테스트가 더 쉬워지고 버그가 줄어들게 된다. </li>
</ol>
<p>이런 State를 변경할 수 있는 것은 setState() 함수다. 상태를 직접 수정하는 것이 아니라 <code>setState()</code> 를 통해 변경을 예약하고, 리액트가 내부적으로 상태를 업데이트 하고 컴포넌트를 다시 렌더링하게 된다. </p>
<blockquote>
<p>컴퓨터 입장에서 state는 어떻게 동작하는가 ?</p>
</blockquote>
<p>컴퓨터의 관점에서 리액트 컴포넌트의 상태는 메모리 내의 특정 위치에 할당되어 관리된다. 
여기서 상태란 <code>컴포넌트가 가지고 있는 데이터</code>를 말하는데, 
상태는 컴포넌트의 구조와 함께 메모리에 저장되고, 컴포넌트가 생성되거나 업데이트 될 때마다 상태의 변화가 이루어진다. </p>
<p>일반적으로 리액트 컴포넌트의 상태는 자바스크립트 객체로 표현되는데, 이 객체는 컴포넌트가 가진 데이터와 그 데이터에 접근하고 변경하기 위한 메서드(함수)를 포함하고 있다. </p>
<p>예를 들어, <code>클래스 컴포넌트에서 setState 함수를 사용하면 해당 컴포넌트의 상태 객체</code>가 업데이트 되고, <code>컴포넌트가 다시 렌더링되면서 화면에 변경된 상태</code>가 반영된다. </p>
<p>컴퓨터가 상태를 관리하고 사용하는 방식은 다소 복잡하지만, 
리액트가 추상화를 통해 이를 단순화하고 개발자들이 더 편리하게 상태를 다룰 수 있도록 도와준다. 
상태 변화가 필요한 경우, 개발자는 setState 함수를 호출하여 변경 사항을 <code>예약</code>하고, 리액트는 내부적으로 상태를 관리하고 변경된 부분만 업데이트 하여 화면을 다시 그린다.(DOM 관련) </p>
<p>즉 컴퓨터는 상태를 메모리에 할당하고, 리액트는 이 상태를 관리하여 컴포넌트가 예측 가능하게 동작하고 화면에 변화를 반영할 수 있도록 돕는 구조로 동작한다.</p>
<h2 id="usestate">useState</h2>
<pre><code class="language-jsx">import { useState } from &quot;react&quot;;

function App() {

  const [time, setTime] = useState(1);

  const handleClick = () =&gt; {
    setTime(time + 1)
  }

  return (
    &lt;div&gt;
      &lt;span&gt;현재 시각: {time}시&lt;/span&gt;
      &lt;button onClick={handleClick}&gt;Updates&lt;/button&gt;
      &lt;/div&gt;
  );
}

export default App;
</code></pre>
<p><img src="https://velog.velcdn.com/images/jin_zero/post/cec32605-8838-4759-9908-ce010cf89e92/image.png" alt=""></p>
<p>UI 상으로 변할 수 있는 값을 주기 위해 {}에 time을 넣어준다. 
이것은 JSX 문법 표현식이며, {}안에 변수나 표현식을 넣으면 그 값을 동적으로 UI 에 반영할 수 있게 해준다. (자바스크립트 표현식 삽입)</p>
<p>onClick이라는 이벤트 함수를 통해 ‘handleClick’이라는 함수를 연결해준다. (’handleClick’은 프로퍼티로 전달되는 것, onClick 은 리액트 요소의 프로퍼티라고 할 수 있다.) </p>
<p>그리고 ‘handleClick’ 함수에서는 setTime을 이용해서 time에 +1을 해주므로 우리는 ‘Updates’라는 버튼을 누를 때마다 time이 1씩 증가하는 것을 볼 수 있다. </p>
<p>반대로 -하면 수가 감소된다. </p>
<pre><code class="language-jsx"> const [time, setTime] = useState(&quot;&quot;);</code></pre>
<p>useState 의 기본적인 구조 형태.</p>
<p>state를 통해 계속 업데이트 되고 리렌더링 되는 것임. </p>
<blockquote>
<p>useState란?</p>
</blockquote>
<p>리액트의 내장 훅, 함수형 컴포넌트에서 상태를 가질 수 있게 해준다. </p>
<p>클래스 컴포넌트에서의 setState 메서드를 대체하는 역할을 한다. </p>
<p>useState를 사용하면 함수형 컴포넌트 내에서 상태 변수를 선언하고 업데이트 할 수 있다. </p>
<blockquote>
<p>동작원리</p>
</blockquote>
<p>useState는 컴포넌트 상태를 추적하기 위해 fiber 라는 데이터 구조를 사용한다. 상태 변수가 업데이트 되면, 리액트는 새로운 상태와 이전 상태를 비교하고 다시 렌더링이 필요한지 여부를 결정한다. 다시 렌더링이 필요한 경우, 가상 DOM 을 업데이트 하고 실제 필요한 변경 사항을 적용한다</p>
<blockquote>
<p>문법</p>
</blockquote>
<p>useState 훅은 초기값을 인수로 받고, 현재 상태 값을 포함하는 배열과 상태를 업데이트 하는 함수를 반환한다. </p>
<pre><code class="language-jsx">const [state, setState] = useState();</code></pre>
<pre><code class="language-jsx">import {useState} from &quot;react&quot;;

function App() {

  const [names, setNames] = useState([&quot;홍길동&quot;,&quot;김민수&quot;]);
  const [input, setInput] = useState(&#39;&#39;);

  const handleInputChage = (e) =&gt; {
    setInput(e.target.value);
  };

  console.log(input);

  return (
    &lt;div&gt;
      &lt;input type=&quot;text&quot; value={input} onChange={handleInputChage} /&gt;
      &lt;button&gt;Upload&lt;/button&gt;
      {names.map((name, idx) =&gt; {
        return &lt;p key={idx}&gt; {name} &lt;/p&gt;;
      })} 
      {/* //네임스 배열을 돌면서 아이템 하나하나 마다 p태그 붙여준거임 */}
      &lt;/div&gt;
  );
}

export default App;</code></pre>
<p>이 코드에서 <strong><code>input</code></strong> 태그의 <strong><code>value</code></strong> 속성에 <strong><code>input</code></strong> 상태 변수를 넣어주는 이유는 입력 상자의 값과 리액트 컴포넌트의 상태를 동기화하기 위함입니다. 이를 &quot;제어 컴포넌트(controlled component)&quot;라고 부릅니다.</p>
<ol>
<li><strong>상태와 입력 동기화</strong>: <strong><code>value={input}</code></strong>을 사용하면 <strong><code>input</code></strong> 변수의 값이 항상 입력 상자의 값과 일치하게 됩니다. 이렇게 하면 입력 상자의 값이 변경될 때마다 해당 값을 상태로 관리할 수 있으며, 필요에 따라 다른 로직과 연동할 수 있게 됩니다.</li>
<li><strong>상태 변경 감지</strong>: <strong><code>onChange</code></strong> 이벤트 핸들러를 사용하면 사용자가 입력 상자에 무언가를 입력하거나 변경할 때마다 이를 감지하고 반응할 수 있습니다. 이 예제에서는 <strong><code>handleInputChange</code></strong> 함수가 <strong><code>onChange</code></strong> 이벤트에 연결되어 있으며, 사용자의 입력을 <strong><code>input</code></strong> 상태 변수에 반영합니다.</li>
</ol>
<p>이러한 방식으로 구현하면, 상태 변수를 통해 입력 상자의 값을 완벽히 제어할 수 있게 되어, 나중에 해당 값을 다른 기능과 연동하거나, 유효성 검사를 수행하고, 다른 컴포넌트와 공유하기 등의 작업이 용이해집니다.</p>
<blockquote>
<p>useState의 힘</p>
</blockquote>
<ul>
<li>상태관리의 간소화</li>
<li>하나의 컴포넌트에서 여러 개의 상태 변수를 가질 수 있다</li>
<li>상태가 변경될 때만 다시 렌더링을 트리거 한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프론트엔드와 백엔드]]></title>
            <link>https://velog.io/@jin_zero/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%99%80-%EB%B0%B1%EC%97%94%EB%93%9C</link>
            <guid>https://velog.io/@jin_zero/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%99%80-%EB%B0%B1%EC%97%94%EB%93%9C</guid>
            <pubDate>Mon, 13 Mar 2023 07:34:36 GMT</pubDate>
            <description><![CDATA[<h1 id="프론트엔드-vs-백엔드">프론트엔드 vs. 백엔드</h1>
<p><img src="https://velog.velcdn.com/images/jin_zero/post/97b7e2c6-895f-4439-b1d7-56c2bd97881a/image.png" alt=""></p>
<p>여기 네이버 창이 있다. 이 네이버 창에 있는 웹툰, 뉴스, 블로그 버튼을 통해 우리는 만화를 보고, 정세를 알고, 기록을 하게 된다. 
이 때 내 눈에 보이는 화면을 구축하는 것이 바로 프론트엔드 개발자가 하는 일이 된다. 프론트엔드(Front-end)개발은 사용자들(user)을 대상으로 UI를 만들어가는 일을 하게된다. 이들은 주로 HTML, CSS, JS 등을 통해 페이지를 만든다.  코드를 짜면 즉각적으로 눈에 보이는 프로그래밍을 하기 때문에, 결과가 비교적 명확하다는 특징이 있다. 가시적인 결과가 본인의 성취감에 중요한 영향을 끼치거나 눈에 보이는 것을 잘 캐치하는 재능이 있다면 프론트엔드 개발자를 추천하는 듯 하다. 그러나 백엔드와 비교했을 때, 코드의 유통기한이 짧은 편이다. 애초에 프론트엔드의 특성상 유지보수보다 새로운 코드를 짜는 경우가 많기 때문에 프론트엔드 코드의 퀄리티를 높이기가 어렵다. (이 외에 디자이너, 마케팅 팀등과의 협업에서 계획이 무산되는 경우도 多 이에 따라 커리어적 한계를 느끼고 기술을 바꾸는 개발자도 꽤 있는 듯 하다) </p>
<p>백엔드(Back-end)개발은 클라이언트와 직접 대면하지 않으나, 프론트엔드와 연합하여 사용되는 기술이다. 위의 네이버 창을 다시 끌고 와보자. 내가 네이버 홈 화면에서 &#39;웹툰&#39;을 클릭하면 백엔드의 기술을 통해 웹툰 UI를 끌고 오기위한 데이터들이 처리 되고, &#39;네이버 웹툰&#39; 창이 뜨게된다. 이렇듯 뒤에서 작용해서 UI이 없이 프로세스로 작동하는 것이 바로 백엔드다. 이들은 자바 스프링, 루비 온 레일즈, PHP 등의 언어를 사용한다. 이들은 데이터를 데이터베이스(DB)에 적재하고 관리하여 API를 만든다. 이 application programming interface는 사용자가 웹툰 창에서 &#39;신과 함께&#39;라는 웹툰을 보기 위해 버튼을 클릭하면, 수많은 웹툰의 데이터 사이에서 쉽게 &#39;신과 함께&#39;라는 데이터를 볼 수 있도록 구축해놓은 코드다. 이 API를 통해 백엔드는 프론트엔드 기술과 연동된다. 백엔드는 내가 짠 코드를 가시적으로 명확하게 볼 수 없는 답답함이 따른다는 것이 가장 큰 단점이 된다. 특히나 위에서 설명했던 프론트엔드의 장점이 자신과 잘 맞는 특성을 가진 사람이라면 더더욱 백엔드 개발을 공부하는 것이 힘들 듯 하다. </p>
<h1 id="프론트-백엔드-프로그래머">프론트? 백엔드? 프로그래머!</h1>
<p>프론트 엔드와 잘 맞는 성향은 위에서 설명했다. 그렇다면 백엔드는 어떤 사람이 잘 맞을까? 백엔드는 눈에 보이지 않는 프로세스를 구축하는 일이기 때문에 추상화적 사고 능력이 필요하다. 또한 (요즘은 케바케라고 하지만)코드의 유통기한이 길기 때문에 유지 보수를 위한 가독성 좋은 코드를 짜는 것이 중요하다. 그래서 진득하게 공부하는 것을 좋아하고, 언어의 역사적 공부를 통해 논리적인 흐름 방향을 제대로 알고 이해하는 공부 방법을 택하는 사람에게 잘 맞을 것이라고 여겨진다. 
나는 사실 전형적인 문과생으로, 철학과 심리학을 전공했다. 초기에는 개발의 기술적 능력을 보고 관심이 간 것도 사실이지만, 철학을 공부하며 추상적 사고 능력과 한 개념의 뼈대를 논리, 구조적으로 이해하는 능력이 생겼고, 기본적으로 학문에 대한 학구열과 의지가 높은 편이기에 계속해서 공부해야 하는 개발자에 더 빠져들게 됐다. 
그렇다면 나는 프론트엔드와 백엔드 중 어떤 분야를 선택해야 할까? 추상화적, 논리적 사고력이 뛰어나서 백엔드? 하지만 나는 눈에 보이는 것에 예민하고, 트렌드에 민감하다(!) 눈에 보이는 것으로 성취감을 얻기 때문에 항상 하루의 시작에 TO-DO-LIST를 작성해서 가시적으로 내 성취결과를 확인하는 사람이다. 그렇다면 프론트엔드 개발자가 되어야 할까? 
사실 솔직히 말하자면 아직 잘 모르겠다. 그렇지만 내가 백엔드 개발을 공부하고 있는 이유는 첫번째로, 입문하기엔 프론트엔드 보다 조금 더 넓고 복잡하게 느껴지는 백엔드를 먼저 공부해서 프론트의 분야로도 천천히 넓혀가기 위함이고, 두번째는 다른 무엇보다 문제 해결에 초점을 맞추는 프로그래머가 되고 싶기 때문이다. 문제를 해결하는 프로그래머가 되기 위해서는 프론트냐, 백엔드냐 하는 기술을 당장 선택하는 것이 중요하다기 보다 목적을 뚜렷하게 설정하는 작업이 필요할 것 같다. 
비전공자인 내가 개발 공부에 뛰어든 이 상황에서, 내가 가지고 있는 장점은 목표 지향과 그 개념에 대해서 깊게 사고할 수 있는 능력, 통찰력일 것이다. 앞으로도 내가 이 공부를 시작한 목적, 내가 되고 싶은 개발자의 모습을 잃지 않고 공부를 이어갈 수 있었으면 좋겠다!</p>
<p><img src="https://velog.velcdn.com/images/jin_zero/post/cc66281e-8446-4df6-8787-67adab3edb13/image.png" alt=""></p>
<blockquote>
<p>&quot;때로는 문제를 해결하는 가장 좋은 방법이 정책을 바꾸고 프로그래밍을 안하는 것일 수도 있다.&quot;</p>
</blockquote>
<p>[&gt; <a href="https://youtu.be/3H4umWD5bwI%5D">https://youtu.be/3H4umWD5bwI]</a></p>
<p>내가 해나갈 공부와 기술에 대한 가치, 목적을 잃지 말고.. 공부하자!!</p>
]]></description>
        </item>
    </channel>
</rss>