diff --git a/404.html b/404.html index 04835db1..de9395ef 100644 --- a/404.html +++ b/404.html @@ -7,11 +7,11 @@ - + -

404

How did we get here?
Take me home.
- +

404

That's a Four-Oh-Four.
Take me home.
+ diff --git "a/Books/20221217-\354\260\250\353\235\274\355\210\254\354\212\244\355\212\270\353\235\274\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" "b/Books/20221217-\354\260\250\353\235\274\355\210\254\354\212\244\355\212\270\353\235\274\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" index 65d7ece7..62a7348d 100644 --- "a/Books/20221217-\354\260\250\353\235\274\355\210\254\354\212\244\355\212\270\353\235\274\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" +++ "b/Books/20221217-\354\260\250\353\235\274\355\210\254\354\212\244\355\212\270\353\235\274\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" @@ -7,7 +7,7 @@ - + @@ -19,8 +19,8 @@ GitHub

# 차라투스트라는 이렇게 말했다

# 책 소개

자라투스트라를 주인공으로 삼아 니체 자신의 철학을 풀어낸 프리드리히 니체의 주가 되는 저서입니다.
+

# 차라투스트라는 이렇게 말했다

# 책 소개

자라투스트라를 주인공으로 삼아 니체 자신의 철학을 풀어낸 프리드리히 니체의 주가 되는 저서입니다.
차라투스트라가 10년 동안 머무르던 동굴에서 하산하여 사람들에게 가르침을 펴는 내용으로, 주로 철학서로 분류되지만, 옴니버스로 구성된 소설처럼 이야기를 전개하며, 여러 등장인물과 사물, 시간과 공간에 상징이 담겨 있는 등 문학적 요소도 많은 작품입니다.

- + diff --git "a/Books/20221218-\353\213\210\354\262\264\354\235\230-\354\247\200\355\230\234.html" "b/Books/20221218-\353\213\210\354\262\264\354\235\230-\354\247\200\355\230\234.html" index 999fdc73..8b42fc67 100644 --- "a/Books/20221218-\353\213\210\354\262\264\354\235\230-\354\247\200\355\230\234.html" +++ "b/Books/20221218-\353\213\210\354\262\264\354\235\230-\354\247\200\355\230\234.html" @@ -7,7 +7,7 @@ - + @@ -19,10 +19,10 @@ GitHub

# 니체의 지혜

# 머리말

니체는 현대 철학자 중에서 누구보다도 대중의 사랑을 많이 받은 철학자이다. 철학사의 지평에서 본다면 그는 쇼펜하우어와 딜타이와의 관계에서 다루어져 왔다. 니체는 쇼펜하우어의 주의주의 철학으로 정신적 성장에 큰 자양분을 얻었고, 딜타이는 '삶의 철학'이라는 관점에서 니체와 더불어 문제시되었다. 그러나 많은 사람들이 니체의 글을 읽고 감탄하지만 정작 그의 글을 제대로 이해하는 사람은 드물다. 『차라투스트라는 이렇게 말했다』가 누구의 작품인지 모르는 사람은 거의 없겠지만, 비유적인 표현으로 인해 그 작품을 제대로 이해하는 사람이 드문 것이다. 니체 자신도 서문에 "모든 사람을 위한, 그러나 그 누구를 위한 것도 아닌 책"이라는 부제를 달아 놓았으니, 그 책이 읽히고 이해되기를 기대하지도 바라지도 않았다고 볼 수 있다. 심지어 그는 『이 사람을 보라』에서 "나는 읽히지 않는다. 나는 읽히지 않을 것이다"라는 말하기까지 한다.

니체 독서는 오독의 역사라고 할 수 있다. 니체는 파시즘의 철학적 지주로서 예찬되기도 했고 그러기에 비난받기도 했다. 파시즘의 흥망성쇠에 따라 그에 대한 해석도 부침을 겪었다. 그러다가 1960년대 이탈리와 프랑스로부터 새로운 니체 물결이 일면서 그 열기가 독일로 역수입되어, 1980년대에는 독일과 이탈리아에서 니체에 대한 향수와 열광의 물결이 서서히 고개를 들기 시작했다. 특히 경제적 침체, 실업 증가 등으로 인한 사회적 불안이 맞물리면서 파시즘에 대한 향수가 일어날 때 니체에 대한 열기도 고조되어 왔다.

니체는 파시즘, 반유대주의, 인종차별, 현실적-정치적 영웅주의, 독일 국수주의 등과 같은 극우주의와는 무관하고, 오히려 그런 것에 반대하는 입장이다. 니체의 엘리트주의는 신분적 귀족주의가 아니라 관계의 긴장을 고조시키는 정신적 귀족주의이다. 니체의 주인도덕은 천박한 시대의 조류에 따르는 것을 단호히 배격하고, 그런 조류를 따르는 자들을 노예도덕의 소유자라고 보고, 위버멘쉬(Übermensch)에 대칭되는 최후의 인간이라고 칭한다. 니체의 글이 내용면에서 복합적이고 여러 가지 모습을 하고 있기 때문에 지금과 같은 오류가 빚어졌던 것이다. 니체는 자신의 사상을 효과적으로 전달하기 위해 온갖 다양한 문체를 선택한다. 잠언이나 시 형식의 글이 있는가 하면, 논문이나 에세이 형식의 글도 있다. 니체는 아포리즘을 이해하려면 봉우리에서 봉우리로 걸어갈 수 있는 정신의 거인이라야 가능하다고 말한다. 아포지름은 우리가 잘 알고 있다고 생각하는 사물을 낯설게 제시해서 다르게 생각하도록 요구한다. 이처럼 아포리즘은 다양한 사유 실험을 하기에 적합한 글쓰기이다

니체라는 큰 산을 등반하기 위해서는 무엇보다 그의 글을 제대로 읽어야 한다. 그러나 일반 독자는 그의 주저(主著)인 『차라투스트라는 이렇게 말했다』를 읽어도 무슨 말인지 알 수 없고, 그의 전체 작품을 다 읽는다는 것도 힘든 일이다. 그러기에 이 책은 그의 전체 작품 중에서 주로 아포리즘을 통해 그와 그의 사상, 그의 작품의 이해에 한 걸음 다가가고자 한다. 니체는 『인간적인 것, 너무나 인간적인 것』에서부터 아포리즘 형식으로 글을 쓰기 시작했으므로, 이 책도 거기서부터 시작한다.

# 자신을 알고 자신의 길을 가기

그대가 마주칠 수 있는 가장 고약한 적은 언제나 그대 자신일 것이다.
+

# 니체의 지혜

# 머리말

니체는 현대 철학자 중에서 누구보다도 대중의 사랑을 많이 받은 철학자이다. 철학사의 지평에서 본다면 그는 쇼펜하우어와 딜타이와의 관계에서 다루어져 왔다. 니체는 쇼펜하우어의 주의주의 철학으로 정신적 성장에 큰 자양분을 얻었고, 딜타이는 '삶의 철학'이라는 관점에서 니체와 더불어 문제시되었다. 그러나 많은 사람들이 니체의 글을 읽고 감탄하지만 정작 그의 글을 제대로 이해하는 사람은 드물다. 『차라투스트라는 이렇게 말했다』가 누구의 작품인지 모르는 사람은 거의 없겠지만, 비유적인 표현으로 인해 그 작품을 제대로 이해하는 사람이 드문 것이다. 니체 자신도 서문에 "모든 사람을 위한, 그러나 그 누구를 위한 것도 아닌 책"이라는 부제를 달아 놓았으니, 그 책이 읽히고 이해되기를 기대하지도 바라지도 않았다고 볼 수 있다. 심지어 그는 『이 사람을 보라』에서 "나는 읽히지 않는다. 나는 읽히지 않을 것이다"라는 말하기까지 한다.

니체 독서는 오독의 역사라고 할 수 있다. 니체는 파시즘의 철학적 지주로서 예찬되기도 했고 그러기에 비난받기도 했다. 파시즘의 흥망성쇠에 따라 그에 대한 해석도 부침을 겪었다. 그러다가 1960년대 이탈리와 프랑스로부터 새로운 니체 물결이 일면서 그 열기가 독일로 역수입되어, 1980년대에는 독일과 이탈리아에서 니체에 대한 향수와 열광의 물결이 서서히 고개를 들기 시작했다. 특히 경제적 침체, 실업 증가 등으로 인한 사회적 불안이 맞물리면서 파시즘에 대한 향수가 일어날 때 니체에 대한 열기도 고조되어 왔다.

니체는 파시즘, 반유대주의, 인종차별, 현실적-정치적 영웅주의, 독일 국수주의 등과 같은 극우주의와는 무관하고, 오히려 그런 것에 반대하는 입장이다. 니체의 엘리트주의는 신분적 귀족주의가 아니라 관계의 긴장을 고조시키는 정신적 귀족주의이다. 니체의 주인도덕은 천박한 시대의 조류에 따르는 것을 단호히 배격하고, 그런 조류를 따르는 자들을 노예도덕의 소유자라고 보고, 위버멘쉬(Übermensch)에 대칭되는 최후의 인간이라고 칭한다. 니체의 글이 내용면에서 복합적이고 여러 가지 모습을 하고 있기 때문에 지금과 같은 오류가 빚어졌던 것이다. 니체는 자신의 사상을 효과적으로 전달하기 위해 온갖 다양한 문체를 선택한다. 잠언이나 시 형식의 글이 있는가 하면, 논문이나 에세이 형식의 글도 있다. 니체는 아포리즘을 이해하려면 봉우리에서 봉우리로 걸어갈 수 있는 정신의 거인이라야 가능하다고 말한다. 아포지름은 우리가 잘 알고 있다고 생각하는 사물을 낯설게 제시해서 다르게 생각하도록 요구한다. 이처럼 아포리즘은 다양한 사유 실험을 하기에 적합한 글쓰기이다

니체라는 큰 산을 등반하기 위해서는 무엇보다 그의 글을 제대로 읽어야 한다. 그러나 일반 독자는 그의 주저(主著)인 『차라투스트라는 이렇게 말했다』를 읽어도 무슨 말인지 알 수 없고, 그의 전체 작품을 다 읽는다는 것도 힘든 일이다. 그러기에 이 책은 그의 전체 작품 중에서 주로 아포리즘을 통해 그와 그의 사상, 그의 작품의 이해에 한 걸음 다가가고자 한다. 니체는 『인간적인 것, 너무나 인간적인 것』에서부터 아포리즘 형식으로 글을 쓰기 시작했으므로, 이 책도 거기서부터 시작한다.

# 자신을 알고 자신의 길을 가기

그대가 마주칠 수 있는 가장 고약한 적은 언제나 그대 자신일 것이다.
『차라투스트라는 이렇게 말했다』

# "너 자신을 알라"는 무슨 뜻일까?

"너 자신을 알라!"고 충고했던 저 신은 무엇을 말하려고 했을까? 이 말은 아마 "너와 무언가를 상관시키지 마라! 객관적으로 되라!"는 뜻이었을 게다. - 그런데 소크라테스는 어떤가? - 그리고 '학문적인 인간'은 어떤가?
『선악의 저편』

# 무엇으로 사람들은 자신을 알게 되는가?

짐승은 다른 짐승을 보자마자 속으로 그 짐승과 우열을 겨루어 본다. 야만 시대의 인간들도 이와 마찬가지의 일을 했다. 이런 사실에서 인간은 거의 모두 자신의 방어력이나 공격력과 관련해서만 자신을 알게 된다는 사살이 밝혀진다.
『아침놀』

- + diff --git "a/Books/20221218-\354\226\264\353\226\273\352\262\214-\354\202\264-\352\262\203\354\235\270\352\260\200.html" "b/Books/20221218-\354\226\264\353\226\273\352\262\214-\354\202\264-\352\262\203\354\235\270\352\260\200.html" index 286d5ce1..b94ce275 100644 --- "a/Books/20221218-\354\226\264\353\226\273\352\262\214-\354\202\264-\352\262\203\354\235\270\352\260\200.html" +++ "b/Books/20221218-\354\226\264\353\226\273\352\262\214-\354\202\264-\352\262\203\354\235\270\352\260\200.html" @@ -7,7 +7,7 @@ - + @@ -19,9 +19,9 @@ GitHub

# 어떻게 살 것인가

# 프롤로그

나는 열정이 있는 삶을 원한다. 마음이 설레는 일을 하고 싶다. 자유롭게, 그리고 떳떳하게 살고 싶다. 인생이라는 짧은 여행의 마지막 여정까지, 그렇게 철이 덜 난 그대로 걸어가고 싶다. 내 삶에 단단한 자부심을 느끼고 싶다. 그렇게 사는 게 나다운 인생이라고 생각한다. 나는 이런 내가 좋다. 자유로움과 열정, 설렘과 기쁨이 없다면 인생이 무슨 의미가 있겠는가.

나는 무엇인가? 나는 누구인가? 어떻게 살아야 하고 어떻게 죽는 것이 좋은가? 의미 있는 삶, 성공하는 인생의 비결은 무엇인가? 품격 있는 인생, 행복한 삶에는 어떤 것이 필요한가? 이것은 독립한 인격체로서 사회에 첫발을 내딛는 청년들뿐만 아니라 인생의 마지막 페이지를 이미 예감한 중년들도 피해갈 수 없는 질문이라고 생각한다. 나는 여기에 내가 나름대로 찾은 대답을 이야기했다. 삶의 기쁨, 존재의 의미, 인생의 품격을 찾으려고 고민하는 모든 분들의 전투를 빈다. 그 무엇도 의미 있는 삶을 찾으려고 분투하는 그대들을 막아서지 못할 것이다.

# 제1장 어떻게 살 것인가

교사, 공무원, 회사원, 엔지니어, 요리사, 헤어 디자이너, 물리치료사, 피겨 스케이팅 선수, 가수, 건축가, 화가, 소설가, 의사, 세일즈맨, 골프 선수 등 무슨 직업이든 좋아서 그 일을 하면 그 사람이 바로 프로다. '진정한 프로'가 되는 것, 이것이 삶의 행복과 인생의 성공을 절반 결정한다. 그런 점에서 행복한 삶을 원한다면 일이 아니라 놀이를 앞자리에 두어야 한다. 일이 먼저가 아니다. 놀이가 먼저다.

어떻게 살 것인가? 크라잉넛은 자기네 생각을 이야기했다. '좋아한다면 부딪쳐, 까짓 거 부딪쳐!' 휼륭한 대답이다. 그들은 자기네가 좋아하는 펑크록 음악을 들고 세상과 부딪쳐 나름 성공했다. 인생에서 성공은 매우 중요하다. 그러나 그보다 중요한 건 자기가 좋아하는 일을 하면서 소신껏 인생을 사는 것이다. 물론 그렇게 산다고 해서 다 성공하는 건 아니다. 성공이라고 할 만한 결과를 얻지 못할 수도 있다. 그러나 좋아하나는 일이 아예 없거나 있어도 포기하고 산다면, 그 인생은 성공할 수도 실패할 수도 없다.

문제는 무슨 일을 했느냐가 아니다. 왜, 어떤 생각으로 그 일을 했는지가 중요하다. 크라잉넛 멤버들은 자기가 원하는 인생을 스스로 설계했고 그 삶을 옳다고 생각하는 방식으로 살았다. 공연을 하면 행복했기에, 대학을 가지 않거나 대학 공부를 하는 둥 마는 둥 하면서 노래와 연주에 열정을 쏟아부었다. 학생운동과 노동 운동, 시민 운동을 한 청년들 중에도 그런 사람이 많을 것이다. 하지만 나는 그렇지 않았다. 스스로 인생을 설계하지도 않았고 내가 원하는 방식으로 살지도 못했다. 마음 가는 대로 살지 못했다. 죽을 때가지 이대로 살고 싶다는 생각을 하지도 않았다.

그러나 크라잉넛 멤버들은 인생의 성패를 가르는 기준을 물질이나 지위, 사회 통념이나 타인의 시선, 어떤 이념이나 명분이 아니라 자신의 내면에 두었다. 마음이 내는 소리를 귀 기울여 들으면서 행복한 삶을 스스로 설계했다. 그리고 그 삶을 자기가 원하는 방식으로 밀고나 갔다. 주눅 들지 않고 세상과 부딪쳤다. 인생이 성공했으며 삶이 행복하다고 생각한다. 계속 그렇게 마음이 이끄는 대로 살고 싶다고 한다. 그들은 좋아하는 놀이를 직업으로 삼았다. 이것만으로도 '절반' 성공한 인생이라고 말할 수 있다. 물론 그들의 인생이 완성된 것은 아니다. 일과 놀이가 인생의 절반이라면 나머지 절반은 사랑과 연대(solidarity)라고 나는 믿는다. 나는 크라잉넛 멤버들이 이 나머지 '절반' 성공했다고 하는 것이다. 나는 크라잉넛의 책을 읽으면서 인생에 대해 많은 생각을 했다. 그들에게 크게 빚졌다고 생각한다. 그 빚을 갚고 싶다. 그래서 그들도 이 책을 읽기를 바란다. 인생의 나머지 절반도 소신대로 하기를 기대한다.

# 내 인생은 나의 것

내 문제는, 꼭 하고 싶은 일이 없다는 것이었다. 그걸 하지 못한다면 삶이 깜깜해질 것 같은, 그렇게 간절하게 하고 싶은 일이 없었다.
생각을 해보지 않은 것은 아니었다. 어렸을 때 제사를 지내러 큰집에 가면 어른들이 아이들을 모아놓고 조상들 이야기를 들려주었다. 오늘 제사를 모신 할아버지는 이런 벼슬을 하셨고, 외가는 어떠했으며, 처가는 누구의 후손이다. 뭐 그런, 끝도 없이 가지를 쳐나가는 옛날이야기였다. '가문의 영광'에 대한 강의가 끝나면 어른들은 커서 커서 '무엇'이 되고 싶으냐고 물었다. 모법 답안은 판사나 검사였다. 의사나 공무원도 대충 정답으로 통했다. 그와 다른 대답은 어른들을 실망하게 만든다는 것을 알았기에 나는 판사가 되겠다는 모법의 답안을 말하곤 했다. 어른들은 매우 기꺼워하셨다.그러나 '어떤 사람'이 되고 싶은지, 삶의 목표가 무엇인지는 아무도 묻지 않았다.

평범한 삶이 아름답고 행복할 수 없다는 게 아니다. 평범해도 평범하지 않아도, 인생은 훌륭하거나 비천할 수 있다. 이냇ㅇ의 품격은 평범함이나 비범함과 상관 없는 것이다. 내 문제는 꿈이 없다는 것이었다. 내 문제는 꿈이 없다는 것이었다. 내게는 무엇인가 꼭 이루고 싶은 목표가 없었다. 그저 현실에 잘 적응했을 뿐이다.
그때 이후 지금까지 목표도 방향도 없이 '닥치는 대로' 살았다. 마구잡이로 살았다는 뜻이 아니다. 그때그때 눈앞에 닥쳐온 일을 나름 성실하게 열심히 하면서 살았다. 대학생 때는 정부와 언론이 '지하대학'이라고 불렀던 학회에 가입해 독재정권이 금서(禁書)로 지정한 책을 읽었다. 구로동 야학교사가 되어 또래 여성 노동자들의 학습을 도왔다. 반정부 시위를 하다가 잡혀가고 학교에서 쫓겨났다. '불법 유인물'과 화염병을 만들었다. 징역을 살았다. '범죄 조직'을 만든 증거로 악용된다고 해서 사진을 찍지도 않았고 일기를 쓰지도 않았다. 설렘과 환희로 빛나야 마땅한 청춘을 그렇게 아무 흔적 남기지 않고 보냈다.
최선을 다해 '닥치는 대로' 살았으니 후회는 없다. 생각해보면 그때가 내 인생에서 가장 순수하고 열정적인 시기가 아니었나 싶다. 시내 공중화장실이나 공중전화 박스에 독재정권을 비판하는 유인물 몇 장을 '살포'하는 데 성공한 것만으로도 온 세상을 다 얻은 것 같은 환희를 느끼곤 했다. 국회의원이나 장관이 되는 것과는 비교할 수 없을 정도로 짜릿한 희열이었다. 지금도 그것이 사회적으로 의미 있는 활동이었다고 생각한다. 그러나 훌륭한 삶은 아니었다. 내 자신이 설계한 인생, 내가 원한 삶의 방식은 아니었기 때문이다.
어떻게 살 것인가? 이 나이에 아직도 이런 질문을 껴안고 있는 내가 한심해 보인다. 그러나 이것이 여태껏 살아온 내 삶의 결과임을 인정한다. 만약 지금까지 살아온 그대로 계속해서 살면 좋겠다고 생각한다면, 그 사람의 인생은 이미 훌륭한 인생이다. 그대로 가면된다. 그러나 계속해서 지금처럼 살 수는 없다고 느끼거나 다르게 살고 싶다고 생각한다면, 그 사람의 삶은 아직 충분히 훌륭하다고 할 수 없다. 더 훌륭한 삶을 원한다면 지금이라도 무언가를 바꾸어야 한다. 나는 내가 좋아하는 것을 들고 능동적으로 세상과 부딪차자 못했다. 버민하면서 주저하는 내게, 세성이 먼저 부딪쳐 왔다. 세상은 나더러 체념하거나 굴복하라고 했고, 나는 거절하고 저항했을 뿐이다. 부당한 강요에 굴복하면 삶이 너무나 비천해질 것 같았다. 그래서 최소한의 인간적 존엄과 품격을 지키려고 발버둥 쳤다. 성년이 된 이후 오랫동안 내 삶을 지배한 감정은 기쁨이나 즐거움이 아니었다. 수치심과 분노, 슬픔, 연민, 죄책감, 의무감 같은 것이었다.

'닥치는 대로' 산 것은 전적으로 내 책임이다. 다른 사람이나 세상을 원망할 수 없다. 세상은 제 갈 길을 가고, 사람들은 또 저마다 자기 삶을 살 뿐이다. 세상이, 다른 사람이 내 생가과 소망을 이해하고 존중하고 배려해준다면 고맙겠지만, 그렇지 않다고 해서 세상을 비난하고 남을 원망할 권리는 없다고 생각한다. 소극적 선택도 선택인 만큼, 성공이든 실패든 내 인생은 내 책임이다. 그 책임을 타인과 세상에 떠넘겨서는 안 된다. 삶의 존엄과 인생의 품격은 스스로 찾아야 한다. 죄악과 비천함에서 자기를 지키는 것만으로는 훌륭한 삶을 살 수 없다. 악당이나 괴물이 되지 않았다고 해서 훌륭한 것은 아니다. 무엇이 되든, 무엇을 이루든, '자기 결정권' 또는 '자유의지'를 적극ㅈ거으로 행사해 기쁨과 자부심을 느낀느 인생을 살아야 훌륭하다고 할 수 있다. 나는 그렇게 믿는다.
인생에서 가장 중요한 것은 '자기 결정권'을 행사하는 일이다. '자기 결정권'이란 스스로 설계한 삶을 옳다고 믿는 방식으로 살아가려는 의지이며 권리이다. 철학자 존 스튜어트 밀(J. S. Mill)의 표현을 가져다 쓰자. '사람은 누구든지 자신의 삶을 자기 방식대로 살아가는 것이 바람직하다. 그 방식이 최선이어서가 아니라, 자기 방식대로 사는 길이기 때문에 바람직한 것이다.' 사람마다 인생을 다르게 산다. 평생 공부하는 살마, 노래하고 춤추는 사람, 돈을 버는 데 골몰하는 사람, 일만 하는 사람, 권력을 좇는 사람, 신을 섬기는 사람 등 백 사람이 있으면 백 가지의 삶이 있다. 어느 것이 더 훌륭한지 가늠하는 객관적 기준은 없다. 스스로 설계하고 선택한 것이라면 어떤 삶이든 훌륭할 수 있다. 그러나 아무리 화려해 보여도 자유의지로 만들어낸 삶이 아니면 훌륭할 수 없다.
나는 내 삶을 스스로 설계하지 않았다. '닥치는 대로' 열심히 살았지만 내가 원하는 삶을 내가 옳다고 생각하는 방식으로 산 것은 아니었다. 지금부터라도 내 삶에 대해 더 큰 자부심과 긍지를 느끼고 싶다. 살아가는 모든 순간마다, 내가 하는 모든 일에서 의미와 기쁨을 느끼고 싶다. 아직은 기회가 남아 있다고 생각한다. 그러려면 무엇인가 바꿔야 한다. 가장 먼저 바꿔야 할 것은 삶을 대하는 태도가 아닌가 싶다. 조금 늦은 감은 있지만 이제부터라도 내 마음이 가는 대로 살고 싶다. 내가 하고 싶은 일을 내가 옳다고 믿는 방식으로 하는 것이다. 다른 사람을 해치는 일은 절대 없어야 한다. 그리고 내가 하는 일이 세성을 더 훌륭하게 만드는 데 보탬이 되어야 하고, 그 과정에서 내 자신도 훌륭해져야 한다.
여태껏 오로지 남을 위해서 산 건 결코 아니었다. 세상을 위해 살았다고 주장할 생각도 없다. 그러나 나를 위해, 내 자신의 행복을 위해 사는 인생은 훌륭할 수 없다는 관념에 눌려서 산 것만은 사실이다. 그래서 내가 어떤 삶을 진정 원하는지 깊이 들여다보질 않았다. 무엇에선가 즐거움과 행복을 느낄 때마다 근원은을 알 수 없는 죄의식에서 사로잡히곤 했다. 행복을 느끼는 순간마다 누구에겐가 잘못을 저지르는 것 같았다. 생각해보면 꼭 그래야만 할 이유는 없었다. 누가 그렇게 살라고 하지도 않았다. 내가 괴로워한다고 해서 누군가 더 행복해지는 것도 아니었다. 도덕주의적으로 보든 실용주의적으로 보든 좋은 생각이 아닌 것이다. 내게는 내가 원하는 대로 살 권리가 있다. 이제부터라도 남의 시선을 의식하지 않고, 그 어떤 이념에도 얽매이지 않고, 내 마음이 내는 소리에 귀 기울이면서 떳떳하게 그 권리를 행사하고 싶다. 좋아하는 일을 하면서 기쁘게 살고 싶다. 스무 살의 크라잉넛 멤버들처럼.

# 왜 자살하지 않는가

글쓴이들은 죽음이 임박한 사람들을 만났고 그들의 마지막 모습을 들려준다. 하지만 실제로 말하려는 것은 죽음이 아니다. '어떻게 살 것인가? 행복한 삶은 어떤 것인가? 무엇이 인생을 훌륭하게 만드는가? 삶의 의미는 무엇인가?' 그런 것이다.
나는 심오한 인생론을 펼친 위대한 고전보다 이런 책이 좋다. 쉽게 읽히고, 재미있고, 감동을 받는다. 읽다 보면 나도 모르게 눈물이 나기도 한다. 아무리 이름난 철학자라 해도 너무 어렵게 이야기하면 좋아하지 않는다. '나도 배울 만큼 배운 사람인데, 그런 내가 읽어도 무슨 소리인지 알기 어려운 걸 누구보고 읽으라는 거야!' 그렇게 화가 난다. 여러 번 되풀이해 읽어도 이해가 되지 않는 책을 쓴 사람은 심지어 미워하기까지 한다. 심각한 열등감을 안겨주기 때문이다. '난 머리가 나쁜가 봐.', '지적 재능이 없나 봐.', '형이하학적(形而上學) 인간인가 봐.' 그렇게 자학하도록 만든다. 그 때문에 실존주의(existentialism, 實存主義) 철학자들을 특별히 못마땅하게 여겼다.

열등감은 삶의 기쁨을 갉아먹는 부정적인 감정 중에서도 단연 고약한 것이다. 열등감에 깊이 빠지면 자기 자신을 비천한 존재로 느끼게 된다. 그래서는 기쁜 삶을 살지 못한다. 기쁘지 않은 삶은 흘륭하기 어렵다. 열등감과 자기 비하의 덫에 걸리지 않으려면 '정신승리법'이 필요하다. 완벽한 정신승리법이 있을 것이라고 생각하지는 않는다. 그러나 조금이라도 도움이 되는 방법은 여러 가지가 있다. 내가 즐겨 쓰는 방법은 이솝 Aesop 우화집에 등장하는 여우의 '신 포도 논리'이다. '저 포도는 맛이 없고 시기만 할 게 분명해.' 너무 높이 있어서 아무리 해도 손이 닿지 않는다면 이렇게 생각하는 게 마음이 편하다. 세상에는 아무리 애를 써도 손에 넣지 못한 포도송이가 사방 널려 있다. 그때마다 열등감을 느끼고 자기를 비하한다면 제대로 살 수가 없을 것이다. 사람들은 흔히 여우가 교묘하게 자신의 무능을 합리화했다고 비웃는다. 하지만 나는 이것이 다소 진부해 보이지만, 삶을 긍정적인 태도로 살아나가는 데 도움이 된다고 생각한다.
세상에는 오로지 못할 나무가 너무나 많다. 곳곳에 '넘을 수 없는 4차원의 벽'이 서 있다. 도전하지도 않고 포기하는 것도 어리석지만, 오르지 못할 나무와 넘을 수 없는 벽을 오르고 넘어서야 행복한 삶, 성공하는 인생을 살 수 있는 게 아니다. 내게 적합한 나무, 노력하면 넘을 수 있고 넘는 게 즐거운 벽을 잘 골라야 한다. 그렇게 해야 인생이라는 '너무 짧은 여행'을 후회 없이 즐길 수 있다.

너무나 간절하게 영생을 원한 나머지 그것을 구하는 일에 몰두하느라 유한한 인생에서 맛볼 수 있는 모든 환희와 행복을 포기하는 사람들을 보면 안타까운 마음이 든다. 나는 영생을 원하지 않는다. 단 한 번만, 즐겁고 행복하게 그리고 의미 있게 살고 싶을 뿐이다.

하루의 삶은 하루만큼의 죽음이다. 어떻게 생각하든 이 사실은 바뀌지 않는다. 새날이 밝으면 한 걸음 더 죽음에 다가선다. 그런데도 우리는 때로 그 무엇엔가 가슴 설레어 잠들지 못한 채 새벽이 쉬이 밝지 않음을 한탄한다. 결코 영원할 수 없음을 알면서도 누군가에게 영원한 사랑과 충성을 서약한다. 죽음을 원해서가 아니다. 의미 있는 삶을 원해서다. 인생은 그런 것이다. 하루가 모여 인생이 된다. 인생 전체가 의미 있으려면 살아 있는 모든 순간들이 기쁨과 즐거움, 보람과 황홀감으로 충만해야 한다.
+

# 어떻게 살 것인가

# 프롤로그

나는 열정이 있는 삶을 원한다. 마음이 설레는 일을 하고 싶다. 자유롭게, 그리고 떳떳하게 살고 싶다. 인생이라는 짧은 여행의 마지막 여정까지, 그렇게 철이 덜 난 그대로 걸어가고 싶다. 내 삶에 단단한 자부심을 느끼고 싶다. 그렇게 사는 게 나다운 인생이라고 생각한다. 나는 이런 내가 좋다. 자유로움과 열정, 설렘과 기쁨이 없다면 인생이 무슨 의미가 있겠는가.

나는 무엇인가? 나는 누구인가? 어떻게 살아야 하고 어떻게 죽는 것이 좋은가? 의미 있는 삶, 성공하는 인생의 비결은 무엇인가? 품격 있는 인생, 행복한 삶에는 어떤 것이 필요한가? 이것은 독립한 인격체로서 사회에 첫발을 내딛는 청년들뿐만 아니라 인생의 마지막 페이지를 이미 예감한 중년들도 피해갈 수 없는 질문이라고 생각한다. 나는 여기에 내가 나름대로 찾은 대답을 이야기했다. 삶의 기쁨, 존재의 의미, 인생의 품격을 찾으려고 고민하는 모든 분들의 전투를 빈다. 그 무엇도 의미 있는 삶을 찾으려고 분투하는 그대들을 막아서지 못할 것이다.

# 제1장 어떻게 살 것인가

교사, 공무원, 회사원, 엔지니어, 요리사, 헤어 디자이너, 물리치료사, 피겨 스케이팅 선수, 가수, 건축가, 화가, 소설가, 의사, 세일즈맨, 골프 선수 등 무슨 직업이든 좋아서 그 일을 하면 그 사람이 바로 프로다. '진정한 프로'가 되는 것, 이것이 삶의 행복과 인생의 성공을 절반 결정한다. 그런 점에서 행복한 삶을 원한다면 일이 아니라 놀이를 앞자리에 두어야 한다. 일이 먼저가 아니다. 놀이가 먼저다.

어떻게 살 것인가? 크라잉넛은 자기네 생각을 이야기했다. '좋아한다면 부딪쳐, 까짓 거 부딪쳐!' 휼륭한 대답이다. 그들은 자기네가 좋아하는 펑크록 음악을 들고 세상과 부딪쳐 나름 성공했다. 인생에서 성공은 매우 중요하다. 그러나 그보다 중요한 건 자기가 좋아하는 일을 하면서 소신껏 인생을 사는 것이다. 물론 그렇게 산다고 해서 다 성공하는 건 아니다. 성공이라고 할 만한 결과를 얻지 못할 수도 있다. 그러나 좋아하나는 일이 아예 없거나 있어도 포기하고 산다면, 그 인생은 성공할 수도 실패할 수도 없다.

문제는 무슨 일을 했느냐가 아니다. 왜, 어떤 생각으로 그 일을 했는지가 중요하다. 크라잉넛 멤버들은 자기가 원하는 인생을 스스로 설계했고 그 삶을 옳다고 생각하는 방식으로 살았다. 공연을 하면 행복했기에, 대학을 가지 않거나 대학 공부를 하는 둥 마는 둥 하면서 노래와 연주에 열정을 쏟아부었다. 학생운동과 노동 운동, 시민 운동을 한 청년들 중에도 그런 사람이 많을 것이다. 하지만 나는 그렇지 않았다. 스스로 인생을 설계하지도 않았고 내가 원하는 방식으로 살지도 못했다. 마음 가는 대로 살지 못했다. 죽을 때가지 이대로 살고 싶다는 생각을 하지도 않았다.

그러나 크라잉넛 멤버들은 인생의 성패를 가르는 기준을 물질이나 지위, 사회 통념이나 타인의 시선, 어떤 이념이나 명분이 아니라 자신의 내면에 두었다. 마음이 내는 소리를 귀 기울여 들으면서 행복한 삶을 스스로 설계했다. 그리고 그 삶을 자기가 원하는 방식으로 밀고나 갔다. 주눅 들지 않고 세상과 부딪쳤다. 인생이 성공했으며 삶이 행복하다고 생각한다. 계속 그렇게 마음이 이끄는 대로 살고 싶다고 한다. 그들은 좋아하는 놀이를 직업으로 삼았다. 이것만으로도 '절반' 성공한 인생이라고 말할 수 있다. 물론 그들의 인생이 완성된 것은 아니다. 일과 놀이가 인생의 절반이라면 나머지 절반은 사랑과 연대(solidarity)라고 나는 믿는다. 나는 크라잉넛 멤버들이 이 나머지 '절반' 성공했다고 하는 것이다. 나는 크라잉넛의 책을 읽으면서 인생에 대해 많은 생각을 했다. 그들에게 크게 빚졌다고 생각한다. 그 빚을 갚고 싶다. 그래서 그들도 이 책을 읽기를 바란다. 인생의 나머지 절반도 소신대로 하기를 기대한다.

# 내 인생은 나의 것

내 문제는, 꼭 하고 싶은 일이 없다는 것이었다. 그걸 하지 못한다면 삶이 깜깜해질 것 같은, 그렇게 간절하게 하고 싶은 일이 없었다.
생각을 해보지 않은 것은 아니었다. 어렸을 때 제사를 지내러 큰집에 가면 어른들이 아이들을 모아놓고 조상들 이야기를 들려주었다. 오늘 제사를 모신 할아버지는 이런 벼슬을 하셨고, 외가는 어떠했으며, 처가는 누구의 후손이다. 뭐 그런, 끝도 없이 가지를 쳐나가는 옛날이야기였다. '가문의 영광'에 대한 강의가 끝나면 어른들은 커서 커서 '무엇'이 되고 싶으냐고 물었다. 모법 답안은 판사나 검사였다. 의사나 공무원도 대충 정답으로 통했다. 그와 다른 대답은 어른들을 실망하게 만든다는 것을 알았기에 나는 판사가 되겠다는 모법의 답안을 말하곤 했다. 어른들은 매우 기꺼워하셨다.그러나 '어떤 사람'이 되고 싶은지, 삶의 목표가 무엇인지는 아무도 묻지 않았다.

평범한 삶이 아름답고 행복할 수 없다는 게 아니다. 평범해도 평범하지 않아도, 인생은 훌륭하거나 비천할 수 있다. 이냇ㅇ의 품격은 평범함이나 비범함과 상관 없는 것이다. 내 문제는 꿈이 없다는 것이었다. 내 문제는 꿈이 없다는 것이었다. 내게는 무엇인가 꼭 이루고 싶은 목표가 없었다. 그저 현실에 잘 적응했을 뿐이다.
그때 이후 지금까지 목표도 방향도 없이 '닥치는 대로' 살았다. 마구잡이로 살았다는 뜻이 아니다. 그때그때 눈앞에 닥쳐온 일을 나름 성실하게 열심히 하면서 살았다. 대학생 때는 정부와 언론이 '지하대학'이라고 불렀던 학회에 가입해 독재정권이 금서(禁書)로 지정한 책을 읽었다. 구로동 야학교사가 되어 또래 여성 노동자들의 학습을 도왔다. 반정부 시위를 하다가 잡혀가고 학교에서 쫓겨났다. '불법 유인물'과 화염병을 만들었다. 징역을 살았다. '범죄 조직'을 만든 증거로 악용된다고 해서 사진을 찍지도 않았고 일기를 쓰지도 않았다. 설렘과 환희로 빛나야 마땅한 청춘을 그렇게 아무 흔적 남기지 않고 보냈다.
최선을 다해 '닥치는 대로' 살았으니 후회는 없다. 생각해보면 그때가 내 인생에서 가장 순수하고 열정적인 시기가 아니었나 싶다. 시내 공중화장실이나 공중전화 박스에 독재정권을 비판하는 유인물 몇 장을 '살포'하는 데 성공한 것만으로도 온 세상을 다 얻은 것 같은 환희를 느끼곤 했다. 국회의원이나 장관이 되는 것과는 비교할 수 없을 정도로 짜릿한 희열이었다. 지금도 그것이 사회적으로 의미 있는 활동이었다고 생각한다. 그러나 훌륭한 삶은 아니었다. 내 자신이 설계한 인생, 내가 원한 삶의 방식은 아니었기 때문이다.
어떻게 살 것인가? 이 나이에 아직도 이런 질문을 껴안고 있는 내가 한심해 보인다. 그러나 이것이 여태껏 살아온 내 삶의 결과임을 인정한다. 만약 지금까지 살아온 그대로 계속해서 살면 좋겠다고 생각한다면, 그 사람의 인생은 이미 훌륭한 인생이다. 그대로 가면된다. 그러나 계속해서 지금처럼 살 수는 없다고 느끼거나 다르게 살고 싶다고 생각한다면, 그 사람의 삶은 아직 충분히 훌륭하다고 할 수 없다. 더 훌륭한 삶을 원한다면 지금이라도 무언가를 바꾸어야 한다. 나는 내가 좋아하는 것을 들고 능동적으로 세상과 부딪차자 못했다. 버민하면서 주저하는 내게, 세성이 먼저 부딪쳐 왔다. 세상은 나더러 체념하거나 굴복하라고 했고, 나는 거절하고 저항했을 뿐이다. 부당한 강요에 굴복하면 삶이 너무나 비천해질 것 같았다. 그래서 최소한의 인간적 존엄과 품격을 지키려고 발버둥 쳤다. 성년이 된 이후 오랫동안 내 삶을 지배한 감정은 기쁨이나 즐거움이 아니었다. 수치심과 분노, 슬픔, 연민, 죄책감, 의무감 같은 것이었다.

'닥치는 대로' 산 것은 전적으로 내 책임이다. 다른 사람이나 세상을 원망할 수 없다. 세상은 제 갈 길을 가고, 사람들은 또 저마다 자기 삶을 살 뿐이다. 세상이, 다른 사람이 내 생가과 소망을 이해하고 존중하고 배려해준다면 고맙겠지만, 그렇지 않다고 해서 세상을 비난하고 남을 원망할 권리는 없다고 생각한다. 소극적 선택도 선택인 만큼, 성공이든 실패든 내 인생은 내 책임이다. 그 책임을 타인과 세상에 떠넘겨서는 안 된다. 삶의 존엄과 인생의 품격은 스스로 찾아야 한다. 죄악과 비천함에서 자기를 지키는 것만으로는 훌륭한 삶을 살 수 없다. 악당이나 괴물이 되지 않았다고 해서 훌륭한 것은 아니다. 무엇이 되든, 무엇을 이루든, '자기 결정권' 또는 '자유의지'를 적극ㅈ거으로 행사해 기쁨과 자부심을 느낀느 인생을 살아야 훌륭하다고 할 수 있다. 나는 그렇게 믿는다.
인생에서 가장 중요한 것은 '자기 결정권'을 행사하는 일이다. '자기 결정권'이란 스스로 설계한 삶을 옳다고 믿는 방식으로 살아가려는 의지이며 권리이다. 철학자 존 스튜어트 밀(J. S. Mill)의 표현을 가져다 쓰자. '사람은 누구든지 자신의 삶을 자기 방식대로 살아가는 것이 바람직하다. 그 방식이 최선이어서가 아니라, 자기 방식대로 사는 길이기 때문에 바람직한 것이다.' 사람마다 인생을 다르게 산다. 평생 공부하는 살마, 노래하고 춤추는 사람, 돈을 버는 데 골몰하는 사람, 일만 하는 사람, 권력을 좇는 사람, 신을 섬기는 사람 등 백 사람이 있으면 백 가지의 삶이 있다. 어느 것이 더 훌륭한지 가늠하는 객관적 기준은 없다. 스스로 설계하고 선택한 것이라면 어떤 삶이든 훌륭할 수 있다. 그러나 아무리 화려해 보여도 자유의지로 만들어낸 삶이 아니면 훌륭할 수 없다.
나는 내 삶을 스스로 설계하지 않았다. '닥치는 대로' 열심히 살았지만 내가 원하는 삶을 내가 옳다고 생각하는 방식으로 산 것은 아니었다. 지금부터라도 내 삶에 대해 더 큰 자부심과 긍지를 느끼고 싶다. 살아가는 모든 순간마다, 내가 하는 모든 일에서 의미와 기쁨을 느끼고 싶다. 아직은 기회가 남아 있다고 생각한다. 그러려면 무엇인가 바꿔야 한다. 가장 먼저 바꿔야 할 것은 삶을 대하는 태도가 아닌가 싶다. 조금 늦은 감은 있지만 이제부터라도 내 마음이 가는 대로 살고 싶다. 내가 하고 싶은 일을 내가 옳다고 믿는 방식으로 하는 것이다. 다른 사람을 해치는 일은 절대 없어야 한다. 그리고 내가 하는 일이 세성을 더 훌륭하게 만드는 데 보탬이 되어야 하고, 그 과정에서 내 자신도 훌륭해져야 한다.
여태껏 오로지 남을 위해서 산 건 결코 아니었다. 세상을 위해 살았다고 주장할 생각도 없다. 그러나 나를 위해, 내 자신의 행복을 위해 사는 인생은 훌륭할 수 없다는 관념에 눌려서 산 것만은 사실이다. 그래서 내가 어떤 삶을 진정 원하는지 깊이 들여다보질 않았다. 무엇에선가 즐거움과 행복을 느낄 때마다 근원은을 알 수 없는 죄의식에서 사로잡히곤 했다. 행복을 느끼는 순간마다 누구에겐가 잘못을 저지르는 것 같았다. 생각해보면 꼭 그래야만 할 이유는 없었다. 누가 그렇게 살라고 하지도 않았다. 내가 괴로워한다고 해서 누군가 더 행복해지는 것도 아니었다. 도덕주의적으로 보든 실용주의적으로 보든 좋은 생각이 아닌 것이다. 내게는 내가 원하는 대로 살 권리가 있다. 이제부터라도 남의 시선을 의식하지 않고, 그 어떤 이념에도 얽매이지 않고, 내 마음이 내는 소리에 귀 기울이면서 떳떳하게 그 권리를 행사하고 싶다. 좋아하는 일을 하면서 기쁘게 살고 싶다. 스무 살의 크라잉넛 멤버들처럼.

# 왜 자살하지 않는가

글쓴이들은 죽음이 임박한 사람들을 만났고 그들의 마지막 모습을 들려준다. 하지만 실제로 말하려는 것은 죽음이 아니다. '어떻게 살 것인가? 행복한 삶은 어떤 것인가? 무엇이 인생을 훌륭하게 만드는가? 삶의 의미는 무엇인가?' 그런 것이다.
나는 심오한 인생론을 펼친 위대한 고전보다 이런 책이 좋다. 쉽게 읽히고, 재미있고, 감동을 받는다. 읽다 보면 나도 모르게 눈물이 나기도 한다. 아무리 이름난 철학자라 해도 너무 어렵게 이야기하면 좋아하지 않는다. '나도 배울 만큼 배운 사람인데, 그런 내가 읽어도 무슨 소리인지 알기 어려운 걸 누구보고 읽으라는 거야!' 그렇게 화가 난다. 여러 번 되풀이해 읽어도 이해가 되지 않는 책을 쓴 사람은 심지어 미워하기까지 한다. 심각한 열등감을 안겨주기 때문이다. '난 머리가 나쁜가 봐.', '지적 재능이 없나 봐.', '형이하학적(形而上學) 인간인가 봐.' 그렇게 자학하도록 만든다. 그 때문에 실존주의(existentialism, 實存主義) 철학자들을 특별히 못마땅하게 여겼다.

열등감은 삶의 기쁨을 갉아먹는 부정적인 감정 중에서도 단연 고약한 것이다. 열등감에 깊이 빠지면 자기 자신을 비천한 존재로 느끼게 된다. 그래서는 기쁜 삶을 살지 못한다. 기쁘지 않은 삶은 흘륭하기 어렵다. 열등감과 자기 비하의 덫에 걸리지 않으려면 '정신승리법'이 필요하다. 완벽한 정신승리법이 있을 것이라고 생각하지는 않는다. 그러나 조금이라도 도움이 되는 방법은 여러 가지가 있다. 내가 즐겨 쓰는 방법은 이솝 Aesop 우화집에 등장하는 여우의 '신 포도 논리'이다. '저 포도는 맛이 없고 시기만 할 게 분명해.' 너무 높이 있어서 아무리 해도 손이 닿지 않는다면 이렇게 생각하는 게 마음이 편하다. 세상에는 아무리 애를 써도 손에 넣지 못한 포도송이가 사방 널려 있다. 그때마다 열등감을 느끼고 자기를 비하한다면 제대로 살 수가 없을 것이다. 사람들은 흔히 여우가 교묘하게 자신의 무능을 합리화했다고 비웃는다. 하지만 나는 이것이 다소 진부해 보이지만, 삶을 긍정적인 태도로 살아나가는 데 도움이 된다고 생각한다.
세상에는 오로지 못할 나무가 너무나 많다. 곳곳에 '넘을 수 없는 4차원의 벽'이 서 있다. 도전하지도 않고 포기하는 것도 어리석지만, 오르지 못할 나무와 넘을 수 없는 벽을 오르고 넘어서야 행복한 삶, 성공하는 인생을 살 수 있는 게 아니다. 내게 적합한 나무, 노력하면 넘을 수 있고 넘는 게 즐거운 벽을 잘 골라야 한다. 그렇게 해야 인생이라는 '너무 짧은 여행'을 후회 없이 즐길 수 있다.

너무나 간절하게 영생을 원한 나머지 그것을 구하는 일에 몰두하느라 유한한 인생에서 맛볼 수 있는 모든 환희와 행복을 포기하는 사람들을 보면 안타까운 마음이 든다. 나는 영생을 원하지 않는다. 단 한 번만, 즐겁고 행복하게 그리고 의미 있게 살고 싶을 뿐이다.

하루의 삶은 하루만큼의 죽음이다. 어떻게 생각하든 이 사실은 바뀌지 않는다. 새날이 밝으면 한 걸음 더 죽음에 다가선다. 그런데도 우리는 때로 그 무엇엔가 가슴 설레어 잠들지 못한 채 새벽이 쉬이 밝지 않음을 한탄한다. 결코 영원할 수 없음을 알면서도 누군가에게 영원한 사랑과 충성을 서약한다. 죽음을 원해서가 아니다. 의미 있는 삶을 원해서다. 인생은 그런 것이다. 하루가 모여 인생이 된다. 인생 전체가 의미 있으려면 살아 있는 모든 순간들이 기쁨과 즐거움, 보람과 황홀감으로 충만해야 한다.
그런데도 때로 그것을 잊는다. 오늘의 삶을 누군가를 향한 미움과 원한으로 채운다. 가진 돈이 많은데도 더 많은 돈을 얻으려고 발버둥 치면서 얼마 남지 않은 삶의 시간을 탕진한다. 이미 높은 곳에 있으면서도 더 높은 곳으로 오르기 위해 오늘 누릴 수 있는 행복을 내일로 미루어둔다. 그 모든 것이 나의 삶에 어떤 의미를 가지는지 묻지 않는다.
그리하여 운명의 마지막 페이지를 넘길 때쯤에야 비로소, 자신이 의미없는 인생을 살았음을 허무하게 깨닫는다. 그러나 한 번 살아버린 인생은 되돌릴 수 없으며, 놓쳐버린 삶의 환희는 되찾을 수 없다.

다른 한편에는 어차피 찾아들 죽음을 서둘러 맞아들이는 사람들이 있다. 언젠간 반드시 건너야만 할 죽음의 강을 바삐 건너간다. 삶을 견디기 힘들어서, 더 살아야 할 이유를 찾을 수 없어서, 또는 죽음이 아니고는 표현할 수 없는 소망이나 분노 때문에 사람들은 스스로 목숨을 끊는다. 이런 죽음 가운데 극소수만이 세인의 관심을 끈다. 죽음으로 말하려고 했던 것을 사람들에게 들려준다. 자살 그 자체를 불행이나 죄악이라고 단정할 수는 없다. 때로 자살은 고통에서 벗어나 자유와 존엄을 찾는 수단이 되며 삶의 의미를 완성하는 행위가 되기도 한다. 구한 말 지식인 매천(梅泉) 황현(黃玹)의 자결, 청년 노동자 전태일의 분신(焚身), 노무현 대통령의 투신(投身)이 그런 것이라고 생각한다. 그들은 죽었으나 그냥 사라지거나 망각되지 않았다. 그들의 죽음은 살아 있는 사람들에게 던진 질문이다. 들을 준비가 된 사람들은 그 질문을 듣고 생각하면서 죽은 이들과 속 깊은 이야기를 나눈다.

인간의 삶과 죽음은 비대칭이다. 생명은 자신의 의지와 무관하게 주어진다. 언제, 어디에서, 어떤 부모에게서, 어떤 모습으로, 어떤 재능을 안고 태어날지 누구도 선택할 수 없다. 사람은 모두 '던져진 존재'로 이 세상에 온다. 먼저 태어나고, 그 다음에 자신의 존재와 삶의 환경을 인식한다. 다른 동물도 그렇다. 그런데 특별한 사정이 없다면, 인간은 자기가 원하는 때 원하는 방법으로 죽을 능력이 있다. 인간만의 특징이다. 다른 종(種)은 삶도 죽음도 모두 우연 또는 운명에 의해 주어진다. 삶과 죽음을 비대칭으로 만드는 것은 인간이 지닌 이성 또는 지성의 힘이다.
우리는 내가 누구이며 어디에서 왔는지, 나와 물질세계가 어떻게 연결되어 있는지를 안다. 삶의 의미가 무엇인지 탐색한다. 사람의 가치를 잃었다고 느낄 때 스스로 죽음을 선택하기도 한다. 카뮈는 이 능력의 사용에 관한 의사 결정이 유일하게 중대한 철학적 문제라고 주장했다.

참으로 중대한 철학적 문제는 단 하나뿐이다. 그것은 자살이다. 인생이 살만한 가치가 있는가 없는가를 판단하는 것, 이것이 철학의 근본적인 질문에 대답하는 것이다. 그 이외의 것, 세계는 삼차원을 가지고 있는가, 정신은 아홉 개 또는 열두 개의 범주를 가지고 있는가 하는 문제는 그 이후의 일이다. 그것들은 장난이다.

왜 자살하지 않느냐고 카뮈는 물었다. 그냥 살기만 할 것이 아니라 사는 이유를 찾으라는 것이다. 이 질문에 대답하려면 삶이 나에게 어떤 의마가 있는지를 알아야 한다. 오늘 하루 그 의미를 충족하는 삶을 살았는지 판단해야 한다. 정답은 없다. 우리는 각자 정체성이 다른 자아(自我)들이다. 누구도 타인에게 삶이 어떤 의미를 가져야 한다고 대신 결정해줄 수 없다. 삶의 의미는 사람마다 다를 수 잇다. 중요한 건 나름의 다랍을 가지고 사는 것이다. 스스로 의미를 부여하지 못하는 삶은 훌륭할 수 없다. 아무리 많은 돈과 큰 권력을 가지고 있어도, 아무리 유명한 사람이라고 해도, 의미를 모르는 삶은 비천하고 허무할 뿐이다. 숱한 고난을 받고 살다가 모진 핍박을 받아 죽을지라도, 스스로 뚜렷한 가치와 의미를 부여하며 살았다면 훌륭한 인생이다.

# 위로가 힘이 될까?

부조리 가득한 세상에서 존엄한 인간으로서 품격 있게 살아가려면 나름의 답을 찾아야만 한다. 세상은 냉혹하다. 발 딛는 곳마다 예측하기 어려운 위험이 도사리고 있다. 나를 위해 존재하는 삶은 없다. 늙고 병 드는 것을 막지 못한다. 삶은 언제나 불안하다. 우리는 늘 어디엔가 부딪치고 누구에겐가 상처받으며 살아간다. 욕망을 제어하지 못해 실수와 잘못을 저지른다. 남들은 다 잘해나가는데 나만 해매고 있다는 자괴감에 빠진다. 아무도 나를 이해해주지 않는 것 같아 깊은 외로움을 느낀다. 마음이 온통 폐허가 되어, 차차리 죽어버리면 좋겠다는 충동에 휩쓸리기도 한다. 누구에게나 인생은 그런 것이다. 그러나 내 삶의 의미가 무엇인지 분명하게 아는 사람은 아무리 큰 상처를 받아도 다시 일어나 스스로 치유한다. 반면 삶의 의미를 찾지 못한 사람은 작은 불운에도 쓰러지고 만다.

위로는 좋은 일이다. 상처를 아물게 하고 아픔을 덜어준다. 아프고 지친 사람이 많아서 그런지, 요즘은 책도 신문 방송도 모두 '힐링(healing)'이 대세다. 그런데 나는 그런 말을 잘 하지 않는다. 어떤 이야기가 위로와 치유의 효과를 내는지 몰라서 그러는 게 아니다. 자기의 삶이 어떤 의미가 있는지 치열하게 고민하지 않는 사람에게는 타인의 위로가 별 도움이 되지 않는다고 보기 때문이다. 청년은 아기가 아니다. 넘어져 무릎이 깨지는 것을 두려워하지 말아야 하고, 상처를 입어도 혼자 힘으로 일어나야 한다. 그런 사람이라야 비로소 타인의 위로를 받아 상처를 치유할 수 있다. 그렇게 생각하다 보니 말이 냉정해진다. 그래도 어쩔 수 없다. 나 말고도 위로하는 사람이 많은데, 나가지 그런 필요는 없지 않겠는가.
삶의 의미는 사회나 국가가 찾아주지 않는다. 찾아줄 수도 없고, 찾아주어서도 안 된다. 각자 알아서 찾아야 한다. 찾지 못할 경우 그 책임은 전적으로 그 사람 자신에게 있다. 이것은 어린아이가 아니라면 누구나 할 수 있다. '가방끈'이 길지 않아도 된다. 재산이 적어도 상관없다. 나이도 관계없다. 나는 '힐링' 열풍이 조금 불편하고 불안하다. 각자 남들은 조금 더 배려하고 제도를 더 합리적으로 바꾸기만 하면 모두가 존엄하고 의미 있는 삶을 살 수 있다는 착각을 일으키지 않나 걱정이 된다. 정직하게 말하면, 스스로 삶의 의미를 찾지 못한 사람에게 타이의 위로는 별 도움이 되지 않는다.제도 개선도 마찬가지다. 그것은 단지 삶의 환경을 조금 덜 냉혹하게 만들 뿐, 그 자체가 내 삶을 행복하게 하지는 못한다.

상처받지 않는 삶은 없다. 상처받지 않고 살아야 행ㅗㄱ한 것도 아니다. 누구나 다치면서 살아간다. 우리가 할 수 있고 해야 하는 일은 세상의 그 어떤 날카로운 모서리에 부딪쳐도 치명상을 입지 않을 내면의 힘, 상처받아도 스스로 치유할 수 있는 정신적 정서적 능력을 기르는 것이다. 그 힘과 능력은 인생이 살 만한 가치가 있다는 확인, 사는 방법을 스스로 찾아려는 의지에서 나온다. 그렇게 자신의 인격적 존엄과 인생의 품격을 지켜나가려고 분투하는 사람만이 타인의 위로를 받아 상처를 치유할 수 있으며 타인의 아픔을 위로할 수 있다.

'왜 자살하지 않는가?' 카뮈의 질문에 나는 대답한다. 가슴이 설레어 잠을 이루지 못하는 밤이 있다. 이루어지기만 한다면 너무 좋아서 두 주먹을 불끈 쥐고 뛰어오를 것 같은 일이 있다. 누군가 못 견디게 그리워지는 시간이 있다. 더 많은 것을 주고 싶지만 그렇게 할 수 없어 미안한 사람들이 있다. 설렘과 황홀, 그리움, 사랑의 느낌···. 이런 것들이 살아 있음을 기쁘게 만든다. 나는 더 즐겁게 일하고, 더 열심히 놀고, 더 많이 더 깊게 사랑하고 싶다. 더 많은 사람들과 손잡고 더 아름다운 것을 더 많이 만들고 싶다. 미래의 어느 날이나 피안(彼岸)의 세상에서가 아니라, '지금' 바로 '여기'에서 그렇게 살고 싶다. 떠나는 것이야 서두를 필요가 없다. 더 일할 수도 더 놀 수도 누군가를 더 사랑할 수도 타인과 손잡을 수도 없게 되었을 때, 그 때 조금 아쉬움을 남긴 채 떠나면 된다.

# 놀고 일하고 사랑하고 연대하라

그는 세상과 삶 그 자체가 부조리라고, 죽음이 예정되어 있다는 점에서 살아 있는 사람은 모두 사형수나 마찬가지라고 생각했다. 자살은 이 부조리를 알고 체념하는 것이다. 살아가려면 체념하지 말고 반항해야 한다. 있는 힘을 다해 모든 것을 소모하면서 살고, 이 해결할 수 없는 부조리와 끝내 화해하지 않은 채 죽는 것이다. 카뮈가 주장한 바는 명확하다. 지금 이 순간 자유로운 존재로서 있는 힘을 다해 살라는 것이다. 나는 이 말을 전적으로 지지한다. 그런데 카뮈는 최선을 다해 무엇을 했을까? 그는 있는 힘을 다해 열정적으로 일했다. 놀았다. 사랑하고 연대했다.

- + diff --git "a/Books/20230110-\353\213\210\354\262\264\354\231\200-\354\236\245\354\236\220\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" "b/Books/20230110-\353\213\210\354\262\264\354\231\200-\354\236\245\354\236\220\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" index 3b5bd8b9..8568d23a 100644 --- "a/Books/20230110-\353\213\210\354\262\264\354\231\200-\354\236\245\354\236\220\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" +++ "b/Books/20230110-\353\213\210\354\262\264\354\231\200-\354\236\245\354\236\220\353\212\224-\354\235\264\353\240\207\352\262\214-\353\247\220\355\226\210\353\213\244.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 니체와 장자는 이렇게 말했다

# 프롤로그 - '서양의 장자' 니체, '동양의 니체' 장자

고통이란 자기 삶을 풍족하게 할 수 있는 디딤돌이다

장자는 동양 철학사에서 가장 손꼽히는 이단아였다. 서민을 위한 거리의 철학자로 평생을 살면서, 아무도 울어주지 않는 이들을 위해 대신 울어주려 했다. 니체(F.Nietzsche)는 서양 철학사에서 가장 급진적인 반항아였다. 그는 망치를 들고서 인간의 자유를 억압하는 엄혹한 세태를 날카롭게 풍자했다. 두 사람은 인간의 진정한 자유를 위해 평생 고군분투했다. 또 피고한하기 이를데 없는 여러 사회적 압박에서 벗어나 자연 그대로의 본성에 충실하고 만족하는 방법을 가르쳐 주었다. 이 책은 동서양 각각에서 극한의 사유를 대표하는 니체와 장자가 극적으로 만나는 장이다. 이 책은 니체와 장자의 철학을 우리가 살아가는 구체적인 삶의 속살로 인내할 것이다.
+

# 니체와 장자는 이렇게 말했다

# 프롤로그 - '서양의 장자' 니체, '동양의 니체' 장자

고통이란 자기 삶을 풍족하게 할 수 있는 디딤돌이다

장자는 동양 철학사에서 가장 손꼽히는 이단아였다. 서민을 위한 거리의 철학자로 평생을 살면서, 아무도 울어주지 않는 이들을 위해 대신 울어주려 했다. 니체(F.Nietzsche)는 서양 철학사에서 가장 급진적인 반항아였다. 그는 망치를 들고서 인간의 자유를 억압하는 엄혹한 세태를 날카롭게 풍자했다. 두 사람은 인간의 진정한 자유를 위해 평생 고군분투했다. 또 피고한하기 이를데 없는 여러 사회적 압박에서 벗어나 자연 그대로의 본성에 충실하고 만족하는 방법을 가르쳐 주었다. 이 책은 동서양 각각에서 극한의 사유를 대표하는 니체와 장자가 극적으로 만나는 장이다. 이 책은 니체와 장자의 철학을 우리가 살아가는 구체적인 삶의 속살로 인내할 것이다.
장자는 BC 369년에 태어나 BC 289년경에 사망했으며, 니체는 AD 1844년에 태어나 20세기가 시작되는 1900년에 사망했다. 두 철학자의 시대적 차이는 무려 2,000년이 넘는다. 그 차이가 어처구니없을 정도로 크기 때문에, 같은 범주로 묶어 다루는 것이 타당하지 않은 것으로 보일 지경이다. 하지만 생각이 공유되는 지점이 많다면 시공간의 차이양 무슨 대수랴? 혼란의 시대를 진단하는 문제의식과 개념에서 두 철인은 많이 닮았다. 장자에게는 '동양의 니체'라는 별명을 매길 수 있고, 니체를 두고는 '서양의 장자'로 일컬을 수 있다.
니체와 장자 사이에는 서양과 동양이라는 공간적 차이라는 장벽과 2,000년이 넘어가는 시간적 차이라는 장벽이 가로놓여 있다. 하지만 이들은 정신세계의 일란성쌍둥이라고 말할 법하게 닮은 구석이 많다. 니체 철학의 니힐리즘(Nihilism) · 위버멘쉬(Ubermensch, 초인) · 영원회귀는 장자 철학의 무(無) · 진인(眞人) · 만물의 순환에 조응한다. 이 두 사람의 유전자가 닮았다는 것은 글쓰기 패턴에서부터 느낄 수 있다. 이들의 글쓰기 패턴은 철학적이기보다는 서사시에 가깝다. 니체와 장자는 세련된 은유로 인간과 세계에 대해 표현했다. 니체의 저서에는 시적인 어휘와 신화적인 서술이 넘쳐난다. 장자도 주로 이솝우화와 같은 글쓰기 방식으로 글을 썼다. 그런데 니체와 장자의 철학이 비슷한 것까지는 좋은데, '오늘날' 장자와 니체가 의미 있는 이유는 과연 어디에서 찾을 수 있을까?
현재 사회에서 '근복적인' 위기는 인간 '마음'의 위기다. 물론 엄밀히 따져보면 예나 지금이나 '마음'의 위기가 없었던 적은 없다. 하지만 현재 사회에서 우리가 겪고 있는 마음의 위기는 과거와는 차원이 다르다. 그야말로 순식간에 바뀌어 가는 사회 환경의 변화와 가면 갈수록 심해지는 물질만능주의는 우리를 무한 경쟁으로 내몰고 있다. 가장 중요한 관심사는 뒤처지지 않는 것, 또 이를 위해서 나의 '스펙'을 끊임없이 쌓아나가는 것밖에는 없다. 우리는 대체로 내가 원하는 것이 아니라, 누구나 좋다고 평가하는 것을 쫓으면서 살아간다. 다시 말해 '진정한 자기'가 실종된 삶을 산다.
@@ -41,6 +41,6 @@ 장자의 아포리즘에서 대붕과 작은 새는 각각 자신들의 입장에서 삶을 전망하고 있다. 모든 존재는 자신이 속한 틀의 한계 내에서 세상을 바라볼 수밖에 없으며, 단지 자신이 대상과 관계 맺고 있는 물리적 거리나 심리적 거리에 따라 이것과 저것을 구분할 뿐이다. 관찰은 그 관찰자가 위치한 좌표에 의해 결정된다. 결국 모든 인식이란 인식하는 자의 위치에 따라 내려지는 제약된 해석일 수 밖에 벗다. 대붕을 비웃는 작은 새는 자신의 입장에서 삶을 바라보고 있을 뿐이다.
장자는 자기 마음이 진정으로 원하는 자연적 욕구를 충족 시켜야만 한다고 말한다. 자연 그대로의 마음으로부터 우러난 것이 아닌데도 단지 대외적으로 유의미하다는 이유로 무조건 따른다면, 이는 온전한 덕을 갖추지 못한 것이다.

다음은 장자와 소요유에 나오는 우화 한 토막이다.

"뱁새는 깊은 숲속에 둥지를 지을 때도 나뭇가지 하나면 충분하고, 두더지는 넓은 강물을 마신다 하더라도 고작 자신의 작은 배를 채우면 그만입니다. 그만 돌아가 쉬십시오, 왕이시여!"

인간은 자기의 생의 조건에 걸맞게 살아야만 진정한 자유를 누릴 수 있다. 장자는 한쪽이 다른 한쪽을 공격할 수밖에 없는 한계를 지적한다. 동시에 이 양방향의 입장이 모두 의미가 있다고 보는 가치의 확장성을 강조한다. 장자는 어떤 필요를 충족시키는 유일한 최선의 길을 제시하려고 하진 않았다. 필요를 충족시키는 길을 다수이며 그 어는 것도 최선의 길일 수 없다.
니체 또한 이렇게 말했다.

"이것이 나의 길이다. 너희들의 길은 어디 있는가? 나는 내게 길을 묻는 자들에게 이렇게 대꾸해왔다. 왜냐하면, 모두가 가야할 단 하나의 길이란 아예 존재하지 않기 때문이다."
차라투스트라는 이렇게 말했다

- + diff --git "a/Books/20230404-\353\202\230\354\235\230-\354\262\253-\354\243\275\354\235\214\355\225\231-\354\210\230\354\227\205.html" "b/Books/20230404-\353\202\230\354\235\230-\354\262\253-\354\243\275\354\235\214\355\225\231-\354\210\230\354\227\205.html" index 50d43c0c..71300afb 100644 --- "a/Books/20230404-\353\202\230\354\235\230-\354\262\253-\354\243\275\354\235\214\355\225\231-\354\210\230\354\227\205.html" +++ "b/Books/20230404-\353\202\230\354\235\230-\354\262\253-\354\243\275\354\235\214\355\225\231-\354\210\230\354\227\205.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 나의 첫 죽음학 수업

  • 문현공 저, 책과이음

# TOC:

# 프롤로그: 죽음이라는 그림자

병원에서 진단을 받거나 사고를 당해 언제 죽을지 아는 경우도 있지만 사실 죽음이란 급작스럽게 찾아옵니다. 우리는 몇 개월 뒤에 죽을 수도, 며칠 뒤에 죽을 수도 있습니다. 여행을 가다 죽을 수도, 길을 건너다 죽을 수도, 잠을 자다가 죽을 수도 있죠. 실로 죽음이란 예상치 못하게 불현듯 찾아옵니다. 우리가 거의 매일 인터넷에서 기사로 접하는 누군가의 죽음, 기사나, 영화, 드라마에 나오는 죽음은 실은 나와는 전혀 상관없는 이야기가 아니라, 우리 자신과 사랑하는 이에게 언젠가 반드시 찾아올 실체입니다.

그런데도 우리는 평소 죽음에 대해, 그리고 죽음을 맞이하는 자세에 대해 심각하게 고민하거나 배우려 하지 않습니다. 죽음은 슬픔과 두려움의 대상이 되어 철저하게 억압되고 감추어집니다. 임종이 임박한 환자들을 대상으로 한 죽음 교육 또한 찾기 힘들며, 호스피스 시설이나 중환자실의 말기 환자들을 대상으로 완화치료(palliative care)를 시행하는 데 초점을 맞출 뿐입니다. 비유해서 말하자면 발병의 근본 원인이 아니라 겉으로 드러난 증상을 찾아 다스리는 데 그치는 격이죠. 누구나 맞이할 삶의 마지막 단계에 대한 교육과 대비가 추우분하지 않다는 현실은 한 번쯤 짚어볼 필요가 있습니다.

사람들은 자신이 보고 싶어 하는 것을 보는 경향이 있습니다. 그러나 슬픔과 기쁨이 그렇듯 빛과 그림자는 늘 함께하고, 태어남과 죽음도 마찬가지입니다. 그러므로 우리는 지금 이 순간을 살면서 다음과 같은 사실을 외면하지 말아야 합니다. '죽음은 떼어낼 수 없는 그림자처럼 언제 어디에서나 나 자신과 사랑하는 이들의 뒤를 따라다닌다'는 단 하나의 진실 말입니다.

이 책은 제가 대학 강의에서 다루는 내용과 함께 일상에서 떠올리는 소소한 단상을 녹여내 묶은 것입니다. 죽음은 언뜻 거창한 것 같지만, 오늘도 어딘가에서 일어나고 있는 일상의 경험이기도 합니다. 이 책이 어느 날 갑자기 찾아온 커다란 우울감과 상실감에 사로잡혀 힘들어하는 모든 이에게 작은 도움이 될 수 있다면 더할 나위 없겠습니다.

# 죽음이란 무엇인가

과연 죽음이란 무엇일까요. 죽음의 사전적 정의는 '생물의 생명이 끝난 현상'입니다. 생물은 모두 알다시피 동물, 식무르 미생물 등을 말합니다. 그러면 생명이란 무슨 뜻일까요. '생(生)'이라는 글자에는 '탄생'과 '살아감'의 뜻이 함께 있습니다. 또한 '명(命)'은 '수명'을 말하는데, 이것은 '살아 있는 기간'을 의미합니다. 이 둘을 조합해보면 생명이란 '어느 기간에 태어나서 살아가는 존재'를 일컫는다는 사실을 알 수 있습니다. 따라서 죽음의 사전적 정의인 '생물의 새명이 끝난 현상'은 '한 생명이 태어나 살다가 그 기간이 끝난 것'입니다. 이것이 바로 죽음입니다. 이렇게 보면 죽음의 정의에서 중요한 것은 기간, 즉 '삶이 지속되는 시간'임을 알 수 있습니다.

그런데 한편으로 이런식의 정으에는 왠지 모를 위험성이 숨어 있는 듯합니다. 자연환경은 역동적으로 변하고 있고 자연법칙의 원리를 분석해 제시하고 규정하는 과학도 시대가 흐르면서 수정되어왔습니다. 아직 인간이 밝혀내지 못한 자연의 비밀도 많습니다. 따라서 의과학적으로 죽음을 규정하는 기준 또한 변화함을 부정할 수 없습니다. 최근 들어서는 '뇌 이식' 수술을 둘러싼 논의도 있지요.

만약 그런 수술이 흔해진다면 그때의 '내'가 '나'일 수 있을까요? 뇌 과학이 꿈꾸는 미래는 과거 어떤 기술보다 우리 삶을 변화시킬 것이라는 기대를 품게 만들지만 이것이 미칠 윤리적, 사회적 파장은 엄청날 것입니다. 아마 그때가 되면 지금 우리가 말하는 죽음은 더 이상 죽음이 아니게 될지도 모르는 일입니다.

# 후회 뒤에 오는 것들

"너는 돌 때 실을 잡았는데, 명주실을 새로 사서 놓을 것을, 쓰던 걸 놓아서 이리되었을까. 엄마가 다 늙어 너를 낳아서 배 속에 오래 품지도 못하고 빨리 낳았어. 한 달이라도 더 품었으면 사주가 바뀌어 네가 살았을까. 엄마는 모든 걸 잘못한 죄인이다. 몇 푼 벌어보겠다고 일하느라 마지막 전화 못 받아서 미안해. 엄마가 부자가 아니라서 미안해. 없는 집에 너같이 예쁜 애를 태어나게 해서 미안해. 엄마가 지옥 갈게. 우리 딸은 천국에 가." - 세월호 안산 합동 분향소에 쓴 어느 어머니의 편지

- +

# 나의 첫 죽음학 수업

  • 문현공 저, 책과이음

# TOC:

# 프롤로그: 죽음이라는 그림자

병원에서 진단을 받거나 사고를 당해 언제 죽을지 아는 경우도 있지만 사실 죽음이란 급작스럽게 찾아옵니다. 우리는 몇 개월 뒤에 죽을 수도, 며칠 뒤에 죽을 수도 있습니다. 여행을 가다 죽을 수도, 길을 건너다 죽을 수도, 잠을 자다가 죽을 수도 있죠. 실로 죽음이란 예상치 못하게 불현듯 찾아옵니다. 우리가 거의 매일 인터넷에서 기사로 접하는 누군가의 죽음, 기사나, 영화, 드라마에 나오는 죽음은 실은 나와는 전혀 상관없는 이야기가 아니라, 우리 자신과 사랑하는 이에게 언젠가 반드시 찾아올 실체입니다.

그런데도 우리는 평소 죽음에 대해, 그리고 죽음을 맞이하는 자세에 대해 심각하게 고민하거나 배우려 하지 않습니다. 죽음은 슬픔과 두려움의 대상이 되어 철저하게 억압되고 감추어집니다. 임종이 임박한 환자들을 대상으로 한 죽음 교육 또한 찾기 힘들며, 호스피스 시설이나 중환자실의 말기 환자들을 대상으로 완화치료(palliative care)를 시행하는 데 초점을 맞출 뿐입니다. 비유해서 말하자면 발병의 근본 원인이 아니라 겉으로 드러난 증상을 찾아 다스리는 데 그치는 격이죠. 누구나 맞이할 삶의 마지막 단계에 대한 교육과 대비가 추우분하지 않다는 현실은 한 번쯤 짚어볼 필요가 있습니다.

사람들은 자신이 보고 싶어 하는 것을 보는 경향이 있습니다. 그러나 슬픔과 기쁨이 그렇듯 빛과 그림자는 늘 함께하고, 태어남과 죽음도 마찬가지입니다. 그러므로 우리는 지금 이 순간을 살면서 다음과 같은 사실을 외면하지 말아야 합니다. '죽음은 떼어낼 수 없는 그림자처럼 언제 어디에서나 나 자신과 사랑하는 이들의 뒤를 따라다닌다'는 단 하나의 진실 말입니다.

이 책은 제가 대학 강의에서 다루는 내용과 함께 일상에서 떠올리는 소소한 단상을 녹여내 묶은 것입니다. 죽음은 언뜻 거창한 것 같지만, 오늘도 어딘가에서 일어나고 있는 일상의 경험이기도 합니다. 이 책이 어느 날 갑자기 찾아온 커다란 우울감과 상실감에 사로잡혀 힘들어하는 모든 이에게 작은 도움이 될 수 있다면 더할 나위 없겠습니다.

# 죽음이란 무엇인가

과연 죽음이란 무엇일까요. 죽음의 사전적 정의는 '생물의 생명이 끝난 현상'입니다. 생물은 모두 알다시피 동물, 식무르 미생물 등을 말합니다. 그러면 생명이란 무슨 뜻일까요. '생(生)'이라는 글자에는 '탄생'과 '살아감'의 뜻이 함께 있습니다. 또한 '명(命)'은 '수명'을 말하는데, 이것은 '살아 있는 기간'을 의미합니다. 이 둘을 조합해보면 생명이란 '어느 기간에 태어나서 살아가는 존재'를 일컫는다는 사실을 알 수 있습니다. 따라서 죽음의 사전적 정의인 '생물의 새명이 끝난 현상'은 '한 생명이 태어나 살다가 그 기간이 끝난 것'입니다. 이것이 바로 죽음입니다. 이렇게 보면 죽음의 정의에서 중요한 것은 기간, 즉 '삶이 지속되는 시간'임을 알 수 있습니다.

그런데 한편으로 이런식의 정으에는 왠지 모를 위험성이 숨어 있는 듯합니다. 자연환경은 역동적으로 변하고 있고 자연법칙의 원리를 분석해 제시하고 규정하는 과학도 시대가 흐르면서 수정되어왔습니다. 아직 인간이 밝혀내지 못한 자연의 비밀도 많습니다. 따라서 의과학적으로 죽음을 규정하는 기준 또한 변화함을 부정할 수 없습니다. 최근 들어서는 '뇌 이식' 수술을 둘러싼 논의도 있지요.

만약 그런 수술이 흔해진다면 그때의 '내'가 '나'일 수 있을까요? 뇌 과학이 꿈꾸는 미래는 과거 어떤 기술보다 우리 삶을 변화시킬 것이라는 기대를 품게 만들지만 이것이 미칠 윤리적, 사회적 파장은 엄청날 것입니다. 아마 그때가 되면 지금 우리가 말하는 죽음은 더 이상 죽음이 아니게 될지도 모르는 일입니다.

# 후회 뒤에 오는 것들

"너는 돌 때 실을 잡았는데, 명주실을 새로 사서 놓을 것을, 쓰던 걸 놓아서 이리되었을까. 엄마가 다 늙어 너를 낳아서 배 속에 오래 품지도 못하고 빨리 낳았어. 한 달이라도 더 품었으면 사주가 바뀌어 네가 살았을까. 엄마는 모든 걸 잘못한 죄인이다. 몇 푼 벌어보겠다고 일하느라 마지막 전화 못 받아서 미안해. 엄마가 부자가 아니라서 미안해. 없는 집에 너같이 예쁜 애를 태어나게 해서 미안해. 엄마가 지옥 갈게. 우리 딸은 천국에 가." - 세월호 안산 합동 분향소에 쓴 어느 어머니의 편지

+ diff --git "a/Books/20230711-\354\231\234-\353\202\230\353\212\224-\353\204\210\353\245\274-\354\202\254\353\236\221\355\225\230\353\212\224\352\260\200.html" "b/Books/20230711-\354\231\234-\353\202\230\353\212\224-\353\204\210\353\245\274-\354\202\254\353\236\221\355\225\230\353\212\224\352\260\200.html" index b7958f74..fb8f4d71 100644 --- "a/Books/20230711-\354\231\234-\353\202\230\353\212\224-\353\204\210\353\245\274-\354\202\254\353\236\221\355\225\230\353\212\224\352\260\200.html" +++ "b/Books/20230711-\354\231\234-\353\202\230\353\212\224-\353\204\210\353\245\274-\354\202\254\353\236\221\355\225\230\353\212\224\352\260\200.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 왜 나는 너를 사랑하는가

# 낭만적 운명론

어떤 사람을 두고 자신의 필생의 사랑이라고 말하는 것은 다 살아보고 나서야 가능한 일이다[따라서 불가능하다고 보야야 한다]. 그러나 클로이를 만난 직후, 그녀를 필생의 사랑이라고 부르는 것이 그렇게 무리한 일은 아니라는 생각이 들었다. 런던에 도착하여 클로이와 나는 오후를 함께 보냈다. 그리고 크리스마스 몇 주 전에 런던 서부의 한 레스토랑에서 저녁 식사를 함께 했으며, 가장 이상한 일이자 가장 자연스러운 일을 수행하듯 침대에서 저녁을 마무리했다. 그 뒤 그녀는 가족과 함께 크리스마스를 보냈고, 나는 친구들과 함께 스코틀랜드로 갔다. 그러나 우리는 매일 서로에게 전화를 했다. 때로는 하루에 다섯 번씩. 특별히 할 말이 있어서가 아니라, 단지 우리 둘 다 전에는 누구에게도 이런 식으로 이야기를 해본 적이 없다고 느꼈기 때문이다. 나머지 모든 것은 타협이고 자기 기만이라고 느꼈기 때문이다. 이제야 비로소 우리 자신을 이해할 수 있고 상대에게도 이해할 수 있고 상대에게도 이해시킬 수 있다고 느꼈기 때문이다. 진정으로 기다림[유사 메시아적인 성격을 지녔다]은 끝이 났다고 느꼈기 때문이다. 나는 그녀에게서 내가 평생 서툴게 찾아다녔던 바로 그 여자를 발견했다. 그녀의 웃음과 눈매, 유머 감각과 책을 고르는 취향, 불안과 지성이 내 이상에 기적적으로 들어맞았다.

그래도 우리는 만났다. 이 계산은 우리에게 이성적 주장들을 납득시키기는커녕, 우리가 서로 사랑하게 된 것에 대한 신비적 해석을 뒷받침해주었을 뿐이다. 어떤 사건이 일어날 가능성이 엄청나게 작은데도 결국 일어났다면, 운명론적 설명에 호소를 한다고 해도 용서받을 수 있지 않을까? 나는 동전을 던졌을 때 왜 앞 또는 뒤가 나왔는지 설명해달라고 신에게 매달리지는 않는다. 그 확률이 2분의 1이기 때문이다. 그러나 그것이 클로이와 내가 옆자리에 앉을 확률처럼 작은 경우일 때, 989,727분의 1의 확률일 때, 적어도 사랑 내부의 관점에서 보자면 그것을 운영 이외의 다른 것으로 설명하는 것이 불가능할 것 같았다. 우리의 삶을 바꾸어버린 만남의 확률이 그렇게 작았던 것을 아무런 미신 없이 받아들이려면 대단히 냉철한 지성이 필요할 것이다. 따라서 누군가 하늘에서 [3만 피트 상공에서] 운명의 줄들을 잡아당기고 있었다고 생각할 수 밖에.

사랑 내부의 관점에서는 삶의 우연적 성격을 목적성이라는 베일 뒤로 감춘다. 구원의 연인을 만나는 일이 객관적으로는 우연이고 따라서 가능성이 없는 일이기는 하지만, 그래도 하늘에서 천천히 펼쳐지는 두루마리에는 이미 기록되어 있었다고 주장한다. 우리는 불안에서 벗어나려고 운명이라는 것을 만들어낸다. 인생에 있는 그나마 얼마 안 되는 의미도 우리가 만들어낸다. 인생에 있는 그나마 얼마 안 되는 의미도 우리가 만들어낸 것일 뿐이며, 두루마리 같은 것은 없으며[따라서 우리를 기다리는 미리 정해진 숙명은 없다], 우리가 비행기에서 누구를 만나고 만나지 못하는 것에는 우리가 부여하는 의미 외에는 아무런 의미도 없다는 사실을 인정할 때 생기는 불안-간단히 말해서 아무도 우리의 이야기를 기록해두지 않았고, 우리의 사랑을 보장해주지도 않았다는 불안에서 벗어나려고.

나의 실수는 사랑하게 될 운명을 어떤 주어진 사람을 사랑할 운명과 혼동한 것이다. 사랑이 아니라 클로이가 필연이라고 생각하는 오류였다. 그러나 내가 이렇게 우리의 사랑 이야기의 발단을 운명론적으로 해석했다는 것은 적어도 한 가지 사실을 증명해준다-내가 클로이를 사랑했다는 것. 우리가 만나고 못 만는 것은 결국 우연일 뿐이라고, 989.727분의 1의 확률일 뿐이라고 느끼게 되는 순간은 동시에 그녀와 함께하는 삶의 절대적 필연성을 느끼지 않게 되는 순간, 즉 그녀에 대한 사랑이 끝나는 순간이기도 할 것이다.

# 이상화

"사람들을 꿰둟어보는 것은 아주 쉽다. 하지만 그래 봐야 무슨 소용이 있겠는가." 엘리아스 카네티(Elias Canetti, 1905-1994, 불가리아 태생의 유대계 영국 작가/역주)의 말이다. 타인의 흠을 찾아내는 것이 얼마나 쉬운지, 그러나 그것이 또 얼마나 무익한지를 암시하는 말이다. 따라서 우리는 어떤 면에서는 사람을 꿰뚫어보는 일을 중단하고자 하는 순간적인 의지 때문에 사랑에 빠지는 것이 아닐까-설혹 그 과정에서는 눈이 약간 먼다고 하더라도? 냉소주의와 사랑이 스펙트럼의 양극화되다시피 한 맥빠지는 냉소주의에서 벗어나고 싶기 때문이 아닐까? 모든 갑작스러운 사랑에는 사랑하는 사람의 장점을 의도적으로 과장하는 면이 있는 것이 아닐까? 그런 과장 덕분에 우리는 습관이 된 비관주의에서 벗어나, 우리 자신에게라면 결코 가능하지 않았을 믿음을 가지게 된 어떤 사람에게 우리 에너지를 집중할 수 있는 것이 아닐까?

정말 무서운 것은 나 자신을 용납하는 것은 그렇게 어려워하면서-어쩌면 그런 어려움이 있기 때문에-다른 사람은 끝도 없이 이상화할 수 있다는 것이다······. 나도 클로이가 인간[이 말이 내포하는 모든 의미에서]일 뿐이라는 것을 알고는 있었을 것이다. 그러나 그런 생각을 중단하고 싶었던 내 욕망도 용서받을 수 있지 않을까? 사랑에 빠진다는 것은 희망이 자기 인식에 승리를 거두는 것이다. 우리는 자신에게 있는 것-비겁함, 심약함, 게으름, 부정직, 타협성, 끔찍한 어리석음 같은 것-을 상대에게서 발견하지 않기를 바라면서 사랑에 빠진다. 우리는 서낵한 사람 주위에 사랑의 방역선을 쳐놓고, 그 안에 있는 모든 것을 어떻게 된 일인지 우리가 가진 결함으로부터 자유롭고, 따라서 사랑스럽다고 결정해버린다. 우리는 다른 사람에게서 우리 내부에서는 찾아볼 수 없는 완벽함을 찾으며, 사랑하는 사람과의 결합을 통하여 인간종에 대한 불확실한 믿음[자기 인식에서 나온 모든 증거에 위배됨에도 불구하고]을 유지하고 싶어한다.

왜 이러한 것을 다 알고 있음에도 나는 사랑에 빠졌던 것일까? 내 욕망의 비논리성과 유치함이 믿음에 대한 요구를 능가하지 못했기 때문이다. 나는 낭망적인 도취가 채울 수 있는 공허를 알고 있었다. 어떤 사람-그것이 누구라도-을 좋아할 수 있는 사람으로 확인하는 과정에서 오는 환희를 알고 있었다. 나는 클로이를 만나기 오래 전에, 다른 사람의 얼굴에서 내 자신에게서는 결코 찾아볼 수 없는 완벽함을 찾을 필요를 느꼈던 것이 틀림없다.

시내로 들어가는 택시 안에서 나는 묘한 상실감, 슬픔을 느꼈다. 이것이 정말 사랑일까? 겨우 아침을 함께 보낸 주제에 사랑 이야기를 한다는 것은 낭만적 미망과 의미론적 우둔이라는 비난을 받을 만한 일이었다. 그러나 우리는 우리가 사랑하게 된 사람이 누구인지 잘 모르는 상태에서 사랑에 빠질 수밖에 없는 것 같다. 최초의 꿈틀거림은 필연적으로 무지에 근거할 수밖에 없다. 사랑이냐 단순한 망상이냐? 시간[이 또한 그 나름으로 거짓말을 하지만]이 아니라면 누가 그 답을 말해줄 수 있을까?

# 이면의 의미

확실성을 사랑하는 사람들은 구애라는 땅에 들어가 얼쩡거리지 말아야 한다. 그 땅에서는 모든 웃음과 모든 언어가 만이천 가지는 아니라고 하더라도 열두 가지 가능성을 열어젖힌다. 정상적인 생활에서는 [그러니까 사랑 없는 생활에서는] 액면 가치로 받아들여질 수 있는 말들이 이제 어떤 사전으로도 다 풀어낼 수 없는 의미를 지니게 된다. 그러나 구애를 하는 사람에게는 모든 의심들이 한 가지 중심적인 질문으로 환원되고, 구애자는 판결을 기다리는 범죄자처럼 떨면서 그 질문을 마주하게 된다. 그(녀)가 나를 바라는 것일까, 바라지 않는 것일까?

한편으로는 한 주 전에 비행기에서 잠깐 만났을 분인 남자와 오후 근무를 빼먹고 미술관을 돌아다녀서 행복해 보였다. 그러나 다른 한편으로 그녀의 행동에는 우리의 동행을 예술과 건축에 대해서 지적인 토론을 할 기회 이상의 것으로 여긴다는 암시가 전혀 없었다. 순수와 공모(共謀)의 중간에 걸려 있는 클로이의 모든 행동에는 나를 미치게 만드는 의미들이 담겨 있었다. 그녀의 문장의 끄트머리에서, 그녀의 웃음의 입꼬리에서 유혹의 흔적을 찾아낸 것 같은데, 맞나? 아니면 나의 욕망이 순수의 얼굴에 투사된 것 뿐일까?

더 혼잡한 두 번째 이탈리아 전시실[1500-1600]에서 어느 때인가 너무 가까이 붙어 있는 바람에 내 손이 그녀의 손에 닿았다. 그녀는 손을 빼지 않았고, 나는 잠시 클로이의 살갗의 감촉이 내 몸을 간질이며 퍼져나가는 것을 느꼈다. 우리는 맞은편에 걸린 브론치노(II Bronzino, 1503-1572, 이탈리아의 피렌체파 화가/역주)의 비너스와 큐피드의 우화를 보았다.
큐피드가 어미니 비너스에게 입을 맞추는 동안 비너스는 몰래 큐피드의 화살 하나를 뽑고 있었다. 아름다움에 눈이 먼 사랑.

그 손은 욕망의 상징[브론치노의 상징보다 더 미묘하고 증거도 더 부족한 상징]일까? 아니면 피로한 팔 근육이 아무 뜻 없이 무의식적으로 경련을 일으킨 것일까? 북유럽 초기 회화 전시실로 들어가면서 치마를 매만진다든가, 에이크(Jan van Eyck, 1395?-1441, 플랑드르이 화가/역주)의 조반니 아르놀피니의 결혼 옆에서 기침을 한다든가, 턱을 손으로 받치기 위해서 카탈로그를 나에게 건넨다든가 하는 클로이의 행동을 나는 어떻게 이해해야 할까?

- +

# 왜 나는 너를 사랑하는가

# 낭만적 운명론

어떤 사람을 두고 자신의 필생의 사랑이라고 말하는 것은 다 살아보고 나서야 가능한 일이다[따라서 불가능하다고 보야야 한다]. 그러나 클로이를 만난 직후, 그녀를 필생의 사랑이라고 부르는 것이 그렇게 무리한 일은 아니라는 생각이 들었다. 런던에 도착하여 클로이와 나는 오후를 함께 보냈다. 그리고 크리스마스 몇 주 전에 런던 서부의 한 레스토랑에서 저녁 식사를 함께 했으며, 가장 이상한 일이자 가장 자연스러운 일을 수행하듯 침대에서 저녁을 마무리했다. 그 뒤 그녀는 가족과 함께 크리스마스를 보냈고, 나는 친구들과 함께 스코틀랜드로 갔다. 그러나 우리는 매일 서로에게 전화를 했다. 때로는 하루에 다섯 번씩. 특별히 할 말이 있어서가 아니라, 단지 우리 둘 다 전에는 누구에게도 이런 식으로 이야기를 해본 적이 없다고 느꼈기 때문이다. 나머지 모든 것은 타협이고 자기 기만이라고 느꼈기 때문이다. 이제야 비로소 우리 자신을 이해할 수 있고 상대에게도 이해할 수 있고 상대에게도 이해시킬 수 있다고 느꼈기 때문이다. 진정으로 기다림[유사 메시아적인 성격을 지녔다]은 끝이 났다고 느꼈기 때문이다. 나는 그녀에게서 내가 평생 서툴게 찾아다녔던 바로 그 여자를 발견했다. 그녀의 웃음과 눈매, 유머 감각과 책을 고르는 취향, 불안과 지성이 내 이상에 기적적으로 들어맞았다.

그래도 우리는 만났다. 이 계산은 우리에게 이성적 주장들을 납득시키기는커녕, 우리가 서로 사랑하게 된 것에 대한 신비적 해석을 뒷받침해주었을 뿐이다. 어떤 사건이 일어날 가능성이 엄청나게 작은데도 결국 일어났다면, 운명론적 설명에 호소를 한다고 해도 용서받을 수 있지 않을까? 나는 동전을 던졌을 때 왜 앞 또는 뒤가 나왔는지 설명해달라고 신에게 매달리지는 않는다. 그 확률이 2분의 1이기 때문이다. 그러나 그것이 클로이와 내가 옆자리에 앉을 확률처럼 작은 경우일 때, 989,727분의 1의 확률일 때, 적어도 사랑 내부의 관점에서 보자면 그것을 운영 이외의 다른 것으로 설명하는 것이 불가능할 것 같았다. 우리의 삶을 바꾸어버린 만남의 확률이 그렇게 작았던 것을 아무런 미신 없이 받아들이려면 대단히 냉철한 지성이 필요할 것이다. 따라서 누군가 하늘에서 [3만 피트 상공에서] 운명의 줄들을 잡아당기고 있었다고 생각할 수 밖에.

사랑 내부의 관점에서는 삶의 우연적 성격을 목적성이라는 베일 뒤로 감춘다. 구원의 연인을 만나는 일이 객관적으로는 우연이고 따라서 가능성이 없는 일이기는 하지만, 그래도 하늘에서 천천히 펼쳐지는 두루마리에는 이미 기록되어 있었다고 주장한다. 우리는 불안에서 벗어나려고 운명이라는 것을 만들어낸다. 인생에 있는 그나마 얼마 안 되는 의미도 우리가 만들어낸다. 인생에 있는 그나마 얼마 안 되는 의미도 우리가 만들어낸 것일 뿐이며, 두루마리 같은 것은 없으며[따라서 우리를 기다리는 미리 정해진 숙명은 없다], 우리가 비행기에서 누구를 만나고 만나지 못하는 것에는 우리가 부여하는 의미 외에는 아무런 의미도 없다는 사실을 인정할 때 생기는 불안-간단히 말해서 아무도 우리의 이야기를 기록해두지 않았고, 우리의 사랑을 보장해주지도 않았다는 불안에서 벗어나려고.

나의 실수는 사랑하게 될 운명을 어떤 주어진 사람을 사랑할 운명과 혼동한 것이다. 사랑이 아니라 클로이가 필연이라고 생각하는 오류였다. 그러나 내가 이렇게 우리의 사랑 이야기의 발단을 운명론적으로 해석했다는 것은 적어도 한 가지 사실을 증명해준다-내가 클로이를 사랑했다는 것. 우리가 만나고 못 만는 것은 결국 우연일 뿐이라고, 989.727분의 1의 확률일 뿐이라고 느끼게 되는 순간은 동시에 그녀와 함께하는 삶의 절대적 필연성을 느끼지 않게 되는 순간, 즉 그녀에 대한 사랑이 끝나는 순간이기도 할 것이다.

# 이상화

"사람들을 꿰둟어보는 것은 아주 쉽다. 하지만 그래 봐야 무슨 소용이 있겠는가." 엘리아스 카네티(Elias Canetti, 1905-1994, 불가리아 태생의 유대계 영국 작가/역주)의 말이다. 타인의 흠을 찾아내는 것이 얼마나 쉬운지, 그러나 그것이 또 얼마나 무익한지를 암시하는 말이다. 따라서 우리는 어떤 면에서는 사람을 꿰뚫어보는 일을 중단하고자 하는 순간적인 의지 때문에 사랑에 빠지는 것이 아닐까-설혹 그 과정에서는 눈이 약간 먼다고 하더라도? 냉소주의와 사랑이 스펙트럼의 양극화되다시피 한 맥빠지는 냉소주의에서 벗어나고 싶기 때문이 아닐까? 모든 갑작스러운 사랑에는 사랑하는 사람의 장점을 의도적으로 과장하는 면이 있는 것이 아닐까? 그런 과장 덕분에 우리는 습관이 된 비관주의에서 벗어나, 우리 자신에게라면 결코 가능하지 않았을 믿음을 가지게 된 어떤 사람에게 우리 에너지를 집중할 수 있는 것이 아닐까?

정말 무서운 것은 나 자신을 용납하는 것은 그렇게 어려워하면서-어쩌면 그런 어려움이 있기 때문에-다른 사람은 끝도 없이 이상화할 수 있다는 것이다······. 나도 클로이가 인간[이 말이 내포하는 모든 의미에서]일 뿐이라는 것을 알고는 있었을 것이다. 그러나 그런 생각을 중단하고 싶었던 내 욕망도 용서받을 수 있지 않을까? 사랑에 빠진다는 것은 희망이 자기 인식에 승리를 거두는 것이다. 우리는 자신에게 있는 것-비겁함, 심약함, 게으름, 부정직, 타협성, 끔찍한 어리석음 같은 것-을 상대에게서 발견하지 않기를 바라면서 사랑에 빠진다. 우리는 서낵한 사람 주위에 사랑의 방역선을 쳐놓고, 그 안에 있는 모든 것을 어떻게 된 일인지 우리가 가진 결함으로부터 자유롭고, 따라서 사랑스럽다고 결정해버린다. 우리는 다른 사람에게서 우리 내부에서는 찾아볼 수 없는 완벽함을 찾으며, 사랑하는 사람과의 결합을 통하여 인간종에 대한 불확실한 믿음[자기 인식에서 나온 모든 증거에 위배됨에도 불구하고]을 유지하고 싶어한다.

왜 이러한 것을 다 알고 있음에도 나는 사랑에 빠졌던 것일까? 내 욕망의 비논리성과 유치함이 믿음에 대한 요구를 능가하지 못했기 때문이다. 나는 낭망적인 도취가 채울 수 있는 공허를 알고 있었다. 어떤 사람-그것이 누구라도-을 좋아할 수 있는 사람으로 확인하는 과정에서 오는 환희를 알고 있었다. 나는 클로이를 만나기 오래 전에, 다른 사람의 얼굴에서 내 자신에게서는 결코 찾아볼 수 없는 완벽함을 찾을 필요를 느꼈던 것이 틀림없다.

시내로 들어가는 택시 안에서 나는 묘한 상실감, 슬픔을 느꼈다. 이것이 정말 사랑일까? 겨우 아침을 함께 보낸 주제에 사랑 이야기를 한다는 것은 낭만적 미망과 의미론적 우둔이라는 비난을 받을 만한 일이었다. 그러나 우리는 우리가 사랑하게 된 사람이 누구인지 잘 모르는 상태에서 사랑에 빠질 수밖에 없는 것 같다. 최초의 꿈틀거림은 필연적으로 무지에 근거할 수밖에 없다. 사랑이냐 단순한 망상이냐? 시간[이 또한 그 나름으로 거짓말을 하지만]이 아니라면 누가 그 답을 말해줄 수 있을까?

# 이면의 의미

확실성을 사랑하는 사람들은 구애라는 땅에 들어가 얼쩡거리지 말아야 한다. 그 땅에서는 모든 웃음과 모든 언어가 만이천 가지는 아니라고 하더라도 열두 가지 가능성을 열어젖힌다. 정상적인 생활에서는 [그러니까 사랑 없는 생활에서는] 액면 가치로 받아들여질 수 있는 말들이 이제 어떤 사전으로도 다 풀어낼 수 없는 의미를 지니게 된다. 그러나 구애를 하는 사람에게는 모든 의심들이 한 가지 중심적인 질문으로 환원되고, 구애자는 판결을 기다리는 범죄자처럼 떨면서 그 질문을 마주하게 된다. 그(녀)가 나를 바라는 것일까, 바라지 않는 것일까?

한편으로는 한 주 전에 비행기에서 잠깐 만났을 분인 남자와 오후 근무를 빼먹고 미술관을 돌아다녀서 행복해 보였다. 그러나 다른 한편으로 그녀의 행동에는 우리의 동행을 예술과 건축에 대해서 지적인 토론을 할 기회 이상의 것으로 여긴다는 암시가 전혀 없었다. 순수와 공모(共謀)의 중간에 걸려 있는 클로이의 모든 행동에는 나를 미치게 만드는 의미들이 담겨 있었다. 그녀의 문장의 끄트머리에서, 그녀의 웃음의 입꼬리에서 유혹의 흔적을 찾아낸 것 같은데, 맞나? 아니면 나의 욕망이 순수의 얼굴에 투사된 것 뿐일까?

더 혼잡한 두 번째 이탈리아 전시실[1500-1600]에서 어느 때인가 너무 가까이 붙어 있는 바람에 내 손이 그녀의 손에 닿았다. 그녀는 손을 빼지 않았고, 나는 잠시 클로이의 살갗의 감촉이 내 몸을 간질이며 퍼져나가는 것을 느꼈다. 우리는 맞은편에 걸린 브론치노(II Bronzino, 1503-1572, 이탈리아의 피렌체파 화가/역주)의 비너스와 큐피드의 우화를 보았다.
큐피드가 어미니 비너스에게 입을 맞추는 동안 비너스는 몰래 큐피드의 화살 하나를 뽑고 있었다. 아름다움에 눈이 먼 사랑.

그 손은 욕망의 상징[브론치노의 상징보다 더 미묘하고 증거도 더 부족한 상징]일까? 아니면 피로한 팔 근육이 아무 뜻 없이 무의식적으로 경련을 일으킨 것일까? 북유럽 초기 회화 전시실로 들어가면서 치마를 매만진다든가, 에이크(Jan van Eyck, 1395?-1441, 플랑드르이 화가/역주)의 조반니 아르놀피니의 결혼 옆에서 기침을 한다든가, 턱을 손으로 받치기 위해서 카탈로그를 나에게 건넨다든가 하는 클로이의 행동을 나는 어떻게 이해해야 할까?

+ diff --git a/Computer-Science/20230427-what-is-kernel.html b/Computer-Science/20230427-what-is-kernel.html index 00416ff5..5c82856b 100644 --- a/Computer-Science/20230427-what-is-kernel.html +++ b/Computer-Science/20230427-what-is-kernel.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230427-What is Kernel?

[OS] 커널(Kernel)이란, Linux 커널이란 무엇일까요?, 운영체제와 커널이란?를 참고하여 작성하였습니다.

# 20230427-What is Kernel?

[OS] 커널(Kernel)이란, Linux 커널이란 무엇일까요?, 운영체제와 커널이란?를 참고하여 작성하였습니다.

- + diff --git a/Computer-Science/20230521-what-is-fota-and-ota.html b/Computer-Science/20230521-what-is-fota-and-ota.html index 7443466e..5c257f3e 100644 --- a/Computer-Science/20230521-what-is-fota-and-ota.html +++ b/Computer-Science/20230521-what-is-fota-and-ota.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230521 - What is FOTA and OTA

# FOTA(Fireware Over The Air)

FOTA는 "펌웨어 업데이트 오버-더-에어" 의 약어로, 이는 모바일 기기나 장치의 소프트웨어(펌웨어)를 무선으로 업데이트하는 기술을 가리킵니다. FOTA는 사용자가 추가적인 하드웨어나 케이블 연결 없이 펌웨어를 최신 버전으로 업데이트할 수 있도록 돕습니다.

FOTA는 주로 스마트폰, 태블릿, 차량 시스템, IoT(사물 인터넷) 장치 등에서 사용됩니다. 이를 통해 제조업체는 소프트웨어 버그 수정, 기능 개선, 보안 패치 등을 빠르게 전파할 수 있습니다. 사용자는 펌웨어 업데이트 알림을 받고, Wi-Fi 또는 셀룰러 네트워크를 통해 소프트웨어 업데이트를 다운로드하고 설치할 수 있습니다.

FOTA는 기기의 성능과 기능을 향상시키고, 보안 취약점을 해결하며, 새로운 기능과 서비스를 도입하는 등 소프트웨어 업데이트의 편리성과 유연성을 제공합니다.

# OTA(Over The Air)

OTA는 "오버-더-에어" 의 약어로, 이는 모바일 기기나 장치의 소프트웨어, 펌웨어, 운영 체제 등을 무선으로 업데이트하는 기술을 가리킵니다. OTA는 사용자가 추가적인 하드웨어나 케이블 연결 없이 소프트웨어를 최신 버전으로 업데이트할 수 있도록 돕습니다.

OTA는 주로 스마트폰, 태블릿, 스마트 TV, 차량 시스템, IoT(사물 인터넷) 장치 등에서 사용됩니다. 이를 통해 제조업체는 기기의 성능을 향상시키거나 버그를 수정하고, 새로운 기능을 추가하며, 보안 취약점을 해결하는 등의 업데이트를 제공할 수 있습니다.

사용자는 OTA 업데이트 알림을 받으면 Wi-Fi 또는 셀룰러 네트워크를 통해 업데이트 파일을 다운로드하고 설치할 수 있습니다. 이를 통해 사용자는 최신 기능과 개선 사항을 즉시 활용할 수 있으며, 기기의 안전성과 성능을 유지하면서 업그레이드할 수 있습니다.

OTA는 제조업체에게 소프트웨어 관리와 업데이트의 편리성을 제공하고, 사용자에게는 불편함 없이 기기를 최신 상태로 유지할 수 있는 장점을 제공합니다.

# OTA는 어떻게 동작하는지

  1. 업데이트 준비: 소프트웨어 개발자나 제조업체는 새로운 소프트웨어 업데이트를 개발하고 테스트합니다. 업데이트는 기기의 기능 향상, 버그 수정, 보안 강화 등을 목적으로 할 수 있습니다.
  2. 배포 계획: 업데이트가 완료되면 배포 계획이 수립됩니다. 이 계획은 업데이트가 어떤 기기에 적용될 것인지, 배포 일정은 어떻게 되는지 등을 포함합니다.
  3. 업데이트 알림: 기기 소유자는 업데이트 가능한 새 버전이 있음을 알리는 알림을 받게 됩니다. 이 알림은 주로 기기의 사용자 인터페이스, 애플리케이션 또는 알림 메시지 형태로 제공됩니다.
  4. 업데이트 다운로드: 사용자는 업데이트를 다운로드하는데 동의하면서 인터넷 연결이 있는 기기를 통해 업데이트 파일을 다운로드합니다. 다운로드 속도는 인터넷 연결 상태와 파일 크기에 따라 달라질 수 있습니다.
  5. 업데이트 설치: 다운로드가 완료되면 기기는 자동으로 업데이트를 설치합니다. 이 과정에서 기기는 이전 소프트웨어 버전을 새로운 버전으로 대체하고, 필요한 경우 재부팅하여 업데이트를 적용합니다.
  6. 업데이트 완료: 설치가 완료되면 기기는 새로운 소프트웨어 버전으로 작동합니다. 사용자는 일반적으로 업데이트에 대한 확인 메시지를 받게 됩니다.

# 유명한 OTA 오픈소스

  • cesanta/mongoose-os - Mongoose OS - an IoT Firmware Development Framework. Supported microcontrollers: ESP32, ESP8266, CC3220, CC3200, STM32F4, STM32L4, STM32F7. Amazon AWS IoT, Microsoft Azure, Google IoT Core integrated. Code in C or JavaScript. +

# 20230521 - What is FOTA and OTA

# FOTA(Fireware Over The Air)

FOTA는 "펌웨어 업데이트 오버-더-에어" 의 약어로, 이는 모바일 기기나 장치의 소프트웨어(펌웨어)를 무선으로 업데이트하는 기술을 가리킵니다. FOTA는 사용자가 추가적인 하드웨어나 케이블 연결 없이 펌웨어를 최신 버전으로 업데이트할 수 있도록 돕습니다.

FOTA는 주로 스마트폰, 태블릿, 차량 시스템, IoT(사물 인터넷) 장치 등에서 사용됩니다. 이를 통해 제조업체는 소프트웨어 버그 수정, 기능 개선, 보안 패치 등을 빠르게 전파할 수 있습니다. 사용자는 펌웨어 업데이트 알림을 받고, Wi-Fi 또는 셀룰러 네트워크를 통해 소프트웨어 업데이트를 다운로드하고 설치할 수 있습니다.

FOTA는 기기의 성능과 기능을 향상시키고, 보안 취약점을 해결하며, 새로운 기능과 서비스를 도입하는 등 소프트웨어 업데이트의 편리성과 유연성을 제공합니다.

# OTA(Over The Air)

OTA는 "오버-더-에어" 의 약어로, 이는 모바일 기기나 장치의 소프트웨어, 펌웨어, 운영 체제 등을 무선으로 업데이트하는 기술을 가리킵니다. OTA는 사용자가 추가적인 하드웨어나 케이블 연결 없이 소프트웨어를 최신 버전으로 업데이트할 수 있도록 돕습니다.

OTA는 주로 스마트폰, 태블릿, 스마트 TV, 차량 시스템, IoT(사물 인터넷) 장치 등에서 사용됩니다. 이를 통해 제조업체는 기기의 성능을 향상시키거나 버그를 수정하고, 새로운 기능을 추가하며, 보안 취약점을 해결하는 등의 업데이트를 제공할 수 있습니다.

사용자는 OTA 업데이트 알림을 받으면 Wi-Fi 또는 셀룰러 네트워크를 통해 업데이트 파일을 다운로드하고 설치할 수 있습니다. 이를 통해 사용자는 최신 기능과 개선 사항을 즉시 활용할 수 있으며, 기기의 안전성과 성능을 유지하면서 업그레이드할 수 있습니다.

OTA는 제조업체에게 소프트웨어 관리와 업데이트의 편리성을 제공하고, 사용자에게는 불편함 없이 기기를 최신 상태로 유지할 수 있는 장점을 제공합니다.

# OTA는 어떻게 동작하는지

  1. 업데이트 준비: 소프트웨어 개발자나 제조업체는 새로운 소프트웨어 업데이트를 개발하고 테스트합니다. 업데이트는 기기의 기능 향상, 버그 수정, 보안 강화 등을 목적으로 할 수 있습니다.
  2. 배포 계획: 업데이트가 완료되면 배포 계획이 수립됩니다. 이 계획은 업데이트가 어떤 기기에 적용될 것인지, 배포 일정은 어떻게 되는지 등을 포함합니다.
  3. 업데이트 알림: 기기 소유자는 업데이트 가능한 새 버전이 있음을 알리는 알림을 받게 됩니다. 이 알림은 주로 기기의 사용자 인터페이스, 애플리케이션 또는 알림 메시지 형태로 제공됩니다.
  4. 업데이트 다운로드: 사용자는 업데이트를 다운로드하는데 동의하면서 인터넷 연결이 있는 기기를 통해 업데이트 파일을 다운로드합니다. 다운로드 속도는 인터넷 연결 상태와 파일 크기에 따라 달라질 수 있습니다.
  5. 업데이트 설치: 다운로드가 완료되면 기기는 자동으로 업데이트를 설치합니다. 이 과정에서 기기는 이전 소프트웨어 버전을 새로운 버전으로 대체하고, 필요한 경우 재부팅하여 업데이트를 적용합니다.
  6. 업데이트 완료: 설치가 완료되면 기기는 새로운 소프트웨어 버전으로 작동합니다. 사용자는 일반적으로 업데이트에 대한 확인 메시지를 받게 됩니다.

# 유명한 OTA 오픈소스

  • cesanta/mongoose-os - Mongoose OS - an IoT Firmware Development Framework. Supported microcontrollers: ESP32, ESP8266, CC3220, CC3200, STM32F4, STM32L4, STM32F7. Amazon AWS IoT, Microsoft Azure, Google IoT Core integrated. Code in C or JavaScript.
  • JAndrassy/ArduinoOTA -Arduino library to upload sketch over network to Arduino board with WiFi or Ethernet libraries

# ESP32 with AWS IoT

# FreeRTOS

FreeRTOS는 실시간 운영체제(Real-Time Operating System, RTOS) 로서, 제한된 리소스를 가진 임베디드 시스템에서 실시간 응용 프로그램을 개발하기 위해 사용되는 오픈 소스 운영체제입니다. 실시간 응용 프로그램은 정해진 시간 내에 정확한 동작을 수행해야 하는 시스템을 말합니다. 이러한 응용 프로그램은 자동차, 의료 기기, 산업 제어 시스템, 통신 장비 등 다양한 임베디드 시스템에서 사용됩니다.

FreeRTOS는 작고 경량화된 설계로 알려져 있으며, 적은 메모리와 처리 능력을 요구하는 임베디드 시스템에서도 효율적으로 동작할 수 있습니다. 이를 위해 운영체제의 핵심 기능을 제공하면서도 최소한의 오버헤드를 유지합니다. FreeRTOS는 다양한 아키텍처(예: ARM, AVR, MSP430 등)와 여러 컴파일러에서 사용할 수 있으며, 다양한 장치 및 보드에 이식할 수 있는 포터블한 구조를 가지고 있습니다.

FreeRTOS는 작업 스케줄링, 태스크 관리, 메모리 관리, 인터럽트 처리, 통신 및 동기화 기능 등을 제공합니다. 또한 이벤트 및 세마포어, 큐, 타이머 등 다양한 IPC(Inter-Process Communication) 메커니즘도 포함되어 있습니다. 이러한 기능들을 통해 개발자는 실시간 시스템을 쉽게 구축하고 관리할 수 있습니다.

FreeRTOS는 오픈 소스이므로 개발자들은 라이선스 비용 없이 자유롭게 사용하고 수정할 수 있습니다. 또한 커뮤니티에서는 다양한 예제 코드, 문서, 지원 등을 제공하여 개발자들이 보다 효율적으로 개발할 수 있도록 지원하고 있습니다.

# FreeRTOS with OTA


Based ChatGPT
- + diff --git a/Computer-Science/20230526-what-is-ca.html b/Computer-Science/20230526-what-is-ca.html index 01227de5..7545cbcb 100644 --- a/Computer-Science/20230526-what-is-ca.html +++ b/Computer-Science/20230526-what-is-ca.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230526-What is CA(Certificate Authority)

CA는 "Certificate Authority"의 약자입니다. CA 인증서는 공인 인증 기관에 의해 발급되는 디지털 인증서로, 웹 사이트나 애플리케이션과 통신할 때 사용자에게 안전한 연결을 제공하는 데 사용됩니다.

CA 인증서는 웹 사이트나 애플리케이션의 신원을 확인하고, 데이터의 기밀성과 무결성을 보장하기 위해 사용됩니다. 웹 브라우저나 다른 클라이언트는 CA 인증서를 사용하여 서버의 신원을 확인하고, 안전한 연결을 수립할 수 있습니다.

CA 인증서에는 다음과 같은 정보가 포함될 수 있습니다:

웹 사이트의 도메인 이름(예: www.example.com) +

# 20230526-What is CA(Certificate Authority)

CA는 "Certificate Authority"의 약자입니다. CA 인증서는 공인 인증 기관에 의해 발급되는 디지털 인증서로, 웹 사이트나 애플리케이션과 통신할 때 사용자에게 안전한 연결을 제공하는 데 사용됩니다.

CA 인증서는 웹 사이트나 애플리케이션의 신원을 확인하고, 데이터의 기밀성과 무결성을 보장하기 위해 사용됩니다. 웹 브라우저나 다른 클라이언트는 CA 인증서를 사용하여 서버의 신원을 확인하고, 안전한 연결을 수립할 수 있습니다.

CA 인증서에는 다음과 같은 정보가 포함될 수 있습니다:

웹 사이트의 도메인 이름(예: www.example.com) 발급한 CA의 정보 인증서의 유효 기간 공개 키(public key)와 암호화 방식 @@ -32,6 +32,6 @@ →

- + diff --git a/Errors/DataBase.html b/Errors/DataBase.html index 39868da1..cd2aa3e5 100644 --- a/Errors/DataBase.html +++ b/Errors/DataBase.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# DataBase

# Table of Content

# UUID to BIN

UUID를 Binary 타입으로 넣기 위해서는 MySQL 자체적으로 있는 함수인 UUID_TO_BIN()를 사용하면 됩니다.

INSERT INTO users(
+  

# DataBase

# Table of Content

# UUID to BIN

UUID를 Binary 타입으로 넣기 위해서는 MySQL 자체적으로 있는 함수인 UUID_TO_BIN()를 사용하면 됩니다.

INSERT INTO users(
     id, email, password, nickname,created_at, edited_at
 ) VALUES (UUID_TO_BIN(?), ?, ?, NOW(), NOW());
 

# Docker와 IDE DataBase Table 간의 시간이 맞지 않아요...ㅠ

GoLand와 MySQL(on Docker)를 기준으로 합니다.
@@ -43,6 +43,6 @@ →

- + diff --git a/Errors/GitHub.html b/Errors/GitHub.html index 7f5f0e6e..01a8b546 100644 --- a/Errors/GitHub.html +++ b/Errors/GitHub.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# GitHub

# subtree를 이용한 GitHub Pages 배포 방법

  1. yarn build를 실행해서 /build 디렉토리를 생성합니다.
  2. git add buildgit commit -m "docs: update ~~"를 합니다.
  3. git subtree push --prefix build origin gh-pages를 하여서 gh-pages 브랜치에 배포합니다.
  4. 만약 3번 명령어로 커밋되지 않고 오류가 발생한 경우 아래 명령어를 사용하여 커밋하면 정상적으로 배포됩니다.
$ git push origin `git subtree split --prefix build master`:gh-pages --force
+  

# GitHub

# subtree를 이용한 GitHub Pages 배포 방법

  1. yarn build를 실행해서 /build 디렉토리를 생성합니다.
  2. git add buildgit commit -m "docs: update ~~"를 합니다.
  3. git subtree push --prefix build origin gh-pages를 하여서 gh-pages 브랜치에 배포합니다.
  4. 만약 3번 명령어로 커밋되지 않고 오류가 발생한 경우 아래 명령어를 사용하여 커밋하면 정상적으로 배포됩니다.
$ git push origin `git subtree split --prefix build master`:gh-pages --force
 

Deploying a subfolder to GitHub Pages를 참고하였습니다.

- + diff --git a/Errors/Golang.html b/Errors/Golang.html index 136700ac..2c095a1d 100644 --- a/Errors/Golang.html +++ b/Errors/Golang.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# Golang

# Package

# 2023.02.20 - implicit function instantiation requires go1.18 or later 오류

ent/photo/where.go:220:36: implicit function instantiation requires go1.18 or later (-lang was set to go1.17; check go.mod)
+  

# Golang

# Package

# 2023.02.20 - implicit function instantiation requires go1.18 or later 오류

ent/photo/where.go:220:36: implicit function instantiation requires go1.18 or later (-lang was set to go1.17; check go.mod)
 ent/photo/where.go:225:39: implicit function instantiation requires go1.18 or later (-lang was set to go1.17; check go.mod)
 ent/photo/where.go:225:39: too many errors
 # github.com/teamgrit-lab/scorpion-v2/ent/videoinfo
@@ -33,6 +33,6 @@
         
         →
       

- + diff --git "a/Golang/20221217-\353\263\200\354\210\230\354\231\200-\354\236\220\353\243\214\355\230\225\354\227\220-\353\214\200\355\225\264.html" "b/Golang/20221217-\353\263\200\354\210\230\354\231\200-\354\236\220\353\243\214\355\230\225\354\227\220-\353\214\200\355\225\264.html" index 43fa0301..f7f07a18 100644 --- "a/Golang/20221217-\353\263\200\354\210\230\354\231\200-\354\236\220\353\243\214\355\230\225\354\227\220-\353\214\200\355\225\264.html" +++ "b/Golang/20221217-\353\263\200\354\210\230\354\231\200-\354\236\220\353\243\214\355\230\225\354\227\220-\353\214\200\355\225\264.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20221217 - 변수와 자료형에 대해

# 강타입 언어, Golang

Golnag은 강타입 중에도 강타입 언어입니다.
강타입 언어는 타입이 다른 변수 간의 연산을 허용하지 않습니다. 물론 강타입 언어 중에서도 숫자에 한해서는 연산을 허용하기도 합니다. 정수 + 실수 연산을 허용하는 C언어처럼 허용합니다.
강타입 언어의 장점은 타입을 정확하게 인지하고 사용하다는 점입니다. 사용자의 실수로 서로 다른 타입 간의 연산을 하더라도 컴파일 과정을 거치며 에러를 발생시키지 때문에 의도치 않은 변수 간의 연산으로 애를 먹지 않아도 됩니다.
따라서, 사용자가 서로 다른 타입 간의 연산을 하기 위해서는 정확하게 인지한 상태로 형변환을 거쳐서 연산을 진행하게 됩니다. 강타입 언어를 사용하다가 Go언어를 사용하는 경우 조금 불편할 수도 있으나, 타입의 확실한 지정으로 에러 발생을 줄일 수 있다는 장점이 있습니다.

# 변수(Variable)

# 자료형의 종류와 범위

Go언어의 기본 타입은 아래와 같습니다.

Type Size Range or Value
Bool 1 true, false
int8 signed, 8bit -128 ~ 127
int16 signed, 16 bit -32768 ~ 32767
int32 signed, 32bit -2147483648 ~ 2147483647
int64 signed, 64bit -9223372036854775808 ~ 9223372036854775807
uint8 unsigned, 8bit 0 ~ 255
uint16 unsigned, 16bit 0 ~ 65535
uint32 unsigned, 32bit 0 ~ 4294967295
uint64 unsigned, 64bit 0 ~ 18446744073709551615
float32 signed, 32bit
float64 signed, 64 bit
int signed, either 32 or 64 bits check check int32 and int64
uint unsigned, either 32 or 64 bits check uint32 and uint64
uintptr unsigned, same as uint the bit pattern of any pointer
byte alias type of uint8; unsigned, same as uint8 0 ~ 255
rune alias type of int32; signed, same as int32 -2147483648 ~ 2147483647
string string is the set of all strings of 8 bit bytes may be empty, but not nil; e.g: "hello" or "" ...
complex64 float 32 bit for real number and another float 32 bit for imaginary number e.g.: 3 + 5i
complex128 float 64 bit for real number and another float 64 bit for imaginary number se.g.: 3 + 5i

# float 보장하는 소수점

  • float32는 소수점 이하 7자리까지 보장됩니다.
  • float64는 소수점 이하 15자리까지 보장됩니다.

# rune의 사용방법

int32의 alias type인 rune은 UTF-8의 문자를 표현할 수 있습니다.
@@ -46,6 +46,6 @@

UUID와 관련된 형변환은 How to convert a UUID string into UUID type를 참고하시면 더 자세히 확인하실 수 있습니다.

# 참고한 자료


2022.12.17 ~ 18 작성하였음.

- + diff --git "a/Golang/20221219-\354\236\220\353\243\214-\352\265\254\354\241\260.html" "b/Golang/20221219-\354\236\220\353\243\214-\352\265\254\354\241\260.html" index 2a4bdeb5..c69fc076 100644 --- "a/Golang/20221219-\354\236\220\353\243\214-\352\265\254\354\241\260.html" +++ "b/Golang/20221219-\354\236\220\353\243\214-\352\265\254\354\241\260.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20221219 - 자료 구조

[Golang] 자료 구조를 참고하여 작성하였습니다.

# 자료 구조란?

자료 구조(Data Structure)란 자료(값, Value)들을 어떤 형태로 저장, 관리할 것인가를 의미합니다.
자료 구조에는 크게 배열, 리스트, 큐, 스택 등이 있습니다.

# Big-O 표기법

Go언어에서 자료 구조를 사용하는 방법을 알아보기전에 Big-O 표기법에 대해서 살펴보도록 하겠습니다.
Big-O 표기법이란 알고리즘의 시간적, 공간적 효율성을 나타내는 표기법 중 하나로써, 가장 많이 사용되는 표기법입니다.

  • Big-O 표기법은 가장 오랜 걸린 시간, 가장 공간을 많이 차지하는 상한선을 표시합니다.
  • Big-O 표기법은 다음과 같은 순서로 효율성을 나타낼 수 있습니다.
    O(1) < O(N) < O(N*log2N) < O(N2) < O(N3)

# 리스트(List)

리스트(List)는 가장 기본적으로 사용되는 선형 자료 구조중 하나입니다.
+

# 20221219 - 자료 구조

[Golang] 자료 구조를 참고하여 작성하였습니다.

# 자료 구조란?

자료 구조(Data Structure)란 자료(값, Value)들을 어떤 형태로 저장, 관리할 것인가를 의미합니다.
자료 구조에는 크게 배열, 리스트, 큐, 스택 등이 있습니다.

# Big-O 표기법

Go언어에서 자료 구조를 사용하는 방법을 알아보기전에 Big-O 표기법에 대해서 살펴보도록 하겠습니다.
Big-O 표기법이란 알고리즘의 시간적, 공간적 효율성을 나타내는 표기법 중 하나로써, 가장 많이 사용되는 표기법입니다.

  • Big-O 표기법은 가장 오랜 걸린 시간, 가장 공간을 많이 차지하는 상한선을 표시합니다.
  • Big-O 표기법은 다음과 같은 순서로 효율성을 나타낼 수 있습니다.
    O(1) < O(N) < O(N*log2N) < O(N2) < O(N3)

# 리스트(List)

리스트(List)는 가장 기본적으로 사용되는 선형 자료 구조중 하나입니다.
리스트는 다음과 같은 형태를 가지고 있습니다.

type Element struct {
     Value interface{}
     Next *Element
@@ -250,6 +250,6 @@
 

# 참고한 자료


2022.12.19 ~ 20 작성하였음.

- + diff --git "a/Golang/20221225-\352\263\240\353\243\250\355\213\264\352\263\274-\354\261\204\353\204\220.html" "b/Golang/20221225-\352\263\240\353\243\250\355\213\264\352\263\274-\354\261\204\353\204\220.html" index aeb7bd15..4bd15e4c 100644 --- "a/Golang/20221225-\352\263\240\353\243\250\355\213\264\352\263\274-\354\261\204\353\204\220.html" +++ "b/Golang/20221225-\352\263\240\353\243\250\355\213\264\352\263\274-\354\261\204\353\204\220.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20221225-고루틴(goroutine)과 채널(Channel)이란?

고루틴(goroutine) 이란?, [Go] 채널(Channel) 이란?를 보고 작성하였습니다.

# 고루틴(goroutine)이란?

고루틴(goroutine)이란, 프로그램에 있는 다른 고루틴과 관련하여 독립적으로 동시에 실행되는 함수입니다.
즉, Go언어로 동시에 실행되는 모든 활동을 고루틴이라고 합니다.

고루틴을 만드는 비용은 스레드에 비해 매우 적기 때문에 경량 스레드라고 합니다.
+

# 20221225-고루틴(goroutine)과 채널(Channel)이란?

고루틴(goroutine) 이란?, [Go] 채널(Channel) 이란?를 보고 작성하였습니다.

# 고루틴(goroutine)이란?

고루틴(goroutine)이란, 프로그램에 있는 다른 고루틴과 관련하여 독립적으로 동시에 실행되는 함수입니다.
즉, Go언어로 동시에 실행되는 모든 활동을 고루틴이라고 합니다.

고루틴을 만드는 비용은 스레드에 비해 매우 적기 때문에 경량 스레드라고 합니다.
모든 프로그램은 적어도 하나의 main함수라고 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동합니다.

메인 함수가 종료되면 모든 고루틴은 종료되며, 따라서 고루틴보다 main함수가 먼저 종료되는 것을 방지해야 합니다.

# 고루틴을 어떻게 사용하는가

Go언어에서는 단일 프로그램에서 여러 고루틴을 만들 수 있습니다. 고루틴은 prefix로 go 키워드를 사용해 간단히 만들 수 있는데 일반 함수와 익명 함수로 만들 수 있습니다.

package main
 
 import "fmt"
@@ -134,6 +134,6 @@
 

# 참고한 자료


2022.12.25 작성하였음.

- + diff --git a/Golang/20221226-Request-and-Response-Format.html b/Golang/20221226-Request-and-Response-Format.html index 1cf598f9..470dc872 100644 --- a/Golang/20221226-Request-and-Response-Format.html +++ b/Golang/20221226-Request-and-Response-Format.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20221226-요청 및 응답 구조체에 대한 고찰

REST API를 개발 시에 구조와 응답에 구조체에 대해서 생각을 많이하게 됩니다.

# 참고한 자료들 속에서

위 글을 참고해 보았습니다.

{
+  

# 20221226-요청 및 응답 구조체에 대한 고찰

REST API를 개발 시에 구조와 응답에 구조체에 대해서 생각을 많이하게 됩니다.

# 참고한 자료들 속에서

위 글을 참고해 보았습니다.

{
     "meta": {
          "error_type": "OAuthException",
          "code": 400,
@@ -67,6 +67,6 @@
         
         →
       

- + diff --git "a/Golang/20221229-JWT\354\227\220\354\204\234-Redis\353\245\274-\354\202\254\354\232\251\355\225\230\353\212\224-\354\235\264\354\234\240.html" "b/Golang/20221229-JWT\354\227\220\354\204\234-Redis\353\245\274-\354\202\254\354\232\251\355\225\230\353\212\224-\354\235\264\354\234\240.html" index 44422477..639dad58 100644 --- "a/Golang/20221229-JWT\354\227\220\354\204\234-Redis\353\245\274-\354\202\254\354\232\251\355\225\230\353\212\224-\354\235\264\354\234\240.html" +++ "b/Golang/20221229-JWT\354\227\220\354\204\234-Redis\353\245\274-\354\202\254\354\232\251\355\225\230\353\212\224-\354\235\264\354\234\240.html" @@ -7,7 +7,7 @@ - + @@ -19,13 +19,13 @@ GitHub

# 20221229-JWT에서 Redis를 사용하는 이유

JWT와 관련되어서 팀원 분께서 "redis를 사용함으로써 그냥 session으로 하는거랑 무슨차이인지 정확히 모르겠네요"라고 질문을 주셔서 갑작스럽게 궁금한 점이 생겨서 코딩맛집 분들께 여쭈어 보게 되었습니다.
+

# 20221229-JWT에서 Redis를 사용하는 이유

JWT와 관련되어서 팀원 분께서 "redis를 사용함으로써 그냥 session으로 하는거랑 무슨차이인지 정확히 모르겠네요"라고 질문을 주셔서 갑작스럽게 궁금한 점이 생겨서 코딩맛집 분들께 여쭈어 보게 되었습니다.
도움을 주신 용민님, 찬성님, 현석님 감사합니다. 그리고 질문을 해주신 호재님께도 감사드려요!

# 그럼 과연 왜 JWT에서 Redis를 사용할까?

기존의 JWT(JSON Web Token)은 Refresh Time(만료 시간)이 토큰 내에 시간을 하기 때문에 토큰을 삭제할 수 없다는 단점이 있습니다.
JWT의 토큰의 만료시간 혹은 만료방법을 기록하기 위해서 사용하고 있습니다. Refresh Token을 발행하고 Refresh Token을 통해서 Access Token을 발행합니다.
Session은 서버의 부하를 많이 주기에 요즘에는 주로 안 사용하고 있는 것으로 알고 있습니다. 하지만 위와 같은 단점이 있었기에 이러한 단점을 보완하기 위해서 Refresh Token를 발행하고 Refresh Token를 통해서 Access Token을 발급하게 됩니다.
세션 > JWT(Redis) < JWT으로 생각하시면 되겠습니다. 세션은 서버의 부담을 많이 주기에 요즘 추세는 JWT를 주로 사용하는 것으로 알고 있으며, 통상적인 JWT를 사용하는 경우 보안과 관련된 이슈가 생길 수 있기 때문에 Redis를 추가하여 보안의 취약점을 보완하는 역할을 하는 것 같습니다.

  • 요약:
    • 세션을 사용할 경우 서버의 부하를 줄 수 있으므로, 추세는 JWT를 사용한다.
    • 일반적인 JWT를 사용할 경우 만료가 안 되는 경우가 있는다.
      • JWT를 만료 시간을 만들었고 만료시간이 짧아서 사용자들이 불을 느끼게 됩니다.
    • 이러한 단점을 보완하고자 Redis를 사용해서 Refresh Token를 삭제시켜서 Access Token 만료시킨다.
    • Refresh Token이 탈취 당하더라도 ID와 비밀번호가 없다면 Access Token을 발급 받을 수 없다.

# 참고한 문서


2022.12.29 ~ 30 작성하였음.

- + diff --git a/Golang/20230107-Livekit-SDK-with-Golang.html b/Golang/20230107-Livekit-SDK-with-Golang.html index 7c26070e..90636a67 100644 --- a/Golang/20230107-Livekit-SDK-with-Golang.html +++ b/Golang/20230107-Livekit-SDK-with-Golang.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230107-Livekit SDK with Golang

# Installation

$ brew install livekit
 $ livekit-server --dev
 API key: devkey
 API secret: secret
@@ -32,6 +32,6 @@
         
         →
       

- + diff --git "a/Golang/20230122-\355\231\230\352\262\275\353\263\200\354\210\230\354\227\220-\353\214\200\355\225\234-\352\263\240\354\260\260.html" "b/Golang/20230122-\355\231\230\352\262\275\353\263\200\354\210\230\354\227\220-\353\214\200\355\225\234-\352\263\240\354\260\260.html" index 090fc80d..793993a9 100644 --- "a/Golang/20230122-\355\231\230\352\262\275\353\263\200\354\210\230\354\227\220-\353\214\200\355\225\234-\352\263\240\354\260\260.html" +++ "b/Golang/20230122-\355\231\230\352\262\275\353\263\200\354\210\230\354\227\220-\353\214\200\355\225\234-\352\263\240\354\260\260.html" @@ -7,7 +7,7 @@ - + @@ -19,9 +19,9 @@ GitHub

# 20230122-환경변수에 대한 고찰

어느날, 슬랙으로 개인적으로 팀원 분께서 환경변수를 어떻게 사용해야할지, 그리고 어떻게 설정해야할지 모르겠다는 내용의 궁금증에 대한 질문을 주셔서 제가 생각과 다른 개발자 분들은 어떻게 사용하고 계신지에 대해서 알게된 점을 적습니다.

# 궁금증

  • GoDotEnv를 통해서 .env 파일을 사용하고 있는데 Docker를 통해서 서버로 배포하는 경우 아래와 같은 문제점이 발생함. +

# 20230122-환경변수에 대한 고찰

어느날, 슬랙으로 개인적으로 팀원 분께서 환경변수를 어떻게 사용해야할지, 그리고 어떻게 설정해야할지 모르겠다는 내용의 궁금증에 대한 질문을 주셔서 제가 생각과 다른 개발자 분들은 어떻게 사용하고 계신지에 대해서 알게된 점을 적습니다.

# 궁금증

  • GoDotEnv를 통해서 .env 파일을 사용하고 있는데 Docker를 통해서 서버로 배포하는 경우 아래와 같은 문제점이 발생함.
    1. 로컬에서는 .env 파일을 사용해서 서버를 구동 시킬 수 있음. 하지만 Docker 이미지를 생성하고 Docker 이미지를 구동할 경우 .env 파일을 사용할 수 없음. - 이유에 대한 궁금증이 생김.
    2. .env 파일이 왜 사용하는지, 어떻게 사용할지에 대한 고찰이 필요했음.

# 궁금증에 대한 고찰

  • 로컬에서는 .env를 통해서 사용할 수 있겠지만 보안을 위해서는 Docker에서 구동할 때에는 환경변수를 export를 사용하기를 권장함.
    그것이 .env 파일을 사용하는 이유임.
  • .env 파일을 이용해서 환경변수를 설정하는 이유는 "'설정은 코드와 분리해서 작성한다. 분리해서 작성하기 위해 어느 시스템이나 도구로도 인터페이스할수 있는 환경변수를 사용한다. 환경변수를 단일 진입으로 사용한다.'의 상황에서 로컬은 파일로 관리하는게 용이하므로 닷파일 같은걸 사용할 수 도 있다. 상용은 환경변수 주입도구를 사용하는 것이 효과적이다."라고 자주 질문 드리는 개발자 분께서 알려주셨습니다.

# 참고한 자료

- + diff --git "a/Golang/20230208-\353\204\244\354\235\264\353\262\204-\355\201\264\353\235\274\354\232\260\353\223\234-\355\224\214\353\236\253\355\217\274\352\263\274-AWS-SDK-for-Go.html" "b/Golang/20230208-\353\204\244\354\235\264\353\262\204-\355\201\264\353\235\274\354\232\260\353\223\234-\355\224\214\353\236\253\355\217\274\352\263\274-AWS-SDK-for-Go.html" index aadd509e..8a25c1a5 100644 --- "a/Golang/20230208-\353\204\244\354\235\264\353\262\204-\355\201\264\353\235\274\354\232\260\353\223\234-\355\224\214\353\236\253\355\217\274\352\263\274-AWS-SDK-for-Go.html" +++ "b/Golang/20230208-\353\204\244\354\235\264\353\262\204-\355\201\264\353\235\274\354\232\260\353\223\234-\355\224\214\353\236\253\355\217\274\352\263\274-AWS-SDK-for-Go.html" @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230208 - 네이버 클라우드 플랫폼과 AWS SDK for Go

회사에서 업무 중 NCP(Naver Cloud Platform)를 만져볼 기회가 생겼는데, aws-sdk-golang-v2로 이미 AWS S3 관련 기능을 개발한 상태였습니다.
+

# 20230208 - 네이버 클라우드 플랫폼과 AWS SDK for Go

회사에서 업무 중 NCP(Naver Cloud Platform)를 만져볼 기회가 생겼는데, aws-sdk-golang-v2로 이미 AWS S3 관련 기능을 개발한 상태였습니다.
네이버 클라우드 플랫폼은 AWS SDK를 사용해서 Object Storage를 사용하도록 하고 있어서 기존의 코드를 재활용하려고 하였습니다. 하지만 인증 관련 오류 발생으로 인해서 해결 방안을 찾아보고 기록하고 있습니다.

Naver Cloud Platform SDK 개발자 분들...ㅠ
NaverCloudPlatform/ncloud-sdk-go-v2에 Object Storage도 추가해 주시거나 Go용 AWS SDK 예제 문서화해 주시면 정말로 감사하겠습니다ㅠㅠ
조금 더 많은 프로그래밍 언어가 네이버 클라우드 플랫폼을 사용할 수 있을 듯 해요...ㅠ

# JavaScript용 AWS SDK를 통한 테스트

  • 권한 인가 관련 문제인지 확인하기 위해서 Javascript용 AWS SDK 예제를 활용하여 테스트 진행하였습니다.
  • 결론 → 권한 문제가 아니라 코드 문제인 듯 합니다.

# SDK Installation

npm install --save aws-sdk@2.348.0
 
  • JavaScript용 AWS SDK에서도 특정 버전의 패키지를 사용하는 점.

# Code

const AWS = require('aws-sdk');
@@ -122,6 +122,6 @@
     "ResultMetadata": {}
 }
 
  • 실제로는 데이터가 있습니다. 회사 정보보안을 위해서 삭제하였습니다.

# 결론

  • 특정 기능만 가능하다...? 아직까지 완벽하게 해결하지 않아서 나중에 해결하고 나서 수정할 예정.
- + diff --git a/Golang/20230403-Bazel-with-Golang.html b/Golang/20230403-Bazel-with-Golang.html index 005ce395..1790b148 100644 --- a/Golang/20230403-Bazel-with-Golang.html +++ b/Golang/20230403-Bazel-with-Golang.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230403 - Bazel with Golang

회사에서 팀 이동을 하면서 기존의 이동한 팀에서 운영하고 있는 서비스들을 유지보수 및 개발하면서 CI/CD 부분을 맞게 되어서 Bazel을 사용하게 되어서 공식 문서를 살펴보면서 공부한 내용.

# TOC

# What is the Bazel?

Bazel은 오픈소스 빌드 및 테스트 도구로, Make, Maven, Gradle과 유사합니다. 사람이 읽을 수 있는 상위 수준의 빌드 언어를 사용합니다. Bazel은 여러 언어로 프로젝트를 지원하고 여러 플랫폼의 출력을 빌드합니다. Bazel은 여러 저장소에서 대규모 코드베이스와 많은 사용자를 지원합니다.
Bazel 소개

# Bazel on Install macOS

macOS에 Bazel 설치를 참고하여 작성함.

$ brew update && brew upgrade # 선택 사항
+  

# 20230403 - Bazel with Golang

회사에서 팀 이동을 하면서 기존의 이동한 팀에서 운영하고 있는 서비스들을 유지보수 및 개발하면서 CI/CD 부분을 맞게 되어서 Bazel을 사용하게 되어서 공식 문서를 살펴보면서 공부한 내용.

# TOC

# What is the Bazel?

Bazel은 오픈소스 빌드 및 테스트 도구로, Make, Maven, Gradle과 유사합니다. 사람이 읽을 수 있는 상위 수준의 빌드 언어를 사용합니다. Bazel은 여러 언어로 프로젝트를 지원하고 여러 플랫폼의 출력을 빌드합니다. Bazel은 여러 저장소에서 대규모 코드베이스와 많은 사용자를 지원합니다.
Bazel 소개

# Bazel on Install macOS

macOS에 Bazel 설치를 참고하여 작성함.

$ brew update && brew upgrade # 선택 사항
 $ brew install bazel
 $ bazel --version
 $ brew upgrade bazel # Upgrade Bazel
@@ -32,6 +32,6 @@
         
         →
       

- + diff --git a/Golang/20230728-OpenAPI-with-Golang.html b/Golang/20230728-OpenAPI-with-Golang.html index 0e204bbd..9b21d1ce 100644 --- a/Golang/20230728-OpenAPI-with-Golang.html +++ b/Golang/20230728-OpenAPI-with-Golang.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230728-OpenAPI With Golang

# OpenAPI Installation

$ go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@latest
+  

# 20230728-OpenAPI With Golang

# OpenAPI Installation

$ go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@latest
 
- + diff --git a/References/DevOps.html b/References/DevOps.html index d43c79be..92994f51 100644 --- a/References/DevOps.html +++ b/References/DevOps.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub
- + diff --git a/References/ETC.html b/References/ETC.html index 7c7cd00c..6e67c333 100644 --- a/References/ETC.html +++ b/References/ETC.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub
- + diff --git a/References/Golang.html b/References/Golang.html index 0a45cebe..2ff42abf 100644 --- a/References/Golang.html +++ b/References/Golang.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# Golang

제가 주로 사용하고 있는 Go언어에 대한 다양한 자료와 글들을 기록합니다.

# What is the Golang?

# 다른언어에서 Go언어로

# Back-End

# JSON Web Token(+Redis)

# gRPC

# GraphQL

# Bazel

# Go언어를 이용한 개발 회고

# Data & Data Structures

# Code Style

# Redis

# Logging(Logger)

# ORM(Object Relational Mapping)

# Entgo

# Package

# ORM(Object Relational Mapping)

# Redis

# Shell Script

# Golang

제가 주로 사용하고 있는 Go언어에 대한 다양한 자료와 글들을 기록합니다.

# What is the Golang?

# 다른언어에서 Go언어로

# Back-End

# JSON Web Token(+Redis)

# gRPC

# GraphQL

# Bazel

# Go언어를 이용한 개발 회고

# Data & Data Structures

# Code Style

# Redis

# Logging(Logger)

# ORM(Object Relational Mapping)

# Entgo

# Package

# ORM(Object Relational Mapping)

# Redis

# Shell Script

- + diff --git a/References/JavaScript.html b/References/JavaScript.html index 7d34762a..a6e8b30d 100644 --- a/References/JavaScript.html +++ b/References/JavaScript.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub - + diff --git a/References/Kernel.html b/References/Kernel.html index 8b5b63c2..66e811c1 100644 --- a/References/Kernel.html +++ b/References/Kernel.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub - + + diff --git a/References/Media.html b/References/Media.html index 39f3e512..6cfbc72c 100644 --- a/References/Media.html +++ b/References/Media.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub
- + diff --git a/References/Rust.html b/References/Rust.html index e77a7cbc..ee2798f9 100644 --- a/References/Rust.html +++ b/References/Rust.html @@ -7,7 +7,7 @@ - + @@ -19,8 +19,8 @@ GitHub
- + diff --git a/References/Security.html b/References/Security.html index 400604d4..60b50cea 100644 --- a/References/Security.html +++ b/References/Security.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# Security

# Security

- + diff --git a/References/company-and-personal.html b/References/company-and-personal.html index 1d9b9ad5..98411bf2 100644 --- a/References/company-and-personal.html +++ b/References/company-and-personal.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 개발문화 및 개인(커리어)의 발전

# 커리어

# 엔지니어링(개발) 문화

# 엔지니어링(개발) 문서화 · 테크니컬 라이팅

# 엔지니어링(개발) 기술 동향

# 관심 있는 회사의 일하는 방식 혹은 개발 방식

# 개인적 발전

# 개발문화 및 개인(커리어)의 발전

# 커리어

# 엔지니어링(개발) 문화

# 엔지니어링(개발) 문서화 · 테크니컬 라이팅

# 엔지니어링(개발) 기술 동향

# 관심 있는 회사의 일하는 방식 혹은 개발 방식

# 개인적 발전

- + diff --git a/References/database.html b/References/database.html index 8f8dc372..bc7307ae 100644 --- a/References/database.html +++ b/References/database.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub - + + diff --git a/Rust/20230517-Rust-Ownership.html b/Rust/20230517-Rust-Ownership.html index 5bbb842d..a1d804fa 100644 --- a/Rust/20230517-Rust-Ownership.html +++ b/Rust/20230517-Rust-Ownership.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230517 - Rust 소유권 규칙

# 소유권이란?

소유권(Ownership)은 러스트의 가장 유니크한 특성이며, 러스타가 가비지 컬렉터(Garbage Collection, GC) 없이 메모리 안정성 보장해 준다. 소유권이 러스트 내에서 어떻게 동작하는지 이해하는 것은 중요하다.

모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 콜렉션을 갖고 있습니다. 다른 프로그래밍 언어들에서는 프로그램가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 러스트는 제 3의 접근법을 이용합니다. 메모리는 컴파일 타임에 컴파일러가 체크할 규칙들로 구성된 소유권 시스템을 통해 관리됩니다. 소유권 기능들의 어떤 것도 런타임 비용이 발생하지 않습니다.

소유권이란 개념이 많은 프로그래머들에게 새로운 것이기 때문에, 이해하고 사요하는 데에는 약간의 시간이 걸립니다만, 좋은 소식은 여러분이 러스트와 소유권 시스템 규칙에 더 많은 경험을 할수록, 여러분은 더 안전하고 효율적인 코드를 자연스럽게 개발할 수 있게 됩니다.

소유권을 이해했을 때, 여러분은 러스트를 유니크하게 만드는 기능들을 이해하기 위한 견고한 기초를 가지게될 것입니다. 여러분은 매우 흔한 데이터 구조인 문자열에 집중된 몇가지 예제를 통해 소유권에 대해 배우게 될 것입니다.

# 가비지 컬렉터의 원리

GC 작업을 하는 가비지 콜렉터는 다음과 같은 일을 한다.

  1. 메모리 할당
  2. 사용 중인 메모리 인식
  3. 사용하지 않는 메모리 인식

즉, 메모리가 부족할 때 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다. 가비지 컬렉터에 대해서 알기 전에 우선 메모리에 대한 이해가 필요하다. +

# 20230517 - Rust 소유권 규칙

# 소유권이란?

소유권(Ownership)은 러스트의 가장 유니크한 특성이며, 러스타가 가비지 컬렉터(Garbage Collection, GC) 없이 메모리 안정성 보장해 준다. 소유권이 러스트 내에서 어떻게 동작하는지 이해하는 것은 중요하다.

모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 콜렉션을 갖고 있습니다. 다른 프로그래밍 언어들에서는 프로그램가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 러스트는 제 3의 접근법을 이용합니다. 메모리는 컴파일 타임에 컴파일러가 체크할 규칙들로 구성된 소유권 시스템을 통해 관리됩니다. 소유권 기능들의 어떤 것도 런타임 비용이 발생하지 않습니다.

소유권이란 개념이 많은 프로그래머들에게 새로운 것이기 때문에, 이해하고 사요하는 데에는 약간의 시간이 걸립니다만, 좋은 소식은 여러분이 러스트와 소유권 시스템 규칙에 더 많은 경험을 할수록, 여러분은 더 안전하고 효율적인 코드를 자연스럽게 개발할 수 있게 됩니다.

소유권을 이해했을 때, 여러분은 러스트를 유니크하게 만드는 기능들을 이해하기 위한 견고한 기초를 가지게될 것입니다. 여러분은 매우 흔한 데이터 구조인 문자열에 집중된 몇가지 예제를 통해 소유권에 대해 배우게 될 것입니다.

# 가비지 컬렉터의 원리

GC 작업을 하는 가비지 콜렉터는 다음과 같은 일을 한다.

  1. 메모리 할당
  2. 사용 중인 메모리 인식
  3. 사용하지 않는 메모리 인식

즉, 메모리가 부족할 때 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다. 가비지 컬렉터에 대해서 알기 전에 우선 메모리에 대한 이해가 필요하다. 프로그램을 실행할 때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 메모리를 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.

이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 '가비지'가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게 선언되거나 형변환이 되면서 다른 곳을 가리키게 되면서 주소를 잃어버리게 되고 다시 찾을 수 없게 되면서 정리되지 않은 메모리가 생겨버리게 되기 때문이다.

그래서 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있도록 메모리 해제를 시킨다. 이것이 가비지 컬렉터의 목적이다.

# 소유권 규칙

  1. 러스트의 각각의 값은 해당값의 오너(owner)라고 불리우는 변수를 갖고 있다.
  2. 한번에 딱 하나의 오너만 존재할 수 있다.
  3. 오너가 스코프 밖으로 벗어나는 때, 값은 버려진다(dropped).

# 변수의 스코프

fn main(){ 코드를 예제에 붙이지 않을텐, 여러분들이 코드를 따라하려면 main함수에 직접 예제들을 넣어야 할 겁니다. 결과적으로, 우리의 예제들은 좀더 간략해져서 보일러 플레이트 코드에 비해 실제 디테일에 초점을 맞출 수 있도록 해 줄 것입니다.

소유권에 대한 첫 에제로서, 변수들의 스코프를 보겠습니다. 스코프란 프로그램 내에서 아이템이 유효함을 표시하기 위한 범위입니다. 아래 코드처럼 생긴 변수가 있다고 해 봅시다.

let s = "hello";
 

변수 s는 스트링 리터럴을 나타나는데, 스트링 리터럴의 값은 우리의 프로그램의 텍스트 내에 하드코딩되어 있습니다. 변수는 선언된 시점부터 현재의 스코프가 끝날 때까지 유효합니다. 아래 예제 Listing 4-1은 변수 s가 유효한 지점을 주석으로 표시했습니다.

{                      // s는 유효하지 않습니다. 아직 선언이 안됐거든요.
     let s = "hello";   // s는 이 지점부터 유효합니다.
@@ -35,6 +35,6 @@
         
         →
       

- + diff --git a/Rust/20230920-Rust-with-Actix.html b/Rust/20230920-Rust-with-Actix.html new file mode 100644 index 00000000..b541e7cb --- /dev/null +++ b/Rust/20230920-Rust-with-Actix.html @@ -0,0 +1,25 @@ + + + + + + Today HyunSang Learned + + + + + + + +
+ + + diff --git a/Rust/rust-building-application.html b/Rust/rust-building-application.html index bade2ea3..ed80fdab 100644 --- a/Rust/rust-building-application.html +++ b/Rust/rust-building-application.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230430 - 명령줄 애플리케이션 구축

# 기본적인 데이터 유형(Basic Data Types)

  • Boolean - 블리언
    • booltrue, false
    • 1byte 크기이며, bool 키워드를 통해서 선언 가능.
  • Characters - 문자
    • char → 하나의 유니코드 값을 가짐.
    • 4byte 크기임. 예를 들어서 ASCII 문자 집합을 char로 저장하게 된다면 메모리 낭비임.
  • Integers - 정수
    • u8, i8
      • u는 무부호 정수(양수) → 부호가 없는 정수
      • i는 유부호 정수(양수 or 음수) → 부호가 있는 정수
      • 8bit1byte / in Rust 128bit ok!
    • u16, i16
    • u32, i32
    • u64, i64
    • u128, i128
    • usize, iszie
      • 아키텍쳐에 종속된 타입,
      • 32비트 아키텍쳐 환경에서는 32bit, 64bit
  • Floats - 부동 소수점
    • f32, f64
      • f64f32보다 2배의 정밀도를 갖고 있음.

# 함수(Function)

  • Rust에서는 함수를 선언하기 위해서는 키워드 fn(){}을 사용해야함. +

# 20230430 - 명령줄 애플리케이션 구축

# 기본적인 데이터 유형(Basic Data Types)

  • Boolean - 블리언
    • booltrue, false
    • 1byte 크기이며, bool 키워드를 통해서 선언 가능.
  • Characters - 문자
    • char → 하나의 유니코드 값을 가짐.
    • 4byte 크기임. 예를 들어서 ASCII 문자 집합을 char로 저장하게 된다면 메모리 낭비임.
  • Integers - 정수
    • u8, i8
      • u는 무부호 정수(양수) → 부호가 없는 정수
      • i는 유부호 정수(양수 or 음수) → 부호가 있는 정수
      • 8bit1byte / in Rust 128bit ok!
    • u16, i16
    • u32, i32
    • u64, i64
    • u128, i128
    • usize, iszie
      • 아키텍쳐에 종속된 타입,
      • 32비트 아키텍쳐 환경에서는 32bit, 64bit
  • Floats - 부동 소수점
    • f32, f64
      • f64f32보다 2배의 정밀도를 갖고 있음.

# 함수(Function)

  • Rust에서는 함수를 선언하기 위해서는 키워드 fn(){}을 사용해야함.
    • 특별한 점은 없고, 선언과정은 다른 프로그래밍 언어와 동일함.
  • Rust에서는 함수와 변수를 선언할 때 스케이크 케이스(Snake Case) 를 사용함.
  • 반환문:
    • return 50.0 혹은 50.0만 적어도 반환이 됨.
      • 암묵적으로 반환할 수 있도록 함.

# 매크로(Macro)

  • 매크로(Macro) → 메타 프로그래밍(Metaprogramming)의 줄임말.
  • 변수, 다수의 매개변수 그리고 매번 다른 유형으로 처리될 수 있음. 효율적인 방법.
  • 매크로의 단점은 매크로를 정의하는 것이 함수 정의보다 더 복잡하다는 점.
    @@ -33,6 +33,6 @@ →

- + diff --git a/assets/js/31.9e46632d.js b/assets/js/31.9e46632d.js new file mode 100644 index 00000000..7995d384 --- /dev/null +++ b/assets/js/31.9e46632d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{207:function(t,r,_){"use strict";_.r(r);var s=_(0),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://doc.rust-lang.org/book/",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Rust Programming Language"),r("OutboundLink")],1),t._v(" 3장 학습.\n"),t._m(2)])]),t._v(" "),t._m(3),t._v(" "),t._m(4)])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_2023년-09월"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2023년-09월"}},[this._v("#")]),this._v(" 2023년 09월")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_2023-09-20-수"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2023-09-20-수"}},[this._v("#")]),this._v(" 2023.09.20(수)")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("코드 작성 및 컴파일, 배운 내용 정리.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_2023-09-24-일"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2023-09-24-일"}},[this._v("#")]),this._v(" 2023.09.24(일)")])},function(){var t=this,r=t._self._c;return r("ul",[r("li",[r("strong",[t._v("하나만 열심히 해야겠다라는 진념이 생김. 여러개를 하다보면 전문적으로 할 수 없음.")])]),t._v(" "),r("li",[t._v("인프로콘 2023 다시보기를 봄. 주로 성장을 어떻게 해야하는지, 주니어와 관련된 내용을 주로 봄."),r("br"),t._v("\n아직 다 보지는 못하였지만 앞으로 시간이 남을 때마다 볼 예정.\n"),r("ul",[r("li",[t._v("커뮤니케이션 잘하는 개발자의 4가지 습관 - 송범근")]),t._v(" "),r("li",[t._v("왜 구글 시니어 개발자는 코딩을 안할까? - 이다니엘")]),t._v(" "),r("li",[t._v("어느 날 고민 많은 주니어 개발자가 찾아왔다 2탄: 주니어 시절 성장과 고민들 - 김영한")]),t._v(" "),r("li",[t._v("주니어 프론트엔드 엔지니어의 성과 및 역량 향상을 위한 실전가이드 - 배휘동")])])]),t._v(" "),r("li",[t._v("[개정 3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 학습함.")])])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/31.3c0229a0.js b/assets/js/32.98fda0f7.js similarity index 98% rename from assets/js/31.3c0229a0.js rename to assets/js/32.98fda0f7.js index 85977d9b..603eccd6 100644 --- a/assets/js/31.3c0229a0.js +++ b/assets/js/32.98fda0f7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{207:function(t,r,e){"use strict";e.r(r);var s=e(0),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("p",[t._v('학교 수업에서 "정보보호개론"에서 네트워크 부분을 일부분 들었는데 시험보면서 그렇게 잘 알지 못해서 잘 알기 위해서 공부하고자 정리합니다.')]),t._v(" "),t._m(1),t._v(" "),r("blockquote",[r("p",[t._m(2),r("br"),t._v(" "),r("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C_%EC%8A%A4%EC%9C%84%ED%8A%B8",target:"_blank",rel:"noopener noreferrer"}},[t._v("인터넷 프로토콜 스위트"),r("OutboundLink")],1)])]),t._v(" "),r("blockquote",[r("p",[t._m(3),r("br"),t._v(" "),r("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C",target:"_blank",rel:"noopener noreferrer"}},[t._v("TCP"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v("TCP/IP 쉽게 이해하기"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230417-tcp-ip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230417-tcp-ip"}},[this._v("#")]),this._v(" 20230417 - TCP/IP")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"tcp-ip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tcp-ip"}},[this._v("#")]),this._v(" TCP/IP")])},function(){var t=this._self._c;return t("em",[t("strong",[this._v("TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.")])])},function(){var t=this._self._c;return t("em",[t("strong",[this._v("전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불린다. TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다. TCP는 전송 계층에 위치한다. 네트워크의 정보 전달을 통제하는 프로토콜이자 인터넷을 이루는 핵심 프로토콜의 하나로서 국제 인터넷 표준화 기구(IETF)의 RFC 793에 기술되어 있다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-문서"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-문서"}},[this._v("#")]),this._v(" 참고한 문서")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{208:function(t,r,e){"use strict";e.r(r);var s=e(0),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("p",[t._v('학교 수업에서 "정보보호개론"에서 네트워크 부분을 일부분 들었는데 시험보면서 그렇게 잘 알지 못해서 잘 알기 위해서 공부하고자 정리합니다.')]),t._v(" "),t._m(1),t._v(" "),r("blockquote",[r("p",[t._m(2),r("br"),t._v(" "),r("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C_%EC%8A%A4%EC%9C%84%ED%8A%B8",target:"_blank",rel:"noopener noreferrer"}},[t._v("인터넷 프로토콜 스위트"),r("OutboundLink")],1)])]),t._v(" "),r("blockquote",[r("p",[t._m(3),r("br"),t._v(" "),r("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C",target:"_blank",rel:"noopener noreferrer"}},[t._v("TCP"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v("TCP/IP 쉽게 이해하기"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230417-tcp-ip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230417-tcp-ip"}},[this._v("#")]),this._v(" 20230417 - TCP/IP")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"tcp-ip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tcp-ip"}},[this._v("#")]),this._v(" TCP/IP")])},function(){var t=this._self._c;return t("em",[t("strong",[this._v("TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.")])])},function(){var t=this._self._c;return t("em",[t("strong",[this._v("전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불린다. TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다. TCP는 전송 계층에 위치한다. 네트워크의 정보 전달을 통제하는 프로토콜이자 인터넷을 이루는 핵심 프로토콜의 하나로서 국제 인터넷 표준화 기구(IETF)의 RFC 793에 기술되어 있다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-문서"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-문서"}},[this._v("#")]),this._v(" 참고한 문서")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/32.de0107c2.js b/assets/js/33.c884ea6a.js similarity index 99% rename from assets/js/32.de0107c2.js rename to assets/js/33.c884ea6a.js index 2a12cb48..9ba51b20 100644 --- a/assets/js/32.de0107c2.js +++ b/assets/js/33.c884ea6a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{208:function(e,r,t){"use strict";t.r(r);var n=t(0),a=Object(n.a)({},(function(){var e=this,r=e._self._c;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.goorm.io/jcpark/",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자로 살아남기, 몰로코 박종천 헤드 오브 솔루션스 아키텍처"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://devowen.com/381",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자로서의 커리어에 관한 생각 (feat. 나의 발자취)"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.ciokorea.com/news/38236",target:"_blank",rel:"noopener noreferrer"}},[e._v("'실력파' 개발자들이 피해야 할 9가지 커리어 함정"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220822100130",target:"_blank",rel:"noopener noreferrer"}},[e._v('"프로그래밍 or 매니지먼트...개발자 커리어 회사가 함께 고민해야"'),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://engineering.linecorp.com/ko/blog/things-i-prepared-to-be-a-line-server-developer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LINE 서버 개발자가 되기까지 내가 준비한 것들"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://okky.kr/articles/828141",target:"_blank",rel:"noopener noreferrer"}},[e._v("[나눔글] 개발자 커리어패스에 대해서"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@chickenmoim/28",target:"_blank",rel:"noopener noreferrer"}},[e._v("CTO의 업무, 이직 후 적응기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("20 Things I’ve Learned in my 20 Years as a Software Engineer"),r("OutboundLink")],1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://news.hada.io/topic?id=8358",target:"_blank",rel:"noopener noreferrer"}},[e._v("20년간 소프트웨어 엔지니어로서 배운 20가지"),r("OutboundLink")],1)])])]),e._v(" "),r("li",[r("a",{attrs:{href:"https://f-lab.kr/blog/criteria-choosing-company-for-developers",target:"_blank",rel:"noopener noreferrer"}},[e._v("19년 차 개발자가 고찰한 주니어 개발자가 성장하기 좋은 회사 환경"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/dWP8KlOkCk8",target:"_blank",rel:"noopener noreferrer"}},[e._v("이력서 작성이 처음이라면, 채용팀이 알려주는 개발자 이력서 작성 꿀팁!"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://steady-study.super.site/what-makes-a-great-software-engineer",target:"_blank",rel:"noopener noreferrer"}},[e._v("[인프콘 2023 발표] 1. 무엇이 탁월한 개발자를 만드는가"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://jewel-draw-b30.notion.site/by-Dev-0cbe05ead2ca4adb870ca99c1dc245dc",target:"_blank",rel:"noopener noreferrer"}},[e._v("커리어 특강 by Dev.한기용"),r("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.brainbackdoor.com/retrospective/dev-culture",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 개발 문화란?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://channy.creation.net/blog/1600",target:"_blank",rel:"noopener noreferrer"}},[e._v("국내 최고의 개발 문화를 가진 회사는? – 설문 조사 결과"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://taes-k.github.io/2020/04/08/good-development-culture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 개발문화를 만든다는것"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.bucketplace.com/post/2021-03-11-tech-company%EB%A5%BC-%EC%A7%80%ED%96%A5%ED%95%98%EB%8A%94-%EC%98%A4%EB%8A%98%EC%9D%98%EC%A7%91-%EA%B0%9C%EB%B0%9C-%EB%AC%B8%ED%99%94/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tech Company를 지향하는 버킷플레이스 개발 문화"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220622091527",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자 모시려면 일·비전·문화 다 바꿔라"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://blog.barogo.io/%EA%B0%9C%EB%B0%9C%EB%AC%B8%ED%99%94%EA%B0%80-%EB%B0%A5-%EB%A8%B9%EC%97%AC%EC%A3%BC%EB%82%98-6aa07859b975",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발문화가 밥 먹여주나?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1738/",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 팀 구성 및 개발 문화 조성의 중요성"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@holaxapps/28",target:"_blank",rel:"noopener noreferrer"}},[e._v("초기 스타트업의 개발 문화 만들기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://okky.kr/articles/1340045",target:"_blank",rel:"noopener noreferrer"}},[e._v("'사수'와 '팀'에 대한 생각"),r("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.kmong.com/%EC%83%88%EB%A1%9C%EC%9A%B4-%ED%8C%80%EC%9B%90%EC%9D%84-%EA%B2%A9%EB%A0%AC%ED%9E%88-%ED%99%98%EC%98%81%ED%95%98%EB%8A%94-%EB%B2%95-bf42f7159309",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 문서화의 필요성과 효율적인 작성 방법"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://happy-coding-day.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%B4-%EB%AC%B8%EC%84%9C%ED%99%94%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AD%98%EA%B9%8C-%EC%99%9C-%ED%95%98%EB%8A%94%EA%B1%B0%EC%A7%80",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자들이 문서화를 하는 이유는 뭘까? 왜 하는거지?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@funidea/8",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 시, 반드시 문서화 작업을 해야 하는 이유 - 1부"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@funidea/9",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 시, 반드시 문서화 작업을 해야 하는 이유 - 2부"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/127",target:"_blank",rel:"noopener noreferrer"}},[e._v("API 문서 톺아보기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/102",target:"_blank",rel:"noopener noreferrer"}},[e._v("테크니컬 라이팅 4대 원칙"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.undernamu.com/ko/insights/technical-writing-for-beginner",target:"_blank",rel:"noopener noreferrer"}},[e._v("초보자를 위한 테크니컬 라이팅의 모든 것"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/110",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자들을 위한 테크니컬 라이팅 10계명"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://netmarble.engineering/8-months-in-the-life-of-a-technical-writer-at-netmarble/",target:"_blank",rel:"noopener noreferrer"}},[e._v("넷마블 테크니컬 라이터로 일한 8개월의 회고"),r("OutboundLink")],1)])]),e._v(" "),e._m(4),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.allthingsdistributed.com/2022/12/tech-predictions-for-2023-and-beyond.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tech predictions for 2023 and beyond"),r("OutboundLink")],1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://news.hada.io/topic?id=8066&utm_source=weekly&utm_medium=email&utm_campaign=202252",target:"_blank",rel:"noopener noreferrer"}},[e._v("아마존 CTO의 2023년 이후 기술 예측"),r("OutboundLink")],1)])])])]),e._v(" "),e._m(5),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.reddit.com/r/spacex/comments/gxb7j1/we_are_the_spacex_software_team_ask_us_anything/",target:"_blank",rel:"noopener noreferrer"}},[e._v("We are the SpaceX software team, ask us anything!"),r("OutboundLink")],1)])]),e._v(" "),e._m(6),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://thechangeground.com/archives/30526",target:"_blank",rel:"noopener noreferrer"}},[e._v("포기하고 싶을 때 반드시 기억해야 할 1가지"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@graypool/1092",target:"_blank",rel:"noopener noreferrer"}},[e._v("시도조차 하지 않으면 내가 나를 거절해 버린다"),r("OutboundLink")],1)])])])}),[function(){var e=this._self._c;return e("h1",{attrs:{id:"개발문화-및-개인-커리어-의-발전"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#개발문화-및-개인-커리어-의-발전"}},[this._v("#")]),this._v(" 개발문화 및 개인(커리어)의 발전")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"커리어"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#커리어"}},[this._v("#")]),this._v(" 커리어")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-문화"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-문화"}},[this._v("#")]),this._v(" 엔지니어링(개발) 문화")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-문서화-·-테크니컬-라이팅"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-문서화-·-테크니컬-라이팅"}},[this._v("#")]),this._v(" 엔지니어링(개발) 문서화 · 테크니컬 라이팅")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-기술-동향"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-기술-동향"}},[this._v("#")]),this._v(" 엔지니어링(개발) 기술 동향")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"관심-있는-회사의-일하는-방식-혹은-개발-방식"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#관심-있는-회사의-일하는-방식-혹은-개발-방식"}},[this._v("#")]),this._v(" 관심 있는 회사의 일하는 방식 혹은 개발 방식")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"개인적-발전"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#개인적-발전"}},[this._v("#")]),this._v(" 개인적 발전")])}],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{209:function(e,r,t){"use strict";t.r(r);var n=t(0),a=Object(n.a)({},(function(){var e=this,r=e._self._c;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.goorm.io/jcpark/",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자로 살아남기, 몰로코 박종천 헤드 오브 솔루션스 아키텍처"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://devowen.com/381",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자로서의 커리어에 관한 생각 (feat. 나의 발자취)"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.ciokorea.com/news/38236",target:"_blank",rel:"noopener noreferrer"}},[e._v("'실력파' 개발자들이 피해야 할 9가지 커리어 함정"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220822100130",target:"_blank",rel:"noopener noreferrer"}},[e._v('"프로그래밍 or 매니지먼트...개발자 커리어 회사가 함께 고민해야"'),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://engineering.linecorp.com/ko/blog/things-i-prepared-to-be-a-line-server-developer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LINE 서버 개발자가 되기까지 내가 준비한 것들"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://okky.kr/articles/828141",target:"_blank",rel:"noopener noreferrer"}},[e._v("[나눔글] 개발자 커리어패스에 대해서"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@chickenmoim/28",target:"_blank",rel:"noopener noreferrer"}},[e._v("CTO의 업무, 이직 후 적응기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("20 Things I’ve Learned in my 20 Years as a Software Engineer"),r("OutboundLink")],1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://news.hada.io/topic?id=8358",target:"_blank",rel:"noopener noreferrer"}},[e._v("20년간 소프트웨어 엔지니어로서 배운 20가지"),r("OutboundLink")],1)])])]),e._v(" "),r("li",[r("a",{attrs:{href:"https://f-lab.kr/blog/criteria-choosing-company-for-developers",target:"_blank",rel:"noopener noreferrer"}},[e._v("19년 차 개발자가 고찰한 주니어 개발자가 성장하기 좋은 회사 환경"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/dWP8KlOkCk8",target:"_blank",rel:"noopener noreferrer"}},[e._v("이력서 작성이 처음이라면, 채용팀이 알려주는 개발자 이력서 작성 꿀팁!"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://steady-study.super.site/what-makes-a-great-software-engineer",target:"_blank",rel:"noopener noreferrer"}},[e._v("[인프콘 2023 발표] 1. 무엇이 탁월한 개발자를 만드는가"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://jewel-draw-b30.notion.site/by-Dev-0cbe05ead2ca4adb870ca99c1dc245dc",target:"_blank",rel:"noopener noreferrer"}},[e._v("커리어 특강 by Dev.한기용"),r("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.brainbackdoor.com/retrospective/dev-culture",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 개발 문화란?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://channy.creation.net/blog/1600",target:"_blank",rel:"noopener noreferrer"}},[e._v("국내 최고의 개발 문화를 가진 회사는? – 설문 조사 결과"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://taes-k.github.io/2020/04/08/good-development-culture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 개발문화를 만든다는것"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.bucketplace.com/post/2021-03-11-tech-company%EB%A5%BC-%EC%A7%80%ED%96%A5%ED%95%98%EB%8A%94-%EC%98%A4%EB%8A%98%EC%9D%98%EC%A7%91-%EA%B0%9C%EB%B0%9C-%EB%AC%B8%ED%99%94/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tech Company를 지향하는 버킷플레이스 개발 문화"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220622091527",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자 모시려면 일·비전·문화 다 바꿔라"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://blog.barogo.io/%EA%B0%9C%EB%B0%9C%EB%AC%B8%ED%99%94%EA%B0%80-%EB%B0%A5-%EB%A8%B9%EC%97%AC%EC%A3%BC%EB%82%98-6aa07859b975",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발문화가 밥 먹여주나?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1738/",target:"_blank",rel:"noopener noreferrer"}},[e._v("좋은 팀 구성 및 개발 문화 조성의 중요성"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@holaxapps/28",target:"_blank",rel:"noopener noreferrer"}},[e._v("초기 스타트업의 개발 문화 만들기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://okky.kr/articles/1340045",target:"_blank",rel:"noopener noreferrer"}},[e._v("'사수'와 '팀'에 대한 생각"),r("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.kmong.com/%EC%83%88%EB%A1%9C%EC%9A%B4-%ED%8C%80%EC%9B%90%EC%9D%84-%EA%B2%A9%EB%A0%AC%ED%9E%88-%ED%99%98%EC%98%81%ED%95%98%EB%8A%94-%EB%B2%95-bf42f7159309",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 문서화의 필요성과 효율적인 작성 방법"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://happy-coding-day.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%B4-%EB%AC%B8%EC%84%9C%ED%99%94%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AD%98%EA%B9%8C-%EC%99%9C-%ED%95%98%EB%8A%94%EA%B1%B0%EC%A7%80",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자들이 문서화를 하는 이유는 뭘까? 왜 하는거지?"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@funidea/8",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 시, 반드시 문서화 작업을 해야 하는 이유 - 1부"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@funidea/9",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발 시, 반드시 문서화 작업을 해야 하는 이유 - 2부"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/127",target:"_blank",rel:"noopener noreferrer"}},[e._v("API 문서 톺아보기"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/102",target:"_blank",rel:"noopener noreferrer"}},[e._v("테크니컬 라이팅 4대 원칙"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.undernamu.com/ko/insights/technical-writing-for-beginner",target:"_blank",rel:"noopener noreferrer"}},[e._v("초보자를 위한 테크니컬 라이팅의 모든 것"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://tech.kakaoenterprise.com/110",target:"_blank",rel:"noopener noreferrer"}},[e._v("개발자들을 위한 테크니컬 라이팅 10계명"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://netmarble.engineering/8-months-in-the-life-of-a-technical-writer-at-netmarble/",target:"_blank",rel:"noopener noreferrer"}},[e._v("넷마블 테크니컬 라이터로 일한 8개월의 회고"),r("OutboundLink")],1)])]),e._v(" "),e._m(4),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.allthingsdistributed.com/2022/12/tech-predictions-for-2023-and-beyond.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tech predictions for 2023 and beyond"),r("OutboundLink")],1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://news.hada.io/topic?id=8066&utm_source=weekly&utm_medium=email&utm_campaign=202252",target:"_blank",rel:"noopener noreferrer"}},[e._v("아마존 CTO의 2023년 이후 기술 예측"),r("OutboundLink")],1)])])])]),e._v(" "),e._m(5),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.reddit.com/r/spacex/comments/gxb7j1/we_are_the_spacex_software_team_ask_us_anything/",target:"_blank",rel:"noopener noreferrer"}},[e._v("We are the SpaceX software team, ask us anything!"),r("OutboundLink")],1)])]),e._v(" "),e._m(6),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://thechangeground.com/archives/30526",target:"_blank",rel:"noopener noreferrer"}},[e._v("포기하고 싶을 때 반드시 기억해야 할 1가지"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@graypool/1092",target:"_blank",rel:"noopener noreferrer"}},[e._v("시도조차 하지 않으면 내가 나를 거절해 버린다"),r("OutboundLink")],1)])])])}),[function(){var e=this._self._c;return e("h1",{attrs:{id:"개발문화-및-개인-커리어-의-발전"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#개발문화-및-개인-커리어-의-발전"}},[this._v("#")]),this._v(" 개발문화 및 개인(커리어)의 발전")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"커리어"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#커리어"}},[this._v("#")]),this._v(" 커리어")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-문화"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-문화"}},[this._v("#")]),this._v(" 엔지니어링(개발) 문화")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-문서화-·-테크니컬-라이팅"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-문서화-·-테크니컬-라이팅"}},[this._v("#")]),this._v(" 엔지니어링(개발) 문서화 · 테크니컬 라이팅")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"엔지니어링-개발-기술-동향"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#엔지니어링-개발-기술-동향"}},[this._v("#")]),this._v(" 엔지니어링(개발) 기술 동향")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"관심-있는-회사의-일하는-방식-혹은-개발-방식"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#관심-있는-회사의-일하는-방식-혹은-개발-방식"}},[this._v("#")]),this._v(" 관심 있는 회사의 일하는 방식 혹은 개발 방식")])},function(){var e=this._self._c;return e("h2",{attrs:{id:"개인적-발전"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#개인적-발전"}},[this._v("#")]),this._v(" 개인적 발전")])}],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/33.f31f36c3.js b/assets/js/34.c000d273.js similarity index 98% rename from assets/js/33.f31f36c3.js rename to assets/js/34.c000d273.js index 176706bd..79947bdf 100644 --- a/assets/js/33.f31f36c3.js +++ b/assets/js/34.c000d273.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{209:function(t,r,e){"use strict";e.r(r);var a=e(0),s=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://youtu.be/ZVuHZ2Fjkl4",target:"_blank",rel:"noopener noreferrer"}},[t._v("개발시 데이터베이스 선택 가이드 (총정리)"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://chrisjune-13837.medium.com/db-transaction-%EA%B3%BC-acid%EB%9E%80-45a785403f9e",target:"_blank",rel:"noopener noreferrer"}},[t._v("[DB] Transaction 과 ACID란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://blog.yevgnenll.me/posts/what-is-acid-about-transaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("[DB] Transaction 과 ACID 란 무엇인가?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[데이터베이스] 트랜잭션의 ACID 성질"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://www.databaser.net/moniwiki/wiki.php/%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC%EC%84%A4%EA%B3%84%EC%9D%98%EC%A4%91%EC%9A%94%EC%84%B1",target:"_blank",rel:"noopener noreferrer"}},[t._v("모델링과 설계의 중요성"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blogger.pe.kr/504",target:"_blank",rel:"noopener noreferrer"}},[t._v("postgreSQL의 Tablespace 에 대한 이해"),r("OutboundLink")],1)])]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mine-it-record.tistory.com/433",target:"_blank",rel:"noopener noreferrer"}},[t._v("[PostgreSQL] 배열 함수 및 배열을 string(문자열)로 변경하기 (ft. array_agg, array_to_string)"),r("OutboundLink")],1)])]),t._v(" "),t._m(7),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://jaeone94.github.io/posts/Postgresql-%ED%8A%B8%EB%A6%AC%EA%B1%B0%EB%A5%BC-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[postgresql] 트리거를 배워보자"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://sungtae-kim.tistory.com/42",target:"_blank",rel:"noopener noreferrer"}},[t._v("[PostgreSQL] trigger 사용하기 (history table 만들기)"),r("OutboundLink")],1)])]),t._v(" "),t._m(8),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://devbada.tistory.com/72",target:"_blank",rel:"noopener noreferrer"}},[t._v("POSTGRESQL - DATATYPE - 데이터형"),r("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.postgresql.org/docs/current/ecpg-errors.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("36.8. Error Handling"),r("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://semtax.tistory.com/15",target:"_blank",rel:"noopener noreferrer"}},[t._v("PostgreSQL에서 AUTO INCREMENT 사용하기"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#database"}},[this._v("#")]),this._v(" DataBase")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"데이터베이스가-뭔가요"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#데이터베이스가-뭔가요"}},[this._v("#")]),this._v(" 데이터베이스가 뭔가요?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"acid-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acid-transaction"}},[this._v("#")]),this._v(" ACID & Transaction")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"모델링-·-설계"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#모델링-·-설계"}},[this._v("#")]),this._v(" 모델링 · 설계")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"postgresql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[this._v("#")]),this._v(" PostgreSQL")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"basic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#basic"}},[this._v("#")]),this._v(" Basic")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functions"}},[this._v("#")]),this._v(" Functions")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trigger"}},[this._v("#")]),this._v(" Trigger")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"data-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-type"}},[this._v("#")]),this._v(" Data Type")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"error-handling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-handling"}},[this._v("#")]),this._v(" Error Handling")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#etc"}},[this._v("#")]),this._v(" ETC")])}],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{210:function(t,r,e){"use strict";e.r(r);var a=e(0),s=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://youtu.be/ZVuHZ2Fjkl4",target:"_blank",rel:"noopener noreferrer"}},[t._v("개발시 데이터베이스 선택 가이드 (총정리)"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://chrisjune-13837.medium.com/db-transaction-%EA%B3%BC-acid%EB%9E%80-45a785403f9e",target:"_blank",rel:"noopener noreferrer"}},[t._v("[DB] Transaction 과 ACID란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://blog.yevgnenll.me/posts/what-is-acid-about-transaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("[DB] Transaction 과 ACID 란 무엇인가?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[데이터베이스] 트랜잭션의 ACID 성질"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://www.databaser.net/moniwiki/wiki.php/%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC%EC%84%A4%EA%B3%84%EC%9D%98%EC%A4%91%EC%9A%94%EC%84%B1",target:"_blank",rel:"noopener noreferrer"}},[t._v("모델링과 설계의 중요성"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blogger.pe.kr/504",target:"_blank",rel:"noopener noreferrer"}},[t._v("postgreSQL의 Tablespace 에 대한 이해"),r("OutboundLink")],1)])]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mine-it-record.tistory.com/433",target:"_blank",rel:"noopener noreferrer"}},[t._v("[PostgreSQL] 배열 함수 및 배열을 string(문자열)로 변경하기 (ft. array_agg, array_to_string)"),r("OutboundLink")],1)])]),t._v(" "),t._m(7),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://jaeone94.github.io/posts/Postgresql-%ED%8A%B8%EB%A6%AC%EA%B1%B0%EB%A5%BC-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[postgresql] 트리거를 배워보자"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://sungtae-kim.tistory.com/42",target:"_blank",rel:"noopener noreferrer"}},[t._v("[PostgreSQL] trigger 사용하기 (history table 만들기)"),r("OutboundLink")],1)])]),t._v(" "),t._m(8),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://devbada.tistory.com/72",target:"_blank",rel:"noopener noreferrer"}},[t._v("POSTGRESQL - DATATYPE - 데이터형"),r("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.postgresql.org/docs/current/ecpg-errors.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("36.8. Error Handling"),r("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://semtax.tistory.com/15",target:"_blank",rel:"noopener noreferrer"}},[t._v("PostgreSQL에서 AUTO INCREMENT 사용하기"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#database"}},[this._v("#")]),this._v(" DataBase")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"데이터베이스가-뭔가요"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#데이터베이스가-뭔가요"}},[this._v("#")]),this._v(" 데이터베이스가 뭔가요?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"acid-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acid-transaction"}},[this._v("#")]),this._v(" ACID & Transaction")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"모델링-·-설계"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#모델링-·-설계"}},[this._v("#")]),this._v(" 모델링 · 설계")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"postgresql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[this._v("#")]),this._v(" PostgreSQL")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"basic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#basic"}},[this._v("#")]),this._v(" Basic")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#functions"}},[this._v("#")]),this._v(" Functions")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trigger"}},[this._v("#")]),this._v(" Trigger")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"data-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-type"}},[this._v("#")]),this._v(" Data Type")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"error-handling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-handling"}},[this._v("#")]),this._v(" Error Handling")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#etc"}},[this._v("#")]),this._v(" ETC")])}],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/34.ef682562.js b/assets/js/35.f622e32e.js similarity index 97% rename from assets/js/34.ef682562.js rename to assets/js/35.f622e32e.js index ed0d425e..c8f3319c 100644 --- a/assets/js/34.ef682562.js +++ b/assets/js/35.f622e32e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{210:function(t,e,r){"use strict";r.r(e);var s=r(0),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://stackoverflow.com/questions/68509300/port-forwarding-in-cicd-github-actions",target:"_blank",rel:"noopener noreferrer"}},[t._v("Port forwarding in CICD (Github Actions)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://stackoverflow.com/questions/60477061/github-actions-how-to-deploy-to-remote-server-using-ssh",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github actions - how to deploy to remote server using SSH"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://velog.io/@mirageoasis/.pem-%ED%8C%8C%EC%9D%BC%EC%9D%84-github-action%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v(".pem 파일을 github action에서 사용하기"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://blog.manishk.dev/create-a-ci-cd-pipeline-using-github-actions/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Create a CI/CD Pipeline using Github Actions"),e("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://ji5485.github.io/post/2021-06-26/create-env-with-github-actions-secrets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Actions에서 Secrets을 통해 env 파일 생성하기"),e("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/github-secret-dotenv",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("github-secret-dotenv")]),e("OutboundLink")],1),t._v(" - Upload secrets to github from your "),e("code",[t._v(".env")]),t._v(" file")])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"devops"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#devops"}},[this._v("#")]),this._v(" DevOps")])},function(){var t=this._self._c;return t("blockquote",[t("p",[this._v("CI/CD, DevOps Engineering에 다양한 내용들을 기록합니다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"github-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#github-action"}},[this._v("#")]),this._v(" GitHub Action")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"ssh-관련"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ssh-관련"}},[this._v("#")]),this._v(" SSH 관련")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"security"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[this._v("#")]),this._v(" Security")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"tools"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tools"}},[this._v("#")]),this._v(" Tools")])}],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{211:function(t,e,r){"use strict";r.r(e);var s=r(0),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://stackoverflow.com/questions/68509300/port-forwarding-in-cicd-github-actions",target:"_blank",rel:"noopener noreferrer"}},[t._v("Port forwarding in CICD (Github Actions)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://stackoverflow.com/questions/60477061/github-actions-how-to-deploy-to-remote-server-using-ssh",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github actions - how to deploy to remote server using SSH"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://velog.io/@mirageoasis/.pem-%ED%8C%8C%EC%9D%BC%EC%9D%84-github-action%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v(".pem 파일을 github action에서 사용하기"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://blog.manishk.dev/create-a-ci-cd-pipeline-using-github-actions/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Create a CI/CD Pipeline using Github Actions"),e("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://ji5485.github.io/post/2021-06-26/create-env-with-github-actions-secrets/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Actions에서 Secrets을 통해 env 파일 생성하기"),e("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/github-secret-dotenv",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("github-secret-dotenv")]),e("OutboundLink")],1),t._v(" - Upload secrets to github from your "),e("code",[t._v(".env")]),t._v(" file")])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"devops"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#devops"}},[this._v("#")]),this._v(" DevOps")])},function(){var t=this._self._c;return t("blockquote",[t("p",[this._v("CI/CD, DevOps Engineering에 다양한 내용들을 기록합니다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"github-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#github-action"}},[this._v("#")]),this._v(" GitHub Action")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"ssh-관련"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ssh-관련"}},[this._v("#")]),this._v(" SSH 관련")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"security"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[this._v("#")]),this._v(" Security")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"tools"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tools"}},[this._v("#")]),this._v(" Tools")])}],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/35.51e9db41.js b/assets/js/36.add9f0cf.js similarity index 99% rename from assets/js/35.51e9db41.js rename to assets/js/36.add9f0cf.js index fd38ecf9..101f9a56 100644 --- a/assets/js/35.51e9db41.js +++ b/assets/js/36.add9f0cf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{211:function(t,e,r){"use strict";r.r(e);var n=r(0),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),e("p",[t._v("JWT(JSON Web Token)과 Redis 등 사용자 인증과 관련된 기능을 개발하고 연구합니다.")]),t._v(" "),t._m(3),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://dongwooklee96.github.io/post/2021/03/28/rest-api-%EB%B3%B4%EC%95%88-%EB%B0%8F-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안 및 인증 방식"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://bcho.tistory.com/955",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API의 이해와 설계-#3 API 보안"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://cornswrold.tistory.com/289",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안_1"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://cornswrold.tistory.com/290",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안_인증(Authentication)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://youtu.be/XXseiON9CV0",target:"_blank",rel:"noopener noreferrer"}},[t._v("JWT 대충 쓰면 님들 코딩인생 끝남"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80",target:"_blank",rel:"noopener noreferrer"}},[t._v("JWT에서 Refresh Token은 왜 필요한가?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://redis.com/blog/json-web-tokens-jwt-are-dangerous-for-user-sessions/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Web Tokens (JWT) are Dangerous for User Sessions—Here’s a Solution"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://dreamaz.tistory.com/22",target:"_blank",rel:"noopener noreferrer"}},[t._v("Access Token과 Refresh Token이란 무엇인가?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://sol-devlog.tistory.com/22",target:"_blank",rel:"noopener noreferrer"}},[t._v("Redis를 통한 JWT Refresh Token 관리"),e("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://aws.amazon.com/ko/what-is/sso/",target:"_blank",rel:"noopener noreferrer"}},[t._v("SSO란 무엇입니까?"),e("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.reuters.com/business/chatgpt-owner-openai-projects-1-billion-revenue-by-2024-sources-2022-12-15/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Exclusive: ChatGPT owner OpenAI projects $1 billion in revenue by 2024"),e("OutboundLink")],1),t._v(" "),t._m(7)])]),t._v(" "),t._m(8),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1875/",target:"_blank",rel:"noopener noreferrer"}},[t._v("주니어 개발자를 위한 엄청 쉬운 네트워크 이야기"),e("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://faculty.washington.edu/ajko/papers/Li2015GreatEngineers.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("What Makes A Great Software Engineer?"),e("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://blog.stibee.com/golang-vs-rust-%ED%8D%BC%ED%8F%AC%EB%A8%BC%EC%8A%A4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9-%EC%8D%B0-bac94bc26e2e",target:"_blank",rel:"noopener noreferrer"}},[t._v("Golang vs Rust 퍼포먼스 벤치마킹 썰"),e("OutboundLink")],1)])]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.popit.kr/%EC%BD%94%EB%93%9C-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EC%A4%84%EC%9D%B4%EA%B8%B0-cyclomatic-complexity-npath-complexity/",target:"_blank",rel:"noopener noreferrer"}},[t._v("코드 복잡도 줄이기 (Cyclomatic Complexity, NPath Complexity)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://www.steveonstuff.com/2022/01/27/no-such-thing-as-clean-code",target:"_blank",rel:"noopener noreferrer"}},[t._v("There’s No Such Thing as Clean Code"),e("OutboundLink")],1),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://news.hada.io/topic?id=5881",target:"_blank",rel:"noopener noreferrer"}},[t._v("Clean Code 라는 건 없습니다"),e("OutboundLink")],1)])])])]),t._v(" "),t._m(13),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1884/",target:"_blank",rel:"noopener noreferrer"}},[t._v("소프트웨어 설계 20년 해보고 깨달은 ‘좋은 설계’의 조건"),e("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#etc"}},[this._v("#")]),this._v(" ETC")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"back-end"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-end"}},[this._v("#")]),this._v(" Back-End")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"auth"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#auth"}},[this._v("#")]),this._v(" Auth")])},function(){var t=this._self._c;return t("h4",{attrs:{id:"jwt-json-web-token"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#jwt-json-web-token"}},[this._v("#")]),this._v(" JWT(JSON Web Token)")])},function(){var t=this._self._c;return t("h4",{attrs:{id:"sso-single-sign-on"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sso-single-sign-on"}},[this._v("#")]),this._v(" SSO(Single Sign-On)")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"ai"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ai"}},[this._v("#")]),this._v(" AI")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"opengpt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opengpt"}},[this._v("#")]),this._v(" OpenGPT")])},function(){var t=this._self._c;return t("ul",[t("li",[t("blockquote",[t("p",[this._v("Three sources briefed on OpenAI's recent pitch to investors said the organization expects $200 million in revenue next year and $1 billion by 2024.")])])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"네트워크"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#네트워크"}},[this._v("#")]),this._v(" 네트워크")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"논문"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#논문"}},[this._v("#")]),this._v(" 논문")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"프로그래밍-성능-벤치마킹"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#프로그래밍-성능-벤치마킹"}},[this._v("#")]),this._v(" 프로그래밍 성능(벤치마킹)")])},function(){var t=this._self._c;return t("h1",{attrs:{id:""}},[t("a",{staticClass:"header-anchor",attrs:{href:"#"}},[this._v("#")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"코드-관련"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#코드-관련"}},[this._v("#")]),this._v(" 코드 관련")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[this._v("#")]),this._v(" Architecture")])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{212:function(t,e,r){"use strict";r.r(e);var n=r(0),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),e("p",[t._v("JWT(JSON Web Token)과 Redis 등 사용자 인증과 관련된 기능을 개발하고 연구합니다.")]),t._v(" "),t._m(3),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://dongwooklee96.github.io/post/2021/03/28/rest-api-%EB%B3%B4%EC%95%88-%EB%B0%8F-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안 및 인증 방식"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://bcho.tistory.com/955",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API의 이해와 설계-#3 API 보안"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://cornswrold.tistory.com/289",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안_1"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://cornswrold.tistory.com/290",target:"_blank",rel:"noopener noreferrer"}},[t._v("REST API 보안_인증(Authentication)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://youtu.be/XXseiON9CV0",target:"_blank",rel:"noopener noreferrer"}},[t._v("JWT 대충 쓰면 님들 코딩인생 끝남"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80",target:"_blank",rel:"noopener noreferrer"}},[t._v("JWT에서 Refresh Token은 왜 필요한가?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://redis.com/blog/json-web-tokens-jwt-are-dangerous-for-user-sessions/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Web Tokens (JWT) are Dangerous for User Sessions—Here’s a Solution"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://dreamaz.tistory.com/22",target:"_blank",rel:"noopener noreferrer"}},[t._v("Access Token과 Refresh Token이란 무엇인가?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://sol-devlog.tistory.com/22",target:"_blank",rel:"noopener noreferrer"}},[t._v("Redis를 통한 JWT Refresh Token 관리"),e("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://aws.amazon.com/ko/what-is/sso/",target:"_blank",rel:"noopener noreferrer"}},[t._v("SSO란 무엇입니까?"),e("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.reuters.com/business/chatgpt-owner-openai-projects-1-billion-revenue-by-2024-sources-2022-12-15/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Exclusive: ChatGPT owner OpenAI projects $1 billion in revenue by 2024"),e("OutboundLink")],1),t._v(" "),t._m(7)])]),t._v(" "),t._m(8),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1875/",target:"_blank",rel:"noopener noreferrer"}},[t._v("주니어 개발자를 위한 엄청 쉬운 네트워크 이야기"),e("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://faculty.washington.edu/ajko/papers/Li2015GreatEngineers.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("What Makes A Great Software Engineer?"),e("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://blog.stibee.com/golang-vs-rust-%ED%8D%BC%ED%8F%AC%EB%A8%BC%EC%8A%A4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9-%EC%8D%B0-bac94bc26e2e",target:"_blank",rel:"noopener noreferrer"}},[t._v("Golang vs Rust 퍼포먼스 벤치마킹 썰"),e("OutboundLink")],1)])]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.popit.kr/%EC%BD%94%EB%93%9C-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EC%A4%84%EC%9D%B4%EA%B8%B0-cyclomatic-complexity-npath-complexity/",target:"_blank",rel:"noopener noreferrer"}},[t._v("코드 복잡도 줄이기 (Cyclomatic Complexity, NPath Complexity)"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://www.steveonstuff.com/2022/01/27/no-such-thing-as-clean-code",target:"_blank",rel:"noopener noreferrer"}},[t._v("There’s No Such Thing as Clean Code"),e("OutboundLink")],1),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://news.hada.io/topic?id=5881",target:"_blank",rel:"noopener noreferrer"}},[t._v("Clean Code 라는 건 없습니다"),e("OutboundLink")],1)])])])]),t._v(" "),t._m(13),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1884/",target:"_blank",rel:"noopener noreferrer"}},[t._v("소프트웨어 설계 20년 해보고 깨달은 ‘좋은 설계’의 조건"),e("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#etc"}},[this._v("#")]),this._v(" ETC")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"back-end"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-end"}},[this._v("#")]),this._v(" Back-End")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"auth"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#auth"}},[this._v("#")]),this._v(" Auth")])},function(){var t=this._self._c;return t("h4",{attrs:{id:"jwt-json-web-token"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#jwt-json-web-token"}},[this._v("#")]),this._v(" JWT(JSON Web Token)")])},function(){var t=this._self._c;return t("h4",{attrs:{id:"sso-single-sign-on"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sso-single-sign-on"}},[this._v("#")]),this._v(" SSO(Single Sign-On)")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"ai"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ai"}},[this._v("#")]),this._v(" AI")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"opengpt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opengpt"}},[this._v("#")]),this._v(" OpenGPT")])},function(){var t=this._self._c;return t("ul",[t("li",[t("blockquote",[t("p",[this._v("Three sources briefed on OpenAI's recent pitch to investors said the organization expects $200 million in revenue next year and $1 billion by 2024.")])])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"네트워크"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#네트워크"}},[this._v("#")]),this._v(" 네트워크")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"논문"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#논문"}},[this._v("#")]),this._v(" 논문")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"프로그래밍-성능-벤치마킹"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#프로그래밍-성능-벤치마킹"}},[this._v("#")]),this._v(" 프로그래밍 성능(벤치마킹)")])},function(){var t=this._self._c;return t("h1",{attrs:{id:""}},[t("a",{staticClass:"header-anchor",attrs:{href:"#"}},[this._v("#")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"코드-관련"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#코드-관련"}},[this._v("#")]),this._v(" 코드 관련")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[this._v("#")]),this._v(" Architecture")])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/37.5bf3fc35.js b/assets/js/37.5bf3fc35.js deleted file mode 100644 index e7307b7a..00000000 --- a/assets/js/37.5bf3fc35.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{213:function(r,e,t){"use strict";t.r(e);var n=t(0),a=Object(n.a)({},(function(){var r=this,e=r._self._c;return e("div",{staticClass:"content"},[r._m(0),r._v(" "),r._m(1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://baeharam.netlify.app/posts/javascript/event-loop",target:"_blank",rel:"noopener noreferrer"}},[r._v("[JS] 도대체 이벤트 루프가 뭔가요?"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://youtu.be/8aGhZQkoFbQ",target:"_blank",rel:"noopener noreferrer"}},[r._v("어쨌든 이벤트 루프는 무엇입니까? | Philip Roberts | JSConf EU"),e("OutboundLink")],1)])])]),r._v(" "),e("li",[e("a",{attrs:{href:"https://hhyemi.github.io/2021/06/09/arrow.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("JavaScript - 화살표 함수와 일반 함수의 차이"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://bakyeono.net/post/2018-01-19-javascript-use-semicolon-or-not.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("자바스크립트, 세미콜론을 써야 하나 말아야 하나"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://okayoon.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B8%EB%AF%B8%EC%BD%9C%EB%A1%A0-%EA%BC%AD-%EC%8D%A8%EC%95%BC%ED%95%98%EB%82%98%EC%9A%94",target:"_blank",rel:"noopener noreferrer"}},[r._v("자바스크립트 세미콜론("),e("code",[r._v(";")]),r._v(") 꼭 써야하나요?"),e("OutboundLink")],1)])]),r._v(" "),r._m(2),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1836/",target:"_blank",rel:"noopener noreferrer"}},[r._v("나쁜 자바스크립트 작성 습관과 작별하기"),e("OutboundLink")],1)])]),r._v(" "),r._m(3),r._v(" "),r._m(4),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://expressjs.com/ko/guide/error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("오류 처리 - Express.js"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://teamdable.github.io/techblog/express-error-handling",target:"_blank",rel:"noopener noreferrer"}},[r._v("Node.js express와 error handling"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://jeonghwan-kim.github.io/node/2017/08/17/express-error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("에러 처리를 위한 익스프레스 가이드"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://thecodebarbarian.com/80-20-guide-to-express-error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("The 80/20 Guide to Express Error Handling"),e("OutboundLink")],1)])])])]),r._v(" "),r._m(5),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/express-session",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("npmjs.com")]),r._v(" - express-session"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://expressjs.com/en/resources/middleware/session.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("Express.js - express-session"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-express-session-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4",target:"_blank",rel:"noopener noreferrer"}},[r._v("[EXPRESS] 📚 express-session 미들웨어 & Session Store 사용법 정리"),e("OutboundLink")],1)])])]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/expressjs/multer/blob/master/doc/README-ko.md",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("Multer")]),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/multer",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("npmjs.com")]),r._v(" - multer"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-multer-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4",target:"_blank",rel:"noopener noreferrer"}},[r._v("[EXPRESS] 📚 multer 미들웨어 사용법 💯 정리"),e("OutboundLink")],1)])])])])])}),[function(){var r=this._self._c;return r("h1",{attrs:{id:"javascript"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#javascript"}},[this._v("#")]),this._v(" JavaScript")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"grammar"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#grammar"}},[this._v("#")]),this._v(" Grammar")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"code-style"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#code-style"}},[this._v("#")]),this._v(" Code Style")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"rest-api"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#rest-api"}},[this._v("#")]),this._v(" REST API")])},function(){var r=this._self._c;return r("h3",{attrs:{id:"error-handling"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#error-handling"}},[this._v("#")]),this._v(" Error Handling")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"package"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#package"}},[this._v("#")]),this._v(" Package")])}],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/36.74df4279.js b/assets/js/37.f21db937.js similarity index 99% rename from assets/js/36.74df4279.js rename to assets/js/37.f21db937.js index 8c48b23e..cb268109 100644 --- a/assets/js/36.74df4279.js +++ b/assets/js/37.f21db937.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{212:function(t,r,e){"use strict";e.r(r);var a=e(0),n=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("p",[t._v("제가 주로 사용하고 있는 Go언어에 대한 다양한 자료와 글들을 기록합니다.")]),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://steemit.com/kr/@brownbears/go",target:"_blank",rel:"noopener noreferrer"}},[t._v("GO언어란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://hwan-shell.tistory.com/275",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go언어를 왜 사용 할까?"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://engineering.ab180.co/stories/traildb-to-ziegel",target:"_blank",rel:"noopener noreferrer"}},[t._v("TrailDB to Ziegel(Cgo to Go)"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://deview.kr/2020/sessions/379",target:"_blank",rel:"noopener noreferrer"}},[t._v("개발 생산성 10배 높이기 : from C++ to Golang"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://stackoverflow.blog/2022/04/04/comparing-go-vs-c-in-embedded-applications/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Comparing Go vs. C in embedded applications"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://docs.google.com/document/d/e/2PACX-1vQEZL43nmQIF3J8F6L3wkFItXLYHEe5tpstnCNMhJEfEEd6TUjEPnthss4YPjzxIHcuxkYyrro9jXV0/pub",target:"_blank",rel:"noopener noreferrer"}},[t._v("Response Body의 안전하게 다루는 방법"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://covenant.tistory.com/203",target:"_blank",rel:"noopener noreferrer"}},[t._v("GO 언어로 JWT 인증서버 만들기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://bourbonkk.tistory.com/60",target:"_blank",rel:"noopener noreferrer"}},[t._v("#3 Golang JWT 토큰으로 인증 구현하기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://jeong-dev-blog.tistory.com/2",target:"_blank",rel:"noopener noreferrer"}},[t._v("[golang] JWT 인증 구현 (feat. 유저등록기능, 로그인기능)"),r("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.banksalad.com/tech/production-ready-grpc-in-golang/",target:"_blank",rel:"noopener noreferrer"}},[t._v("프로덕션 환경에서 사용하는 golang과 gRPC"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC%88%A0-%EA%B2%BD%ED%97%98-%EC%8B%9C%EB%8C%80%EC%9D%98-%ED%9D%90%EB%A6%84-grpc-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%EA%B3%A0%EB%93%A4%EA%B8%B0-1-39e97cb3460",target:"_blank",rel:"noopener noreferrer"}},[t._v("[네이버클라우드 기술&경험] 시대의 흐름, gRPC 깊게 파고들기 #1"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC%88%A0-%EA%B2%BD%ED%97%98-%EC%8B%9C%EB%8C%80%EC%9D%98-%ED%9D%90%EB%A6%84-grpc-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%EA%B3%A0%EB%93%A4%EA%B8%B0-2-b01d390a7190",target:"_blank",rel:"noopener noreferrer"}},[t._v("[네이버클라우드 기술&경험] 시대의 흐름, gRPC 깊게 파고들기 #2"),r("OutboundLink")],1)])]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://tech.kakao.com/2019/08/01/graphql-basic/",target:"_blank",rel:"noopener noreferrer"}},[t._v("GraphQL 개념잡기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://www.apollographql.com/blog/graphql/golang/using-graphql-with-golang/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Using GraphQL with Golang"),r("OutboundLink")],1)])]),t._v(" "),t._m(7),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.uber.com/en-SE/blog/go-monorepo-bazel/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Building Uber’s Go Monorepo with Bazel"),r("OutboundLink")],1)])]),t._v(" "),t._m(8),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://d2.naver.com/helloworld/5827706",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go와 함께하는 전화망 서비스 구축 1편"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://d2.naver.com/helloworld/0814313",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go와 함께하는 전화망 서비스 구축 2편"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/mLIthm96u2Q",target:"_blank",rel:"noopener noreferrer"}},[t._v("당근마켓의 고언어 도입기, 그리고 활용법"),r("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.uber.com/blog/data-race-patterns-in-go/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Data Race Patterns in Go"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/emirpasic/gods",target:"_blank",rel:"noopener noreferrer"}},[t._v("emirpasic/gods"),r("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://google.github.io/styleguide/go/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Google - Go Style"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://google.github.io/styleguide/go/guide",target:"_blank",rel:"noopener noreferrer"}},[t._v("Google - Go Style Guide"),r("OutboundLink")],1)])])]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/uber-go/guide",target:"_blank",rel:"noopener noreferrer"}},[t._v("Uber Go Style Guide"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/TangoEnSkai/uber-go-style-guide-kr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Uuber Go style Guide KR"),r("OutboundLink")],1)])])])]),t._v(" "),t._m(11),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://littleshark.tistory.com/70",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go에서 Redis 사용하기"),r("OutboundLink")],1)])]),t._v(" "),t._m(12),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://thedevelopercafe.com/articles/logging-in-go-with-slog-a7bb489755c2",target:"_blank",rel:"noopener noreferrer"}},[t._v("Logging in Go with slog"),r("OutboundLink")],1)])]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://entgo.io/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[t._v("Official Site")]),r("OutboundLink")],1),t._v(" / "),r("a",{attrs:{href:"https://pkg.go.dev/entgo.io/ent",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[t._v("ent - Go Packages")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://velog.io/@leeeeeoy/Go-Ent-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Go] Ent 사용해보기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://www.vompressor.com/entgo1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Lib] entgo 1 - Go의 ORM 라이브러리"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://umi0410.github.io/blog/golang/how-to-backend-in-go-db/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Golang으로 백엔드 개발하기 - 1. 데이터베이스 작업하기 (Ent 프레임워크 이용)"),r("OutboundLink")],1)])]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/ent/ent",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("ent/ent")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/go-gorm/gorm",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("gorm.io/gorm")]),r("OutboundLink")],1)])]),t._v(" "),t._m(17),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/go-redis/redis",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("go-redis/redis")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/gomodule/redigo",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("gomodule/redigo")]),r("OutboundLink")],1)])]),t._v(" "),t._m(18),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/bitfield/script",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("bitfield/script")]),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"golang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#golang"}},[this._v("#")]),this._v(" Golang")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"what-is-the-golang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-golang"}},[this._v("#")]),this._v(" What is the Golang?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"다른언어에서-go언어로"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#다른언어에서-go언어로"}},[this._v("#")]),this._v(" 다른언어에서 Go언어로")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"back-end"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-end"}},[this._v("#")]),this._v(" Back-End")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"json-web-token-redis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-web-token-redis"}},[this._v("#")]),this._v(" JSON Web Token(+Redis)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"grpc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grpc"}},[this._v("#")]),this._v(" gRPC")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"graphql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#graphql"}},[this._v("#")]),this._v(" GraphQL")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"bazel"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bazel"}},[this._v("#")]),this._v(" Bazel")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"go언어를-이용한-개발-회고"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#go언어를-이용한-개발-회고"}},[this._v("#")]),this._v(" Go언어를 이용한 개발 회고")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"data-data-structures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-data-structures"}},[this._v("#")]),this._v(" Data & Data Structures")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"code-style"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#code-style"}},[this._v("#")]),this._v(" Code Style")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"redis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[this._v("#")]),this._v(" Redis")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"logging-logger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-logger"}},[this._v("#")]),this._v(" Logging(Logger)")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"orm-object-relational-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#orm-object-relational-mapping"}},[this._v("#")]),this._v(" ORM(Object Relational Mapping)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"entgo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#entgo"}},[this._v("#")]),this._v(" Entgo")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"package"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#package"}},[this._v("#")]),this._v(" Package")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"orm-object-relational-mapping-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#orm-object-relational-mapping-2"}},[this._v("#")]),this._v(" ORM(Object Relational Mapping)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"redis-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redis-2"}},[this._v("#")]),this._v(" Redis")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"shell-script"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#shell-script"}},[this._v("#")]),this._v(" Shell Script")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{213:function(t,r,e){"use strict";e.r(r);var a=e(0),n=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("p",[t._v("제가 주로 사용하고 있는 Go언어에 대한 다양한 자료와 글들을 기록합니다.")]),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://steemit.com/kr/@brownbears/go",target:"_blank",rel:"noopener noreferrer"}},[t._v("GO언어란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://hwan-shell.tistory.com/275",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go언어를 왜 사용 할까?"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://engineering.ab180.co/stories/traildb-to-ziegel",target:"_blank",rel:"noopener noreferrer"}},[t._v("TrailDB to Ziegel(Cgo to Go)"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://deview.kr/2020/sessions/379",target:"_blank",rel:"noopener noreferrer"}},[t._v("개발 생산성 10배 높이기 : from C++ to Golang"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://stackoverflow.blog/2022/04/04/comparing-go-vs-c-in-embedded-applications/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Comparing Go vs. C in embedded applications"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://docs.google.com/document/d/e/2PACX-1vQEZL43nmQIF3J8F6L3wkFItXLYHEe5tpstnCNMhJEfEEd6TUjEPnthss4YPjzxIHcuxkYyrro9jXV0/pub",target:"_blank",rel:"noopener noreferrer"}},[t._v("Response Body의 안전하게 다루는 방법"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://covenant.tistory.com/203",target:"_blank",rel:"noopener noreferrer"}},[t._v("GO 언어로 JWT 인증서버 만들기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://bourbonkk.tistory.com/60",target:"_blank",rel:"noopener noreferrer"}},[t._v("#3 Golang JWT 토큰으로 인증 구현하기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://jeong-dev-blog.tistory.com/2",target:"_blank",rel:"noopener noreferrer"}},[t._v("[golang] JWT 인증 구현 (feat. 유저등록기능, 로그인기능)"),r("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.banksalad.com/tech/production-ready-grpc-in-golang/",target:"_blank",rel:"noopener noreferrer"}},[t._v("프로덕션 환경에서 사용하는 golang과 gRPC"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC%88%A0-%EA%B2%BD%ED%97%98-%EC%8B%9C%EB%8C%80%EC%9D%98-%ED%9D%90%EB%A6%84-grpc-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%EA%B3%A0%EB%93%A4%EA%B8%B0-1-39e97cb3460",target:"_blank",rel:"noopener noreferrer"}},[t._v("[네이버클라우드 기술&경험] 시대의 흐름, gRPC 깊게 파고들기 #1"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://medium.com/naver-cloud-platform/nbp-%EA%B8%B0%EC%88%A0-%EA%B2%BD%ED%97%98-%EC%8B%9C%EB%8C%80%EC%9D%98-%ED%9D%90%EB%A6%84-grpc-%EA%B9%8A%EA%B2%8C-%ED%8C%8C%EA%B3%A0%EB%93%A4%EA%B8%B0-2-b01d390a7190",target:"_blank",rel:"noopener noreferrer"}},[t._v("[네이버클라우드 기술&경험] 시대의 흐름, gRPC 깊게 파고들기 #2"),r("OutboundLink")],1)])]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://tech.kakao.com/2019/08/01/graphql-basic/",target:"_blank",rel:"noopener noreferrer"}},[t._v("GraphQL 개념잡기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://www.apollographql.com/blog/graphql/golang/using-graphql-with-golang/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Using GraphQL with Golang"),r("OutboundLink")],1)])]),t._v(" "),t._m(7),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.uber.com/en-SE/blog/go-monorepo-bazel/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Building Uber’s Go Monorepo with Bazel"),r("OutboundLink")],1)])]),t._v(" "),t._m(8),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://d2.naver.com/helloworld/5827706",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go와 함께하는 전화망 서비스 구축 1편"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://d2.naver.com/helloworld/0814313",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go와 함께하는 전화망 서비스 구축 2편"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/mLIthm96u2Q",target:"_blank",rel:"noopener noreferrer"}},[t._v("당근마켓의 고언어 도입기, 그리고 활용법"),r("OutboundLink")],1)])]),t._v(" "),t._m(9),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.uber.com/blog/data-race-patterns-in-go/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Data Race Patterns in Go"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/emirpasic/gods",target:"_blank",rel:"noopener noreferrer"}},[t._v("emirpasic/gods"),r("OutboundLink")],1)])]),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://google.github.io/styleguide/go/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Google - Go Style"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://google.github.io/styleguide/go/guide",target:"_blank",rel:"noopener noreferrer"}},[t._v("Google - Go Style Guide"),r("OutboundLink")],1)])])]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/uber-go/guide",target:"_blank",rel:"noopener noreferrer"}},[t._v("Uber Go Style Guide"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/TangoEnSkai/uber-go-style-guide-kr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Uuber Go style Guide KR"),r("OutboundLink")],1)])])])]),t._v(" "),t._m(11),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://littleshark.tistory.com/70",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go에서 Redis 사용하기"),r("OutboundLink")],1)])]),t._v(" "),t._m(12),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://thedevelopercafe.com/articles/logging-in-go-with-slog-a7bb489755c2",target:"_blank",rel:"noopener noreferrer"}},[t._v("Logging in Go with slog"),r("OutboundLink")],1)])]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://entgo.io/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[t._v("Official Site")]),r("OutboundLink")],1),t._v(" / "),r("a",{attrs:{href:"https://pkg.go.dev/entgo.io/ent",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[t._v("ent - Go Packages")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://velog.io/@leeeeeoy/Go-Ent-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Go] Ent 사용해보기"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://www.vompressor.com/entgo1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Lib] entgo 1 - Go의 ORM 라이브러리"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://umi0410.github.io/blog/golang/how-to-backend-in-go-db/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Golang으로 백엔드 개발하기 - 1. 데이터베이스 작업하기 (Ent 프레임워크 이용)"),r("OutboundLink")],1)])]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/ent/ent",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("ent/ent")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/go-gorm/gorm",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("gorm.io/gorm")]),r("OutboundLink")],1)])]),t._v(" "),t._m(17),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/go-redis/redis",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("go-redis/redis")]),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/gomodule/redigo",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("gomodule/redigo")]),r("OutboundLink")],1)])]),t._v(" "),t._m(18),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/bitfield/script",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("bitfield/script")]),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"golang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#golang"}},[this._v("#")]),this._v(" Golang")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"what-is-the-golang"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-golang"}},[this._v("#")]),this._v(" What is the Golang?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"다른언어에서-go언어로"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#다른언어에서-go언어로"}},[this._v("#")]),this._v(" 다른언어에서 Go언어로")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"back-end"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-end"}},[this._v("#")]),this._v(" Back-End")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"json-web-token-redis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-web-token-redis"}},[this._v("#")]),this._v(" JSON Web Token(+Redis)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"grpc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grpc"}},[this._v("#")]),this._v(" gRPC")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"graphql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#graphql"}},[this._v("#")]),this._v(" GraphQL")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"bazel"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bazel"}},[this._v("#")]),this._v(" Bazel")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"go언어를-이용한-개발-회고"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#go언어를-이용한-개발-회고"}},[this._v("#")]),this._v(" Go언어를 이용한 개발 회고")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"data-data-structures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-data-structures"}},[this._v("#")]),this._v(" Data & Data Structures")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"code-style"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#code-style"}},[this._v("#")]),this._v(" Code Style")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"redis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[this._v("#")]),this._v(" Redis")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"logging-logger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-logger"}},[this._v("#")]),this._v(" Logging(Logger)")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"orm-object-relational-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#orm-object-relational-mapping"}},[this._v("#")]),this._v(" ORM(Object Relational Mapping)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"entgo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#entgo"}},[this._v("#")]),this._v(" Entgo")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"package"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#package"}},[this._v("#")]),this._v(" Package")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"orm-object-relational-mapping-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#orm-object-relational-mapping-2"}},[this._v("#")]),this._v(" ORM(Object Relational Mapping)")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"redis-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redis-2"}},[this._v("#")]),this._v(" Redis")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"shell-script"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#shell-script"}},[this._v("#")]),this._v(" Shell Script")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/38.a5ac85bd.js b/assets/js/38.a5ac85bd.js new file mode 100644 index 00000000..3de525b5 --- /dev/null +++ b/assets/js/38.a5ac85bd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{214:function(r,e,t){"use strict";t.r(e);var a=t(0),n=Object(a.a)({},(function(){var r=this,e=r._self._c;return e("div",{staticClass:"content"},[r._m(0),r._v(" "),r._m(1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://baeharam.netlify.app/posts/javascript/event-loop",target:"_blank",rel:"noopener noreferrer"}},[r._v("[JS] 도대체 이벤트 루프가 뭔가요?"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://youtu.be/8aGhZQkoFbQ",target:"_blank",rel:"noopener noreferrer"}},[r._v("어쨌든 이벤트 루프는 무엇입니까? | Philip Roberts | JSConf EU"),e("OutboundLink")],1)])])]),r._v(" "),e("li",[e("a",{attrs:{href:"https://hhyemi.github.io/2021/06/09/arrow.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("JavaScript - 화살표 함수와 일반 함수의 차이"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://bakyeono.net/post/2018-01-19-javascript-use-semicolon-or-not.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("자바스크립트, 세미콜론을 써야 하나 말아야 하나"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://okayoon.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B8%EB%AF%B8%EC%BD%9C%EB%A1%A0-%EA%BC%AD-%EC%8D%A8%EC%95%BC%ED%95%98%EB%82%98%EC%9A%94",target:"_blank",rel:"noopener noreferrer"}},[r._v("자바스크립트 세미콜론("),e("code",[r._v(";")]),r._v(") 꼭 써야하나요?"),e("OutboundLink")],1)])]),r._v(" "),r._m(2),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://yozm.wishket.com/magazine/detail/1836/",target:"_blank",rel:"noopener noreferrer"}},[r._v("나쁜 자바스크립트 작성 습관과 작별하기"),e("OutboundLink")],1)])]),r._v(" "),r._m(3),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://expressjs.com/ko/guide/error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("오류 처리 - Express.js"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://teamdable.github.io/techblog/express-error-handling",target:"_blank",rel:"noopener noreferrer"}},[r._v("Node.js express와 error handling"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://jeonghwan-kim.github.io/node/2017/08/17/express-error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("에러 처리를 위한 익스프레스 가이드"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://thecodebarbarian.com/80-20-guide-to-express-error-handling.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("The 80/20 Guide to Express Error Handling"),e("OutboundLink")],1)])])])]),r._v(" "),r._m(4),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://kid-dev.tistory.com/13",target:"_blank",rel:"noopener noreferrer"}},[r._v("[typescript vs javascript] 어떤 언어를 써야할까? 이 글로 종결하자!"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://koras02.tistory.com/160",target:"_blank",rel:"noopener noreferrer"}},[r._v("[JS] JS와 TS의 차이점"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://jaeseokim.dev/Javascript/javascript_vs_typescript/",target:"_blank",rel:"noopener noreferrer"}},[r._v("JavaScript VS TypeScript"),e("OutboundLink")],1)])]),r._v(" "),r._m(5),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/express-session",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("npmjs.com")]),r._v(" - express-session"),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://expressjs.com/en/resources/middleware/session.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("Express.js - express-session"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-express-session-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4",target:"_blank",rel:"noopener noreferrer"}},[r._v("[EXPRESS] 📚 express-session 미들웨어 & Session Store 사용법 정리"),e("OutboundLink")],1)])])]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/expressjs/multer/blob/master/doc/README-ko.md",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("Multer")]),e("OutboundLink")],1),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.npmjs.com/package/multer",target:"_blank",rel:"noopener noreferrer"}},[e("code",[r._v("npmjs.com")]),r._v(" - multer"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-multer-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4",target:"_blank",rel:"noopener noreferrer"}},[r._v("[EXPRESS] 📚 multer 미들웨어 사용법 💯 정리"),e("OutboundLink")],1)])])])])])}),[function(){var r=this._self._c;return r("h1",{attrs:{id:"javascript"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#javascript"}},[this._v("#")]),this._v(" JavaScript")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"grammar"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#grammar"}},[this._v("#")]),this._v(" Grammar")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"code-style"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#code-style"}},[this._v("#")]),this._v(" Code Style")])},function(){var r=this._self._c;return r("h3",{attrs:{id:"error-handling"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#error-handling"}},[this._v("#")]),this._v(" Error Handling")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"vs-typescript"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#vs-typescript"}},[this._v("#")]),this._v(" vs TypeScript")])},function(){var r=this._self._c;return r("h2",{attrs:{id:"package"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#package"}},[this._v("#")]),this._v(" Package")])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/38.e7d5e001.js b/assets/js/39.1535a8db.js similarity index 89% rename from assets/js/38.e7d5e001.js rename to assets/js/39.1535a8db.js index c0acd894..77acd8bc 100644 --- a/assets/js/38.e7d5e001.js +++ b/assets/js/39.1535a8db.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{214:function(e,t,r){"use strict";r.r(t);var n=r(0),s=Object(n.a)({},(function(){var e=this._self._c;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://jeongzero.oopy.io/category/kernel",target:"_blank",rel:"noopener noreferrer"}},[this._v("까망눈 연구소 - kernel"),e("OutboundLink")],1)])])])}),[function(){var e=this._self._c;return e("h1",{attrs:{id:"kernel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kernel"}},[this._v("#")]),this._v(" Kernel")])}],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{215:function(e,t,r){"use strict";r.r(t);var n=r(0),s=Object(n.a)({},(function(){var e=this._self._c;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://jeongzero.oopy.io/category/kernel",target:"_blank",rel:"noopener noreferrer"}},[this._v("까망눈 연구소 - kernel"),e("OutboundLink")],1)])])])}),[function(){var e=this._self._c;return e("h1",{attrs:{id:"kernel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kernel"}},[this._v("#")]),this._v(" Kernel")])}],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/40.d323a7b9.js b/assets/js/40.d323a7b9.js deleted file mode 100644 index b56b18b3..00000000 --- a/assets/js/40.d323a7b9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{216:function(t,r,e){"use strict";e.r(r);var s=e(0),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://youtu.be/w1dlmOjDLX8",target:"_blank",rel:"noopener noreferrer"}},[t._v("C가 주옥같은 개발자들 보세요. Rust 10분 정리!"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/-uHfu3Qhbco",target:"_blank",rel:"noopener noreferrer"}},[t._v("러스트(Rust) 언어소개! 🥪언어 특징 및 장단점 [언어탐방🔎]"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/S-01KjUJ3_Q",target:"_blank",rel:"noopener noreferrer"}},[t._v("과연 이 언어가 C.C++를 대체할 수 있을까? feat.아마존"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://security.googleblog.com/2021/04/rust-in-android-platform.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust in the Android platform"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@advisor/31",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust in the Android"),r("OutboundLink")],1)])])]),t._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220622162108",target:"_blank",rel:"noopener noreferrer"}},[t._v("토발즈 \"리눅스, 내년엔 '러스트' 언어도 품는다\""),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://tomaszs2.medium.com/%EF%B8%8F-5-awesome-rust-projects-people-dont-know-about-9363b0a6fae2",target:"_blank",rel:"noopener noreferrer"}},[t._v("⚙️ 5 Awesome Rust Projects People Don’t Know About"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust"}},[this._v("#")]),this._v(" Rust")])},function(){var t=this._self._c;return t("p",[this._v("두번째로 관심이 많은 Rust에 대한 자료를 기록합니다."),t("br"),this._v("\n배우기 난해한 언어인지라 차근차근 배우고 있습니다.")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"what-is-the-rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-rust"}},[this._v("#")]),this._v(" What is the Rust?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"다른-언어에서-rust로"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#다른-언어에서-rust로"}},[this._v("#")]),this._v(" 다른 언어에서 Rust로")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"projects-references"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#projects-references"}},[this._v("#")]),this._v(" Projects References")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/39.4880e291.js b/assets/js/40.f599708e.js similarity index 94% rename from assets/js/39.4880e291.js rename to assets/js/40.f599708e.js index d55682d6..1550225d 100644 --- a/assets/js/39.4880e291.js +++ b/assets/js/40.f599708e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{215:function(t,r,e){"use strict";e.r(r);var a=e(0),n=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://juyoung-1008.tistory.com/30",target:"_blank",rel:"noopener noreferrer"}},[t._v("RTMP란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://growthvalue.tistory.com/178",target:"_blank",rel:"noopener noreferrer"}},[t._v("RTMP Streaming: 실시간 메시징 프로토콜에 대하여"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://jee00609.github.io/live%20stream/Live-Stream/",target:"_blank",rel:"noopener noreferrer"}},[t._v("라이브 스트리밍 RTSP RTMP HLS 에 관한 정리"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"media"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#media"}},[this._v("#")]),this._v(" Media")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"rtmp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rtmp"}},[this._v("#")]),this._v(" RTMP")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{216:function(t,r,e){"use strict";e.r(r);var a=e(0),n=Object(a.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://juyoung-1008.tistory.com/30",target:"_blank",rel:"noopener noreferrer"}},[t._v("RTMP란?"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://growthvalue.tistory.com/178",target:"_blank",rel:"noopener noreferrer"}},[t._v("RTMP Streaming: 실시간 메시징 프로토콜에 대하여"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://jee00609.github.io/live%20stream/Live-Stream/",target:"_blank",rel:"noopener noreferrer"}},[t._v("라이브 스트리밍 RTSP RTMP HLS 에 관한 정리"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"media"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#media"}},[this._v("#")]),this._v(" Media")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"rtmp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rtmp"}},[this._v("#")]),this._v(" RTMP")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/41.a462e598.js b/assets/js/41.a462e598.js new file mode 100644 index 00000000..9781d99f --- /dev/null +++ b/assets/js/41.a462e598.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{217:function(t,r,e){"use strict";e.r(r);var s=e(0),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://youtu.be/w1dlmOjDLX8",target:"_blank",rel:"noopener noreferrer"}},[t._v("C가 주옥같은 개발자들 보세요. Rust 10분 정리!"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/-uHfu3Qhbco",target:"_blank",rel:"noopener noreferrer"}},[t._v("러스트(Rust) 언어소개! 🥪언어 특징 및 장단점 [언어탐방🔎]"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://youtu.be/S-01KjUJ3_Q",target:"_blank",rel:"noopener noreferrer"}},[t._v("과연 이 언어가 C.C++를 대체할 수 있을까? feat.아마존"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://www.technologyreview.kr/how-rust-went-from-a-side-project-to-the-worlds-most-loved-programming-language/",target:"_blank",rel:"noopener noreferrer"}},[t._v("러스트는 어떻게 세계에서 가장 사랑받는 프로그래밍 언어가 되었나?"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://google.github.io/comprehensive-rust/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Welcome to Comprehensive Rust 🦀"),r("OutboundLink")],1)])]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://security.googleblog.com/2021/04/rust-in-android-platform.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust in the Android platform"),r("OutboundLink")],1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://brunch.co.kr/@advisor/31",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust in the Android"),r("OutboundLink")],1)])])]),t._v(" "),r("li",[r("a",{attrs:{href:"https://zdnet.co.kr/view/?no=20220622162108",target:"_blank",rel:"noopener noreferrer"}},[t._v("토발즈 \"리눅스, 내년엔 '러스트' 언어도 품는다\""),r("OutboundLink")],1)])]),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://tomaszs2.medium.com/%EF%B8%8F-5-awesome-rust-projects-people-dont-know-about-9363b0a6fae2",target:"_blank",rel:"noopener noreferrer"}},[t._v("⚙️ 5 Awesome Rust Projects People Don’t Know About"),r("OutboundLink")],1)])]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/TheAlgorithms/Rust",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Algorithms - Rust"),r("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust"}},[this._v("#")]),this._v(" Rust")])},function(){var t=this._self._c;return t("p",[this._v("두번째로 관심이 많은 Rust에 대한 자료를 기록합니다."),t("br"),this._v("\n배우기 난해한 언어인지라 차근차근 배우고 있습니다.")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"what-is-the-rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-rust"}},[this._v("#")]),this._v(" What is the Rust?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"study-rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#study-rust"}},[this._v("#")]),this._v(" Study Rust")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"다른-언어에서-rust로"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#다른-언어에서-rust로"}},[this._v("#")]),this._v(" 다른 언어에서 Rust로")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"projects-references"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#projects-references"}},[this._v("#")]),this._v(" Projects References")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"algorithm"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#algorithm"}},[this._v("#")]),this._v(" Algorithm")])}],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/41.b8bdd50e.js b/assets/js/42.bd2b089f.js similarity index 84% rename from assets/js/41.b8bdd50e.js rename to assets/js/42.bd2b089f.js index 7eb8b50a..dca3a72f 100644 --- a/assets/js/41.b8bdd50e.js +++ b/assets/js/42.bd2b089f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{217:function(t,s,i){"use strict";i.r(s);var n=i(0),e=Object(n.a)({},(function(){this._self._c;return this._m(0)}),[function(){var t=this._self._c;return t("div",{staticClass:"content"},[t("h1",{attrs:{id:"security"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[this._v("#")]),this._v(" Security")])])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{218:function(t,s,i){"use strict";i.r(s);var n=i(0),e=Object(n.a)({},(function(){this._self._c;return this._m(0)}),[function(){var t=this._self._c;return t("div",{staticClass:"content"},[t("h1",{attrs:{id:"security"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[this._v("#")]),this._v(" Security")])])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/42.e1998151.js b/assets/js/43.cc74436c.js similarity index 99% rename from assets/js/42.e1998151.js rename to assets/js/43.cc74436c.js index d83eb1bb..08232d2d 100644 --- a/assets/js/42.e1998151.js +++ b/assets/js/43.cc74436c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{218:function(t,s,r){"use strict";r.r(s);var a=r(0),_=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("소유권(Ownership)은 러스트의 가장 유니크한 특성이며, 러스타가 가비지 컬렉터(Garbage Collection, GC) 없이 메모리 안정성 보장해 준다. 소유권이 러스트 내에서 어떻게 동작하는지 이해하는 것은 중요하다.")]),t._v(" "),s("p",[t._v("모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 콜렉션을 갖고 있습니다. 다른 프로그래밍 언어들에서는 프로그램가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 러스트는 제 3의 접근법을 이용합니다. 메모리는 컴파일 타임에 컴파일러가 체크할 규칙들로 구성된 소유권 시스템을 통해 관리됩니다. 소유권 기능들의 어떤 것도 런타임 비용이 발생하지 않습니다.")]),t._v(" "),s("p",[t._v("소유권이란 개념이 많은 프로그래머들에게 새로운 것이기 때문에, 이해하고 사요하는 데에는 약간의 시간이 걸립니다만, 좋은 소식은 여러분이 러스트와 소유권 시스템 규칙에 더 많은 경험을 할수록, 여러분은 더 안전하고 효율적인 코드를 자연스럽게 개발할 수 있게 됩니다.")]),t._v(" "),s("p",[t._v("소유권을 이해했을 때, 여러분은 러스트를 유니크하게 만드는 기능들을 이해하기 위한 견고한 기초를 가지게될 것입니다. 여러분은 매우 흔한 데이터 구조인 문자열에 집중된 몇가지 예제를 통해 소유권에 대해 배우게 될 것입니다.")]),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("GC 작업을 하는 가비지 콜렉터는 다음과 같은 일을 한다.")]),t._v(" "),t._m(3),t._v(" "),s("p",[t._v("즉, 메모리가 부족할 때 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다. 가비지 컬렉터에 대해서 알기 전에 우선 메모리에 대한 이해가 필요하다.\n프로그램을 실행할 때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 메모리를 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.")]),t._v(" "),s("p",[t._v("이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 '가비지'가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게 선언되거나 형변환이 되면서 다른 곳을 가리키게 되면서 주소를 잃어버리게 되고 다시 찾을 수 없게 되면서 정리되지 않은 메모리가 생겨버리게 되기 때문이다.")]),t._v(" "),s("p",[t._v("그래서 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있도록 메모리 해제를 시킨다. 이것이 가비지 컬렉터의 목적이다.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._m(10),t._v(" "),t._m(11),t._m(12),t._v(" "),s("ul",[s("li",[s("strong",[t._v("가비지 컬렉션(Garbage Collection, CG):")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://blog.metafor.kr/163",target:"_blank",rel:"noopener noreferrer"}},[t._v("가비지 컬렉션, 컬렉터(Garbage Collection)란?"),s("OutboundLink")],1)])])]),t._v(" "),t._m(13)])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230517-rust-소유권-규칙"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230517-rust-소유권-규칙"}},[this._v("#")]),this._v(" 20230517 - Rust 소유권 규칙")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"소유권이란"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#소유권이란"}},[this._v("#")]),this._v(" 소유권이란?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"가비지-컬렉터의-원리"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#가비지-컬렉터의-원리"}},[this._v("#")]),this._v(" 가비지 컬렉터의 원리")])},function(){var t=this._self._c;return t("ol",[t("li",[this._v("메모리 할당")]),this._v(" "),t("li",[this._v("사용 중인 메모리 인식")]),this._v(" "),t("li",[this._v("사용하지 않는 메모리 인식")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"소유권-규칙"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#소유권-규칙"}},[this._v("#")]),this._v(" 소유권 규칙")])},function(){var t=this._self._c;return t("ol",[t("li",[this._v("러스트의 각각의 값은 해당값의 오너(owner)라고 불리우는 변수를 갖고 있다.")]),this._v(" "),t("li",[this._v("한번에 딱 하나의 오너만 존재할 수 있다.")]),this._v(" "),t("li",[this._v("오너가 스코프 밖으로 벗어나는 때, 값은 버려진다(dropped).")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"변수의-스코프"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#변수의-스코프"}},[this._v("#")]),this._v(" 변수의 스코프")])},function(){var t=this._self._c;return t("p",[t("code",[this._v("fn main(){")]),this._v(" 코드를 예제에 붙이지 않을텐, 여러분들이 코드를 따라하려면 "),t("code",[this._v("main")]),this._v("함수에 직접 예제들을 넣어야 할 겁니다. 결과적으로, 우리의 예제들은 좀더 간략해져서 보일러 플레이트 코드에 비해 실제 디테일에 초점을 맞출 수 있도록 해 줄 것입니다.")])},function(){var t=this._self._c;return t("p",[this._v("소유권에 대한 첫 에제로서, 변수들의 스코프를 보겠습니다. "),t("strong",[this._v("스코프란 프로그램 내에서 아이템이 유효함을 표시하기 위한 범위입니다.")]),this._v(" 아래 코드처럼 생긴 변수가 있다고 해 봅시다.")])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[this._v("let")]),this._v(" s "),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("=")]),this._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[this._v('"hello"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("p",[this._v("변수 "),t("code",[this._v("s")]),this._v("는 스트링 리터럴을 나타나는데, 스트링 리터럴의 값은 우리의 프로그램의 텍스트 내에 하드코딩되어 있습니다. 변수는 선언된 시점부터 현재의 스코프가 끝날 때까지 유효합니다. 아래 예제 Listing 4-1은 변수 "),t("code",[this._v("s")]),this._v("가 유효한 지점을 주석으로 표시했습니다.")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s는 유효하지 않습니다. 아직 선언이 안됐거든요.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" s "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s는 이 지점부터 유효합니다.")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s를 가지고 뭔가 합니다.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 이 스코프는 이제 끝이므로, s는 더이상 유효하지 않습니다.")]),t._v("\n")])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-자료"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-자료"}},[this._v("#")]),this._v(" 참고한 자료")])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("Rust 소유권:")])])}],!1,null,null,null);s.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{219:function(t,s,r){"use strict";r.r(s);var a=r(0),_=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("소유권(Ownership)은 러스트의 가장 유니크한 특성이며, 러스타가 가비지 컬렉터(Garbage Collection, GC) 없이 메모리 안정성 보장해 준다. 소유권이 러스트 내에서 어떻게 동작하는지 이해하는 것은 중요하다.")]),t._v(" "),s("p",[t._v("모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 콜렉션을 갖고 있습니다. 다른 프로그래밍 언어들에서는 프로그램가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 러스트는 제 3의 접근법을 이용합니다. 메모리는 컴파일 타임에 컴파일러가 체크할 규칙들로 구성된 소유권 시스템을 통해 관리됩니다. 소유권 기능들의 어떤 것도 런타임 비용이 발생하지 않습니다.")]),t._v(" "),s("p",[t._v("소유권이란 개념이 많은 프로그래머들에게 새로운 것이기 때문에, 이해하고 사요하는 데에는 약간의 시간이 걸립니다만, 좋은 소식은 여러분이 러스트와 소유권 시스템 규칙에 더 많은 경험을 할수록, 여러분은 더 안전하고 효율적인 코드를 자연스럽게 개발할 수 있게 됩니다.")]),t._v(" "),s("p",[t._v("소유권을 이해했을 때, 여러분은 러스트를 유니크하게 만드는 기능들을 이해하기 위한 견고한 기초를 가지게될 것입니다. 여러분은 매우 흔한 데이터 구조인 문자열에 집중된 몇가지 예제를 통해 소유권에 대해 배우게 될 것입니다.")]),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("GC 작업을 하는 가비지 콜렉터는 다음과 같은 일을 한다.")]),t._v(" "),t._m(3),t._v(" "),s("p",[t._v("즉, 메모리가 부족할 때 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다. 가비지 컬렉터에 대해서 알기 전에 우선 메모리에 대한 이해가 필요하다.\n프로그램을 실행할 때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 메모리를 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.")]),t._v(" "),s("p",[t._v("이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 '가비지'가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게 선언되거나 형변환이 되면서 다른 곳을 가리키게 되면서 주소를 잃어버리게 되고 다시 찾을 수 없게 되면서 정리되지 않은 메모리가 생겨버리게 되기 때문이다.")]),t._v(" "),s("p",[t._v("그래서 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있도록 메모리 해제를 시킨다. 이것이 가비지 컬렉터의 목적이다.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._m(10),t._v(" "),t._m(11),t._m(12),t._v(" "),s("ul",[s("li",[s("strong",[t._v("가비지 컬렉션(Garbage Collection, CG):")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://blog.metafor.kr/163",target:"_blank",rel:"noopener noreferrer"}},[t._v("가비지 컬렉션, 컬렉터(Garbage Collection)란?"),s("OutboundLink")],1)])])]),t._v(" "),t._m(13)])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230517-rust-소유권-규칙"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230517-rust-소유권-규칙"}},[this._v("#")]),this._v(" 20230517 - Rust 소유권 규칙")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"소유권이란"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#소유권이란"}},[this._v("#")]),this._v(" 소유권이란?")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"가비지-컬렉터의-원리"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#가비지-컬렉터의-원리"}},[this._v("#")]),this._v(" 가비지 컬렉터의 원리")])},function(){var t=this._self._c;return t("ol",[t("li",[this._v("메모리 할당")]),this._v(" "),t("li",[this._v("사용 중인 메모리 인식")]),this._v(" "),t("li",[this._v("사용하지 않는 메모리 인식")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"소유권-규칙"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#소유권-규칙"}},[this._v("#")]),this._v(" 소유권 규칙")])},function(){var t=this._self._c;return t("ol",[t("li",[this._v("러스트의 각각의 값은 해당값의 오너(owner)라고 불리우는 변수를 갖고 있다.")]),this._v(" "),t("li",[this._v("한번에 딱 하나의 오너만 존재할 수 있다.")]),this._v(" "),t("li",[this._v("오너가 스코프 밖으로 벗어나는 때, 값은 버려진다(dropped).")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"변수의-스코프"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#변수의-스코프"}},[this._v("#")]),this._v(" 변수의 스코프")])},function(){var t=this._self._c;return t("p",[t("code",[this._v("fn main(){")]),this._v(" 코드를 예제에 붙이지 않을텐, 여러분들이 코드를 따라하려면 "),t("code",[this._v("main")]),this._v("함수에 직접 예제들을 넣어야 할 겁니다. 결과적으로, 우리의 예제들은 좀더 간략해져서 보일러 플레이트 코드에 비해 실제 디테일에 초점을 맞출 수 있도록 해 줄 것입니다.")])},function(){var t=this._self._c;return t("p",[this._v("소유권에 대한 첫 에제로서, 변수들의 스코프를 보겠습니다. "),t("strong",[this._v("스코프란 프로그램 내에서 아이템이 유효함을 표시하기 위한 범위입니다.")]),this._v(" 아래 코드처럼 생긴 변수가 있다고 해 봅시다.")])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[this._v("let")]),this._v(" s "),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("=")]),this._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[this._v('"hello"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("p",[this._v("변수 "),t("code",[this._v("s")]),this._v("는 스트링 리터럴을 나타나는데, 스트링 리터럴의 값은 우리의 프로그램의 텍스트 내에 하드코딩되어 있습니다. 변수는 선언된 시점부터 현재의 스코프가 끝날 때까지 유효합니다. 아래 예제 Listing 4-1은 변수 "),t("code",[this._v("s")]),this._v("가 유효한 지점을 주석으로 표시했습니다.")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s는 유효하지 않습니다. 아직 선언이 안됐거든요.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" s "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s는 이 지점부터 유효합니다.")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// s를 가지고 뭔가 합니다.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 이 스코프는 이제 끝이므로, s는 더이상 유효하지 않습니다.")]),t._v("\n")])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-자료"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-자료"}},[this._v("#")]),this._v(" 참고한 자료")])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("Rust 소유권:")])])}],!1,null,null,null);s.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/44.1663f21c.js b/assets/js/44.1663f21c.js new file mode 100644 index 00000000..f7a588bf --- /dev/null +++ b/assets/js/44.1663f21c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{220:function(n,t,s){"use strict";s.r(t);var c=s(0),e=Object(c.a)({},(function(){return(0,this._self._c)("div",{staticClass:"content"})}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/43.0ccbf533.js b/assets/js/45.53ce00d3.js similarity index 99% rename from assets/js/43.0ccbf533.js rename to assets/js/45.53ce00d3.js index 098f30f9..52dfd50d 100644 --- a/assets/js/43.0ccbf533.js +++ b/assets/js/45.53ce00d3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{219:function(t,_,v){"use strict";v.r(_);var i=v(0),e=Object(i.a)({},(function(){var t=this,_=t._self._c;return _("div",{staticClass:"content"},[t._m(0),t._v(" "),_("ul",[_("li",[_("a",{attrs:{href:"https://udemy.com/course/rust-building-application",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust : 실제 애플리케이션 구축을 통한 Rust 완벽 정복"),_("OutboundLink")],1),t._v("을 보면서 공부한 내용들을 기록한 내용임.")])]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),_("ul",[t._m(4),t._v(" "),_("li",[t._v("Rust에서는 함수와 변수를 선언할 때 "),_("strong",[t._v("스케이크 케이스(Snake Case)")]),t._v(" 를 사용함.\n"),_("ul",[t._m(5),t._v(" "),_("li",[t._v("표기법에 대해서 더 정확한 내용을 알고 싶다면 "),_("a",{attrs:{href:"https://velog.io/@leyuri/%ED%91%9C%EA%B8%B0%EB%B2%95-%EC%8A%A4%EB%84%A4%EC%9D%B4%ED%81%AC-%EC%BC%80%EC%9D%B4%EC%8A%A4-%ED%8C%8C%EC%8A%A4%EC%B9%BC-%EC%BC%80%EC%9D%B4%EC%8A%A4-%EC%B9%B4%EB%A9%9C-%EC%BC%80%EC%9D%B4%EC%8A%A4",target:"_blank",rel:"noopener noreferrer"}},[t._v("표기법 - 스네이크 케이스, 파스칼 케이스, 카멜 케이스"),_("OutboundLink")],1),t._v("를 살펴보길 바람.")])])]),t._v(" "),t._m(6)]),t._v(" "),t._m(7),t._v(" "),_("ul",[_("li",[t._v("매크로(Macro) → "),_("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EB%A9%94%ED%83%80%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D",target:"_blank",rel:"noopener noreferrer"}},[t._v("메타 프로그래밍(Metaprogramming)"),_("OutboundLink")],1),t._v("의 줄임말.")]),t._v(" "),_("li",[t._v("변수, 다수의 매개변수 그리고 매번 다른 유형으로 처리될 수 있음. 효율적인 방법.")]),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),_("li",[t._v("더 많은 Rust 코드로 확장되는 방법을 더 잘 이해하고 싶다면 "),_("a",{attrs:{href:"https://github.com/dtolnay/cargo-expand",target:"_blank",rel:"noopener noreferrer"}},[_("code",[t._v("cargo-expand")]),_("OutboundLink")],1),t._v("를 사용하면 됨.")])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230430-명령줄-애플리케이션-구축"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230430-명령줄-애플리케이션-구축"}},[this._v("#")]),this._v(" 20230430 - 명령줄 애플리케이션 구축")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"기본적인-데이터-유형-basic-data-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#기본적인-데이터-유형-basic-data-types"}},[this._v("#")]),this._v(" 기본적인 데이터 유형(Basic Data Types)")])},function(){var t=this,_=t._self._c;return _("ul",[_("li",[_("strong",[t._v("Boolean - 블리언")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("bool")]),t._v(" → "),_("code",[t._v("true")]),t._v(", "),_("code",[t._v("false")])]),t._v(" "),_("li",[_("code",[t._v("1byte")]),t._v(" 크기이며, bool 키워드를 통해서 선언 가능.")])])]),t._v(" "),_("li",[_("strong",[t._v("Characters - 문자")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("char")]),t._v(" → 하나의 유니코드 값을 가짐.")]),t._v(" "),_("li",[_("code",[t._v("4byte")]),t._v(" 크기임. 예를 들어서 ASCII 문자 집합을 "),_("code",[t._v("char")]),t._v("로 저장하게 된다면 메모리 낭비임.")])])]),t._v(" "),_("li",[_("strong",[t._v("Integers - 정수")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("u8")]),t._v(", "),_("code",[t._v("i8")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("u")]),t._v("는 무부호 정수(양수) → 부호가 없는 정수")]),t._v(" "),_("li",[_("code",[t._v("i")]),t._v("는 유부호 정수(양수 or 음수) → 부호가 있는 정수")]),t._v(" "),_("li",[_("code",[t._v("8bit")]),t._v(" → "),_("code",[t._v("1byte")]),t._v(" / in Rust 128bit ok!")])])]),t._v(" "),_("li",[_("code",[t._v("u16")]),t._v(", "),_("code",[t._v("i16")])]),t._v(" "),_("li",[_("code",[t._v("u32")]),t._v(", "),_("code",[t._v("i32")])]),t._v(" "),_("li",[_("code",[t._v("u64")]),t._v(", "),_("code",[t._v("i64")])]),t._v(" "),_("li",[_("code",[t._v("u128")]),t._v(", "),_("code",[t._v("i128")])]),t._v(" "),_("li",[_("code",[t._v("usize")]),t._v(", "),_("code",[t._v("iszie")]),t._v(" "),_("ul",[_("li",[t._v("아키텍쳐에 종속된 타입,")]),t._v(" "),_("li",[t._v("32비트 아키텍쳐 환경에서는 32bit, 64bit")])])])])]),t._v(" "),_("li",[_("strong",[t._v("Floats - 부동 소수점")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("f32")]),t._v(", "),_("code",[t._v("f64")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("f64")]),t._v(" → "),_("code",[t._v("f32")]),t._v("보다 2배의 정밀도를 갖고 있음.")])])])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"함수-function"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#함수-function"}},[this._v("#")]),this._v(" 함수(Function)")])},function(){var t=this._self._c;return t("li",[this._v("Rust에서는 함수를 선언하기 위해서는 키워드 "),t("code",[this._v("fn(){}")]),this._v("을 사용해야함.\n"),t("ul",[t("li",[this._v("특별한 점은 없고, 선언과정은 다른 프로그래밍 언어와 동일함.")])])])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("Ex)")]),this._v(" "),t("code",[this._v("fn hello_world(){}")])])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("반환문:")]),this._v(" "),t("ul",[t("li",[t("code",[this._v("return 50.0")]),this._v(" 혹은 "),t("code",[this._v("50.0")]),this._v("만 적어도 반환이 됨.\n"),t("ul",[t("li",[this._v("암묵적으로 반환할 수 있도록 함.")])])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"매크로-macro"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#매크로-macro"}},[this._v("#")]),this._v(" 매크로(Macro)")])},function(){var t=this._self._c;return t("li",[this._v("매크로의 단점은 매크로를 정의하는 것이 함수 정의보다 더 복잡하다는 점."),t("br"),this._v("\n결론적으로는 "),t("strong",[this._v("더 많은 Rust 코드를 작성하는 Rust 코드를 작성하기 때문이고 이것은 읽고 관리하기 훨씬 더 어렵습니다.")])])},function(){var t=this._self._c;return t("li",[t("code",[this._v("println()!")]),this._v("가 매크로인 이유는 다수의 인수를 받고 있기 때문임. 단일 문자열로 호출할 수 있고, 중괄호를 포함하는 문자열로 호출 될 수도 있음.\n"),t("ul",[t("li",[t("strong",[this._v("Ex)")]),this._v(" "),t("code",[this._v('println!("Nubmer: {}, String:{}, 100, "Hello")')])])])])}],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{221:function(t,_,v){"use strict";v.r(_);var i=v(0),e=Object(i.a)({},(function(){var t=this,_=t._self._c;return _("div",{staticClass:"content"},[t._m(0),t._v(" "),_("ul",[_("li",[_("a",{attrs:{href:"https://udemy.com/course/rust-building-application",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust : 실제 애플리케이션 구축을 통한 Rust 완벽 정복"),_("OutboundLink")],1),t._v("을 보면서 공부한 내용들을 기록한 내용임.")])]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),_("ul",[t._m(4),t._v(" "),_("li",[t._v("Rust에서는 함수와 변수를 선언할 때 "),_("strong",[t._v("스케이크 케이스(Snake Case)")]),t._v(" 를 사용함.\n"),_("ul",[t._m(5),t._v(" "),_("li",[t._v("표기법에 대해서 더 정확한 내용을 알고 싶다면 "),_("a",{attrs:{href:"https://velog.io/@leyuri/%ED%91%9C%EA%B8%B0%EB%B2%95-%EC%8A%A4%EB%84%A4%EC%9D%B4%ED%81%AC-%EC%BC%80%EC%9D%B4%EC%8A%A4-%ED%8C%8C%EC%8A%A4%EC%B9%BC-%EC%BC%80%EC%9D%B4%EC%8A%A4-%EC%B9%B4%EB%A9%9C-%EC%BC%80%EC%9D%B4%EC%8A%A4",target:"_blank",rel:"noopener noreferrer"}},[t._v("표기법 - 스네이크 케이스, 파스칼 케이스, 카멜 케이스"),_("OutboundLink")],1),t._v("를 살펴보길 바람.")])])]),t._v(" "),t._m(6)]),t._v(" "),t._m(7),t._v(" "),_("ul",[_("li",[t._v("매크로(Macro) → "),_("a",{attrs:{href:"https://ko.wikipedia.org/wiki/%EB%A9%94%ED%83%80%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D",target:"_blank",rel:"noopener noreferrer"}},[t._v("메타 프로그래밍(Metaprogramming)"),_("OutboundLink")],1),t._v("의 줄임말.")]),t._v(" "),_("li",[t._v("변수, 다수의 매개변수 그리고 매번 다른 유형으로 처리될 수 있음. 효율적인 방법.")]),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),_("li",[t._v("더 많은 Rust 코드로 확장되는 방법을 더 잘 이해하고 싶다면 "),_("a",{attrs:{href:"https://github.com/dtolnay/cargo-expand",target:"_blank",rel:"noopener noreferrer"}},[_("code",[t._v("cargo-expand")]),_("OutboundLink")],1),t._v("를 사용하면 됨.")])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230430-명령줄-애플리케이션-구축"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230430-명령줄-애플리케이션-구축"}},[this._v("#")]),this._v(" 20230430 - 명령줄 애플리케이션 구축")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"기본적인-데이터-유형-basic-data-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#기본적인-데이터-유형-basic-data-types"}},[this._v("#")]),this._v(" 기본적인 데이터 유형(Basic Data Types)")])},function(){var t=this,_=t._self._c;return _("ul",[_("li",[_("strong",[t._v("Boolean - 블리언")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("bool")]),t._v(" → "),_("code",[t._v("true")]),t._v(", "),_("code",[t._v("false")])]),t._v(" "),_("li",[_("code",[t._v("1byte")]),t._v(" 크기이며, bool 키워드를 통해서 선언 가능.")])])]),t._v(" "),_("li",[_("strong",[t._v("Characters - 문자")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("char")]),t._v(" → 하나의 유니코드 값을 가짐.")]),t._v(" "),_("li",[_("code",[t._v("4byte")]),t._v(" 크기임. 예를 들어서 ASCII 문자 집합을 "),_("code",[t._v("char")]),t._v("로 저장하게 된다면 메모리 낭비임.")])])]),t._v(" "),_("li",[_("strong",[t._v("Integers - 정수")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("u8")]),t._v(", "),_("code",[t._v("i8")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("u")]),t._v("는 무부호 정수(양수) → 부호가 없는 정수")]),t._v(" "),_("li",[_("code",[t._v("i")]),t._v("는 유부호 정수(양수 or 음수) → 부호가 있는 정수")]),t._v(" "),_("li",[_("code",[t._v("8bit")]),t._v(" → "),_("code",[t._v("1byte")]),t._v(" / in Rust 128bit ok!")])])]),t._v(" "),_("li",[_("code",[t._v("u16")]),t._v(", "),_("code",[t._v("i16")])]),t._v(" "),_("li",[_("code",[t._v("u32")]),t._v(", "),_("code",[t._v("i32")])]),t._v(" "),_("li",[_("code",[t._v("u64")]),t._v(", "),_("code",[t._v("i64")])]),t._v(" "),_("li",[_("code",[t._v("u128")]),t._v(", "),_("code",[t._v("i128")])]),t._v(" "),_("li",[_("code",[t._v("usize")]),t._v(", "),_("code",[t._v("iszie")]),t._v(" "),_("ul",[_("li",[t._v("아키텍쳐에 종속된 타입,")]),t._v(" "),_("li",[t._v("32비트 아키텍쳐 환경에서는 32bit, 64bit")])])])])]),t._v(" "),_("li",[_("strong",[t._v("Floats - 부동 소수점")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("f32")]),t._v(", "),_("code",[t._v("f64")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("f64")]),t._v(" → "),_("code",[t._v("f32")]),t._v("보다 2배의 정밀도를 갖고 있음.")])])])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"함수-function"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#함수-function"}},[this._v("#")]),this._v(" 함수(Function)")])},function(){var t=this._self._c;return t("li",[this._v("Rust에서는 함수를 선언하기 위해서는 키워드 "),t("code",[this._v("fn(){}")]),this._v("을 사용해야함.\n"),t("ul",[t("li",[this._v("특별한 점은 없고, 선언과정은 다른 프로그래밍 언어와 동일함.")])])])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("Ex)")]),this._v(" "),t("code",[this._v("fn hello_world(){}")])])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("반환문:")]),this._v(" "),t("ul",[t("li",[t("code",[this._v("return 50.0")]),this._v(" 혹은 "),t("code",[this._v("50.0")]),this._v("만 적어도 반환이 됨.\n"),t("ul",[t("li",[this._v("암묵적으로 반환할 수 있도록 함.")])])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"매크로-macro"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#매크로-macro"}},[this._v("#")]),this._v(" 매크로(Macro)")])},function(){var t=this._self._c;return t("li",[this._v("매크로의 단점은 매크로를 정의하는 것이 함수 정의보다 더 복잡하다는 점."),t("br"),this._v("\n결론적으로는 "),t("strong",[this._v("더 많은 Rust 코드를 작성하는 Rust 코드를 작성하기 때문이고 이것은 읽고 관리하기 훨씬 더 어렵습니다.")])])},function(){var t=this._self._c;return t("li",[t("code",[this._v("println()!")]),this._v("가 매크로인 이유는 다수의 인수를 받고 있기 때문임. 단일 문자열로 호출할 수 있고, 중괄호를 포함하는 문자열로 호출 될 수도 있음.\n"),t("ul",[t("li",[t("strong",[this._v("Ex)")]),this._v(" "),t("code",[this._v('println!("Nubmer: {}, String:{}, 100, "Hello")')])])])])}],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/44.90743320.js b/assets/js/46.93317ea6.js similarity index 99% rename from assets/js/44.90743320.js rename to assets/js/46.93317ea6.js index af6bbfbf..accdf5ad 100644 --- a/assets/js/44.90743320.js +++ b/assets/js/46.93317ea6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{220:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._m(11),s("ul",[s("li",[s("code",[t._v("cagro")]),t._v("를 사용하지 않고 실행하는 경우 "),s("a",{attrs:{href:"https://doc.rust-lang.org/rustc/what-is-rustc.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("rustc")]),s("OutboundLink")],1),t._v("를 사용하여 빌드 파일을 만들고 실행 시킬 수 있다.\n"),t._m(12)])]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._m(19),t._v(" "),t._m(20),t._m(21),t._v(" "),t._m(22),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._m(26),t._m(27),t._v(" "),t._m(28),t._m(29),t._v(" "),t._m(30),t._m(31),t._v(" "),t._m(32)])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_1-시작해봅시다"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-시작해봅시다"}},[this._v("#")]),this._v(" 1. 시작해봅시다")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-1-러스트-설치"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-러스트-설치"}},[this._v("#")]),this._v(" 1.1. 러스트 설치")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("macOS 환경에서 Rust를 설치하는 방법에 대해서 서술한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Homebrew 설치되어 있지 않은 경우:")]),t._v("\n$ /bin/bash "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-fsSL")]),t._v(" https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Homebrew 이미 설치 되어있는 경우:")]),t._v("\n$ brew update "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" brew upgrade\n$ brew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" rust\n")])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-2-hello-world"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-hello-world"}},[this._v("#")]),this._v(" 1.2. Hello, World!")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"프로젝트-디렉토리-생성하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#프로젝트-디렉토리-생성하기"}},[this._v("#")]),this._v(" 프로젝트 디렉토리 생성하기")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("자신의 프로젝트를 저장할 디렉토리를 생성한다.\n"),t("ul",[t("li",[this._v("프로젝트 생성은 자신의 입맛에 맞게 생성하면 된다.")])])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/dev/github/the-rust-programming-language\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/dev/github/the-rust-programming-language\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" hello_world\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" hello_world\n")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"러스트-프로그램-작성하고-실행하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#러스트-프로그램-작성하고-실행하기"}},[this._v("#")]),this._v(" 러스트 프로그램 작성하고 실행하기")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("code",[t._v("main.rs")]),t._v(" 소스 파일을 만듭니다.\n"),s("ul",[s("li",[t._v("러스트 파일은 항상 "),s("code",[t._v(".rs")]),t._v(" 확장자로 끝납니다. 파일명을 지을 때는 두 단어 이상으로 이루어질 경우에는 "),s("code",[t._v("helloworld.rs")]),t._v("와 같이 붙여서 쓰지 않고 "),s("code",[t._v("hello_world.rs")]),t._v("처럼 단어 사이에 밑줄("),s("code",[t._v("__")]),t._v(")을 넣는 것이 관례임.")])])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// main.rs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ rustc main.rs\n$ ./main\nHello, world"),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("!")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("rustc")]),this._v("는 간단하게 말해서 Rust 코드를 컴파일 할 수 있도로 도와주는 컴파일러이다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-3-카고를-사용해봅시다"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-3-카고를-사용해봅시다"}},[this._v("#")]),this._v(" 1.3. 카고를 사용해봅시다")])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo")]),this._v("는 러스트 빌드 시스템 및 패키지 매니저이다. 다른 언어처럼 다양한 패키지를 설치하고 실행하는 도구이다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.72")]),t._v(".0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("26bba4830 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2023")]),t._v("-08-26"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("제대로 "),t("code",[this._v("cargo")]),this._v("가 설치되어 있는지 확인할 수 있는 방법이다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"카고로-프로젝트-생성하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#카고로-프로젝트-생성하기"}},[this._v("#")]),this._v(" 카고로 프로젝트 생성하기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("cargo")]),this._v(" new hello_cargo\n$ "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[this._v("cd")]),this._v(" hello_cargo\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo")]),this._v("를 통해서 새로운 프로젝트(디렉토리)를 생성한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello_cargo"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo new")]),this._v(" 명령어를 통해서 생성한 "),t("code",[this._v("cargo.toml")]),this._v(" 파일의 내용이다. 본 내용과 동일하면 정상적으로 프로젝트가 생성된 것이다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("프로젝트를 "),t("code",[this._v("cargo")]),this._v("를 통해서 새롭게 생성한 경우 "),t("code",[this._v("src/main.rs")]),this._v(" 파일에 위와 동일한 코드가 작성되어 있다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"카고로-프로젝트를-빌드하고-실행하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#카고로-프로젝트를-빌드하고-실행하기"}},[this._v("#")]),this._v(" 카고로 프로젝트를 빌드하고 실행하기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" build\n Compiling hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(".14s\n")])])])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ ./target/debug/hello_cargo\nHello, world"),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("!")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("터미널에 "),t("code",[this._v("Hello, world!")]),this._v("가 출력되었다면 정상적으로 프로젝트가 빌드되었음을 의미한다.")]),this._v(" "),t("li",[this._v("컴파일과 실행을 한 번에 진행할 수 있는 명령어도 있다. "),t("code",[this._v("cargo run")]),this._v(" 명령어를 사용하면 빌드와 실행을 하나의 명령어로 진행할 수 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".00s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/hello_cargo"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("Finished dev [unoptimized + debuginfo] target(s) in 0.00s")]),this._v(" 메시지를 통해서 빌드 시간이 0초임으로 새롭게 빌드된 내용이 없다는 것을 알 수 있다.")]),this._v(" "),t("li",[this._v("빌드와 관련된 디렉토리를 삭제하고 새롭게 실행해 보겠다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" clean "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# target 디렉토리 삭제됨.")]),t._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".53s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/hello_cargo"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo clean")]),this._v(" 명령어를 통해서 빌드 시 생성되는 "),t("code",[this._v("target")]),this._v(" 디렉토리를 삭제한다.")]),this._v(" "),t("li",[t("code",[this._v("Finished dev [unoptimized + debuginfo] target(s) in 0.53s")]),this._v(" 메시지를 통해서 새롭게 빌드되었다는 사실을 알 수 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" check\n Checking hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".57s\n")])])])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{222:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._m(11),s("ul",[s("li",[s("code",[t._v("cagro")]),t._v("를 사용하지 않고 실행하는 경우 "),s("a",{attrs:{href:"https://doc.rust-lang.org/rustc/what-is-rustc.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("rustc")]),s("OutboundLink")],1),t._v("를 사용하여 빌드 파일을 만들고 실행 시킬 수 있다.\n"),t._m(12)])]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._m(19),t._v(" "),t._m(20),t._m(21),t._v(" "),t._m(22),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._m(26),t._m(27),t._v(" "),t._m(28),t._m(29),t._v(" "),t._m(30),t._m(31),t._v(" "),t._m(32)])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_1-시작해봅시다"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-시작해봅시다"}},[this._v("#")]),this._v(" 1. 시작해봅시다")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-1-러스트-설치"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-러스트-설치"}},[this._v("#")]),this._v(" 1.1. 러스트 설치")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("macOS 환경에서 Rust를 설치하는 방법에 대해서 서술한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Homebrew 설치되어 있지 않은 경우:")]),t._v("\n$ /bin/bash "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-fsSL")]),t._v(" https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Homebrew 이미 설치 되어있는 경우:")]),t._v("\n$ brew update "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" brew upgrade\n$ brew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" rust\n")])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-2-hello-world"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-hello-world"}},[this._v("#")]),this._v(" 1.2. Hello, World!")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"프로젝트-디렉토리-생성하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#프로젝트-디렉토리-생성하기"}},[this._v("#")]),this._v(" 프로젝트 디렉토리 생성하기")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("자신의 프로젝트를 저장할 디렉토리를 생성한다.\n"),t("ul",[t("li",[this._v("프로젝트 생성은 자신의 입맛에 맞게 생성하면 된다.")])])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/dev/github/the-rust-programming-language\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/dev/github/the-rust-programming-language\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" hello_world\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" hello_world\n")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"러스트-프로그램-작성하고-실행하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#러스트-프로그램-작성하고-실행하기"}},[this._v("#")]),this._v(" 러스트 프로그램 작성하고 실행하기")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("code",[t._v("main.rs")]),t._v(" 소스 파일을 만듭니다.\n"),s("ul",[s("li",[t._v("러스트 파일은 항상 "),s("code",[t._v(".rs")]),t._v(" 확장자로 끝납니다. 파일명을 지을 때는 두 단어 이상으로 이루어질 경우에는 "),s("code",[t._v("helloworld.rs")]),t._v("와 같이 붙여서 쓰지 않고 "),s("code",[t._v("hello_world.rs")]),t._v("처럼 단어 사이에 밑줄("),s("code",[t._v("__")]),t._v(")을 넣는 것이 관례임.")])])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// main.rs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ rustc main.rs\n$ ./main\nHello, world"),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("!")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("rustc")]),this._v("는 간단하게 말해서 Rust 코드를 컴파일 할 수 있도로 도와주는 컴파일러이다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"_1-3-카고를-사용해봅시다"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-3-카고를-사용해봅시다"}},[this._v("#")]),this._v(" 1.3. 카고를 사용해봅시다")])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo")]),this._v("는 러스트 빌드 시스템 및 패키지 매니저이다. 다른 언어처럼 다양한 패키지를 설치하고 실행하는 도구이다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.72")]),t._v(".0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("26bba4830 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2023")]),t._v("-08-26"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("제대로 "),t("code",[this._v("cargo")]),this._v("가 설치되어 있는지 확인할 수 있는 방법이다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"카고로-프로젝트-생성하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#카고로-프로젝트-생성하기"}},[this._v("#")]),this._v(" 카고로 프로젝트 생성하기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("cargo")]),this._v(" new hello_cargo\n$ "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[this._v("cd")]),this._v(" hello_cargo\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo")]),this._v("를 통해서 새로운 프로젝트(디렉토리)를 생성한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello_cargo"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo new")]),this._v(" 명령어를 통해서 생성한 "),t("code",[this._v("cargo.toml")]),this._v(" 파일의 내용이다. 본 내용과 동일하면 정상적으로 프로젝트가 생성된 것이다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("프로젝트를 "),t("code",[this._v("cargo")]),this._v("를 통해서 새롭게 생성한 경우 "),t("code",[this._v("src/main.rs")]),this._v(" 파일에 위와 동일한 코드가 작성되어 있다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"카고로-프로젝트를-빌드하고-실행하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#카고로-프로젝트를-빌드하고-실행하기"}},[this._v("#")]),this._v(" 카고로 프로젝트를 빌드하고 실행하기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" build\n Compiling hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(".14s\n")])])])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ ./target/debug/hello_cargo\nHello, world"),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("!")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("터미널에 "),t("code",[this._v("Hello, world!")]),this._v("가 출력되었다면 정상적으로 프로젝트가 빌드되었음을 의미한다.")]),this._v(" "),t("li",[this._v("컴파일과 실행을 한 번에 진행할 수 있는 명령어도 있다. "),t("code",[this._v("cargo run")]),this._v(" 명령어를 사용하면 빌드와 실행을 하나의 명령어로 진행할 수 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".00s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/hello_cargo"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("Finished dev [unoptimized + debuginfo] target(s) in 0.00s")]),this._v(" 메시지를 통해서 빌드 시간이 0초임으로 새롭게 빌드된 내용이 없다는 것을 알 수 있다.")]),this._v(" "),t("li",[this._v("빌드와 관련된 디렉토리를 삭제하고 새롭게 실행해 보겠다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" clean "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# target 디렉토리 삭제됨.")]),t._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".53s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/hello_cargo"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[t("code",[this._v("cargo clean")]),this._v(" 명령어를 통해서 빌드 시 생성되는 "),t("code",[this._v("target")]),this._v(" 디렉토리를 삭제한다.")]),this._v(" "),t("li",[t("code",[this._v("Finished dev [unoptimized + debuginfo] target(s) in 0.53s")]),this._v(" 메시지를 통해서 새롭게 빌드되었다는 사실을 알 수 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" check\n Checking hello_cargo v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch01/hello_cargo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".57s\n")])])])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/45.518fb667.js b/assets/js/47.4b2efa35.js similarity index 99% rename from assets/js/45.518fb667.js rename to assets/js/47.4b2efa35.js index 91cc7cc4..8797e1fa 100644 --- a/assets/js/45.518fb667.js +++ b/assets/js/47.4b2efa35.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{221:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._m(3),t._m(4),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),s("ul",[t._m(8),t._v(" "),s("li",[t._v("기본적으로 러스트는 모든 프로그램의 스코프로 가져오는 표준 라이브러리에 정의된 아이템 집합을 가지고 있다. 이 집하을 프렐루드(prelude)라고 부른다. 이와 관련된 내용은 "),s("a",{attrs:{href:"https://doc.rust-lang.org/reference/names/preludes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("표준 라이브러리 문서"),s("OutboundLink")],1),t._v("를 참고하자.")]),t._v(" "),t._m(9)]),t._v(" "),s("hr"),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._m(13),t._v(" "),t._m(14),t._m(15),t._v(" "),t._m(16),t._m(17),s("ul",[t._m(18),t._v(" "),t._m(19),t._v(" "),s("li",[s("a",{attrs:{href:"https://doc.rust-lang.org/std/string/struct.String.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("String")]),s("OutboundLink")],1),t._v("은 표준 라이브러리에서 제공하는 확장 가능한(growable) UTF-8 인코딩의 문자열 타입이다.")]),t._v(" "),s("li",[s("code",[t._v("::new")]),t._v("에 있는 "),s("code",[t._v("::")]),t._v("는 "),s("code",[t._v("new")]),t._v("가 "),s("code",[t._v("String")]),t._v(" 타입의 연관 함수(associated function)임을 나타낸다. "),t._m(20),t._v("이다. 이 "),s("code",[t._v("new")]),t._v(" 함수는 비어있는 새 문자열을 생성한다. "),s("code",[t._v("new")]),t._v("는 어떤 새로운 값을 만드는 함수 이름으로 흔히 사용되는 이름이기 때문에, 여러 타입에서 "),s("code",[t._v("new")]),t._v(" 함수를 찾아볼 수 있다.\n"),s("ul",[s("li",[t._v("연관 함수(associated function)와 관련된 자료이며, "),s("a",{attrs:{href:"https://yongj.in/rust/rust-methods/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Rust] 메서드와 연관함수"),s("OutboundLink")],1),t._v(", "),s("a",{attrs:{href:"https://hyunmin1906.tistory.com/311",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Rust/러스트] 구조체의 메소드, 연관함수"),s("OutboundLink")],1),t._v("를 참고하면 된다.")])])]),t._v(" "),t._m(21)]),t._v(" "),t._m(22),t._v(" "),t._m(23),s("ul",[t._m(24),t._v(" "),s("li",[s("code",[t._v("stdin")]),t._v(" 함수는 터미널의 표준 입력의 핸들(handle)을 나타내는 타입인 "),s("a",{attrs:{href:"https://doc.rust-lang.org/std/io/fn.stdin.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("std::io::Stdin")]),s("OutboundLink")],1),t._v("의 인스턴스를 돌려준다.")]),t._v(" "),t._m(25),t._v(" "),t._m(26)]),t._v(" "),s("hr"),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._m(30),t._v(" "),t._m(31),s("ul",[t._m(32),t._v(" "),t._m(33),t._v(" "),s("li",[s("a",{attrs:{href:"https://doc.rust-lang.org/std/result/enum.Result.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Result")]),s("OutboundLink")],1),t._v("는 "),s("em",[t._v("enum")]),t._v("이라고도 일컫는 "),s("a",{attrs:{href:"https://rinthel.github.io/rust-lang-book-ko/ch06-00-enums.html",target:"_blank",rel:"noopener noreferrer"}},[s("em",[t._v("열거형(enumeration)")]),s("OutboundLink")],1),t._v("인데, 여러 개의 가능한 상태 중에 하나의 값이 될 수 있는 타입이다. 이러한 기능한 상태 값을 *배리언트(vaiant)*라고 부른다.")])]),t._v(" "),s("hr"),t._v(" "),s("ul",[t._m(34),t._v(" "),s("li",[t._v("다른 타입들처럼 "),s("code",[t._v("Result")]),t._v(" 타입의 값에도 메서드가 있습니다. "),s("code",[t._v("Result")]),t._v(" 인스턴스에는 "),s("a",{attrs:{href:"https://doc.rust-lang.org/std/result/enum.Result.html#method.expect",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("expect")]),t._v(" 메서드"),s("OutboundLink")],1),t._v("가 있습니다. 만약 "),s("code",[t._v("Result")]),t._v(" 인스턴스가 "),s("code",[t._v("Err")]),t._v("일 경우 "),s("code",[t._v("expect")]),t._v(" 메서드는 프로그램의 작동을 멈추고 "),s("code",[t._v("expect")]),t._v("에 인수로 넘겼던 메서지를 출력하도록 한다.")]),t._v(" "),t._m(35)]),t._v(" "),s("hr"),t._v(" "),t._m(36),t._v(" "),t._m(37),t._m(38),t._m(39),t._v(" "),t._m(40)])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_2-추리-게임"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-추리-게임"}},[this._v("#")]),this._v(" 2. 추리 게임")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"새로운-프로젝트-준비하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#새로운-프로젝트-준비하기"}},[this._v("#")]),this._v(" 새로운 프로젝트 준비하기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("cargo")]),this._v(" new guessing_game\n$ "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[this._v("cd")]),this._v(" guessing_game\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".52s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("새로운 프로젝트를 생성한다.")]),this._v(" "),t("li",[this._v("기존의 프로젝트를 생성하면서 자동적으로 "),t("code",[this._v("main.rs")]),this._v("라는 파일 생성되는데 기본적으로 작성되어 있는 코드를 빌드하고 실행한다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"추릿값을-처리하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#추릿값을-처리하기"}},[this._v("#")]),this._v(" 추릿값을 처리하기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Guess the number!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Please input your guess."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Failed to read line"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"You guessed: {guess}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("사용자 입력을 받고 결괏값을 표시하기 위해서는 "),t("code",[this._v("io")]),this._v(" 입출력 라이브러리를 스코프로 가져와야 한다.\n"),t("code",[this._v("io")]),this._v(" 라이브러리는 "),t("code",[this._v("std")]),this._v("라고 불리는 표준 라이브러리에 있다.")])},function(){var t=this._self._c;return t("li",[this._v("만약 원하는 타입이 프렐루드에 없다면 "),t("code",[this._v("use")]),this._v("문을 활용하여 명시적으로 사용할 타입을 가져와야 한다.\n"),t("code",[this._v("std::io")]),this._v("는 사용자의 입력을 받는 것을 포함하여 "),t("code",[this._v("io")]),this._v("와 관련된 기능들을 제공한다.")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"변수에-값-저장하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#변수에-값-저장하기"}},[this._v("#")]),this._v(" 변수에 값 저장하기")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("아래와 같이 사용자의 입력값을 저장할 **변수(variable)**를 생성한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("변수를 만들기 위해서는 "),t("code",[this._v("let")]),this._v("를 사용한다. 다음 코드도 변수를 선언하는 예시이다.")])])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[this._v("let")]),this._v(" apples "),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("=")]),this._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[this._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("위 변수("),t("code",[this._v("apples")]),this._v(")는 변수를 만들고 5라는 값을 묶어 넣습니다. 러스트에서 변수는 기본적으로 불변(immutable)이다. 이는 변수에 어떤 값을 집어넣으면 그 값이 안 바뀐다(상수).")]),this._v(" "),t("li",[this._v("변수의 값을 가변(mutable), 즉 변경 가능하도록 하려면 변수명 앞에 "),t("code",[this._v("mut")]),this._v("를 추가하면 된다(변수).")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" apples "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// immutable")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" bananas "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// mutable")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".22s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nGuess the number"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\nPlease input your guess.\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\nYou guessed: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[t("code",[this._v("let mut guess")]),this._v("가 "),t("code",[this._v("guess")]),this._v("라는 이름의 가변 변수(변수)임을 알 수 있다. 등호("),t("code",[this._v("=")]),this._v(")는 지금 해당 변수에 어떤 값을 묶어 넣고자 함을 뜻한다.")])},function(){var t=this._self._c;return t("li",[this._v("동호의 오른쪽에는 "),t("code",[this._v("guess")]),this._v("에 묶일 값이 있는데, 이번 예시에서는 함수 "),t("code",[this._v("String::new")]),this._v("의 결괏값인 새로운 "),t("code",[this._v("String")]),this._v(" 인스턴스가 묶일 대상이 된다.")])},function(){var t=this._self._c;return t("strong",[this._v("연관 함수란 어떤 타입에 구현된 함수고, 위의 경우에는 "),t("code",[this._v("String")]),this._v(" 타입에 만들어진 함수")])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("요악하자면 "),t("code",[this._v("let mut guess = String::new();")]),this._v(" 라인은 새로운 빈 "),t("code",[this._v("String")]),this._v(" 인스턴스를 묶어놓은 가변 변수(변수)를 생성한다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"사용자-입력받기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#사용자-입력받기"}},[this._v("#")]),this._v(" 사용자 입력받기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("프로그램 시작 지점에 "),t("code",[this._v("use std::io")]),this._v("를 통해 "),t("code",[this._v("io")]),this._v(" 라이브러리를 가져오지 않았더라도, 함수 호출 시 "),t("code",[this._v("std::io::stdin")]),this._v("처럼 작성하는 것으로 이 함수를 이용할 수 있다.")])},function(){var t=this,s=t._self._c;return s("li",[t._v("코드의 다음 부분인 "),s("code",[t._v(".read_line(&mut guess)")]),t._v("는 사용자로부터 입력받기 위해 표준 입력 핸들에서 "),s("code",[t._v("read_line")]),t._v(" 메서드를 호출한다. 여기에 "),s("code",[t._v("&mut guess")]),t._v("를 "),s("code",[t._v("read_line")]),t._v("의 인수로 전달하여 사용자 입력이 어떤 문자열에 저장될 것인지 알려준다.")])},function(){var t=this._self._c;return t("li",[t("code",[this._v("read_line")]),this._v("의 전체 기능을 사용자가 표준 입력 장치에 입력할 때마다 입력된 문자들을 받아서 문자열에 추가하는 것이므로 문자열을 인수로 넘겨준 것이다. 메서드가 문자열의 내용물을 바꿀 수 있기 때문에 이 문자열 인수는 가변이어야 한다.")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("code",[t._v("&")]),t._v("는 "),s("strong",[t._v("코드의 여러 부분에서 데이터를 여러 번 메모리로 복사하지 않고 접근하기 위한 방법을 제공하는")]),t._v(" "),s("em",[s("strong",[t._v("참고자(referenc)")])]),t._v(" "),s("strong",[t._v("임을 나타낸다.")]),t._v(" 참조는 복잡한 기능이고, 러스트의 큰 이점 중 하나가 바로 참조자를 사용할 때의 안정성과 편의성이다.")]),t._v(" "),s("li",[t._v("이 프로그램을 작성하기 위해 참조에 대한 자세한 내용을 알 필요는 없다. 지금 당장 참조자가 변수처럼 기본적으로 불변(상수)임을 알기만 하면 된다. 따라서 "),s("code",[t._v("&guess")]),t._v("가 아니라 "),s("code",[t._v("&mut guess")]),t._v("로 작성하여 가변(변수)으로 만들 필요가 있다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"result-타입으로-잠재적-실패-다루기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#result-타입으로-잠재적-실패-다루기"}},[this._v("#")]),this._v(" "),t("code",[this._v("Result")]),this._v(" 타입으로 잠재적 실패 다루기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("expect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[this._v('"Failed to read line"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("위 코드를 아래처럼 사용할 수도 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Failed to read line"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("하나의 긴 라인은 가독성이 떨어지므로 라인을 나누는 것이 좋다. "),t("code",[this._v(".method_name()")]),this._v(" 문법으로 어떤 메서드를 호출할 때는 줄 바꿈과 다른 공백문자로 긴 라인을 쪼개는 것이 보통 현명한 선택이다.")])},function(){var t=this._self._c;return t("li",[this._v("이전에 언급한 것처럼 "),t("code",[this._v("read_line")]),this._v("은 우리가 인수로 넘긴 문자열에 사용자가 입력한 것을 저장할 뿐만 아니라 하나의 "),t("code",[this._v("Result")]),this._v(" 값을 돌려준다.")])},function(){var t=this,s=t._self._c;return s("li",[s("strong",[s("code",[t._v("Result")]),t._v(" 타입의 목적은 에러 처리용 정보를 담아내기 위한 것이다.")]),s("br"),t._v(" "),s("code",[t._v("Result")]),t._v("의 배리언트는 "),s("code",[t._v("Ok")]),t._v("와 "),s("code",[t._v("Err")]),t._v("입니다.\n"),s("ul",[s("li",[s("code",[t._v("Ok")]),t._v("는 처리가 성공했음을 나타내며 내부에 성공적으로 생성된 결과를 가지고 있다.")]),t._v(" "),s("li",[s("code",[t._v("Err")]),t._v("는 처리가 실패했음을 나타내고 그 이유에 대한 정보를 가지고 있다.")])])])},function(){var t=this,s=t._self._c;return s("li",[t._v("만약 "),s("code",[t._v("read_line")]),t._v(" 메서드가 "),s("code",[t._v("Err")]),t._v("를 돌려줬다면 그 에러는 운영체제로부터 발생한 에러일 경우가 많다. 만약 "),s("code",[t._v("Result")]),t._v("가 "),s("code",[t._v("Ok")]),t._v(" 값이라면 "),s("code",[t._v("expect")]),t._v("는 "),s("code",[t._v("Ok")]),t._v("가 가지고 있는 결괏값을 돌려주어 사용할 수 있도록 한다. 위의 경우 결괏값은 사용자가 표준 입력으로 입력했던 바이트의 개수이다.")])},function(){var t=this._self._c;return t("ul",[t("li",[t("strong",[t("code",[this._v("expect")]),this._v("를 호출하지 않는다면 컴파일은 되지만 경고가 발생한다.")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" build\n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwarning: unused "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Result"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" that must be used\n --"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" src/main.rs:10:5\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" / io::stdin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" read_line"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("mut guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_____________________________^\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" note: this "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Result"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" may be an "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Err"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" variant, "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("which")]),t._v(" should be handled\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" note: "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#[warn(unused_must_use)]")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" on by default\nhelp: use "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("let")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" to ignore the resulting value\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("let")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" io::stdin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" +++++++\n\nwarning: "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bin "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"guessing_game"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" generated "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" warning\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".65s\n")])])])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("러스트는 "),s("code",[t._v("read_line")]),t._v("가 돌려주는 "),s("code",[t._v("Result")]),t._v(" 값을 사용하지 않았음을 경고하며 일어날 수 있는 에러를 처리하지 않았음을 알려준다.")]),t._v(" "),s("ul",[s("li",[t._v("이 경고를 없애는 옳바른 방법은 에러 처리용 코드를 작성하는 것이지만, 지금의 경우에는 문제가 발생했을 때 프로그램이 종료되는 것을 원하므로 "),s("code",[t._v("expect")]),t._v("를 사용할 수 있다.")])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"println-자리표시자를-이용한-값-출력하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#println-자리표시자를-이용한-값-출력하기"}},[this._v("#")]),this._v(" "),t("code",[this._v("println!")]),this._v(" 자리표시자를 이용한 값 출력하기")])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{223:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._m(3),t._m(4),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),s("ul",[t._m(8),t._v(" "),s("li",[t._v("기본적으로 러스트는 모든 프로그램의 스코프로 가져오는 표준 라이브러리에 정의된 아이템 집합을 가지고 있다. 이 집하을 프렐루드(prelude)라고 부른다. 이와 관련된 내용은 "),s("a",{attrs:{href:"https://doc.rust-lang.org/reference/names/preludes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("표준 라이브러리 문서"),s("OutboundLink")],1),t._v("를 참고하자.")]),t._v(" "),t._m(9)]),t._v(" "),s("hr"),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._m(13),t._v(" "),t._m(14),t._m(15),t._v(" "),t._m(16),t._m(17),s("ul",[t._m(18),t._v(" "),t._m(19),t._v(" "),s("li",[s("a",{attrs:{href:"https://doc.rust-lang.org/std/string/struct.String.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("String")]),s("OutboundLink")],1),t._v("은 표준 라이브러리에서 제공하는 확장 가능한(growable) UTF-8 인코딩의 문자열 타입이다.")]),t._v(" "),s("li",[s("code",[t._v("::new")]),t._v("에 있는 "),s("code",[t._v("::")]),t._v("는 "),s("code",[t._v("new")]),t._v("가 "),s("code",[t._v("String")]),t._v(" 타입의 연관 함수(associated function)임을 나타낸다. "),t._m(20),t._v("이다. 이 "),s("code",[t._v("new")]),t._v(" 함수는 비어있는 새 문자열을 생성한다. "),s("code",[t._v("new")]),t._v("는 어떤 새로운 값을 만드는 함수 이름으로 흔히 사용되는 이름이기 때문에, 여러 타입에서 "),s("code",[t._v("new")]),t._v(" 함수를 찾아볼 수 있다.\n"),s("ul",[s("li",[t._v("연관 함수(associated function)와 관련된 자료이며, "),s("a",{attrs:{href:"https://yongj.in/rust/rust-methods/",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Rust] 메서드와 연관함수"),s("OutboundLink")],1),t._v(", "),s("a",{attrs:{href:"https://hyunmin1906.tistory.com/311",target:"_blank",rel:"noopener noreferrer"}},[t._v("[Rust/러스트] 구조체의 메소드, 연관함수"),s("OutboundLink")],1),t._v("를 참고하면 된다.")])])]),t._v(" "),t._m(21)]),t._v(" "),t._m(22),t._v(" "),t._m(23),s("ul",[t._m(24),t._v(" "),s("li",[s("code",[t._v("stdin")]),t._v(" 함수는 터미널의 표준 입력의 핸들(handle)을 나타내는 타입인 "),s("a",{attrs:{href:"https://doc.rust-lang.org/std/io/fn.stdin.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("std::io::Stdin")]),s("OutboundLink")],1),t._v("의 인스턴스를 돌려준다.")]),t._v(" "),t._m(25),t._v(" "),t._m(26)]),t._v(" "),s("hr"),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._m(30),t._v(" "),t._m(31),s("ul",[t._m(32),t._v(" "),t._m(33),t._v(" "),s("li",[s("a",{attrs:{href:"https://doc.rust-lang.org/std/result/enum.Result.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Result")]),s("OutboundLink")],1),t._v("는 "),s("em",[t._v("enum")]),t._v("이라고도 일컫는 "),s("a",{attrs:{href:"https://rinthel.github.io/rust-lang-book-ko/ch06-00-enums.html",target:"_blank",rel:"noopener noreferrer"}},[s("em",[t._v("열거형(enumeration)")]),s("OutboundLink")],1),t._v("인데, 여러 개의 가능한 상태 중에 하나의 값이 될 수 있는 타입이다. 이러한 기능한 상태 값을 *배리언트(vaiant)*라고 부른다.")])]),t._v(" "),s("hr"),t._v(" "),s("ul",[t._m(34),t._v(" "),s("li",[t._v("다른 타입들처럼 "),s("code",[t._v("Result")]),t._v(" 타입의 값에도 메서드가 있습니다. "),s("code",[t._v("Result")]),t._v(" 인스턴스에는 "),s("a",{attrs:{href:"https://doc.rust-lang.org/std/result/enum.Result.html#method.expect",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("expect")]),t._v(" 메서드"),s("OutboundLink")],1),t._v("가 있습니다. 만약 "),s("code",[t._v("Result")]),t._v(" 인스턴스가 "),s("code",[t._v("Err")]),t._v("일 경우 "),s("code",[t._v("expect")]),t._v(" 메서드는 프로그램의 작동을 멈추고 "),s("code",[t._v("expect")]),t._v("에 인수로 넘겼던 메서지를 출력하도록 한다.")]),t._v(" "),t._m(35)]),t._v(" "),s("hr"),t._v(" "),t._m(36),t._v(" "),t._m(37),t._m(38),t._m(39),t._v(" "),t._m(40)])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_2-추리-게임"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-추리-게임"}},[this._v("#")]),this._v(" 2. 추리 게임")])},function(){var t=this._self._c;return t("h2",{attrs:{id:"새로운-프로젝트-준비하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#새로운-프로젝트-준비하기"}},[this._v("#")]),this._v(" 새로운 프로젝트 준비하기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[this._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("cargo")]),this._v(" new guessing_game\n$ "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[this._v("cd")]),this._v(" guessing_game\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".52s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("새로운 프로젝트를 생성한다.")]),this._v(" "),t("li",[this._v("기존의 프로젝트를 생성하면서 자동적으로 "),t("code",[this._v("main.rs")]),this._v("라는 파일 생성되는데 기본적으로 작성되어 있는 코드를 빌드하고 실행한다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"추릿값을-처리하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#추릿값을-처리하기"}},[this._v("#")]),this._v(" 추릿값을 처리하기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Guess the number!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Please input your guess."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Failed to read line"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"You guessed: {guess}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("사용자 입력을 받고 결괏값을 표시하기 위해서는 "),t("code",[this._v("io")]),this._v(" 입출력 라이브러리를 스코프로 가져와야 한다.\n"),t("code",[this._v("io")]),this._v(" 라이브러리는 "),t("code",[this._v("std")]),this._v("라고 불리는 표준 라이브러리에 있다.")])},function(){var t=this._self._c;return t("li",[this._v("만약 원하는 타입이 프렐루드에 없다면 "),t("code",[this._v("use")]),this._v("문을 활용하여 명시적으로 사용할 타입을 가져와야 한다.\n"),t("code",[this._v("std::io")]),this._v("는 사용자의 입력을 받는 것을 포함하여 "),t("code",[this._v("io")]),this._v("와 관련된 기능들을 제공한다.")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"변수에-값-저장하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#변수에-값-저장하기"}},[this._v("#")]),this._v(" 변수에 값 저장하기")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("아래와 같이 사용자의 입력값을 저장할 **변수(variable)**를 생성한다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("변수를 만들기 위해서는 "),t("code",[this._v("let")]),this._v("를 사용한다. 다음 코드도 변수를 선언하는 예시이다.")])])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[this._v("let")]),this._v(" apples "),t("span",{pre:!0,attrs:{class:"token operator"}},[this._v("=")]),this._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[this._v("5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("위 변수("),t("code",[this._v("apples")]),this._v(")는 변수를 만들고 5라는 값을 묶어 넣습니다. 러스트에서 변수는 기본적으로 불변(immutable)이다. 이는 변수에 어떤 값을 집어넣으면 그 값이 안 바뀐다(상수).")]),this._v(" "),t("li",[this._v("변수의 값을 가변(mutable), 즉 변경 가능하도록 하려면 변수명 앞에 "),t("code",[this._v("mut")]),this._v("를 추가하면 된다(변수).")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" apples "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// immutable")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" bananas "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// mutable")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run \n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".22s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nGuess the number"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\nPlease input your guess.\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\nYou guessed: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[t("code",[this._v("let mut guess")]),this._v("가 "),t("code",[this._v("guess")]),this._v("라는 이름의 가변 변수(변수)임을 알 수 있다. 등호("),t("code",[this._v("=")]),this._v(")는 지금 해당 변수에 어떤 값을 묶어 넣고자 함을 뜻한다.")])},function(){var t=this._self._c;return t("li",[this._v("동호의 오른쪽에는 "),t("code",[this._v("guess")]),this._v("에 묶일 값이 있는데, 이번 예시에서는 함수 "),t("code",[this._v("String::new")]),this._v("의 결괏값인 새로운 "),t("code",[this._v("String")]),this._v(" 인스턴스가 묶일 대상이 된다.")])},function(){var t=this._self._c;return t("strong",[this._v("연관 함수란 어떤 타입에 구현된 함수고, 위의 경우에는 "),t("code",[this._v("String")]),this._v(" 타입에 만들어진 함수")])},function(){var t=this._self._c;return t("li",[t("strong",[this._v("요악하자면 "),t("code",[this._v("let mut guess = String::new();")]),this._v(" 라인은 새로운 빈 "),t("code",[this._v("String")]),this._v(" 인스턴스를 묶어놓은 가변 변수(변수)를 생성한다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"사용자-입력받기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#사용자-입력받기"}},[this._v("#")]),this._v(" 사용자 입력받기")])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("프로그램 시작 지점에 "),t("code",[this._v("use std::io")]),this._v("를 통해 "),t("code",[this._v("io")]),this._v(" 라이브러리를 가져오지 않았더라도, 함수 호출 시 "),t("code",[this._v("std::io::stdin")]),this._v("처럼 작성하는 것으로 이 함수를 이용할 수 있다.")])},function(){var t=this,s=t._self._c;return s("li",[t._v("코드의 다음 부분인 "),s("code",[t._v(".read_line(&mut guess)")]),t._v("는 사용자로부터 입력받기 위해 표준 입력 핸들에서 "),s("code",[t._v("read_line")]),t._v(" 메서드를 호출한다. 여기에 "),s("code",[t._v("&mut guess")]),t._v("를 "),s("code",[t._v("read_line")]),t._v("의 인수로 전달하여 사용자 입력이 어떤 문자열에 저장될 것인지 알려준다.")])},function(){var t=this._self._c;return t("li",[t("code",[this._v("read_line")]),this._v("의 전체 기능을 사용자가 표준 입력 장치에 입력할 때마다 입력된 문자들을 받아서 문자열에 추가하는 것이므로 문자열을 인수로 넘겨준 것이다. 메서드가 문자열의 내용물을 바꿀 수 있기 때문에 이 문자열 인수는 가변이어야 한다.")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("code",[t._v("&")]),t._v("는 "),s("strong",[t._v("코드의 여러 부분에서 데이터를 여러 번 메모리로 복사하지 않고 접근하기 위한 방법을 제공하는")]),t._v(" "),s("em",[s("strong",[t._v("참고자(referenc)")])]),t._v(" "),s("strong",[t._v("임을 나타낸다.")]),t._v(" 참조는 복잡한 기능이고, 러스트의 큰 이점 중 하나가 바로 참조자를 사용할 때의 안정성과 편의성이다.")]),t._v(" "),s("li",[t._v("이 프로그램을 작성하기 위해 참조에 대한 자세한 내용을 알 필요는 없다. 지금 당장 참조자가 변수처럼 기본적으로 불변(상수)임을 알기만 하면 된다. 따라서 "),s("code",[t._v("&guess")]),t._v("가 아니라 "),s("code",[t._v("&mut guess")]),t._v("로 작성하여 가변(변수)으로 만들 필요가 있다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"result-타입으로-잠재적-실패-다루기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#result-타입으로-잠재적-실패-다루기"}},[this._v("#")]),this._v(" "),t("code",[this._v("Result")]),this._v(" 타입으로 잠재적 실패 다루기")])},function(){var t=this._self._c;return t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[this._v("expect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[this._v('"Failed to read line"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("위 코드를 아래처럼 사용할 수도 있다.")])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Failed to read line"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this._self._c;return t("li",[this._v("하나의 긴 라인은 가독성이 떨어지므로 라인을 나누는 것이 좋다. "),t("code",[this._v(".method_name()")]),this._v(" 문법으로 어떤 메서드를 호출할 때는 줄 바꿈과 다른 공백문자로 긴 라인을 쪼개는 것이 보통 현명한 선택이다.")])},function(){var t=this._self._c;return t("li",[this._v("이전에 언급한 것처럼 "),t("code",[this._v("read_line")]),this._v("은 우리가 인수로 넘긴 문자열에 사용자가 입력한 것을 저장할 뿐만 아니라 하나의 "),t("code",[this._v("Result")]),this._v(" 값을 돌려준다.")])},function(){var t=this,s=t._self._c;return s("li",[s("strong",[s("code",[t._v("Result")]),t._v(" 타입의 목적은 에러 처리용 정보를 담아내기 위한 것이다.")]),s("br"),t._v(" "),s("code",[t._v("Result")]),t._v("의 배리언트는 "),s("code",[t._v("Ok")]),t._v("와 "),s("code",[t._v("Err")]),t._v("입니다.\n"),s("ul",[s("li",[s("code",[t._v("Ok")]),t._v("는 처리가 성공했음을 나타내며 내부에 성공적으로 생성된 결과를 가지고 있다.")]),t._v(" "),s("li",[s("code",[t._v("Err")]),t._v("는 처리가 실패했음을 나타내고 그 이유에 대한 정보를 가지고 있다.")])])])},function(){var t=this,s=t._self._c;return s("li",[t._v("만약 "),s("code",[t._v("read_line")]),t._v(" 메서드가 "),s("code",[t._v("Err")]),t._v("를 돌려줬다면 그 에러는 운영체제로부터 발생한 에러일 경우가 많다. 만약 "),s("code",[t._v("Result")]),t._v("가 "),s("code",[t._v("Ok")]),t._v(" 값이라면 "),s("code",[t._v("expect")]),t._v("는 "),s("code",[t._v("Ok")]),t._v("가 가지고 있는 결괏값을 돌려주어 사용할 수 있도록 한다. 위의 경우 결괏값은 사용자가 표준 입력으로 입력했던 바이트의 개수이다.")])},function(){var t=this._self._c;return t("ul",[t("li",[t("strong",[t("code",[this._v("expect")]),this._v("를 호출하지 않는다면 컴파일은 되지만 경고가 발생한다.")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stdin")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read_line")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" build\n Compiling guessing_game v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch02/guessing_game"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwarning: unused "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Result"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" that must be used\n --"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" src/main.rs:10:5\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" / io::stdin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" read_line"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("mut guess"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_____________________________^\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" note: this "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Result"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" may be an "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("Err"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" variant, "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("which")]),t._v(" should be handled\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" note: "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#[warn(unused_must_use)]")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" on by default\nhelp: use "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("let")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("."),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" to ignore the resulting value\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("let")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" io::stdin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" +++++++\n\nwarning: "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("guessing_game"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bin "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"guessing_game"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" generated "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" warning\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".65s\n")])])])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("러스트는 "),s("code",[t._v("read_line")]),t._v("가 돌려주는 "),s("code",[t._v("Result")]),t._v(" 값을 사용하지 않았음을 경고하며 일어날 수 있는 에러를 처리하지 않았음을 알려준다.")]),t._v(" "),s("ul",[s("li",[t._v("이 경고를 없애는 옳바른 방법은 에러 처리용 코드를 작성하는 것이지만, 지금의 경우에는 문제가 발생했을 때 프로그램이 종료되는 것을 원하므로 "),s("code",[t._v("expect")]),t._v("를 사용할 수 있다.")])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"println-자리표시자를-이용한-값-출력하기"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#println-자리표시자를-이용한-값-출력하기"}},[this._v("#")]),this._v(" "),t("code",[this._v("println!")]),this._v(" 자리표시자를 이용한 값 출력하기")])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/46.643cff8e.js b/assets/js/48.2b2710ba.js similarity index 98% rename from assets/js/46.643cff8e.js rename to assets/js/48.2b2710ba.js index 1828f4b9..7e383ca9 100644 --- a/assets/js/46.643cff8e.js +++ b/assets/js/48.2b2710ba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{222:function(s,a,t){"use strict";t.r(a);var n=t(0),r=Object(n.a)({},(function(){this._self._c;return this._m(0)}),[function(){var s=this,a=s._self._c;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"_3-일반적인-프로그래밍-개념"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-일반적인-프로그래밍-개념"}},[s._v("#")]),s._v(" 3. 일반적인 프로그래밍 개념")]),s._v(" "),a("ul",[a("li",[s._v("변수, 기본 타입, 함수, 주석, 그리고 제어 흐름에 대해서 배울 예정이다. 이러한 기초는 모든 러스트 프로그램에 사용될 것이며, 이를 일찍 배우면 강력한 기반을 바탕으로 시작할 수 있게 할 것이다.")])]),s._v(" "),a("h2",{attrs:{id:"변수와-가변성"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#변수와-가변성"}},[s._v("#")]),s._v(" 변수와 가변성")]),s._v(" "),a("ul",[a("li",[a("p",[s._v("변수는 기본적으로 불변(immutable)이다. 러스트가 제공하는 안정성과 쉬운 동시성을 활용하는 방식으로 코드를 작성할 수 있도록 하는 넛지(nudge, 슬며시 선택을 유도하기) 중 하나이다. 변수를 가변(mutable)으로 만들 수 있다. 어떻게 하는지 살펴보고 왜 러스트가 불변성을 권하는지와 어떨 때 가변성을 써야 하는지 알아보자.")])]),s._v(" "),a("li",[a("p",[s._v("변수가 불변일 때, 어떤 이름에 한번 값이 묶이면 그 값은 바꿀 수 다. 이를 표현하기 위해, "),a("code",[s._v("cargo new variables")]),s._v("로 "),a("em",[s._v("projects")]),s._v(" 디렉토리 안에 "),a("code",[s._v("variables")]),s._v("라는 프로젝트를 만들어 보자.")])])]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fn")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("let")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("$ "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cargo")]),s._v(" run \n Compiling variables v0.1.0 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch03/variables"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nerror"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("E0384"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(": cannot assign twice to immutable variable "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n --"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" src/main.rs:4:5\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("let")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" -\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" first assignment to "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" help: consider making this binding mutable: "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("mut x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" println"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" ^^^^^ cannot assign twice to immutable variable\n\nFor "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("more")]),s._v(" information about this error, try "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("rustc "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--explain")]),s._v(" E0384"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\nerror: could not compile "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("variables"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bin "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"variables"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" due to previous error\n")])])]),a("ul",[a("li",[s._v("위 코드를 실행하는 경우, 불변성 에러에 관한 에러 메시지를 받게 됩니다.")]),s._v(" "),a("li",[a("code",[s._v("불변 변수")]),s._v("x"),a("code",[s._v("에 두번 값을 할당할 수 없다")]),s._v("라는 내용의 에러 메시지를 받았다. "),a("code",[s._v("불변 변수 x")]),s._v("에 두 번째 값을 할당하려고 했기 때문이다.")]),s._v(" "),a("li",[s._v("불변으로 지정한 값을 변경하려고 하는 바로 이 상황이 버그로 이어질 수 있기 때문에, 컴파일 타임 에러가 발생하는 것은 중요하다. 만약 코드의 한 부분이 변숫값은 변하지 않는다는 전제 하에 작동하고 코드의 다른 부분이 그 값을 바꾼다면, 앞부분의 코드는 원래 지정된 일을 못할 가능성이 생긴다.")]),s._v(" "),a("li",[s._v("이런 류의 버그는 발생 후 추적하는 것이 어렵다. 특히 코드의 두 번재 부분이 값을 가끔씩만 변경하는 경우가 그렇다. 러스트 컴파일러는 값이 바뀌지 않을 것이라고 여러분이 지정하면 실제로 그렇도록 보증한다. 코드를 읽고 쓸 때 값이 어디서 어떻게 바뀔지 추적할 필요가 없다는 것이다. 따라서 여러분의 코드는 흐름을 따라가기 쉬워진다.")]),s._v(" "),a("li",[s._v("가변성은 아주 유용할 수 있고, 코드 작성을 더 편하게 해 준다. 변수는 기본적으로 불변이더라도, 앞써서 했던 것처럼 변수명 앞에 "),a("code",[s._v("mut")]),s._v("을 붙여서 가변으로 만들 수 있다.\n"),a("code",[s._v("mut")]),s._v("를 추가하는 것은 또한 미래에 코드를 읽는 이들에게 코드의 다른 부분에 이 변수의 값이 변하는 것이라는 의도를 전달한다.")])]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fn")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("let")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("mut")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("$ "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cargo")]),s._v(" run\n Compiling variables v0.1.0 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch03/variables"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n Finished dev "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("unoptimized + debuginfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" target"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(".55s\n Running "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("target/debug/variables"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\nThe value of x is: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\nThe value of x is: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n")])])]),a("p",[a("code",[s._v("mut")]),s._v("를 사용해 "),a("code",[s._v("x")]),s._v("의 값을 "),a("code",[s._v("5")]),s._v("에서 "),a("code",[s._v("6")]),s._v("으로 바꿀 수 있다. 가변성을 사용할지 말지는 코드를 작성하는 사람의 몫이고, 특정 상황에서 가장 명확하다고 생각하는 것이 어떤 것인지에 따라서 달라진다.")]),s._v(" "),a("h3",{attrs:{id:"상수"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#상수"}},[s._v("#")]),s._v(" 상수")]),s._v(" "),a("ul",[a("li",[s._v("상수(constant)는 불변 변수와 비슷하다. 어떤 이름에 묶여 있는 값이고 값을 바꾸는 것이 허용되지 않지만, 변수와는 약간 다른 점이 있다.\n"),a("ul",[a("li",[s._v("상수는 "),a("code",[s._v("mut")]),s._v("와 함께 사용할 수 없다. 상수는 기본적으로 불변인 것이 아니고, 항상 불변이다. "),a("strong",[s._v("상수는 "),a("code",[s._v("let")]),s._v(" 키워드 대신 "),a("code",[s._v("const")]),s._v(" 키워드로 선언하며, 값의 타입은 반드시 명시 되어야 한다.")])])])]),s._v(" "),a("li",[a("strong",[s._v("상수는 전역 스코프를 포함한 어떤 스코프에서도 선언 가능하므로 코드의 많은 부분에서 알 필요가 있는 값에 유용하다.")])]),s._v(" "),a("li",[a("strong",[s._v("상수는 반드시 상수 표현식으로만 설정될 수 하고 런타임에서만 계산될 수 있는 결괏값으로 안 된다.")])])]),s._v(" "),a("p",[s._v("상수 선언의 예제:")]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("THREE_HOURS_IN_SECONDS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("u32")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])]),a("ul",[a("li",[s._v("상수의 이름은 "),a("code",[s._v("THREE_HOURES_IN_SECONDS")]),s._v("이고, 값은 60(분당 초의 개수), 60(시간당 분의 개수), 3(이 프로그램에서 알아둘 필요가 있는 시간의 숫자)를 모두 곱한 값이다.\n"),a("ul",[a("li",[a("strong",[s._v("러스트의 이름 짓기 관례에서 상수느 단어 사이에 밑줄을 사용하고 모든 글자를 대문자로 쓰는 것이다.")])]),s._v(" "),a("li",[s._v("컴파일너는 컴파일 타임에 제한된 연산을 수행할 수 있는데, 이런 상숫값을 10,800으로 쓰는 대신 이해하고 검사하기 더 쉽게 작성할 방법을 제공한다.")])])]),s._v(" "),a("li",[s._v("상수는 선언된 스코프 내에서 프로그램이 동작하는 전체 시간 동아 유효합니다. 이러한 특성은, 플레이어가 얻을 수 있는 점수의 최곲이라던가 빛의 속도 같이, 프로그램의 여러 부분에서 알 필요가 있는 값들에 유용하다.")]),s._v(" "),a("li",[s._v("전체 프로그램에 하드코딩된 값에 상수로써 이름을 붙이는 것은 미래의 코드 관리자에게 그 값의 의미를 전달하는데 유용하다. 나중에 업데이트될 하드코딩된 값을 단 한 군데에서 변경할 수 있게 해 준다.")])]),s._v(" "),a("h3",{attrs:{id:"섀도잉"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#섀도잉"}},[s._v("#")]),s._v(" 섀도잉")]),s._v(" "),a("ul",[a("li",[s._v("새 변수를 이전 변수명과 같은 이름으로 선언할 수 있다. 러스타시안들은 첫 번째 변수가 두 번째 변수에 의해 가려졌다(shadowed)라고 표현하며, 이는 해당 변수의 이름을 사용할 때 컴파일러가 두 번째 변수를 보게 될 것이라는 의미이다.")])])])}],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{224:function(s,a,t){"use strict";t.r(a);var n=t(0),r=Object(n.a)({},(function(){this._self._c;return this._m(0)}),[function(){var s=this,a=s._self._c;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"_3-일반적인-프로그래밍-개념"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-일반적인-프로그래밍-개념"}},[s._v("#")]),s._v(" 3. 일반적인 프로그래밍 개념")]),s._v(" "),a("ul",[a("li",[s._v("변수, 기본 타입, 함수, 주석, 그리고 제어 흐름에 대해서 배울 예정이다. 이러한 기초는 모든 러스트 프로그램에 사용될 것이며, 이를 일찍 배우면 강력한 기반을 바탕으로 시작할 수 있게 할 것이다.")])]),s._v(" "),a("h2",{attrs:{id:"변수와-가변성"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#변수와-가변성"}},[s._v("#")]),s._v(" 변수와 가변성")]),s._v(" "),a("ul",[a("li",[a("p",[s._v("변수는 기본적으로 불변(immutable)이다. 러스트가 제공하는 안정성과 쉬운 동시성을 활용하는 방식으로 코드를 작성할 수 있도록 하는 넛지(nudge, 슬며시 선택을 유도하기) 중 하나이다. 변수를 가변(mutable)으로 만들 수 있다. 어떻게 하는지 살펴보고 왜 러스트가 불변성을 권하는지와 어떨 때 가변성을 써야 하는지 알아보자.")])]),s._v(" "),a("li",[a("p",[s._v("변수가 불변일 때, 어떤 이름에 한번 값이 묶이면 그 값은 바꿀 수 다. 이를 표현하기 위해, "),a("code",[s._v("cargo new variables")]),s._v("로 "),a("em",[s._v("projects")]),s._v(" 디렉토리 안에 "),a("code",[s._v("variables")]),s._v("라는 프로젝트를 만들어 보자.")])])]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fn")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("let")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("$ "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cargo")]),s._v(" run \n Compiling variables v0.1.0 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch03/variables"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nerror"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("E0384"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(": cannot assign twice to immutable variable "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n --"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" src/main.rs:4:5\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("let")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" -\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" first assignment to "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" help: consider making this binding mutable: "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("mut x"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" println"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" ^^^^^ cannot assign twice to immutable variable\n\nFor "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("more")]),s._v(" information about this error, try "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("rustc "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--explain")]),s._v(" E0384"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\nerror: could not compile "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("variables"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bin "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"variables"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" due to previous error\n")])])]),a("ul",[a("li",[s._v("위 코드를 실행하는 경우, 불변성 에러에 관한 에러 메시지를 받게 됩니다.")]),s._v(" "),a("li",[a("code",[s._v("불변 변수")]),s._v("x"),a("code",[s._v("에 두번 값을 할당할 수 없다")]),s._v("라는 내용의 에러 메시지를 받았다. "),a("code",[s._v("불변 변수 x")]),s._v("에 두 번째 값을 할당하려고 했기 때문이다.")]),s._v(" "),a("li",[s._v("불변으로 지정한 값을 변경하려고 하는 바로 이 상황이 버그로 이어질 수 있기 때문에, 컴파일 타임 에러가 발생하는 것은 중요하다. 만약 코드의 한 부분이 변숫값은 변하지 않는다는 전제 하에 작동하고 코드의 다른 부분이 그 값을 바꾼다면, 앞부분의 코드는 원래 지정된 일을 못할 가능성이 생긴다.")]),s._v(" "),a("li",[s._v("이런 류의 버그는 발생 후 추적하는 것이 어렵다. 특히 코드의 두 번재 부분이 값을 가끔씩만 변경하는 경우가 그렇다. 러스트 컴파일러는 값이 바뀌지 않을 것이라고 여러분이 지정하면 실제로 그렇도록 보증한다. 코드를 읽고 쓸 때 값이 어디서 어떻게 바뀔지 추적할 필요가 없다는 것이다. 따라서 여러분의 코드는 흐름을 따라가기 쉬워진다.")]),s._v(" "),a("li",[s._v("가변성은 아주 유용할 수 있고, 코드 작성을 더 편하게 해 준다. 변수는 기본적으로 불변이더라도, 앞써서 했던 것처럼 변수명 앞에 "),a("code",[s._v("mut")]),s._v("을 붙여서 가변으로 만들 수 있다.\n"),a("code",[s._v("mut")]),s._v("를 추가하는 것은 또한 미래에 코드를 읽는 이들에게 코드의 다른 부분에 이 변수의 값이 변하는 것이라는 의도를 전달한다.")])]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fn")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("let")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("mut")]),s._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token macro property"}},[s._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"The value of x is: {x}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[s._v("$ "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cargo")]),s._v(" run\n Compiling variables v0.1.0 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("/Users/park.hyunsang/dev/github/The_Rust_Programming_Language/ch03/variables"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n Finished dev "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("unoptimized + debuginfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" target"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(".55s\n Running "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("target/debug/variables"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\nThe value of x is: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\nThe value of x is: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n")])])]),a("p",[a("code",[s._v("mut")]),s._v("를 사용해 "),a("code",[s._v("x")]),s._v("의 값을 "),a("code",[s._v("5")]),s._v("에서 "),a("code",[s._v("6")]),s._v("으로 바꿀 수 있다. 가변성을 사용할지 말지는 코드를 작성하는 사람의 몫이고, 특정 상황에서 가장 명확하다고 생각하는 것이 어떤 것인지에 따라서 달라진다.")]),s._v(" "),a("h3",{attrs:{id:"상수"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#상수"}},[s._v("#")]),s._v(" 상수")]),s._v(" "),a("ul",[a("li",[s._v("상수(constant)는 불변 변수와 비슷하다. 어떤 이름에 묶여 있는 값이고 값을 바꾸는 것이 허용되지 않지만, 변수와는 약간 다른 점이 있다.\n"),a("ul",[a("li",[s._v("상수는 "),a("code",[s._v("mut")]),s._v("와 함께 사용할 수 없다. 상수는 기본적으로 불변인 것이 아니고, 항상 불변이다. "),a("strong",[s._v("상수는 "),a("code",[s._v("let")]),s._v(" 키워드 대신 "),a("code",[s._v("const")]),s._v(" 키워드로 선언하며, 값의 타입은 반드시 명시 되어야 한다.")])])])]),s._v(" "),a("li",[a("strong",[s._v("상수는 전역 스코프를 포함한 어떤 스코프에서도 선언 가능하므로 코드의 많은 부분에서 알 필요가 있는 값에 유용하다.")])]),s._v(" "),a("li",[a("strong",[s._v("상수는 반드시 상수 표현식으로만 설정될 수 하고 런타임에서만 계산될 수 있는 결괏값으로 안 된다.")])])]),s._v(" "),a("p",[s._v("상수 선언의 예제:")]),s._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("THREE_HOURS_IN_SECONDS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("u32")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])]),a("ul",[a("li",[s._v("상수의 이름은 "),a("code",[s._v("THREE_HOURES_IN_SECONDS")]),s._v("이고, 값은 60(분당 초의 개수), 60(시간당 분의 개수), 3(이 프로그램에서 알아둘 필요가 있는 시간의 숫자)를 모두 곱한 값이다.\n"),a("ul",[a("li",[a("strong",[s._v("러스트의 이름 짓기 관례에서 상수느 단어 사이에 밑줄을 사용하고 모든 글자를 대문자로 쓰는 것이다.")])]),s._v(" "),a("li",[s._v("컴파일너는 컴파일 타임에 제한된 연산을 수행할 수 있는데, 이런 상숫값을 10,800으로 쓰는 대신 이해하고 검사하기 더 쉽게 작성할 방법을 제공한다.")])])]),s._v(" "),a("li",[s._v("상수는 선언된 스코프 내에서 프로그램이 동작하는 전체 시간 동아 유효합니다. 이러한 특성은, 플레이어가 얻을 수 있는 점수의 최곲이라던가 빛의 속도 같이, 프로그램의 여러 부분에서 알 필요가 있는 값들에 유용하다.")]),s._v(" "),a("li",[s._v("전체 프로그램에 하드코딩된 값에 상수로써 이름을 붙이는 것은 미래의 코드 관리자에게 그 값의 의미를 전달하는데 유용하다. 나중에 업데이트될 하드코딩된 값을 단 한 군데에서 변경할 수 있게 해 준다.")])]),s._v(" "),a("h3",{attrs:{id:"섀도잉"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#섀도잉"}},[s._v("#")]),s._v(" 섀도잉")]),s._v(" "),a("ul",[a("li",[s._v("새 변수를 이전 변수명과 같은 이름으로 선언할 수 있다. 러스타시안들은 첫 번째 변수가 두 번째 변수에 의해 가려졌다(shadowed)라고 표현하며, 이는 해당 변수의 이름을 사용할 때 컴파일러가 두 번째 변수를 보게될 것이라는 의미이다.")])])])}],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/48.c74abcf7.js b/assets/js/48.c74abcf7.js deleted file mode 100644 index adb4bca6..00000000 --- a/assets/js/48.c74abcf7.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{177:function(n,w,o){}}]); \ No newline at end of file diff --git a/assets/js/47.7f80bd63.js b/assets/js/49.fbd37d06.js similarity index 99% rename from assets/js/47.7f80bd63.js rename to assets/js/49.fbd37d06.js index 5c15a198..7fa2cff6 100644 --- a/assets/js/47.7f80bd63.js +++ b/assets/js/49.fbd37d06.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{223:function(t,s,r){"use strict";r.r(s);var _=r(0),e=Object(_.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v('HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부 기능은 메서드 집합 간에 서로 공유하기도 합니다. 이를테면 응답 메서드는 안전하거나, 캐시 가능하거나, 멱등성을 가질 수 있습니다.')]),t._v(" - "),s("a",{attrs:{href:"https://developer.mozilla.org/ko/docs/Web/HTTP/Methods",target:"_blank",rel:"noopener noreferrer"}},[s("em",[t._v("Mozilla 공식 문서 - HTTP 요청 메서드")]),s("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),s("p",[t._v("각 HTTP 메서드마다 용도와 특징이 다름. 메서드 속성은 이렇한 특징을 알 수 있는 지표임.")]),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://amkorousagi-money.tistory.com/entry/HTTP-method-%EC%A0%95%EB%A6%AC",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP method 정리"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://medium.com/@lyhlg0201/http-method-d561b77df7",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP Method"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://rachel0115.tistory.com/entry/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A0%95%EB%A6%AC-GET-POST-PUT-PATCH-DELETE",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP 메서드 정리 (GET, POST, PUT, PATCH, DELETE ...)"),s("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230821-http-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230821-http-method"}},[this._v("#")]),this._v(" 20230821 - HTTP Method")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("웹 프로그래밍을 차분하게 다시 살펴보고자 한다.")]),this._v(" "),t("li",[this._v("본 글에서는 웹에서 사용하는 메소드(Methods)를 사용하고자 한다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#method"}},[this._v("#")]),this._v(" Method")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"get"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get"}},[this._v("#")]),this._v(" GET")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("서버에서 Resource를 보내도록 요청하는데 사용한다.\n"),t("ul",[t("li",[t("strong",[this._v("서버의 Resource를 읽음.")])])])]),this._v(" "),t("li",[this._v("특정 리소스의 표시를 요청, 데이터의 수정 없이 데이터를 받기만 한다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"head"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#head"}},[this._v("#")]),this._v(" HEAD")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("GET과 동일한 응답이지만, 응답에 "),t("code",[this._v("body")]),this._v("가 포함되지 않음.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"post"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#post"}},[this._v("#")]),this._v(" POST")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("특정 리소스를 제출할 때 쓰임. 서버의 상태 변화나 부작용을 일으킬 수도 있음.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"put"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#put"}},[this._v("#")]),this._v(" PUT")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("목적 리소스의 모든 현재 표시를 요청하는 값으로 변경함.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"delete"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete"}},[this._v("#")]),this._v(" DELETE")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("특정한 리소스를 삭제함.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"patch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#patch"}},[this._v("#")]),this._v(" PATCH")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("리소스의 특정 부분만 수정함.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"http-메서드-속성"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#http-메서드-속성"}},[this._v("#")]),this._v(" HTTP 메서드 속성")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("안전(Safe Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("멱등(Idempotent Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("캐시 가능(Cacheable Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("요청에 본문("),s("code",[t._v("Body")]),t._v(") 존재")])]),t._v(" "),s("li",[s("strong",[t._v("성공 응답에 본문("),s("code",[t._v("Body")]),t._v(") 존재")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"안전-safe"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#안전-safe"}},[this._v("#")]),this._v(" 안전(Safe)")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("안전(Safe)는 호출해도 리소스를 변경하지 않는 메서드 속성.\n"),t("ul",[t("li",[t("strong",[this._v("데이터의 변경이 일어나지 않는다는 뜻.")])])])]),this._v(" "),t("li",[t("strong",[this._v("GET 메서드는 단순히 데이터를 가져올 때 사용하는데, 이러한 GET 같은 메서드를 안전(Safe)하다고 함.")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"멱등-idempotent"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#멱등-idempotent"}},[this._v("#")]),this._v(" 멱등(Idempotent)")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("몇 번을 호출하든 최종적인 결과는 똑같은 메서드 속성임.")]),t._v(" "),s("ul",[s("li",[t._v("데이터를 가져오거나(GET), 삭제하거나(DELTE), 완전히 대체하는(PUT) 작업은 몇 번이 수행되건 상관없이 결과는 같음.")]),t._v(" "),s("li",[t._v("특정 데이터를 조회하는 것의 결과는 조회하는 것이고, 특정 데이터를 삭제하는 것의 결과는 그 데이터가 삭제된 것임.")])])]),t._v(" "),s("li",[s("strong",[t._v("POST의 경우는 다름. POST 메서드로 결제를 수행했다고 가정해봄.")]),t._v(" "),s("ul",[s("li",[t._v("해당 POST 메서드가 두 번 호출된다면 결제가 중복해서 발생할 수 있음.")]),t._v(" "),s("li",[t._v("사용자의 돈이나 제품의 수량 같은 데이터가 지속해서 달라짐."),s("br"),t._v("\n→ 따라서, 이러한 메소드는 멱등하지 않은 것임.")]),t._v(" "),s("li",[t._v("이러한 속성은 서버의 문제로 클라이언트가 같은 요청을 다시해도 되는가?에 대한 판단 근거가 될 수 있음.")])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"캐시-기능-cacheable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#캐시-기능-cacheable"}},[this._v("#")]),this._v(" 캐시 기능(Cacheable)")])},function(){var t=this._self._c;return t("ul",[t("li",[t("strong",[this._v("응답 결과 리소스를 캐시해서 사용해도 되는지에 대한 속성임.")]),this._v(" "),t("ul",[t("li",[this._v("GET과 HEAD, POST, PATCH 메소드가 이 속성을 가짐.")]),this._v(" "),t("li",[this._v("일반적으로 GET, HEAD 정도만 캐시로 사용함.")])])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"crud-관점에서-보면"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#crud-관점에서-보면"}},[this._v("#")]),this._v(" CRUD 관점에서 보면")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[s("code",[t._v("GET")]),t._v(":")]),t._v(" READ")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("POST")]),t._v(":")]),t._v(" Create")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("PUT")]),t._v(":")]),t._v(" Update - 기존의 정보를 덮어 씌움.")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("PATCH")]),t._v(":")]),t._v(" Update - 기존 정보의 일부를 수정함.")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("DELETE")]),t._v(":")]),t._v(" Delete")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-자료"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-자료"}},[this._v("#")]),this._v(" 참고한 자료")])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{225:function(t,s,r){"use strict";r.r(s);var _=r(0),e=Object(_.a)({},(function(){var t=this,s=t._self._c;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v('HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부 기능은 메서드 집합 간에 서로 공유하기도 합니다. 이를테면 응답 메서드는 안전하거나, 캐시 가능하거나, 멱등성을 가질 수 있습니다.')]),t._v(" - "),s("a",{attrs:{href:"https://developer.mozilla.org/ko/docs/Web/HTTP/Methods",target:"_blank",rel:"noopener noreferrer"}},[s("em",[t._v("Mozilla 공식 문서 - HTTP 요청 메서드")]),s("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),s("p",[t._v("각 HTTP 메서드마다 용도와 특징이 다름. 메서드 속성은 이렇한 특징을 알 수 있는 지표임.")]),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://amkorousagi-money.tistory.com/entry/HTTP-method-%EC%A0%95%EB%A6%AC",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP method 정리"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://medium.com/@lyhlg0201/http-method-d561b77df7",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP Method"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://rachel0115.tistory.com/entry/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A0%95%EB%A6%AC-GET-POST-PUT-PATCH-DELETE",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTTP 메서드 정리 (GET, POST, PUT, PATCH, DELETE ...)"),s("OutboundLink")],1)])])])}),[function(){var t=this._self._c;return t("h1",{attrs:{id:"_20230821-http-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_20230821-http-method"}},[this._v("#")]),this._v(" 20230821 - HTTP Method")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("웹 프로그래밍을 차분하게 다시 살펴보고자 한다.")]),this._v(" "),t("li",[this._v("본 글에서는 웹에서 사용하는 메소드(Methods)를 사용하고자 한다.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#method"}},[this._v("#")]),this._v(" Method")])},function(){var t=this._self._c;return t("h3",{attrs:{id:"get"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get"}},[this._v("#")]),this._v(" GET")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("서버에서 Resource를 보내도록 요청하는데 사용한다.\n"),t("ul",[t("li",[t("strong",[this._v("서버의 Resource를 읽음.")])])])]),this._v(" "),t("li",[this._v("특정 리소스의 표시를 요청, 데이터의 수정 없이 데이터를 받기만 한다.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"head"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#head"}},[this._v("#")]),this._v(" HEAD")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("GET과 동일한 응답이지만, 응답에 "),t("code",[this._v("body")]),this._v("가 포함되지 않음.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"post"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#post"}},[this._v("#")]),this._v(" POST")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("특정 리소스를 제출할 때 쓰임. 서버의 상태 변화나 부작용을 일으킬 수도 있음.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"put"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#put"}},[this._v("#")]),this._v(" PUT")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("목적 리소스의 모든 현재 표시를 요청하는 값으로 변경함.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"delete"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete"}},[this._v("#")]),this._v(" DELETE")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("특정한 리소스를 삭제함.")])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"patch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#patch"}},[this._v("#")]),this._v(" PATCH")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("리소스의 특정 부분만 수정함.")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"http-메서드-속성"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#http-메서드-속성"}},[this._v("#")]),this._v(" HTTP 메서드 속성")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("안전(Safe Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("멱등(Idempotent Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("캐시 가능(Cacheable Methods)")])]),t._v(" "),s("li",[s("strong",[t._v("요청에 본문("),s("code",[t._v("Body")]),t._v(") 존재")])]),t._v(" "),s("li",[s("strong",[t._v("성공 응답에 본문("),s("code",[t._v("Body")]),t._v(") 존재")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"안전-safe"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#안전-safe"}},[this._v("#")]),this._v(" 안전(Safe)")])},function(){var t=this._self._c;return t("ul",[t("li",[this._v("안전(Safe)는 호출해도 리소스를 변경하지 않는 메서드 속성.\n"),t("ul",[t("li",[t("strong",[this._v("데이터의 변경이 일어나지 않는다는 뜻.")])])])]),this._v(" "),t("li",[t("strong",[this._v("GET 메서드는 단순히 데이터를 가져올 때 사용하는데, 이러한 GET 같은 메서드를 안전(Safe)하다고 함.")])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"멱등-idempotent"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#멱등-idempotent"}},[this._v("#")]),this._v(" 멱등(Idempotent)")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[t._v("몇 번을 호출하든 최종적인 결과는 똑같은 메서드 속성임.")]),t._v(" "),s("ul",[s("li",[t._v("데이터를 가져오거나(GET), 삭제하거나(DELTE), 완전히 대체하는(PUT) 작업은 몇 번이 수행되건 상관없이 결과는 같음.")]),t._v(" "),s("li",[t._v("특정 데이터를 조회하는 것의 결과는 조회하는 것이고, 특정 데이터를 삭제하는 것의 결과는 그 데이터가 삭제된 것임.")])])]),t._v(" "),s("li",[s("strong",[t._v("POST의 경우는 다름. POST 메서드로 결제를 수행했다고 가정해봄.")]),t._v(" "),s("ul",[s("li",[t._v("해당 POST 메서드가 두 번 호출된다면 결제가 중복해서 발생할 수 있음.")]),t._v(" "),s("li",[t._v("사용자의 돈이나 제품의 수량 같은 데이터가 지속해서 달라짐."),s("br"),t._v("\n→ 따라서, 이러한 메소드는 멱등하지 않은 것임.")]),t._v(" "),s("li",[t._v("이러한 속성은 서버의 문제로 클라이언트가 같은 요청을 다시해도 되는가?에 대한 판단 근거가 될 수 있음.")])])])])},function(){var t=this._self._c;return t("h3",{attrs:{id:"캐시-기능-cacheable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#캐시-기능-cacheable"}},[this._v("#")]),this._v(" 캐시 기능(Cacheable)")])},function(){var t=this._self._c;return t("ul",[t("li",[t("strong",[this._v("응답 결과 리소스를 캐시해서 사용해도 되는지에 대한 속성임.")]),this._v(" "),t("ul",[t("li",[this._v("GET과 HEAD, POST, PATCH 메소드가 이 속성을 가짐.")]),this._v(" "),t("li",[this._v("일반적으로 GET, HEAD 정도만 캐시로 사용함.")])])])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"crud-관점에서-보면"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#crud-관점에서-보면"}},[this._v("#")]),this._v(" CRUD 관점에서 보면")])},function(){var t=this,s=t._self._c;return s("ul",[s("li",[s("strong",[s("code",[t._v("GET")]),t._v(":")]),t._v(" READ")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("POST")]),t._v(":")]),t._v(" Create")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("PUT")]),t._v(":")]),t._v(" Update - 기존의 정보를 덮어 씌움.")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("PATCH")]),t._v(":")]),t._v(" Update - 기존 정보의 일부를 수정함.")]),t._v(" "),s("li",[s("strong",[s("code",[t._v("DELETE")]),t._v(":")]),t._v(" Delete")])])},function(){var t=this._self._c;return t("h2",{attrs:{id:"참고한-자료"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#참고한-자료"}},[this._v("#")]),this._v(" 참고한 자료")])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/50.f1dff22c.js b/assets/js/50.f1dff22c.js new file mode 100644 index 00000000..12e56c15 --- /dev/null +++ b/assets/js/50.f1dff22c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{177:function(n,w,o){}}]); \ No newline at end of file diff --git a/assets/js/app.1e519d50.js b/assets/js/app.6453f82d.js similarity index 76% rename from assets/js/app.1e519d50.js rename to assets/js/app.6453f82d.js index b70d6544..a1cce9a3 100644 --- a/assets/js/app.1e519d50.js +++ b/assets/js/app.6453f82d.js @@ -1,3 +1,3 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],l=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){for(var r=n(20),o=n(28),i=n(11),a=n(3),s=n(10),c=n(18),l=n(1),u=l("iterator"),f=l("toStringTag"),p=c.Array,h={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},d=o(h),v=0;v=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){"use strict";var r=n(6);t.exports=function(t,e){return!!t&&r((function(){e?t.call(null,(function(){}),1):t.call(null)}))}},function(t,e,n){"use strict";var r=n(2),o=n(32)(3);r(r.P+r.F*!n(21)([].some,!0),"Array",{some:function(t){return o(this,t,arguments[1])}})},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(8).f,o=n(14),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(2);r(r.S+r.F,"Object",{assign:n(105)})},function(t,e,n){var r=n(66),o=n(52);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(50),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(19),o=n(28);n(69)("keys",(function(){return function(t){return o(r(t))}}))},function(t,e,n){"use strict";var r=n(2),o=n(32)(0),i=n(21)([].forEach,!0);r(r.P+r.F*!i,"Array",{forEach:function(t){return o(this,t,arguments[1])}})},function(t,e,n){var r=n(9),o=n(50),i=n(19),a=n(15),s=n(113);t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,u=4==t,f=6==t,p=5==t||f,h=e||s;return function(e,s,d){for(var v,g,m=i(e),y=o(m),b=r(s,d,3),_=a(y.length),E=0,C=n?h(e,_):c?h(e,0):void 0;_>E;E++)if((p||E in y)&&(g=b(v=y[E],E,m),t))if(n)C[E]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return E;case 2:C.push(v)}else if(u)return!1;return f?-1:l||u?u:C}}},function(t,e,n){"use strict";var r=n(2),o=n(32)(2);r(r.P+r.F*!n(21)([].filter,!0),"Array",{filter:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(2),o=n(67)(!1),i=[].indexOf,a=!!i&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(a||!n(21)(i)),"Array",{indexOf:function(t){return a?i.apply(this,arguments)||0:o(this,t,arguments[1])}})},function(t,e,n){"use strict";n(115)("link",(function(t){return function(e){return t(this,"a","href",e)}}))},function(t,e,n){"use strict";var r=n(2),o=n(32)(1);r(r.P+r.F*!n(21)([].map,!0),"Array",{map:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(42),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";n(118);var r=n(11),o=n(10),i=n(6),a=n(16),s=n(1),c=n(57),l=s("species"),u=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var p=s(t),h=!i((function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})),d=h?!i((function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[l]=function(){return n}),n[p](""),!e})):void 0;if(!h||!d||"replace"===t&&!u||"split"===t&&!f){var v=/./[p],g=n(a,p,""[t],(function(t,e,n,r,o){return e.exec===c?h&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}})),m=g[0],y=g[1];r(String.prototype,t,m),o(RegExp.prototype,p,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},function(t,e,n){"use strict";var r=n(4),o=n(19),i=n(15),a=n(25),s=n(56),c=n(37),l=Math.max,u=Math.min,f=Math.floor,p=/\$([$&`']|\d\d?|<[^>]*>)/g,h=/\$([$&`']|\d\d?)/g;n(38)("replace",2,(function(t,e,n,d){return[function(r,o){var i=t(this),a=null==r?void 0:r[e];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(t,e){var o=d(n,t,this,e);if(o.done)return o.value;var f=r(t),p=String(this),h="function"==typeof e;h||(e=String(e));var g=f.global;if(g){var m=f.unicode;f.lastIndex=0}for(var y=[];;){var b=c(f,p);if(null===b)break;if(y.push(b),!g)break;""===String(b[0])&&(f.lastIndex=s(p,i(f.lastIndex),m))}for(var _,E="",C=0,x=0;x=C&&(E+=p.slice(C,k)+B,C=k+w.length)}return E+p.slice(C)}];function v(t,e,r,i,a,s){var c=r+t.length,l=i.length,u=h;return void 0!==a&&(a=o(a),u=p),n.call(s,u,(function(n,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":s=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return n;if(u>l){var p=f(u/10);return 0===p?n:p<=l?void 0===i[p-1]?o.charAt(1):i[p-1]+o.charAt(1):n}s=i[u-1]}return void 0===s?"":s}))}}))},function(t,e,n){var r,o; +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],l=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){for(var r=n(20),o=n(28),i=n(11),a=n(3),s=n(10),c=n(18),l=n(1),u=l("iterator"),f=l("toStringTag"),p=c.Array,h={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},d=o(h),v=0;v=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){"use strict";var r=n(6);t.exports=function(t,e){return!!t&&r((function(){e?t.call(null,(function(){}),1):t.call(null)}))}},function(t,e,n){"use strict";var r=n(2),o=n(32)(3);r(r.P+r.F*!n(21)([].some,!0),"Array",{some:function(t){return o(this,t,arguments[1])}})},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(8).f,o=n(14),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(2);r(r.S+r.F,"Object",{assign:n(105)})},function(t,e,n){var r=n(66),o=n(52);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(50),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(19),o=n(28);n(69)("keys",(function(){return function(t){return o(r(t))}}))},function(t,e,n){"use strict";var r=n(2),o=n(32)(0),i=n(21)([].forEach,!0);r(r.P+r.F*!i,"Array",{forEach:function(t){return o(this,t,arguments[1])}})},function(t,e,n){var r=n(9),o=n(50),i=n(19),a=n(15),s=n(113);t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,u=4==t,f=6==t,p=5==t||f,h=e||s;return function(e,s,d){for(var v,g,m=i(e),y=o(m),b=r(s,d,3),_=a(y.length),E=0,C=n?h(e,_):c?h(e,0):void 0;_>E;E++)if((p||E in y)&&(g=b(v=y[E],E,m),t))if(n)C[E]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return E;case 2:C.push(v)}else if(u)return!1;return f?-1:l||u?u:C}}},function(t,e,n){"use strict";var r=n(2),o=n(32)(2);r(r.P+r.F*!n(21)([].filter,!0),"Array",{filter:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(2),o=n(67)(!1),i=[].indexOf,a=!!i&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(a||!n(21)(i)),"Array",{indexOf:function(t){return a?i.apply(this,arguments)||0:o(this,t,arguments[1])}})},function(t,e,n){"use strict";n(115)("link",(function(t){return function(e){return t(this,"a","href",e)}}))},function(t,e,n){"use strict";var r=n(2),o=n(32)(1);r(r.P+r.F*!n(21)([].map,!0),"Array",{map:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(42),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";n(118);var r=n(11),o=n(10),i=n(6),a=n(16),s=n(1),c=n(57),l=s("species"),u=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var p=s(t),h=!i((function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})),d=h?!i((function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[l]=function(){return n}),n[p](""),!e})):void 0;if(!h||!d||"replace"===t&&!u||"split"===t&&!f){var v=/./[p],g=n(a,p,""[t],(function(t,e,n,r,o){return e.exec===c?h&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}})),m=g[0],y=g[1];r(String.prototype,t,m),o(RegExp.prototype,p,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},function(t,e,n){"use strict";var r=n(4),o=n(19),i=n(15),a=n(25),s=n(56),c=n(37),l=Math.max,u=Math.min,f=Math.floor,p=/\$([$&`']|\d\d?|<[^>]*>)/g,h=/\$([$&`']|\d\d?)/g;n(38)("replace",2,(function(t,e,n,d){return[function(r,o){var i=t(this),a=null==r?void 0:r[e];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(t,e){var o=d(n,t,this,e);if(o.done)return o.value;var f=r(t),p=String(this),h="function"==typeof e;h||(e=String(e));var g=f.global;if(g){var m=f.unicode;f.lastIndex=0}for(var y=[];;){var b=c(f,p);if(null===b)break;if(y.push(b),!g)break;""===String(b[0])&&(f.lastIndex=s(p,i(f.lastIndex),m))}for(var _,E="",C=0,x=0;x=C&&(E+=p.slice(C,k)+B,C=k+w.length)}return E+p.slice(C)}];function v(t,e,r,i,a,s){var c=r+t.length,l=i.length,u=h;return void 0!==a&&(a=o(a),u=p),n.call(s,u,(function(n,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":s=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return n;if(u>l){var p=f(u/10);return 0===p?n:p<=l?void 0===i[p-1]?o.charAt(1):i[p-1]+o.charAt(1):n}s=i[u-1]}return void 0===s?"":s}))}}))},function(t,e,n){var r,o; /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT */void 0===(o="function"==typeof(r=function(){var t,e,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),l=c.querySelector(r.barSelector),u=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(l,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,u,f)),1===t?(s(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){s(c,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),u)}),u)):setTimeout(e,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),u=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),u!=document.body&&l(u,"nprogress-custom-parent"),u.appendChild(e),e},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function l(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function u(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e){t.exports=!1},function(t,e,n){var r=n(12),o=n(1)("toStringTag"),i="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),o))?n:i?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,n){var r=n(13),o=n(3),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(41)?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(5),o=n(3).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(9),o=n(97),i=n(98),a=n(4),s=n(15),c=n(99),l={},u={};(e=t.exports=function(t,e,n,f,p){var h,d,v,g,m=p?function(){return t}:c(t),y=r(n,f,e?2:1),b=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(i(m)){for(h=s(t.length);h>b;b++)if((g=e?y(a(d=t[b])[0],d[1]):y(t[b]))===l||g===u)return g}else for(v=m.call(t);!(d=v.next()).done;)if((g=o(v,y,d.value,e))===l||g===u)return g}).BREAK=l,e.RETURN=u},function(t,e,n){var r=n(11);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(3),o=n(8),i=n(7),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){var r=n(12);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(43)("keys"),o=n(24);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(24)("meta"),o=n(5),i=n(14),a=n(8).f,s=0,c=Object.isExtensible||function(){return!0},l=!n(6)((function(){return c(Object.preventExtensions({}))})),u=function(t){a(t,r,{value:{i:"O"+ ++s,w:{}}})},f=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";u(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;u(t)}return t[r].w},onFreeze:function(t){return l&&f.NEED&&c(t)&&!i(t,r)&&u(t),t}}},function(t,e,n){"use strict";var r=n(41),o=n(2),i=n(11),a=n(10),s=n(18),c=n(110),l=n(26),u=n(112),f=n(1)("iterator"),p=!([].keys&&"next"in[].keys()),h=function(){return this};t.exports=function(t,e,n,d,v,g,m){c(n,e,d);var y,b,_,E=function(t){if(!p&&t in k)return k[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},C=e+" Iterator",x="values"==v,w=!1,k=t.prototype,S=k[f]||k["@@iterator"]||v&&k[v],A=S||E(v),$=v?x?E("entries"):A:void 0,O="Array"==e&&k.entries||S;if(O&&(_=u(O.call(new t)))!==Object.prototype&&_.next&&(l(_,C,!0),r||"function"==typeof _[f]||a(_,f,h)),x&&S&&"values"!==S.name&&(w=!0,A=function(){return S.call(this)}),r&&!m||!p&&!w&&k[f]||a(k,f,A),s[e]=A,s[C]=h,v)if(y={values:x?A:E("values"),keys:g?A:E("keys"),entries:$},m)for(b in y)b in k||i(k,b,y[b]);else o(o.P+o.F*(p||w),e,y);return y}},function(t,e,n){var r=n(8).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||n(7)&&r(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},function(t,e,n){"use strict";var r=n(74)(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},function(t,e,n){"use strict";var r,o,i=n(75),a=RegExp.prototype.exec,s=String.prototype.replace,c=a,l=(r=/a/,o=/b*/g,a.call(r,"a"),a.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),u=void 0!==/()??/.exec("")[1];(l||u)&&(c=function(t){var e,n,r,o,c=this;return u&&(n=new RegExp("^"+c.source+"$(?!\\s)",i.call(c))),l&&(e=c.lastIndex),r=a.call(c,t),l&&r&&(c.lastIndex=c.global?r.index+r[0].length:e),u&&r&&r.length>1&&s.call(r[0],n,(function(){for(o=1;oi;)a(n[i++]);t._c=[],t._n=!1,e&&!t._h&&D(t)}))}},D=function(t){m.call(c,(function(){var e,n,r,o=t._v,i=L(t);if(i&&(e=_((function(){$?w.emit("unhandledRejection",o,t):(n=c.onunhandledrejection)?n({promise:t,reason:o}):(r=c.console)&&r.error&&r.error("Unhandled promise rejection",o)})),t._h=$||L(t)?2:1),t._a=void 0,i&&e.e)throw e.v}))},L=function(t){return 1!==t._h&&0===(t._a||t._c).length},R=function(t){m.call(c,(function(){var e;$?w.emit("rejectionHandled",t):(e=c.onrejectionhandled)&&e({promise:t,reason:t._v})}))},I=function(t){var e=this;e._d||(e._d=!0,(e=e._w||e)._v=t,e._s=2,e._a||(e._a=e._c.slice()),P(e,!0))},M=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw x("Promise can't be resolved itself");(e=j(t))?y((function(){var r={_w:n,_d:!1};try{e.call(t,l(M,r,1),l(I,r,1))}catch(t){I.call(r,t)}})):(n._v=t,n._s=1,P(n,!1))}catch(t){I.call({_w:n,_d:!1},t)}}};T||(A=function(t){d(this,A,"Promise","_h"),h(t),r.call(this);try{t(l(M,this,1),l(I,this,1))}catch(t){I.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(48)(A.prototype,{then:function(t,e){var n=B(g(this,A));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=$?w.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&P(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r;this.promise=t,this.resolve=l(M,t,1),this.reject=l(I,t,1)},b.f=B=function(t){return t===A||t===a?new i(t):o(t)}),f(f.G+f.W+f.F*!T,{Promise:A}),n(26)(A,"Promise"),n(49)("Promise"),a=n(13).Promise,f(f.S+f.F*!T,"Promise",{reject:function(t){var e=B(this);return(0,e.reject)(t),e.promise}}),f(f.S+f.F*(s||!T),"Promise",{resolve:function(t){return C(s&&this===a?A:this,t)}}),f(f.S+f.F*!(T&&n(65)((function(t){A.all(t).catch(O)}))),"Promise",{all:function(t){var e=this,n=B(e),r=n.resolve,o=n.reject,i=_((function(){var n=[],i=0,a=1;v(t,!1,(function(t){var s=i++,c=!1;n.push(void 0),a++,e.resolve(t).then((function(t){c||(c=!0,n[s]=t,--a||r(n))}),o)})),--a||r(n)}));return i.e&&o(i.v),n.promise},race:function(t){var e=this,n=B(e),r=n.reject,o=_((function(){v(t,!1,(function(t){e.resolve(t).then(n.resolve,r)}))}));return o.e&&r(o.v),n.promise}})},function(t,e,n){t.exports=!n(7)&&!n(6)((function(){return 7!=Object.defineProperty(n(44)("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(5);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(4),o=n(23),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e,n){var r,o,i,a=n(9),s=n(100),c=n(63),l=n(44),u=n(3),f=u.process,p=u.setImmediate,h=u.clearImmediate,d=u.MessageChannel,v=u.Dispatch,g=0,m={},y=function(){var t=+this;if(m.hasOwnProperty(t)){var e=m[t];delete m[t],e()}},b=function(t){y.call(t.data)};p&&h||(p=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return m[++g]=function(){s("function"==typeof t?t:Function(t),e)},r(g),g},h=function(t){delete m[t]},"process"==n(12)(f)?r=function(t){f.nextTick(a(y,t,1))}:v&&v.now?r=function(t){v.now(a(y,t,1))}:d?(i=(o=new d).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):u.addEventListener&&"function"==typeof postMessage&&!u.importScripts?(r=function(t){u.postMessage(t+"","*")},u.addEventListener("message",b,!1)):r="onreadystatechange"in l("script")?function(t){c.appendChild(l("script")).onreadystatechange=function(){c.removeChild(this),y.call(t)}}:function(t){setTimeout(a(y,t,1),0)}),t.exports={set:p,clear:h}},function(t,e,n){var r=n(3).document;t.exports=r&&r.documentElement},function(t,e,n){"use strict";var r=n(23);function o(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)}t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){var r=n(14),o=n(29),i=n(67)(!1),a=n(51)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),c=0,l=[];for(n in s)n!=a&&r(s,n)&&l.push(n);for(;e.length>c;)r(s,n=e[c++])&&(~i(l,n)||l.push(n));return l}},function(t,e,n){var r=n(29),o=n(15),i=n(106);t.exports=function(t){return function(e,n,a){var s,c=r(e),l=o(c.length),u=i(a,l);if(t&&n!=n){for(;l>u;)if((s=c[u++])!=s)return!0}else for(;l>u;u++)if((t||u in c)&&c[u]===n)return t||u||0;return!t&&-1}}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(2),o=n(13),i=n(6);t.exports=function(t,e){var n=(o.Object||{})[t]||Object[t],a={};a[t]=e(n),r(r.S+r.F*i((function(){n(1)})),"Object",a)}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(4),o=n(111),i=n(52),a=n(51)("IE_PROTO"),s=function(){},c=function(){var t,e=n(44)("iframe"),r=i.length;for(e.style.display="none",n(63).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" + diff --git a/etc/20230731-military-service.html b/etc/20230731-military-service.html index 3986b3ee..678fb39f 100644 --- a/etc/20230731-military-service.html +++ b/etc/20230731-military-service.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230731 - 군 복무 관련

군 복무와 관련되어서 기록할 겸 남겨둔다.
결론 "군대 가기 싫다...ㅠ"

# 해야할 것들.

# 군대 가기 전 해외여행

  • 군대 가기 전에 해외여행 +

# 20230731 - 군 복무 관련

군 복무와 관련되어서 기록할 겸 남겨둔다.
결론 "군대 가기 싫다...ㅠ"

# 해야할 것들.

# 군대 가기 전 해외여행

  • 군대 가기 전에 해외여행
    • 홍콩, 싱가폴, 미국 중 한 곳.
  • 출국을 못하는 경우 한국에서 여행할 예정.

# 신변 정리

  • 회사
    • 사직원 제출
    • 재직 중 개발한 프로젝트 문서화 및 유지보수 사항에 대해 정의한 문서 필요함.
  • 커뮤니티
    • 군대 제대 이후 활동할 수 있도록 커뮤니티 분들께 물어보기.
    • GDG 관련하여 Goolge Korea DevRel팀 담당자 분과 이야기 나눠야 함.
      • 최대한 다른 분들께 피해가 가지 않도록 해야함.

# 면접 준비

# 육군

# 정보보호병

  • 자격 증명:
    • 정보보호, 정보보안, 해킹방어 등 정보보호관련 학과 전공자
    • 국외·국내 정보보호 전문 자격증을 취득한 사람
      • 국제공인정보시스템보안전문가(CISSP), 사이버포렌식전문가(CCFP), 정보보호관리사(CISM), 정보시스템감시사(CISA), 정보보안기사, 디지털포렌식전문가, 인터넷보안전문가, 정보보안관리사(ISM), 해킹보안전문가, 정보보안산업기사, 디지털포렌식전문가2급, 인터넷보안전문가2급, 해킹보안전문가2급, CCNA, 정보처리(기능사 이상), 전자계산기(기능사 이상), 전자계산기조직응용(기능사 이상), 네트워크관리사
  • 지원제한 대상:
    • 범죄경력 조회결과(경찰청)
      • 징역 또는 금고의 형의 실형(집행유예 포함)을 선고 받은 사람
      • 수사또는 재판중에 있는 사람
      • 처분미상으로 통보된 사람
  • 구비 서류:
    • 제출할 서류. 최종 학력증명서(재학, 졸업 등) 1부, 고교생활기록부 사본 1부, 자격증 사본 1부(해당자만 제출), 경력증명서 1부(해당자만 제출)

# 해군

# 정보보호병(전문특기병)

  • 지원 자격:
    • 다음 자격증 소지자: 국내.외 공인 정보보호자격증, IT 국제공인자격증, 프로그래밍/기타 관련 자격증, ICT 역량지수(TOPCIT) 정기평가 300점 이상
    • 다음 관련학과 전공자:
      • 4년제 대학, 전문대학 : 정보보호, 컴퓨터, 전산 관련 학과 1년 수료이상
      • 고등학교 : 정보보호 관련 학과 졸업자
    • 임무:
      • 사이버 보호, 서버/네트워크 관리 등

# S/W개발병(전문특기병)

  • 지원 자격:
    • 자격: 정보처리기사(산업기사, 기능사), 시각디자인기사(산업기사), 웹디자인기능사
    • 전공: 컴퓨터공학, 컴퓨터시스템, 공학, 디지털미디어, 시각디자인, 멀티미디어, 전산학
    • 임무:

# 공군

# 정보보호병

- + diff --git a/index.html b/index.html index e22ec512..a15c9df0 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ - + @@ -19,11 +19,11 @@ GitHub

Welcome to Today HyunSang Learned

+

Welcome to Today HyunSang Learned

꾸준히, 조금씩, 오랫동안.

  • 안녕하세요. 박현상입니다.
    저는 Go언어JavaScript(Node.js Express)를 통해서 백엔드 개발을 하고 있습니다.
    최근에는 Rust에 관심이 생겨서 배우고 있습니다. 보다 다양한 기술들을 살펴보며 배워나가고 있습니다.
  • 프로그래밍 언어를 통해서 백엔드 개발을 하면서 효율적이지만 보안적으로 안전한 백엔드 개발를 하기 위한 방법을 공부하고자 합니다.
  • 커뮤니티 활동을 통해서 다양한 분들을 만나뵙고 커뮤니케이션을 통해서 커뮤니케이션을 하는 방법과 다른 분들이 어떤 기술을 통해서 서비스, 솔루션을 개발하는지에 대해서 관심이 많습니다.

- + diff --git a/javascript/20230822-nodejs-express-and-cluster.html b/javascript/20230822-nodejs-express-and-cluster.html index cea7fbad..8b28e6cc 100644 --- a/javascript/20230822-nodejs-express-and-cluster.html +++ b/javascript/20230822-nodejs-express-and-cluster.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230822 - Node.js and Cluster

  • node.js는 기본적으로 하나의 프로세스가 32bit에서는 512MB 메모리를 사용할 수 있으며, 64bit에서는 1.5GB 메모리를 사용하도록 제한 되어 있음.
  • Chrome V8 Engine의 제한사항을 그대로 반영하여 사용하는 것임. 설정을 통해서 더 늘려서 사용할 수도 있지만 worker를 늘리는 것을 권장하고 있음.
  • 여러 개의 워커들이 병렬로 동작하며 효율을 극대화하는 것을 바람직한 방향으로 권고하고 있음.

# worker를 생성하는 방법

  • Node.js에서는 worker를 생성하는 방법은 두 가지임. +

# 20230822 - Node.js and Cluster

  • node.js는 기본적으로 하나의 프로세스가 32bit에서는 512MB 메모리를 사용할 수 있으며, 64bit에서는 1.5GB 메모리를 사용하도록 제한 되어 있음.
  • Chrome V8 Engine의 제한사항을 그대로 반영하여 사용하는 것임. 설정을 통해서 더 늘려서 사용할 수도 있지만 worker를 늘리는 것을 권장하고 있음.
  • 여러 개의 워커들이 병렬로 동작하며 효율을 극대화하는 것을 바람직한 방향으로 권고하고 있음.

# worker를 생성하는 방법

  • Node.js에서는 worker를 생성하는 방법은 두 가지임.
    • child_process, cluster 정도로 요약할 수 있음.
  • cluster 는 Node.js v0.8부터 소개 되었음. 큰 부하를 노드 프로세스들의 클러스터를 통해 다루려는 목적으로 시작됨.
    • 이 프로세스들은 서버의 포트들을 공유할 수 있기 때문에 Web Application에 매우 적합함.
  • 프로세스들을 단순하게 병렬로 실행하는 것은 child_process.fork()로 가능하고, 로드밸런싱과 포트 공유 등이 필요하다면 클러스터로 접근하는 것이 좋음.
    • IPC(Inter-Process Communication)로 process 간의 통신이 가능하기 때문에 로드 밸런싱 등의 추가적인 기능이 필요한 경우 클러스터를 활용하고 워크를 직접적으로 컨트롤 해야하는 경우 child_process를 주로 활용하게 됨.
  • 새로운 child_process는 모두 V8의 인스턴스이기 때문에 30ms의 시작시간과 10MB 가량의 메모리를 소모함.

# 클러스터의 스케쥴링 방식

var cluster = require("cluster");
@@ -59,6 +59,6 @@
         
         →
       

- + diff --git a/javascript/20230824-nodejs-express-error-handling.html b/javascript/20230824-nodejs-express-error-handling.html index 5c8be969..cacd8598 100644 --- a/javascript/20230824-nodejs-express-error-handling.html +++ b/javascript/20230824-nodejs-express-error-handling.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230824 - Node.js Express Error Handling

  • 본 글은 의 강의를 보면서 미들웨어에서 오류 핸들링과 관련된 내용을 보고 나서 자세히 알기 위해서 작성함.
  • 에러 처리를 위한 익스프레스 가이드를 참고하여 효율적이고 안전하게 오류를 처리할 수 있는 방법에 대해서 공부하고자 함. +

# 20230824 - Node.js Express Error Handling

  • 본 글은 의 강의를 보면서 미들웨어에서 오류 핸들링과 관련된 내용을 보고 나서 자세히 알기 위해서 작성함.
  • 에러 처리를 위한 익스프레스 가이드를 참고하여 효율적이고 안전하게 오류를 처리할 수 있는 방법에 대해서 공부하고자 함.
    • 영어 자료를 한국어로 번역하면서 한국어와 문맥이 잘 어울리지 않는 경우 임의로 수정함.

# 기본적인 오류 핸들링 방법

app.get('/user', async function(req, res) {
 	let users;
 	try {
@@ -80,6 +80,6 @@
         
         →
       

- + diff --git a/monthly-i-learned/2023-09.html b/monthly-i-learned/2023-09.html new file mode 100644 index 00000000..10cfc204 --- /dev/null +++ b/monthly-i-learned/2023-09.html @@ -0,0 +1,32 @@ + + + + + + 2023년 09월 | Today HyunSang Learned + + + + + + + +

# 2023년 09월

# 2023.09.20(수)

# 2023.09.24(일)

  • 하나만 열심히 해야겠다라는 진념이 생김. 여러개를 하다보면 전문적으로 할 수 없음.
  • 인프로콘 2023 다시보기를 봄. 주로 성장을 어떻게 해야하는지, 주니어와 관련된 내용을 주로 봄.
    +아직 다 보지는 못하였지만 앞으로 시간이 남을 때마다 볼 예정. +
    • 커뮤니케이션 잘하는 개발자의 4가지 습관 - 송범근
    • 왜 구글 시니어 개발자는 코딩을 안할까? - 이다니엘
    • 어느 날 고민 많은 주니어 개발자가 찾아왔다 2탄: 주니어 시절 성장과 고민들 - 김영한
    • 주니어 프론트엔드 엔지니어의 성과 및 역량 향상을 위한 실전가이드 - 배휘동
  • [개정 3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 학습함.
+ + + diff --git a/networks/20230417-TCP.html b/networks/20230417-TCP.html index d57df71c..f7983569 100644 --- a/networks/20230417-TCP.html +++ b/networks/20230417-TCP.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230417 - TCP/IP

학교 수업에서 "정보보호개론"에서 네트워크 부분을 일부분 들었는데 시험보면서 그렇게 잘 알지 못해서 잘 알기 위해서 공부하고자 정리합니다.

# TCP/IP

TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.
인터넷 프로토콜 스위트

전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불린다. TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다. TCP는 전송 계층에 위치한다. 네트워크의 정보 전달을 통제하는 프로토콜이자 인터넷을 이루는 핵심 프로토콜의 하나로서 국제 인터넷 표준화 기구(IETF)의 RFC 793에 기술되어 있다.
TCP

# 참고한 문서

# 20230417 - TCP/IP

학교 수업에서 "정보보호개론"에서 네트워크 부분을 일부분 들었는데 시험보면서 그렇게 잘 알지 못해서 잘 알기 위해서 공부하고자 정리합니다.

# TCP/IP

TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(unreliable datagram service) TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.
인터넷 프로토콜 스위트

전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불린다. TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다. TCP는 전송 계층에 위치한다. 네트워크의 정보 전달을 통제하는 프로토콜이자 인터넷을 이루는 핵심 프로토콜의 하나로서 국제 인터넷 표준화 기구(IETF)의 RFC 793에 기술되어 있다.
TCP

# 참고한 문서

- + diff --git a/the-rust-programming-language/ch01.html b/the-rust-programming-language/ch01.html index 2c1bf49b..d7b4b339 100644 --- a/the-rust-programming-language/ch01.html +++ b/the-rust-programming-language/ch01.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 1. 시작해봅시다

# 1.1. 러스트 설치

  • macOS 환경에서 Rust를 설치하는 방법에 대해서 서술한다.
# Homebrew 설치되어 있지 않은 경우:
+  

# 1. 시작해봅시다

# 1.1. 러스트 설치

  • macOS 환경에서 Rust를 설치하는 방법에 대해서 서술한다.
# Homebrew 설치되어 있지 않은 경우:
 $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
 # Homebrew 이미 설치 되어있는 경우:
 $ brew update && brew upgrade
@@ -80,6 +80,6 @@
         
         →
       

- + diff --git a/the-rust-programming-language/ch02.html b/the-rust-programming-language/ch02.html index c3d535b2..383322db 100644 --- a/the-rust-programming-language/ch02.html +++ b/the-rust-programming-language/ch02.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 2. 추리 게임

# 새로운 프로젝트 준비하기

$ cargo new guessing_game
+  

# 2. 추리 게임

# 새로운 프로젝트 준비하기

$ cargo new guessing_game
 $ cd guessing_game
 
fn main() {
     println!("Hello, world!");
@@ -93,6 +93,6 @@
         
         →
       

- + diff --git a/the-rust-programming-language/ch03.html b/the-rust-programming-language/ch03.html index 5b120758..136cf9ae 100644 --- a/the-rust-programming-language/ch03.html +++ b/the-rust-programming-language/ch03.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 3. 일반적인 프로그래밍 개념

  • 변수, 기본 타입, 함수, 주석, 그리고 제어 흐름에 대해서 배울 예정이다. 이러한 기초는 모든 러스트 프로그램에 사용될 것이며, 이를 일찍 배우면 강력한 기반을 바탕으로 시작할 수 있게 할 것이다.

# 변수와 가변성

  • 변수는 기본적으로 불변(immutable)이다. 러스트가 제공하는 안정성과 쉬운 동시성을 활용하는 방식으로 코드를 작성할 수 있도록 하는 넛지(nudge, 슬며시 선택을 유도하기) 중 하나이다. 변수를 가변(mutable)으로 만들 수 있다. 어떻게 하는지 살펴보고 왜 러스트가 불변성을 권하는지와 어떨 때 가변성을 써야 하는지 알아보자.

  • 변수가 불변일 때, 어떤 이름에 한번 값이 묶이면 그 값은 바꿀 수 다. 이를 표현하기 위해, cargo new variablesprojects 디렉토리 안에 variables라는 프로젝트를 만들어 보자.

fn main() {
+  

# 3. 일반적인 프로그래밍 개념

  • 변수, 기본 타입, 함수, 주석, 그리고 제어 흐름에 대해서 배울 예정이다. 이러한 기초는 모든 러스트 프로그램에 사용될 것이며, 이를 일찍 배우면 강력한 기반을 바탕으로 시작할 수 있게 할 것이다.

# 변수와 가변성

  • 변수는 기본적으로 불변(immutable)이다. 러스트가 제공하는 안정성과 쉬운 동시성을 활용하는 방식으로 코드를 작성할 수 있도록 하는 넛지(nudge, 슬며시 선택을 유도하기) 중 하나이다. 변수를 가변(mutable)으로 만들 수 있다. 어떻게 하는지 살펴보고 왜 러스트가 불변성을 권하는지와 어떨 때 가변성을 써야 하는지 알아보자.

  • 변수가 불변일 때, 어떤 이름에 한번 값이 묶이면 그 값은 바꿀 수 다. 이를 표현하기 위해, cargo new variablesprojects 디렉토리 안에 variables라는 프로젝트를 만들어 보자.

fn main() {
     let x = 5;
     println!("The value of x is: {x}");
     x = 6;
@@ -57,7 +57,7 @@
 

mut를 사용해 x의 값을 5에서 6으로 바꿀 수 있다. 가변성을 사용할지 말지는 코드를 작성하는 사람의 몫이고, 특정 상황에서 가장 명확하다고 생각하는 것이 어떤 것인지에 따라서 달라진다.

# 상수

  • 상수(constant)는 불변 변수와 비슷하다. 어떤 이름에 묶여 있는 값이고 값을 바꾸는 것이 허용되지 않지만, 변수와는 약간 다른 점이 있다.
    • 상수는 mut와 함께 사용할 수 없다. 상수는 기본적으로 불변인 것이 아니고, 항상 불변이다. 상수는 let 키워드 대신 const 키워드로 선언하며, 값의 타입은 반드시 명시 되어야 한다.
  • 상수는 전역 스코프를 포함한 어떤 스코프에서도 선언 가능하므로 코드의 많은 부분에서 알 필요가 있는 값에 유용하다.
  • 상수는 반드시 상수 표현식으로만 설정될 수 하고 런타임에서만 계산될 수 있는 결괏값으로 안 된다.

상수 선언의 예제:

const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
 
  • 상수의 이름은 THREE_HOURES_IN_SECONDS이고, 값은 60(분당 초의 개수), 60(시간당 분의 개수), 3(이 프로그램에서 알아둘 필요가 있는 시간의 숫자)를 모두 곱한 값이다. -
    • 러스트의 이름 짓기 관례에서 상수느 단어 사이에 밑줄을 사용하고 모든 글자를 대문자로 쓰는 것이다.
    • 컴파일너는 컴파일 타임에 제한된 연산을 수행할 수 있는데, 이런 상숫값을 10,800으로 쓰는 대신 이해하고 검사하기 더 쉽게 작성할 방법을 제공한다.
  • 상수는 선언된 스코프 내에서 프로그램이 동작하는 전체 시간 동아 유효합니다. 이러한 특성은, 플레이어가 얻을 수 있는 점수의 최곲이라던가 빛의 속도 같이, 프로그램의 여러 부분에서 알 필요가 있는 값들에 유용하다.
  • 전체 프로그램에 하드코딩된 값에 상수로써 이름을 붙이는 것은 미래의 코드 관리자에게 그 값의 의미를 전달하는데 유용하다. 나중에 업데이트될 하드코딩된 값을 단 한 군데에서 변경할 수 있게 해 준다.

# 섀도잉

  • 새 변수를 이전 변수명과 같은 이름으로 선언할 수 있다. 러스타시안들은 첫 번째 변수가 두 번째 변수에 의해 가려졌다(shadowed)라고 표현하며, 이는 해당 변수의 이름을 사용할 때 컴파일러가 두 번째 변수를 보게 될 것이라는 의미이다.
- + diff --git a/web/20230821-http-method.html b/web/20230821-http-method.html index 3ae3f6f6..a5217c7a 100644 --- a/web/20230821-http-method.html +++ b/web/20230821-http-method.html @@ -7,7 +7,7 @@ - + @@ -19,7 +19,7 @@ GitHub

# 20230821 - HTTP Method

  • 웹 프로그래밍을 차분하게 다시 살펴보고자 한다.
  • 본 글에서는 웹에서 사용하는 메소드(Methods)를 사용하고자 한다.

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부 기능은 메서드 집합 간에 서로 공유하기도 합니다. 이를테면 응답 메서드는 안전하거나, 캐시 가능하거나, 멱등성을 가질 수 있습니다. - Mozilla 공식 문서 - HTTP 요청 메서드

# Method

# GET

  • 서버에서 Resource를 보내도록 요청하는데 사용한다. +

# 20230821 - HTTP Method

  • 웹 프로그래밍을 차분하게 다시 살펴보고자 한다.
  • 본 글에서는 웹에서 사용하는 메소드(Methods)를 사용하고자 한다.

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부 기능은 메서드 집합 간에 서로 공유하기도 합니다. 이를테면 응답 메서드는 안전하거나, 캐시 가능하거나, 멱등성을 가질 수 있습니다. - Mozilla 공식 문서 - HTTP 요청 메서드

# Method

# GET

  • 서버에서 Resource를 보내도록 요청하는데 사용한다.
    • 서버의 Resource를 읽음.
  • 특정 리소스의 표시를 요청, 데이터의 수정 없이 데이터를 받기만 한다.
  • GET과 동일한 응답이지만, 응답에 body가 포함되지 않음.

# POST

  • 특정 리소스를 제출할 때 쓰임. 서버의 상태 변화나 부작용을 일으킬 수도 있음.

# PUT

  • 목적 리소스의 모든 현재 표시를 요청하는 값으로 변경함.

# DELETE

  • 특정한 리소스를 삭제함.

# PATCH

  • 리소스의 특정 부분만 수정함.

# HTTP 메서드 속성

각 HTTP 메서드마다 용도와 특징이 다름. 메서드 속성은 이렇한 특징을 알 수 있는 지표임.

  • 안전(Safe Methods)
  • 멱등(Idempotent Methods)
  • 캐시 가능(Cacheable Methods)
  • 요청에 본문(Body) 존재
  • 성공 응답에 본문(Body) 존재

# 안전(Safe)

  • 안전(Safe)는 호출해도 리소스를 변경하지 않는 메서드 속성.
    • 데이터의 변경이 일어나지 않는다는 뜻.
  • GET 메서드는 단순히 데이터를 가져올 때 사용하는데, 이러한 GET 같은 메서드를 안전(Safe)하다고 함.

# 멱등(Idempotent)

  • 몇 번을 호출하든 최종적인 결과는 똑같은 메서드 속성임.
    • 데이터를 가져오거나(GET), 삭제하거나(DELTE), 완전히 대체하는(PUT) 작업은 몇 번이 수행되건 상관없이 결과는 같음.
    • 특정 데이터를 조회하는 것의 결과는 조회하는 것이고, 특정 데이터를 삭제하는 것의 결과는 그 데이터가 삭제된 것임.
  • POST의 경우는 다름. POST 메서드로 결제를 수행했다고 가정해봄.
    • 해당 POST 메서드가 두 번 호출된다면 결제가 중복해서 발생할 수 있음.
    • 사용자의 돈이나 제품의 수량 같은 데이터가 지속해서 달라짐.
      → 따라서, 이러한 메소드는 멱등하지 않은 것임.
    • 이러한 속성은 서버의 문제로 클라이언트가 같은 요청을 다시해도 되는가?에 대한 판단 근거가 될 수 있음.

# 캐시 기능(Cacheable)

  • 응답 결과 리소스를 캐시해서 사용해도 되는지에 대한 속성임.
    • GET과 HEAD, POST, PATCH 메소드가 이 속성을 가짐.
    • 일반적으로 GET, HEAD 정도만 캐시로 사용함.

# CRUD 관점에서 보면

  • GET: READ
  • POST: Create
  • PUT: Update - 기존의 정보를 덮어 씌움.
  • PATCH: Update - 기존 정보의 일부를 수정함.
  • DELETE: Delete

# 참고한 자료

- +