-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss.xml
2719 lines (2642 loc) · 482 KB
/
rss.xml
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lazy Nyaong]]></title><description><![CDATA[Code, Lazy, Cat]]></description><link>https://ohseunghyeon.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 08 Jul 2021 05:09:39 GMT</lastBuildDate><item><title><![CDATA[떠가 자다가 갑자기 엄청 울었다.]]></title><description><![CDATA[요즘 떠는 꽤 컸다. 1…]]></description><link>https://ohseunghyeon.github.io/lavender/cried-so-hard-while-sleeping/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/cried-so-hard-while-sleeping/</guid><pubDate>Thu, 08 Jul 2021 05:02:26 GMT</pubDate><content:encoded><p>요즘 떠는 꽤 컸다. 15개월 쯤 됐나? 그래서 딱히 크게 우는 일이 없어졌다. 애기 때는 의사표현을 그걸로 밖에 못 했으니까 그랬지만 최근엔 이거 이거 하면서 원하는 것을 표현한다.</p>
<p>어제 저녁 일찌 잠드신 떠는 잠든지 한 시간 정도 후일까? 엄청 울면서 깼다. 근데 그 울음이 그쳐지지 않았다. 보통 이런 경우 토닥여주고 엄마나 아빠가 있음을 인지시켜주면 그쳤는데 말이다.</p>
<p>안겨서도 한참을 울고 도통 울음이 줄어들지 않았다. 한 10분은 운 것 같다. 울음에 관성이 붙었는지 이제는 왜 우는지도 모르겠더라. 한참을 울고 간신히 울음을 그친 아기에게 할머니와의 영통, 수박 조금, 뽀로로를 보여주었다.</p>
<p>그럼에도 뽀로로를 보다가 중간에 조금씩 울려고 했다. 악몽이었을까? 엄청 무서운 꿈을 꿨을까? 나도 잠자리에 들어서 왜 애기가 그렇게 울었는지 한참 생각하고 마음 아파했다. 온갖 사소한 일이 생각나며 그게 아기에게 악몽을 꾸게 하였을까 생각했다.</p>
<p>무슨 꿈이었을까. 아픈 게 아닌 것 같아서 다행이다.</p></content:encoded></item><item><title><![CDATA[연애의 온도를 오랜만에 다시 봤는데]]></title><description><![CDATA[2…]]></description><link>https://ohseunghyeon.github.io/essay/have-watched-very-ordinary-couple/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/have-watched-very-ordinary-couple/</guid><pubDate>Mon, 07 Jun 2021 14:48:29 GMT</pubDate><content:encoded><p>20대 초반 어렸을 때 이 영화를 꽤나 좋아했었다.</p>
<p>그 땐 정말 재밌었는데, 공감되는 내용이었으니까 그랬겠지?</p>
<p>근데 지금 다시 보니까 그 땐 잘 몰랐던 부분들이 보인다. 극중 캐릭터 이동희가 되게 다혈질적인 성격이었구나. 상대를 배려할 줄 모르고, 자기 감정 가는대로 말하고 상처주는 그런 성격.</p>
<p>어릴 땐 보면서 마냥 타이밍의 문제겠거니, 연애란 다 그런 거겠지 하고 생각했는데..</p>
<p>근데 아마 그 나이대의 연애는 다 그렇겠지?</p></content:encoded></item><item><title><![CDATA[과거를 그리워하는 일]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/missing-old-days/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/missing-old-days/</guid><pubDate>Tue, 27 Apr 2021 08:23:44 GMT</pubDate><content:encoded><p>뭐가 그리운 건지 잘 모르겠다.</p>
<p>나른하고 몽환적인 음악을 들으면 예전 시간들이 그리워진다. 그 음악과 예전의 그 시간, 기억 사이에 어떤 연관이 있는걸까?</p>
<p>그 때 난 그런 기분이었을까? 그 때가 언젠지도 모르는데? 아니면 기억이 흐릿해져서 그 흐릿함이 비슷하다고 느끼는 걸까.</p>
<p>아니면 이런 노래가 그 시절을 그리워하게 만드는 무언가를 가지고 있는 걸까?</p>
<p>난 줄곳 언제가 그립다는 생각은 하지 않고 살아왔다. 그런 얘기를 들으면 전혀 이해하지 못하곤 했다. 지금 와서 그런 기분이 드는 건 돌아갈 수 없기 때문일까? 그 땐 항상 그 곳에 있었기 때문일까.</p></content:encoded></item><item><title><![CDATA[1 year]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/1-year/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/1-year/</guid><pubDate>Wed, 14 Apr 2021 05:47:02 GMT</pubDate><content:encoded><p>시간이 빠른 건지 느린 건지 모르겠다. 아이의 첫 해는 그만큼 많은 일이 있었던 것 같다.</p>
<p>말 한 마디 못하던, 아니 우는 소리도 애기애기했던 그 애기가 이제는 조금씩 걷기 시작하고 시도 때도 없이 아빠 아빠 하며 날 괴롭힌다.</p>
<p>이젠 밥과 반찬도 먹기 시작했다. 물론 엄마가 다 떠먹여주지만.</p>
<p>애기를 키우다보면 뭐가 옳은 건지 고민되는 부분이 많다. 그렇지만 어쩌면 다 필요 없는 고민일지도 모른다. 내가 워낙 유난이라서 신경을 쓰는 것일 뿐.</p>
<p>어느덧 하루 세 끼를 먹고 잠도 잘 자는 아기가 되었다니.. 더군다나 생긴 것도 갈수록 더 귀엽고 사랑스럽다.</p>
<p>앞으로 왠지 더 힘들 것 같다는 생각이 들긴 하지만, 그만큼 사랑스러움이 배가 되고 있으니 상관 없을지도 모르지.</p>
<p>아래는 연서가 직접 찍은 셀카 ㅎㅎ</p>
<p>언제 찍었는지 모르지만 자기 엄마 폰으로 찍었다.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIB/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAanYnTQj/8QAGhAAAwADAQAAAAAAAAAAAAAAAAECERQhMf/aAAgBAQABBQLklMSZcOXPmzg//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAES/9oACAEDAQE/AWq//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAES/9oACAECAQE/AZGX/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIiEyQVH/2gAIAQEABj8Cjoq4Kifo3Jqf/8QAHBAAAgMBAAMAAAAAAAAAAAAAAREAITFBUWGx/9oACAEBAAE/IQwKyDXiEISzXhhQ6HvZaSgbm5QUROX3P//aAAwDAQACAAMAAAAQVO//xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEh/9oACAEDAQE/EFy4P//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EAZ//8QAHhABAAICAQUAAAAAAAAAAAAAAQARITFhQXGhsdH/2gAIAQEAAT8QTIIUYBq16RC3llfCJrvLVTn0OH6S0GAsGgyEQvKTSM6PHqU10MFUxP/Z'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="lavender"
title="lavender"
src="/static/230bbf556a2a8ed5dafff47e3e776d12/6aca1/lavender_1year.jpg"
srcset="/static/230bbf556a2a8ed5dafff47e3e776d12/d2f63/lavender_1year.jpg 163w,
/static/230bbf556a2a8ed5dafff47e3e776d12/c989d/lavender_1year.jpg 325w,
/static/230bbf556a2a8ed5dafff47e3e776d12/6aca1/lavender_1year.jpg 650w,
/static/230bbf556a2a8ed5dafff47e3e776d12/7c09c/lavender_1year.jpg 975w,
/static/230bbf556a2a8ed5dafff47e3e776d12/01ab0/lavender_1year.jpg 1300w,
/static/230bbf556a2a8ed5dafff47e3e776d12/394ef/lavender_1year.jpg 3088w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p></content:encoded></item><item><title><![CDATA[10개월]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/10-months/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/10-months/</guid><pubDate>Tue, 09 Feb 2021 03:20:34 GMT</pubDate><content:encoded><p>어느새 이렇게 컸을까. 시간이 빠르게 흘러가는 게 조금 아쉽다. 아무것도 스스로 하지 못하는 아기였던 벌써 이렇게 크다니. 아가의 예전 사진들을 보면 다시 만나고 싶고 그렇다.</p>
<p>어쩌면 이런 마음이 둘째를 갖게 하는 건지도 모르겠다. 그 한 순간 순간의 모습을 다 뇌리에 담고 싶고, 사진으로 남겨두고 싶다. 그래서 틈나는대로 동영상을 찍고 있지만, 그럼에도 아쉬운 건 어쩔 수가 없구나.</p>
<p>10개월이 조금 넘은 시점. 연서는 조금 더 사람처럼 안정적으로 설 수 있게 되었다. 이제 조금 있으면 걸을 수 있을 것 같다.</p>
<p>말은 또 얼마나 늘었는지 모른다. 비록 알 수 없는 옹알이지만 말이다. 아빠, 엄마는 어떻게 하는 건지 신기하다. 다른 말들도 가르치면 금방 할 것 같긴 한데, 그저 많은 말들을 들려주면 되겠지.</p>
<p>연서는 정말 활발하다. 호기심이 넘치고, 말도 많다. 어쩜 이런 아이가 우리에게 왔는지. 그치만 아마 우릴 닮아가겠지? 아기 때는 다 그런 거니까.</p></content:encoded></item><item><title><![CDATA[PostgreSQL, unique index 컬럼에 null 삽입으로 인한 중복 생성 문제]]></title><description><![CDATA[문제의 발단 Unique index가 걸려있는데 데이터가 중복으로 들어가는 현상을 발견했다. 원인은 Null Null은 서로 같지 않기 때문에 unique가 걸려 있는 컬럼이라도 Null…]]></description><link>https://ohseunghyeon.github.io/study/when-the-duplicates-are-created-on-postgreSQL-with-unique-index-by-null/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/study/when-the-duplicates-are-created-on-postgreSQL-with-unique-index-by-null/</guid><pubDate>Mon, 16 Nov 2020 02:57:09 GMT</pubDate><content:encoded><h2 id="문제의-발단" style="position:relative;"><a href="#%EB%AC%B8%EC%A0%9C%EC%9D%98-%EB%B0%9C%EB%8B%A8" aria-label="문제의 발단 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>문제의 발단</h2>
<p>Unique index가 걸려있는데 데이터가 중복으로 들어가는 현상을 발견했다.</p>
<p>원인은 Null</p>
<p>Null은 서로 같지 않기 때문에 unique가 걸려 있는 컬럼이라도 Null이 들어가면 서로 다른 것으로 인지된다.</p>
<h2 id="해결-방법" style="position:relative;"><a href="#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95" aria-label="해결 방법 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>해결 방법</h2>
<p>몇 가지 해결 방법을 생각했다.</p>
<ol>
<li>Null인 경우 Null이 아닌 특정 문자열(쓰레기 값)을 넣어서 중복을 인지하게 만들자.</li>
</ol>
<p>생각 후 바로 기각했다. 우선 쓰레기 값을 넣는 게 마음에 안 들었다. 그 값이 무슨 값인지 다른 사람이 보면 알 방법이 없다.</p>
<ol start="2">
<li>partial query를 사용한 Unique index 생성</li>
</ol>
<p>(참조 - <a href="https://stackoverflow.com/questions/8289100/create-unique-constraint-with-null-columns" target="_blank" rel="nofollow noopener noreferrer">https://stackoverflow.com/questions/8289100/create-unique-constraint-with-null-columns</a>)</p>
<p>이 방법도 기각했다. 아마 Null이 허용되는 컬럼이 하나뿐이었으면 이 방법을 고려했을지도 모르겠다.</p>
<ol start="3">
<li>테이블 분리</li>
</ol>
<p>아마 이 방법은 특수한 상황에서만 가능할 것 같다. 대개 2번이 해결방안이 되지 않을까 싶다.</p>
<p>내 경우 null이 있는 컬럼이 여럿이었다. 예를 들어서 a b c d 컬럼이 있을 때, a 컬럼에 따라서 3가지 경우가 있는 것과 같았다.</p>
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>O</td>
<td>null</td>
<td>null</td>
</tr>
<tr>
<td>2</td>
<td>O</td>
<td>0</td>
<td>null</td>
</tr>
<tr>
<td>3</td>
<td>O</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>만약 이 경우의 수가 좀 더 랜덤했다면 나는 2번도 쓰지 않고 1번을 최후의 보루로 생각했을 것이다.</p>
<p>그러나 케이스가 좀 깔끔했기 때문에 테이블을 분리하면 더 깔끔한 구조가 될 것이라 생각했다.</p>
<p>결과는 만족.</p></content:encoded></item><item><title><![CDATA[7개월]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/7-months/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/7-months/</guid><pubDate>Fri, 13 Nov 2020 13:57:42 GMT</pubDate><content:encoded><p>아기는 빨리 자란다.</p>
<p>한참을 더 자라야 어른이 되겠지만, 벌써 한 달, 두 달 전의 사진을 보면 같은 아이가 맞나 싶을 정도다.</p>
<p>얼굴은 비슷한데, 느낌이 많이 달라서 정말 신기하다.</p>
<p>그래도 아직은 정말 어린 우리 아기.</p>
<p>밤에 애앵 하고 깨면 가서 토닥여 준다.</p>
<p>이 작고 귀여운 아가가 밤에 애앵하고 울면 마음이 왠지 아린다.</p>
<p>그리고 안아서 토닥여주면 가슴이 정말 아이에 대한 사랑으로 벅차오른다.</p>
<p>요즘 점퍼루를 정말 잘 타는 귀염둥이.</p>
<p>아직 서지는 못하지만 곧 서겠지?</p>
<p>열심히 배를 밀고 다니는 귀염둥이..</p>
<p>엄마 적당히 괴롭혀.</p></content:encoded></item><item><title><![CDATA[아기와 나. 6개월의 여정]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/6-months-of-babysitting/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/6-months-of-babysitting/</guid><pubDate>Tue, 13 Oct 2020 14:15:57 GMT</pubDate><content:encoded><h2 id="빠른-성장" style="position:relative;"><a href="#%EB%B9%A0%EB%A5%B8-%EC%84%B1%EC%9E%A5" aria-label="빠른 성장 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>빠른 성장?</h2>
<p>애는 진짜 빠르게 큰다.</p>
<p>아니. 크기는 빠르게 크는데, 왜 이렇게 발달 자체는 늦을까?</p>
<p>우리 애는 기지 못한다. 그래. 다른 애들도 못 기는 건 같다.</p>
<p>근데 다른 동물들은 보통 태어나면서 기지 않아?..</p>
<h2 id="이유식" style="position:relative;"><a href="#%EC%9D%B4%EC%9C%A0%EC%8B%9D" aria-label="이유식 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>이유식</h2>
<p>추석 이후로 이유식을 먹고 있다.</p>
<p>내 딸이 이제 모유, 분유만이 아닌 다른 걸 먹는다는 게 정말 신기하다.</p>
<p>근데 잘 못 먹는다. 막 입 밑으로 주르륵 한다.</p>
<p>그치만 먹는 걸 좋아한다! 다 먹는다. 장해</p>
<h2 id="길-거야" style="position:relative;"><a href="#%EA%B8%B8-%EA%B1%B0%EC%95%BC" aria-label="길 거야 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>길 거야?</h2>
<p>기려고 한다. 기고 싶어한다?</p>
<p>언제 길래?.. 아니 기면 안 되는 걸까? 그럼 더 힘들지도.</p>
<p>한 번도 경험해보지 못한 것들이라서 뭐가 더 좋을지, 무엇을 바라야 할지도 모르겠다.</p>
<p>그치만 조만간 길 것 같다.</p>
<h2 id="치아가-나려고-해" style="position:relative;"><a href="#%EC%B9%98%EC%95%84%EA%B0%80-%EB%82%98%EB%A0%A4%EA%B3%A0-%ED%95%B4" aria-label="치아가 나려고 해 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>치아가 나려고 해?</h2>
<p>치아.. 치아가 나려는 걸까</p>
<p>새벽에 그냥 깨어서 열심히 울어재낀다. 그래. 울음소리도 커졌어</p>
<p>너 쎄진 거 알겠어. 힘도 쎄졌고.. 근데 .. ㅠㅜ</p>
<p>아빠는 왜 울고 싶을까</p>
<h2 id="이쁨" style="position:relative;"><a href="#%EC%9D%B4%EC%81%A8" aria-label="이쁨 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>이쁨</h2>
<p>잘 크고 있어. 너무 이쁘게. 그래서 고맙다.</p>
<p><div class="gatsby-resp-iframe-wrapper" style="padding-bottom: 56.42857142857143%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem" > <div class="embedVideo-container"> <iframe src="https://www.youtube.com/embed/fcHfzN9XBHk?rel=0" class="embedVideo-iframe" style="border:0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; " allowfullscreen></iframe> </div> </div></p></content:encoded></item><item><title><![CDATA[가족을 갖는 것]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/having-a-family/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/having-a-family/</guid><pubDate>Fri, 11 Sep 2020 16:11:47 GMT</pubDate><content:encoded><p>그리운 시간들이 있다. 그 중 가장 그리운 시간은 연애하던 때인 것 같다. 두꺼운 옷을 걸쳐입고 춥지만 여기저기 돌아다니기도 하고, 땀을 뻘뻘 흘리면서 시원한 곳을 찾아 다니기도 했다.</p>
<p>요즘 우리의 삶은 그저 아가 돌보기 밖에 없다. 둘과 셋은 천지차이다. 어쩌면 셋이 아니기 때문이겠지. 이 아이는 0.1 정도니까. 그럼 2.1인일까 우린..</p>
<p>아직 기지도 못하는 아이와 함께 있으면 늘 아이에게 신경을 두게 된다. 잠을 자도 잘 자지 못하는 어린 애기이기에, 잘 잘 수 있을까 하는 염려를 갖게 된다.</p>
<p>그러다가 와이프가 친정에 갔다. 오랜만에 집에 혼자 남아 있으니 뭔가 허전하다. 아기는 같이 있으면 힘들지만 떨어져 있으면 보고 싶다. 그래서 참 웃긴다.</p>
<p>혼자 남은 나는 게임을 하고 있다. Tell me why라는 작품인데 풍경이 예쁘다. 가족에 대한 스토리라서 나도 내 가족을 생각하게 됐다.</p>
<p>인생의 많은 것이 바껴버린 나와 내 아내. 특히 아내의 삶은 어쩌면 정말로 사라졌는지도 모르겠다는 생각이 들었다. 이제는 정말 그저 한 아이의 엄마가 되어버린 걸까?</p>
<p>그건 어쩔 수 없는 듯 한 편으로는 잔인하기도 하고, 한 편으로는 정말 행복한 일이다.</p>
<p>앞으로는 또 어떨까? 어떤 기분일까. 어떤 느낌일까. 지금 이 때를 또 그리워하겠지? 아닐까?</p>
<p>행복이란 내일도 오늘 같았으면 하는 거라는데, 나도 그렇다. 그럼에도 나는, 내 아내는 행복하다.</p></content:encoded></item><item><title><![CDATA[연서가 처음으로 뒤집었다.]]></title><description><![CDATA[늦었다. 쓴다 쓴다 해놓고 좀 지났다. 한 일주일 됐는지도 모른다. 아무튼 연서가 처음으로 뒤집는 걸 본 순간 연서가 정말 자랑스러웠다. 한참을 뒤집으려고 시도하더니 결국엔 뒤집었다. 그리고 그것과 함께 죽음의…]]></description><link>https://ohseunghyeon.github.io/lavender/first-time-she-flipped/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/first-time-she-flipped/</guid><pubDate>Wed, 26 Aug 2020 06:54:39 GMT</pubDate><content:encoded><p>늦었다. 쓴다 쓴다 해놓고 좀 지났다. 한 일주일 됐는지도 모른다.</p>
<p>아무튼 연서가 처음으로 뒤집는 걸 본 순간 연서가 정말 자랑스러웠다.</p>
<p>한참을 뒤집으려고 시도하더니 결국엔 뒤집었다.</p>
<p>그리고 그것과 함께 죽음의 4개월차 원더윅스가 끝났다.</p>
<p>원더윅스 이전에 그나마 잘 잤는데, 최근 원더윅스와 함께 새벽엔 항상 3시간 마다 깼다.</p>
<p>그리고 뒤집기를 성공한 날부터 갑자기 5~6시간을 잘 수 있게 됐다. 아직 좀 잠 패턴이 엉망인 것 같지만..</p>
<p>와이프가 수면교육도 동반하면서 아기가 누워서 스스로 잠도 들 수 있게 됐고, 스스로 잠에 대한 조절을 할 수 있는 것 같다.</p>
<p>아기가 발전한다는 게 참.. 신기하다.</p>
<p>지금은 다시 원래대로 뒤집는 것과 기어가기를 시도한다. 그러다가 앉고, 서겠지? 정말 귀여울 것 같아서 기대된다.</p></content:encoded></item><item><title><![CDATA[나와 함께하는 이]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/whom-i-will-walk-by-forever/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/whom-i-will-walk-by-forever/</guid><pubDate>Fri, 14 Aug 2020 15:11:38 GMT</pubDate><content:encoded><p>최근에 [님아 그 강을 건너지 마요]에 나온 노부부 중 할머니의 근황이 어떠한지 알아보는 유튜브 영상을 봤다. 두 분은 정말 서로를 많이 아끼고 사랑하는 부부였다. 그런데 할아버지가 나이가 들어서 돌아가셨고, 할머니는 혼자 살고 계신다. 마을회관에서 다른 할머니들과 고스톱도 치시고, 잘 계신 것 같다.</p>
<p>할머니에게 할아버지 안 보고 싶으시고 여쭤본다. 할머니는 할아버지가 항상 보고 싶으시단다. 그 말 한 마디에 가슴이 참 먹먹했다. 나도 내 아내가 늘 보고 싶은데. 옆에 있어도 보고 싶고, 없으면 너무 보고 싶은데, 평생 함께한 사람이 간다면, 그 사람을 보고 싶은 마음은 어찌할 수 있을까. 그저 울 수 밖에. 할머니는 밤에 깨시면 옆에 할아버지가 있을 것만 같은데, 없어서, 베개가 다 젖을만큼 한참을 운다고 하신다. 그 마음이.. 이해가 갔다. 나도 그럴 것만 같아서.</p>
<p>아마 아무리 사랑해주고 아껴주어도 나중에 후회할 것만 같다. 더 사랑해줄 것을, 더 이해해줄 것을.</p></content:encoded></item><item><title><![CDATA[16주차 원더윅스]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/wonder-weeks/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/wonder-weeks/</guid><pubDate>Thu, 30 Jul 2020 14:05:01 GMT</pubDate><content:encoded><h2 id="발단" style="position:relative;"><a href="#%EB%B0%9C%EB%8B%A8" aria-label="발단 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>발단</h2>
<p>요즘 들어 이 아이의 잠투정이 심해졌다. 애기 엄마는 매우 힘들어하고 있다. 스트레스로 인해 정줄이 날아가는 모습이 보일 정도. 도대체 왜 이 아이는 이렇게 뒤척이고 잠들지 못 해 찡찡대는 것인가?</p>
<h2 id="원더윅스" style="position:relative;"><a href="#%EC%9B%90%EB%8D%94%EC%9C%85%EC%8A%A4" aria-label="원더윅스 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>원더윅스</h2>
<p>그래. 이게 원더윅스일까? 아니.. 아무리 그래도 그렇지. 너는 어느 정도 잘 자던 아이었다. 그런데 갑자기 이렇게 변하다니? 낮잠도 재우기 힘들어, 밤잠은 재워놓으면 금방 금방 꿈틀대다가 깨기 십상이야. 죽어가는 건 애기 엄빠다.</p>
<h2 id="스와들업" style="position:relative;"><a href="#%EC%8A%A4%EC%99%80%EB%93%A4%EC%97%85" aria-label="스와들업 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>스와들업</h2>
<p>최근에는 스와들업을 입히지 않았다. 답답해 하는 모습이 심했기 때문이다. 그러나 오늘 스와들업을 입혀보니 계속 꿈틀대면서도 잘 자는 모습이 보인다. 역시 꿈틀대는 걸 어느정도 잡아주는 게 잠을 유지하는 데 도움이 되는 걸까? 내일도 입혀봐야겠다. 낮잠 잘 때도 입혀야지.</p></content:encoded></item><item><title><![CDATA[life, marriage, baby]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/life,-marriage,-baby/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/life,-marriage,-baby/</guid><pubDate>Fri, 24 Jul 2020 16:09:29 GMT</pubDate><content:encoded><p>사람들은 그것의 나쁜 점을 안다. 아니, 사실은 모른다. 들었을 뿐이다. 그리고 그것을 안다고 생각한다. 그렇게 막연한 두려움으로 그것을 바라본다. 그것은 뭘까? 내게는 입대가 그러했다. 사람들은 군대에 가는 것을 정말 끔찍한 일인 것처럼 말한다. 애초에 약 2년의 시간을 버린다는 건 작지 않은 공포로 다가오는 법이다. 군에 있던 시간은 실제로 좋은 시간이 아니었다. 내가 그 시간동안 얻은 건 약간의 영어실력일 뿐, 다른 부분에 있어서는 힘들고 안타까운 시간이었다. 어쩔 수 없는 것이, 그런 환경이 만들어지는 곳이기 때문이다. 결혼과 아이는 어떨까? 결혼은 하고 싶어 하는 것 같기도 하다. 그러나 아이는 아닌 것 같다. 아이를 갖는 것에 대해 부정적인 얘기를 많이 들었다. 커리어가 가장 큰 이유인 것 같다. 그리고 집, 돈, 시간, 젊음등 포기할 것이 많다. 그렇지만 지금 결혼을 하고 아이를 가진 입장에서 그건 포기가 아니다. 나는 이로 인해 더 큰 것을 얻었다고 생각한다. 내 삶이 조금 더 나아졌다고 생각한다. 어릴적엔 이런 삶이 평범한 삶일 거라고 생각했는데, 지금와서 보니 결코 평범하지가 않다. 나도 상황이 되었기 때문에 간신히 이뤄낸 것 같다. 이건 행운일까? 나는 그렇게 생각한다. 그렇다면 다른 이들은 불행했을까? 글쎄, 한 편으로는 그들이 노력하지 않았다고 생각한다. 그러나 그건 오만이겠지? 삶은 어떤 걸까. 한 치 앞도 내다볼 수 없다. 분명 선택할 수 있는 것 같지만 그게 선택일까? 결혼과 아이를 갖는 건 선택일까? 나는 좋은 선택을 했다. 행복해지는 선택. 불행한 사람들을 보며 속으로 욕한다. 그러게 좋은 선택을 했어야지. 멍청하게. 정말 그들이 멍청한 걸까? 글쎄.. 나는 아직도 오만한 것 같다.</p></content:encoded></item><item><title><![CDATA[너와 함께한 100일]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/100-days-with-you/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/100-days-with-you/</guid><pubDate>Tue, 21 Jul 2020 09:27:02 GMT</pubDate><content:encoded><h2 id="너가-할-수-있게-된-것" style="position:relative;"><a href="#%EB%84%88%EA%B0%80-%ED%95%A0-%EC%88%98-%EC%9E%88%EA%B2%8C-%EB%90%9C-%EA%B2%83" aria-label="너가 할 수 있게 된 것 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>너가 할 수 있게 된 것</h2>
<ol>
<li>머리는 언제나 들었지만, 조금 더 수월해졌다. 엎드린 상태에서 한참동안 고개를 들고 있을 수 있게 되었다.</li>
<li>토를 좀 덜 하게 되었다. 소화기관이 훨씬 좋아진 것 같다. 트림도 매우 수월해졌다. 그 덕에 잠도 더 잘 잘 수 있게 되었다.</li>
<li>잠을 더 잘 자게 되었다. 수면 교육의 효과일까? 아니면 그냥 너가 성장해서일까? 잠 드는 과정에 익숙해졌는지 잘 자게 되었다. 특히 엄마가 종종 너를 안고서 자야했는데, 등을 대고 잘 자게 되어서 다행이야. 엄마가 조금 덜 고생해도 되잖아.</li>
</ol>
<h2 id="왜-아직도" style="position:relative;"><a href="#%EC%99%9C-%EC%95%84%EC%A7%81%EB%8F%84" aria-label="왜 아직도 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>왜 아직도?</h2>
<p>너는 밤에 깨는 걸까? 아니, 정확히 말하자면 생각보다 일찍 깨곤 한다. 소리 때문일까? 통잠을 더 잘 자줬으면 좋겠어!</p>
<h2 id="100일-축하해" style="position:relative;"><a href="#100%EC%9D%BC-%EC%B6%95%ED%95%98%ED%95%B4" aria-label="100일 축하해 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>100일 축하해</h2>
<p>널 괴롭히는 게 너무 즐거워. 울 때 나도 옆에서 같이 우는 척 하고.
볼을 부비고, 네 팔을 가지고 놀고. 너를 아바타처럼 조종할 때! 너무 즐거워.</p>
<p>고마워 딸</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 66.87116564417178%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGpDGjGYS//xAAbEAEAAgIDAAAAAAAAAAAAAAABAAIDERIhIv/aAAgBAQABBQJ3Dy3pjuq74DLdP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AUf/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGK/8QAGRAAAQUAAAAAAAAAAAAAAAAAAAIRICFh/9oACAEBAAY/AsLHVD//xAAZEAADAQEBAAAAAAAAAAAAAAAAATERIUH/2gAIAQEAAT8hXwxSzpfzlGs7wXSxuGaf/9oADAMBAAIAAwAAABDjL//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QTmkH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERMf/aAAgBAgEBPxB1hR//xAAbEAEBAAIDAQAAAAAAAAAAAAABEQAhMUFhcf/aAAgBAQABPxB7AERyXkOxzM0cjsM1jiQOg5w5pUUez5lWHpLn/9k='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="lavender"
title="lavender"
src="/static/9ec720539ba828d6c0ef31204c04800e/6aca1/lavender.jpg"
srcset="/static/9ec720539ba828d6c0ef31204c04800e/d2f63/lavender.jpg 163w,
/static/9ec720539ba828d6c0ef31204c04800e/c989d/lavender.jpg 325w,
/static/9ec720539ba828d6c0ef31204c04800e/6aca1/lavender.jpg 650w,
/static/9ec720539ba828d6c0ef31204c04800e/7c09c/lavender.jpg 975w,
/static/9ec720539ba828d6c0ef31204c04800e/01ab0/lavender.jpg 1300w,
/static/9ec720539ba828d6c0ef31204c04800e/3acf0/lavender.jpg 2000w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p></content:encoded></item><item><title><![CDATA[Json gzip stream을 unzip하여 리턴하기]]></title><description><![CDATA[아마존 S3에서 gzip을 받을 일이 있어서 이를 unzip해서 리턴하는 함수를 작성했다.
언젠가 참고할 일이 있을까 하여 적어둠]]></description><link>https://ohseunghyeon.github.io/study/function-that-gunzips-stream-and-returns/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/study/function-that-gunzips-stream-and-returns/</guid><pubDate>Tue, 07 Jul 2020 05:08:45 GMT</pubDate><content:encoded><p>아마존 S3에서 gzip을 받을 일이 있어서 이를 unzip해서 리턴하는 함수를 작성했다.
언젠가 참고할 일이 있을까 하여 적어둠</p>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">const</span> gzipStream <span class="token operator">=</span> <span class="token keyword">await</span> axios<span class="token punctuation">.</span>default<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
url<span class="token operator">:</span> error<span class="token punctuation">.</span>response<span class="token punctuation">.</span>headers<span class="token punctuation">.</span>location<span class="token punctuation">,</span>
responseType<span class="token operator">:</span> <span class="token string">'stream'</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span>data<span class="token punctuation">;</span>
<span class="token keyword">const</span> jsonData <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">transformGzipStreamIntoJson</span><span class="token punctuation">(</span>gzipstream<span class="token punctuation">)</span></code></pre></div>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">const</span> zlib <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'zlib'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> stream <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'stream'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token punctuation">{</span> Writable <span class="token punctuation">}</span> <span class="token operator">=</span> stream<span class="token punctuation">;</span>
<span class="token keyword">const</span> pipeline <span class="token operator">=</span> util<span class="token punctuation">.</span><span class="token function">promisify</span><span class="token punctuation">(</span>stream<span class="token punctuation">.</span>pipeline<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">transformGzipStreamIntoJson</span><span class="token punctuation">(</span><span class="token parameter">gzipStream</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> jsonStrArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">await</span> <span class="token function">pipeline</span><span class="token punctuation">(</span>
gzipStream<span class="token punctuation">,</span>
zlib<span class="token punctuation">.</span><span class="token function">createGunzip</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">Writable</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
<span class="token function">write</span><span class="token punctuation">(</span><span class="token parameter">chunk<span class="token punctuation">,</span> encoding<span class="token punctuation">,</span> callback</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
jsonStrArr<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>chunk<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">callback</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>jsonStrArr<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div></content:encoded></item><item><title><![CDATA[50일을 함께 보내며]]></title><description><![CDATA[벌써 50일이 지났다. 아니, 어쩌면 아직도 5…]]></description><link>https://ohseunghyeon.github.io/lavender/50-days-with-lavender/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/50-days-with-lavender/</guid><pubDate>Mon, 01 Jun 2020 08:35:13 GMT</pubDate><content:encoded><p>벌써 50일이 지났다. 아니, 어쩌면 아직도 50일 정도 밖에 안 됐느냐? 일지도 모르겠다. 육아는 그만큼 고달픈 것 같다. 아이는 아무것도 할 줄 모르고, 아기의 울음이 무엇을 의미하는지 파악하는 건 여전히 어렵다.</p>
<p>무엇이 원인인지 파악하는 프로세스는 갖춰졌다. 그러나 그 프로세스조차 시간이 걸린다. 즉, 한 눈에 이 아이가 어떤 상태인지는 아직 모르겠다.</p>
<h2 id="배가-고픈-상태" style="position:relative;"><a href="#%EB%B0%B0%EA%B0%80-%EA%B3%A0%ED%94%88-%EC%83%81%ED%83%9C" aria-label="배가 고픈 상태 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>배가 고픈 상태</h2>
<p>대체로 배가 고프다. 라벤더는 기저귀에는 민감하지 않다. 쉬를 어느 정도 해도 딱히 울지 않는다. 응가를 조금 해도 그러려니 하는 것 같다. 다만 밥을 미친듯이 찾는다. 요즘엔 응애 응애 운다. 말 그대로 소리가 ‘응애’ 인데, 이건 배가 고프다는 뜻이다. 밥을 잘 먹으면 좀 잤으면 좋겠는데, 그것도 아니다. 잘 깨어 있다. 조금 자는 듯 싶더니 일어나서 논다. 아니, 운다.</p>
<h2 id="트림---그게-관건이다" style="position:relative;"><a href="#%ED%8A%B8%EB%A6%BC---%EA%B7%B8%EA%B2%8C-%EA%B4%80%EA%B1%B4%EC%9D%B4%EB%8B%A4" aria-label="트림 그게 관건이다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>트림 - 그게 관건이다</h2>
<p>트림을 잘 시키는 것이 가장 중요한 일임을 알게 되었다. 밥을 먹이는 과정부터 잘 챙겨줘야 트림도 수월하게 할 수 있다. 처음엔 다량의 분유를 한 번에 먹였다. 그랬더니 트림을 조금 하더라도 계속 속이 불편해 보였다. 약 30ml 정도를 먹이면 그 때는 잠시 젖병을 빼고 트림을 시켜줘야 한다. 목을 가누지 못하던 어릴 때는 어깨에 올렸는데, 마지막으로 잰 몸무게로 5.5kg이 넘어서 다리에 올려놓고 트림을 시키고 있다. 트림을 시키는 방법은 처음엔 쓰다듬는 것으로 했으나, 요즘엔 톡톡톡톡 두드려 준다. 이게 잘 통하는 것 같다. 조금 빠른 비트로 등을 타격해한다…</p>
<h2 id="응가---카레" style="position:relative;"><a href="#%EC%9D%91%EA%B0%80---%EC%B9%B4%EB%A0%88" aria-label="응가 카레 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>응가 - 카레?</h2>
<p>응가를 가끔 엄청난 양으로 하곤 한다. 이유는 밝혀지지 않았다. 그러나 이따금 기저귀가 넘칠 정도로 하곤 하는데, 이 떄는 옷에도 카레가 조금 묻는다. 그럼 정말.. 나도 모르게 소스라치며 으악 하고 소리를 지른다. 정말.. 대단하고 끔찍하다.</p>
<h2 id="둘째" style="position:relative;"><a href="#%EB%91%98%EC%A7%B8" aria-label="둘째 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>둘째?</h2>
<p>이 아이를 보고 있으면, 너무 귀엽다는 생각 밖에 안 든다. 너무 귀엽다. 정말. 너무. 그래서 상상을 해봤다. 둘째는 또 어떨까? 상상만 해도 귀여웠다. 그래서 와이프에게 말했다. 둘째도 정말 귀여울 것 같다고. 그랬더니 나한테 젖을 먹일 거냐고 하는 와이프. 그래. 내가 먹일 건 아니지. 너의 판단에 맡기겠다.</p></content:encoded></item><item><title><![CDATA[미소 에어컨 청소 후기]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/miso-air-conditioner-cleaning-service/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/miso-air-conditioner-cleaning-service/</guid><pubDate>Fri, 22 May 2020 11:11:53 GMT</pubDate><content:encoded><h2 id="에어컨-냄새가-나" style="position:relative;"><a href="#%EC%97%90%EC%96%B4%EC%BB%A8-%EB%83%84%EC%83%88%EA%B0%80-%EB%82%98" aria-label="에어컨 냄새가 나 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>에어컨 냄새가 나</h2>
<p>여름이 됐다. 덥다. 에어컨을 틀어보니 곰팽이 냄시가 난다.</p>
<p>집에는 아가가 생겼다. 아, 청소를 하고 싶다. 쾌적한 에어컨 바람을 원한다. 냉방 도중에 잠시 송풍 때 나는 냄새가 싫다!</p>
<p>그래. 청소를 해야지. 근데 직접 하기는 싫다. 언제 저걸 뜯고 앉았나.</p>
<p>미소가 그냥 생각났다. 앱을 키고 에어컨 청소를 신청했다.</p>
<p>신청이 너무 많아서 내가 예약한 시간이 불가능하다고 전화가 왔다. 시간을 미뤄주면 5천원을 할인해준다고 한다.</p>
<p>그래봤자 7만원.</p>
<p>좋다.</p>
<h2 id="에어컨-청소해주실-분이-왔어" style="position:relative;"><a href="#%EC%97%90%EC%96%B4%EC%BB%A8-%EC%B2%AD%EC%86%8C%ED%95%B4%EC%A3%BC%EC%8B%A4-%EB%B6%84%EC%9D%B4-%EC%99%94%EC%96%B4" aria-label="에어컨 청소해주실 분이 왔어 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>에어컨 청소해주실 분이 왔어!</h2>
<p>기사님이 오셨다. 청소를 좀 해주셨다. 마치고 에어컨을 틀었다. 냄새가 조금 난다.</p>
<p>말씀드렸다. 송풍 좀 하면 안 날 거라고 하신다. 애기가 있어서 약은 안 쓰셨다고 한다.</p>
<p>뭐 있으면 전화달라고 하신다 (연락처를 알아야지…)</p>
<p>그런데 냄새가 계속 안 사라진다. 곰팡이 냄새 여전하시다.</p>
<p>어떡하지. 계속 틀어보면 괜찮지 않을까 생각하고 계속 틀었다. 근데 여전하다.</p>
<p>집 안에 퍼지는 꾸리꾸리한 냄시.</p>
<p>미소에 다시 채팅으로 문의했다. 청소를 받았었는데, 냄새가 난다고.</p>
<p>AS 접수를 해주신단다. 청소해주셨던 기사분이 전화를 걸어서 스케쥴을 다시 잡아주신단다.</p>
<p>전화가 왔다. 냄새가 난다 말씀드렸더니, 안에 스펀지에서 나는 냄새라서 어떻게 할 수 없다고 하신다.</p>
<h2 id="그럼-뭘-청소한-거야" style="position:relative;"><a href="#%EA%B7%B8%EB%9F%BC-%EB%AD%98-%EC%B2%AD%EC%86%8C%ED%95%9C-%EA%B1%B0%EC%95%BC" aria-label="그럼 뭘 청소한 거야 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>그럼 뭘 청소한 거야?</h2>
<p>나는 곰팡이 냄새가 나서 그 냄새를 없애려고 청소를 부른 건데.. 냄새가 나면 이건 서비스에 문제가 있는 게 아닌가?</p>
<p>어이가 없다.</p>
<p>AS는 전화 한 통으로 끝났다. 응. 냄새가 나고, 나도 어쩔 수 없다.</p>
<p>그럼 뭐지? 내가 돈 내고 서비스를 제대로 제공받지 못했으면, 환불을 받는 게 맞지 않나?</p>
<p>환불도 안 돼, AS도 안 돼. 서비스가 왜 이 모양이지?</p>
<p>난 뭘 위해서 돈을 낸 건데?</p>
<p>아니, 너넨 무슨 배짱으로 서비스하는 건데?</p>
<p>미소 진짜 짜증난다.</p></content:encoded></item><item><title><![CDATA[목욕을 하다가 울었다.]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/cried-while-having-a-bath/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/cried-while-having-a-bath/</guid><pubDate>Thu, 07 May 2020 14:55:16 GMT</pubDate><content:encoded><p>연서가 태어난지 벌써 한 달 정도가 되었다.</p>
<p>어쩜 이렇게 시간이 빠를까?</p>
<p>처음엔 트림을 시켜주는 것도 제대로 못 했지만 이제는 익숙해졌다.</p>
<p>하지만 아직 익숙하지 않은 게 있는데, 바로 거꾸로 드는 것.</p>
<p>애의 가슴 쪽을 손으로 받치고 등을 씻겨주려고 했다.</p>
<p>그런데 내가 충분히 높게 들지 않았는지, 얘가 물을 마시고 말았다.</p>
<p>(더러워. 자기가 씻던 물을… 물론 먹인 건 나지만)</p>
<p>무튼, 급 얼굴이 빨갛게 변하며 울기 시작했다.</p>
<p>무슨 태어난 직후의 모습을 보는 듯 했다. 아마 비슷한 경험이었겠지? ^^;</p>
<p>가 아니라.. 미안하다 ;</p>
<p>다음엔 목욕 잘 시켜줄게.</p></content:encoded></item><item><title><![CDATA[nodejs googleapis에서 service account로 auth 하기]]></title><description><![CDATA[서비스 어카운트 json 파일 사용하여 인증하기 서비스 어카운트 정보를 사용하여 인증하기 Oauth2 token으로 인증하기]]></description><link>https://ohseunghyeon.github.io/study/nodejs-googleapis-auth-with-service-account/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/study/nodejs-googleapis-auth-with-service-account/</guid><pubDate>Thu, 23 Apr 2020 03:55:37 GMT</pubDate><content:encoded><h2 id="서비스-어카운트-json-파일-사용하여-인증하기" style="position:relative;"><a href="#%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%96%B4%EC%B9%B4%EC%9A%B4%ED%8A%B8-json-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0" aria-label="서비스 어카운트 json 파일 사용하여 인증하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>서비스 어카운트 json 파일 사용하여 인증하기</h2>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">const</span> <span class="token punctuation">{</span> google <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'googleapis'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> credentials <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'json-file-that-you-downloaded-on-google-console.json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> jwt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>auth<span class="token punctuation">.</span>JWT</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
scopes<span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token string">'https://www.googleapis.com/auth/analytics'</span><span class="token punctuation">,</span>
<span class="token string">'https://www.googleapis.com/auth/analytics.manage.users'</span><span class="token punctuation">,</span>
<span class="token string">'https://www.googleapis.com/auth/analytics.edit'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
jwt<span class="token punctuation">.</span><span class="token function">fromJSON</span><span class="token punctuation">(</span>credentials<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// you can also set auth here</span>
<span class="token keyword">const</span> analytics <span class="token operator">=</span> <span class="token keyword">await</span> google<span class="token punctuation">.</span><span class="token function">analytics</span><span class="token punctuation">(</span><span class="token punctuation">{</span> version<span class="token operator">:</span> <span class="token string">'v3'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> list <span class="token operator">=</span> <span class="token keyword">await</span> analytics<span class="token punctuation">.</span>management<span class="token punctuation">.</span>accounts<span class="token punctuation">.</span><span class="token function">list</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
auth<span class="token operator">:</span> jwt<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<h2 id="서비스-어카운트-정보를-사용하여-인증하기" style="position:relative;"><a href="#%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%96%B4%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0" aria-label="서비스 어카운트 정보를 사용하여 인증하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>서비스 어카운트 정보를 사용하여 인증하기</h2>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">const</span> <span class="token punctuation">{</span> google <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'googleapis'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> credentials <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'json-file-that-you-downloaded-on-google-console.json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> jwt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>auth<span class="token punctuation">.</span>JWT</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
email<span class="token operator">:</span> credentials<span class="token punctuation">.</span>client_email<span class="token punctuation">,</span>
key<span class="token operator">:</span> credentials<span class="token punctuation">.</span>private_key<span class="token punctuation">,</span>
scopes<span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token string">'https://www.googleapis.com/auth/analytics'</span><span class="token punctuation">,</span>
<span class="token string">'https://www.googleapis.com/auth/analytics.manage.users'</span><span class="token punctuation">,</span>
<span class="token string">'https://www.googleapis.com/auth/analytics.edit'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
jwt<span class="token punctuation">.</span><span class="token function">fromJSON</span><span class="token punctuation">(</span>credentials<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// you can also set auth here</span>
<span class="token keyword">const</span> analytics <span class="token operator">=</span> <span class="token keyword">await</span> google<span class="token punctuation">.</span><span class="token function">analytics</span><span class="token punctuation">(</span><span class="token punctuation">{</span> version<span class="token operator">:</span> <span class="token string">'v3'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> list <span class="token operator">=</span> <span class="token keyword">await</span> analytics<span class="token punctuation">.</span>management<span class="token punctuation">.</span>accounts<span class="token punctuation">.</span><span class="token function">list</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
auth<span class="token operator">:</span> jwt<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<h2 id="oauth2-token으로-인증하기" style="position:relative;"><a href="#oauth2-token%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0" aria-label="oauth2 token으로 인증하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Oauth2 token으로 인증하기</h2>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">const</span> <span class="token punctuation">{</span> google <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'googleapis'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> oauth2Client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>auth<span class="token punctuation">.</span>OAuth2</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
clientId<span class="token operator">:</span> <span class="token string">'client-id'</span><span class="token punctuation">,</span>
clientSecret<span class="token operator">:</span> <span class="token string">'client-secret'</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
oauth2Client<span class="token punctuation">.</span><span class="token function">setCredentials</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
access_token<span class="token operator">:</span> <span class="token string">'access_token'</span> <span class="token comment">// optional</span>
refresh_token<span class="token operator">:</span> <span class="token string">'refresh_token'</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// This function will refresh accessToken. you can use this when you didn't put</span>
<span class="token comment">// access_token for setCredentials method</span>
<span class="token comment">// await oauth2Client.getAccessToken()</span>
<span class="token keyword">const</span> analytics <span class="token operator">=</span> <span class="token keyword">await</span> google<span class="token punctuation">.</span><span class="token function">analytics</span><span class="token punctuation">(</span><span class="token punctuation">{</span> version<span class="token operator">:</span> <span class="token string">'v3'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> list <span class="token operator">=</span> <span class="token keyword">await</span> analytics<span class="token punctuation">.</span>management<span class="token punctuation">.</span>accounts<span class="token punctuation">.</span><span class="token function">list</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
auth<span class="token operator">:</span> oauth2Client<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div></content:encoded></item><item><title><![CDATA[38 weeks]]></title><description><![CDATA[뱃 속에서 엄마를 열심히 때리는 라벤더 갈비뼈를 종종 찬다. 누워서 쉬다가 애기가 차면 악! 소리를 지르는 와이프. 흥미롭다. 의사 선생님 말로는 곧 나올 거라는데, 이번주에도 나오지 않으면 유도분만을 하자고 하신다. 곧 너를 보게 된다니 정말 궁금해]]></description><link>https://ohseunghyeon.github.io/lavender/38-weeks/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/38-weeks/</guid><pubDate>Mon, 06 Apr 2020 01:30:31 GMT</pubDate><content:encoded><p>뱃 속에서 엄마를 열심히 때리는 라벤더</p>
<p>갈비뼈를 종종 찬다.</p>
<p>누워서 쉬다가 애기가 차면 악! 소리를 지르는 와이프.</p>
<p>흥미롭다.</p>
<p>의사 선생님 말로는 곧 나올 거라는데, 이번주에도 나오지 않으면 유도분만을 하자고 하신다.</p>
<p>곧 너를 보게 된다니 정말 궁금해</p></content:encoded></item><item><title><![CDATA[와이프가 자기 손을 찔렀다.]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/wife-cut-her-fingers-by-herself/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/wife-cut-her-fingers-by-herself/</guid><pubDate>Fri, 06 Mar 2020 04:36:41 GMT</pubDate><content:encoded><p>내 와이프는 마조가 아니다. 하지만 스스로 손을 베였다. 손을 베기 위해 사용한 도구는 과도. 생각보다 많이 베였다. 그래서 피도 조금 철철 났다. 도대체 왜 자신의 손을 벤 걸까?</p>
<p>내 와이프는 요리를 하고 있었다. 최근 코로나 바이러스의 창궐로 재택근무를 조금씩 하고 있다. 와이프의 경우는 회사 차원에서 아예 재택근무를 장려하고 있기에 집에 종일 있고, 나 같은 경우엔 일주일에 몇 번 재택근무를 캘린더에 등록하여 하고 있다.</p>
<p>집에서 같이 일을 하고 있었고, 점심 즈음이 되어서 아내가 요리를 하기 시작했다. 나는 와이프가 무얼 하려는 건지 잠시 구경한 후, 라벤더의 침대에 있는 귀여운 양 인형(사실은 가방)을 가지고 놀고(?) 있었다.</p>
<p>갑자기 들려오는 비명. 나는 와이프가 요리를 하다가 뭔가 잘못 했나? 라고 생각했다. 그런데 손을 베였단다. 조금 깊게 베인 상처라 피부가 조금 들려있는 게 보였다. 그런데 상처가 조금 이상하게 나 있다.</p>
<p>어떻게 다친 건가하고 보니 얼어 있는 간마늘통과 그 통의 옆을 통과한 과도가 보인다. 그렇구나.. 얼어 있는 간마늘을 과도로 퍼내려고 한 것이다. 그러다가 미끄러졌으니 힘도 어지간히 주고 있었을 터, 그대로 손을 찔러버린 것이다.</p>
<p>속으로 많은 생각이 지나갔다. 어떻게 그런 생각을 했을까? 상처는 어떤 수준인 거지? 집에서 치료할 수 있을까? 와이프는 병원에 가야겠다고 말한다. 하긴, 이건 살짝 찔리고 베인 정도가 아니다. 피가 조금 많이 난다.</p>
<p>그대로 병원을 검색해 집 주변의 정형외과로 갔다. 손을 지혈하면서 가는데 와이프가 여전히 놀란 상태인지 횡설수설한다. 엄마가 보고 싶단다.</p>
<p>병원에 도착해 진료를 봤는데 의사 선생님이 손을 6땀인가 5땀 정도 꼬매야 한다고 했단다. 그런데 와이프가 임신중이라 항생제도 안 쓰고, 마취도 쓰기 좀 그래서 맨 정신에 해야한다고 하니 와이프는 무서워서 꼬매지 않기로 했단다.</p>
<p>내일 다시 돌아와서 감염이 있는지 보자고 했다는데, 괜찮겠지? 마늘을 찌르던 과도이니.. 마늘이 균을 죽여줬을 것이다. (?)</p>
<p>아무튼, 집에 와서 아내는 엄마한테 전화를 걸고 울기 시작한다. 어지간히도 놀랐나 보다. 사실 나였다면 이보다는 많이 무덤덤했을 것 같은데. 지금은 또 드레싱한 손으로 일을 하고 있는 내 와이프.</p>
<p>그저 그런 위험한 행동만 안 했으면 지금 멀쩡히 키보드를 치고 있을 텐데, 안타깝다.</p></content:encoded></item><item><title><![CDATA[22 weeks]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/lavender/22-weeks/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/lavender/22-weeks/</guid><pubDate>Tue, 17 Dec 2019 01:03:17 GMT</pubDate><content:encoded><p>라벤더는 아직 아내의 뱃속에 있는 아가의 태명이다.</p>
<p>뱃속의 아가가 생기고 아내의 배가 조금씩 불러오더니 이제는 임산부구나 싶을 정도로 배가 나왔다.</p>
<p>어젯밤엔 라벤더가 발차기를 하니까 배에 그 부분이 조금 올라오는 것도 보였다.</p>
<p>라벤더는 상당히 활발하고 강하다. 발차기를 정말 많이 한다.</p>
<p>그래서 나는 노래를 불러준다. 열심히 찰 수 있도록.</p>
<p>나중에 나왔는데 정말 강한 아이면 어떡하지. 조금 걱정되기도 한다.</p>
<p>하지만 나도 같이 울고 웃으면서 아가랑 동화될 생각이다.</p>
<p>그래서 누가 더 강한지 겨뤄봐야지</p></content:encoded></item><item><title><![CDATA[가족]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/family/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/family/</guid><pubDate>Wed, 20 Nov 2019 10:14:11 GMT</pubDate><content:encoded><p>퇴근하고 집에 왔다.</p>
<p>현관문 앞에 서니 집에 불이 켜져 있다. 아내는 운동하러 간다고 했다. 그럼 불은 켜놓고 간 게다.</p>
<p>문득 집에 누군가 있을 거라는 기대, 그 감정에 대해 생각했다. 이 집에 나의 아내가 있고, 나중에 아이가 생길 것이다. 그럼 이 집은 그저 집이 아니라, 우리집인 거겠지. 예전엔 내가 머무는 곳에 크게 의미가 있다고 생각한 적이 없다. 그런데 지금은 알지 못할 무언가가 느껴진다.</p>
<p>‘어쩌면 이 집에 오는 게 더욱 행복한 일이 되지 않을까?’</p>
<p>그 생각과 동시에 아빠 생각이 났다. 아빠도 그랬을까? 내가 아기일 때부터 커가면서 아빠는 일하고 집에 돌아왔겠지. 그 때 아빠의 기분은 어땠을까?</p>
<p>아마도, 낮에 일을 하느라 정말 힘들었어도, 집에 오는 건 큰 기쁨이 아니었을까? 아빠는 항상 퇴근하고 집에 돌아오면 아들들과 포옹을 했다. 아빠에겐 그게 행복이었을 것이다.</p>
<p>그리고 나도 그럴 것이다. 집에 돌아와 아내와 포옹한다. 나중에 아이가 생기면 아이에게 인사할 것이다. 아빠가 왔다고. 그리고 아이가 커가면 아이와도 포옹할 것이다. 그러면 정말 기쁘겠지?</p>
<p>아직 아이가 나오지도 않았고 그게 어떤 기분인지 직접적으로 느끼지 못했지만, 가족이 생긴다는 건 진심으로 행복한 일인 것 같다. 그게 얼마나 행복한 일인지 모르는 사람이 조금 불쌍하게 느껴질 정도로.</p>
<p>내가 나의 아내를 만난 게 정말 큰 행운이고, 앞으로 태어날 아이들을 만나는 일 또한 큰 행운일 것이다.</p></content:encoded></item><item><title><![CDATA[Summary about Bing Ads API]]></title><description><![CDATA[Bing Ads는 옛날 명칭이며 지금은 Microsoft Advertising 이다. Bing Ads…]]></description><link>https://ohseunghyeon.github.io/study/summary-about-bing-ads-api/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/study/summary-about-bing-ads-api/</guid><pubDate>Thu, 14 Nov 2019 01:04:08 GMT</pubDate><content:encoded><p>Bing Ads는 옛날 명칭이며 지금은 Microsoft Advertising 이다.</p>
<h2 id="bing-ads-개괄" style="position:relative;"><a href="#bing-ads-%EA%B0%9C%EA%B4%84" aria-label="bing ads 개괄 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Bing Ads 개괄</h2>
<h3 id="어떻게-동작하는가" style="position:relative;"><a href="#%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B0%80" aria-label="어떻게 동작하는가 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>어떻게 동작하는가</h3>
<ol>
<li>유저가 어떤 키워드로 검색</li>
<li>해당 키워드가 광고와 매치되면, 광고가 검색 결과의 상단 혹은 옆에 나타남</li>
<li>유저가 광고를 클릭하여 전화를 걸거나, 웹사이트에 방문하거나, 매장으로 찾아감</li>
</ol>
<h3 id="ms-advertising이-광고될-수-있는-범위" style="position:relative;"><a href="#ms-advertising%EC%9D%B4-%EA%B4%91%EA%B3%A0%EB%90%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B2%94%EC%9C%84" aria-label="ms advertising이 광고될 수 있는 범위 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>MS Advertising이 광고될 수 있는 범위</h3>
<ul>
<li>빙은 미국에서 데스크탑 검색의 36.2퍼센트를 차지한다.</li>
<li>매달 전 세계에서 112억 건의 검색이 발생 (데스크탑 기준).</li>
<li>구글이 도달하지 못하는 494억의 검색에 도달할 수 있다.</li>
<li>Microsoft Search Network에서만 가능한 검색 중 27퍼센트에서 광고 클릭이 발생</li>
<li>미국에서는 1억 1600만 명이 Microsoft Search Network만 사용한다. (데스크탑)</li>
</ul>
<h3 id="microsoft-search-network란" style="position:relative;"><a href="#microsoft-search-network%EB%9E%80" aria-label="microsoft search network란 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Microsoft Search Network란</h3>
<p>빙, 파트너 사이트, 윈도우 10, 코타나, 오피스, 써드파티 플랫폼, 파트너쉽 등을 아우르는 말</p>
<h3 id="광고가-나타나는-곳은" style="position:relative;"><a href="#%EA%B4%91%EA%B3%A0%EA%B0%80-%EB%82%98%ED%83%80%EB%82%98%EB%8A%94-%EA%B3%B3%EC%9D%80" aria-label="광고가 나타나는 곳은 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>광고가 나타나는 곳은?</h3>
<p>빙, 야후, MSN 검색 결과</p>
<h3 id="광고가-나타나는-위치는-어떻게-정해질까" style="position:relative;"><a href="#%EA%B4%91%EA%B3%A0%EA%B0%80-%EB%82%98%ED%83%80%EB%82%98%EB%8A%94-%EC%9C%84%EC%B9%98%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A0%95%ED%95%B4%EC%A7%88%EA%B9%8C" aria-label="광고가 나타나는 위치는 어떻게 정해질까 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>광고가 나타나는 위치는 어떻게 정해질까?</h3>
<p>Microsoft Advertising은 pay-per-click(PPC) 광고 시스템을 가지고 있다. 기본적으로 bidding(입찰) 방식으로 광고의 위치가 결정된다. 즉, ‘신발’이라는 키워드에 광고를 달고 싶을 경우 이 키워드로 광고를 하는 다른 광고자가 입찰한 금액과 내 입찰 금액이 비교되어 위치가 결정된다.</p>
<p>다음은 광고의 위치가 결정되는 매커니즘이다.</p>
<ol>
<li>검색 키워드가 당신의 광고와 얼마나 관련성이 있는지</li>
<li>당신의 입찰가가 다른 입찰가와 비교하여 어떤지 (많은지를 얘기하는 것 같다. 그러나 사이트에 많을 수록 좋은 위치에 나온다는 얘기는 없다.)</li>
<li>당신의 광고가 과거에 얼마나 영향력이 있었는지, 얼마나 많이 클릭되었는지</li>
</ol>
<p>광고가 이 매커니즘을 잘 만족할수록 상위 위치에 광고가 된다.</p>
<h3 id="microsoft-advertising으로-더-많은-사람-끌어모으기" style="position:relative;"><a href="#microsoft-advertising%EC%9C%BC%EB%A1%9C-%EB%8D%94-%EB%A7%8E%EC%9D%80-%EC%82%AC%EB%9E%8C-%EB%81%8C%EC%96%B4%EB%AA%A8%EC%9C%BC%EA%B8%B0" aria-label="microsoft advertising으로 더 많은 사람 끌어모으기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Microsoft Advertising으로 더 많은 사람 끌어모으기</h3>
<ul>
<li>예산과 입찰가를 전략적으로 살펴라. 만약 광고가 계속 정지된다면, 예산 한도가 너무 낮게 설정된 것이다. 경쟁적인 입찰가가 광고를 좋은 위치에 머물게 하고, 이에 사람들이 더 많이 보고, 클릭한다.</li>
<li>장소나, 기기(컴퓨터, 모바일, 태블릿)의 타겟을 확장해라.</li>
<li>네 광고와 웹사이트가 입찰하려는 키워드와 관련이 있는지 확인해라.</li>
</ul>
<p><a href="https://ads.microsoft.com/?signout=true&#x26;ccuisrc=4" target="_blank" rel="nofollow noopener noreferrer">출처</a></p>
<h2 id="overview" style="position:relative;"><a href="#overview" aria-label="overview permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Overview</h2>
<h3 id="bing-ads-api를-누가-써야할까" style="position:relative;"><a href="#bing-ads-api%EB%A5%BC-%EB%88%84%EA%B0%80-%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C" aria-label="bing ads api를 누가 써야할까 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Bing Ads API를 누가 써야할까</h3>
<ul>
<li>당신이 광고 매니저인데, 당신의 내부 재고 관리나 전환 추적 시스템과 결합하고 싶어서</li>
<li>광고 관리 솔루션을 개발하고 싶어서</li>
<li>광고 에이전시인데, 여러 광고주를 위해 광고 캠패인을 관리하고 싶어서</li>
</ul>
<h3 id="광고가-어디에-나올까" style="position:relative;"><a href="#%EA%B4%91%EA%B3%A0%EA%B0%80-%EC%96%B4%EB%94%94%EC%97%90-%EB%82%98%EC%98%AC%EA%B9%8C" aria-label="광고가 어디에 나올까 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>광고가 어디에 나올까</h3>
<p>빙, AOL, 야후나 야후의 검색엔진을 사용하는 사이트의 검색 결과 페이지. 광고의 키워드와 검색 키워드에 따라서 나옴.</p>
<h3 id="광고를-풍성하게-하는-법" style="position:relative;"><a href="#%EA%B4%91%EA%B3%A0%EB%A5%BC-%ED%92%8D%EC%84%B1%ED%95%98%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B2%95" aria-label="광고를 풍성하게 하는 법 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>광고를 풍성하게 하는 법</h3>
<p><a href="https://docs.microsoft.com/en-us/advertising/guides/ad-extensions?view=bingads-13" target="_blank" rel="nofollow noopener noreferrer">Ad Extensions</a>를 사용해라. Ad Extensions는 전화, 이미지, 장소, 가격, 리뷰 등 다양하다.</p>
<p>Microsoft Shopping Campaigns도 있다. 이는 Microsoft Merchant Center Store에 너의 상품을 등록할 수 있게 해준다. Microsoft Shopping Campaigns의 product ads는 상품에 대한 디테일, 이미지, 선택적인 홍보성 문구를 포함할 수 있다. product catalog를 만들 후에, 이를 Microsoft Advertising Content API나 FTP로 제출할 수 있다. For more Information, please see <a href="https://docs.microsoft.com/en-us/advertising/guides/product-ads?view=bingads-13" target="_blank" rel="nofollow noopener noreferrer">Product Ads</a></p>
<h3 id="타겟이-되는-사람에게-광고를-보여주기" style="position:relative;"><a href="#%ED%83%80%EA%B2%9F%EC%9D%B4-%EB%90%98%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%97%90%EA%B2%8C-%EA%B4%91%EA%B3%A0%EB%A5%BC-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0" aria-label="타겟이 되는 사람에게 광고를 보여주기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>타겟이 되는 사람에게 광고를 보여주기</h3>
<p>데스크탑과 모바일 중 어떤 것에 치중해서 보여줄지, 어떤 반경으로 장소를 설정해 보여줄지, 나이, 성별, 특정 날짜 또는 주에 보여줄지 설정할 수 있다.</p>
<h3 id="캠패인-최적화하기" style="position:relative;"><a href="#%EC%BA%A0%ED%8C%A8%EC%9D%B8-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0" aria-label="캠패인 최적화하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>캠패인 최적화하기</h3>
<p>Bing Ads API <a href="https://docs.microsoft.com/en-us/advertising/ad-insight-service/ad-insight-service-reference?view=bingads-13" target="_blank" rel="nofollow noopener noreferrer">Ad Insight</a> 서비스는 historical performance, 웹 페이지 데이터, 인구학적 데이터를 제공하고, 입찰가를 추천해준다.</p>
<h2 id="frequently-asked-questions" style="position:relative;"><a href="#frequently-asked-questions" aria-label="frequently asked questions permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Frequently Asked Questions</h2>
<h3 id="get-started" style="position:relative;"><a href="#get-started" aria-label="get started permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Get Started</h3>
<p>Q. Bing Ads API 쓰려면 뭐가 필요하죠?</p>
<p>Microsoft Advertising 계정을 생성하고, 당신의 developer token을 Developer Portal의 Account Tab에서 획득하세요.</p>
<p>Q. SDK가 지원되는 언어는?</p>
<p>.NET, Java, PHP, Python</p>
<p>다른 언어는 지원할 계획 없다.</p>
<p>Q. API version은 뭘 써야하죠?</p>
<p>늘 최신 버전을 쓰세요.</p>
<h3 id="feature-availability" style="position:relative;"><a href="#feature-availability" aria-label="feature availability permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Feature Availability</h3>
<p>Q. Bulk나 Campaign Management API 중 뭐를 써야 하나요?</p>
<p>Bulk가 추천됨. 여러 개의 Ads를 생성하거나 업데이트할 때 좋다. Bulk에 없는 API는 Campaign Management API를 써라.</p>
<p>Q. 어떤 API performance reports가 가능하고, 언제 내 데이터를 볼 수 있나요?</p>
<p>모두 가능해요.</p>
<p>데이터는 유저가 광고를 클릭하고 최대 2시간(컨버전은 3시간) 걸리고 reporting이 가능해져요.</p>
<h3 id="oauth" style="position:relative;"><a href="#oauth" aria-label="oauth permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>OAuth</h3>
<p>Q. 사용자의 인터렉션이 없는 애플리케이션을 운영하고 싶은데요. Microsoft Advertising credentials를 사용하기 위한 허가를 얻는 절차 없이 어떻게 인증할 수 있죠?</p>
<p>그렇게 하기 위해서는 최소한 한 번은 웹 앱을 통해서 동의를 얻는 절차를 거쳐야 합니다. 반복되거나 장기적인 인증을 위해서는 <a href="https://docs.microsoft.com/en-us/advertising/guides/authentication-oauth" target="_blank" rel="nofollow noopener noreferrer">authorization code grant flow</a>를 따라 access token과 refresh token을 얻으세요. 그리고 가장 최신의 refresh token으로 새로운 access token과 refresh token을 얻을 수 있습니다. 만약 Microsoft Account의 주인이 계정 복구, 비밀번호 변경 또는 앱의 권한 삭제를 실시한 경우 다시 요청해야 합니다.</p>
<h2 id="파이썬으로-bing-ads-api-사용하기" style="position:relative;"><a href="#%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-bing-ads-api-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0" aria-label="파이썬으로 bing ads api 사용하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>파이썬으로 Bing Ads API 사용하기</h2>
<p>Bing Ads API의 인증은 <a href="https://tools.ietf.org/html/rfc6749" target="_blank" rel="nofollow noopener noreferrer">OAuth 2.0</a> 방식으로 이뤄진다. 즉, Microsoft의 계정을 사용하여 Asure에서 생성한 App에게 제한된 권한을 준다. 그럼 앱이 권한을 받았다는 뜻으로 refresh token이 생성된다. 이 refresh token을 잃어버리면 권한을 잃어버린 것과 같다.</p>
<p>파이썬 SDK의 code example에서는 자동으로 해당 토큰을 파일로 저장한다. 그럼 이 토큰을 바탕으로 SDK의 각종 서비스를 생성하여 사용하면 된다. 나의 경우 account, campaign, ad group, ads를 생성, 수정, 삭제하기 위해 SDK를 사용하였으며, 대부분의 유스케이스가 비슷할 것이다.</p>
<p>… 계속</p>
<!-- 아래는 각
### Authentication
```python
```
### Account
### Campaign
### Ad group
### Budget and Bid Strategies
Ads가 돌아가게 하기 위해서는 Campaign에 예산이 필요하다. 또한 입찰 전략(Bid Strategies)을 설정해야 하고, 선택적으로 keyword에도 설정할 수 있다.
#### Budget Types
예산(Budget)은 campaign에 사용할 돈을 말한다. 캠패인에 daily budget을 설정할 수 있는데, 예산에 도달하면 해당 월의 마지막 날까지 광고가 일시적으로 중지된다. 예산은 목표치다. 실제로 사용되는 광고비는 예산보다 높거나 낮을 수 있고, 이는 다양한 변수에 의해 발생할 수 있다.
shared budget은 동일한 어카운트 내에서 캠페인마다 daily budget을 설정할 수 있게 해준다.
### Report
#### ReportAggregation
- Summary:
- Hourly: 0 - 23로 hour가 표현되며, 오후 1시 ~ 오후 2시 사이에 발생한 이벤트의 경우 MM/DD/YYYY 12:00:00 AM|13로 통합되어 하나의 row로 표시. 여러 날짜를 보는 거라면, 각 날짜의 각 시가 하나의 row로 표시된다.
- Daily: 각 날짜로 데이터가 통합
- Weekly: 각 주를 하나의 row로 통합
- Monthly: 각 달을 하나의 row로 통합
- Yearly: 각 년도를 하나의 row로 통합
- HourOfDay: 0 - 23으로 hour를 표현, Hourly와 달리 여러 날짜에 대한 특정 시간대가 한 줄로 표현된다.
- DayOfWeek: 일요일은 1, 토요일은 7로 해당 기간 동안 특정 요일을 모두 합산하여 보여준다. 특정 기간 동안 일요일이 3 번 있었을 경우 이 3번의 일요일을 하나의 row로 합산하여 표시.
- WeeklyStartingMonday: Weekly와 동일하지만 시작 날짜가 월요일이고 끝 날짜가 일요일이다.
--></content:encoded></item><item><title><![CDATA[고집, 아집]]></title><description><![CDATA[1…]]></description><link>https://ohseunghyeon.github.io/essay/stubborn/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/stubborn/</guid><pubDate>Thu, 31 Oct 2019 03:53:14 GMT</pubDate><content:encoded><h2 id="10" style="position:relative;"><a href="#10" aria-label="10 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>10</h2>
<p>어릴 적에 줄곧 생각하던 게 있다.</p>
<p><em>결코 아집에 빠지지 말자. 그런 어른이 되지 말자.</em></p>
<p>어른들을 보며 그런 생각을 했다. 왜 계속 해온 방식을 유지하려고 할까. 더 효율적인 방법도 있는데. 나는 효율을 중요시했고, 관례를 무시했다. 그런 건 필요 없다고 생각하면서.</p>
<p>그런 관례를 유지하는 걸 아집이라 여겼다. 동시에, 나는 그런 관례를 다 깨부수고 아집이 없는 사람이 되어야지 생각했다.</p>
<p>하지만 그걸 유지하는 게 아집일까?</p>
<p>아직은 모르겠다. 나는 여전히 효율적인 게 좋다.</p>
<h2 id="20" style="position:relative;"><a href="#20" aria-label="20 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>20</h2>
<p>20대를 겪으며 생각이 조금 바뀌었다.</p>
<p><em>나이가 들면 옳다고 여기는 게 생길 수 밖에 없다.</em></p>
<p><strong>나</strong>라는 정체성에 대해 자주 고민한다. 어떤 사람이 되고 싶은 걸까?</p>
<p>이런 시간이 쌓인 나이기에, 나에게 나는 소중하다.</p>
<p>그리고 결국엔 나를 지키기 위해 내가 아닌 걸 배척하게 된다. 이는 자연스러운 일이겠지. 괜찮아.</p>
<h2 id="30" style="position:relative;"><a href="#30" aria-label="30 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>30</h2>
<p>요즘들어 드는 생각은, 내가 아집덩어리라는 거다.</p>
<p>취사선택을 자연스러운 것이었다. 지금의 나는 내가 생각하는 기준들로 가득한 사람이 되었다.</p>
<p>하나하나 좋은 기준들로 가득 채우면 그게 아집이 아닐 거라고 생각했다. 그 기준도 내 기준이고, 채워진 것도 내 기준인데 말이다.</p>
<p>내가 세운 아집은, 내가 하는 게 아집이 아닐 거라는 아집이었다.</p>
<p>나는 결국 아집들과 싸우는 아집이었나 보다.</p>
<p>아이러니하다.</p>
<h2 id="내로남불" style="position:relative;"><a href="#%EB%82%B4%EB%A1%9C%EB%82%A8%EB%B6%88" aria-label="내로남불 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>내로남불</h2>
<p>남이 하면 아집, 내가 하면 고집일까</p>
<p>글쎄.</p>
<p>아집과 고집은 말장난일지도 모른다.</p>
<p>어차피 모든 사람은 각자의 아집을 갖고 살아간다.</p>
<p>웃기다.</p>
<p>아집을 싫어했는데, 내가 아집덩어리임을 알고서는, 아집을 보편화하다니.</p>
<p>그래. 저런 추상적인 단어에 얽매이지 않게 된 거겠지.</p>
<p>내겐 여전히 내가 옳다고 여기는 것들이 많다.</p>
<p>그냥 다들 스스로 옳다고 여기는 것들이 있을 뿐이다.</p>
<h2 id="태도" style="position:relative;"><a href="#%ED%83%9C%EB%8F%84" aria-label="태도 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>태도</h2>
<p>아집의 문제점은 이를 얼마나 표출하느냐에 달린 것 같다.</p>
<p>받아들이지 못하는 아집</p>
<p>듣지 않는 아집</p>
<p>무시하는 아집</p>
<p>이 모든 게 싫다.</p>
<p>나는 나와 달라도 듣는다.</p>
<p>받아들인다.</p>
<p>무시하지 않는다.</p>
<h2 id="거짓말" style="position:relative;"><a href="#%EA%B1%B0%EC%A7%93%EB%A7%90" aria-label="거짓말 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>거짓말</h2>
<p>그래. 거짓말이다.</p>
<p>나는 받아들이지 않는다.</p>
<p>그러는 척 할 뿐이다.</p>
<p>나는 받아들일 수 없다.</p>
<p>틀린 건 틀린 거다.</p></content:encoded></item><item><title><![CDATA[[번역] Caching in react]]></title><description><![CDATA[원글: Caching in React Cashing 캐싱은 서버의 성능 향상을 위한 강력한 도구이다. 나는 edge caching, in-memory caching 그리고 persisted caching(Redis와 같이 NoSQL DB…]]></description><link>https://ohseunghyeon.github.io/study/caching-in-react/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/study/caching-in-react/</guid><pubDate>Mon, 28 Oct 2019 05:24:01 GMT</pubDate><content:encoded><p>원글: <a href="https://freecontent.manning.com/caching-in-react/" target="_blank" rel="nofollow noopener noreferrer">Caching in React</a></p>
<h2 id="cashing" style="position:relative;"><a href="#cashing" aria-label="cashing permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Cashing</h2>
<p>캐싱은 서버의 성능 향상을 위한 강력한 도구이다. 나는 edge caching, in-memory caching 그리고 persisted caching(Redis와 같이 NoSQL DB에 저장) 등 여러 형태의 캐싱을 사용해왔다. 각각의 전략은 tradeoffs가 있으니 이런 점들을 잘 이해하고 당신의 유즈케이스에 맞는 전략을 선택해야 한다.</p>
<table>
<thead>
<tr>
<th></th>
<th>SEO</th>
<th>User Sessions</th>
</tr>
</thead>
<tbody>
<tr>
<td>In memory</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>Persisted storage</td>
<td>√</td>
<td>(higher overhead, but possible)</td>
</tr>
<tr>
<td>Edge caching</td>
<td>√</td>
<td></td>
</tr>
</tbody>
</table>
<center>Table 1 Comparing caching options.</center>
<h2 id="cashing-on-the-server-in-memory-caching" style="position:relative;"><a href="#cashing-on-the-server-in-memory-caching" aria-label="cashing on the server in memory caching permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Cashing on the server: In-memory caching</h2>
<p>가장 쉬운(가장 naive 한) 방법은 메모리에 직접 컴포넌츠를 저장하는 것이다. 간단한 앱의 경우 기본적인 LRU 캐싱(size-limitied)과 렌더링된 컴포넌츠를 직렬화하는 방법으로 구현할 수 있다. Figure 1은 in-memory 캐시를 사용하는 타임라인을 나타낸다. 첫 번째 유저는 완전히 렌더된 페이지(조금 더 느린)를 얻는다. 그리고 이 페이지는 in-memory 캐시에 저장된다. 그 이후의 유저들은 캐시된 페이지를 얻는다.(캐시가 가득차서 해당 페이지가 캐시에서 밀려나기 전까지)</p>
<p><img src="https://freecontent.manning.com/wp-content/uploads/Gordon_CiR_01.png" alt="Figure 1 In-memory caching allows some requests to benefit from faster response times."></p>
<p><em><center>Figure 1 In-memory 캐싱은 어떤 요청이 더 빠른 응답 속도를 갖게 한다</center></em></p>
<p>Listing 1은 간단한 캐싱 모듈을 구현하고 있다.</p>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="gatsby-highlight-code-line">Listing <span class="token number">1</span><span class="token operator">:</span> Add an <span class="token constant">LRU</span> <span class="token keyword">in</span> memory cache – src<span class="token operator">/</span>shared<span class="token operator">/</span>cache<span class="token punctuation">.</span>es6</span>
<span class="token keyword">import</span> lru <span class="token keyword">from</span> <span class="token string">'lru-cache'</span><span class="token punctuation">;</span> ❶
<span class="token comment">// maxAge is in ms</span>
<span class="token keyword">const</span> cache <span class="token operator">=</span> <span class="token function">lru</span><span class="token punctuation">(</span><span class="token punctuation">{</span> ❷
maxAge<span class="token operator">:</span> <span class="token number">300000</span><span class="token punctuation">,</span> ❸
max<span class="token operator">:</span> <span class="token number">500000000000</span><span class="token punctuation">,</span> ❹
<span class="token function-variable function">length</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">n</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> ❺
<span class="token comment">// n = item passed in to be saved (value)</span>
<span class="token keyword">return</span> n<span class="token punctuation">.</span>length <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">set</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">key<span class="token punctuation">,</span> value</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> ❻
cache<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">get</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">key</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> ❼
<span class="token keyword">return</span> cache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
get<span class="token punctuation">,</span>
set
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>
<ol>
<li>LRU 캐시를 Import</li>
<li>LRU 캐시 생성</li>
<li>maxAge는 시간에 기반하여 캐시에 저장된 값의 만기를 설정한다.</li>
<li>max는 캐시에 저장된 모든 아이템의 총 길이이다.</li>
<li>length는 각 아이템이 가질 수 있는 최대 길이이다.</li>
<li>cache에 키/밸류를 set할 수 있는 public set 메서드이다.</li>
<li>cache로부터 키에 기반하여 값을 가져올 수 있는 public get 메서드이다.</li>
</ol>
<p>Listing 2는 캐싱 모듈을 renderView.jsx에서 사용한 모습이다. 캐싱 로직이나 스티리밍 로직 중 하나를 사용할 것을 권장하며, 둘을 동시에 사용하지는 마라. 캐시와 스트림을 원한다면, 이 글에 나온 것과는 다른 스트리밍 구현이 필요할 것이다.</p>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="gatsby-highlight-code-line">Listing <span class="token number">2</span><span class="token operator">:</span> Save and fetch cached pages – src<span class="token operator">/</span>middleware<span class="token operator">/</span>renderView<span class="token punctuation">.</span>jsx</span>
<span class="token keyword">const</span> cachedPage <span class="token operator">=</span> cache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span> ❶
<span class="token keyword">if</span> <span class="token punctuation">(</span>cachedPage<span class="token punctuation">)</span> <span class="token punctuation">{</span> ❷
<span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>cachedPage<span class="token punctuation">)</span><span class="token punctuation">;</span> ❷
<span class="token punctuation">}</span>
<span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token function">initRedux</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//...more code</span>
Promise<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span>promises<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token comment">//...more code</span>
cache<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>url<span class="token punctuation">,</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">&lt;!DOCTYPE html></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>html<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> ❸
<span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">&lt;!DOCTYPE html></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>html<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div>
<ol>
<li>캐시로부터 값을 가져올 수 있나 보자.</li>
<li>값이 있다면 이를 응답으로 사용하자.</li>
<li>만약 렌더링이 필요하다면, 렌더링의 결과를 응답하기 전에 캐시에 저장하자.</li>
</ol>
<p>이 방법은 작동한다. 그러나 몇가지 문제가 있다.</p>
<ol>
<li>이 방법은 너무 간단하다. 만약 유즈케이스가 더 복잡해지거나, 사용자들을 더하기 시작하거나(역자: 이해 못함), 여러 언어를 지원해야 하거나, 엄청나게 많은 페이지가 있다면 어떻게 될까? 이 방법은 그런 유즈케이스를 잘 감당할만큼 확장될 수 없다.</li>
<li>메모리에 쓰는 것은 Node.js에서 동기적인 작업이다. 즉 캐시를 사용함으로써 성능을 최적화하려 하는데, 하나의 문제점을 해결하는 동시에 다른 문제를 갖게 된다는 것이다.</li>
<li>마지막으로 서버가 분산화된 스케일링 전략을 갖고 있다면, 캐시는 각각의 서버나 컨테이너(도커를 쓴다면)에만 적용되고 이는 공통의 캐시를 공유할 수 없다는 뜻이다.</li>
</ol>
<p>다음으로 레디스를 사용하여 캐싱하는 방법을 살펴볼 것이다. 이는 비동기적이고 논블로킹인 캐싱을 하게 해준다. 우리는 그리고 더욱 똑똑한 캐싱의 구현을 살펴볼 것인데, 각각의 컴포넌츠를 캐싱하여 더 복잡한 어플리케이션을 위한 스케일링에 용이한 방법이다.</p>
<h2 id="caching-on-the-server-persisted-storage" style="position:relative;"><a href="#caching-on-the-server-persisted-storage" aria-label="caching on the server persisted storage permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Caching on the server: Persisted Storage</h2>
<p>내가 첫 번째로 작업했던 isomorphic 리액트 앱은 리덕스나 리액트 라우터가(community best-choice libraries) 안정화되기 전에 작성됐다. 그래서 우리는 많은 코드들을 home-roll하기로 결심했다.(역자: home-roll 이해 못함) 이런 결심과 서버상에서 느린 리액트로 인해, 우리는 서버 렌더를 더 빠르게 할 솔루션이 필요했다.</p>
<p>우리는 레디스에 스트링 저장소를 구현하여 모든 페이지 스트링으로 저장할 수 있게 했다. 레디스에 모든 페이지를 저장하는 건 더 큰 사이트에 대해서 중요한 트레이드오프를 가지고 있다. 우리는 수백만의 다른 진입점들을 레디스에 저장할 수 있었고, 모두 스트링화 된 HTML 페이지들은 상당히 빠른 속도로 추가되어 공간을 꽤나 차지했다.</p>
<p>고맙게도, 커뮤니티가 이보다 향상된 방법을 생각해냈다. Walmart Labs는 <a href="https://github.com/electrode-io/electrode-react-ssr-caching" target="_blank" rel="nofollow noopener noreferrer">electrode-react-ssr-caching</a>라는 서버 사이드 렌더링의 캐싱을 사용하기 쉬운 라이브러리를 내놓았다. 이 라이브러리는 두 가지 이유로 인해 강력하다.</p>
<ol>
<li>이 라이브러리는 profiler를 갖고 있어서 서버상에서 어떤 컴포넌트가 가장 비싼지 알려줌으로써, 당신이 필요로하는 컴포넌츠만 캐시할 수 있게 해준다.</li>
<li>이 라이브러리는 렌더링 된 컴포넌츠를 캐시하기 위해서 컴포넌츠를 템플릿화 하여 이후에 props를 넣을 수 있게 해준다.</li>
</ol>
<p>우리는 장기적인 측면을 봤을 때, 페이지들의 숫자와 이 페이지들이 100% public-facing content라는 점으로 인해서, edge 캐싱 전략으로 옮겨가게 되었다. 당신의 유즈케이스는 Walmart Labs의 접근법에서 이점을 찾을 수도 있다.</p>
<h2 id="cdnedge-strategies" style="position:relative;"><a href="#cdnedge-strategies" aria-label="cdnedge strategies permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>CDN/Edge strategies</h2>
<p>Edge caching은 우리가 현재 직장에서 isomorphic 리액트 앱을 위해 사용하는 방법이다. 이는 (CMS 도구에서와 같이, 시스템 상에서 어떤 시점에 변화가 생길 때) 필요에 따라 컨텐츠가 만기되게 만드는 방법이 필요하기 때문이다. Fastly와 같은 현대의 CDN들은 이런 능력을 바로 사용할 수 있게끔 제공하며 이는 TTL(time to live)를 더 쉽게 관리할 수 있고 웹 페이지가 만기되게(expire) 해준다. Figure 2는 이런 작동 방식을 설명한다.</p>
<p><img src="https://freecontent.manning.com/wp-content/uploads/Gordon_CiR_02.png" alt="Figure 2 Adding an edge server moves the caching in front of the server.">
<em><center>Figure 2 edge server는 캐싱이 서버의 앞단에 위치하게 한다.</center></em></p>
<p>이걸 구현하는 방법은 이 글의 범위를 벗어난다. 만약에 당신이 SEO(ecommerce, video sites, blogs, etc)가 필요한 public-facing content를 가지고 있다면, 당연히 CDN을 기술 스택에 넣고 싶어할 것이다.</p>
<p>이 방법에 대해 하나 경고할 게 있다면, 유저의 세션 관리를 복잡하게 만든다는 점이다. 다음 섹션은 유저 세션에 대해 살펴보고 다양한 캐싱 전략들이 가진 트레이드오프들을 다룰 것이다.</p>
<h2 id="user-session-management" style="position:relative;"><a href="#user-session-management" aria-label="user session management permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>User Session Management</h2>
<p>최근의 웹 어플리케이션들은 거의 다 브라우저에서 쿠키를 사용한다. 심지어 당신의 메인 프로덕트가 쿠키를 직접적으로 사용하는 게 아니더라도 당신이 사이트 상에서 사용하는 광고, 트래킹, 다른 써드파티 도구가 쿠키의 이점을 얻고 있을 것이다. 쿠키는 웹앱에게 같은 사람이 매번 오는 것을 알게 해준다. Figure 3은 이를 설명한다.</p>
<p><img src="https://freecontent.manning.com/wp-content/uploads/Gordon_CiR_03.png" alt="Figure 3 Repeat visits by the same user on the server. Saving cookies lets you store information about the user that can be retrieved during future sessions."></p>
<p><em><center>Figure 3 서버에 한 유저가 반복적으로 방문. 쿠키를 저장하여 그 유저에 대한 정보를 저장하여 미래에 이를 참조할 수 있다.</center></em></p>
<p>Listing 3은 브라우저와 서버 양측의 쿠키를 파싱하는 모듈의 예이다. universal cookie를 사용하여 두 환경(client and server)에서의 쿠키 관리를 용이하게 한다.</p>
<div class="gatsby-highlight" data-language="bash"><pre class="language-bash"><code class="language-bash">$ <span class="token function">npm</span> <span class="token function">install</span> --save universal-cookie</code></pre></div>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="gatsby-highlight-code-line">Listing <span class="token number">3</span> Using Isomorphic Cookie Module – src<span class="token operator">/</span>shared<span class="token operator">/</span>cookies<span class="token punctuation">.</span>es6</span>
<span class="token keyword">import</span> Cookie <span class="token keyword">from</span> <span class="token string">'universal-cookie'</span><span class="token punctuation">;</span> ❶
<span class="token keyword">const</span> <span class="token function-variable function">initCookie</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">reqHeaders</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">let</span> cookies<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">BROWSER</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ❷
cookies <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Cookie</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>reqHeaders<span class="token punctuation">.</span>cookie<span class="token punctuation">)</span> <span class="token punctuation">{</span>
cookies <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Cookie</span><span class="token punctuation">(</span>reqHeaders<span class="token punctuation">.</span>cookie<span class="token punctuation">)</span><span class="token punctuation">;</span> ❸
<span class="token punctuation">}</span>
<span class="token keyword">return</span> cookies<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">get</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">name<span class="token punctuation">,</span> reqHeaders <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> cookies <span class="token operator">=</span> <span class="token function">initCookie</span><span class="token punctuation">(</span>reqHeaders<span class="token punctuation">)</span><span class="token punctuation">;</span> ❹
<span class="token keyword">if</span> <span class="token punctuation">(</span>cookies<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> cookies<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> ❺
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">set</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">name<span class="token punctuation">,</span> value<span class="token punctuation">,</span> opts<span class="token punctuation">,</span> reqHeaders <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> cookies <span class="token operator">=</span> <span class="token function">initCookie</span><span class="token punctuation">(</span>reqHeaders<span class="token punctuation">)</span><span class="token punctuation">;</span> ❹
<span class="token keyword">if</span> <span class="token punctuation">(</span>cookies<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> cookies<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> value<span class="token punctuation">,</span> opts<span class="token punctuation">)</span><span class="token punctuation">;</span> ❻
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
get<span class="token punctuation">,</span>
set
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>
<ol>
<li>universal cookie library를 임포트하여, 클라이언트와 서버에서 쿠키를 다루는 법의 차이를 쟤가 알아서 하게 하자.</li>
<li>reqHeaders가 필요한지 결정하기 위해 환경을 체크하자.</li>
<li>헤더에 쿠키가 있으면, 쿠키 생성자로 넘기자.</li>
<li>게터와 세터 함수에서, 쿠키 오브젝트를 init하며 reqHeaders를 넘겨서 서버상에서 이게 작동하는지 확인하자.</li>
<li>찾은 쿠키를 반환.</li>
<li>쿠키 세팅의 결과를 반환. name과 value에 추가로 standard cookie options를 넘길 수 있다. 대부분의 경우 브라우저에서 set을 호출할 것이다.</li>
</ol>
<p>이제 쿠키를 두 환경에서 get, set할 방법을 추가했다. 이제 당신의 앱에서 이에 지속적으로 접근하기 위해서 app state 상에 이 정보를 저장할 필요가 있다.</p>
<h2 id="accessing-cookies-universally" style="position:relative;"><a href="#accessing-cookies-universally" aria-label="accessing cookies universally permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Accessing cookies universally</h2>
<p>action으로 쿠키를 가지고 오게 하여, 당신의 앱이 쿠키과 상호 작용하게 있게끔 할 수 있다. Listing 4는 user id를 저장하고 가져오기 위핸 storeUserId action을 추가하는 방법을 보여준다.</p>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="gatsby-highlight-code-line">Listing <span class="token number">4</span><span class="token operator">:</span> accessing cookies on the server – src<span class="token operator">/</span>shared<span class="token operator">/</span>app<span class="token operator">-</span>action<span class="token operator">-</span>creators<span class="token punctuation">.</span>es6</span>
<span class="token keyword">import</span> UAParser <span class="token keyword">from</span> <span class="token string">'ua-parser-js'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> cookies <span class="token keyword">from</span> <span class="token string">'./cookies.es6'</span><span class="token punctuation">;</span> ❶
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token constant">PARSE_USER_AGENT</span> <span class="token operator">=</span> <span class="token string">'PARSE_USER_AGENT'</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token constant">STORE_USER_ID</span> <span class="token operator">=</span> <span class="token string">'STORE_USER_ID'</span><span class="token punctuation">;</span> ❷
<span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">parseUserAgent</span><span class="token punctuation">(</span><span class="token parameter">requestHeaders</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">storeUserId</span><span class="token punctuation">(</span><span class="token parameter">requestHeaders</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ❸
<span class="token keyword">const</span> userId <span class="token operator">=</span> cookies<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'userId'</span><span class="token punctuation">,</span> requestHeaders<span class="token punctuation">)</span><span class="token punctuation">;</span> ❹
<span class="token keyword">return</span> <span class="token punctuation">{</span>
userId<span class="token punctuation">,</span> ❺
type<span class="token operator">:</span> <span class="token constant">STORE_USER_ID</span> ❷
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
parseUserAgent<span class="token punctuation">,</span>
storeUserId
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>
<ol>
<li>쿠키 모듈을 임포트한다.</li>
<li>새로운 액션을 위한 타입을 추가한다.</li>
<li>requestHeaders를 받아서 서버에서 작동하는지 확인하는 액션을 추가한다.</li>
<li>쿠키 이름과 requestHeaders를 쿠키 모듈에 넘긴다.</li>
<li>액션에 userId 값을 넣는다.</li>
</ol>
<p>이제 당신의 어플리케이션에서 userId에 접근할 수 있다. 이는 서버상에서 불러와지고 브라우저에서 필요에 따라 업데이트 될 수 있다. 당신은 이런 컨셉을 어떤 유저 세션 정보에든지 적용할 수 있다. 그러나, 모든 유저 세션을 관리하는 건 이 글의 범위를 벗어난다.</p>
<h2 id="edge-caching--users" style="position:relative;"><a href="#edge-caching--users" aria-label="edge caching users permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Edge caching + Users</h2>
<p>내가 처음 isomorphic 어플리케이션을 만들기 시작했을 때, 유저 관리는 간단해보였다. single-page-application처럼 브라우저상에서 쿠키를 사용해 유저 세션을 추적하는 것이다. 서버를 포함하는 건 이를 복잡하게 만들지만, 쿠키를 서버에서 읽을 수 있다. 당신이 캐싱 전략을 사용함으로써 이것은 좀 덜 straightforward해질 수 있다.</p>
<p>in-memory와 persisted storage 캐싱 전략은 둘 다 유저 세션에 대해 잘 작동한다. 매 유저 요청이 여전히 서버로 가서 유저의 정보가 수집되기 때문이다. 당신은 유저를 식별하는 정보를 캐시의 키로 사용할 수 있다.</p>
<p>불행히도, edge caching은 잘 작동하지 않는다. 왜냐면, 각각의 유저들에 대해 당신은 각 유저의 데이터를 담은 유니크한 페이지 사본을 유지해야 하기 때문이다. 만약 그렇지 않으면 유저 2에게 유저 1의 정보를 보여주게 될 수도 있다. 그건 나쁠 것이다. Figure 4는 이런 컨셉에 대해 설명한다.</p>
<p><img src="https://freecontent.manning.com/wp-content/uploads/Gordon_CiR_04.png" alt="Figure 4 When the edge has to cache pages per user, the benefit of overlapping requests is lost.">
<em><center>edge가 각 유저의 페이지를 캐시해야 한다면, 같은 페이지라도 다른 페이지이기 때문에 이점을 상실하게 된다.</center></em></p>
<p>만약 edge caching이 필요하다면, 당신은 유저의 데이터를 가지고 다음의 전략 중 하나 또는 그 이상을 수용해야 한다. (content type과 traffic patterns에 따라서 다르다.)</p>
<ul>
<li>유저의 컨텐츠를 지닌 페이지나 일반적인 콘텐트(public)의 페이지를 생성해라. 그리고 public 페이지만 edge server에 캐시해라.</li>
<li>만약 유저가 액티브한 유저 세션 상태라면 edge server에게 캐시된 페이지를 제공할지, 서버에게 요청을 보낼지(pass through) 알릴 수 있는 쿠키를 저장하라.</li>
<li>placeholder content가 있는 페이지를 제공하라(solid shapes that show where content will load). 그리고 브라우저에서 어떤 컨텐츠를 보여줄지 결정되게 하라.</li>
</ul>
<p>이제 당신은 캐싱에 대해 약간 더 알게 되었다.</p></content:encoded></item><item><title><![CDATA[Gatsby 블로그에 Dark mode 적용하기]]></title><description><![CDATA[Dark mode 최근 윈도우나 맥OS, 그리고 내가 사용하는 아이폰의 IOS에도 Dark mode가 도입됐다. Dark mode는 말 그대로 전반적인 인터페이스의 색상이 어둡다. 그래서 어두운 환경에서 눈의 피로를 감소시켜준다. dark mode…]]></description><link>https://ohseunghyeon.github.io/blogging/applying-dark-mode-on-gatsby-blog/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/blogging/applying-dark-mode-on-gatsby-blog/</guid><pubDate>Mon, 14 Oct 2019 11:40:40 GMT</pubDate><content:encoded><h2 id="dark-mode" style="position:relative;"><a href="#dark-mode" aria-label="dark mode permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Dark mode</h2>
<p>최근 윈도우나 맥OS, 그리고 내가 사용하는 아이폰의 IOS에도 Dark mode가 도입됐다. Dark mode는 말 그대로 전반적인 인터페이스의 색상이 어둡다. 그래서 어두운 환경에서 눈의 피로를 감소시켜준다.</p>
<h2 id="dark-mode-in-css" style="position:relative;"><a href="#dark-mode-in-css" aria-label="dark mode in css permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>dark mode in CSS</h2>
<p>CSS에도 dark mode에 대응하기 위한 기능이 추가되었는데, <code class="language-text">prefers-color-scheme</code>이라는 media query이다.</p>
<div class="gatsby-highlight" data-language="css"><pre class="language-css"><code class="language-css"><span class="token atrule"><span class="token rule">@media</span> <span class="token punctuation">(</span><span class="token property">prefers-color-scheme</span><span class="token punctuation">:</span> dark<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span></code></pre></div>
<p>이 쿼리를 사용하면 dark mode가 설정된 os와 아닌 os에서의 css 결과가 달라질 것이다.</p>
<p>아래와 같은 경우 dark mode인 경우 배경과 글의 색이 역전된다.</p>
<div class="gatsby-highlight" data-language="css"><pre class="language-css"><code class="language-css"><span class="token selector">body</span> <span class="token punctuation">{</span>
<span class="token property">background</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token atrule"><span class="token rule">@media</span> <span class="token punctuation">(</span><span class="token property">prefers-color-scheme</span><span class="token punctuation">:</span> dark<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
<span class="token selector">body</span> <span class="token punctuation">{</span>
<span class="token property">background</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<p>여기에 javascript를 사용해서 query를 실시간으로 확인하여 특정 동작을 할 수도 있다.</p>
<div class="gatsby-highlight" data-language="javascript"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> darkQuery <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token function">matchMedia</span><span class="token punctuation">(</span><span class="token string">'(prefers-color-scheme: dark)'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
darkQuery<span class="token punctuation">.</span><span class="token function">addListener</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">alert</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>matches <span class="token operator">?</span> <span class="token string">'dark mode'</span> <span class="token operator">:</span> <span class="token string">'light mode'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>그러나 이 방법으로만 구현하게 되면 OS에서 dark 모드를 사용하지 않는 사용자는 웹에서 dark mode를 사용할 수 없다.</p>
<h2 id="css-variables" style="position:relative;"><a href="#css-variables" aria-label="css variables permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>CSS Variables</h2>
<p>switch를 두고 toggle을 하여 mode를 바꾸는 방법은 어떨까?</p>
<p>switch에 따라 .light 또는 .dark 클래스를 적용하여 사이트의 전체적인 css를 변경하는 것이다.</p>
<p>그러기 위해서는 변수와 같은 것이 필요하다.</p>
<p>CSS에도 변수가 있으며 다음과 같이 사용할 수 있다.</p>
<div class="gatsby-highlight" data-language="css"><pre class="language-css"><code class="language-css"><span class="token selector">// 변수의 선언
element</span> <span class="token punctuation">{</span>
<span class="token property">--main-bg-color</span><span class="token punctuation">:</span> brown<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">// 변수의 사용
element</span> <span class="token punctuation">{</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--main-bg-color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>이 변수를 활용하면, 다음과 같이 모드에 따라 변수의 값을 바꾸어 사이트 전체의 css에 적용되게 할 수 있다.</p>
<div class="gatsby-highlight" data-language="css"><pre class="language-css"><code class="language-css"><span class="token selector">body.light</span> <span class="token punctuation">{</span>
<span class="token property">--main-bg-color</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">body.dark</span> <span class="token punctuation">{</span>
<span class="token property">--main-bg-color</span><span class="token punctuation">:</span> black<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">body</span> <span class="token punctuation">{</span>
<span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--main-bg-color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<h2 id="추가적인-고려-사항" style="position:relative;"><a href="#%EC%B6%94%EA%B0%80%EC%A0%81%EC%9D%B8-%EA%B3%A0%EB%A0%A4-%EC%82%AC%ED%95%AD" aria-label="추가적인 고려 사항 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>추가적인 고려 사항</h2>
<p>단순히 색상만 바꾸는 것으로는 다크 모드를 이쁘게 구현했다고 볼 수 없다.</p>
<p><a href="https://stuffandnonsense.co.uk/blog/redesigning-your-product-and-website-for-dark-mode" target="_blank" rel="nofollow noopener noreferrer">Andy Clarke의 글</a>을 참고하면, 색상을 선택하는 것부터, 타이포그래피, 이미지에 필터를 적용하는 것 등 다양한 것들을 고려하여 구현할 수 있음을 알 수 있다.</p>
<h2 id="참고" style="position:relative;"><a href="#%EC%B0%B8%EA%B3%A0" aria-label="참고 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>참고</h2>
<ul>
<li><a href="https://dev.to/ananyaneogi/create-a-dark-light-mode-switch-with-css-variables-34l8" target="_blank" rel="nofollow noopener noreferrer">Create A Dark/Light Mode Switch with CSS Variables, Ananya Neogi, 2019.4.10</a></li>
<li><a href="https://css-tricks.com/dark-modes-with-css/" target="_blank" rel="nofollow noopener noreferrer">Dark Mode in CSS</a></li>
<li><a href="https://stuffandnonsense.co.uk/blog/redesigning-your-product-and-website-for-dark-mode" target="_blank" rel="nofollow noopener noreferrer">Redesigning your product and website for dark mode</a></li>
</ul></content:encoded></item><item><title><![CDATA[[여행] 대관령 양떼목장, 강릉]]></title><description><![CDATA[…]]></description><link>https://ohseunghyeon.github.io/essay/gangreung-trip/</link><guid isPermaLink="false">https://ohseunghyeon.github.io/essay/gangreung-trip/</guid><pubDate>Sun, 06 Oct 2019 12:03:18 GMT</pubDate><content:encoded><p>아내랑 강릉 여행을 왔다.</p>
<h2 id="가평-휴게소-호두잣과자" style="position:relative;"><a href="#%EA%B0%80%ED%8F%89-%ED%9C%B4%EA%B2%8C%EC%86%8C-%ED%98%B8%EB%91%90%EC%9E%A3%EA%B3%BC%EC%9E%90" aria-label="가평 휴게소 호두잣과자 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>가평 휴게소 호두잣과자</h2>
<p>가평 휴게소에 있는 호두잣과자는 정말 인생 호두과자다. 사람들이 늘 사먹어서 구매하면 따끈하게 갓 만들어진 호두과자를 맛볼 수 있는데, 겉은 바삭하고 속은 부드럽고 달달하다. 정말 맛있다.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 575px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 133.12883435582822%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBAgQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAFBowSwVDtcNqdZguR//8QAHRAAAgIBBQAAAAAAAAAAAAAAAQIAEgMQERMhIv/aAAgBAQABBQLyY2BTOlhNg9Um14jipFWnK649P//EABURAQEAAAAAAAAAAAAAAAAAABEg/9oACAEDAQE/AWP/xAAWEQEBAQAAAAAAAAAAAAAAAAARABD/2gAIAQIBAT8BI3//xAAfEAACAgIBBQAAAAAAAAAAAAAAAQIRECEDEjEyUXH/2gAIAQEABj8C8ka18KoXTxrt6E1RdiUUSWEoyrP/xAAeEAADAQACAgMAAAAAAAAAAAAAAREhUWEQMUGBkf/aAAgBAQABPyH4l9+DO/sqNq0it5ie5RQTViZo8umI1ChAuYQrQnRa69b8f//aAAwDAQACAAMAAAAQ8/Gz/8QAGREAAwADAAAAAAAAAAAAAAAAAAEREDFB/9oACAEDAQE/EGz2Uncf/8QAGREAAgMBAAAAAAAAAAAAAAAAAAEQESEx/9oACAECAQE/EMcLDcf/xAAhEAEAAgIBAwUAAAAAAAAAAAABESEAQTEQYXFRkaHR8P/aAAgBAQABPxAhlBoiw/ecXR7U+1zioOpDX3hVutCKHbzkj9q47MODaM2CVYjBiViFa1XjNYVOTQ/Gd94XELgDz65JlUSrt6f/2Q=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="호두과자"
title="호두과자"
src="/static/395dfdc407df3da19502b1f35cb5aa27/8c797/IMG_4844.jpg"
srcset="/static/395dfdc407df3da19502b1f35cb5aa27/d2f63/IMG_4844.jpg 163w,
/static/395dfdc407df3da19502b1f35cb5aa27/c989d/IMG_4844.jpg 325w,
/static/395dfdc407df3da19502b1f35cb5aa27/8c797/IMG_4844.jpg 575w"
sizes="(max-width: 575px) 100vw, 575px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p>
<h2 id="가평-휴게소-한우국밥" style="position:relative;"><a href="#%EA%B0%80%ED%8F%89-%ED%9C%B4%EA%B2%8C%EC%86%8C-%ED%95%9C%EC%9A%B0%EA%B5%AD%EB%B0%A5" aria-label="가평 휴게소 한우국밥 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>가평 휴게소 한우국밥</h2>
<p>강원도 쪽 휴게소엔 다 한우국밥이 있는 것 같다. 먹을 때마다 느끼는 거지만 늘 맛있다. 빨간 국물은 부산의 쇠고기국밥과 똑같아서 입맛에 더 맞다.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAHKlsm7CAK//8QAGxABAAICAwAAAAAAAAAAAAAAAgEDABMREiL/2gAIAQEAAQUCsSMKXJrfjQ86W8a1n//EABcRAQADAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8B1cv/xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcVh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAEhMQISIkH/2gAIAQEABj8C2WUPwlnbkooo/8QAHBABAAIBBQAAAAAAAAAAAAAAAQARIUFhceHx/9oACAEBAAE/ISll8Xhmw30ZiUQ+8i9HDkiHef/aAAwDAQACAAMAAAAQxy//xAAXEQEBAQEAAAAAAAAAAAAAAAABADFh/9oACAEDAQE/EOhgjL//xAAXEQEBAQEAAAAAAAAAAAAAAAABEQAh/9oACAECAQE/EF4iZRt3/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFBUWFx0fD/2gAIAQEAAT8QXDEGQdGizzCqHyyJfBxBrDGqILGsdRlq+vdEyn4bUSAmSrpR3uf/2Q=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="한우국밥"
title="한우국밥"
src="/static/7900fadcc3878cb34bce3e7eb6181fd1/6aca1/IMG_4845.jpg"
srcset="/static/7900fadcc3878cb34bce3e7eb6181fd1/d2f63/IMG_4845.jpg 163w,
/static/7900fadcc3878cb34bce3e7eb6181fd1/c989d/IMG_4845.jpg 325w,
/static/7900fadcc3878cb34bce3e7eb6181fd1/6aca1/IMG_4845.jpg 650w,
/static/7900fadcc3878cb34bce3e7eb6181fd1/d8ebd/IMG_4845.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p>
<h2 id="대관령-양떼목장" style="position:relative;"><a href="#%EB%8C%80%EA%B4%80%EB%A0%B9-%EC%96%91%EB%96%BC%EB%AA%A9%EC%9E%A5" aria-label="대관령 양떼목장 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>대관령 양떼목장</h2>
<p>사실 이 여행의 목적은 양떼목장이다. 양들은 정말 귀엽다. 지금은 가을이라 그런지 양들의 털이 길었다. 여름엔 꽤 짧아서 더 귀여웠던 것 같은데. 지금은 조금 많이 꼬질꼬질하기도 하다. 양들은 매헤에에 하고 울 때, 목소리가 다 다르다. 어떤 애는 얇고, 어떤 애는 굵다. 그런데 오늘은 양들이 하나도 안 울었다. 여하튼, 양들은 꼭 털을 만져봐야 한다. 정말 푹신푹신한 양털.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDBf/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABsx5rBciF/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIAFAQRIP/aAAgBAQABBQKysOSd2X4//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFxEBAAMAAAAAAAAAAAAAAAAAAAEREv/aAAgBAgEBPwHS5f/EABkQAAMAAwAAAAAAAAAAAAAAAAABISAxQf/aAAgBAQAGPwLpFDSw/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAERECExQVFhgf/aAAgBAQABPyFp0/hlGzkcgz2TT//aAAwDAQACAAMAAAAQoC//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPxCq/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Qov/EAB0QAQACAgIDAAAAAAAAAAAAAAEAEWGhITFRsdH/2gAIAQEAAT8QuQyShuMfgFi7v1FKixz9lntkAveoONT/2Q=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="양 1"
title="양 1"
src="/static/b86878fefc5a596a6445bbd376542134/6aca1/IMG_4846.jpg"
srcset="/static/b86878fefc5a596a6445bbd376542134/d2f63/IMG_4846.jpg 163w,
/static/b86878fefc5a596a6445bbd376542134/c989d/IMG_4846.jpg 325w,
/static/b86878fefc5a596a6445bbd376542134/6aca1/IMG_4846.jpg 650w,
/static/b86878fefc5a596a6445bbd376542134/d8ebd/IMG_4846.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span>
<span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUBAgP/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdrJ5xHInD//xAAaEAACAgMAAAAAAAAAAAAAAAAAAhEUAQQQ/9oACAEBAAEFAsbRZUsITPf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGq/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAEQMTJB/9oACAEBAAY/AqZlnRT/AP/EABkQAAMBAQEAAAAAAAAAAAAAAAABIRGRsf/aAAgBAQABPyGVC/gPSCUJYuiNP//aAAwDAQACAAMAAAAQ2O//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAIAQIBAT8QvFv/xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhMUFhof/aAAgBAQABPxATgGNOQAKquoM+wmDPRFkvVKd15iQG+zPan//Z'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="양 2"
title="양 2"
src="/static/ebb7bf3eaa1b7f642c9d5f274b3b3628/6aca1/IMG_4847.jpg"
srcset="/static/ebb7bf3eaa1b7f642c9d5f274b3b3628/d2f63/IMG_4847.jpg 163w,
/static/ebb7bf3eaa1b7f642c9d5f274b3b3628/c989d/IMG_4847.jpg 325w,
/static/ebb7bf3eaa1b7f642c9d5f274b3b3628/6aca1/IMG_4847.jpg 650w,
/static/ebb7bf3eaa1b7f642c9d5f274b3b3628/d8ebd/IMG_4847.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span>
<span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAC/9oADAMBAAIQAxAAAAGqdtinIw//xAAaEAEAAgMBAAAAAAAAAAAAAAACAAEDERIx/9oACAEBAAEFAvYt1k5UHVRB3bL3/8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oACAEDAQE/AdK//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BiP/EABoQAAMAAwEAAAAAAAAAAAAAAAABIREiMVH/2gAIAQEABj8C1bwY9NeEUE5Cn//EAB0QAQACAQUBAAAAAAAAAAAAAAEAITERQVFhgbH/2gAIAQEAAT8h1bdpGFJTKXCz4R0e6ZFBvzBXE//aAAwDAQACAAMAAAAQjP8A/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8QKf/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/EKH/xAAbEAEBAQEAAwEAAAAAAAAAAAABESEAMWGBkf/aAAgBAQABPxBIsMyqXqggZBbvPwww+efjasRD2HKiIdfo5CEYSPk7/9k='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="양 3"
title="양 3"
src="/static/349a83190c15c04cb6c1865412a1b933/6aca1/IMG_4848.jpg"
srcset="/static/349a83190c15c04cb6c1865412a1b933/d2f63/IMG_4848.jpg 163w,
/static/349a83190c15c04cb6c1865412a1b933/c989d/IMG_4848.jpg 325w,
/static/349a83190c15c04cb6c1865412a1b933/6aca1/IMG_4848.jpg 650w,
/static/349a83190c15c04cb6c1865412a1b933/d8ebd/IMG_4848.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span>
<span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAABAv/EABYBAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABVwPc4THj/8QAGRAAAgMBAAAAAAAAAAAAAAAAABMCEBQh/9oACAEBAAEFAnxNA++H/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEAAwAAAAAAAAAAAAAAAAAAAAES/9oACAECAQE/AbZbP//EABkQAAEFAAAAAAAAAAAAAAAAAAABIDEyQf/aAAgBAQAGPwLSFKM//8QAHBAAAwABBQAAAAAAAAAAAAAAAAEhERBRcYGR/9oACAEBAAE/IXteRRSb5mXZzo6P/9oADAMBAAIAAwAAABDsH//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/EKf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ECf/xAAcEAEBAQEAAgMAAAAAAAAAAAABESEAMVFhcYH/2gAIAQEAAT8QghzrVdcH5zfrlrB7Xe0YrfHQoMvIoz8HO//Z'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="양 4"
title="양 4"
src="/static/baa62707980bf5abad3a9c2dfce658da/6aca1/IMG_4861.jpg"
srcset="/static/baa62707980bf5abad3a9c2dfce658da/d2f63/IMG_4861.jpg 163w,
/static/baa62707980bf5abad3a9c2dfce658da/c989d/IMG_4861.jpg 325w,
/static/baa62707980bf5abad3a9c2dfce658da/6aca1/IMG_4861.jpg 650w,
/static/baa62707980bf5abad3a9c2dfce658da/d8ebd/IMG_4861.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p>
<h2 id="강릉-해동막국수" style="position:relative;"><a href="#%EA%B0%95%EB%A6%89-%ED%95%B4%EB%8F%99%EB%A7%89%EA%B5%AD%EC%88%98" aria-label="강릉 해동막국수 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>강릉 해동막국수</h2>
<p>여긴 검색해서 점수가 괜찮은 막국수집이었다. 물막국수와 비빔막국수를 먹었는데, 비빔막국수가 유명한 집인가? 난 물을 먹어서 잘 모르겠다. 무튼, 이 집도 맛있다. 물 막국수의 육수는 약간 고소하면서 달달하다. 그리고 겨자를 넣어서 먹으면 딱 간이 맞다.</p>
<p>점수는 9/10을 주고 싶다. 밑반찬이 조금 아쉬웠기 때문이다. 김치가 별로였달까</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAcsnXlVxzw//xAAaEAACAwEBAAAAAAAAAAAAAAABAgADERMi/9oACAEBAAEFAhU7ytNmEToyD2obWP8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxAAAgMAAwAAAAAAAAAAAAAAABEBAhIhIlH/2gAIAQEABj8C6k8q3kCZOZRV2Ho//8QAGhABAAMAAwAAAAAAAAAAAAAAAQARUSGBkf/aAAgBAQABPyEpUUbGRfKEX8jFEtsjZIi0GRXC7n//2gAMAwEAAgADAAAAEDj/AP/EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8Qdpp//8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARIf/aAAgBAgEBPxATLl//xAAcEAACAwEAAwAAAAAAAAAAAAABEQAhMVFBgaH/2gAIAQEAAT8QND6P54IKuoUJgsH5nYZ0WF7E0ZYLZpKEWgYIPuMzFKjM/9k='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="해동막국수"
title="해동막국수"
src="/static/3fb28635bd90a2dac552a3072300c661/6aca1/IMG_4853.jpg"
srcset="/static/3fb28635bd90a2dac552a3072300c661/d2f63/IMG_4853.jpg 163w,
/static/3fb28635bd90a2dac552a3072300c661/c989d/IMG_4853.jpg 325w,
/static/3fb28635bd90a2dac552a3072300c661/6aca1/IMG_4853.jpg 650w,
/static/3fb28635bd90a2dac552a3072300c661/d8ebd/IMG_4853.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p>
<h2 id="영진해수욕장-바빈스-커피" style="position:relative;"><a href="#%EC%98%81%EC%A7%84%ED%95%B4%EC%88%98%EC%9A%95%EC%9E%A5-%EB%B0%94%EB%B9%88%EC%8A%A4-%EC%BB%A4%ED%94%BC" aria-label="영진해수욕장 바빈스 커피 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>영진해수욕장 바빈스 커피</h2>
<p>영진 해수욕장 앞에는 카페가 몇 개 있다. 그 중 장사가 조금 안 되는 것처럼 보이는 집에 들어갔다. 그런데 이 카페의 3층이 꽤 괜찮다. 다른 카페가 더 좋을 수 있지만, 이 카페의 3층엔 좌석들이 신발을 벗고 올라가는 평상 같은 형식으로 되어 있고, 그곳에 앉아서 바다를 감상할 수 있다.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 74.84662576687117%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAwb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAFB+dodESQ//8QAGRABAAMBAQAAAAAAAAAAAAAAAQIDEQAi/9oACAEBAAEFAt9V3MQdjxF3LV//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAADAAMAAAAAAAAAAAAAAAAAASERQbH/2gAIAQEABj8CqwSoTHTROn//xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhQWExcf/aAAgBAQABPyEBoOzKZoHU7gSjwuXFYP0Yig2rU//aAAwDAQACAAMAAAAQI+//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAeEAEAAgIBBQAAAAAAAAAAAAABABEhMUFhkaHB8P/aAAgBAQABPxAAPs5eY8FfZuH1HQAQaGO8gMBd/Zh6s9RRkg9ClFT/2Q=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="바빈스 커피 1"
title="바빈스 커피 1"
src="/static/55b89fee23d70d15fa76dbfc2b603f2f/6aca1/IMG_4859.jpg"
srcset="/static/55b89fee23d70d15fa76dbfc2b603f2f/d2f63/IMG_4859.jpg 163w,
/static/55b89fee23d70d15fa76dbfc2b603f2f/c989d/IMG_4859.jpg 325w,
/static/55b89fee23d70d15fa76dbfc2b603f2f/6aca1/IMG_4859.jpg 650w,
/static/55b89fee23d70d15fa76dbfc2b603f2f/d8ebd/IMG_4859.jpg 766w"
sizes="(max-width: 650px) 100vw, 650px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span>
<span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 575px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQDBQL/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAZejBZcasycq0y09CX//xAAcEAABBAMBAAAAAAAAAAAAAAACAAEREgMTIiH/2gAIAQEAAQUCwcrbZSaw+CxdXQk+yGswS3//xAAVEQEBAAAAAAAAAAAAAAAAAAABIP/aAAgBAwEBPwFj/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQESH/2gAIAQIBAT8BVGT/AP/EAB8QAAIABQUAAAAAAAAAAAAAAAABAhExQYEDECFCkf/aAAgBAQAGPwKOKcmcQtnVYNQxs1ZspYq/T//EABwQAQADAQADAQAAAAAAAAAAAAEAESExQVFhcf/aAAgBAQABPyFnAOM4CFXuE9b8rMRdQd7Epl55KzY/ILlhKwQNP4p//9oADAMBAAIAAwAAABBA4L//xAAXEQEBAQEAAAAAAAAAAAAAAAARAAEQ/9oACAEDAQE/EEzvDL//xAAXEQEAAwAAAAAAAAAAAAAAAAABABAR/9oACAECAQE/EFZrP//EACAQAQACAgICAwEAAAAAAAAAAAERIQBBMWFRsXGBkaH/2gAIAQEAAT8QgdUwTxwjyYxKgJ2u3XwYOUfh/bJ6xjlwOC1qsFs7nO+siqE+8JJTCQT+Yr4k7C67yzq1C95//9k='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="바빈스 커피 2"
title="바빈스 커피 2"
src="/static/5f2738b9195150ca9fbebc379c548212/8c797/IMG_4866.jpg"
srcset="/static/5f2738b9195150ca9fbebc379c548212/d2f63/IMG_4866.jpg 163w,
/static/5f2738b9195150ca9fbebc379c548212/c989d/IMG_4866.jpg 325w,
/static/5f2738b9195150ca9fbebc379c548212/8c797/IMG_4866.jpg 575w"
sizes="(max-width: 575px) 100vw, 575px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
/>
</span></p>
<h2 id="강릉-노벰버-펜션" style="position:relative;"><a href="#%EA%B0%95%EB%A6%89-%EB%85%B8%EB%B2%B0%EB%B2%84-%ED%8E%9C%EC%85%98" aria-label="강릉 노벰버 펜션 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>강릉 노벰버 펜션</h2>
<p>이런 느낌의 펜션은 처음이다. 약간 앤틱한 갬성의 인테리어와 건물이 눈을 사로잡는다. 게다가 친절하고 환대받는 느낌의 안내는 서비스를 받고 있다는 느낌을 확실하게 준다. 호텔이구나, 라고 느낄 수 있는 곳이다.</p>
<p>이 펜션에 체크인을 위해 입구로 들어가면 잠시 로비에서 기다리라고 하신다. 그리고 차와 다과, 방키, 커피가루를 챙겨주시고, 폴라로이드 사진을 한 장 찍어주신다. 커피가루는 방에서 커피 내리는 도구로 내려 마실 수 있다.</p>
<p>아침엔 조식을 주는데, 양식과 한식을 선택할 수 있다. 양식의 경우엔 조금 가볍다는 생각이 들었고, 한식 같은 경우엔 비교적 아침으로 부담스럽다고 느꼈다. 내가 아침을 안 먹어서 그런 것 같다. 맛은 매우 괜찮다.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 575px; margin-bottom: 10px;"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 133.12883435582822%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAQFAwEC/8QAFAEBAAAAAAAAAAAAAAAAAAAAAv/aAAwDAQACEAMQAAABRswvYVokCLDWOQbZwR//xAAfEAACAQMFAQAAAAAAAAAAAAABAgMREiIABBATIxT/2gAIAQEAAQUCB9yvhASkbZN3NaNy2iTfQOPmh4kxKk0//8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAQEf/aAAgBAwEBPwHkkmf/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFVV//EACEQAAIBAwMFAAAAAAAAAAAAAAABEQIQMRIhUSIyQVKh/9oACAEBAAY/At+R+XBA3GTTwoMI9VGDS6aTt+26drf/xAAaEAEBAQEBAQEAAAAAAAAAAAABEQAhMWFx/9oACAEBAAE/IY/txelPWAXJm/RodmSEE4MQmHQhzce6SgznMMCsfi0H3ALEXu//2gAMAwEAAgADAAAAEMQBQv/EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8Q1GNbIaRn/8QAFxEBAQEBAAAAAAAAAAAAAAAAEQABQf/aAAgBAgEBPxB5YMLFC//EAB0QAQADAQACAwAAAAAAAAAAAAEAESExUXFhkeH/2gAIAQEAAT8QAh0agcu4MQYdqrgFsFuhsN2ZN2dnpuVrGaJejaeclLEHyw24l1HjY85AO1Ww2ub+yjmNAb6uCEAnNlbtFoOfU77yf//Z'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="노벰버펜션 1"
title="노벰버펜션 1"
src="/static/9c8f5fe42afe990a123b6a1c11300858/8c797/IMG_4867.jpg"
srcset="/static/9c8f5fe42afe990a123b6a1c11300858/d2f63/IMG_4867.jpg 163w,
/static/9c8f5fe42afe990a123b6a1c11300858/c989d/IMG_4867.jpg 325w,
/static/9c8f5fe42afe990a123b6a1c11300858/8c797/IMG_4867.jpg 575w"