├── .gitignore
├── LICENSE
├── PREFACE.md
├── Quest00
├── README.md
└── sandbox
│ └── example.txt
├── Quest01
├── README.md
├── screen.png
└── skeleton
│ └── index.html
├── Quest02
├── README.md
└── screen.png
├── Quest03
├── README.md
├── jsStars.png
└── skeleton
│ └── quest.html
├── Quest04
├── README.md
└── skeleton
│ ├── desktop.css
│ ├── desktop.html
│ └── desktop.js
├── Quest05
├── README.md
└── skeleton
│ ├── index.html
│ ├── notepad.js
│ └── style.css
├── Quest06
└── README.md
├── Quest07
├── README.md
└── skeleton
│ ├── cjs-my-project
│ ├── index.js
│ └── package.json
│ ├── cjs-package
│ ├── index.js
│ └── package.json
│ ├── esm-my-project
│ ├── index.mjs
│ └── package.json
│ └── esm-package
│ ├── index.mjs
│ └── package.json
├── Quest08
├── README.md
└── skeleton
│ ├── package.json
│ └── server.mjs
├── Quest09
└── README.md
├── Quest10
└── README.md
├── Quest11
└── README.md
├── Quest12
└── README.md
├── Quest13
└── README.md
├── Quest14
└── README.md
├── Quest15
└── README.md
├── Quest16-B
└── README.md
├── Quest16-F
└── README.md
├── Quest17-B
└── README.md
├── Quest17-F
└── README.md
├── Quest18-B
└── README.md
├── Quest18-F
└── README.md
├── Quest19-B
└── README.md
├── Quest19-F
└── README.md
├── Quest20
└── README.md
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/*
2 | bower_components/*
3 | **/node_modules/*
4 | **/bower_components/*
5 |
6 | **/.DS_Store
7 | **/Thumbs.db
8 | npm-debug.log
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2021 KnowRe <[http://about.knowre.com](http://www.knowre.com)>
4 | Copyright (c) 2021 SeungYun Cho <[http://kivol.net](http://kivol.net)>
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/PREFACE.md:
--------------------------------------------------------------------------------
1 | # Knowre 웹개발 커리큘럼 - 4th Edition, 2021 머리말
2 |
3 | 대 양적완화의 시대입니다. 시중에 돈이 넘쳐나고, 많은 테크기업들이 막대한 투자금으로 좋은 개발자들을 사냥하고 있습니다. 프로 엔지니어를 꿈꾸는 취업준비생들 사이에서는 한국의 IT회사들의 서열을 가리키는 단어도 유행하고 있고, 은근히 그것을 부추기며 그 서열 한켠에 본인의 회사를 끼워넣는 여론을 만들어 내는 사람들도 있습니다.
4 |
5 | 구인 현장에서 한 해에도 세 자리수의 소프트웨어 엔지니어들을 면접하고 팀을 이끌어가는 입장에서, 창업 이후에 올해처럼 어렵고 치열했던 시기가 없었던 것 같습니다. 이런 시장에서 스타트업은 어떤 식으로 살아남아야 할까요?
6 |
7 | 옛날 어떤 농구 감독이 했다는, 전설처럼 내려오는 이야기가 있습니다. '너희들은 공격과 수비 딱 두 가지가 안돼'.. 테크 회사의 엔지니어링 조직 역시 저는 마찬가지라고 생각합니다. 좋은 사람을 뽑고, 좋은 팀을 만들면 됩니다. 문제는 그것을 실행하는 방법이겠지요.
8 |
9 | 좋은 사람을 뽑으려면 무엇보다 좋은 팀이 되어야 합니다. 하지만 좋은 팀이 되려면 좋은 사람들이 필요하죠. 이런 상황을 전산학에서는 데드락Deadlock 이라고 부릅니다. 이러한 데드락을 피하기 위해서는 무언가 다른 전략이 필요할 것입니다.
10 |
11 | 이 커리큘럼은 그러한 질문에 대한 고민의 결과이기도 합니다. 이런 상황에서 스타트업이 취할 수 있는 전략 중 하나는, 좋은 사람들을 직접 키워내는 것입니다. 인력시장에는 포텐셜이 충만하지만 아직 더 완성될 부분이 남아있는 꿈나무 엔지니어들이 많습니다. 저는 이런 엔지니어들에게 좋은 엔지니어로 성장할 수 있는 계기를 제공하고 싶고, 그것은 본인에게도 팀에게도 아주 유익한 일일 것입니다.
12 |
13 | 그렇기 때문에 저는 팀이 커지고 회사가 인수된 지금까지도 10년째 쉬지 않고 그러한 작업을 하고 있습니다. 정확히 세어보진 않았으나 40명 내외의 엔지니어가 저와 이 커리큘럼을 진행했습니다. 그 중에는 아직 저의 팀 동료로 남아있는 사람도 있고 다른 회사로 떠난 사람도 있지만 대부분이 훌륭한 엔지니어로 성장했고, 미국의 가장 큰 테크회사에서부터 스타트업의 키 엔지니어에 이르기까지 다양한 곳에서 활약하고 있습니다.
14 |
15 | ## 이 커리큘럼을 진행하시는 신규 입사자 분들께
16 |
17 | - 여러분들도 이 과정을 통해 프로페셔널 커리어를 설계할 수 있다면 더할나위 없이 좋겠습니다. 이 커리큘럼에서 다루는 지식들도 물론 중요하지만, 그 보다 더 중요한 것은 이 커리큘럼이 이야기하는 소프트웨어 엔지니어로서의 덕목Virtue입니다.
18 | - 이 커리큘럼을 통해 얻은 지식들 중 어떤 것은 자주 쓰지 않아 잊거나 또 언젠가 다시 기억을 되살리게 될 때가 있을 것입니다. 하지만 이 커리큘럼을 통해 얻은 "공부하는 방법"을 잊지 않는다면 틀림없이 몇 년 후에 매력적인 엔지니어로 성장해 있을 것입니다.
19 | - 현업 프로젝트의 일정에 압박받지 않고 기술의 깊은 부분을 공부할 수 있는 기회는 앞으로도 쉽게 오는 것이 아닐 것입니다. 아무쪼록 이번 과정을 통해 커리어를 바꿀만한 좋은 경험을 할 수 있기를 기원합니다.
20 |
21 | ## 이 커리큘럼을 접하신 회사 밖의 분들께
22 |
23 | - 이 커리큘럼을 통해 스터디를 진행하는 경우도 있고, 회사에서 신입의 온보딩을 돕는 경우도 있는 것으로 알고 있습니다. 어떤 경우에도 피드백은 아주 중요합니다. 피드백이 없다면 얻을 수 있는 부분이 제한적이기 때문입니다.
24 | - 퀘스트의 결과물에 대한 피드백은 '이 결과물이 정말 최선인지, 더 개선한다면 어떤 부분을 개선할 수 있을지, 퀘스트를 수행하는 동안 의문스럽거나 꺼림칙한 부분이 있지는 않았는지'를 중심으로 진행하면 좋습니다.
25 | - 체크리스트의 이론적인 부분에 대한 피드백은 여기에 소개된 링크 이외에도 웹의 방대한 자료를 참조하시면 좋으나, 너무 많은 자료가 오히려 갈피를 잡기 어렵게 만들 수도 있을 것입니다. 또한 '어디까지 파고들어야 하나'를 알 수 없어 막막하기도 할 것입니다.
26 | - 그런 경우에는 너무 고민하기보다는 커리큘럼의 총 수행기간을 정해 놓고 진행하는 것도 한 가지 방법일 수 있습니다. Knowre의 경우 이 커리큘럼의 총 수행기간은 풀타임(주 40시간 할애) 기준 2~3개월 정도로 잡고 있으니, 그 정도의 시간을 들인다고 생각하시면 참고가 될 수 있을 것 같습니다.
27 | - 정말 막막하신 경우 저에게 [이메일](mailto:kivoloid@gmail.com)을 보내주셔도 좋습니다. 시간이 닿는 범위에서 최대한 자세히 답변드리도록 하겠습니다.
28 |
29 | 2011년 말, 2012년 초쯤 창업을 했으니 벌써 9~10년이 되었습니다. 그 세월동안 이 커리큘럼 역시 세 번의 변화를 거쳤습니다. 창업하여 첫 팀원을 받으며 초판을 작성한 후로 2015년과 2018년, 그리고 2021년에 크게 리뉴얼을 했으니 책으로 따지면 4판이라고 할 수 있겠습니다. 정확히 3년정도 주기로 리뉴얼을 했는데, 체감상 3년정도면 기술의 트렌드도 많이 바뀌고 중요한 부분도 달라져 기존의 커리큘럼으로 진행해 나가기에는 아쉽게 되는 것 같습니다. 그렇기 때문에 아마 다음 리뉴얼은 2024년쯤이 되지 않을까 싶습니다.
30 |
31 | 자매품으로 데브옵스 신입 엔지니어를 위한 [DevOps 커리큘럼](https://github.com/Knowre-Dev/DevOpsCurriculum)도 새로 만들었으니 참고하시면 좋을 것 같습니다.
32 |
--------------------------------------------------------------------------------
/Quest00/README.md:
--------------------------------------------------------------------------------
1 | # Quest 00. 형상관리 시스템
2 |
3 | ## Introduction
4 | * git은 2021년 현재 개발 생태계에서 가장 각광받고 있는 버전 관리 시스템입니다. 이번 퀘스트를 통해 git의 기초적인 사용법을 알아볼 예정입니다.
5 |
6 | ## Topics
7 | * git
8 | * `git clone`, `git add`, `git commit`, `git push`, `git pull`, `git branch`, `git stash` 명령
9 | * `.git` 폴더
10 | * GitHub
11 |
12 | ## Resources
13 | * [Resources to learn Git](https://try.github.io)
14 | * [Learn Git Branching](https://learngitbranching.js.org/?locale=ko)
15 | * [Inside Git: .Git directory](https://githowto.com/git_internals_git_directory)
16 |
17 | ## Checklist
18 | * 형상관리 시스템은 왜 나오게 되었을까요?
19 | * git은 어떤 형상관리 시스템이고 어떤 특징을 가지고 있을까요? 분산형 형상관리 시스템이란 무엇일까요?
20 | * git은 어떻게 개발되게 되었을까요? git이 분산형 시스템을 채택한 이유는 무엇일까요?
21 | * git과 GitHub은 어떻게 다를까요?
22 | * git의 clone/add/commit/push/pull/branch/stash 명령은 무엇이며 어떨 때 이용하나요? 그리고 어떻게 사용하나요?
23 | * git의 Object, Commit, Head, Branch, Tag는 어떤 개념일까요? git 시스템은 프로젝트의 히스토리를 어떻게 저장할까요?
24 | * 리모트 git 저장소에 원하지 않는 파일이 올라갔을 때 이를 되돌리려면 어떻게 해야 할까요?
25 |
26 | ## Quest
27 | * GitHub에 가입한 뒤, [이 커리큘럼의 GitHub 저장소](https://github.com/KnowRe-Dev/WebDevCurriculum)의 우상단의 Fork 버튼을 눌러 자신의 저장소에 복사해 둡니다.
28 | * Windows의 경우 같이 설치된 git shell을, MacOSX의 경우 터미널을 실행시켜 커맨드라인에 들어간 뒤, 명령어를 이용하여 복사한 저장소를 clone합니다.
29 | * 앞으로의 git 작업은 되도록 커맨드라인을 통해 하는 것을 권장합니다.
30 | * 이 문서가 있는 폴더 바로 밑에 있는 sandbox 폴더에 파일을 추가한 후 커밋해 보기도 하고, 파일을 삭제해 보기도 하고, 수정해 보기도 하면서 각각의 단계에서 커밋했을 때 어떤 것들이 저장되는지를 확인합니다.
31 | * `clone`/`add`/`commit`/`push`/`pull`/`branch`/`stash` 명령을 충분히 익혔다고 생각되면, 자신의 저장소에 이력을 push합니다.
32 |
33 | ## Advanced
34 | * Mercurial은 어떤 형상관리 시스템일까요? 어떤 장점이 있을까요?
35 | * 실리콘밸리의 테크 대기업들은 어떤 형상관리 시스템을 쓰고 있을까요?
36 |
--------------------------------------------------------------------------------
/Quest00/sandbox/example.txt:
--------------------------------------------------------------------------------
1 | Hello World!
2 |
--------------------------------------------------------------------------------
/Quest01/README.md:
--------------------------------------------------------------------------------
1 | # Quest 01. HTML과 웹의 기초
2 |
3 | ## Introduction
4 | * HTML은 HyperText Markup Language의 약자로, 웹 브라우저에 내용을 표시하기 위한 가장 기본적인 언어입니다. 이번 퀘스트를 통해 HTML에 관한 기초적인 사항들을 알아볼 예정입니다.
5 |
6 | ## Topics
7 | * HTML의 역사
8 | * HTML 4.01, XHTML 1.0, XHTML 1.1
9 | * XHTML 2.0과 HTML5의 대립
10 | * HTML5와 현재
11 | * 브라우저의 역사
12 | * Mosaic와 Netscape
13 | * Internet Explorer의 독점시대
14 | * Firefox와 Chrome의 등장
15 | * iOS Safari와 모바일 환경의 브라우저
16 | * Edge와 Whale 등의 최근의 Chromium 계열 브라우저
17 | * HTML 문서의 구조
18 | * ``, `
`와 `` 등의 HTML 문서의 기본 구조
19 | * 시맨틱 엘리먼트
20 | * 블록 엘리먼트와 인라인 엘리먼트의 차이
21 |
22 | ## Resources
23 | * [MDN - HTML](https://developer.mozilla.org/ko/docs/Web/HTML)
24 | * [HTML For Beginners](https://html.com/)
25 | * [History of the web browser](https://en.wikipedia.org/wiki/History_of_the_web_browser)
26 | * [History of HTML](https://en.wikipedia.org/wiki/HTML)
27 | * [StatCounter](https://gs.statcounter.com/)
28 |
29 | ## Checklist
30 | * HTML 표준의 역사는 어떻게 될까요?
31 | * HTML 표준을 지키는 것은 왜 중요할까요?
32 | * XHTML 2.0은 왜 세상에 나오지 못하게 되었을까요?
33 | * HTML5 표준은 어떤 과정을 통해 정해질까요?
34 | * 브라우저의 역사는 어떻게 될까요?
35 | * Internet Explorer가 브라우저 시장을 독점하면서 어떤 문제가 일어났고, 이 문제는 어떻게 해결되었을까요?
36 | * 현재 시점에 브라우저별 점유율은 어떻게 될까요? 이 브라우저별 점유율을 알아보는 것은 왜 중요할까요?
37 | * 브라우저 엔진(렌더링 엔진)이란 무엇일까요? 어떤 브라우저들이 어떤 엔진을 쓸까요?
38 | * 모바일 시대 이후, 최근에 출시된 브라우저들은 어떤 특징을 가지고 있을까요?
39 | * HTML 문서는 어떤 구조로 이루어져 있나요?
40 | * ``에 자주 들어가는 엘리먼트들은 어떤 것이 있고, 어떤 역할을 할까요?
41 | * 시맨틱 태그는 무엇일까요?
42 | * 시맨틱 엘리먼트를 사용하면 어떤 점이 좋을까요?
43 | * ``과 ``, `
`, ``, `` 엘리먼트의 차이점은 무엇인가요?
44 | * 블록 레벨 엘리먼트와 인라인 엘리먼트는 어떤 차이가 있을까요?
45 |
46 | ## Quest
47 | * [이 화면](screen.png)의 정보를 HTML 문서로 표현해 보세요. 다만 CSS를 전혀 사용하지 않고, 문서의 구조가 어떻게 되어 있는지를 파악하여 구현해 보세요.
48 | * [CSS Naked Day](https://css-naked-day.github.io/)는 매년 4월 9일에 CSS 없는 웹 페이지를 공개하여 내용과 마크업에 집중한 HTML 구조의 중요성을 강조하는 행사입니다.
49 | * 폴더에 있는 `skeleton.html` 파일을 바탕으로 작업해 보시면 됩니다.
50 | * 화면을 구성하는 큰 요소들을 어떻게 처리하면 좋을까요?
51 | * HTML 문서상에서 같은 층위에 비슷한 요소들이 반복될 때는 어떤 식으로 처리하는 것이 좋을까요?
52 |
53 | ## Advanced
54 | * XML은 어떤 표준일까요? 어떤 식으로 발전해 왔을까요?
55 | * YML, Markdown 등 다른 마크업 언어들은 어떤 특징을 가지고 있고, 어떤 용도로 쓰일까요?
56 |
--------------------------------------------------------------------------------
/Quest01/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Knowre-Dev/WebDevCurriculum/d87147b0381c6af1ed229725235bebbb94b2a1a0/Quest01/screen.png
--------------------------------------------------------------------------------
/Quest01/skeleton/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
12 |
15 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Quest02/README.md:
--------------------------------------------------------------------------------
1 | # Quest 02. CSS의 기초와 응용
2 |
3 | ## Introduction
4 | * CSS는 Cascading StyleSheet의 약자입니다. 웹브라우저에 표시되는 HTML 문서의 스타일을 지정하는 (거의) 유일하지만 다루기 쉽지 않은 언어입니다. 이번 퀘스트를 통해 CSS의 기초적인 레이아웃 작성법을 알아볼 예정입니다.
5 |
6 | ## Topics
7 | * CSS의 기초 문법과 적용 방법
8 | * Inline, `
19 |
20 |
21 |
27 |
28 |
34 |
35 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/Quest04/README.md:
--------------------------------------------------------------------------------
1 | # Quest 04. OOP의 기본
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 바닐라 자바스크립트의 객체지향 프로그래밍에 대해 알아볼 예정입니다.
5 |
6 | ## Topics
7 | * 객체지향 프로그래밍
8 | * 프로토타입 기반 객체지향 프로그래밍
9 | * 자바스크립트 클래스
10 | * 생성자
11 | * 멤버 함수
12 | * 멤버 변수
13 | * 정보의 은폐
14 | * 다형성
15 | * 코드의 재사용
16 |
17 | ## Resources
18 | * [MDN - Classes](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes)
19 | * [MDN - Inheritance and the prototype chain](https://developer.mozilla.org/ko/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)
20 | * [MDN - Inheritance](https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Inheritance)
21 | * [Polymorphism](https://medium.com/@viktor.kukurba/object-oriented-programming-in-javascript-3-polymorphism-fb564c9f1ce8)
22 | * [Class Composition](https://alligator.io/js/class-composition/)
23 | * [Inheritance vs Composition](https://woowacourse.github.io/javable/post/2020-05-18-inheritance-vs-composition/)
24 |
25 | ## Checklist
26 | * 객체지향 프로그래밍은 무엇일까요?
27 | * `#`로 시작하는 프라이빗 필드는 왜 필요한 것일까요? 정보를 은폐(encapsulation)하면 어떤 장점이 있을까요?
28 | * 다형성이란 무엇인가요? 다형성은 어떻게 코드 구조의 정리를 도와주나요?
29 | * 상속이란 무엇인가요? 상속을 할 때의 장점과 단점은 무엇인가요?
30 | * OOP의 합성(Composition)이란 무엇인가요? 합성이 상속에 비해 가지는 장점은 무엇일까요?
31 | * 자바스크립트의 클래스는 어떻게 정의할까요?
32 | * 프로토타입 기반의 객체지향 프로그래밍은 무엇일까요?
33 | * 자바스크립트의 클래스는 이전의 프로토타입 기반의 객체지향 구현과 어떤 관계를 가지고 있나요?
34 |
35 | ## Quest
36 | * 웹 상에서 동작하는 간단한 바탕화면 시스템을 만들 예정입니다.
37 | * 요구사항은 다음과 같습니다:
38 | * 아이콘은 폴더와 일반 아이콘, 두 가지의 종류가 있습니다.
39 | * 아이콘들을 드래그를 통해 움직일 수 있어야 합니다.
40 | * 폴더 아이콘은 더블클릭하면 해당 폴더가 창으로 열리며, 열린 폴더의 창 역시 드래그를 통해 움직일 수 있어야 합니다.
41 | * 바탕화면의 생성자를 통해 처음에 생겨날 아이콘과 폴더의 개수를 받을 수 있습니다.
42 | * 여러 개의 바탕화면을 각각 다른 DOM 엘리먼트에서 동시에 운영할 수 있습니다.
43 | * Drag & Drop API를 사용하지 말고, 실제 마우스 이벤트(mouseover, mousedown, mouseout 등)를 사용하여 구현해 보세요!
44 |
45 | ## Advanced
46 | * 객체지향의 역사는 어떻게 될까요?
47 | * Smalltalk, Java, Go, Kotlin 등의 언어들로 넘어오면서 객체지향 패러다임 측면에서 어떤 발전이 있었을까요?
48 |
--------------------------------------------------------------------------------
/Quest04/skeleton/desktop.css:
--------------------------------------------------------------------------------
1 | /* TODO: 자유롭게 바탕화면 시스템의 CSS를 만들어 보세요! */
2 |
--------------------------------------------------------------------------------
/Quest04/skeleton/desktop.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Quest04/skeleton/desktop.js:
--------------------------------------------------------------------------------
1 | class Desktop {
2 | /* TODO: Desktop 클래스는 어떤 멤버함수와 멤버변수를 가져야 할까요? */
3 | };
4 |
5 | class Icon {
6 | /* TODO: Icon 클래스는 어떤 멤버함수와 멤버변수를 가져야 할까요? */
7 | };
8 |
9 | class Folder {
10 | /* TODO: Folder 클래스는 어떤 멤버함수와 멤버변수를 가져야 할까요? */
11 | };
12 |
13 | class Window {
14 | /* TODO: Window 클래스는 어떤 멤버함수와 멤버변수를 가져야 할까요? */
15 | };
16 |
--------------------------------------------------------------------------------
/Quest05/README.md:
--------------------------------------------------------------------------------
1 | # Quest 05. OOP 특훈
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 바닐라 자바스크립트의 객체지향 프로그래밍을 조금 더 훈련해 보겠습니다.
5 |
6 | ## Topics
7 | * Separation of Concerns
8 | * 객체지향의 설계 원칙
9 | * SOLID 원칙
10 | * Local Storage
11 |
12 | ## Resources
13 | * [Separation of concerns](https://jonbellah.com/articles/separation-of-concerns/)
14 | * [SOLID](https://en.wikipedia.org/wiki/SOLID)
15 | * [객체지향 설계 5원칙](https://webdoli.tistory.com/210)
16 | * [MDN - Local Storage](https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage)
17 |
18 | ## Checklist
19 | * 관심사의 분리 원칙이란 무엇인가요? 웹에서는 이러한 원칙이 어떻게 적용되나요?
20 | * 객체지향의 SOLID 원칙이란 무엇인가요? 이 원칙을 구체적인 예를 들어 설명할 수 있나요?
21 | * 로컬 스토리지란 무엇인가요? 로컬 스토리지의 내용을 개발자 도구를 이용해 확인하려면 어떻게 해야 할까요?
22 |
23 | ## Quest
24 | * 외부 라이브러리나 프레임워크를 사용하지 않고, 자바스크립트를 이용하여 간단한 웹브라우저 기반의 텍스트 에디터를 만들어 보겠습니다.
25 | * 기본적으로 VSCode와 같이 탭을 이용해 여러 개의 파일을 동시에 편집할 수 있습니다.
26 | * 탭을 눌러 열려 있는 다른 파일을 편집할 수 있으며 탭을 언제든지 닫을 수 있습니다.
27 | * VSCode와 같이 새 파일, 로드, 저장, 다른 이름으로 저장 등의 기능을 가집니다. 저장은 웹 브라우저의 로컬 스토리지를 이용합니다.
28 | * VSCode와 같이 탭이 수정되었는데 저장되기 이전일 경우 이를 알려주는 인디케이터가 작동합니다.
29 | * 같은 이름의 파일을 저장할 경우 에러를 표시해야 합니다.
30 | * 이번 퀘스트의 결과물은 앞으로의 많은 퀘스트에서 재사용되게 되니, 주의깊게 코드를 작성해 보세요!
31 |
32 | ## Advanced
33 | * 웹 프론트엔드 개발에서 이러한 방식의 패턴을 더 일반화해서 정리할 수 있을까요? 이 퀘스트에서 각각의 클래스들이 공통적으로 수행하게 되는 일들에는 무엇이 있을까요?
34 |
--------------------------------------------------------------------------------
/Quest05/skeleton/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Quest05/skeleton/notepad.js:
--------------------------------------------------------------------------------
1 | class Notepad {
2 | /* TODO: 그 외에 또 어떤 클래스와 메소드가 정의되어야 할까요? */
3 | };
4 |
--------------------------------------------------------------------------------
/Quest05/skeleton/style.css:
--------------------------------------------------------------------------------
1 | * {
2 | /* TODO: 필요한 CSS를 채워넣어 보세요! */
3 | }
4 |
--------------------------------------------------------------------------------
/Quest06/README.md:
--------------------------------------------------------------------------------
1 | # Quest 06. 인터넷의 이해
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 인터넷이 어떻게 동작하며, 서버와 클라이언트, 웹 브라우저 등의 역할은 무엇인지 알아보겠습니다.
5 |
6 | ## Topics
7 | * 서버와 클라이언트, 그리고 웹 브라우저
8 | * 인터넷을 구성하는 여러 가지 프로토콜
9 | * IP
10 | * TCP
11 | * HTTP
12 | * DNS
13 |
14 | ## Resources
15 | * [OSI 모형](https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95)
16 | * [IP](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)
17 | * [Online service Traceroute](http://ping.eu/traceroute/)
18 | * [TCP](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)
19 | * [Wireshark](https://www.wireshark.org/download.html)
20 | * [HTTP](https://ko.wikipedia.org/wiki/HTTP)
21 | * Chrome developer tool, Network tab
22 | * [DNS](https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EB%84%A4%EC%9E%84_%EC%8B%9C%EC%8A%A4%ED%85%9C)
23 | * [Web-based Dig](http://networking.ringofsaturn.com/Tools/dig.php)
24 |
25 | ## Checklist
26 | * 인터넷은 어떻게 동작하나요? Internet Protocol Suite의 레이어 모델에 입각하여 설명해 보세요.
27 | * 근거리에서 서로 떨어진 두 전자기기가 유선/무선으로 서로 통신하는 프로토콜은 어떻게 동작할까요?
28 | * 근거리에 있는 여러 대의 전자기기가 서로 통신하는 프로토콜은 어떻게 동작할까요?
29 | * 아주 멀리 떨어져 있는 두 전자기기가 유선/무선으로 서로 통신하는 프로토콜은 어떻게 동작할까요?
30 | * 두 전자기기가 신뢰성을 가지고 통신할 수 있도록 하기 위한 프로토콜은 어떻게 동작할까요?
31 | * HTTP는 어떻게 동작할까요?
32 | * 우리가 브라우저의 주소 창에 www.knowre.com 을 쳤을 때, 어떤 과정을 통해 서버의 IP 주소를 알게 될까요?
33 |
34 | ## Quest
35 | * tracert(Windows가 아닌 경우 traceroute) 명령을 통해 www.google.com 까지 가는 경로를 찾아 보세요.
36 | * 어떤 IP주소들이 있나요?
37 | * 그 IP주소들은 어디에 위치해 있나요?
38 | * Wireshark를 통해 www.google.com 으로 요청을 날렸을 떄 어떤 TCP 패킷이 오가는지 확인해 보세요
39 | * TCP 패킷을 주고받는 과정은 어떻게 되나요?
40 | * 각각의 패킷에 어떤 정보들이 담겨 있나요?
41 | * telnet 명령을 통해 http://www.google.com/ URL에 HTTP 요청을 날려 보세요.
42 | * 어떤 헤더들이 있나요?
43 | * 그 헤더들은 어떤 역할을 하나요?
44 |
45 | ## Advanced
46 | * HTTP의 최신 버전인 HTTP/3는 어떤 식으로 구성되어 있을까요?
47 | * TCP/IP 외에 전세계적인 네트워크를 구성하기 위한 다른 방식도 제안된 바 있을까요?
48 |
--------------------------------------------------------------------------------
/Quest07/README.md:
--------------------------------------------------------------------------------
1 | # Quest 07. node.js의 기초
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 node.js의 기본적인 구조와 개념에 대해 알아 보겠습니다.
5 |
6 | ## Topics
7 | * node.js
8 | * npm
9 | * CommonJS와 ES Modules
10 |
11 | ## Resources
12 | * [About node.js](https://nodejs.org/ko/about/)
13 | * [Node.js의 아키텍쳐](https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/174356/node-js%EC%9D%98-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90)
14 | * [npm](https://docs.npmjs.com/about-npm)
15 | * [npm CLI commands](https://docs.npmjs.com/cli/v7/commands)
16 | * [npm - package.json](https://docs.npmjs.com/cli/v7/configuring-npm/package-json)
17 | * [How NodeJS Require works!](https://www.thirdrocktechkno.com/blog/how-nodejs-require-works)
18 | * [MDN - JavaScript Modules](https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Modules)
19 | * [ES modules: A cartoon deep-dive](https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/)
20 | * [require vs import](https://www.geeksforgeeks.org/difference-between-node-js-require-and-es6-import-and-export/)
21 |
22 | ## Checklist
23 | * node.js는 무엇인가요? node.js의 내부는 어떻게 구성되어 있을까요?
24 | * npm이 무엇인가요? `package.json` 파일은 어떤 필드들로 구성되어 있나요?
25 | * npx는 어떤 명령인가요? npm 패키지를 `-g` 옵션을 통해 글로벌로 저장하는 것과 그렇지 않은 것은 어떻게 다른가요?
26 | * 자바스크립트 코드에서 다른 파일의 코드를 부르는 시도들은 지금까지 어떤 것이 있었을까요? CommonJS 대신 ES Modules가 등장한 이유는 무엇일까요?
27 | * ES Modules는 기존의 `require()`와 동작상에 어떤 차이가 있을까요? CommonJS는 할 수 있으나 ES Modules가 할 수 없는 일에는 어떤 것이 있을까요?
28 | * node.js에서 ES Modules를 사용하려면 어떻게 해야 할까요? ES Modules 기반의 코드에서 CommonJS 기반의 패키지를 불러오려면 어떻게 해야 할까요? 그 반대는 어떻게 될까요?
29 |
30 | ## Quest
31 | * 스켈레톤 코드에는 다음과 같은 네 개의 패키지가 있으며, 용도는 다음과 같습니다:
32 | * `cjs-package`: CommonJS 기반의 패키지입니다. 다른 코드가 이 패키지의 함수와 내용을 참조하게 됩니다.
33 | * `esm-package`: ES Modules 기반의 패키지입니다. 다른 코드가 이 패키지의 함수와 내용을 참조하게 됩니다.
34 | * `cjs-my-project`: `cjs-package`와 `esm-package`에 모두 의존하는, CommonJS 기반의 프로젝트입니다.
35 | * `esm-my-project`: `cjs-package`와 `esm-package`에 모두 의존하는, ES Modules 기반의 프로젝트입니다.
36 | * 각각의 패키지의 `package.json`과 `index.js` 또는 `index.mjs` 파일을 수정하여, 각각의 `*-my-project`들이 `*-package`에 노출된 함수와 클래스를 활용할 수 있도록 만들어 보세요.
37 |
38 | ## Advanced
39 | * node.js 외의 자바스크립트 런타임에는 어떤 것이 있을까요?
40 |
--------------------------------------------------------------------------------
/Quest07/skeleton/cjs-my-project/index.js:
--------------------------------------------------------------------------------
1 | // TODO: cjs-package와 esm-package의 함수와 클래스들을 가져다 쓰고 활용하려면 어떻게 해야 할까요?
2 |
--------------------------------------------------------------------------------
/Quest07/skeleton/cjs-my-project/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cjs-my-project"
3 | }
4 |
--------------------------------------------------------------------------------
/Quest07/skeleton/cjs-package/index.js:
--------------------------------------------------------------------------------
1 | class CjsUtilClass {
2 | constructor(foo) {
3 | this.foo = foo;
4 | }
5 |
6 | double() {
7 | return foo * 2;
8 | }
9 | }
10 |
11 | const cjsUtilFunction = str => {
12 | return str.toUpperCase();
13 | };
14 |
15 | // TODO: 다른 패키지가 CjsUtilClass와 cjsUtilFunction를 가져다 쓰려면 어떻게 해야 할까요?
16 |
--------------------------------------------------------------------------------
/Quest07/skeleton/cjs-package/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cjs-package"
3 | }
4 |
--------------------------------------------------------------------------------
/Quest07/skeleton/esm-my-project/index.mjs:
--------------------------------------------------------------------------------
1 | // TODO: cjs-package와 esm-package의 함수와 클래스들을 가져다 쓰고 활용하려면 어떻게 해야 할까요?
2 |
--------------------------------------------------------------------------------
/Quest07/skeleton/esm-my-project/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "esm-my-project"
3 | }
4 |
--------------------------------------------------------------------------------
/Quest07/skeleton/esm-package/index.mjs:
--------------------------------------------------------------------------------
1 | class EsmUtilClass {
2 | constructor(foo) {
3 | this.foo = foo;
4 | }
5 |
6 | double() {
7 | return foo * 2;
8 | }
9 | }
10 |
11 | const esmUtilFunction = str => {
12 | return str.toUpperCase();
13 | };
14 |
15 | // TODO: 다른 패키지가 EsmUtilClass와 esmUtilFunction를 가져다 쓰려면 어떻게 해야 할까요?
16 |
--------------------------------------------------------------------------------
/Quest07/skeleton/esm-package/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "esm-package"
3 | }
4 |
--------------------------------------------------------------------------------
/Quest08/README.md:
--------------------------------------------------------------------------------
1 | # Quest 08. 웹 API의 기초
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 웹 API 서버의 기초를 알아보겠습니다.
5 |
6 | ## Topics
7 | * HTTP Method
8 | * node.js `http` module
9 | * `req`와 `res` 객체
10 |
11 | ## Resources
12 | * [MDN - Content-Type Header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)
13 | * [MDN - HTTP Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)
14 | * [MDN - MIME Type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type)
15 | * [Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop)
16 | * [HTTP Node.js Manual & Documentation](https://nodejs.org/api/http.html)
17 |
18 | ## Checklist
19 | * HTTP의 GET과 POST 메소드는 어떻게 다른가요?
20 | * 다른 HTTP 메소드에는 무엇이 있나요?
21 | * HTTP 서버에 GET과 POST를 통해 데이터를 보내려면 어떻게 해야 하나요?
22 | * HTTP 요청의 `Content-Type` 헤더는 무엇인가요?
23 | * Postman에서 POST 요청을 보내는 여러 가지 방법(`form-data`, `x-www-form-urlencoded`, `raw`, `binary`) 각각은 어떤 용도를 가지고 있나요?
24 | * node.js의 `http` 모듈을 통해 HTTP 요청을 처리할 때,
25 | * `req`와 `res` 객체에는 어떤 정보가 담겨있을까요?
26 | * GET과 POST에 대한 처리 형태가 달라지는 이유는 무엇인가요?
27 | * 만약 API 엔드포인트(URL)가 아주 많다고 한다면, HTTP POST 요청의 `Content-Type` 헤더에 따라 다른 방식으로 동작하는 서버를 어떻게 정리하면 좋을까요?
28 | * 그 밖에 서버가 요청들에 따라 공통적으로 처리하는 일에는 무엇이 있을까요? 이를 어떻게 정리하면 좋을까요?
29 |
30 | ## Quest
31 | * 다음의 동작을 하는 서버를 만들어 보세요.
32 | * 브라우저의 주소창에 `http://localhost:8080`을 치면 `Hello World!`를 응답하여 브라우저에 출력합니다.
33 | * 서버의 `/foo` URL에 `bar` 변수로 임의의 문자열을 GET 메소드로 보내면, `Hello, [문자열]`을 출력합니다.
34 | * 서버의 `/foo` URL에 `bar` 키에 임의의 문자열 값을 갖는 JSON 객체를 POST 메소드로 보내면, `Hello, [문자열]`을 출력합니다.
35 | * 서버의 `/pic/upload` URL에 그림 파일을 POST 하면 서버에 보안상 적절한 방법으로 파일이 업로드 됩니다.
36 | * 서버의 `/pic/show` URL을 GET 하면 브라우저에 위에 업로드한 그림이 뜹니다.
37 | * 서버의 `/pic/download` URL을 GET 하면 브라우저에 위에 업로드한 그림이 `pic.jpg`라는 이름으로 다운로드 됩니다.
38 | * expressJS와 같은 외부 프레임워크를 사용하지 않고, node.js의 기본 모듈만을 사용해서 만들어 보세요.
39 | * 처리하는 요청의 종류에 따라 공통적으로 나타나는 코드를 정리해 보세요.
40 |
41 | ## Advanced
42 | * 서버가 파일 업로드를 지원할 때 보안상 주의할 점에는 무엇이 있을까요?
43 |
--------------------------------------------------------------------------------
/Quest08/skeleton/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "quest08"
3 | }
4 |
--------------------------------------------------------------------------------
/Quest08/skeleton/server.mjs:
--------------------------------------------------------------------------------
1 | import http from 'http';
2 |
3 | const server = http.createServer((req, res) => {
4 | /* TODO: 각각의 URL들을 어떻게 처리하면 좋을까요? */
5 | res.end();
6 | });
7 |
8 | server.listen(8000);
9 |
--------------------------------------------------------------------------------
/Quest09/README.md:
--------------------------------------------------------------------------------
1 | # Quest 09. 서버와 클라이언트의 대화
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 서버와 클라이언트의 연동, 그리고 웹 API의 설계 방법론 중 하나인 REST에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * expressJS, fastify
8 | * AJAX, `XMLHttpRequest`, `fetch()`
9 | * REST, CRUD
10 | * CORS
11 |
12 | ## Resources
13 | * [Express Framework](http://expressjs.com/)
14 | * [Fastify Framework](https://www.fastify.io/)
15 | * [MDN - Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
16 | * [MDN - XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest)
17 | * [REST API Tutorial](https://restfulapi.net/)
18 | * [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete)
19 | * [MDN - CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
20 |
21 | ## Checklist
22 | * 비동기 프로그래밍이란 무엇인가요?
23 | * 콜백을 통해 비동기적 작업을 할 때의 불편한 점은 무엇인가요? 콜백지옥이란 무엇인가요?
24 | * 자바스크립트의 Promise는 어떤 객체이고 어떤 일을 하나요?
25 | * 자바스크립트의 `async`와 `await` 키워드는 어떤 역할을 하며 그 정체는 무엇일까요?
26 | * 브라우저 내 스크립트에서 외부 리소스를 가져오려면 어떻게 해야 할까요?
27 | * 브라우저의 `XMLHttpRequest` 객체는 무엇이고 어떻게 동작하나요?
28 | * `fetch` API는 무엇이고 어떻게 동작하나요?
29 | * REST는 무엇인가요?
30 | * REST API는 어떤 목적을 달성하기 위해 나왔고 어떤 장점을 가지고 있나요?
31 | * RESTful한 API 설계의 단점은 무엇인가요?
32 | * CORS란 무엇인가요? 이러한 기능이 왜 필요할까요? CORS는 어떻게 구현될까요?
33 |
34 | ## Quest
35 | * 이번 퀘스트는 Midterm에 해당하는 과제입니다. 분량이 제법 많으니 한 번 기능별로 세부 일정을 정해 보고, 과제 완수 후에 그 일정이 얼마나 지켜졌는지 스스로 한 번 돌아보세요.
36 | * 이번 퀘스트부터는 skeleton을 제공하지 않습니다!
37 | * Quest 05에서 만든 메모장 시스템을 서버와 연동하는 어플리케이션으로 만들어 보겠습니다.
38 | * 클라이언트는 `fetch` API를 통해 서버와 통신합니다.
39 | * 서버는 8000번 포트에 REST API를 엔드포인트로 제공하여, 클라이언트의 요청에 응답합니다.
40 | * 클라이언트로부터 온 새 파일 저장, 삭제, 다른 이름으로 저장 등의 요청을 받아 서버의 로컬 파일시스템을 통해 저장되어야 합니다.
41 | * 서버에 어떤 식으로 저장하는 것이 좋을까요?
42 | * API 서버 외에, 클라이언트를 띄우기 위한 서버가 3000번 포트로 따로 떠서 API 서버와 서로 통신할 수 있어야 합니다.
43 | * Express나 Fastify 등의 프레임워크를 사용해도 무방합니다.
44 | * 클라이언트 프로젝트와 서버 프로젝트 모두 `npm i`만으로 디펜던시를 설치하고 바로 실행될 수 있게 제출되어야 합니다.
45 | * 이번 퀘스트부터는 앞의 퀘스트의 결과물에 의존적인 경우가 많습니다. 제출 폴더를 직접 만들어 제출해 보세요!
46 |
47 | ## Advanced
48 | * `fetch` API는 구현할 수 없지만 `XMLHttpRequest`로는 구현할 수 있는 기능이 있을까요?
49 | * REST 이전에는 HTTP API에 어떤 패러다임들이 있었을까요? REST의 대안으로는 어떤 것들이 제시되고 있을까요?
50 |
--------------------------------------------------------------------------------
/Quest10/README.md:
--------------------------------------------------------------------------------
1 | # Quest 10. 인증의 이해
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 웹에서의 인증에 관해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Cookie
8 | * Session
9 | * JWT
10 |
11 | ## Resources
12 | * [MDN - HTTP 쿠키](https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies)
13 | * [Cookies and Sessions](https://web.stanford.edu/~ouster/cgi-bin/cs142-fall10/lecture.php?topic=cookie)
14 | * [JWT](https://jwt.io/)
15 |
16 | ## Checklist
17 | * 쿠키란 무엇일까요?
18 | * 쿠키는 어떤 식으로 동작하나요?
19 | * 쿠키는 어떤 식으로 서버와 클라이언트 사이에 정보를 주고받나요?
20 | * 웹 어플리케이션의 세션이란 무엇일까요?
21 | * 세션의 ID와 내용은 각각 어디에 저장되고 어떻게 서버와 교환되나요?
22 | * JWT란 무엇인가요?
23 | * JWT 토큰은 어디에 저장되고 어떻게 서버와 교환되나요?
24 | * 세션에 비해 JWT가 가지는 장점은 무엇인가요? 또 JWT에 비해 세션이 가지는 장점은 무엇인가요?
25 |
26 | ## Quest
27 | * 이번에는 메모장 시스템에 로그인 기능을 넣고자 합니다.
28 | * 사용자는 딱 세 명만 존재한다고 가정하고, 아이디와 비밀번호, 사용자의 닉네임은 하드코딩해도 무방합니다.
29 | * 로그인했을 때 해당 사용자가 이전에 작업했던 탭들과 마지막으로 활성화된 탭 등의 상태가 로딩 되어야 합니다.
30 | * 세션을 이용한 버전과, JWT를 이용한 버전 두 가지를 만들어 보세요!
31 | * 세션을 이용할 경우 세션은 서버의 메모리나 파일에 저장하면 됩니다.
32 |
33 | ## Advanced
34 | * Web Authentication API(WebAuthn)은 무엇인가요?
35 |
--------------------------------------------------------------------------------
/Quest11/README.md:
--------------------------------------------------------------------------------
1 | # Quest 11. RDB의 기초와 ORM
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 데이터베이스를 다루는 방법에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * RDBMS
8 | * MySQL
9 | * ORM
10 | * Hash
11 | * scrypt
12 |
13 | ## Resources
14 | * [MySQL 101 – The basics](https://www.globo.tech/learning-center/mysql-101-basics/)
15 | * [Sequelize](https://sequelize.org/)
16 | * [안전한 패스워드 저장](https://d2.naver.com/helloworld/318732)
17 |
18 | ## Checklist
19 | * RDBMS 테이블의 정규화는 무엇인가요?
20 | * MySQL 외의 RDB에는 어떤 것들이 있나요?
21 | * Relational Database 외에 다른 DB에는 어떤 것들이 있을까요?
22 | * RDBMS에서 테이블의 인덱싱은 무엇인가요? 인덱싱을 하면 어떤 점이 다르며, 어떤 식으로 동작하나요?
23 | * ORM을 사용하는 것은 사용하지 않는 것에 비해 어떤 장단점을 가지고 있나요?
24 | * 자바스크립트 생태계의 ORM에는 어떤 것들이 있나요?
25 | * 모델간의 1:1, 1:N, N:M 관계는 각각 무엇이고 어떨 때 사용하나요?
26 | * DB에 사용자의 암호를 평문으로 저장하지 않고도 사용자의 암호를 인증하는 것이 가능한 이유는 무엇일까요?
27 | * 해시 함수에는 어떤 것이 있나요?
28 | * 사용자의 암호를 해싱하여 저장할 때 어떤 식으로 저장하는 것이 보안에 좋을까요?
29 |
30 | ## Quest
31 | * 이번에는 메모장을 파일이 아닌 DB기반으로 만들어 보고자 합니다.
32 | * 적절한 테이블을 설계해 보세요.
33 | * Sequelize를 이용하여 데이터의 모델을 만들고 어플리케이션에 적용해 보세요.
34 | * 사용자의 비밀번호는 해싱을 통해 저장되어야 합니다.
35 |
36 | ## Advanced
37 | * Object–relational impedance mismatch란 어떤 개념인가요?
38 | * Foreign Key란 무엇인가요? 이것을 사용할 때의 장점과 단점은 무엇일까요?
39 | * 이전에 쓰이던 해시함수들에는 어떤 것이 있을까요? 패스워드 해싱의 추세의 역사는 어떻게 이어져왔나요?
40 |
--------------------------------------------------------------------------------
/Quest12/README.md:
--------------------------------------------------------------------------------
1 | # Quest 12. 보안의 기초
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 가장 기초적인 웹 서비스 보안에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * XSS, CSRF, SQL Injection
8 | * HTTPS, TLS
9 |
10 | ## Resources
11 | * [The Basics of Web Application Security](https://martinfowler.com/articles/web-security-basics.html)
12 | * [Website Security 101](https://spyrestudios.com/web-security-101/)
13 | * [Web Security Fundamentals](https://www.shopify.com.ng/partners/blog/web-security-2018)
14 | * [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
15 | * [Wikipedia - TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security)
16 |
17 | ## Checklist
18 | * 입력 데이터의 Validation을 웹 프론트엔드에서 했더라도 서버에서 또 해야 할까요? 그 이유는 무엇일까요?
19 | * 서버로부터 받은 HTML 내용을 그대로 검증 없이 프론트엔드에 innerHTML 등을 통해 적용하면 어떤 문제점이 있을까요?
20 | * XSS(Cross-site scripting)이란 어떤 공격기법일까요?
21 | * CSRF(Cross-site request forgery)이란 어떤 공격기법일까요?
22 | * SQL Injection이란 어떤 공격기법일까요?
23 | * 대부분의 최신 브라우저에서는 HTTP 대신 HTTPS가 권장됩니다. 이유가 무엇일까요?
24 | * HTTPS와 TLS는 어떤 식으로 동작하나요? HTTPS는 어떤 역사를 가지고 있나요?
25 | * HTTPS의 서비스 과정에서 인증서는 어떤 역할을 할까요? 인증서는 어떤 체계로 되어 있을까요?
26 |
27 | ## Quest
28 | * 메모장의 서버와 클라이언트에 대해, 로컬에서 발행한 인증서를 통해 HTTPS 서비스를 해 보세요.
29 |
30 | ## Advanced
31 | * TLS의 인증서에 쓰이는 암호화 알고리즘은 어떤 종류가 있을까요?
32 | * HTTP/3은 기존 버전과 어떻게 다를까요? HTTP의 버전 3이 나오게 된 이유는 무엇일까요?
33 |
--------------------------------------------------------------------------------
/Quest13/README.md:
--------------------------------------------------------------------------------
1 | # Quest 13. 웹 API의 응용과 GraphQL
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 차세대 웹 API의 대세로 각광받고 있는 GraphQL에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * GraphQL
8 | * Schema
9 | * Resolver
10 | * DataLoader
11 | * Apollo
12 |
13 | ## Resources
14 | * [GraphQL](https://graphql.org/)
15 | * [GraphQL.js](http://graphql.org/graphql-js/)
16 | * [DataLoader](https://github.com/facebook/dataloader)
17 | * [Apollo](https://www.apollographql.com/)
18 |
19 | ## Checklist
20 | * GraphQL API는 무엇인가요? REST의 어떤 단점을 보완해 주나요?
21 | * GraphQL 스키마는 어떤 역할을 하며 어떤 식으로 정의되나요?
22 | * GraphQL 리졸버는 어떤 역할을 하며 어떤 식으로 정의되나요?
23 | * GraphQL 리졸버의 성능 향상을 위한 DataLoader는 무엇이고 어떻게 쓰나요?
24 | * 클라이언트 상에서 GraphQL 요청을 보내려면 어떻게 해야 할까요?
25 | * Apollo 프레임워크(서버/클라이언트)의 장점은 무엇일까요?
26 | * Apollo Client를 쓰지 않고 Vanilla JavaScript로 GraphQL 요청을 보내려면 어떻게 해야 할까요?
27 | * GraphQL 기반의 API를 만들 때 에러처리와 HTTP 상태코드 등은 어떻게 하는게 좋을까요?
28 |
29 | ## Quest
30 | * 메모장의 서버와 클라이언트 부분을 GraphQL API로 수정해 보세요.
31 |
32 | ## Advanced
33 | * GraphQL이 아직 제대로 수행하지 못하거나 불가능한 요구사항에는 어떤 것이 있을까요?
34 | * GraphQL의 경쟁자에는 어떤 것이 있을까요?
35 |
--------------------------------------------------------------------------------
/Quest14/README.md:
--------------------------------------------------------------------------------
1 | # Quest 14. 정적 분석: 타입스크립트와 린트 시스템
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 타입스크립트와 린트 시스템을 통해 코드에 대한 정적분석의 장점에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Lint
8 | * ESLint
9 | * TypeScript
10 |
11 | ## Resources
12 | * [ESLint](https://eslint.org/)
13 | * [TypeScript](https://www.typescriptlang.org/)
14 |
15 | ## Checklist
16 | * 코드를 린팅하는 것의 장점은 무엇일까요?
17 | * 린트 규칙은 어떻게 설정하는 것이 좋을까요? 너무 빡빡한 규칙과 너무 헐거운 규칙 사이에서 어떻게 밸런스를 잡아야 할까요?
18 | * 타입스크립트는 어떤 언어인가요?
19 | * 타입스크립트를 사용했을 때 얻을 수 있는 장점은 무엇인가요?
20 | * 타입스크립트를 사용하면서 타입이 없는 라이브러리나 프레임워크를 사용해야 할 경우에는 어떻게 해야 할까요?
21 | * any 타입을 남용하는 것은 왜 좋지 않을까요?
22 | * 린트와 빌드 등의 과정을 개발 싸이클에서 편하게 수행하려면 어떻게 하는 것이 좋을까요?
23 |
24 | ## Quest
25 | * 메모장 시스템에 린트 시스템을 적용해 보세요.
26 | * 메모장 시스템을 타입스크립트 기반으로 수정해 보세요.
27 | * `package.json` 파일의 `scripts` 항목을 이용하여 린트와 빌드 등의 작업을 스크립트화 해 보세요.
28 |
29 | ## Advanced
30 | * 자바스크립트 코드에 대한 정적분석은 어떤 과정을 통해 이루어질까요?
31 | * 이러한 정적분석을 수행해 주는 핵심 역할을 하는 npm 패키지는 어떤 것이 있을까요?
32 |
--------------------------------------------------------------------------------
/Quest15/README.md:
--------------------------------------------------------------------------------
1 | # Quest 15. 자동화된 테스트
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 자동화된 테스트에 어떤 장점이 있는지, 어떤 식으로 구축할 수 있는지에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Automated Test
8 | * TDD
9 | * Unit Test
10 | * Integration Test
11 | * E2E Test
12 | * Stub & Mock
13 | * Jest
14 | * Puppeteer
15 |
16 | ## Resources
17 | * [Unit Test (단위 테스트) 도입하기](https://www.popit.kr/unit-test-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8F%84%EC%9E%85%ED%95%98%EA%B8%B0-1%ED%8E%B8/)
18 | * [소프트웨어 테스트 안티 패턴](https://velog.io/@leejh3224/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%95%88%ED%8B%B0-%ED%8C%A8%ED%84%B4)
19 | * [End-to-End testing with Puppeteer and Jest](https://medium.com/touch4it/end-to-end-testing-with-puppeteer-and-jest-ec8198145321)
20 | * [Mock & Stub](https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub)
21 |
22 | ## Checklist
23 | * 자동화된 테스트를 만드는 것에는 어떤 장점과 단점이 있을까요?
24 | * TDD(Test-Driven Development)란 무엇인가요? TDD의 장점과 단점은 무엇일까요?
25 | * 테스트들 간의 계층에 따라 어떤 단계들이 있을까요?
26 | * 유닛 테스트, 통합 테스트, E2E 테스트는 각각 어떤 것을 뜻하나요?
27 | * 테스트에 있어서 Stub과 Mock은 어떤 개념을 가리키는 것일까요?
28 | * Jest는 어떤 일을 하며 어떻게 사용하는 테스트 프레임워크일까요?
29 | * Jest 이외의 테스트 프레임워크는 어떤 것이 있고 어떤 장단점이 있을까요?
30 | * Puppeteer는 어떤 일을 하며 어떻게 사용하는 테스트 프레임워크일까요?
31 |
32 | ## Quest
33 | * 직전 퀘스트의 메모장의 서버와 클라이언트 각 부분에 유닛 테스트, 통합 테스트, E2E 테스트 등을 추가해 보세요.
34 | * `npm test` 명령을 통해 모든 테스트가 돌고 그 결과를 출력할 수 있어야 합니다.
35 |
36 | ## Advanced
37 | * 테스트의 커버리지는 어떤 개념일까요? 프로젝트에서 테스트의 커버리지는 어떻게 접근하는 것이 좋을까요?
38 |
--------------------------------------------------------------------------------
/Quest16-B/README.md:
--------------------------------------------------------------------------------
1 | # Quest 16-B. 컨테이너
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 컨테이너 기술과 그 활용에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * 컨테이너 기술
8 | * Docker
9 | * docker-compose
10 |
11 | ## Resources
12 | * [#LearnDocker](https://www.docker.com/101-tutorial)
13 | * [Docker Tutorial for Beginners](https://docker-curriculum.com/)
14 | * [docker-compose](https://docs.docker.com/compose/)
15 |
16 | ## Checklist
17 | * 컨테이너는 어떻게 동작하나요? 다른 배포판을 사용할 수 있게 하는 원리가 무엇일까요?
18 | * 도커 컨테이너에 호스트의 파일시스템이나 네트워크 포트를 연결하려면 어떻게 해야 할까요?
19 | * 도커 컨테이너에서 런타임에 환경변수를 주입하려면 어떻게 해야 할까요?
20 | * 도커 컨테이너의 stdout 로그를 보려면 어떻게 해야 할까요?
21 | * 실행중인 도커 컨테이너에 들어가 bash 등의 쉘을 실행하고 로그 등을 보려면 어떻게 해야 할까요?
22 |
23 | ## Quest
24 | * 도커를 설치하고 그 사용법을 익혀 보세요.
25 | * 메모장 시스템 서버를 컨테이너 기반으로 띄울 수 있게 수정해 보세요. (docker-compose는 사용하지 않습니다)
26 | * 컨테이너를 Docker Hub에 올리고, 발급받은 학습용 AWS 계정에 EC2 인스턴스를 생성한 뒤, 해당 컨테이너를 띄워서 서비스 해 보세요.
27 | * docker-compose를 사용하여, 이미지 빌드와 서버 업/다운을 쉽게 할 수 있도록 고쳐 보세요.
28 |
29 | ## Advanced
30 | * 도커 외의 컨테이너 기술의 대안은 어떤 것이 있을까요?
31 | * 맥이나 윈도우에서도 컨테이너 기술을 사용할 수 있는 원리는 무엇일까요?
32 |
--------------------------------------------------------------------------------
/Quest16-F/README.md:
--------------------------------------------------------------------------------
1 | # Quest 16-F. 컴포넌트 기반 개발
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 Vue.js 프레임워크를 통해 컴포넌트 기반의 웹 클라이언트 개발 방법론을 더 자세히 알아보겠습니다.
5 |
6 | ## Topics
7 | * Vue.js framework
8 | * vuex
9 | * Virtual DOM
10 |
11 | ## Resources
12 | * [Vue.js](https://vuejs.org)
13 | * [Lifecycle Hooks](https://v3.vuejs.org/guide/composition-api-lifecycle-hooks.html)
14 | * [State Management](https://v3.vuejs.org/guide/state-management.html)
15 | * [Virtual DOM](https://v3.vuejs.org/guide/optimizations.html#virtual-dom)
16 |
17 | ## Checklist
18 | * Vue.js는 어떤 특징을 가지고 있는 웹 프레임워크인가요?
19 | * Vue.js는 내부적으로 어떤 식으로 동작하나요?
20 | * Vue.js에서의 컴포넌트란 무엇인가요?
21 | * Vue 컴포넌트의 라이프사이클은 어떤 식으로 호출되나요?
22 | * 컴포넌트 간에 데이터를 주고받을 때 단방향 바인딩과 양방향 바인딩 방식이 어떻게 다르고, 어떤 장단점을 가지고 있나요?
23 | * Vue.js 기반의 웹 어플리케이션을 위한 상태관리 라이브러리에는 어떤 것이 있을까요? 이러한 상태관리 툴을 사용하는 것에는 어떤 장단점이 있을까요?
24 |
25 | ## Quest
26 | * Vue.js를 통해 메모장 시스템을 다시 한 번 만들어 보세요.
27 | * 어떤 컴포넌트가 필요한지 생각해 보세요.
28 | * 각 컴포넌트별로 해당하는 CSS와 자바스크립트를 어떤 식으로 붙여야 할까요?
29 | * Vue.js 시스템에 타입스크립트는 어떤 식으로 적용할 수 있을까요?
30 | * 컴포넌트간에 데이터를 주고받으려면 어떤 식으로 하는 것이 좋을까요?
31 | * `vue-cli`와 같은 Vue의 Boilterplating 기능을 이용하셔서 세팅하시면 됩니다.
32 |
33 | ## Advanced
34 | * React와 Angular는 어떤 프레임워크이고 어떤 특징을 가지고 있을까요? Vue와는 어떤 점이 다를까요?
35 | * Web Component는 어떤 개념인가요? 이 개념이 Vue나 React를 대체하게 될까요?
36 | * Reactive Programming이란 무엇일까요?
37 |
--------------------------------------------------------------------------------
/Quest17-B/README.md:
--------------------------------------------------------------------------------
1 | # Quest 17-B. 배포 파이프라인
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 CI/CD 파이프라인이 왜 필요한지, 어떻게 구축할 수 있는지 등에 대해 다룹니다.
5 |
6 | ## Topics
7 | * Continuous Integration
8 | * Continuous Delivery
9 | * AWS Codebuild
10 |
11 | ## Resources
12 | * [AWS: Continuous Integration](https://aws.amazon.com/ko/devops/continuous-integration/)
13 | * [AWS: Continuous Delivery](https://aws.amazon.com/ko/devops/continuous-delivery/)
14 | * [AWS Codebuild](https://aws.amazon.com/ko/codebuild/getting-started/)
15 |
16 | ## Checklist
17 | * CI/CD는 무엇일까요? CI/CD 시스템을 구축하면 어떤 장점이 있을까요?
18 | * CI 시스템인 Travis CI, Jenkins, Circle CI, Github Actions, AWS Codebuild 의 차이점과 장단점은 무엇일까요?
19 |
20 | ## Quest
21 | * AWS Codebuild를 이용하여, 특정 브랜치에 푸시를 하면 린트와 테스트를 거쳐 서버 이미지를 빌드한 뒤, 직전 퀘스트의 EC2 인스턴스에 배포되는 시스템을 만들어 보세요.
22 |
23 | ## Advanced
24 | * 빅테크 회사들이 코드를 빌드하고 배포하는 시스템은 어떻게 설계되고 운영되고 있을까요?
25 |
--------------------------------------------------------------------------------
/Quest17-F/README.md:
--------------------------------------------------------------------------------
1 | # Quest 17-F. 번들링과 빌드 시스템
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 현대적 웹 클라이언트 개발에 핵심적인 번들러와 빌드 시스템의 구조와 사용 방법에 대해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Webpack
8 | * Bundling
9 | * Data URL
10 | * Transpiling
11 | * Source Map
12 | * Hot Module Replacement
13 |
14 | ## Resources
15 | * [Webpack](https://webpack.js.org/)
16 | * [Webpack 101: An introduction to Webpack](https://medium.com/hootsuite-engineering/webpack-101-an-introduction-to-webpack-3f59d21edeba)
17 |
18 | ## Checklist
19 | * 여러 개로 나뉘어진 자바스크립트나 이미지, 컴포넌트 파일 등을 하나로 합치는 작업을 하는 것은 성능상에서 어떤 이점이 있을까요?
20 | * 이미지를 Data URL로 바꾸어 번들링하는 것은 어떤 장점과 단점이 있을까요?
21 | * Source Map이란 무엇인가요? Source Map을 생성하는 것은 어떤 장점이 있을까요?
22 | * Webpack의 필수적인 설정은 어떤 식으로 이루어져 있을까요?
23 | * Webpack의 플러그인과 모듈은 어떤 역할들을 하나요?
24 | * Webpack을 이용하여 HMR(Hot Module Replacement) 기능을 설정하려면 어떻게 해야 하나요?
25 |
26 | ## Quest
27 | * 직전 퀘스트의 소스만 남기고, Vue의 Boilerplating 기능을 쓰지 않고 Webpack 관련한 설정을 원점에서 다시 시작해 보세요.
28 | * 필요한 번들링과 Source Map, HMR 등의 기능이 모두 잘 작동해야 합니다.
29 |
30 | ## Advanced
31 | * Webpack 이전과 이후에는 어떤 번들러가 있었을까요? 각각의 장단점은 무엇일까요?
32 |
--------------------------------------------------------------------------------
/Quest18-B/README.md:
--------------------------------------------------------------------------------
1 | # Quest 18-B. 서비스의 운영: 로깅과 모니터링
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 서비스의 운영을 위해 로그를 스트리밍하는 법에 대해 다루겠습니다.
5 |
6 | ## Topics
7 | * ElasticSearch
8 | * AWS ElasticSearch Service
9 | * Grafana
10 |
11 | ## Resources
12 | * [ElasticSearch](https://www.elastic.co/kr/what-is/elasticsearch)
13 | * [ElasticSearch 101](https://www.elastic.co/kr/webinars/getting-started-elasticsearch)
14 | * [Grafana Panels](https://grafana.com/docs/grafana/latest/panels/)
15 |
16 | ## Checklist
17 | * ElasticSearch는 어떤 DB인가요? 기존의 RDB와 어떻게 다르고 어떤 장단점을 가지고 있나요?
18 | * AWS의 ElasticSearch Service는 어떤 서비스인가요? ElasticSearch를 직접 설치하거나 elastic.co에서 직접 제공하는 클라우드 서비스와 비교하여 어떤 장단점이 있을까요?
19 | * Grafana의 Panel 형식에는 어떤 것이 있을까요? 로그를 보기에 적합한 판넬은 어떤 형태일까요?
20 |
21 | ## Quest
22 | * 우리의 웹 서버가 stdout으로 적절한 로그를 남기도록 해 보세요.
23 | * ElasticSearch Service 클러스터를 작은 사양으로 하나 만들고, 도커 컨테이너의 stdout으로 출력된 로그가 ElasticSearch로 스트리밍 되도록 해 보세요.
24 | * Grafana를 이용해 ElasticSearch의 로그를 실시간으로 볼 수 있는 페이지를 만들어 보세요.
25 |
26 | ## Advanced
27 | * ElasticSearch와 Grafana는 어떤 라이센스로 배포되고 있을까요? AWS와 같은 클라우드 제공자들이 이러한 오픈소스를 서비스화 하는 것을 둘러싼 논란은 어떤 논점일까요?
28 |
--------------------------------------------------------------------------------
/Quest18-F/README.md:
--------------------------------------------------------------------------------
1 | # Quest 18-F. 프로그레시브 웹앱
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 2021년 현재 웹 프론트엔드의 많은 최신 기술 중 프로그레시브 웹앱에 관해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Progressive Web App(PWA)
8 | * Service Worker
9 | * Cache & CacheStorage API
10 | * Web Manifest
11 |
12 | ## Resources
13 | * [MDN - Progressive web apps (PWAs)](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps)
14 | * [MDN - Progressive web app Introduction](https://developer.mozilla.org/ko/docs/Web/Progressive_web_apps/Introduction)
15 | * [MDN - Service Worker API](https://developer.mozilla.org/ko/docs/Web/API/Service_Worker_API)
16 | * [web.dev - Progressive Web Apps](https://web.dev/progressive-web-apps/)
17 |
18 | ## Checklist
19 | * 웹 어플리케이션을 프로그레시브 웹앱 형태로 만들면 어떤 이점을 가질까요?
20 | * 서비스 워커란 무엇인가요? 웹 워커와의 차이는 무엇인가요?
21 | * PWA의 성능을 높이기 위한 방법론에는 어떤 것들이 있고, 어떤 식으로 적용할 수 있을까요?
22 |
23 | ## Quest
24 | * 텍스트 에디터 프로그램을 PWA 형태로 만들어 보세요.
25 | * 필요한 에셋을 적절히 캐싱하되, 버전업이 되었을 때 캐싱을 해제할 수 있는 형태가 되어야 합니다.
26 | * 해당 PWA를 데스크탑에 인스톨 가능하도록 만들어 보세요.
27 | * 오프라인인 경우에는 임시저장 기능을 만들어, 온라인인 경우를 감지하여 자동으로 서버에 반영되도록 만들어 보세요.
28 |
29 | ## Advanced
30 | * 본 퀘스트의 주제로 고려되었으나 분량상 선정되지 않은 주제들은 다음과 같습니다. 시간날 때 한 번 찾아 보세요!
31 | * Search Engine Optimization(SEO)
32 | * CSS-in-JS와 Styled Component
33 | * Server-Side Rendering(SSR)
34 |
--------------------------------------------------------------------------------
/Quest19-B/README.md:
--------------------------------------------------------------------------------
1 | # Quest 19-B. 서버 아키텍쳐 패턴
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 현대적인 서버 아키텍쳐 패턴에 대해 익혀 보도록 하겠습니다.
5 |
6 | ## Topics
7 | * Microservice Architecture
8 | * Serverless Architecture
9 | * AWS Lambda
10 | * Service Mesh
11 |
12 | ## Resources
13 | * [Jeff Bezos의 이메일](https://news.hada.io/topic?id=638)
14 | * [마이크로서비스란?](https://www.redhat.com/ko/topics/microservices/what-are-microservices)
15 | * [AWS Lambda](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/welcome.html)
16 | * [AWS API Gateway](https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/welcome.html)
17 |
18 | ## Checklist
19 | * 마이크로서비스 아키텍쳐란 무엇일까요? 어떤 식으로 서비스를 구성할 수 있을까요? 어떤 장점을 가지고 있을까요?
20 | * 서버리스 아키텍쳐란 무엇일까요? 어떤 식으로 서비스를 구성할 수 있을까요? 어떤 장점을 가지고 있을까요?
21 | * AWS Lambda는 어떤 서비스일까요? 이러한 서비스는 어떤 특징을 가지고, 어디에 쓰일 수 있을까요?
22 | * API Gateway는 어떤 서비스인가요? 어떤 설정을 할 수 있을까요?
23 | * 많은 마이크로서비스들을 복잡하게 연결할 경우 관리상에 어떤 난점이 생길 수 있을까요? 서비스 메쉬는 무엇이고 이러한 난점을 어떻게 해결하려는 시도일까요?
24 |
25 | ## Quest
26 | * 메모장 시스템을 JWT 발급을 위한 마이크로서비스와 실제 비즈니스 로직을 처리하는 마이크로서비스로 나누어 보세요.
27 | * JWT 토큰 발급의 역할을 하는 마이크로서비스를 AWS Lambda와 API Gateway를 이용하여 구축해 보세요.
28 |
29 | ## Advanced
30 | * Istio는 어떤 툴일까요? 이 툴을 Kubernetes와 함께 사용하여 어떤 구조를 구현할 수 있을까요?
31 |
--------------------------------------------------------------------------------
/Quest19-F/README.md:
--------------------------------------------------------------------------------
1 | # Quest 19-F. 웹 어셈블리의 기초
2 |
3 | ## Introduction
4 | * 이번 퀘스트에서는 2021년 현재 웹 프론트엔드의 많은 최신 기술 중 웹 어셈블리에 관해 알아보겠습니다.
5 |
6 | ## Topics
7 | * Web Assembly
8 | * Rust
9 |
10 | ## Resources
11 | * [MDN - 웹어셈블리의 컨셉](https://developer.mozilla.org/ko/docs/WebAssembly/Concepts)
12 | * [MDN - Rust to wasm](https://developer.mozilla.org/ko/docs/WebAssembly/Rust_to_wasm)
13 | * [Learn Rust](https://www.rust-lang.org/learn)
14 | * [Rust - sha2](https://docs.rs/sha2/0.9.5/sha2/)
15 |
16 | ## Checklist
17 | * 웹 어셈블리란 어떤 기술인가요?
18 | * 웹 어셈블리 모듈을 웹 프론트엔드 상에서 실행시키려면 어떻게 해야 할까요?
19 | * Rust란 어떤 특징을 가진 프로그래밍 언어인가요?
20 | * 웹 어셈블리 모듈을 만드는 방법에는 어떤 것들이 있나요?
21 | * 웹 어셈블리가 할 수 없는 작업에는 무엇이 있을까요? 웹 어셈블리는 어떤 목적에 주로 쓰이게 될까요?
22 |
23 | ## Quest
24 | * 텍스트 에디터 프로그램에서 각 탭의 내용의 SHA-256 해시를 실시간으로 계산하여 화면 아래에 표시해 보세요.
25 | * 해당 해시는 Rust로 작성된 웹 어셈블리 함수를 통해 계산되어야 합니다.
26 | * 순수 자바스크립트로 계산할 때와의 퍼포먼스 차이를 체크해 보세요. (퍼포먼스 차이를 알아보는 데에 어떤 전략들이 있을까요?)
27 |
28 | ## Advanced
29 | * 웹 어셈블리 바이너리는 어떻게 구성되어 있을까요?
30 |
--------------------------------------------------------------------------------
/Quest20/README.md:
--------------------------------------------------------------------------------
1 | # Quest 20. 세상 밖으로
2 |
3 | ## Introduction
4 | * 이제는 세상 밖으로 나갈 때입니다! 그 동안 퀘스트 수행하시느라 고생 많으셨습니다.
5 |
6 | ## Checklist
7 | * 그 동안 웹 데브 커리큘럼을 진행하면서 어떤 것을 느끼고 배웠나요?
8 | * 웹 데브 커리큘럼을 진행하면서 더 개선되거나 추가되었으면 하는 점에는 어떤 것이 있었나요?
9 |
10 | ## Quest
11 | * 권한을 부여받아 우리 회사의 모노리포를 로컬에 클론하고, 개발환경을 세팅해 보세요.
12 | * 백엔드 트랙의 경우, 그 동안 퀘스트를 진행하면서 AWS에 생성했던 리소스가 있다면 모두 삭제해 보세요.
13 | * 이제 동료들과 함께 일할 시간입니다!
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Knowre 웹개발 커리큘럼 - 4th Edition, 2021
2 |
3 | ## 소개
4 | * Knowre의 신입 웹 개발자 교육을 위한 웹 개발 교육 커리큘럼의 2021년 버전입니다.
5 | * 이 커리큘럼을 통해 신입 개발자들은 git, HTML, CSS, front-end JavaScript, node.js, MySQL, 그리고 더 나아가 선택된 몇 가지의 최신 웹 기술과 그 작동 원리에 대해 익히게 됩니다.
6 |
7 |
8 | ### 광고
9 |
10 | * Knowre에서 수시로 신입/경력 엔지니어를 모시고 있습니다. [이 링크](https://www.wanted.co.kr/company/96) 를 참고해 주십시오!
11 |
12 |
13 | ## 머리말
14 |
15 | * [머리말](./PREFACE.md)
16 |
17 |
18 | ## 목차
19 |
20 | 펼치기
21 |
22 |
23 | * [Quest 00. 형상관리 시스템](./Quest00)
24 | * [Quest 01. HTML과 웹의 기초](./Quest01)
25 | * [Quest 02. CSS의 기초와 응용](./Quest02)
26 | * [Quest 03. 자바스크립트와 DOM](./Quest03)
27 | * [Quest 04. OOP의 기본](./Quest04)
28 | * [Quest 05. OOP 특훈](./Quest05)
29 | * [Quest 06. 인터넷의 이해](./Quest06)
30 | * [Quest 07. node.js의 기초](./Quest07)
31 | * [Quest 08. 웹 API의 기초: REST와 CRUD](./Quest08)
32 | * [Quest 09. 서버와 클라이언트의 대화](./Quest09)
33 | * [Quest 10. 인증의 이해](./Quest10)
34 | * [Quest 11. RDB의 기초와 ORM](./Quest11)
35 | * [Quest 12. 보안의 기초](./Quest12)
36 | * [Quest 13. 웹 API의 응용과 GraphQL](./Quest13)
37 | * [Quest 14. 정적 분석: 타입스크립트와 린트 시스템](./Quest14)
38 | * [Quest 15. 자동화된 테스트](./Quest15)
39 | * 프론트엔드 루트
40 | * [Quest 16-F. 컴포넌트 기반 개발](./Quest16-F)
41 | * [Quest 17-F. 번들링과 빌드 시스템](./Quest17-F)
42 | * [Quest 18-F. 프로그레시브 웹앱](./Quest18-F)
43 | * [Quest 19-F. 웹 어셈블리의 기초](./Quest19-F)
44 | * 백엔드 루트
45 | * [Quest 16-B. 도커와 컨테이너](./Quest16-B)
46 | * [Quest 17-B. 배포 파이프라인](./Quest17-B)
47 | * [Quest 18-B. 서비스의 운영: 로깅과 모니터링](./Quest18-B)
48 | * [Quest 19-B. 서버 아키텍쳐 패턴](./Quest19-B)
49 | * [Quest 20. 세상 밖으로](./Quest20)
50 |
51 |
52 |
53 |
54 |
55 | ## 커리큘럼을 진행하실 때...
56 |
57 | * 커리큘럼을 수행하시다 보면 이미 익숙한 주제도 있을 수 있고, 익숙하지 않은 주제도 있을 것입니다. 퀘스트가 익숙한 주제를 다루고 있더라도 본인이 정확히 알지 못하고 있는 부분이 분명히 있을 것입니다.
58 | * Checklist의 질문들을 무시하지 마십시오! 본인이 좋은 개발자로 성장하기 위한 밑거름이 될 수 있고, 본격적으로 바쁜 업무를 시작한 이후에는 이 밑거름을 잘 채우는 것은 생각보다 어려운 일입니다.
59 | * 되도록 여러 개의 퀘스트를 동시에 진행하지 않는 것을 권장합니다. 진도를 빠르게 나가는 것도 중요하지만, 한 개의 주제를 깊고 정확히 아는 것이 더 중요합니다. 여건이 닿는 한 번에 한 개의 퀘스트씩만 수행하고, 완성한 다음에 꼭 바로 피드백을 받아 놓친 부분이 무엇인지 점검하도록 합시다.
60 | * 생소한 주제의 퀘스트를 수행하는 경우, 본인이 새로운 개념을 공부해 나가는 방식을 정립하는 기회로 생각하시면 좋습니다. 그런 공부의 과정은 앞으로 개발자의 커리어를 걸어가는 동안 계속해서 겪게 될 것입니다!
61 | * 이 커리큘럼에서 다루는 기술 뿐 아니라 모든 기술은 어떤 특정한 문제를 풀기 위해 개발되었습니다. 커리큘럼을 진행하시면서, 또 이후에 개발자의 길을 걸을 때 언제나 다음의 세 가지 질문을 끊임없이 스스로에게 던지면 유용할 것입니다:
62 | * 이 기술이 왜 나오게 되었을까? 어떤 문제를 풀기 위해 어떤 배경에서 나왔을까?
63 | * 이 기술은 기존의 문제를 푸는 해답을 어떻게 제시했을까? 이 기술은 어떻게 사용하는 것일까?
64 | * 이 기술은 어떤 장점과 단점을 가지고 있을까? 이 기술의 단점을 보완하려면 어떻게 해야 할까? 기존의 문제를 푸는 다른 방법으로 제시된 것은 무엇이 있을까?
65 |
66 |
67 | ## 설명
68 |
69 | * Quest 0부터 순서대로 각각의 주제들에 관한 퀘스트를 수행하시면 됩니다.
70 | * Quest 0에서 이야기하고 있는 바와 같이, 이 repo를 fork하여 자신의 저장소를 만들고, 그 저장소에서 퀘스트 수행이 이루어질 예정입니다.
71 | * 비밀번호나 토큰 스트링 등의 민감한 정보를 공개된 저장소에 커밋하지 않도록 주의하시기 바랍니다.
72 | * 퀘스트는 다음과 같이 구성되어 있습니다(그러나 모든 퀘스트가 다음의 구성요소들을 모두 가지고 있는 것은 아닙니다).
73 | * Introduction: 소개 페이지입니다.
74 | * Topics: 이번 퀘스트를 통해 익힐 수 있는 기술이 무엇인지를 나타냅니다.
75 | * Resources: 토픽을 익히기 위해 참고하면 좋을 링크들입니다.
76 | * Checklist: Topic들을 제대로 공부했는지를 자문자답 할 수 있는 문항들로 이루어져 있습니다.
77 | * Quest: 퀘스트를 통해 만들어내야 하는 결과물들을 담고 있습니다.
78 | * Skeleton: 퀘스트 수행을 위한 스켈레톤 코드입니다.
79 | * Advanced: 더 공부하고 싶은 분들을 위한 화두입니다.
80 |
81 |
82 | ## 제출
83 |
84 | * 퀘스트의 제출은 자신의 저장소에 Push하는 것으로 이루어 집니다. 가급적 자주 커밋하고 자주 푸시하는 것을 권장합니다.
85 | * Checklist의 질문에 대한 대답은 이 저장소를 fork하여 자신의 저장소를 만들고, 그 저장소에 해당 내용을 푸시합니다.
86 | * Checklist의 대답은 마치 면접 질문에 대답하듯 최대한 정확하지만 간결한 답을 준비하는 것이 좋습니다.
87 | * 혹시 답변에 있어 포맷팅이 필요할 경우 [Markdown 포맷](https://guides.github.com/features/mastering-markdown/)을 이용하시는 것을 권장해 드립니다.
88 | * 이 커리큘럼의 많은 문서들도 Markdown으로 되어 있기 때문에 Markdown 포맷에 익숙해지시는 것 역시 권장드립니다.
89 | * Checklist의 내용을 채워넣기 위해 구글링해서 나온 결과물을 그대로 붙여넣기보다는, 본인이 내용을 이해한 후 되도록 면접장에서 대답한다는 마음가짐으로 자신의 언어로 다시 작성하기를 권장합니다.
90 | * Quest의 결과물은 대부분의 경우 skeleton 파일의 TODO 부분을 채워넣는 것으로 충분합니다.
91 | * 충분히 익숙해진 후반부에는 Skeleton 코드를 굳이 제공하지 않습니다.
92 | * 각각의 퀘스트들은 초반부터 후반까지, 앞에서 했던 퀘스트의 결과물에 살을 붙이는 식으로 매우 긴밀히 연결되어 있습니다.
93 | * 그렇기 때문에 중간에 한 퀘스트를 건너뛰면 이후의 퀘스트들의 진행에 어려움이 있을 수 있습니다.
94 | * Checklist와 Quest의 질문과 답을 완벽히 이해했다고 생각하신다면, Advanced에 있는 화두를 스스로 공부해 보고 필요한 경우 질문거리를 생각해 봅니다.
95 |
96 |
97 | ## 막혔다면...
98 |
99 | * 되도록 검색 등을 통해 스스로 해결해 나가는 것을 권장합니다. 국내 검색엔진의 검색 보다는 구글 검색을 권장합니다.
100 | * 어떠한 알 수 없는 현상이 있어 막혔을 경우 그 현상이 일어나는 최소단위의 코드를 만들다 보면 해결되는 경우가 많습니다.
101 | * 만일 만 하루 이상의 시행착오로 인해 진행이 멈췄을 경우, 제 자리로 찾아 오시면 해결을 보장해 드립니다.
102 |
103 |
104 | ### 라이센스
105 |
106 | * 이 커리큘럼은 [MIT 라이센스](./LICENSE)를 따릅니다. 원하시는대로 쓰시고 개작하실 수 있습니다. 다만 이 커리큘럼의 내용이 마음에 드셨을 경우, 만약 원하신다면 `[Knowre Web Development Curriculum](https://github.com/Knowre-Dev/WebDevCurriculum)에서 영감을 받았다` 라는 언급을 해 주시면 감사하겠습니다.
107 |
--------------------------------------------------------------------------------