-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
157 lines (86 loc) ยท 83.4 KB
/
Copy pathatom.xml
File metadata and controls
157 lines (86 loc) ยท 83.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title></title>
<link href="/atom.xml" rel="self"/>
<link href="https://devhaeyeon.github.io/"/>
<updated>2018-03-07T02:24:24.000Z</updated>
<id>https://devhaeyeon.github.io/</id>
<author>
<name>devhaeyeon</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>(๋์ปค) ๋์ปค ํํค์น๊ธฐ step2. Webapps with Docker-1</title>
<link href="https://devhaeyeon.github.io/2018/03/06/docker-sample-tutorial2/"/>
<id>https://devhaeyeon.github.io/2018/03/06/docker-sample-tutorial2/</id>
<published>2018-03-06T10:11:51.000Z</published>
<updated>2018-03-07T02:24:24.000Z</updated>
<content type="html"><![CDATA[<p><strong> ํด๋น ๊ธ์ <a href="https://github.com/docker/labs/blob/master/beginner/chapters/webapps.md" target="_blank" rel="external">https://github.com/docker/labs/blob/master/beginner/chapters/webapps.md</a> ์์ ๋ฒ์ญ ๋ฐ ์์ญ์ ํ ๊ฒ์ด๋ฏ๋ก ์ ํํ ๊ฒ์ ๋ช
์ํ ์ฃผ์์์ ํ์ธํ ์ ์์ต๋๋ค. </strong></p><h2 id="์๋ก "><a href="#์๋ก " class="headerlink" title="์๋ก "></a>์๋ก </h2><p>step1์์ Running your first container์์ docker run, ๋์ปค ์ฃผ์ ์ฉ์ด์ ๋ํด์ ์์ ๋ณด์๋ค.<br>์ด๋ฒ step2์์๋ ๋์ปค ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ค๋ฃฌ๋ค. </p><h2 id="์ปจํ
์ด๋์์-์คํ
ํฑํ-์น์ฌ์ดํธ๋ฅผ-์คํํ์"><a href="#์ปจํ
์ด๋์์-์คํ
ํฑํ-์น์ฌ์ดํธ๋ฅผ-์คํํ์" class="headerlink" title="์ปจํ
์ด๋์์ ์คํ
ํฑํ ์น์ฌ์ดํธ๋ฅผ ์คํํ์."></a>์ปจํ
์ด๋์์ ์คํ
ํฑํ ์น์ฌ์ดํธ๋ฅผ ์คํํ์.</h2><p><a href="https://github.com/docker/labs/tree/master/beginner/static-site" target="_blank" rel="external">https://github.com/docker/labs/tree/master/beginner/static-site</a> ์์ ํด๋น ๊ธ์ ํด๋นํ๋ ์ฝ๋๋ฅผ ๋ค๋ฃน๋๋ค.<br>์ฒซ๋ฒ์งธ๋ก, ์ฐ๋ฆฌ๋ ์ปจํ
์ด๋์์ ์ ์ ์ธ ์น์ฌ์ดํธ๋ฅผ ์คํํ๊ธฐ ์ํด ๋์ปค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํด๋น ์น์ฌ์ดํธ๋ ์กด์ฌํ๊ณ ์๋ ์ด๋ฏธ์ง๋ฅผ ํ ๋๋ก ํฉ๋๋ค. </p><p>๊ทธ ์ด๋ฏธ์ง๋ Docker Store์์ ์ฐพ์ ์ ์์ผ๋ฉฐ, ๊ฐ๋จํ single-page ์น์ฌ์ดํธ ๋ฐ๋ชจ๋ฅผ ์ํด ์ด๋ฏธ ๋ง๋ค์ด์ง dockersamples/static-site์ด๋ค.(<a href="https://store.docker.com/community/images/dockersamples/static-site" target="_blank" rel="external">https://store.docker.com/community/images/dockersamples/static-site</a>)</p><blockquote><p>$ docker run -d dockersamples/static-site</p></blockquote><p>์์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค ๋ฐ์ต๋๋ค.<br>โ์ด ์ด๋ฏธ์ง์ ์ต๊ทผ ๋ฒ์ ผ์ -d ํ๋๊ทธ๊ฐ ์์ด ์ด๋ฏธ์ง๊ฐ ์คํ๋์ง ์์ต๋๋ค. -d ํ๋๊ทธ๋ detached mode๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.<br>(detached mode๋ ํฐ๋ฏธ๋/์๋ก ๋ถํฐ ์ปจํ
์ด๋๋ฅผ ์คํ์ํค๋ ๊ฒ์ detachํ๊ณ , ์ปจํ
์ด๋ ์์ ์ดํ์ ๋ช
๋ น์ด๋ฅผ ๋ฆฌํดํด์ค๋๋ค.)<br>๋ณดํต ์ด๋ฏธ์ง์ ๋ฌธ์ ๋ค์ ๋๋ฒ๊น
์ ํ๊ณ ์์ง๋ง, ์ง๊ธ์ ์ฒซ๋ฒ์งธ ์์ ์ ์ฌ์ฉํ๊ธฐ ์ํด -d ๋ฅผ ์ฌ์ฉํฉ๋๋ค.โ</p><p>๊ทธ๋์ ์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น?</p><p>๋์ปค ํธ์คํธ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ปค ๋ฐ๋ชฌ์ ๋ ์ง์คํธ๋ฆฌ๋ก ๋ถํฐ ์ฒซ๋ฒ์งธ๋ก fetch๋ฅผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํ
์ด๋๋ก ์ด๋ฏธ์ง๋ฅผ ์คํ์ํต๋๋ค.</p><p>์๋ฒ๋ ์คํ์ด๋๊ณ ์๊ณ , ์น์ฌ์ดํธ๋ฅผ ๋ณผ ์ ์์๊น? ๋ฌด์จ ํฌํธ๊ฐ ์คํ์ด ๋๊ณ ์๋ ์ค์ธ๊ฐ์? ๊ทธ๋ฆฌ๊ณ ์ข ๋ ์ค์ํ๊ฒ, ์ด๋ป๊ฒ ์ฐ๋ฆฌ๋ค์ ํธ์คํธ ๋จธ์ ์ผ๋ก ๋ถํฐ ์ง์ ์ ์ผ๋ก ์ปจํ
์ด๋์ ์ ๊ทผ์ ํ ๊น?</p><p>์ค์ง์ ์ผ๋ก, ์์ง ์ด ์ง๋ฌธ์ ๋ต๋ณ์ ํ ์ ์์ ๊ฒ์ด๋ค. ์ด ์ผ์ด์ค์์ ํด๋ผ์ด์ธํธ๋ ์ด๋ ํฌํธ์์ publish๋๊ธฐ ์ํ ๋์ปค ์์ง์ธ์ง ์ ์ ์๋ค. ๊ทธ๋์ docker run ๋ช
๋ น์ด๋ฅผ ๋ค์ ์ฌ์คํํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. </p><p>์ฌ์คํ ํ์ฌ publishํ ํฌํธ์ ํ๋ฉด์ ๋ณด์ฌ์ง ์ปจํ
์ด๋์ ์ด๋ฆ์ ์ปค์คํ
๋ง์ด์ง ํ์ฌ๋ด
์๋ค.<br>detached mode์ ํด๋น ์ปจํ
์ด๋์์ -d ์ต์
์ ๋ค์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. </p><p>์ฒซ๋ฒ์งธ, ์คํ๋์ด์ ธ ์๋ ์ปจํ
์ด๋๋ฅผ ๋ฉ์ถฐ์ผํ๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ปจํ
์ด๋ ์์ด๋๊ฐ ํ์ํฉ๋๋ค.<br>detached mode์์ ์ปจํ
์ด๋๋ ์คํ๋์ด์ ธ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ํด ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์คํํ ํ์๊ฐ ์์ต๋๋ค.<br>docker ps๋ฅผ ํตํด ์คํ๋์ด์ ธ ์๋ ์ปจํ
์ด๋๋ฅผ ํ์ธํฉ๋๋ค. </p><blockquote><p>$ docker ps</p></blockquote><p>CONTAINER ID์ปฌ๋ผ์์ ์ฒดํฌ์์์ ํฉ๋๋ค.<br>์ฐ๋ฆฌ๋ CONTAINER ID๊ฐ์ ํ์๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์ CONTAINER ID๋ ๊ธด ๋ฌธ์์ด์ ์ํ์ค์ด๊ณ , ์ํ๋ ์ปจํ
์ด๋๋ฅผ ๋ฉ์ถ๊ณ ๋์ ์ง์ฐ๋ ค๊ณ ํ๋ ๊ฐ์
๋๋ค. ์๋ ์ ์๋ ์์คํ
์์ CONTAINER ID์ ์ ๊ณตํฉ๋๋ค.<br>ํฐ๋ฏธ๋์์ ๋ณด๋ ์ด ๊ฐ์ ์ฌ์ฉํด์ผํ๋ค. </p><blockquote><p>$ docker stop ๋ฉ์ถ๋ ค๊ณ ํ๋ CONTAINER ID<br>$ docker rm ์ง์ฐ๋ ค๊ณ ํ๋ CONTAINER ID</p></blockquote><p>โ์ข์ ๊ธฐ๋ฅ์ ์ ์ฒด์ CONTAINER ID์ ์ธ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค.<br>์์ํ๋ ๋ฌธ์์ด์ ๋ช ๊ธ์๋ฅผ ์
๋ ฅํ ์ ์๊ณ , ์คํ ๋์ด์ง ์ปจํ
์ด๋๋ค ์ค๋ง์ฝ ๋ชจ๋ ์ปจํ
์ด๋๋ค ์ค์ ์ ๋ํฌ ํ๋ค๋ฉด, ๋์ปค ํด๋ผ์ด์ธํธ๋ ๋๋ํ๊ฒ ๊ทธ๊ฒ์ ์ง์ด๋ธ๋ค.โ<br>ex) CONTAINER ID๊ฐ 35a9d35beb20๋ผ๋ฉด<br>docker stop 35a<br>โฆ</p><p>์๋์ ๋ช
๋ น์ด์ฒ๋ผ deched mode์์ ์ปจํ
์ด๋๋ฅผ ์คํ์์ผ๋ณด์.</p><blockquote><p>$ docker run โname static-site-sample -e AUTHOR=โscarlett.kimโ -d -P dockersamples/static-site</p></blockquote><p>์์ ๋ช
๋ น์ด์์<br> -d : ํฐ๋ฏธ๋๋ก ๋ถํฐ detach๋์ด์ง ํ๋ก์ธ์ค์ ํจ๊ป ์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๊ฒ.<br> -P : ๋
ธ์ถ๋ ๋ชจ๋ ์ปจํ
์ด๋ ํฌํธ๋ฅผ ๋์ปค ํธ์คํธ์ ์์์ ํฌํธ์ publishํจ.<br> -e : ์ปจํ
์ด๋์ ๋ค์ํ ํ๊ฒฝ์ pass ํ๋ ๊ฒ.<br> โname : ์ปจํ
์ด๋ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ.<br> -AUTHOR : ํ๊ฒฝ ๋ณ์์ด๋ฆ์ด๊ณ Your Name์ ์ด๋ฆpassํ ์ ์๋ ๊ฐ์ด๋ค. (์์ฑ์ ๋๋โฆ)<br>docker port๋ช
๋ น์ด๋ฅผ ์คํ์์ผ์ port๋ฅผ ๋ณผ ์ ์์ต๋๋ค.</p><blockquote><p>$ docker port static-site-sample (โname๋ก ์ง์ ํ ์ปจํ
์ด๋ ์ด๋ฆ)</p></blockquote><p>๋งฅ์ฉ ๋์ปค, ์๋์ฐ์ฉ ๋์ปค ๋๋ ๋ฆฌ๋
์ค์์ ์คํ์ํค๋ฉด,<br><a href="http://localhost:[YOUR_PORT_FOR" target="_blank" rel="external">http://localhost:[YOUR_PORT_FOR</a> 80/tcp] ์ ์ด ์ ์์ต๋๋ค.<br>์๋ <a href="http://localhost:32773" target="_blank" rel="external">http://localhost:32773</a></p><p>๋ง์ฝ ๋งฅ ๋๋ ์๋์ฐ๋ฅผ ํตํด์ ๋์ปค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, docker-machine์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํธ ๋ค์์ ์ฐพ์ ์ ์์ต๋๋ค. (default ๋จธ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ถ์ธกํ๊ณ ์๋์คโฆ)</p><blockquote><p>docker-machine ip default</p><p>์ฐธ๊ณ ) ๋ง์ฝ โError getting IP address: Host is not runningโ ์๋ฌ๋ฅผ ๋ง๋ฌ๋ค๋ฉด,</p><p>$ docker-machine rm default</p><p>$ docker-machine create โdriver virtualbox default<br>(Downloading /Users/๋ธ๋ผ๋ธ๋ผ/.docker/machine/cache/boot2docker.iso from <a href="https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso...์์" target="_blank" rel="external">https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso...์์</a> ๋ฉ์ถ๊ณ โฆ ๋๋ฆฌ๋๋ผ๋ โฆ ์ธ๋ดํ๊ณ ๊ธฐ๋ค๋ฆฌ์โฆ์๋ฌ๊ฐ ์๋โฆ.์ตโฆ๋๋ค)<br>๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ํด๊ฒฐํฉ๋๋ค.</p><p>Docker Machine ๊ด๋ จ ๋งํฌ</p><ul><li>Docker Machine์ ์ด์ฉํ์ฌ Mac์์ docker ์ด์ํ๊ธฐ :<br><a href="http://blog.saltfactory.net/running-docker-on-mac-using-with-docker-machine/" target="_blank" rel="external">http://blog.saltfactory.net/running-docker-on-mac-using-with-docker-machine/</a>)</li></ul></blockquote><p>http://<your_ipaddress>:[YOUR_PORT_FOR 80/tcp] ์
๋ ฅํ๋ฉด ์ฌ์ดํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.<br>์๋ฅผ ๋ค์ด์ , <a href="http://192.168.99.100:32773" target="_blank" rel="external">http://192.168.99.100:32773</a></your_ipaddress></p><blockquote><p>์ฐธ๊ณ ) docker-machine ip default์์ ๋์จ ์์ดํผ๋ก ์คํํ์ ๋ ์๋์ ์ฐพ์๋ณธ ๋งํฌ<br><a href="http://bluese05.tistory.com/15?category=559611" target="_blank" rel="external">http://bluese05.tistory.com/15?category=559611</a></p><p>๋ง์ฝ ์๋๋ค๋ฉด, eval โ$(docker-machine env default)โ ๋ช
๋ น์ด ์คํ ํ<br>์ปจํ
์ด๋, ์ด๋ฏธ์ง ๋ค์ ์คํ.<br>docker run โname static-site-sample -e AUTHOR=โscarlett.kimโ -d -P dockersamples/static-site<br>(<a href="http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-machine.html" target="_blank" rel="external">http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-machine.html</a>)</p></blockquote><p>๊ฐ์ ์๊ฐ์ ๋๋ฒ์งธ ์น์๋ฒ๋ฅผ ์คํ์ํฌ ์ ์๋ค. ์ปจํ
์ด๋์ ์น์๋ฒ์ ์ปค์คํ
ํธ์คํธ ํฌํธ ๋ฒํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.</p><blockquote><p>docker run โname static-site-2 -e AUTHOR=โYour Nameโ -d -p 8888:80 dockersamples/static-site</p></blockquote><p>์ค์ ์๋ฒ์ ์ด๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ ์ฐ๋ฆฌ๋ ๋์ปค ์ธ์คํจ ๊ทธ๋ฆฌ๊ณ docker(ํ๊ฒฝ ๋ณ์๋ก passed๋ ๋์ปค์ AUTHER์ ๋ณผ ์ ์๋ค.) ๋ช
๋ น์ด ์์์ ์คํ์ํค๋ ๊ฒ์ด ํ์ํฉ๋๋ค. </p><p>์ง๊ธ ๋์ปค ์ปจํ
์ด๋์์์ ์น์๋ฒ๋ฅผ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ ? ๋์ปค์ด๋ฏธ์ง๋ฅผ ์ด๋ป๊ฒ ์์ ์ ๊ฒ์ผ๋ก ์์ฑํ๋๊ฐ?<br>๋ค์ ์ฃผ์ ์์ ๋ค๋ฃจ์ง๋ง, ๋จผ์ ์ฌ์ฉํ์ง ์๋ ์ปจํ
์ด๋๋ค์ ๋ชจ๋ ๋ฉ์ถ๊ณ ์ง์์ผํฉ๋๋ค.</p><h2 id="๋์ปค์ด๋ฏธ์ง"><a href="#๋์ปค์ด๋ฏธ์ง" class="headerlink" title="๋์ปค์ด๋ฏธ์ง"></a>๋์ปค์ด๋ฏธ์ง</h2><p>์ด ๋ถ๋ถ์์๋ ๋์ปค์ด๋ฏธ์ง์ ๋ํด ๊น๊ฒ ํ๊ณ ๋ค๋ ค๊ณ ํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ์์นํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ผ๋ถ ์ด๋ฏธ์ง๋ฅผ ๋์ปค ํด๋ผ์ฐ๋๋ก ํธ์ ํ ๊ฒ์
๋๋ค.<br>๋์ปค ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค. ์ด์ ์์ ์์๋ ๋ ์ง์คํธ๋ฆฌ์์ dockersamples/static-site ์ด๋ฏธ์ง๋ฅผ ๊บผ๋ด ๋์ปค ํด๋ผ์ด์ธํธ์๊ฒ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์คํํ๋๋ก ์์ฒญ ํ์ต๋๋ค. </p><p>์์คํ
์ ๋ก์ปฌ์ ์ฌ์ฉ๊ฐ๋ฅํ ์ด๋ฏธ์ง๋ค์ ๋ณด๊ธฐ ์ํด docker images ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค. </p><blockquote><p>$ docker images</p></blockquote><p>TAG ์ปฌ๋ผ์ ์ด๋ฏธ์ง์ ํน์ ์ค๋
์ท์ ๋งํ๋ฉฐ, ID(IMAGE ID)๋ ํด๋น ์ด๋ฏธ์ง์ ํด๋นํ๋ ๊ณ ์ ์๋ณ์ ์
๋๋ค. </p><p>๊ฐ๋จํ ์ค๋ช
ํ๋ฉด ๊น ์ ์ฅ์์ ์ด๋ฏธ์ง๋ก ์๊ฐํ ์ ์์ต๋๋ค. (์ด๋ฏธ์ง๋ ๋ณ๊ฒฝ๋ ๊ฒ๋ค์ ์ปค๋ฐํ ์ ์๊ณ , ๋ค์ํ ๋ฒ์ ผ์ ๊ฐ์ง๋๋ค) ํน๋ณํ ๋ฒ์ ผ ๋๋ฒ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๋ฉด, ํด๋ผ์ด์ธํธ๋ latest๊ฐ ๊ธฐ๋ณธ๊ฐ์
๋๋ค. </p><p>์๋ฅผ ๋ค์ด ubuntu์ด๋ฏธ์ง์ ํน์ ๋ฒ์ ผ์ ๋ด๋ ค ๋ฐ์ ์ ์์ต๋๋ค. </p><blockquote><p>$ docker pull ubuntu:12.04</p></blockquote><p>์ด๋ฏธ์ง์ ๋ฒ์ ผ ์ ๋ณด๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋์ปค ํด๋ผ์ด์ธํธ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก latest๋ก ์ง์ ์ด ๋ฉ๋๋ค.<br>์๋ฅผ ๋ค์ด ์๋ docker pull๋ช
๋ น์ด๋ ubunto:latest์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ ์ต๋๋ค. </p><blockquote><p>$ docker pull ubuntu</p></blockquote><p>์๋ก์ด ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ ์ง์คํธ๋ฆฌ๋ก๋ถํฐ(๋์ปค ์คํ ์ด์ ๊ฐ์) ์ด๋ฏธ์ง๋ฅผ ์ป๊ฑฐ๋ ์์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. </p><p>๋์ปค ์คํ ์ด์๋ ์ฌ์ฉ๊ฐ๋ฅํ ์ด๋ฏธ์ง๋ค์ด ์ ์ญ ๋ง๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค. </p><p>docker search๋ผ๋ ๋ช
๋ น์ด๋ฅผ ํตํด ์ง์ ์ ์ผ๋ก ์ด๋ฏธ์ง๋ค์ ์ฐพ์์ ์์ต๋๋ค. </p><p>์ด๋ฏธ์ง์ ๊ด๋ จํ์ฌ ์ค์ํ ์ฐจ์ด์ ์ base image์ child image์ด๋ค. </p><p>Base image๋ parent ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง์ง ์๊ณ , ์ผ๋ฐ์ ์ผ๋ก ubuntu, apline ๋๋ debian๊ณผ ๊ฐ์ OS๊ฐ ์๋ ์ด๋ฏธ์ง์
๋๋ค.</p><p>Child image๋ base image์ ๊ตฌ์ถํ๊ณ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐํ๋ ์ด๋ฏธ์ง ์
๋๋ค. </p><p>๋ ๋ค๋ฅธ ํต์ฌ ๊ฐ๋
์ Official image์ User image์
๋๋ค. (๋๋ค base image ์ด๊ฑฐ๋ child images์
๋๋ค)</p><p>Official image๋ ๋์ปค๊ฐ ์น์ธํ ์ด๋ฏธ์ง ์
๋๋ค. Docker, Inc๋ ๋ชจ๋ ๊ณต์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ฝํ
์ธ ๋ฅผ ๊ฒํ ํ๊ณ ๊ฒ์ํ๋ ์ ์ฉ ํ์ ํ์ ํฉ๋๋ค. ์ด ํ์ ์
์คํธ๋ฆผ ์ํํธ์จ์ด ๊ด๋ฆฌ์, ๋ณด์ ์ ๋ฌธ๊ฐ ๋ฐ ๊ด๋ฒ์ํ Docker ์ปค๋ฎค๋ํฐ์ ํ๋ ฅํฉ๋๋ค. ์ด๋ฌํ ์ด๋ฆ ์์๋ ์กฐ์ง ๋๋ ์ฌ์ฉ์ ์ด๋ฆ์ด ๋ถ์ง ์์ต๋๋ค. </p><p>์์ ์ด๋ฏธ์ง ๋ชฉ๋ก์์ ํ์ด์ฌ, ๋
ธ๋, alpine, nginx ์ด๋ฏธ์ง๋ ๊ณต์ (๊ธฐ๋ณธ) ์ด๋ฏธ์ง ์
๋๋ค. </p><p>ํจ์ฌ ๋ ์์ธํ ๋ด์ฉ์ <a href="https://docs.docker.com/docker-hub/official_repos/" target="_blank" rel="external">https://docs.docker.com/docker-hub/official_repos/</a> ์์ ํ์ผํ ์ ์์ต๋๋ค. </p><p>User image๋ ์ฌ์ฉ์๊ฐ ๋ง๋ค๊ณ ๊ณต์ ํ๋ ์ด๋ฏธ์ง ์
๋๋ค. base images๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐํ๋ ์ด๋ฏธ์ง ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค์ user/image-nameํํ๋ฅผ ๊ฐ์ง๋๋ค. user๊ฐ์ ๋์ปค์คํ ์ด user ์ด๋ฆ ์ด๊ฑฐ๋ ์กฐ์ง ์ด๋ฆ์ ๊ฐ์
๋๋ค. </p>]]></content>
<summary type="html">
<p><strong> ํด๋น ๊ธ์ <a href="https://github.com/docker/labs/blob/master/beginner/chapters/webapps.md" target="_blank" rel="external">https://g
</summary>
<category term="๋์ปค, ๋ฒ์ญ" scheme="https://devhaeyeon.github.io/tags/%EB%8F%84%EC%BB%A4-%EB%B2%88%EC%97%AD/"/>
</entry>
<entry>
<title>๊ฐ๋ฐ ๋ฌธ์์์ 'behind the scene'์ ๋ป</title>
<link href="https://devhaeyeon.github.io/2018/03/06/translate-tip1/"/>
<id>https://devhaeyeon.github.io/2018/03/06/translate-tip1/</id>
<published>2018-03-06T09:41:39.000Z</published>
<updated>2018-03-06T09:51:15.000Z</updated>
<content type="html"><![CDATA[<h2 id="์๋ก "><a href="#์๋ก " class="headerlink" title="์๋ก "></a>์๋ก </h2><p>๋์ปค ๊ณต์ ํํ์ด์ง์์ ์ํ ํํ ๋ฆฌ์ผ์ ๋ฒ์ญํ๋ค๊ฐ ๋๊ด์ ๋ถ๋ชํ๋ค.<br>โ๋ค์์ ์ฅ๋ฉด์ด?โ<br>โ์ฅ๋ฉด์ด ๋ค์์?โ<br> โ๋ค์์ ์คํ์ด ๋๊ณ ์๋ค?โ<br> โ์ ? ๋ฌด์์โ<br>โฆ<br>์ ๋ง์ ํด์๋ค์ ํ์ง๋ง, ๋ฒ์ญ์ ํ ์ ์์๋ค.<br>โฆ</p><h2 id="์๋ฏธ"><a href="#์๋ฏธ" class="headerlink" title="์๋ฏธ"></a>์๋ฏธ</h2><p>์ฌ์ ์ ์ธ ์๋ฏธ : โ๋ฌด๋ ๋ค์์ / ์ด๋ฉด์์โ<br>๊ฐ๋ฐ ๋ฌธ์์์ ๋ฒ์ญํ ๋ ๋๋ต์ ์ธ ์๋ฏธ๋ก๋ โ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ์ด๋ค ์ผ์ด ์ผ์ด๋๋ค.โ<br>์ฝ๊ฐ โ๋ด๋ถ์ ์ธโ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.</p>]]></content>
<summary type="html">
<h2 id="์๋ก "><a href="#์๋ก " class="headerlink" title="์๋ก "></a>์๋ก </h2><p>๋์ปค ๊ณต์ ํํ์ด์ง์์ ์ํ ํํ ๋ฆฌ์ผ์ ๋ฒ์ญํ๋ค๊ฐ ๋๊ด์ ๋ถ๋ชํ๋ค.<br>โ๋ค์์ ์ฅ๋ฉด์ด?โ<br>โ์ฅ๋ฉด์ด ๋ค์์?โ<br>
</summary>
<category term="๋ฒ์ญํ, tip" scheme="https://devhaeyeon.github.io/tags/%EB%B2%88%EC%97%AD%ED%8C%81-tip/"/>
</entry>
<entry>
<title>(๋์ปค) ๋์ปค ํํค์น๊ธฐ step1. Running your first container</title>
<link href="https://devhaeyeon.github.io/2018/03/06/docker-sample-tutorial1/"/>
<id>https://devhaeyeon.github.io/2018/03/06/docker-sample-tutorial1/</id>
<published>2018-03-06T09:33:12.000Z</published>
<updated>2018-03-06T09:36:33.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(๊ด๋ จ ์์น๋ ํด๋น ์๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.)<br>(์ถ์ฒ : <a href="https://github.com/docker/labs/tree/master/beginner" target="_blank" rel="external">https://github.com/docker/labs/tree/master/beginner</a>)</p></blockquote><h2 id="์๋ก "><a href="#์๋ก " class="headerlink" title="์๋ก "></a>์๋ก </h2><p>์ด ๊ธ์ ๋ณด๊ธฐ ์ ์ ๋์ปค ์ค์น๊ฐ ํ์ํฉ๋๋ค. ๋์ปค๋ฅผ ์ค์นํ๋ค๋ฉด ์ด์ ํ๋ค๊ณ ๊ธด๊ธด ์ฌ์ ์ด ์์๋ ๊ฒ์
๋๋ค.<br>์ด ๊ธ์์๋ ๊ฒฝ๋ํ๋ ๋ฆฌ๋
์ค ์ปจํ
์ด๋์ธ ์ํ์ธ์ ์คํ์ํค๊ณ docker run ๋ช
๋ น์ด๋ฅผ ์ตํ ๊ฒ์
๋๋ค. </p><blockquote><p>$ docker pull alpine</p></blockquote><p>โ๋์ปค๊ฐ ์์คํ
์ ์ค์น๋ฅผ ํ๋๋ฐ, ์์ ๋ช
๋ น์ด๋ฅผ ์น ํ์ permission denied์๋ฌ๊ฐ ๋ ์๋ ์์ต๋๋ค.<br>๊ทธ๋ผ <a href="https://docs.docker.com/get-started/" target="_blank" rel="external">https://docs.docker.com/get-started/</a> ๋ก๊ฐ์ ํด๋น ํํ ๋ฆฌ์ผ ๋ถํฐ ๋ค์ ์์ํ๋ฉด ๋ฉ๋๋ค.<br>๋ง์ฝ ๋ฆฌ๋
์ค ํ๊ฒฝ์ด๋ผ๋ฉด sudo docker ์ฒ๋ผ โsudoโ๊ฐ ํ์ ํฉ๋๋ค.<br>๋์ ์ ์ด ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋์ปค ๊ทธ๋ฃน(<a href="https://docs.docker.com/install/linux/docker-ee/ubuntu/)์" target="_blank" rel="external">https://docs.docker.com/install/linux/docker-ee/ubuntu/)์</a> ์๋ก ๋ง๋ค ์ ์์ต๋๋ค.โ</p><p>pull ๋ช
๋ น์ด๋ ๋์ปค ๋ ์ง์คํธ๋ฆฌ์์ ๋ถํฐ ์์คํ
์ โalpineโ ์ด๋ฏธ์ง๋ฅผ fetchํ๊ณ saveํ๋ ๋ช
๋ น์ด ์
๋๋ค.<br>์์คํ
์ ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ฆฌ์คํธ๋ฅผ ๋ณด๋ ค๋ฉด docker images๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์น๋ฉด ๋ฉ๋๋ค.</p><blockquote><p>$ docer images</p></blockquote><h2 id="docker-Run"><a href="#docker-Run" class="headerlink" title="docker Run"></a>docker Run</h2><p>์ด๋ฏธ์ง๋ก๋ถํฐ ๋์ปค ์ปจํ
์ด๋๋ฅผ run ํ๊ธฐ ์ํด์๋ docker run ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.</p><blockquote><p>$ docker run apline ls -l</p></blockquote><p>run์ ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ ๋ง์ ์ผ๋ค์ด ์ผ์ด๋ฉ๋๋ค.</p><ol><li>๋์ปค ํด๋ผ์ด์ธํธ๋ ๋์ปค ๋ฐ๋ชฌ์ ์ฐ๊ฒฐํฉ๋๋ค.</li><li>๋์ปค ๋ฐ๋ชฌ์ ๋ก์ปฌ ์ ์ฅ์๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฏธ์ง๊ฐ (์ฌ๊ธฐ์๋ alpine์ด๋ฏธ์ง) ๋ก์ปฌ์์ ์ฌ์ฉํ ์ ์๋์ง, Docker Store๋ก๋ถํฐ ๋ค์ด๋ก๋๊ฐ ๊ฐ๋ฅํ์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.(docker pull alpine๋ฅผ ํ๊ธฐ ์ ์ ๋ฌธ์ ๊ฐ ์๊ธด ๋ค๋ฉด, ๋ค์ด๋ก๋์ ์คํจํฉ๋๋ค.)</li></ol><p>docker run alpine๋ฅผ ์คํํ๋ฉด, ls -l๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋์ปค๋ ์ง์ ํ ๋ช
๋ น์ด๋ฅผ ์คํํ๊ณ , listํ๊ณ ์๋ ๊ฒ๋ค์ ๋ณผ์ ์์ต๋๋ค. </p><p>์ข ๋ ํฅ๋ฏธ๋ก์ด ์๋์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด๋ณด๋ฉด</p><blockquote><p>$docker run alpine echo โhello from alpineโ</p></blockquote><p>ํ๋ฉด์ โhello from alpineโ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.<br>์ด ์ผ์ด์ค๋ ๋์ปค ํด๋ผ์ด์ธํธ๊ฐ alpine ์ปจํ
์ด๋๋ก ๋ถํฐ echo ๋ช
๋ น์ด๋ฅผ ์คํํ๊ณ ์ข
๋ฃํ๋ ์ผ์ด์ค ์
๋๋ค.<br>๋ง์ฝ ํด๋น ๋ช
๋ น์ด๋ฅผ ์ด๋ฏธ ์คํํ์๋ค๋ฉด, ๋น ๋ฅด๊ฒ ์คํ์ด ๋ฉ๋๋ค.<br>์ด๋ฏธ์ง๋ ๊ฐ์ ๋จธ์ ์ ๋ถํ
ํ๊ณ , ๋ช
๋ น์ด๋ฅผ ์คํํ๊ณ , killingํฉ๋๋ค.<br>์ปจํ
์ด๋๊ฐ ํจ์ฌ ๋ ๋น ๋ฅธ ๊ฒ์ ์ ์ ์์ต๋๋ค.</p><blockquote><p>$ docker run apline /bin/sh</p></blockquote><p>๊ธฐ๋ค๋ฆฌ๋ฉด, ์๋ฌด ๊ฒ๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๊ฑด ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. ๋ํ์ ์์ ๋ํ์ ํฐ๋ฏธ๋์์ ์คํ์ํค์ง ์๋๋ค๋ฉด, ๋ช
๋ น์ด๋ฅผ ์คํํ ํ ์ข
๋ฃ ๋ฉ๋๋ค. ( ๊ทธ๋์ ์ด ์์ ์์ ์ด ๋ช
๋ น์ด๊ฐ ์ข
๋ฃ ๋์ง ์๊ฒ ํ๊ธฐ ์ํด์๋ docker run -it alpine /bin/sh ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.)</p><p>์ปจํ
์ด๋ ์ ๋ด๋ถ์์๋ ls -l, uname -a์ ๊ฐ์ ๋ช๋ช์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. exit ๋ช
๋ น์ด๋ ์ปจํ
์ด๋๋ฅผ ์ข
๋ฃํ๋ ๋ช
๋ น์ด์
๋๋ค.</p><p>docker ps๋ผ๋ ๋ช
๋ น์ด๋ ์ต๊ทผ์ ์คํ๋ ๋ชจ๋ ๋์ปค ์ปจํ
์ด๋๋ฅผ ๋ณด๋ ๋ช
๋ น์ด์
๋๋ค.</p><blockquote><p>$ docker ps</p></blockquote><p>์คํ๋๊ณ ์๋ ์ปจํ
์ด๋๊ฐ ์๋ค๋ฉด, ๋น ์ค์ ๋ณผ ์ ์์ต๋๋ค.<br>์ ์ฉํ ์ฐ์ด๋ ๋ช
๋ น์ด๋ โdocker ps -aโ</p><p>์์ ๋ช
๋ น์ด๋ฅผ ํตํด ์คํํ๋ ๋ชจ๋ ์ปจํ
์ด๋ ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค.<br>STATUS ์ปฌ๋ผ์ ํตํด ์ด๋ค ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋ ์๊ฐ์ ์ ์ ์์ต๋๋ค. </p><p>์ปจํ
์ด๋์ ํ๋์ ๋ช
๋ น์ด๋ง ์
๋ ฅํ ์ ์์๊น์?<br>NO!</p><blockquote><p>$ docker run -it run alpine /bin/sh<br>/ # ls<br>/ # uname -a</p></blockquote><p>run ๋ช
๋ น์ด์ -it๋ฅผ ํ๋๊ทธ๋ฅผ ๊ฐ์ด ์ฐ๋ฉด ์ปจํ
์ด๋์์์ ๋ํ์ tty์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ปจํ
์ด๋์์ ์ฌ๋ฌ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.) </p><p> docker run๋ช
๋ น์ด๋ ํธํ๊ณ ์๊ฐ์ ๋จ์ถ ์์ผ์ฃผ๋ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ๋ช
๋ น์ด์
๋๋ค.<br>run์ ๋ํด ํจ์ฌ ๋ ๋ง์ด ์๊ณ ์ถ์ผ๋ฉด docker run โhelp์ด๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ํ๋ ๋ชจ๋ ํ๋๊ทธ ๋ฆฌ์คํธ๋ค์ ๋ณผ ์ ์์ต๋๋ค. </p><p> ๋์ปค๋ฅผ ์ฌ์ฉํ๋ฉด์ docker run๋ช
๋ น์ด๋ ์์ฃผ ๋ณด๊ฒ ๋ ๊ฒ ์
๋๋ค. </p><h2 id="Terminology"><a href="#Terminology" class="headerlink" title="Terminology"></a>Terminology</h2><p>์ ๋ง์ ๋์ปค ์ฉ์ด๋ฅผ ๋ณผ ์ ์๋๋ฐ, ๋์ปค ์ฉ์ด์ ๋ํด์ ์ค๋ช
ํ๋ ค ํฉ๋๋ค.</p><ul><li>Image : ํ์ผ ์์คํ
๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์ ํํ๋ ์ปจํ
์ด๋๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํฉ๋๋ค. docker inspect alpine์ ์คํํ๋ฉด ์ด์ ๋ํ ์์ธํ ๊ฒ์ ์ ์ ์๋ค. alpine์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ๊ธฐ ์ํด docker pull ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.<br>docker run hello-world๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด, docker pull์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋์ด hello-world ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ์ต๋๋ค. </li><li>Container : ๋์ปค ์ด๋ฏธ์ง์ ์ธ์คํด์ค๋ฅผ ์คํํ๋ฉด ์ปจํ
์ด๋๋ ์ค์ง์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํฉ๋๋ค. ์ปจํ
์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์
, ์์กด์ฑ์ด ์๋ ์ปจํ
์ด๋๋ค์ ํฌํจํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ์ปจํ
์ด๋์ ์๋ ์ปค๋์ ๊ณต์ ํ๊ณ , ํธ์คํธ OS์์ ์๋ ๊ณต๊ฐ์ ์ ์ ์ ์๋ ์ฐ๊ด๋์ด์ง ํ๋ก์ธ์ค๋ค์ ์คํํฉ๋๋ค. ์ปจํ
์ด๋๋ ๋ค์ด๋ก๋ ๋ฐ์์ง alpine ์ด๋ฏธ์ง๋ฅผ docker run ๋ช
๋ น์ด๋ฅผ ํตํด์ ์ปจํ
์ด๋๊ฐ ์์ฑ๋ฉ๋๋ค. docker ps ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋์ด์ง ์ปจํ
์ด๋ ๋ฆฌ์คํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. </li><li>Docker daemon : ๋์ปค ์ปจํ
์ด๋๋ฅผ ๊ตฌ์ถ, ์คํ ๋ฐ ๋ฐฐํฌํ๋ ํธ์คํธ์์ ์คํ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค์
๋๋ค.</li><li>Docker client : ๋์ปค ๋ฐ๋ชฌ๊ณผ ํจ๊ป ์ฌ์ฉ์์ ์ํธ ์์ฉํ ์ ์๊ฒ ํ์ฉํ๋ ๋ช
๋ น์ด ํด์
๋๋ค.</li><li>Docker Store : ์ปจํ
์ด๋, ํ๋ฌ๊ทธ์ธ ๋ฑ๋ฑ ๋์ปค ์๋์
์ ์ฐพ์ ์ ์๊ณ , ์ํฐํ๋ผ์ด์ฆ์์ ์ฌ์ฉํ ์ ์๋ ๋์ปค ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ์ด๋ค. (<a href="https://store.docker.com/" target="_blank" rel="external">https://store.docker.com/</a>)</li></ul>]]></content>
<summary type="html">
<blockquote>
<p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(๊ด๋ จ ์์น๋ ํด๋น ์๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.)<br>(์ถ์ฒ : <a href="https://github.com/docker/labs/tree/master/beginne
</summary>
<category term="๋์ปค, ๋ฒ์ญ" scheme="https://devhaeyeon.github.io/tags/%EB%8F%84%EC%BB%A4-%EB%B2%88%EC%97%AD/"/>
</entry>
<entry>
<title>์น ์ฑ๋ฅ ์ต์ ํ</title>
<link href="https://devhaeyeon.github.io/2017/12/03/web-performance/"/>
<id>https://devhaeyeon.github.io/2017/12/03/web-performance/</id>
<published>2017-12-03T13:10:17.000Z</published>
<updated>2017-12-12T16:27:03.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(๊ด๋ จ ์์น๋ ํด๋น ์๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.)<br>(์ถ์ฒ : <a href="http://zuu.kr/izgd" target="_blank" rel="external">http://zuu.kr/izgd</a>)</p></blockquote><h2 id="ํจ๊ณผ์ ์ธ-์ฑ๋ฅ-๊ฐ์ -๊ฐ์ด๋"><a href="#ํจ๊ณผ์ ์ธ-์ฑ๋ฅ-๊ฐ์ -๊ฐ์ด๋" class="headerlink" title="ํจ๊ณผ์ ์ธ ์ฑ๋ฅ ๊ฐ์ ๊ฐ์ด๋"></a>ํจ๊ณผ์ ์ธ ์ฑ๋ฅ ๊ฐ์ ๊ฐ์ด๋</h2><p>์ธํฐ๋ท์ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ค๋ ๋์ด๋๊ณ ์๊ณ , ์น ํ๋ซํผ๋ ์ ์ ์ปค์ง๊ณ ์์ต๋๋ค.<br>์ด๋ฅผ ๊ฐ๋ฐํ๋ ์ฐ๋ฆฌ๋ค์ ์ธํฐ๋ท ๋คํธ์ํฌ ํ๊ฒฝ, ๋ฐ์ดํฐ ํฌ๊ธฐ ๋ฑ๋ฑ ๋ณต์ก์ฑ์ ๋ฐ์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง ์น์์ ์ฌ์ฉ์๋ค์ ๋๋ ์ ์์ต๋๋ค. </p><p>์ค๋๋ ์ ์น ์ํ๋ฅผ ์ดํด๋ณด๋ฉด ํ๊ท ๋คํธ์ํฌ ์๋๋ 7Mb/s์ ์๋ ์ ํ์ ๊ฐ์ง๊ณ ์๊ณ , ์ ์ธ๊ณ 74์ต ์ธ๊ตฌ ์ค ๋จ์ง 46%๋ง์ด ์ธํฐ๋ท์ ์ ์ํ ์ ์์ต๋๋ค. ์ธํฐ๋ท ์ฌ์ฉ์์ 93%๊ฐ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ํตํด ์จ๋ผ์ธ์ ์ ์ํ๊ณ ์์ต๋๋ค. </p><p>๋
์ผ๊ณผ ๋ธ๋ผ์ง๊ณผ ๊ฐ์ ์ธํฐ๋ท์ด ๋ฐ๋ฌํ์ง ์์ ๋๋ผ์์๋ ๋ฐ์ดํฐ 500MB ํจํท์ ๊ตฌ๋งคํ๋๋ฐ 1์๊ฐ์์ 13 ์๊ฐ ์ ๋ ์์๋ฉ๋๋ค. </p><p>์น์ฌ์ดํธ๋ ์๋ฒฝํ ํํ๊ฐ ์๋์ด์ ํ๊ท ์ ์ผ๋ก ์ฌ์ดํธ๋ ์ฝ 3MB์ ๋ ์
๋๋ค.<br>(์ด๋ฏธ์ง๋ 400MB, 1.7MB์ ๋์ญํญ) ์ด๋ ์น ํ๋ซํผ์๋ง ๊ด๋ จ๋ ๋ฌธ์ ๋ ์๋๋๋ค. </p><p>๋ถํน์ ๋ฒ๊ทธ ์์ ์ ์ํด 200MB๋ฅผ ๋ค์ด๋ก๋ ํด์ผํ๋ ์ฌ๋ก๋ ์์์ต๋๋ค. </p><p>ํ๋ซํผ๋ค์ ๊ฐ๋ฐํ๋ ๊ธฐ์ ์๋ค์ ํญ์ ์ต์ ์ ๋
ธํธ๋ถ, ์ด๊ณ ์ ์ธํฐ๋ท ํ๊ฒฝ์์ ์งํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ค(์ผ๋ฐ์ ์ธ ์ ์ )์ ํ๊ฒฝ์ ๊ณ ๋ คํ์ง ์๊ธฐ๋ ํฉ๋๋ค.</p><p>์ด๋ป๊ฒ ํ๋ฉด ์ฑ๋ฅ์ ์ผ๋์ ๋๊ณ ๊ฐ๋ฐํ ์ ์์์ง์ ๋ํด ์ด์ ์ค๋ช
์ ํ๋ ค๊ณ ํฉ๋๋ค. </p><h2 id="๋ชจ๋ -asset์-์ต์ ํํ๊ธฐ"><a href="#๋ชจ๋ -asset์-์ต์ ํํ๊ธฐ" class="headerlink" title="๋ชจ๋ asset์ ์ต์ ํํ๊ธฐ"></a>๋ชจ๋ asset์ ์ต์ ํํ๊ธฐ</h2><p>์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ์ง๋ง ํ์ฉ๋๊ฐ ๋ฎ์ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ asset์ ๋ถ์ํ๊ณ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ ๋ถํฐ ์์๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ context ๋ถ์๊ณผ ๋์์ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋์ ๋ฆฌ์์ค๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. </p><blockquote><p>request๋ ์ฌ์ฉ์์ ๋ทฐํฌํธ ๋ด์ ์ฝํ
์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ asset์ด ํฌํจ๋์ด์๋ ๊ฒฝ์ฐ ์ค์ํฉ๋๋ค.</p></blockquote><p>๋๋ถ๋ถ์ ์ฌ์ดํธ์์ asset์ HTML, CSS, ๋ก๊ณ , ์น ๊ธ๊ผด ๋ฐ ์ด๋ฏธ์ง๋ก ๋ณผ ์ ์์ต๋๋ค.<br>๊ทธ ์ธ javascript, ์ถ์ ์ฝ๋, ๊ด๊ณ ๋ฑ๋ฑ ์์ญ ๊ฐ์ง์ asset์ด ์๋ค. ํ์ง๋ง ์ด ์ค ๊ฐ์ฅ ์ค์ํ asset์ ๋ํด ์ฐ์ ์์๋ฅผ ์ ํ์ฌ ์ต์ ํ๋ฅผ ์ํฌ ์ ์์ต๋๋ค.</p><p><link rel="preload">๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์ฝํ
์ธ ๊ฐ ์ ์๊ฐ์ ๋ ๋๋ง ๋๋๋ก asset์ ์ฐ์ ์์๋ฅผ high๋ก ์๋์ผ๋ก ๊ฐ์ํ ์ ์์ต๋๋ค. </p><p>์ด ๊ธฐ์ ์ Time to Interactive ๋ฉํธ๋ฆญ์์ ์๋นํ ๊ฐ์ ์ ๊ฐ์ ธ์ ์ต์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒํฉ๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*JT-53LslhwOOqTgv1dGoXg.png" alt="linkImage"></p><p>์ค์ํ request๋ ์ฌ์ ํ โโ๋ง์ ์ฌ๋๋ค์๊ฒ ๋ธ๋ ๋ฐ์ค์ฒ๋ผ ๋ณด์
๋๋ค. ๊ณต์ ๊ฐ๋ฅํ ์๋ฃ๊ฐ ๋ถ์กฑํด๋ ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ ๋์์ด๋์ง ์์ต๋๋ค.<br>(์ฐธ๊ณ : Chrome์์ Addy์ ์ฌ์ ๋ก๋, ํ๋ฆฌ ํ์น ๋ฐ ์ฐ์ ์์ <a href="https://medium.com/reloading/preload-prefetch-and-priorities-in-chrome-776165961bbf" target="_blank" rel="external">https://medium.com/reloading/preload-prefetch-and-priorities-in-chrome-776165961bbf</a>)<br><img src="https://cdn-images-1.medium.com/max/800/1*ju18GQzgF-TQDMrYdtPelg.gif" alt="linkimage2"></p><p>Light Lighthouse ์ฑ๋ฅ ๋๊ตฌ ๋ฐ Critical Request Chains ๊ฒ์ฌ๋ฅผ ์ฌ์ฉ ํ๊ฑฐ๋ Chrome ๊ฐ๋ฐ์ ๋๊ตฌ์ ๋คํธ์ํฌ ํญ์์ ์์ฒญ ์ฐ์ ์์๋ฅผ ํ์ธํ์ฌ ์์ฒญ์ ์ฐ์ ์์ ๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ์ ์ถ์ ํฉ๋๋ค .</p><h3 id="์ผ๋ฐ์ ์ธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ"><a href="#์ผ๋ฐ์ ์ธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ" class="headerlink" title="์ผ๋ฐ์ ์ธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ"></a>์ผ๋ฐ์ ์ธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ</h3><ol><li>์บ์ํ๊ธฐ</li><li>์์ถ ์ฌ์ฉ</li><li>์ค์ asset์ ์ฐ์ ์์ ์ง์ </li><li>์ฝํ
์ธ ์ ์ก ๋คํธ์ํฌ ์ฌ์ฉ</li></ol><h2 id="์ด๋ฏธ์ง-์ต์ ํ"><a href="#์ด๋ฏธ์ง-์ต์ ํ" class="headerlink" title="์ด๋ฏธ์ง ์ต์ ํ"></a>์ด๋ฏธ์ง ์ต์ ํ</h2><p>์ด๋ฏธ์ง๋ ์ข
์ข
์น ํ์ด์ง์ ์ ์ก ๋ ํ์ด๋ก๋์ ๋๋ถ๋ถ์ ์ฐจ์งํ๋ฏ๋ก ์ด๋ฏธ์ง์์ ์ต์ ํ๊ฐ ๊ฐ์ฅ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ฌ๋ถ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด๋๋ ๊ธฐ์กด์ ๋ง์ ์ ๋ต๊ณผ ๋๊ตฌ๊ฐ ์์ง๋ง ์ง๋ฌธ ํ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ โ์ด ์ด๋ฏธ์ง๊ฐ ๋ฉ์์ง์ ํจ๊ณผ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ํ์์ ์
๋๊น?โ ์
๋๋ค. ์ด๋ฅผ ์ ๊ฑฐ ํ ์ ์๋ค๋ฉด ๋์ญํญ์ ์ ์ฝ ํ ๋ฟ๋ง ์๋๋ผ ์์ฒญ๋ ์ค์ผ ์ ์์ต๋๋ค.<br>์ด๋ค ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๊ธฐ์ ๋ก๋ ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. CSS์๋ ๊ทธ๋ฆผ์, ๊ทธ๋ผ๋์ธํธ, ์ ๋๋ฉ์ด์
๋๋ ๋ชจ์๊ณผ ๊ฐ์ ์ํธ ๋ฐฉํฅ์ ๋ํ ๋ค์ํ ์์ฑ์ด์์ด ์ ์ ํ๊ฒ ์คํ์ผ์ด ์ง์ ๋ DOM ์์์ ๋ํ asset์ ๊ตํ ํ ์ ์์ต๋๋ค.</p><h2 id="์ด๋ฏธ์ง์-์ฌ๋ฐ๋ฅธ-ํ์-์ ํ"><a href="#์ด๋ฏธ์ง์-์ฌ๋ฐ๋ฅธ-ํ์-์ ํ" class="headerlink" title="์ด๋ฏธ์ง์ ์ฌ๋ฐ๋ฅธ ํ์ ์ ํ"></a>์ด๋ฏธ์ง์ ์ฌ๋ฐ๋ฅธ ํ์ ์ ํ</h2><p>์ ์๋ฌผ์ ์ญ์ ํ ์์๋ ๊ฒฝ์ฐ ์ด๋ค ํ์์ด ์ ํฉํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ธฐ ์ ํ์ ๋ฒกํฐ ๊ทธ๋ํฝ๊ณผ ๋์คํฐ ๊ทธ๋ํฝ ์ฌ์ด์ ์ ์ฉ๋ฉ๋๋ค.</p><blockquote><p>๋ฒกํฐ : ํด์๋๋ ๋
๋ฆฝ์ ์ด๋ฉฐ ๋๊ฐ ํฌ๊ธฐ๊ฐ ์๋นํ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋ํ (์ , ๋ค๊ฐํ, ์ ๋ฐ ์ )์ผ๋ก ๊ตฌ์ฑ๋ ๋ก๊ณ ์ ๊ฐ์ ๊ฐ๋จํ asset์ด ์ ํฉํฉ๋๋ค. </p><p>๋์คํฐ : ํจ์ฌ ๋ ์์ธํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ์ง์ ์ ํฉํฉ๋๋ค.</p></blockquote><p>์ด ๊ฒฐ์ ์ ๋ด๋ฆฐ ํ์๋ JPEG, GIF, PNG-8, PNG-24 ๋๋ WEBP ๋๋ JPEG-XR๊ณผ ๊ฐ์ ์ต์ ํ์ ์ค์์ ์ ํํ ์์๋ ์ ์ ํ ํ์์ ๋นํธ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ์ ํญ์ด ๋์ด์ง๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ์ฌ๋ฐ๋ฅธ ์ ํ์ ํ ์ ์์๊น์? ๊ฐ์ฅ ์ ํฉํ ํ์์ ์ฐพ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><blockquote><p>JPEG : ๋ค์ํ ์์์ ์ฌ์ง (์ : ์ฌ์ง)<br>PNG-8 : ๋ช ๊ฐ์ง ์์์ ์ด๋ฏธ์ง<br>PNG-24 : ๋ถ๋ถ ํฌ๋ช
์ฑ์ด์๋ ์ด๋ฏธ์ง<br>GIF : ์ ๋๋ฉ์ด์
์ด๋ฏธ์ง</p></blockquote><p>Photoshop์ ํ์ง ์ ํ, ๋
ธ์ด์ฆ ๋๋ ์์ ์ ๊ฐ์ ๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ์ค์ ์ ํตํด ์ด๋ฌํ ๊ฐ ํญ๋ชฉ์ ๋ด๋ณด๋ผ ๋ ์ต์ ํ ํ ์ ์์ต๋๋ค. ์ค๊ณ์๊ฐ ์ฑ๋ฅ ๊ดํ์ ๋ํด ์๊ณ ์ฌ๋ฐ๋ฅธ ์ฌ๋ฐ๋ฅธ ์ฌ์ ์ค์ ์ ํตํด ์ฌ๋ฐ๋ฅธ ์ ํ์ asset์ ์ค๋น ํ ์ ์๋์ง ํ ์ ์์ต๋๋ค. (more info : <a href="http://designingforperformance.com/optimizing-images/#choosing-an-image-format" target="_blank" rel="external">http://designingforperformance.com/optimizing-images/#choosing-an-image-format</a>)</p><h2 id="์ด๋ฏธ์ง๋ฅผ-์๋ก์ด-ํ์์ผ๋ก-์คํํ๊ธฐ"><a href="#์ด๋ฏธ์ง๋ฅผ-์๋ก์ด-ํ์์ผ๋ก-์คํํ๊ธฐ" class="headerlink" title="์ด๋ฏธ์ง๋ฅผ ์๋ก์ด ํ์์ผ๋ก ์คํํ๊ธฐ"></a>์ด๋ฏธ์ง๋ฅผ ์๋ก์ด ํ์์ผ๋ก ์คํํ๊ธฐ</h2><p>์ด๋ฏธ์ง ํ์์ ์คํํธ๋ผ์์ WebP, JPEG 2000 ๋ฐ JPEG-XR๊ณผ ๊ฐ์ ์๋ก์ด ํ๋ ์ด์ด๊ฐ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ ์
์ฒด๊ฐ ๊ฐ๋ฐํ์ต๋๋ค. WebP by Google, Apple์ JPEG 2000, Microsoft์ JPEG-XR์
๋๋ค.</p><blockquote><p>WebP ๋ ๋ฌด์์ค ์์ถ๊ณผ ์์ค ์์ถ์ ๋ชจ๋ ์ง์ํ๋ฏ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฒฝ์์์
๋๋ค. ๋ฌด์์ค WebP๋ PNG๋ณด๋ค 26 % ์์ผ๋ฉฐ JPG๋ณด๋ค 25-34 % ์์ต๋๋ค. 74 % ๋ธ๋ผ์ฐ์ ์ง์์ ํตํด ํด๋ฐฑ (fallback)๊ณผ ํจ๊ป ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ ์ก ๋ ๋ฐ์ดํธ์ 1/3 ๋น์ฉ ์ ๊ฐ ํจ๊ณผ๊ฐ ์์ต๋๋ค. JPG ๋ฐ PNG๋ Photoshop ๋ฐ ๊ธฐํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ฉ ํ๋ก๊ทธ๋จ๋ฟ๋ง ์๋๋ผ ๋ช
๋ น ์ค ์ธํฐํ์ด์ค ( brew install webp) ๋ฅผ ํตํด WebP๋ก ๋ณํ ๋ ์ ์์ต๋๋ค .</p></blockquote><h2 id="์ด๋ฏธ์ง๋ฅผ-๋๊ตฌ-๋ฐ-์๊ณ ๋ฆฌ์ฆ์ผ๋ก-์ต์ ํ"><a href="#์ด๋ฏธ์ง๋ฅผ-๋๊ตฌ-๋ฐ-์๊ณ ๋ฆฌ์ฆ์ผ๋ก-์ต์ ํ" class="headerlink" title="์ด๋ฏธ์ง๋ฅผ ๋๊ตฌ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ํ"></a>์ด๋ฏธ์ง๋ฅผ ๋๊ตฌ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ํ</h2><p>์ผ๋ฐ์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋น๊ต์ ์์ SVG๋ฅผ ์ ํํ๋ค๋ฉด SVG๋ ์์ถํด์ผํฉ๋๋ค. SVGO ๋ ๋ถํ์ํ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ฌ SVG๋ฅผ ์ ์ํ๊ฒ ์ต์ ํ ํ ์์๋ ๋ช
๋ น์ค ๋๊ตฌ์
๋๋ค. ๋๋ ์น ์ธํฐํ์ด์ค๋ฅผ ์ ํธํ๊ฑฐ๋ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ์ ํ๋๋ ๊ฒฝ์ฐ Jake Archibald์ SVGOMG ๋ฅผ ์ฌ์ฉ ํ๋ฉด ๋ฉ๋๋ค. SVG๋ XML ๊ธฐ๋ฐ ํ์์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ธก์์ GZIP ์์ถ์๋ฐ์ ์๋ ์์ต๋๋ค.</p><p>ImageOptim ์ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ด๋ฏธ์ง ์ ํ์ ํ์ํ ์ ํ์
๋๋ค. pngcrush, pngquant, MozJPEG, Google Zopfli ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋ ํฌ๊ด์ ์ธ ์คํ ์์ค ํจํค์ง์ ํ๋ฅญํ ๋๊ตฌ ๋ชจ์์ด ๋ฒ๋ค๋ก ์ ๊ณต๋ฉ๋๋ค. Mac OS ์์ฉ ํ๋ก๊ทธ๋จ, ๋ช
๋ น ์ค ์ธํฐํ์ด์ค ๋ฐ Sketch ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ๊ณต๋๋ ImageOptim์ ๊ธฐ์กด ์ํฌ ํ๋ก์ฐ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. Linux ๋๋ Windows ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ImageOptim CLI๋ ์ฌ์ฉ์ค์ธ ํ๋ซํผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.</p><p>์ฌํด ์ด ์ ํ ์ธ์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ณด๋ ค๋ฉด Google์ Guetzli๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. WebP ๋ฐ Zopfli์ ๋ํ ํ์ต์์ ํ์ ๋ Open Source ์๊ณ ๋ฆฌ์ฆ์
๋๋ค. Guetzli๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ์์ถ ๋ฐฉ๋ฒ๋ณด๋ค ์ต๋ 35 % ๋ ์์ JPEG์ ์์ฑํฉ๋๋ค. ์ ์ผํ ๋จ์ ์ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์
๋๋ค (๋ฉ๊ฐ ํฝ์
๋น 1 ๋ถ์ CPU).</p><p>์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ ํ์ ์ํฌ ํ๋ก์ฐ์ ๋ง๋ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ต์ ํ ๊ณผ์ ์ ์๋ํํ๋ ๊ฒ์ด ์ด์์ ์
๋๋ค. ์ต์ ํ๋์ง ์์ ๊ท ์ด์ ๋ฏธ๋๋ฌ์ง๋ ์ด๋ฏธ์ง๋ ์์ต๋๋ค.</p><h2 id="์ฑ
์-์๊ณ -๋ฐ์์ด-๋น ๋ฅธ-์ด๋ฏธ์ง"><a href="#์ฑ
์-์๊ณ -๋ฐ์์ด-๋น ๋ฅธ-์ด๋ฏธ์ง" class="headerlink" title="์ฑ
์ ์๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ด๋ฏธ์ง"></a>์ฑ
์ ์๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ด๋ฏธ์ง</h2><p>10 ๋
์ ์ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํ๊ธฐ ์ํด ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ ์ฐพ์ง ๋ชปํ์ง๋ง ๋์์์ด ๋ณํํ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์น ํ๊ฒฝ์ ์ค๋๋ ๋งค์ฐ ๋ค๋ฆ
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ต์ ํ ๋ ์๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ตฌํํ๊ณ ๋ทฐํฌํธ ๋ฐ ์ฅ์น์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณต ํ ์ ์๋๋ก ํน๋ณํ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผํฉ๋๋ค. ๋คํํ๋ Responsive Images Community Group (<a href="https://responsiveimages.org/" target="_blank" rel="external">https://responsiveimages.org/</a>) ๋๋ถ์ picture์์ ๋ฐ srcset์์ฑ (๋ ๋ค 85 % ์ด์ ์ง์)์ ์ ๊ณต ํ ์ ์์ต๋๋ค.</p><h2 id="์ด๋ฏธ์ง์-srcset์์ฑ"><a href="#์ด๋ฏธ์ง์-srcset์์ฑ" class="headerlink" title="์ด๋ฏธ์ง์ srcset์์ฑ"></a>์ด๋ฏธ์ง์ srcset์์ฑ</h2><p>srcset์ฌ์ฉ์์ ํ๋ฉด ๋ฐ๋์ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ํ์ํ๊ณ ์ ํ ๋ ํด์๋ ์ ํ ์๋๋ฆฌ์ค์์ ๊ฐ์ฅ ํจ๊ณผ์ ์
๋๋ค. ๋ฏธ๋ฆฌ ์ ์ ๋ ๊ท์น์ ์งํฉ์ ๊ธฐ๋ฐ์ผ๋ก srcsetํ๊ณ sizes๋ธ๋ผ์ฐ์ ๊ฐ ๋ทฐํฌํธ์ ๋ฐ๋ผ ์ ๊ณตํ๋ ์ต์์ ์ด๋ฏธ์ง๋ฅผ ์ ํํฉ๋๋ค. srcset์์ฑ์ํนํ ๋ชจ๋ฐ์ผ ์ฌ์ฉ์๋ฅผ ์ํด ๋์ญํญ์ ํฌ๊ฒ ๋๋ฆฌ๊ณ ์ ๊ฐ์ ์์ฒญํ ์ ์์ต๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*87BIfYsjZTh-bikjmp7eow.png" alt="imagelink3"></p><h2 id="picture-์์"><a href="#picture-์์" class="headerlink" title="picture ์์"></a>picture ์์</h2><p>picture์์ ๋ฐ media์์ฑ์ ์ํธ ๋ฐฉํฅ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ค์ํ ์กฐ๊ฑด์ ๋ํด ๋ค์ํ ์์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ (ํ
์คํธ๋ฅผ ํตํด ํ
์คํธ ๋จ media-queries), ์ฐ๋ฆฌ๋ ํด์๋์ ๊ด๊ณ์์ด ํญ์ ๊ฐ์ฅ ์ค์ํ ์ด๋ฏธ์ง ์์๋ฅผ ์ฌ์ฉํ ์์๊ฒ๋์์ต๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*NeyfH6Vu1xCWE2SY5w1cDQ.png" alt="imagelink4"></p><blockquote><p>๋ ๊ฐ์ง ์ ๊ทผ๋ฒ์ ๋ํ ์ฒ ์ ํ ์ค๋ช
์ Jason Grigsby์ Responsive Images 101 ๊ฐ์ด๋ ๋ฅผ ์ฝ์ผ์ญ์์ค .<br>(<a href="https://cloudfour.com/thinks/responsive-images-101-definitions/" target="_blank" rel="external">https://cloudfour.com/thinks/responsive-images-101-definitions/</a>)</p></blockquote><h2 id="์ด๋ฏธ์ง-CDN-์ ๊ณต"><a href="#์ด๋ฏธ์ง-CDN-์ ๊ณต" class="headerlink" title="์ด๋ฏธ์ง CDN ์ ๊ณต"></a>์ด๋ฏธ์ง CDN ์ ๊ณต</h2><p>์ฑ๋ฅ์ ๋ํ ๋ง์ง๋ง ๋จ๊ณ๋ ์ ๋ฌ์
๋๋ค. ๋ชจ๋ asset์ ์ฝํ
์ธ ์ ์ก ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ต์ ์ป์ ์ ์์ง๋ง Cloudinary ๋๋ imgx ์ ๊ฐ์ด ์ด๋ฏธ์ง๋ฅผ ํ๊ฒํ
ํ๋ ํน์ ๋๊ตฌ๊ฐ ์์ต๋๋ค . ์ด๋ฌํ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์ ํธ๋ํฝ์ ์ค์ด๊ณ ์๋ต ๋๊ธฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.</p><p>CDN์ ์ด๋ฏธ์ง๊ฐ ๋ง์ ์ฌ์ดํธ์์ ์๋ต์ฑ์ด ๋ฐ์ด๋ ์ต์ ํ ๋ asset์ ์ ๊ณตํจ์ผ๋ก์จ ๋ง์ ๋ณต์ก์ฑ์ ๊ฒช์ ์ ์์ต๋๋ค. ์คํผ๋ง์ ๋ค๋ฅด๊ธฐ๋ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํฌ๊ธฐ ์กฐ์ , ์๋ฅด๊ธฐ ๋ฐ ์ฅ์น ๋ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ํฉํ ํ์ ๊ฒฐ์ ์ ์ฒ๋ฆฌํฉ๋๋ค.<br>๋ํ ์์ถ, ํฝ์
๋ฐ๋ ๊ฐ์ง, ์ํฐ ๋งํฌ, ์ผ๊ตด ์ธ์ ๋ฐ ํ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๊ณผ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ URL์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.</p><h3 id="์ด๋ฏธ์ง-์ฑ๋ฅ-์ ๊ฒํ"><a href="#์ด๋ฏธ์ง-์ฑ๋ฅ-์ ๊ฒํ" class="headerlink" title="์ด๋ฏธ์ง ์ฑ๋ฅ ์ ๊ฒํ"></a>์ด๋ฏธ์ง ์ฑ๋ฅ ์ ๊ฒํ</h3><ol><li>์ฌ๋ฐ๋ฅธ ํ์ ์ ํ</li><li>๊ฐ๋ฅํ๋ฉด ๋ฒกํฐ ์ฌ์ฉ</li><li>๋ณํ๊ฐ ๋์ ๋์ง ์์ผ๋ฉด ํ์ง์ ๋ฎ์ถ์ญ์์ค.</li><li>์๋ก์ด ํ์์ผ๋ก ์คํ ํด๋ณด๊ธฐ</li><li>๋๊ตฌ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ํ</li><li>srcset๋ฐpicture ์ ๋ํด ์์๋ณด๊ธฐ </li><li>์ด๋ฏธ์ง CDN ์ฌ์ฉ</li></ol><h2 id="์น-๊ธ๊ผด-์ต์ ํ"><a href="#์น-๊ธ๊ผด-์ต์ ํ" class="headerlink" title="์น ๊ธ๊ผด ์ต์ ํ"></a>์น ๊ธ๊ผด ์ต์ ํ</h2><p>์ฌ์ฉ์ ์ ์ ๊ธ๊ผด์ ์ฌ์ฉํ ์์๋ ๊ธฐ๋ฅ์ ๋งค์ฐ ๊ฐ๋ ฅํ ๋์์ธ ๋๊ตฌ์
๋๋ค.<br>๊ฐ๋ ฅํ์ง๋ง ์น ๊ธ๊ผด์ ์ฌ์ฉํ๋ ์น ์ฌ์ดํธ์ 68%๊ฐ ์ด ์ ํ์ ์์ฐ์ ๊ฐ์ฅ ํฐ ์ฑ๋ฅ ์๋ฐ์์ค ํ๋์
๋๋ค. (์ฝ๊ฒ 1๋ฐฑํฌ๋ก๋ฐ์ดํธ ํ๊ท ๋ณํ ๋ฐ ์์ฒด์ ์์ ๋ฐ๋ผ).<br>๋ฌด๊ฒ๊ฐ ๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ๊ฐ ์๋๋๋ผ๋, ๋ณด์ด์ง ์๋ ํ
์คํธ (FOIT)์ ํ๋์์
๋๋ค . FOIT๋ ์น ๊ธ๊ผด์ด ์ฌ์ ํ๋ก๋๋๊ฑฐ๋ ๊ฐ์ ธ ์ค์ง ๋ชปํ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋น ํ์ด์ง๊ฐ ์๊ฒจ ์ก์ธ์ค ํ ์์๋ ๋ด์ฉ์ด๋ฉ๋๋ค. ์น ๊ธ๊ผด์ด ํ์ํ์ง ์ฌ๋ถ ๋ฅผ ์ ์คํ๊ฒ ๊ฒํ ํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ์์ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ค์ ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์์๋ ๋ช ๊ฐ์ง ์ ๋ต์ด ์์ต๋๋ค.</p><h2 id="์น๊ธ๊ผด์-์ฌ๋ฐ๋ฅธ-ํ์-์ ํ"><a href="#์น๊ธ๊ผด์-์ฌ๋ฐ๋ฅธ-ํ์-์ ํ" class="headerlink" title="์น๊ธ๊ผด์ ์ฌ๋ฐ๋ฅธ ํ์ ์ ํ"></a>์น๊ธ๊ผด์ ์ฌ๋ฐ๋ฅธ ํ์ ์ ํ</h2><p>EOT, TTF, WOFF ๋ฐ ์ต๊ทผ WOFF2์ ๋ค ๊ฐ์ง ์น ๊ธ๊ผด ํ์์ด ์์ต๋๋ค. TTF์ WOFF๊ฐ ๊ฐ์ฅ ๋๋ฆฌ ์ฑํ๋์ด 90% ์ด์์ ๋ธ๋ผ์ฐ์ ์ง์์ ์๋ํฉ๋๋ค. ํ๊ฒํ
ํ๋ ์ง์์ ๋ฐ๋ผ WOFF2๋ฅผ ์ ๊ณต ํ๊ณ ์ด์ ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ WOFF๋ก ๋์ฒด ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํฉ๋๋ค. WOFF2๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ ์ฌ์ฉ์ ์ง์ ์ฌ์ ์ฒ๋ฆฌ ๋ฐ ์์ถ ์๊ณ ๋ฆฌ์ฆ(์ : Brotli )์ ์กฐํฉ์ผ๋ก ์ธํด ์ฝ 30 %์ ํ์ผ ํฌ๊ธฐ ๊ฐ์ ๋ฐ ํฅ์๋ ๊ตฌ๋ฌธ ๋ถ์ ๊ธฐ๋ฅ์
๋๋ค. </p><p>์น ๊ธ๊ผด ์์ค๋ฅผ ์ ์ ํ ๋ @font-face์ฌ์ฉํ format()ํ์์ ์ง์ ํ๋ ํํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. </p><p>๊ธ๊ผด์ ์ ๊ณตํ๊ธฐ ์ํด Google Fonts ๋๋ Typekit์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ด ๋ ๋๊ตฌ๋ ์ค์ ๋ฐ์๊ตญ์ ์ํํ๊ธฐ์ํ ๋ช ๊ฐ์ง ์ ๋ต์ ๊ตฌํํ์ต๋๋ค. Typekit์ ์ด์ ๋ชจ๋ ํคํธ๋ฅผ ๋น๋๊ธฐ ์ ์ผ๋ก ์ง์ํ๋ฏ๋ก FOIT๋ฅผ ๋ฐฉ์ง ํ ๋ฟ๋ง ์๋๋ผ JavaScript ํคํธ ์ฝ๋ (10 ๋ถ์ด ์๋)๋ฅผ 10์ผ ์ฐ์ฅ ํ ์ ์์ต๋๋ค. Google ๊ธ๊ผด์ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๊ฐ์ฅ ์์ ํ์ผ์ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค.</p><h2 id="๊ธ๊ผด-์ ํ"><a href="#๊ธ๊ผด-์ ํ" class="headerlink" title="๊ธ๊ผด ์ ํ"></a>๊ธ๊ผด ์ ํ</h2><p>์
ํ ํธ์คํ
์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ฒด ์, ๊ธ๊ผด ๋๊ป ๋ฐ ์คํ์ผ์ด ์ฑ๋ฅ ์์ฐ์ ์ค์ํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.<br>(๊ธ๊ผด ์ ํ ์ฐธ๊ณ : <a href="http://designingforperformance.com/weighing-aesthetics-and-performance/" target="_blank" rel="external">http://designingforperformance.com/weighing-aesthetics-and-performance/</a>)</p><h2 id="์ ๋-์ฝ๋-๋ฒ์-ํ์-์งํฉ-์ฌ์ฉ"><a href="#์ ๋-์ฝ๋-๋ฒ์-ํ์-์งํฉ-์ฌ์ฉ" class="headerlink" title="์ ๋ ์ฝ๋ ๋ฒ์ ํ์ ์งํฉ ์ฌ์ฉ"></a>์ ๋ ์ฝ๋ ๋ฒ์ ํ์ ์งํฉ ์ฌ์ฉ</h2><p>์ ๋ ์ฝ๋ ๋ฒ์ ํ์ ์งํฉ์ ์ฌ์ฉํ๋ฉด ํฐ ๊ธ๊ผด์ ๋ ์์ ์งํฉ์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ์๋์ ์ผ๋ก ์ง๋ณด ๋ ์ ๋ต์ด์ง๋ง ํนํ ์์์ ์ธ์ด๋ฅผ ํ๊ฒํ
ํ ๋ ์๋นํ ์ ์ฝ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค (์ค๊ตญ์ด ๊ธ๊ผด์ ํ๊ท ๊ธ๊ผด ํฌ๊ธฐ๋ 20,000 ๊ธ๋ฆฌํ์
๋๋ค). ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๊ธ๊ผด์ ๋ผํด์ด, ๊ทธ๋ฆฌ์ค์ด ๋๋ ํค๋ฆด ์ด์ ๊ฐ์ด ํ์ํ ์ธ์ด ์งํฉ์ผ๋ก ์ ํํ๋ ๊ฒ์
๋๋ค. ์น ๊ธ๊ผด์ด ๋ก๊ณ ์ ํ ์ฌ์ฉ์๋ง ํ์ํ๋ฉด ์ ๋ ์ฝ๋ ๋ฒ์ ์ค๋ช
์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ฌธ์๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.<br>Filament Group ์ ํ์ผ์ด๋ URL์ ๊ธฐ๋ฐ์ผ๋ก ํ์ํ ๊ธ๋ฆฌํ ๋ชฉ๋ก์ ์์ฑ ํ ์์๋ ๊ธ๋ฆฌํ ํ๊ฑฐ (glyph hanger) ๋ผ๋ ์คํ ์์ค ๋ช
๋ น ์ค ์ ํธ๋ฆฌํฐ๋ฅผ ์ถ์ํ์ต๋๋ค . ๋๋ ์น ๊ธฐ๋ฐ ๊ธ๊ผด ๋ค๋์ฅ ์น ๊ธ๊ผด ์์ฑ๊ธฐ ๋ ๊ณ ๊ธ ํ์ ์ค์ ๋ฐ ์ต์ ํ ์ต์
์ ์ ๊ณตํฉ๋๋ค. Google Fonts ๋๋ Typekit์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฒด ์ ํ๊ธฐ ์ธํฐํ์ด์ค์ ์ธ์ด ํ์ ์งํฉ์ ์ ํํ๋ฉด ๊ธฐ๋ณธ ํ์ ์งํฉ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.</p><h2 id="๊ธ๊ผด๋ก๋-์ ๋ต-์๋ฆฝ"><a href="#๊ธ๊ผด๋ก๋-์ ๋ต-์๋ฆฝ" class="headerlink" title="๊ธ๊ผด๋ก๋ ์ ๋ต ์๋ฆฝ"></a>๊ธ๊ผด๋ก๋ ์ ๋ต ์๋ฆฝ</h2><p>๋ธ๋ผ์ฐ์ ๋ DOM๊ณผ CSSOM์ ๋ชจ๋ ๋น๋ํด์ผํ๊ธฐ ๋๋ฌธ์ ๊ธ๊ผด์ ๋ ๋๋ง์ ์ฐจ๋จํฉ๋๋ค. ์น ๊ธ๊ผด์ ๊ธฐ์กด ๋
ธ๋์ ์ผ์นํ๋ CSS ์ ํ๊ธฐ์์ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ค์ด๋ก๋๋์ง ์์ต๋๋ค. ์ด ๋์์ผ๋ก ์ธํด ํ
์คํธ ๋ ๋๋ง์ด ์๋นํ ์ง์ฐ ๋์ด ์ด์ ์ ์ธ๊ธ ํ FOIT (Flash of Invisible Text)๊ฐ ๋ฐ์ํฉ๋๋ค. FOIT๋ ๋๋ฆฐ ๋คํธ์ํฌ ๋ฐ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋์ฑ ๋๋๋ฌ์ง๋๋ค.</p><p>๊ธ๊ผด๋ก๋ ์ ๋ต์ ๊ตฌํํ๋ฉด ์ฌ์ฉ์๊ฐ ๊ทํ์ ์ฝํ
์ธ ์ ์ก์ธ์ค ํ ์ ์๊ฒ๋ฉ๋๋ค. ์ข
์ข
FAS (Flash of Unstyled Text)๋ฅผ ์ ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฝ๊ณ ํจ๊ณผ์ ์ธ ์๋ฃจ์
์
๋๋ค.</p><p>font-display๋น์๋ฐ ์คํฌ๋ฆฝํธ ์์กด ์๋ฃจ์
์ ์ ๊ณตํ๋ ์๋ก์ด CSS ์์ฑ์
๋๋ค. ๋ถํํ๋, ๋ถ๋ถ์ ์ธ ์ง์ (ํฌ๋กฌ๊ณผ ์คํ๋ผ ์ ์ฉ)์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํ์ฌ Firefox์ WebKit์์ ๊ฐ๋ฐ ์ค์ ์์ต๋๋ค. ์ฌ์ ํ ๋ค๋ฅธ ๊ธ๊ผด ๋ก๋ฉ ๋ฉ์ปค๋์ฆ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๊ณ ์ฌ์ฉํด์ผํฉ๋๋ค.<br>![imageurl4] (<a href="https://cdn-images-1.medium.com/max/800/1*Kuky8fVepcjU3tMbTjewdw.png" target="_blank" rel="external">https://cdn-images-1.medium.com/max/800/1*Kuky8fVepcjU3tMbTjewdw.png</a>)</p><p>๋คํํ Typekit์ Web Font Loader ์ Bram Stein์ Font Face Observer ๋ ๊ธ๊ผด ๋ก๋ฉ ๋์์ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ํ ์น ๊ธ๊ผด ์ฑ๋ฅ ์ ๋ฌธ๊ฐ ์ธ Zach Leatherman์ ๊ธ๊ผด๋ก๋ ์ ๋ต์ ๋ํ ํฌ๊ด์ ์ธ ์๋ด์๋ฅผ ๊ฒ์ ํ์ฌ ํ๋ก์ ํธ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๋ฐ ๋์์์ค๋๋ค. (<a href="https://www.zachleat.com/web/comprehensive-webfonts/" target="_blank" rel="external">https://www.zachleat.com/web/comprehensive-webfonts/</a>)</p><h3 id="์น-ํฐํธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ"><a href="#์น-ํฐํธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ" class="headerlink" title="์น ํฐํธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ"></a>์น ํฐํธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ</h3><ol><li>์ ์ ํ ํ์ ์ ํ</li><li>๊ธ๊ผด ์ ํ ๊ฐ์ฌ</li><li>์ ๋ ์ฝ๋ ๋ฒ์ ํ์ ์งํฉ ์ฌ์ฉ</li><li>๊ธ๊ผด๋ก๋ ์ ๋ต ์๋ฆฝ</li></ol><h2 id="์๋ฐ-์คํฌ๋ฆฝํธ-์ต์ ํ"><a href="#์๋ฐ-์คํฌ๋ฆฝํธ-์ต์ ํ" class="headerlink" title="์๋ฐ ์คํฌ๋ฆฝํธ ์ต์ ํ"></a>์๋ฐ ์คํฌ๋ฆฝํธ ์ต์ ํ</h2><p>ํ์ฌ JavaScript ๋ฒ๋ค์ ํ๊ท ํฌ๊ธฐ๋ 446KB ์ด๋ฉฐ, ์ด๋ฏธ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ ๋ฒ์งธ๋ก ํฐ asset ์ ํ์ด๋ฉ๋๋ค.</p><blockquote><p>์ฐ๋ฆฌ๊ฐ ๊นจ๋ซ์ง ๋ชปํ ์๋์๋ ์ ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ํ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ๋ค์ ์จ๊ฒจ์ง ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ํจ์ฌ ๋ ์ฌ๊ฐ ํ๋ค๋ ๊ฒ์
๋๋ค .</p></blockquote><h2 id="์ผ๋ง๋-๋ง์-JavaScript๊ฐ-์ ๋ฌ๋๋์ง-๋ชจ๋ํฐํ์ญ์์ค"><a href="#์ผ๋ง๋-๋ง์-JavaScript๊ฐ-์ ๋ฌ๋๋์ง-๋ชจ๋ํฐํ์ญ์์ค" class="headerlink" title="์ผ๋ง๋ ๋ง์ JavaScript๊ฐ ์ ๋ฌ๋๋์ง ๋ชจ๋ํฐํ์ญ์์ค."></a>์ผ๋ง๋ ๋ง์ JavaScript๊ฐ ์ ๋ฌ๋๋์ง ๋ชจ๋ํฐํ์ญ์์ค.</h2><p>์ต์ ํ ๋ ์ ๋ฌ์ ์น ํ์ด์ง ํฝ์ฐฝ์ ๋ง๊ธฐ์ํ ํ ๊ฑธ์์
๋๋ค. ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ํ ํ์๋ ๋ธ๋ผ์ฐ์ ์์ ํ์ฑ, ์ปดํ์ผ ๋ฐ ์คํํด์ผํฉ๋๋ค. ๋ช ๊ฐ์ง ์ธ๊ธฐ์๋ ์ฌ์ดํธ๋ฅผ ๊ฐ๋ตํ ์ดํด๋ณด๋ฉด ํฌ์ฅ์ ํ๋ฉดgzipped JS๊ฐ ์ต์ 3 ๋ฐฐ ์ด์ ์ปค ์ง๋๋ค. ํจ๊ณผ์ ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ฝ๋์ ๊ฑฐ๋ํ ์ผ๋ฃฉ์ ์ ์ ์๋๋ก ๋ณด๋ด๊ณ ์์ต๋๋ค.<br>![imageurl5] (<a href="https://cdn-images-1.medium.com/max/800/1*Yrn4kTkaYHX0PWj4HB-mQg.jpeg" target="_blank" rel="external">https://cdn-images-1.medium.com/max/800/1*Yrn4kTkaYHX0PWj4HB-mQg.jpeg</a>)</p><p>๋ถ์ ๋ฐ ๋ถ์ ์๊ฐ ๋ถ์์ ์ฑ์ด ์ธ์ ์ํธ ์์ฉํ ์ค๋น๊ฐ๋์๋์ง๋ฅผ ์ดํดํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ํ์ด๋ฐ์ ์ฌ์ฉ์ ์ฅ์น์ ํ๋์จ์ด ๊ธฐ๋ฅ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๋ฆ
๋๋ค. ํ์ฑ โโ๋ฐ ์ปดํ์ผ์ ๋ก์ฐ ์๋ ๋ชจ๋ฐ์ผ์์ 2-5 ๋ฐฐ ๋์ผ ์ ์์ต๋๋ค . Addy์ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ํ๊ท ์ ์ธ ์ ํ์์ ์ฑ์ ๋ํํ ์ํ์ ๋๋ฌํ๋ ๋ฐ 16์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ๋ฐ์คํฌํฑ์์๋ 8์ด๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ฌํ ํต๊ณ๋ฅผ ๋ถ์ํ๋ ๊ฒ์ด ์ค์ํ๋ฉฐ ๋คํ์ค๋ฝ๊ฒ๋ Chrome DevTools๋ฅผ ํตํด ์ด๋ฅผ ์ํ ํ ์ ์์ต๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*eV83YP2fnoOllUleaWa5lw.gif" alt="imageurl6"><br>(JavaScript Addy Osmani์ JavaScript ์์ ์ฑ๋ฅ ๊ด๋ จ ์๋ฃ : <a href="https://medium.com/reloading/javascript-start-up-performance-69200f43b201" target="_blank" rel="external">https://medium.com/reloading/javascript-start-up-performance-69200f43b201</a>)</p><h2 id="๋ถํ์ํ-์์กด์ฑ-์ ๊ฑฐ"><a href="#๋ถํ์ํ-์์กด์ฑ-์ ๊ฑฐ" class="headerlink" title="๋ถํ์ํ ์์กด์ฑ ์ ๊ฑฐ"></a>๋ถํ์ํ ์์กด์ฑ ์ ๊ฑฐ</h2><p>ํ๋ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์์
ํ๋ ๋ฐฉ์์ ์ข
์์ฑ์ ์์ ํฌ๊ธฐ๋ฅผ ์ฝ๊ฒ ๊ฐ๋ ค ๋ผ ์ ์์ต๋๋ค. webpack-bundle-analyzer ๋ฐ Bundle Buddy ๋ ์ฝ๋ ์ค๋ณต, ๊ฐ์ฅ ํฐ ์ฑ๋ฅ ์๋ฐ์ ๋ฐ ์ค๋๋ ๋ถํ์ํ ์ข
์์ฑ์ ์๋ณํ๋ ๋ฐ ๋์์ด๋๋ ํ๋ฅญํ ์๊ฐ ๋๊ตฌ์
๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*dusVhPiL44VDoS4gJHMWSg.gif" alt="imageurl7"></p><h6 id="์๋์ค์ธ-Webpack-๋ฒ๋ค-๋ถ์๊ธฐ"><a href="#์๋์ค์ธ-Webpack-๋ฒ๋ค-๋ถ์๊ธฐ" class="headerlink" title="์๋์ค์ธ Webpack ๋ฒ๋ค ๋ถ์๊ธฐ."></a>์๋์ค์ธ Webpack ๋ฒ๋ค ๋ถ์๊ธฐ.</h6><p>VS ์ฝ๋ ์ Atom ์ Import Costํ์ฅ ํ๋ฉด ๊ฐ์ ธ์จ ํจํค์ง ๋น์ฉ์ ํจ์ฌ ๋ ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*LbfI4D9XXiZYS1Slwsys5g.gif" alt="imageurl8"></p><h2 id="์ฝ๋-๋ถํ -๊ตฌํ"><a href="#์ฝ๋-๋ถํ -๊ตฌํ" class="headerlink" title="์ฝ๋ ๋ถํ ๊ตฌํ"></a>์ฝ๋ ๋ถํ ๊ตฌํ</h2><p>๊ฐ๋ฅํ ๋๋ง๋ค ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์์ฑํ๋ ๋ฐ ํ์ํ asset๋ง ์ ๊ณตํด์ผํฉ๋๋ค. bundle.js์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์๋ ์ฝ๋ ์ฒ๋ฆฌ ์ํธ ์์ฉ์ ํฌํจ ํ์ฌ ์ ์ฒด ํ์ผ์ ๋ณด๋ด๋ ๊ฒ์ ์ต์ ์ด ์๋๋๋ค (๋ฐฉ๋ฌธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธ ํ ๋ ์ ์ฒด ์ฑ์ ์ฒ๋ฆฌํ๋ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ํ๋ ๊ฒฝ์ฐ). ๋ง์ฐฌ๊ฐ์ง๋ก ํน์ ๋ธ๋ผ์ฐ์ ๋๋ ์ฌ์ฉ์ ์์ด์ ํธ๋ฅผ ํ๊ฒํ
ํ๋ ์ฝ๋๋ฅผ ๋ณดํธ์ ์ผ๋ก ๊ฒ์ฌํด์๋ ์๋ฉ๋๋ค.</p><p>๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฒ๋ค ์ค ํ๋ ์ธ Webpack์๋ ์ฝ๋ ๋ถํ ์ง์์ด ์ ๊ณต ๋ฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ์ฝ๋ ๋ถํ ์ ํ์ด์ง ๋น ( home.js๋ฐฉ๋ฌธ ํ์ด์ง, contact.js์ฐ๋ฝ์ฒ ํ์ด์ง ๋ฑ) ๊ตฌํํ ์ ์์ง๋ง Webpack์ ๋์ ๊ฐ์ ธ ์ค๊ธฐ ๋๋ ์ง์ฐ๋ก๋ ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ํ ๋ฒ ์ดํด ๋ณผ ์ ์์ต๋๋ค. </p><h2 id="๋์-ํ๋ ์-์ํฌ-๊ณ ๋ ค"><a href="#๋์-ํ๋ ์-์ํฌ-๊ณ ๋ ค" class="headerlink" title="๋์ ํ๋ ์ ์ํฌ ๊ณ ๋ ค"></a>๋์ ํ๋ ์ ์ํฌ ๊ณ ๋ ค</h2><p>JavaScript ํ๋ก ํธ ์๋ ํ๋ ์ ์ํฌ๋ ๋์์์ด ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ 2016 ์ค๋ฌธ ์กฐ์ฌ๋ฐ๋ฅด๋ฉด React์ ๊ฐ์ฅ ์ธ๊ธฐ์๋ ํ๋ ์์์
๋๋ค. ์กฐ์ฌ์ค๋ฝ๊ฒ ์ํคํ
์ฒ ์ ํ ์ฌํญ์ ๊ฒ์ฌ ํ๊ฒ ์ง๋ง Preact ์ ๊ฐ์ ํจ์ฌ ๊ฐ๋ฒผ์ด ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ์
๋๋ค (Preact๋ ์์ ํ React ๊ตฌํ, ๋์ ์ฑ๋ฅ์ ์ ์ ๊ฐ์ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์).<br>(์ฐธ๊ณ preact : <a href="https://preactjs.com/" target="_blank" rel="external">https://preactjs.com/</a>)<br>๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐ๋ฆฌ๋ ์์ ๋์์ moment.js์ ๋ํ date-fns(๋๋ ํน๋ณํ ๊ฒฝ์ฐ์ moment.js ์ ๊ฑฐ๋์ง ์์locales) ์ ๊ฐ์ ๋ ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒด ํ ์ ์์ต๋๋ค.<br>์ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ ์ ์ด๋ค ์ข
๋ฅ์ ๊ธฐ๋ฅ์ด ํ์ํ์ง ๊ฒฐ์ ํ๊ณ ํ์์ ๋ชฉํ์ ๊ฐ์ฅ ์ ํฉํ ํ๋ ์ ์ํฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ก๋ ๋ฐ๋๋ผ๊ฐ ์๋ฐ โโ์คํฌ๋ฆฝํธ๋ฅผ ๋์ ํ๋ ๊ฒ์ ์๋ฏธ ํ ์๋ ์์ต๋๋ค.</p><h3 id="์๋ฐ-์คํฌ๋ฆฝํธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ"><a href="#์๋ฐ-์คํฌ๋ฆฝํธ-์ฑ๋ฅ-์ฒดํฌ๋ฆฌ์คํธ" class="headerlink" title="์๋ฐ ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ"></a>์๋ฐ ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ</h3><ol><li>์ผ๋ง๋ ๋ง์ JavaScript๊ฐ ์ ๋ฌ๋๋์ง ๋ชจ๋ํฐํ์ญ์์ค.</li><li>๋ถํ์ํ ์์กด์ฑ ์ ๊ฑฐ</li><li>์ฝ๋ ๋ถํ ๊ตฌํ</li><li>๋์ ํ๋ ์ ์ํฌ ๊ณ ๋ ค</li></ol><h2 id="์ถ์ -์ฑ๋ฅ-๋ฐ-์์ผ๋ก์-๋๋ก"><a href="#์ถ์ -์ฑ๋ฅ-๋ฐ-์์ผ๋ก์-๋๋ก" class="headerlink" title="์ถ์ ์ฑ๋ฅ ๋ฐ ์์ผ๋ก์ ๋๋ก"></a>์ถ์ ์ฑ๋ฅ ๋ฐ ์์ผ๋ก์ ๋๋ก</h2><p>์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ตฌ์ถ ์ค์ธ ์ ํ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ธ์ ์ ์ธ ๋ณํ๋ฅผ ๊ฐ์ ธ์ฌ ์์๋ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.<br>์ฑ๋ฅ์ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด ๋ ์ ์์ผ๋ฉฐ, ์ฐ๋ฆฌ์ ๋นํ๊ธฐ์ ์ฅ๊ธฐ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.</p><h2 id="์ฌ์ฉ์-์ค์ฌ์-์ฑ๊ณผ-์ธก์ -๊ธฐ์ค"><a href="#์ฌ์ฉ์-์ค์ฌ์-์ฑ๊ณผ-์ธก์ -๊ธฐ์ค" class="headerlink" title="์ฌ์ฉ์ ์ค์ฌ์ ์ฑ๊ณผ ์ธก์ ๊ธฐ์ค"></a>์ฌ์ฉ์ ์ค์ฌ์ ์ฑ๊ณผ ์ธก์ ๊ธฐ์ค</h2><p>๋ฐ์ด๋ ์ฑ๋ฅ ์ธก์ ๊ธฐ์ค์ ๊ฐ๋ฅํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌ์ฌํ๋๋ฐ ๊ทผ์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ค๋ซ๋์ onLoad, onContentLoaded ๋๋ SpeedIndex์ ๊ธฐ๋ฐํ์ฌ ์ฌ์ดํธ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ์ํธ์์ฉํ ์ ์๋์ง์ ๋ํด ์๋ ค์ฃผ์ง ์์ต๋๋ค.<br>asset ์ ๋ฌ์๋ง ์ง์คํ ๊ฒฝ์ฐ ์ธ์ง ๋ ์ฑ๊ณผ ๋ฅผ ์์นํํ๋ ๊ฒ์ ์ฝ์ง ์์ต๋๋ค . ๋คํ์ค๋ฝ๊ฒ๋ ์ฝํ
์ธ ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์๋๊ณ ๋ํ์์ผ๋ก ํ์๋๋์ง์ ๋ํ ํฌ๊ด์ ์ธ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋ช ๊ฐ์ง ํ์ด๋ฐ์ด ์์ต๋๋ค.<br>์ด๋ฌํ ์ธก์ ํญ๋ชฉ์ First Paint, First Meaningful Paint, Visually Complete ๋ฐ Interactive Time์
๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*fjqW4fRUD7iIrzcKfUkfIg.png" alt="imageurl9"></p><blockquote><p>์ฒซ ๋ฒ์งธ ํ์ธํธ : ๋ธ๋ผ์ฐ์ ๊ฐ ํฐ์ ํ๋ฉด์์ ์ฒซ ๋ฒ์งธ ์๊ฐ์ ๋ณ๊ฒฝ์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.<br>์ฒซ ๋ฒ์งธ ์๋ฏธ์๋ ํ์ธํธ : ํ
์คํธ, ์ด๋ฏธ์ง ๋ฐ ์ฃผ์ ํญ๋ชฉ์ ๋ณผ ์ ์์ต๋๋ค.<br>์๊ฐ์ ์ผ๋ก ์๋ฃ : ๋ทฐํฌํธ์ ๋ชจ๋ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.<br>๋ํํ ์๊ฐ : ๋ทฐํฌํธ์ ๋ชจ๋ ๋ด์ฉ์ด ํ์๋๋ฉฐ ์ํธ ์์ฉํ ์ค๋น๊ฐ๋์์ต๋๋ค (์ฃผ์ํ ์ฃผ์ ์ค๋ ๋ JavaScript ํ๋ ์์).</p></blockquote><p>์ด๋ฌํ ํ์ด๋ฐ์ ์ฌ์ฉ์๊ฐ ๋ณด๋ ๊ฒ๊ณผ ์ง์ ์ ์ผ๋ก ์ผ์นํ๋ฏ๋ก ์ถ์ ์์ํ ํ๋ฅญํ ํ๋ณด์๊ฐ๋ฉ๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ๋ชจ๋๋ฅผ ๊ธฐ๋กํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด 1-2 ๊ฐ์ง๋ฅผ ์ ํํ์ฌ์ธ์ง ๋ ์ฑ๋ฅ์ ๋ ์ ์ดํดํ์ญ์์ค. ๋ค๋ฅธ ์ธก์ ํญ๋ชฉ๋ค, ํนํ ์ฐ๋ฆฌ๊ฐ ์ ์กํ๋ ๋ฐ์ดํธ ์ (์ต์ ํ ๋ฐ ์์ถ ํด์ )์ ์ฃผ๋ชฉํ ํ์๊ฐ ์์ต๋๋ค.</p><h2 id="์ค์ -์์ฐ-์ค์ "><a href="#์ค์ -์์ฐ-์ค์ " class="headerlink" title="์ค์ ์์ฐ ์ค์ "></a>์ค์ ์์ฐ ์ค์ </h2><p>์ด ์์น๋ค์ ๋ชจ๋ ํผ๋์ค๋ฌ์์ง๊ณ ์ดํดํ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค. ์คํ ๊ฐ๋ฅํ ๋ชฉํ์ ๋ชฉํ๊ฐ ์์ผ๋ฉด ๋ฌ์ฑํ๋ ค๋ ๋ชฉํ๋ฅผ ์ถ์ ํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค. ๋ช ๋
์ Tim Kadlec ์ ์ค์ ์์ฐ ์ ๊ฐ๋
์ ๊ดํด ์ผ์ต๋๋ค.<br>(<a href="https://timkadlec.com/2013/01/setting-a-performance-budget/" target="_blank" rel="external">https://timkadlec.com/2013/01/setting-a-performance-budget/</a>)</p><p>๋ถํํ๋, ๊ทธ๋ค์ ์ค์ ํ๋ ๋ง๋ฒ์ ๊ณต์์ ์์ต๋๋ค. ์ฑ๋ฅ ์์ฐ์ ์ข
์ข
๊ฐ ๋น์ฆ๋์ค์ ๊ณ ์ ํ ๊ฒฝ์๋ ฅ ๋ถ์ ๋ฐ ์ ํ ๋ชฉํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.</p><p>์์ฐ์ ์ ํ ๋ ๋์ ๋๋ ์ฐจ์ด๋ฅผ ๋ชฉํ๋กํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ์ฐจ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ต์ 20 % ๊ฐ์ ์ ํด๋นํฉ๋๋ค. (์ง์ญ : Lara Hogan์ ์ ๊ทผ ๋ฐฉ์ ์ธ ์๋ก์ด ๋์์ธ์ ์ฑ๋ฅ ์์ฐ ์ ์ฐธ๊ณ ๋ก ํ์ฌ ์์ฐ์ ์คํํ๊ณ ๋ฐ๋ณตํ์ญ์์ค.)</p><p>Performance ์์ฐ ์์ฑ์ ๋๊ธฐ ์ํด ์ฑ๋ฅ ์์ฐ ๊ณ์ฐ๊ธฐ(<a href="http://www.performancebudget.io/" target="_blank" rel="external">http://www.performancebudget.io/</a>) ๋๋ <a href="https://browserdiet.com/calories/" target="_blank" rel="external">https://browserdiet.com/calories/</a> ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ฒดํฌ๋ฅผ ํด๋ณด์ธ์.</p><h2 id="์ง์์ ์ธ-๋ชจ๋ํฐ๋ง"><a href="#์ง์์ ์ธ-๋ชจ๋ํฐ๋ง" class="headerlink" title="์ง์์ ์ธ ๋ชจ๋ํฐ๋ง"></a>์ง์์ ์ธ ๋ชจ๋ํฐ๋ง</h2><p>๋ชจ๋ํฐ๋ง ์ฑ๋ฅ์ ์๋์ผ๋กํด์๋ ์๋ฉ๋๋ค. ๋ค์ํ ๋ณด๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ์์ต๋๋ค.</p><p>Google Lighthouse ๋ ์ฑ๋ฅ, ์ ๊ทผ์ฑ, ์ ์ง์ ์ธ ์น ์ฑ ๋ฑ์ ๊ฐ์ฌํ๋ ์คํ ์์ค ํ๋ก์ ํธ์
๋๋ค. ๋ฑ๋๋ฅผ ๋ช
๋ น ์ค์์ ์ฌ์ฉํ๊ฑฐ๋ ์ต๊ทผ์ ๋ฐ๋ก Chrome ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*T3HA3VrN48JsCAHWFfnu3g.gif" alt="imageurl11"></p><p>์ฑ๋ฅ ์์ฐ, ์ฅ์น ์๋ฎฌ๋ ์ด์
, ๋ถ์ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์คํ๊ฒ ๊ตฌ์ถํ์ง ์๊ณ ์ป์ ์ ์๋ ๋ง์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ๊ณต ํ๋ Calibre๋ฅผ ํตํด ์ง์์ ์ผ๋ก ์ถ์ ํฉ๋๋ค.<br><img src="https://cdn-images-1.medium.com/max/800/1*LTFZ7zMASCWUz3r0eqXdoQ.gif" alt="imageurl12"></p><p>์ด๋๋ฅผ ์ถ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ํฌ๋ช
ํ๊ฒ ๋ง๋ค์ด ์ ์ฒด ํ ๋๋ ์๊ท๋ชจ ์กฐ์ง์์ ์ ์ฒด ๋น์ฆ๋์ค์ ์ก์ธ์ค ํ ์์๊ฒํ์ญ์์ค.</p><blockquote><p>์ฑ๊ณผ๋ ๊ฐ๋ฐ์ ํ ์ด์์ ๊ณต์ ์ฑ
์์
๋๋ค. ์ฐ๋ฆฌ๋ ์ญํ ์ด๋ ์งํจ์ ์๊ด์์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํด ์ฑ
์์์ง๋๋ค.</p></blockquote><p>์๋๋ฅผ ์นํธํ๊ณ ํ์
ํ๋ก์ธ์ค๋ฅผ ์๋ฆฝํ์ฌ ์ ํ ๊ฒฐ์ ์ด๋ ์ค๊ณ ๋จ๊ณ์์ ๊ฐ๋ฅํ ๋ณ๋ชฉ ํ์์ ์ฐพ์๋ด๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.</p><h2 id="์ฑ๋ฅ์-์ธ์-๋ฐ-๊ณต๊ฐ-์๋ฆฝ"><a href="#์ฑ๋ฅ์-์ธ์-๋ฐ-๊ณต๊ฐ-์๋ฆฝ" class="headerlink" title="์ฑ๋ฅ์ ์ธ์ ๋ฐ ๊ณต๊ฐ ์๋ฆฝ"></a>์ฑ๋ฅ์ ์ธ์ ๋ฐ ๊ณต๊ฐ ์๋ฆฝ</h2><p>์ฑ๋ฅ์ ์ ๊ฒฝ์ ์ฐ๋ ๊ฒ์ ๋น์ฆ๋์ค ๋ชฉํ ์ผ ๋ฟ ์๋๋ผ ์์
ํต๊ณ๋ฅผ ํตํด ํ๋งคํด์ผํ๋ ๊ฒฝ์ฐ PWA ํต๊ณ๋ฅผ ์ฌ์ฉ ํ์ฌ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๊ธฐ๋ณธ์ ์ธ ๊ณต๊ฐ๊ณผ ์ฌ์ฉ์์ ์ต๋ ๊ด์ฌ์ ๊ฐ์ฅ ๋จผ์ ์๊ฐํฉ๋๋ค.</p><blockquote><p>๊ธฐ์ ์๋ก์ ์ฌ๋๋ค์ด ํ๋ณตํ๊ฒ ๋ค๋ฅธ ๊ณณ์์ ๋ณด๋ผ ์์๋ ๊ด์ฌ๊ณผ ์๊ฐ์ ๋ฉ์นํ์ง ์๋ ๊ฒ์ด ์ฐ๋ฆฌ์ ์ฑ
์์
๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์๊ฐ๊ณผ ์ธ๊ฐ์ ์ด์ ์ ์์ํ ๋๊ตฌ ๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค.</p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(๊ด๋ จ ์์น๋ ํด๋น ์๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.)<br>(์ถ์ฒ : <a href="http://zuu.kr/izgd" target="_blank" rel="external"
</summary>
</entry>
<entry>
<title>WebGL์ ์ฌ์ฉํ ์ ๋๋ฉ์ด์
๋ฐ ์ํธ ์์ฉ ๊ธฐ๋ฒ ํ์ (์ฌ๋ก ์ฐ๊ตฌ)</title>
<link href="https://devhaeyeon.github.io/2017/12/03/webgl-casestudy/"/>
<id>https://devhaeyeon.github.io/2017/12/03/webgl-casestudy/</id>
<published>2017-12-03T12:21:54.000Z</published>
<updated>2017-12-04T11:30:42.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>์ถ์ฒ : <a href="http://zuu.kr/izge" target="_blank" rel="external">http://zuu.kr/izge</a><br>์์ฑ์ : Karim Maaloul</p></blockquote><p>์ฝ๋ํ์์ ์งง์ WebGL์ ์์
์ ํ๋ค ์ด ์ฌ์ดํธ์์(<a href="https://moments.epic.net/" target="_blank" rel="external">https://moments.epic.net/</a>)<br>๋ค์ํ ์ ๋๋ฉ์ด์
๋ฐ ์ธํฐ๋ ์
์ ์ฐพ์๋ด๊ธฐ ์์ํ์๋ค.</p><p>๊ฐ ๊ฒ์๋ง๋ค ๊ฒ์ ํ๋ ์ด๋ ๋งค์ฐ ๋ค๋ฅด์ง๋ง, ๋ชจ๋ ์คํ์ ํ๋์ ์์น์ ๊ณต์ ํฉ๋๋ค.</p><p> ๊ฐ ์บ๋ฆญํฐ์ ํ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ์
๋ ฅ์ ์๋ตํฉ๋๋ค.<br> (๋ฏธ๋ฆฌ ๊ณ์ฐ ๋ ์ ๋๋ฉ์ด์
์์)<br> ๋ชจ๋ ๋์์ ๋ฐํ์์ ์ ์๋ฉ๋๋ค.<br> ๋จ ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ์ด๋ฌํ ์บ๋ฆญํฐ์ ์๋ช
์ ๋ถ์ด ๋ฃ๋ ๊ฒ์ด ์ฃผ์ ๊ณผ์ ์์ต๋๋ค.</p><h2 id="์ ์ฝ-์กฐ๊ฑด"><a href="#์ ์ฝ-์กฐ๊ฑด" class="headerlink" title="์ ์ฝ ์กฐ๊ฑด"></a>์ ์ฝ ์กฐ๊ฑด</h2><p>์ฃผ๋ก three.js(<a href="https://threejs.org/" target="_blank" rel="external">https://threejs.org/</a>) ๋ฐ GreenSock ๋ผ์ด๋ธ๋ฌ๋ฆฌ(<a href="https://greensock.com/)๋ฅผ" target="_blank" rel="external">https://greensock.com/)๋ฅผ</a> ์ฌ์ฉํ์ฌ ์ ์ ๋ ์ด ์คํ์ 3D ๋๋ ์ ๋๋ฉ์ด์
์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ผ๋ก ์ง์ ์ฝ๋ฉํ์ต๋๋ค.</p><p>์ด ๊ณผ์ ์ ํ ๋ฒ์ ํ ํ๋ธ ์ฉ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋ฌธ์๋ฅผ ํ์ฑํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๋
ธ๋ ฅ์ ์ฝ๋์ ๊ฐ์ ๋ฏธ์ธ ์กฐ์ ํ์ฌ ๋น์จ, ์์น ๋ฐ ์ ์ฒด ๋ ๋๋ง์ ์์ ํ ๋ค์ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ์ ์
๋ ฅ (๋ง์ฐ์ค ์ด๋, ํด๋ฆญ, ๋๋๊ทธ ๋ฑ)์ ๋ฐ๋ผ ๊ฐ ํํธ๋ฅผ ์ด๋ํ๋ ๋ฐ ์์๋์์ต๋๋ค.</p><p> ์ด ํ๋ก์ธ์ค์ ์ด์ ์ ๋ถ๋ช
ํ์ง ์์ต๋๋ค. ํ์ง๋ง ํ
์คํธ ํธ์ง๊ธฐ ๋ง ์ฌ์ฉํ์ฌ ์ ์ฒด ์คํ์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋ง์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฐ์ ๋ด๋ณด๋ด๊ณ ๋ฌธ์์ ์์ฑ์ ์กฐ์ ํ๋ ๋ชจ๋ ๋
ธ๋ ฅ์ ํผํ ์ ์์ต๋๋ค. Codepen์์ ์ ๊ณตํ๋ ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ์ฉ ํ๋ฉด ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ๋งค์ฐ ์ ์ฐ ํด์ก ์ต๋๋ค.</p><p> ์ฆ, ํ๋ก์ธ์ค๋ ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ์์ฒด์ ์ธ ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ๊ฒ๋์์ต๋๋ค. ๊ฐ๋ฅํ ํ ์ ์ ์์ ํํธ๋ก ๋ฌธ์๋ฅผ ์์ฑํด์ผํ์ต๋๋ค. ๊ฐ ๋ถ๋ถ์ ๋งค์ฐ ๋ฎ์ ์์ ์ ์ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ ๋๋ฉ์ด์
์ ์ ํ๋ ์์ ํ๋์ ๋ชฉํ๋กํด์ผํ์ต๋๋ค.</p><p> ์ฐธ๊ณ : ์ด ๊ณผ์ ์ 3D ์ฑ์ด ๋ง์์ ๋ค๋ฉด ๋ชจ๋ธ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ๋ฅํ ํ ํจ๊ณผ์ ์ด๋๋ก ์์ ์ ๊ธฐ์ ๊ฐ์ ์ฌ๋ฐ๋ฅธ ๊ท ํ์ ์ฐพ๋ ๊ฒ์
๋๋ค. ํ์์ ๊ฒฝ์ฐ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ํ๋์ ๋๊ตฌ๋ก ์ ์งํ ๋ ํจ์ฌ ํจ์จ์ ์
๋๋ค.</p><p><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/04db1828-53f7-4ef0-87b9-5809e9377ea6/moments-of-happiness-800w-opt.png" alt="img1"></p><h2 id="์ ์ฝ-์กฐ๊ฑด์-๊ธฐํ๋ก-์ ํ"><a href="#์ ์ฝ-์กฐ๊ฑด์-๊ธฐํ๋ก-์ ํ" class="headerlink" title="์ ์ฝ ์กฐ๊ฑด์ ๊ธฐํ๋ก ์ ํ"></a>์ ์ฝ ์กฐ๊ฑด์ ๊ธฐํ๋ก ์ ํ</h2><p>์ด ๊ณผ์ ์์ ์๊ตฌ๋๋ ๋ฏธ๋๋ฉ๋ฆฌ์ฆ์ ๊ถ๊ทน์ ์ผ๋ก ๊ฐ ํ๋ (ํธ์ํจ, ๊ธฐ์จ, ์ค๋ง ๋ฑ)์ ๋ฌ์ฌํ๋ ๊ฐ์ฅ ์ ํํ ๋์์ ์ฐพ๋ ์ข์ ๊ธฐํ์์ต๋๋ค.</p><p>๋ชจ๋ ์
๋ฐฉ์ฒด์ ๋ชจ๋ ์์ง์์ ๋ํด ์ง๋ฌธ์ ๋ฐ์๋ค. ๋๋ ์ด๊ฒ์ ์ ๋ง๋ก ํ์๋ก ํ๋๊ฐ? ๊ทธ๊ฒ์ ๊ฒฝํ์ ๋ ์ข๊ฒ ๋ง๋ค์ง ์์ต๋๊น, ์๋๋ฉด ๊ทธ๋ฅ ์ด๋ ฌํ ์บ๋ฆญํฐ ๋์์ด๋์ ๋ณ๋์
๋๊น?</p><p>๋๋ ๋งค์ฐ ๋จ์ํ ์ฅ๋๊ฐ์ผ๋ก ๋์ ๋งบ์์ต๋๋ค. ๋ชจ๋ ์กฐ์ฉํ๊ณ ๋ฏธ๋๋ฉ ํ ํ๊ฒฝ์ ์ด๊ณ ์์์ต๋๋ค.</p><p>ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌผ์ ์ ๋๋ฉ์ด์
ํํ๋ ๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ํฐ ๋์ ์ด์์ต๋๋ค. ์ ๋๋ฉ์ด์
์ํํธ์จ์ด ๋ ์๊ฐ์ ํ์ ๋ผ์ธ์์ด ์์ฐ ๋ฐ ์ ๊ธฐ์ ์ธ ์์ง์์ ์ด๋ป๊ฒ ์กฐ์ฑํฉ๋๊น? ์ด ์ ๋๋ฉ์ด์
์ ์์ฐ์ค๋ฌ์ด ์ํ์์ ์ฌ์ฉ์ ์
๋ ฅ์ ์ด๋ป๊ฒ ์๋ตํฉ๋๊น?</p><p><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/53a006b3-6570-4602-b557-dd194378bf45/moments-of-happiness-dragon.gif" alt="img2"></p><h2 id="1-๋จ๊ณ-๊ด์ธก"><a href="#1-๋จ๊ณ-๊ด์ธก" class="headerlink" title="1 ๋จ๊ณ : ๊ด์ธก"></a>1 ๋จ๊ณ : ๊ด์ธก</h2><p>์ด ์คํ์ ์์ํ๊ธฐ ์ ์ ๋๋ ์ ํ๊ณ ์ถ์๋ ๋๋์ ๊ด์ฐฐํ๊ณ ๊ธฐ์ตํ๊ณ ๊ณ ์ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋๋ค.</p><p>Chill the Lion์ ๋ง๋ค ๋๊น์ง, ๋์ ๊ฐ๋ฅผ ์ ํ์ฐ๋ ๊ฒ์ ์๊ฐ์ ์๋ํ ์์ฒ์ด๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฐ ์ฆ๊ฑฐ์์ ์ํด ๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ๊ด์ฐฐํ๊ณ ๊ทธ์ ๋ชฉ์ ๊ธํ์๋ฌ๋ผ๊ณ ์์ฒญํ๋ค. ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก์ด๋ฅผ ๋ฒ์ญ ํ ์ฌ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ๋ ๊ฒ์ ๊ณต๊ฐ๊ณผ ๊ธฐ๋ณธ ์ํ ๊ธฐ์ ์ ํผํฉ ํ ๊ฒ์
๋๋ค.<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/431d55c0-9712-4196-8dd6-85b14088a9f1/moments-of-happiness-lion.gif" alt="img3"></p><p>โparanoid ์โ(์๋)์ ๋ํด, ๋๋ ํ์๊ฐ์ ํ์ ์ ๊ฐ์ง ๋ถํธํ ์ธ๋ชจ๋ฅผ ๋ชจ๋ฐฉ ํ ๊ฒ์ ๊ธฐ์ตํ๊ณ , ์ผ๋ง๋ ๋ง์ ์๊ฐ์ด ๋๊ณผ ๋จธ๋ฆฌ ์์ง์์ ๋ถ๋ฆฌํ๋์ง ์์๋ด์ด ์ค๋๋ ฅ์๋ ํ๋์ ๋ณด์ด๋๋ก ๋
ธ๋ ฅํ์ต๋๋ค.<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ced05c55-bb18-48d7-b6cb-b9051847326d/moments-of-happiness-birds.gif" alt="img4"></p><p>๊ทธ๋ฌ๋ ๋๋๋ก, ๋น์ ์ ๋น์ ์ ์์ ์ ๊ฒฝํ์ ์์ง ํ ์ ์์ต๋๋ค. ์๊ฐ์ ์๊ฐ์ ๋๋๋ก ํน์ ํํ์ ํ์
ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๋คํํ๋, ์ด๋ค ์ข
๋ฅ์ ๋ฏธ๋ฌํ ํํ์ ์ฐพ์ ์์๋ Giphy ๊ฐ ์์ต๋๋ค. YouTube์ Vimeo์์ ์ฌ๋ฐ๋ฅธ ์์ง์์ ์ฐพ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค.</p><h2 id="์คํ์ฃผ๊ธฐ-๊ด์ฐฐ"><a href="#์คํ์ฃผ๊ธฐ-๊ด์ฐฐ" class="headerlink" title="์คํ์ฃผ๊ธฐ ๊ด์ฐฐ"></a>์คํ์ฃผ๊ธฐ ๊ด์ฐฐ</h2><p>ํ๋ณต์ ์๊ฐ์ ๋ง๋ค์ด์ผ ํ ๊ฐ์ฅ ๊น๋ค๋ก์ด ์ ๋๋ฉ์ด์
์ค ํ๋๋ ํ ๋ผ๊ฐ ๋๋์๊ฒ์ ๋ฌ์๋๋<a href="https://moments.epic.net/#rabbit" target="_blank" rel="external">https://moments.epic.net/#rabbit</a>) ๊ฒ์ด ์์ต๋๋ค.<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e8f9b9c-c4eb-4302-a084-8d51cefc26ab/moments-of-happiness-rabbit.gif" alt="img5"> </p><p>์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด์๋ ๋จผ์ ์คํ์ฃผ๊ธฐ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Giphy์์ ์ฌ์ฉํ ์์๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ฌ๋ก์ฐ ๋ชจ์
GIF๋ฅผ ์ดํด ๋ณด์์ต๋๋ค.<br><img src="https://media.giphy.com/media/NmGbJwLl7Y4lG/giphy.gif" alt="img6"></p><p>์ด GIF์์ ํฅ๋ฏธ๋ก์ด ์ ์ ๋ฌ๋ฆฌ๊ธฐ๋ ๋ค๋ฆฌ๋ฅผ ์์ง์ด๋ ๊ฒ๋ง์ด ์๋๋ผ๋ ๊ฒ์
๋๋ค.<br>๊ทธ๊ฒ์ ๋ชธ ์ ์ฒด์ ๊ดํ ๊ฒ์
๋๋ค. ๊ฐ์ฅ ์์ ๋ถ๋ถ์ ํฌํจํ์ฌ ์๋ฒฝํ ๋๊ธฐํ๋ก ์์ง์
๋๋ค. ์๋์ ์ค๋ ฅ์ ๋๊น์ ๋์ด๊ธฐ ์ํด ์ฐธ์ฌํ๋ ๊ท, ์
, ์ฌ์ง์ด ํ๋ฅผ ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.</p><p>์ง์ค์ ๋๋ฌผ๊ณผ ๋ฌ๋ฆฌ๊ธฐ๊ฐ ๊ฐ๋ฅํ ํ ๋ง์ ์คํ์ฃผ๊ธฐ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฌ๋ฆฌ๊ธฐ ์ฌ์ดํด์ ํํค ์น๊ณ ์ถ๋ค๋ฉด ์ข ๋ ์ ํํ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ์ข์ง ์์ ๊ฒ์
๋๋ค. ๋ ๊ฐ์ง ์ ์ฉํ ์๋ฃ๋ Pinterest ์ โRun Cycleโ์ปฌ๋ ์
(<a href="https://www.pinterest.co.kr/c3ck1na/run-cycle/?lp=true" target="_blank" rel="external">https://www.pinterest.co.kr/c3ck1na/run-cycle/?lp=true</a>) ๊ณผ ๋ฉ์ง โ Quadruped Locomotion Tutorialโ (<a href="https://vimeo.com/202205778)๋น๋์ค์
๋๋ค" target="_blank" rel="external">https://vimeo.com/202205778)๋น๋์ค์
๋๋ค</a>.</p><p>์ด๋ฌํ ์ฐ๊ตฌ๋ฅผ ๋ณด๋ฉด ๊ฐ ์คํ์ฃผ๊ธฐ์ ์ญํ์ด๋ณด๋ค ๋ช
ํ ํด์ง๋๋ค. ๋น์ ์ ๋๋๋ ์ ์ฒด์ ๊ฐ ๋ถ๋ถ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํ์
ํ๊ธฐ ์์ํ ๊ฒ์ด๊ณ , ๊ฒฝ๊ธฐ์ ์์์ ๋ฆฌ๋ฌ์ ์ํ์ ์ด๊ณ ๋ฐ๋ณต์ ์ด๋ฉฐ ์ฌํ ๊ฐ๋ฅํ ํํ๋ฅผ ๋ํ๋ผ ๊ฒ์
๋๋ค.</p><p>์ด์ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ์ํ ๊ธฐ์ ์ ์ธ ์๋ฃจ์
์ด ํ์ํฉ๋๋ค.</p><h2 id="๊ด์ฐฐ-์๋ํ"><a href="#๊ด์ฐฐ-์๋ํ" class="headerlink" title="๊ด์ฐฐ ์๋ํ"></a>๊ด์ฐฐ ์๋ํ</h2><p>ํ๋์ ํธ๋ค์ ๋๋ฆด ๋ ๋ณต์กํ ๋์์ํ๋ ๊ธฐ๊ณ์ ์ฅ๋๊ฐ์ ํฅ๋ฏธ๋ฅผ ๋๋ ์ ๋ ์ ์ฌํ ๊ธฐ์ ์ ์๋ํ๊ณ ํ์ ๋ผ์ธ๊ณผ ํค ํ๋ ์๋ณด๋ค ํ๋ก์ธ์ค์ ๋ ์ ํฉํ ์ฝ๋ ๊ธฐ๋ฐ ์๋ฃจ์
์ ํ์ํ๋ ค๊ณ ํ์ต๋๋ค.</p><p>๋จ์ํ๊ฑฐ๋ ๋ณต์กํ ๋ฃจํ ๋์์ ์ ์ ์ผ๋ก ํ์ฃผ๊ธฐ์ ์งํ์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐ ํฉ๋๋ค .<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7ceaa94-b297-43ee-9cb7-838ed8d84bd8/boat.gif" alt="img7"></p><p>๋ฌ๋ฆฌ๊ธฐ ์ฌ์ดํด์์, ์ด๋ ๊ฐ ๋ค๋ฆฌ, ๊ท, ๋, ๋ชธ์ฒด ๋ฐ ๋จธ๋ฆฌ์ ์์ง์์ด ๋์ผํ ์ฃผ์ฃผ๊ธฐ์ ์ํด ์ ๋ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์์ฑ ๋ ํ์ ์ด ์ํ ์ด๋์ผ๋ก ๋ณํ๋๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์์ง์ผ๋ก ๋ณํ๋ฉ๋๋ค.</p><p>์ํ ์ด๋์ ์ ํ ์ด๋์ผ๋ก ๋ณํ ํ ๋ ์ผ๊ฐ๋ฒ์ด ์ต์ ์ ์ ํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.</p><h2 id="2-๋จ๊ณ-๋ฌด๊ธฐ๋ฅผ-์ฐ๋งํ๊ณ -์ผ๊ฐ๋ฒ์-๋ฐฐ์ฐ์ญ์์ค"><a href="#2-๋จ๊ณ-๋ฌด๊ธฐ๋ฅผ-์ฐ๋งํ๊ณ -์ผ๊ฐ๋ฒ์-๋ฐฐ์ฐ์ญ์์ค" class="headerlink" title="2 ๋จ๊ณ : ๋ฌด๊ธฐ๋ฅผ ์ฐ๋งํ๊ณ ์ผ๊ฐ๋ฒ์ ๋ฐฐ์ฐ์ญ์์ค."></a>2 ๋จ๊ณ : ๋ฌด๊ธฐ๋ฅผ ์ฐ๋งํ๊ณ ์ผ๊ฐ๋ฒ์ ๋ฐฐ์ฐ์ญ์์ค.</h2><p>๋๋ง ๊ฐ์ง ๋ง! ์ฌ๊ธฐ์ ํ์ํ ์ผ๊ฐ๋ฒ์ ์ข
๋ฅ๋ ๋งค์ฐ ๊ธฐ๋ณธ์
๋๋ค. ๋๋ถ๋ถ์ ์์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.</p><p><code>x = cos(angle)*distance;y = sin(angle)*distance;</code></p><p>์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ๊ทน์ขํ (๊ฐ๋, ๊ฑฐ๋ฆฌ)๋ฅผ ์ง๊ต ์ขํ (x, y)๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.</p><p>๊ฐ๋๋ฅผ ๋ณํ์ํด์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ ์ ์ค์ฌ ์ฃผ์๋ก ํ์ ์ํฌ ์ ์์ต๋๋ค.<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bf1b140f-3097-4cfc-a765-91fb05de04d8/moments-of-happiness-circle1.gif" alt="img9"></p><p>์ผ๊ฐ๋ฒ ๋๋ถ์ ์ฐ๋ฆฌ๋ ์์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋์์ ํจ์ฌ ๋ ์ ๊ตํ ์ด๋์ ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ ์ ์๋ฆ๋ค์์ ๋น์ ์ด ์ด๋์์ ์ป๋ ๋ถ๋๋ฌ์์
๋๋ค.</p><p>์ฌ๊ธฐ ๋ช ๊ฐ์ง ์๊ฐ ์์ต๋๋ค.<br><img src="https://cloud.netlifyusercontent.com/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/2618b6f1-95e6-490c-90b7-95f7d3a8e794/moments-of-happiness-circles2.gif" alt="img10"></p><h2 id="์ค์ต"><a href="#์ค์ต" class="headerlink" title="์ค์ต!"></a>์ค์ต!</h2><p>์ผ๊ฐ๋ฒ์ ์ดํดํ๋ ค๋ฉด ์์ ๋๋ฝํ์ผ ํฉ๋๋ค.<br>๊ฒฝํ์ด์๋ ์ด๋ก ์ ๋จ์ํ ์ง์ ๋์ด์ด๋ค.</p><p>์์ ์์ ์ค ์ผ๋ถ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ธฐ๋ณธ ํ๊ฒฝ์ ์ค์ ํด์ผํฉ๋๋ค. ์ด ์์
์ canvas, SVG ๋๋ three.js , PixiJS ๋๋ BabylonJS ์ ๊ฐ์ ๊ทธ๋ํฝ API๊ฐ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ํ ์ ์์ต๋๋ค .</p><p>๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ three.js ์ค์ ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.</p><p>๋จผ์ ์ต์ ๋ฒ์ ์ three.js๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ html๋จธ๋ฆฌ๊ธ๋ก ๊ฐ์ ธ์ต๋๋ค .</p><p><code><script type="text/javascript" src="js/three.js"></script></code></p><p>HTML</p><p><code><div id="world"></div></code></p><p>CSS</p><pre><code>#world {position: absolute;width: 100%;height: 100%;overflow: hidden;background: #ffffff;}</code></pre><p>JAVASCRIPT</p><pre><code>// Initialize variables.var scene, camera, renderer, WIDTH, HEIGHT;var PI = Math.PI;var angle = 0;var radius = 10;var cube;var cos = Math.cos;var sin = Math.sin;function init(event) { // Get the container that will hold the animation. var container = document.getElementById('world'); // Get window size. HEIGHT = window.innerHeight; WIDTH = window.innerWidth; // Create a three.js scene; set up the camera and the renderer. scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera( 50, WIDTH / HEIGHT, 1, 2000 ); camera.position.z = 100; renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true }); renderer.setSize(WIDTH, HEIGHT); renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1); container.appendChild(renderer.domElement); // Create the cube. var geom = new THREE.CubeGeometry(16,8,8, 1); var material = new THREE.MeshStandardMaterial({ color: 0x401A07 }); cube = new THREE.Mesh(geom, material); // Add the cube to the scene. scene.add(cube); // Create and add a light source. var globalLight = new THREE.AmbientLight(0xffffff, 1); scene.add(globalLight); // Listen to the window resize. window.addEventListener('resize', handleWindowResize, false); // Start a loop that will render the animation in each frame. loop();}function handleWindowResize() { // If the window is resized, we have to update the camera aspect ratio. HEIGHT = window.innerHeight; WIDTH = window.innerWidth; renderer.setSize(WIDTH, HEIGHT); camera.aspect = WIDTH / HEIGHT; camera.updateProjectionMatrix();}function loop(){ // Call the update function in each frame to update the cube position. update(); // Render the scene in each frame. renderer.render(scene, camera); // Call the loop function in next frame. requestAnimationFrame(loop);}// Initialize the demo when the page is loaded.window.addEventListener('load', init, false);``</code></pre><p>์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฅ๋ฉด, ์นด๋ฉ๋ผ, ์กฐ๋ช
๋ฐ ํ๋ธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ ํ๋ ์์์ ํ๋ธ์ ์์น๋ฅผ โโ์
๋ฐ์ดํธํ๋ ๋ฃจํ๋ฅผ ์์ํ์ต๋๋ค.</p><p>์ด์ ์ฐ๋ฆฌ๋ update()ํจ์ ๋ฅผ ์ถ๊ฐ ํ ํ์๊ฐ ์์ต๋๋ค. ์ผ๊ฐ ํจ์ ๊ณต์์ ์ฝ์
ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ํ๋ ์ด ํ ์ ์์ต๋๋ค </p><pre><code>function update(){ // The angle is incremented by 0.1 every frame. Try higher values for faster animation. angle += .1; // Try modifying the angle and/or radius for a different movement. cube.position.x = cos(angle) * radius; cube.position.y = sin(angle) * radius; // You might want to use the same principle on the rotation property of an object. Uncomment the next line to see what happens. //cube.rotation.z = cos(angle) * PI/4; //Or vary the scale. Note that 1 is added as an offset to avoid a negative scale value. //cube.scale.y = 1 + cos(angle) * .5; /* Your turn! You might want to: - comment or uncomment the lines above to try new combinations, - replace cos by sin and vice versa, - replace radius with an other cyclic function. For example : cube.position.x = cos(angle) * (sin(angle) *radius); ... */}</code></pre><p>์์ด๋ฒ๋ฆฐ ๋๋์ด๋ผ๋ฉด Codepen ์์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ๊ฒ ์
๋๋ค. ์ฌ์ธ ๋ฐ ์ฝ์ฌ์ธ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ธ๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด๋ํ๊ณ ์ ๋๋ฉ์ด์
์ ์ผ๊ฐ๋ฒ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ์ ์ดํดํ ์ ์์ต๋๋ค.</p><p>๋๋ ๋ค์ ๋ฐ๋ชจ๋ก ์ด๋ํ์ฌ ์์ ์ ๊ฑท๊ธฐ ๋๋ ๋ฌ๋ฆฌ๊ธฐ ์ฌ์ดํด์ ์์ํ๊ธฐ์ํ ์ถ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.</p><h2 id="์ผ๊ฐ๋ฒ์-์ฌ์ฉํ์ฌ-๊ฑท๊ธฐ-๋๋-๋ฌ๋ฆฌ๊ธฐ-์ฌ์ดํด์-๋ง๋๋-๋ฐฉ๋ฒ"><a href="#์ผ๊ฐ๋ฒ์-์ฌ์ฉํ์ฌ-๊ฑท๊ธฐ-๋๋-๋ฌ๋ฆฌ๊ธฐ-์ฌ์ดํด์-๋ง๋๋-๋ฐฉ๋ฒ" class="headerlink" title="์ผ๊ฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ฑท๊ธฐ ๋๋ ๋ฌ๋ฆฌ๊ธฐ ์ฌ์ดํด์ ๋ง๋๋ ๋ฐฉ๋ฒ"></a>์ผ๊ฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ฑท๊ธฐ ๋๋ ๋ฌ๋ฆฌ๊ธฐ ์ฌ์ดํด์ ๋ง๋๋ ๋ฐฉ๋ฒ</h2><p>์ด์ ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ธ๋ฅผ ์์ง์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๊ณ ๋์ผํ ์๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ๊ณ๋ณ๋ก ๊ฐ๋จํ ๊ฑท๊ธฐ ์ฌ์ดํด์ ๋ง๋ค ๊ณํ์
๋๋ค.</p><p>์ฐ๋ฆฌ๋ ์ด์ ๊ณผ ๊ฐ์ ์ค์ ์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ค๋ฅธ ์ ์ฒด ๋ถ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ๋ง์ ํ๋ธ๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค.</p><p>three.js๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๊ทธ๋ฃน ์์ ์ค๋ธ์ ํธ ๊ทธ๋ฃน์ ๋ด์ฅ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค๋ฆฌ, ํ, ๋จธ๋ฆฌ๋ฅผ ์งํฑํ๋ ๋ชธ์ฒด ๊ทธ๋ฃน์ ๋ง๋ค ์ ์์ต๋๋ค.</p><p>์ฐ๋ฆฌ์ ์ฃผ์ธ๊ณต์ด ์ด๋ป๊ฒ ๋ง๋ค์ด ์ก๋์ง ๋ณด์.</p><pre><code>Hero = function() { // This will be incremented later at each frame and will be used as the rotation angle of the cycle. this.runningCycle = 0; // Create a mesh that will hold the body. this.mesh = new THREE.Group(); this.body = new THREE.Group(); this.mesh.add(this.body); // Create the different parts and add them to the body. var torsoGeom = new THREE.CubeGeometry(8,8,8, 1);// this.torso = new THREE.Mesh(torsoGeom, blueMat); this.torso.position.y = 8; this.torso.castShadow = true; this.body.add(this.torso); var handGeom = new THREE.CubeGeometry(3,3,3, 1); this.handR = new THREE.Mesh(handGeom, brownMat); this.handR.position.z=7; this.handR.position.y=8; this.body.add(this.handR); this.handL = this.handR.clone(); this.handL.position.z = - this.handR.position.z; this.body.add(this.handL); var headGeom = new THREE.CubeGeometry(16,16,16, 1);// this.head = new THREE.Mesh(headGeom, blueMat); this.head.position.y = 21; this.head.castShadow = true; this.body.add(this.head); var legGeom = new THREE.CubeGeometry(8,3,5, 1); this.legR = new THREE.Mesh(legGeom, brownMat); this.legR.position.x = 0; this.legR.position.z = 7; this.legR.position.y = 0; this.legR.castShadow = true; this.body.add(this.legR); this.legL = this.legR.clone(); this.legL.position.z = - this.legR.position.z; this.legL.castShadow = true; this.body.add(this.legL); // Ensure that every part of the body casts and receives shadows. this.body.traverse(function(object) { if (object instanceof THREE.Mesh) { object.castShadow = true; object.receiveShadow = true; } });}</code></pre><p>์ด์ ์ด ์บ๋ฆญํฐ๋ฅผ ์ฅ๋ฉด์ ์ถ๊ฐํด์ผํฉ๋๋ค.</p><pre><code>function createHero() { hero = new Hero(); scene.add(hero.mesh);}</code></pre><p>์ด๊ฒ์ three.js๋ก ๊ฐ๋จํ ์บ๋ฆญํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค. three.js๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์๊ณ ์ถ์ผ๋ฉด Codrops์ ๋ํ ์์ธํ ์์ต์ ๋ฅผ ์ฝ์ด๋ณด์ญ์์ค .</p><p>์ด ๋ชธ์ฒด๋ฅผ ๋ง๋ ํ์๋ ๊ฐ๋จํ ๊ฑท๊ธฐ ์ฌ์ดํด์ ๋๋ฌ ํ ๋๊น์ง ์ ์ฐจ์ ์ผ๋ก์ด ๋ชจ๋ ๋ถ๋ถ์ ํ๋์ฉ ์์ง์ด๊ฒ ํ ๊ฒ์
๋๋ค.</p><p>์ ์ฒด ๋
ผ๋ฆฌ๋ ๊ฐ์ฒด ์ runํจ์์ ์์น Heroํฉ๋๋ค.</p><pre><code>Hero.prototype.run = function(){ // Increment the angle. this.runningCycle += .03; var t = this.runningCycle; // Ensure that the angle we will use is between 0 and 2 Pi. t = t % (2*PI); // Amplitude is used as the main radius of the legs movement. var amp = 4; // Update the position and rotation of every part of the body. this.legR.position.x = Math.cos(t) * amp; this.legR.position.y = Math.max (0, - Math.sin(t) * amp); this.legL.position.x = Math.cos(t + PI) * amp; this.legL.position.y = Math.max (0, - Math.sin(t + PI) * amp); if (t<PI){ this.legR.rotation.z = Math.cos(t * 2 + PI/2) * PI/4; this.legL.rotation.z = 0; } else{ this.legR.rotation.z = 0; this.legL.rotation.z = Math.cos(t * 2 + PI/2) * PI/4; } this.torso.position.y = 8 - Math.cos( t * 2 ) * amp * .2; this.torso.rotation.y = -Math.cos( t + PI ) * amp * .05; this.head.position.y = 21 - Math.cos( t * 2 ) * amp * .3; this.head.rotation.x = Math.cos( t ) * amp * .02; this.head.rotation.y = Math.cos( t ) * amp * .01; this.handR.position.x = -Math.cos( t ) * amp; this.handR.rotation.z = -Math.cos( t ) * PI/8; this.handL.position.x = -Math.cos( t + PI) * amp; this.handL.rotation.z = -Math.cos( t + PI) * PI/8;}</code></pre><p>์ด ์ฝ๋ ๋ผ์ธ์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ด์ง๋ง Codepen์์ ์ํน ์ฌ์ดํด ์ ์ ์ฒด ์ฝ๋ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค .(<a href="https://codepen.io/Yakudoo/pen/YxMJMv?editors=0010" target="_blank" rel="external">https://codepen.io/Yakudoo/pen/YxMJMv?editors=0010</a>)</p><p>๋ฐ๋ผํ๊ธฐ ์ฝ๋๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐ๋ชจ๋ฅผ ๋ง๋ค์์ต๋๋ค.์ด ๋ฐ๋ชจ๋ ๋์์ ๋ถํดํ๊ณ ์ด๋๋๋ ์ ์ฒด ๋ถ๋ถ๊ณผ ๊ฐ ๋จ๊ณ์์ ์ฌ์ฉ๋๋ ์์์ ๊ฐ์กฐ ํ์ํฉ๋๋ค.</p><p><a href="https://codepen.io/Yakudoo/pen/qXaNeN" target="_blank" rel="external">https://codepen.io/Yakudoo/pen/qXaNeN</a></p><h2 id="๋ค-์ฐจ๋ก-์ผ"><a href="#๋ค-์ฐจ๋ก-์ผ" class="headerlink" title="๋ค ์ฐจ๋ก ์ผ!"></a>๋ค ์ฐจ๋ก ์ผ!</h2><p>๋๋ ํ ๋ผ์ ๋์ง ์๊ณ ๋๋ฅผ ๋ณด๋ด์ง ์์ ๊ฒ์ด๋ค.</p><p>์๋์ Codepen์ ์ฌ์ฉํ๋ฉด ๋ชธ์ ๊ฐ ๋ถ๋ถ๋ง๋ค ๋ค๋ฅธ ๊ฐ๋ ์คํ์
๊ณผ ๋ค๋ฅธ ์งํญ์ ์ ์ฉ ํ ์ ์์ต๋๋ค. ๋ณด๋ค ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ํด์ฃผ๊ธฐ์ ์๋๋ฅผ ์์ ํ ์๋ ์์ต๋๋ค.</p><p>์ด ์ฌ๋์ ๋ํด ๋ค๋ฅธ ์คํ์ฃผ๊ธฐ๋ฅผ ์์๋ผ ์ ์์ต๋๊น? ์ฌ๋ฏธ์์ด!<br><a href="https://codepen.io/Yakudoo/pen/PjaeGV" target="_blank" rel="external">https://codepen.io/Yakudoo/pen/PjaeGV</a></p><h2 id="๊ฒฐ๋ก "><a href="#๊ฒฐ๋ก " class="headerlink" title="๊ฒฐ๋ก "></a>๊ฒฐ๋ก </h2><p>์ฝ๋ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์ด ๋ถ ์์ฐ์ค๋ฌ์ด ์์ง์์ ์ผ์ผํจ๋ค ๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ์คํ๋ ค ๋๋ ๋งค์ฐ ์ ์ฐํ ๋ฐฉ์์ผ๋ก ์์ง์์ ์กฐ์ ํ ์์๋ ์ข์ ๊ธฐํ๋ฅผ ์ ๊ณตํ์ฌ ์์ ์ ์ฑ๊ฒฉ์ ๋ง๋ ์ค๋๋ ฅ์๋ ํ๋์ ์ฝ๊ฒ ์ทจํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.</p><p>ํ๋ณต์ ์๊ฐ (Moments of Happiness) ์ ๋ค์ํ ์คํ์ ๋ชจ์์ด๋ฉฐ ๊ฐ ์คํ๋ง๋ค ๊ณ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ ์คํ์ฃผ๊ธฐ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ ๋ ์๋ฃจ์
์ ์์ธํ ์ค๋ช
ํ์ต๋๋ค. ๋ด Codepen ํ์ด์ง์์์ด ๋ชจ๋ ์คํ์ ์ํ๋๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ ๋กญ๊ฒ ๋๊ณ ๋ํ ํ ์ฅ๋๊ฐ์ ๋ง๋ค ์ ์์ต๋๋ค.</p>]]></content>
<summary type="html">
<blockquote>
<p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>์ถ์ฒ : <a href="http://zuu.kr/izge" target="_blank" rel="external">http://zuu.kr/izge</a><br>์์ฑ
</summary>
</entry>
<entry>
<title>5๊ฐ์ง ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ผ ๊ฐ์ด๋</title>
<link href="https://devhaeyeon.github.io/2017/12/03/five-js-styleguide/"/>
<id>https://devhaeyeon.github.io/2017/12/03/five-js-styleguide/</id>
<published>2017-12-03T12:06:09.000Z</published>
<updated>2017-12-04T09:48:32.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(์ถ์ฒ : <a href="http://zuu.kr/izdf" target="_blank" rel="external">http://zuu.kr/izdf</a> )</p></blockquote><h1 id="5๊ฐ์ง-์๋ฐ์คํฌ๋ฆฝํธ-์คํ์ผ-๊ฐ์ด๋-โ-Airbnb-amp-google-gitbut"><a href="#5๊ฐ์ง-์๋ฐ์คํฌ๋ฆฝํธ-์คํ์ผ-๊ฐ์ด๋-โ-Airbnb-amp-google-gitbut" class="headerlink" title="5๊ฐ์ง ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ผ ๊ฐ์ด๋โโโAirbnb & google , gitbut"></a>5๊ฐ์ง ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ผ ๊ฐ์ด๋โโโAirbnb & google , gitbut</h1><h2 id="๊ตฌ๊ธ๋ฌ-๊ฐ์-์ฝ๋๋ฅผ-๋ฐฐ์๋ณด์"><a href="#๊ตฌ๊ธ๋ฌ-๊ฐ์-์ฝ๋๋ฅผ-๋ฐฐ์๋ณด์" class="headerlink" title="๊ตฌ๊ธ๋ฌ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐฐ์๋ณด์"></a>๊ตฌ๊ธ๋ฌ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐฐ์๋ณด์</h2><p>์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ๊ฑฐ๋ AirBnB์ ๊ฐ์ ๋๊ท๋ชจ ์ธํฐ๋ทฐ๋ฅผ ์ค๋นํ ๋,<br>๋ ๊นจ๋ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด๋๋ 5 ๊ฐ์ง ์คํ์ผ ๊ฐ์ด๋๊ฐ ์์ต๋๋ค.</p><h2 id="์คํ์ผ-๊ฐ์ด๋-๋-๋ฌด์์ผ๊น์"><a href="#์คํ์ผ-๊ฐ์ด๋-๋-๋ฌด์์ผ๊น์" class="headerlink" title="์คํ์ผ ๊ฐ์ด๋ ๋ ๋ฌด์์ผ๊น์?"></a>์คํ์ผ ๊ฐ์ด๋ ๋ ๋ฌด์์ผ๊น์?</h2><p>์คํ์ผ ๊ฐ์ด๋๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ํ์ค ์งํฉ์
๋๋ค.<br>์ด ๊ฐ์ด๋๋ฅผ ์ฝ์ผ๋ฉด์ ๊ฐ ํ์ฌ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์ต๋๋ค.</p><h2 id="์คํ์ผ-๊ฐ์ด๋๊ฐ-ํ์ํ-์ด์ ๋-๋ฌด์์
๋๊น"><a href="#์คํ์ผ-๊ฐ์ด๋๊ฐ-ํ์ํ-์ด์ ๋-๋ฌด์์
๋๊น" class="headerlink" title="์คํ์ผ ๊ฐ์ด๋๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น?"></a>์คํ์ผ ๊ฐ์ด๋๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น?</h2><p>ํ ๊ฐ์ง ์ฃผ๋ ์ด์ ๋ก๋ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ์์ฑํฉ๋๋ค.<br>ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ญ๊ฐ๋ฅผํ๊ณ ์ถ์ ์๋ ์๊ณ , ๋ค๋ฅธ ๋ฐฉ์์ผ๋กํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.<br>์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๋ํด ์์
ํ๋ ํ ๊ด์ฐฎ์ต๋๋ค.<br>ํ์ง๋ง 10, 100, ์ฌ์ง์ด 1,000 ๋ช
์ ๊ฐ๋ฐ์๊ฐ ๋ชจ๋ ๋์ผํ ์ฝ๋๋ฒ ์ด์ค์์ ์์
ํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ ๊น์?<br>์ํฉ์ด ๋งค์ฐ ์ง์ ๋ถ ํด์ง๋๋ค.<br>์คํ์ผ ๊ฐ์ด๋๋ ์๋ก์ด ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ์ํ๊ฒ ์ตํ๊ณ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ดํดํ ์์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค!</p><h2 id="airbnb-์คํ์ผ-๊ฐ์ด๋"><a href="#airbnb-์คํ์ผ-๊ฐ์ด๋" class="headerlink" title="airbnb ์คํ์ผ ๊ฐ์ด๋"></a>airbnb ์คํ์ผ ๊ฐ์ด๋</h2><p><a href="https://github.com/airbnb/javascript" target="_blank" rel="external">https://github.com/airbnb/javascript</a><br>์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ํ ํฉ๋ฆฌ์ ์ธ ์ ๊ทผ๋ฒ<br>Airbnb๋ ์ธํฐ๋ท์์ ๊ฐ์ฅ ์ธ๊ธฐ์๋ JavaScript ์คํ์ผ ๊ฐ์ด๋ ์ค ํ๋์
๋๋ค.<br>์๋ฐ ์คํฌ๋ฆฝํธ์ ๊ฑฐ์ ๋ชจ๋ ์ธก๋ฉด์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.</p><h2 id="Google-์๋ฐ-์คํฌ๋ฆฝํธ-์คํ์ผ-๊ฐ์ด๋"><a href="#Google-์๋ฐ-์คํฌ๋ฆฝํธ-์คํ์ผ-๊ฐ์ด๋" class="headerlink" title="Google ์๋ฐ ์คํฌ๋ฆฝํธ ์คํ์ผ ๊ฐ์ด๋"></a>Google ์๋ฐ ์คํฌ๋ฆฝํธ ์คํ์ผ ๊ฐ์ด๋</h2><p><a href="https://google.github.io/styleguide/jsguide.html" target="_blank" rel="external">https://google.github.io/styleguide/jsguide.html</a><br>์๋ฐ ์คํฌ๋ฆฝํธ ์์ค ํ์ผ์ ์ฌ๊ธฐ์์๋ ๊ท์น์ ์ค์ํ๋ ๊ฒฝ์ฐ์๋ง<br>Google ์คํ์ผ๋ก ์ค๋ช
๋ฉ๋๋ค.</p><h2 id="๊ด์ฉ์ -์ธ-JavaScript-์คํ์ผ-๊ฐ์ด๋"><a href="#๊ด์ฉ์ -์ธ-JavaScript-์คํ์ผ-๊ฐ์ด๋" class="headerlink" title="๊ด์ฉ์ ์ธ JavaScript ์คํ์ผ ๊ฐ์ด๋"></a>๊ด์ฉ์ ์ธ JavaScript ์คํ์ผ ๊ฐ์ด๋</h2><p><a href="https://github.com/rwaldron/idiomatic.js/" target="_blank" rel="external">https://github.com/rwaldron/idiomatic.js/</a><br>์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ๊ณตํํ๋์ง์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ชจ๋ ์ฝ๋๋ ํ ์ฌ๋์ด ์
๋ ฅ ํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.<br>๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ JavaScript ์คํ์ผ ๊ฐ์ด๋ ์ค ํ๋ ์ธ ๊ด์ฉ๊ตฌ ๊ฐ์ด๋๋ ์ฌ๋ฌ ์ธ์ด๋ก ์ ๊ณต๋๋ฉฐ ์์ฒญ์ ๋ฐ์ ๋ค์ผ ์ ์์ต๋๋ค.</p><h2 id="JavaScript-ํ์ค-์คํ์ผ-๊ฐ์ด๋"><a href="#JavaScript-ํ์ค-์คํ์ผ-๊ฐ์ด๋" class="headerlink" title="JavaScript ํ์ค ์คํ์ผ ๊ฐ์ด๋"></a>JavaScript ํ์ค ์คํ์ผ ๊ฐ์ด๋</h2><p><a href="https://github.com/standard/standard" target="_blank" rel="external">https://github.com/standard/standard</a><br>์ด ์คํ์ผ ๊ฐ์ด๋๋ NPM , GitHub , mongoDB ๋ฐ ZenDesk๋ฅผ ํฌํจํ ๋ง์ ๊ธฐ์ ํ์ฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.</p><h2 id="jQuery-JavaScript-์คํ์ผ-๊ฐ์ด๋"><a href="#jQuery-JavaScript-์คํ์ผ-๊ฐ์ด๋" class="headerlink" title="jQuery JavaScript ์คํ์ผ ๊ฐ์ด๋"></a>jQuery JavaScript ์คํ์ผ ๊ฐ์ด๋</h2><p>jQuery๋ฅผ ํฅ์์ํค๋ ๋ฐ ๋์์ด๋๋ ๋ช ๊ฐ์ง ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ์ต๋๊น? ์คํ์ผ ๊ฐ์ด๋๋ฅผ ์ฝ๊ณ JavaScript์ ํ์์ ํ์ธํ์ญ์์ค.<br>์น ์ฌ์ดํธ ์์ jQuery ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.</p>]]></content>
<summary type="html">
<blockquote>
<p>์๋์ ๊ธ์ ๋ฒ์ญ์ ํ์์์ ์ฌ์ ์ ์๋ ค ๋๋ฆฝ๋๋ค<br>(์ถ์ฒ : <a href="http://zuu.kr/izdf" target="_blank" rel="external">http://zuu.kr/izdf</a> )</p
</summary>
<category term="๋ฒ์ญ" scheme="https://devhaeyeon.github.io/tags/%EB%B2%88%EC%97%AD/"/>
</entry>
</feed>