[멋쟁이사자처럼 블록체인 스쿨 1기] 22.09.15

박기영·2022년 9월 16일
0

멋쟁이사자처럼

목록 보기
3/4

오늘 배운 것은 블록체인의 기초 개념이다.
노마드코더 강의를 사전에 듣고 와서 그런지 엄청 이해가 안되거나 하지는 않았다.
다만, 중간중간 나오는 용어가 익숙하지 않아서 고생이었다.
암호화폐 자체에는 크게 관심이 없었기 때문에..
아무튼 오늘 배운 것을 기록한다.
아, 참고로 강의 자료는 무단 첨부할 수 없으므로 글로 쓰는게 주가 될 것 같다.

😵 블록체인 기초

🤔 블록체인은 무엇인가?

블록체인의 핵심 개념은 두 가지로 볼 수 있겠다.

  1. 분산 원장 기술(Distributed Ledger Technology)
    분산 원장 기술이란 쉽게 말해 원장(거래 내역 정도로 이해하자)을 참여자 모두에게 분산시켜 가지고 있도록 하는 것이다.
    또한 이 원장은 모두가 같은 것을 가지고 있다. 모두의 정보를 가진채로.

  2. 탈중앙화 네트워크 시스템(Decentralized Network System)
    탈중앙화. 중앙 시스템에서 벗어난 것을 의미한다.
    따라서, 어떤 것이 옳고 그른지를 판단해주는 중심축이 사라진 것이다.
    블록체인에서는 참여자 모두가 옳고 그름의 판단에 참여하게 된다.

🤔 블록체인의 특징

크게 7가지의 특징을 가진다.

  1. 익명성(Anonymous)
    익명성. 말그대로 익명성을 보장한다.
    실세계에서는 사람들 간 소통, 거래를 위해서 본인의 특정 정보를 서로에게 알려준다.
    카카오톡에 추가하기 위한 전화 번호 추가, 송금을 위한 계좌 번호 등이 있겠다.
    이들은 그 정보로 하여금 내가 누군지 알 수 있게한다.
    그러나 블록체인에서는 "주소"를 사용한다.(정확히는 지갑 주소)
    이는 암호화가 된 것으로 주소만 보고는 누가 "나"인지 한 번에 알 수가 없다.

  2. 추적성(Traceability)
    블록체인에서는 "주소"를 사용하여 진행된 거래가 모두 기록된다.
    따라서, 누가 누가와 언제 얼마를 어떻게 거래했는지 모두 기록되어 확인 가능하다.
    이를 이용해 유명인의 주소를 찾아봐서 그의 투자법을 따라하기도 한다고..(암호화폐 관련)

  3. 무신뢰성(Trustless)
    우리는 누군가에게 송금을 할 때, 은행을 통해서 이체를 한다.
    나의 돈이 은행에 있고, 은행에 나를 인증한 뒤, 상대방 은행에 돈을 보내고, 상대방은 본인 은행에 자기를 인증해서 돈을 찾는다.
    블록체인은 기본적으로 은행(제 3자, Third party)가 존재하지 않는다.
    나와 너만 있다. 아니 그게 무신뢰성이랑 무슨 관련이 있냐고!
    우리는 은행이라는 제 3자를 통해 상대방과 나 사이에 신뢰를 유지한다.
    블록체인은 이 과정이 코드로 구현되어 있다.
    즉, 블록체인 내에서는 나와 너가 거래하는 과정이 코드에 의해서 중재되고, 관리되는 것이다.
    이로 인해서 우리는 서로를 신뢰하지 않아도 된다.
    코드가 신뢰를 구축해놨기 때문에.

  4. 분산 원장(Distributed Ledger)
    분산 원장은 위에서 말한 블록체인의 특징이다.
    모두가 같은 원장을 가지고 있기 때문에, 거짓말을 할 수가 없다.

  5. 탈중앙화(Decentralized)
    탈중앙화도 위에서 말한 블록체인의 특징이다.
    중앙 서버가 없기 때문에, 서버가 사라지거나, 고장나더라도
    노드에 따라 분산되어있기 때문에 전체의 정보 유실이나 작동 중지(Single Point Failure)와 같은 극단적인 상황을 피할 수 있다.
    안정성을 증가시키는 한편, 효율성이 떨어지는 단점이 있다.

  6. 합의 알고리즘(Consensus Algorithm)
    앞서 블록체인에서는 참여자 모두가 정보의 옳고 그름, 즉, 참을 판별하는데 참여한다고 했다.
    따라서, 참여자들은 어떤 정보를 참이라고 할지에 대하여 합의를 해야한다.
    어떤 방식으로 참을 판단할지 정하는 방법을 합의 알고리즘이라고 한다.

  7. 불변성(Immutability)
    말그대로 변하지않는 속성이다.
    엄밀히 말하면...블록체인의 정보는 변경할 수 있다.
    다만, 블록에 있는 정보들을 해시 암호화해서 체인을 구성하는 구조 특성 상
    단 하나의 값, 숫자, 글자, 기타 등등이라도 변하면 체인을 구성하는 해시들이 전부 변하게 된다.
    따라서 변경이 발생한 것을 모두가 매우 빠르게 잡아낼 수 있다.

3,4,5,6번은 연관성이 깊다.
탈중앙화 했기 때문에 참을 판단할 주체가 사라졌고,
그로 인해서 분산 원장을 통해 모두가 정보의 참 판별에 참여하도록 만들며,
이를 판별하는 과정은 합의 알고리즘을 통해 코드로 진행되어,
사람들은 서로를 무신뢰하여 소통, 거래를 한다.

😵 블록체인 구조

🤔 블록은 어떻게 구성되어 있는가?

블록은 크게 헤더(Header)와 바디(Body)로 이루어져있다.

😒 헤더(Header)

헤더는 쉽게 말해서 블록의 요약본이라고 볼 수 있겠다. 개괄적인 정보가 여기에 들어있다.
Hash, Ver, Prev Block, Merkle Root, Timestamp, Bits & Difficulty, Nonce가 들어있다.(다를 수도 있다)
Hash는 해당 블록의 해시값
Ver는 암호화폐의 버전
Prev Block은 이전 블록의 해시값
Merkle Root는 바디(Body)에 있는 정보들을 가지고 만든 해시값
Timestamp는 블록이 체인에 합쳐진 시간
Bits & Difficulty는 블록 채굴의 난이도
Nonce는 채굴했을 때의 Nonce 값을 의미한다.

😒 바디(Body)

바디에는 거래 수수료, 거래 내역 등 기타 정보들이 들어간다.
즉, 거래 내역을 자세히 보고싶으면 바디를 보면 된다.

🤔 해시(Hash)

해시는 암호화된 문자를 의미한다.
어떤 문자,숫자,기호 등을 입력하면 특정한 문자열로 암호화되어 나온다.
이 해시 값은 3가지 특징이 있다.

  1. 단방향
    해시는 단방향이다...뭔 소리야?
    문자열을 암호화한게 해시라고 했다. 그러면 해시를 복호화하면 문자열이구나!
    아니다. 해시는 복호화가 안된다.
    즉, 해쉬 값을 통해 원래 문자를 알아내는 것은 불가능하다.

  2. 규칙성이 없다
    해시 암호는 규칙성이 없다.
    문자열을 "hi"을 입력해서 해시 암호화했다고 해보자.
    그리고 "hi1"을 입력해서 해시 암호화했다고 해보자.
    딱 "1"이라는 문자의 차이인데,
    아, "1" 추가하면 이렇게 바뀌는구나! 하고 알아볼 수가 없다. 완전히 바뀌어버린다.

  3. 16진수 64자리
    해시값은 16진수의 수로 64자리가 나온다.
    이는 어떤 문자열을 입력하더라도 동일하게 적용된다.
    "hihihihihihi"를 암호화하든, "byebyebyebye"를 암호화하든
    모두 16진수 64자리로 변환된다.

😒 블록의 해시

이런 특징을 가지는 해시. 블록에서는 어떻게 만들어질까?
앞서 블록은 헤더와 바디로 구성된다고 했다.
음..예를들어 1번 블록이 있다고 해보자.
1번 블록은 0번 블록이 이전 블록이며, 앞서 말한 헤더에 포함되는 정보들을 지니고 있다.
1번 블록의 해시는 "헤더에 있는 정보"를 조합해서 해시 암호화해서 얻는다.

그런데, 그 중, Merkle Hash는 바디에 있는 정보를 조합해서 얻는다.
바디에서 값을 하나 바꾸면 Merkle Hash가 변하고,
Merkle Hash가 변하면 해당 블록의 해시가 변한다.

😒 체인(Chain)

블록과 블록은 해시라는 체인을 통해 연결된다고 말했다.
이는 블록의 구조를 보면 쉽게 이해할 수 있다.
헤더에 이전 블록의 해시가 있고, 그와 다른 정보들을 조합해서 본인의 해시를 만들어낸다.
즉, 1번 블록에는 0번 블록의 해시가 있어야만 하는 것이다.
이런 관계를 체인이라고 하는 것 같다.

😒 해시 충돌

세상은 넓고 문자는 많다.
따라서, 어쩌다가보니...다른 문자열을 입력했는데 같은 해시값이 나올 수도 있다.
이 것을 바로 해시 충돌이라고 한다.
그 때는 암호화 방법에 허점이 있다고 판단한다.
그래서 암호화 도구의 버전을 업데이트한다.
해시 암호화는 SHA 256을 사용하는데, 만약 이런 허점이 발견되면
SHA 256 - 1,2,3,4,...이런 식으로 버전이 증가하게 될 것이다.

🤔 정보가 바뀌면 어떻게 될까요?

아까 정보가 하나라도 바뀌면 해시가 바뀌어서 모든 해시에 영향을 끼친다고 했다.
그러면 정보를 바꿨다고 해보자. 해시가 전부 바뀐다.
물론, 정보를 변경한 블록의 해시가 변하는 거지 모든 연결된 블록들이 다 바뀌는 것은 아니다.
엥? 그러면 뭐가 문제야?
그게 바로 문제다.
블록은 이전 블록의 해시를 체인으로써 사용한다. 그런데 그게 바뀌어버려서,
1번 블록에 들어있는 0번 블록의 해시와 0번 블록의 해시가 일치하지 않으면 체인이 끊기는 것이다!

자, 1번 블록의 정보가 변경되면, 체인이 끊긴다고 했다.
즉, 이 말은 변경 사항이 본인의 원장에만 적용된다는 것이다.
분산 원장에 의하여 모든 이가 같은 원장을 가지고 있어야하는데, 이는 문제가 크다.
그래서 체인이 끊어지면 같은 원장을 공유하고 있던 네트워크에서 분리된다.
즉, 끊긴 부분부터 새로운 블록을 만들어야한다.
이는 나중에 포크(Fork)라는 개념과 연결이 된다.

🤔 Genesis Block

블록체인은 블록이 체인으로 연결된 것이다.
그런데...그러면 처음 시작할 때의 블록은 뭐지?
그 것을 Genesis Block이라고 한다.(0번 블록, Block 0 등으로도 불린다)
체인이 시작되는 곳이라고 생각하면 된다.
아니, 거래를 해야 블록이 생성되는거 아니야?? 정보가 없는데 그걸로 뭐를 얻을 수 있어?
맞다. 거래 없이 시작되는 블록이다.
블록을 체인에 연결하면 보상을 얻는 걸로 아는데...체인의 시작이면 뭘 받지?
처음으로 블록을 캐낸(Mining) 보상을 받는다. 이를 코인베이스 거래라고 부르기도 한다.
즉, 거래로 인한 수수료 등을 얻는 것은 아니다!

이 보상이라는 것이 제네시스 블록에만 해당되는 것이 아니라는 점에 주의하자.
특정 블록을 처음 채굴했을 때는 보상을 받는 것이다.

참고로 처음 생성된 블록이라서 이전 블록이 없기 때문에
체인을 구성하는 이전 블록의 해시는 0으로만 이루어진 것으로 나온다(이건 화폐마다 다를지도?!)

😵 블록체인 상 거래

🤔 개인키(Private Key)와 공개키(Public Key)

블록체인 상에서는 현실처럼 돈 주고 받고 끝! 이게 아니다.
네트워크 상에서 그렇게 주고 받다가 해킹이라도 당하면 큰일이다.
이를 막기 위해서 Key라는 것을 사용한다.
이 Key들은 개인키와 공개키가 있는데,
지갑(Wallet)이라고 불리는 곳에서 이들을 관리한다.

지갑이라고해서 돈이 들어있는 것은 아니고, 네트워크에 분산되어 있는 원장에 있는 내 기록에 대하여
이게 내 기록이다! 이게 내 돈이다! 라고 증명할 수 있는 Key가 들어있는 것이다.

이 부분은 이전에 작성한 노마드코더 영상 정리본에서 자세하게 써놨으므로, 그 예시를 보는게 이해가 빠르다!

참고로 개인키가 그 값 그대로 사용되는 일은 없다! 절대로!!!
개인키는 정말 나 본인만이 사용하고, 보는 것이다. 공유해서는 안된다.
또한, 개인키가 직접 사용되는 것이 아니라
개인키가 만들어낸 디지털 서명이 사용되는 것이므로 참고하자.

개인키는 비밀번호, 공개키는 계좌 번호라고 생각하면 이해가 쉬울거다.

이들 Key 간에도 해시 암호화 처럼 단방향성이 존재한다.
개인키 -> 공개키 -> 암호화페 주소
이 방향은 되더라도,
이 반대로는 안된다.

😵 채굴(Mining)

흔히들 채굴장이라는 단어로 알고 계시는 이 단어.
정확히는 블록을 생성하는 것을 의미한다.
아~ 그럼 채굴자라고 불리던 사람들 돈 잘 벌던데, 개꿀이네~ 블록만 올리고 돈 버는거네~
....아니다.
그 블록을 체인에 연결하는 것이 어렵다.
아까 블록 구조에서 난이도라는 것을 언급했다.
난이도는 암호화폐가 개발한 의도와는 다르게 너무 빠르게 채굴되거나, 너무 느리게 채굴되는 것을 막기 위해서 자동적으로 조절된다. 이는 뒤에서 자세히 적도록 하겠다.

추가로, Nonce라는 것도 언급했다.
Nonce는 블록의 해시와 함께 블록 내에서 건드릴 수 있는 유일한 정보이다.
Nonce 값을 조절함으로써 헤더 내의 정보에 변화를 주고, 블록의 해시 값을 변화시킨다.

왜 이 말을 하시죠? 너무 뜬금없는데요?
놉!
이렇게 Nonce를 조절해서 얻은 블록의 해시가 taget이라는 값보다 작아야지만 채굴을 할 수 있다!!

🤔 난이도(Difficulty)

바로 여기서 난이도 개념이 같이 나오게 된다.
개발 의도와 다른 속도로 채굴이 진행되면 프로그램이 난이도를 조절한다고 했다.
채굴은 target 값보다 해시가 작아야지 가능하다고 했다.
이를 통해 난이도와 target의 상관 관계를 알아낼 수 있다.
target을 작게 만들수록 난이도가 증가하는 것이다!!!!

예를들어, 비트코인은 평균 10분당 1개의 블록이 채굴되도록 했다.
그리고 2016개의 블록이 채굴될 때마다 난이도를 조절한다.
시간으로 계산해보면 평균 14일마다 난이도를 조절하는 것이다.
만약, 2016개의 블록이 13일만에 채굴되었다면...?
난이도가 쉬운 것이다. 그만큼 빨리 캐냈으니까!
그러면 난이도를 올린다.
난이도를 올린다는 것은 target값을 낮춘다는 것이다.
그 뒤, 2016개의 블록이 또 채굴되었다.
이번에는 15일이 걸렸다. 그렇다면 난이도는?
어려운 것이다. 따라서 target값을 올려서 난이도를 조절한다.

참고로, 일반적인 상황(2016개까지 14일)이라면 난이도는 보통 증가한다.

🤔 수수료(Incentives)

아무튼, 각설하고 채굴에 대해서 좀 더 알아보도록 하겠다.
암호화폐의 거래에서는 거래가 그냥 슉슉 되는 것이 아니다.
거래를 개시하면 승인이 되어야지 주고받고가 가능하다.
이 과정에서 수수료라는 것이 발생한다. 왜?
거래 내역을 블록에 담고 그 블록을 체인에 연결하려면 채굴을 성공해야하기 때문이다.
이걸 누가해주더라? 채굴자다.
아, 나 대신 일해줬으니까 돈을 내야한다.
그게 바로 수수료이다.

채굴자들은 체인에 연결하고자 하는 블록의 바디에 거래 내역을 담는다.
어떤 거래 내역? 본인이 승인처리 하고자하는 거래 내역이다.
아, 그러면 여기서 수수료를 받는구나! 맞다.

그런데, 수수료는 거래를 발생시킨 사람이 정한다.
내 거래를 처리하면 이만큼의 수수료를 낼게요~ 이런 식으로 말이다.
어? 난 수수료 내기 싫은데?
그러면 수수료를 0으로 설정하면 된다.

😒 수수료를 0으로 설정한다면?

자, 그런데 자본주의 세상에서 나한테 공짜로 일하라는 사람거를 누가해주겠는가?
당연하게도 채굴자들은 수수료가 높은 것을 찾게되어있다.(자체적인 로직으로 이게 그렇게 돌아간다고한다)
그러면 수수료를 0원으로 설정한 사람 것을 처리하지 않게된다.
그러면 이 사람의 거래 발생 정보는 네트워크에 계~~~속 남게 된다.
블록체인 네트워크에서 이런 것들이 누적되다보면 부하로 작용하게 될 것이다.
그래서 로직은 수수료가 낮아 채굴자들에게 선택되지 않는 거래가
긴 기간동안 선택되지 않으면, 우선 순위를 증가시켜서 승인할 거래에 들어가도록 한다.
이게 가능한 것은 거래 내역들은 모두 Timestamp를 가지기 때문에 언제 발생한 거래인지 알 수 있기 때문이다.

요즘은 이런 것을 사전에 방지하기 위해서
일정 시간 거래가 처리되지 않으면 수수료를 증가시키라고 하거나,
수수료 0원을 사전에 금지 시키는 방법을 사용하기도 한다.

😒 채굴자가 수수료를 받기까지의 과정

위 내용들을 토대로 채굴자가 수수료를 받기까지의 과정을 자세하게 적어보겠다.

  1. 거래 발생
  2. mempool(멤풀)에 거래 내역이 들어간다.
  3. 채굴자들은 거래를 성공시켜 돈을 벌기 위하여 수수료가 높은 거래를 선택한다.
  4. 선택한 거래 내역을 블록의 바디에 넣는다.
  5. 바디의 정보는 헤더의 Merkle Hash를 생성한다.
  6. 헤더의 해시를 만든다.
  7. 체인에 올리기 위해서 채굴 과정을 진행한다.
  8. target 값과 블록의 해시값을 비교해서 해시값이 더 작을 때까지 Nonce를 조절한다.
  9. 드디어 채굴에 성공한다.
  10. 거래 목록에 담았던 거래들을 성공시켰으므로, 그들의 수수료들을 합산해서 받는다.

이게 기본적인 루틴이다.
자...그런데, 만약만약만약에
채굴이 동시에 성공해버리면 어떻게 될까?
이게 뭔소리지..?

블록은 번호를 가진다.
만약 5번 블록을 채굴자가 캐냈는데, 다른 채굴자가 5번 블록을 동시에 캐낸 것이다!!
이런 경우에는 도대체 어떻게 시스템이 돌아갈까?

😵 동기화

방금 말한 상황을 다시 살펴보자.

채굴자 1 : [1,2,3,4,5-1]
채굴자 2 : [1,2,3,4,5-2]

두 명의 채굴자가 같은 블록을 캐버려서 원장이 저런 식으로 되어버렸다.
아니 원장이 다른데요? 분산 원장은 모두가 같은 원장을 가져야하는거 아닌가요?
맞다.

우선, 분산 원장은 주변 네트워크에 있는 사람들에게 본인의 원장을 보여주면서 동의를 구하는 것으로 확산이 된다.(현재 기술로는 물리적으로 가까울 수록 네트워크 상에서도 더 빠르게 원장을 확산시킨다고 한다)
그러면 채굴자 1은 주변에 있는 사람들에게 본인의 원장을 확산시키고,
채굴자 2는 주변에 있는 사람들에게 본인의 원장을 확산시킨다.

이제 네트워크에 참여한 사람들이 반으로 갈린다고 해보자.
절반은 채굴자 1의 원장을, 절반은 채굴자 2의 원장을 가지고 있다고 하자.
이 때, 채굴자 1의 원장을 가지고 있는 채굴자 3이 6번 블록을 캐냈다.
채굴자 2의 원장을 가지고 있는 채굴자 중에서는 캐낸 사람이 없다고 하자.

채굴자 1쪽 원장을 가진 채굴자 중...
채굴자 3 : [1,2,3,4,5-1,6]

채굴자 2쪽 원장을 가진 채굴자 중...
아무도 6번 블록을 캐지 못했다

이렇게 되면, 더 긴 블록을 가진 쪽이 옳은 원장이 된다!
따라서, 전체 네트워크에는

전체 네트워크 원장 : [1,2,3,4,5-1,6]

이런 원장이 참이 되어 모두에게 전파된다.
이 때, 5-2가 들어있던 원장은 취소된다.

이런 상황은 의도적으로 블록을 분기처리 한 것이 아니다.
그러면 의도적으로 블록을 분기처리 할 수 있나?
있다! 그 것을 바로 포크(Fork)라고 한다.

😵 포크(Fork)

포크에는 소프트 포크(Soft Fork), 하드 포크(Hard Fork)가 있다.
여기에 설명이 아주 잘되어 있는데, 인용하겠다.

🤔 소프트 포크(Soft Fork)

소프트 포크는 블록체인에 가벼운 업데이트가 있어서 분기처리가 된 것이다.
따라서, 분기 처리된 블록체인끼리 호환이 된다.
그래서 업데이트를 받아들일지말지도 선택할 수 있다.
만약 모두가 받아들이기로 하면 다시 하나의 블록체인으로 합쳐진다.

🤔 하드 포크(Hard Fork)

하드 포크는 블록체인의 규칙을 근본적으로 바꿔버리는 매우 중요하고 큰 업데이트가 있어서 분기처리가 된 것이다.
이들은 절대로 다시 합쳐지지도 않고, 서로 호환이 되지도 않는다.

이렇게 블록체인이 포크된 상황에서는
많은 이들의 선택을 받지 못한 네트워크는 도태되게 된다.

😵 대세

만약, 누군가가 원장을 변경했다고 해보자.
그 사람은 주변에 본인의 원장을 퍼뜨릴 것이고 점점 이에 동의하는 사람이 늘어나게 될 것이다.
변경된 원장에 동의한 사람들이 늘어가게 되면, 점점 그 원장이 대세가 되어간다.
만약, 여기에 따르지 않는 사람이 있다면 네트워크 상 원장은 2개가 된다.
따라서, 각자 다른 분기를 걷게되고, 이들은 다른 암호화폐를 가지게 되는 것이라고 봐도 무방하다.

🤔 51% 공격(51% Attack)

이러한 점을 이용하여 네트워크의 연산량의 51%까지를 점유해서, 네트워크를 장악하는 공격이 있다.
그 것을 "51% 공격"이라고 한다.
만약, 이렇게 된다면 암호화폐를 본인 맘대로 주물럭거릴 수 있게 되는 심각한 상황이 발생하게 된다.
이론상으로는 33.xxx%만 점유해도 가능하다고 한다.
그러나, 이정도의 점유율을 하나의 주체가 해내려면 엄청난 에너지가 필요할 것이고,
~청난 채굴기를 가지고 있어야한다.
이 것에 대한 자세한 설명은 노마드코더 영상 정리본에 있으므로 참고해주시면 좋겠다.

🦁 끝

오늘의 정리는 여기까지이다.
노마드코더 유튜브 영상을 미리 본 것이 컸다. 이해가 훨씬 빨라졌다.
다음부터는 진짜 생판 모르는 내용을 배울 것이 분명하기에 단단히 긴장해야겠다.
사실, 블록체인 기술의 활용성에 대하여 수업 시간동안 고민을 해봤는데
암호화폐와 멀어질 수 있는 방법은 없을까에 대한 생각이 많이 들었다.
다른 개발자 인터뷰 영상을 보면 백엔드와 결이 비슷하다고도 하는데,
이러면 아직 정보의 디지털화가 덜 된 곳에 적용하기 시작하면 좋지않을까?
일본같은 곳이 시장성 확보도 좋을 것 같고, 시작하기도 좋은 상황인 것 같은데...🙄
개인적으로 암호화폐 자체에는 큰 관심이 없고(NFT 시장성에는 관심이 많다만)
블록체인 기술 자체를 어떻게 써먹을 수 있을까에 대한 해답을 찾고자 했기 때문에
앞으로 고민이 깊어질 것 같다.
또한 이걸 프론트와 어떻게 잘 버무려서 프로젝트를 만들어 낼지도 고민이다.
수업 1일차지만 새삼스럽게 내가 프론트엔드를 좋아하긴 하는구나 느꼈다 😅

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글