<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kkuma</title>
    <link>https://kkumalog.tistory.com/</link>
    <description>.</description>
    <language>ko</language>
    <pubDate>Wed, 27 May 2026 23:20:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sohyun_</managingEditor>
    <image>
      <title>kkuma</title>
      <url>https://t1.daumcdn.net/cfile/tistory/9916A7385C3F25E325</url>
      <link>https://kkumalog.tistory.com</link>
    </image>
    <item>
      <title>[Review] 샤오미 로봇청소기 5세대 (Xiaowa  E35)</title>
      <link>https://kkumalog.tistory.com/entry/Review</link>
      <description>&lt;p&gt;&lt;b&gt;# 샤오와 로봇청소기 E35 (Xiaomi Xiaowa E35 Robot Vacuum Cleaner)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;대륙의 실수 샤오미 샤오와 로봇청소기 6개월 사용 후기를 리뷰하려고 합니다 :)&lt;/p&gt;
&lt;p&gt;우선 샤오와는 샤오미가 구축한 생태계 브랜드에 속해 있는 유통 브랜드 중 하나입니다&lt;/p&gt;
&lt;p&gt;실제로 제가 구매 했을 때는 E35를 5세대라고 표기했는데, 6개월이 지난 지금 6세대라고 표기하더라구요&lt;/p&gt;
&lt;p&gt;확실한 정보를 제공하기 위해서 찾아 봤습니다!&lt;/p&gt;
&lt;p&gt;우선 결과를 먼저 알려드리자면 E20는 4세대, E35는 5세대가 맞습니다.&lt;/p&gt;
&lt;p&gt;한 세대씩 높여서 최신형처럼 보이게 하는 눈속임이 있기 때문에, 최저가 순으로 정렬해서 그냥 구입하시지마시고 꼭 상세정보 확인 후에 구입하세요★&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%83%A4%EC%98%A4%EB%AF%B8%20%EB%A1%9C%EB%B4%87%20%EC%B2%AD%EC%86%8C%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;나무위키 - 샤오미 로봇 청소기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1584276174425&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;샤오미 로봇 청소기 - 나무위키&quot; data-og-description=&quot;구매가격은 1, 2세대 중저가부터 3세대 저가형으로 포진되어있다. 정식 명칭로보락 S50 청소 로봇 (石头扫地机器人S50 Sh&amp;iacute;tou Sǎod&amp;igrave; Jīq&amp;igrave;r&amp;eacute;n S50, 북미 정발명 Roborock S5)제조사Beijing Roborock Technology Co., Ltd. (北京石头世纪科技有限公司)출시일2017년 9월 19일크기350mm x 353mm x 96.5mm배터리14.4V / 5200mAh 리튬 배터리 2시간50분 연속사용중량3.5kg센서LID&quot; data-og-host=&quot;namu.wiki&quot; data-og-source-url=&quot;https://namu.wiki/w/%EC%83%A4%EC%98%A4%EB%AF%B8%20%EB%A1%9C%EB%B4%87%20%EC%B2%AD%EC%86%8C%EA%B8%B0&quot; data-og-url=&quot;https://namu.wiki/w/%EC%83%A4%EC%98%A4%EB%AF%B8%20%EB%A1%9C%EB%B4%87%20%EC%B2%AD%EC%86%8C%EA%B8%B0&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%83%A4%EC%98%A4%EB%AF%B8%20%EB%A1%9C%EB%B4%87%20%EC%B2%AD%EC%86%8C%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://namu.wiki/w/%EC%83%A4%EC%98%A4%EB%AF%B8%20%EB%A1%9C%EB%B4%87%20%EC%B2%AD%EC%86%8C%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;샤오미 로봇 청소기 - 나무위키&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;구매가격은 1, 2세대 중저가부터 3세대 저가형으로 포진되어있다. 정식 명칭로보락 S50 청소 로봇 (石头扫地机器人S50 Sh&amp;iacute;tou Sǎod&amp;igrave; Jīq&amp;igrave;r&amp;eacute;n S50, 북미 정발명 Roborock S5)제조사Beijing Roborock Technology Co., Ltd. (北京石头世纪科技有限公司)출시일2017년 9월 19일크기350mm x 353mm x 96.5mm배터리14.4V / 5200mAh 리튬 배터리 2시간50분 연속사용중량3.5kg센서LID&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;namu.wiki&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;E35의 특징을 간단하게 설명하면, 듀얼 자이로스코프 관성 항법 시스템과 고정밀 듀얼 광학 모션 트래킹 센서를 결합하여 실시간으로 청소경로를 계획하며 식물학적 생체공학 물걸레 시스템과 2000Pa 흡입력으로 쓸고나서 걸레질이 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자세한 스펙들을 살펴볼까요?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;첫 번째, 5200mAh 배터리 탑재.&lt;/p&gt;
&lt;p&gt;대용량 리튬 배터리를 사용하여 표준모드에서 평균 약 2.5시간의 사용이 가능하다&lt;/p&gt;
&lt;p&gt;두 번째, 강력한 흡입력의 쓸기와 물청소 가능.&lt;/p&gt;
&lt;p&gt;사이드 브러쉬, 수직 롤 브러쉬, 2000Pa의 강력한 흡입력, 물청소 기능으로 더욱 깨끗한 청소가 가능하다&lt;/p&gt;
&lt;p&gt;세 번째, 서랍식 탈착방식 물탱크.&lt;/p&gt;
&lt;p&gt;물청소에 필요한 물을 간단하고 쉽게 청소기의 바닥에 고정시켜 뒤집히는 것을 방지한다&lt;/p&gt;
&lt;p&gt;네 번째, 자동구역 청소.&lt;/p&gt;
&lt;p&gt;로봇청소기에 장착된 13종류의 센서가 실시간으로 주변환경을 지도로 만들어 구석구석 청소가 가능하다&lt;/p&gt;
&lt;p&gt;다섯 번째, 배터리 자동충전.&lt;/p&gt;
&lt;p&gt;배터리가 부족하면 자동으로 충전 스탠드로 복귀하고, 청소중이었다면 80% 충전 후 복귀 전 지점으로 돌아가 자동으로 재시작한다&lt;/p&gt;
&lt;p&gt;그 외에도 2cm높이의 장애물 넘어가기, 대용량 먼지통 탑재 등 좋은 기능으로 가득가득!!&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://coupa.ng/bwsAZf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;샤오미 한글판 로봇청소기&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585490925950&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;샤오미 한글판 로봇청소기 6세대 E35 블랙에디션 국내발송 국내AS Y&quot; data-og-description=&quot;COUPANG&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://coupa.ng/bwsAZf&quot; data-og-url=&quot;https://www.coupang.com/vp/products/214200919&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bd8vB6/hyFtpYYNWo/DRkruNENx17x7GihC1nAn0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/RhZbL/hyFtqp2RTr/cbM1Iom4sy579R7WkqzEoK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://coupa.ng/bwsAZf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coupa.ng/bwsAZf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bd8vB6/hyFtpYYNWo/DRkruNENx17x7GihC1nAn0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/RhZbL/hyFtqp2RTr/cbM1Iom4sy579R7WkqzEoK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;샤오미 한글판 로봇청소기 6세대 E35 블랙에디션 국내발송 국내AS Y&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;COUPANG&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;처음엔 이리 쿵 저리 쿵 치이는 로봇청소기를 보고 멍충이라고 부를 때가 있었는데, 요즘에는 얘 없이는 못살게 되어버렸어요&lt;/p&gt;
&lt;p&gt;특히 도움이 많이 됐던건 가상벽 마그네틱 스트립인데요&lt;/p&gt;
&lt;p&gt;기본적으로 낭떠러지 센서가 있어서 신발장같은 곳으로 떨어지지는 않지만,&lt;/p&gt;
&lt;p&gt;워낙 똑똑해져서 2cm 높이의 장애물을 훌쩍 넘어가는데, 베란다나 화장실 문턱을 넘으려다가 바퀴가 빠지는 경우가 종종 있어서 집에 있을 때만 청소를 했었던 슬픈 기억이ㅠㅠ&lt;/p&gt;
&lt;p&gt;지금은 청소를 원하지 않는 구역 문턱 앞에다 가상벽을 설치해서 맘편히 돌려놓고 외출 할 수 있게 되었어요!!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://coupa.ng/bwsBpt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;샤오미 가상벽 로봇청소기 마그네틱 스트립&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585490980117&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;샤오미 가상벽 로봇청소기 마그네틱 스트립 4M 범용 1팩&quot; data-og-description=&quot;COUPANG&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://coupa.ng/bwsBpt&quot; data-og-url=&quot;https://www.coupang.com/vp/products/1248508459&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yzeUy/hyFtussODs/2EFWM3NSElWtbWokBXxKNK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/YtrkP/hyFr7r43bB/2k7mGw3kv9h8KhMQQkqIl0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://coupa.ng/bwsBpt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coupa.ng/bwsBpt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yzeUy/hyFtussODs/2EFWM3NSElWtbWokBXxKNK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/YtrkP/hyFr7r43bB/2k7mGw3kv9h8KhMQQkqIl0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;샤오미 가상벽 로봇청소기 마그네틱 스트립 4M 범용 1팩&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;COUPANG&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# Xiaowa E35 UNBOXING(언박싱)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;두둥 드디어 샤오와 로봇청소기를 개봉하도록 하겠습니다 :)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efHi0v/btqzyXuN5jH/ilwC0LW5bAnXUaov8OSK51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efHi0v/btqzyXuN5jH/ilwC0LW5bAnXUaov8OSK51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efHi0v/btqzyXuN5jH/ilwC0LW5bAnXUaov8OSK51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefHi0v%2FbtqzyXuN5jH%2FilwC0LW5bAnXUaov8OSK51%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpgySV/btqzwZ8qeq9/B9sXsmV6jNIDaU8vPhmIIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpgySV/btqzwZ8qeq9/B9sXsmV6jNIDaU8vPhmIIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpgySV/btqzwZ8qeq9/B9sXsmV6jNIDaU8vPhmIIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpgySV%2FbtqzwZ8qeq9%2FB9sXsmV6jNIDaU8vPhmIIK%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boCZ1g/btqzyX2EiJR/XBKvJtkb1AQBCqK4kKOfB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boCZ1g/btqzyX2EiJR/XBKvJtkb1AQBCqK4kKOfB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boCZ1g/btqzyX2EiJR/XBKvJtkb1AQBCqK4kKOfB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboCZ1g%2FbtqzyX2EiJR%2FXBKvJtkb1AQBCqK4kKOfB1%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다크그레이와 블랙 컬러의 조합인 블랙에디션이라서 기존보다 더 고급스러운 느낌이 있네요&lt;/p&gt;
&lt;p&gt;자세한 내용은 설명서에서도 보겠지만, 버튼은 왼쪽부터 스팟청소 / 청소 종료 및 시작 / 재충전 역할 입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pui3c/btqCIEGRs7N/m6XaOKbr2uKXTFtro4KSuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pui3c/btqCIEGRs7N/m6XaOKbr2uKXTFtro4KSuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pui3c/btqCIEGRs7N/m6XaOKbr2uKXTFtro4KSuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpui3c%2FbtqCIEGRs7N%2Fm6XaOKbr2uKXTFtro4KSuk%2Fimg.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfaDYg/btqzv76UGC0/w4olPcDIPGlafOL7ZKjMpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfaDYg/btqzv76UGC0/w4olPcDIPGlafOL7ZKjMpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfaDYg/btqzv76UGC0/w4olPcDIPGlafOL7ZKjMpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfaDYg%2Fbtqzv76UGC0%2Fw4olPcDIPGlafOL7ZKjMpk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;버튼 아래쪽의 넓은 부분을 열면 먼지통이 들어있어요&lt;/p&gt;
&lt;p&gt;처음 열면 그림으로된 설명서가 또 부착되어있으니 어렵지 않게 사용하실 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNA7Ua/btqzyjrk6CC/9payjKy8r3tGkD00KSGhP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNA7Ua/btqzyjrk6CC/9payjKy8r3tGkD00KSGhP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNA7Ua/btqzyjrk6CC/9payjKy8r3tGkD00KSGhP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNA7Ua%2Fbtqzyjrk6CC%2F9payjKy8r3tGkD00KSGhP0%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnEtX7/btqzxB0zWSD/Zr2uvoiuLE56NtY2EJ4z9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnEtX7/btqzxB0zWSD/Zr2uvoiuLE56NtY2EJ4z9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnEtX7/btqzxB0zWSD/Zr2uvoiuLE56NtY2EJ4z9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnEtX7%2FbtqzxB0zWSD%2FZr2uvoiuLE56NtY2EJ4z9k%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5eweB/btqzv7Tp9ZB/SI7Z5Ce9pGOn0UhrwKys20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5eweB/btqzv7Tp9ZB/SI7Z5Ce9pGOn0UhrwKys20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5eweB/btqzv7Tp9ZB/SI7Z5Ce9pGOn0UhrwKys20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5eweB%2Fbtqzv7Tp9ZB%2FSI7Z5Ce9pGOn0UhrwKys20%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;얘가 바로 충전기, 로봇청소기의 집이에요&lt;/p&gt;
&lt;p&gt;오래 사용하다보면 가끔 충전소에 먼지가 쌓였으니 청소해달라는 알림을 받을 수도 있습니다....&lt;/p&gt;
&lt;p&gt;그리고 아래는 방수패드를 설치했을 때의 모습입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epIm9I/btqzwv7z9Jl/s3fxrn3v3BUUrphKc3oZE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epIm9I/btqzwv7z9Jl/s3fxrn3v3BUUrphKc3oZE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epIm9I/btqzwv7z9Jl/s3fxrn3v3BUUrphKc3oZE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepIm9I%2Fbtqzwv7z9Jl%2Fs3fxrn3v3BUUrphKc3oZE1%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjUn4O/btqzLk5aSw1/YxY4JCOoFLXUhJ9IlTGLqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjUn4O/btqzLk5aSw1/YxY4JCOoFLXUhJ9IlTGLqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjUn4O/btqzLk5aSw1/YxY4JCOoFLXUhJ9IlTGLqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjUn4O%2FbtqzLk5aSw1%2FYxY4JCOoFLXUhJ9IlTGLqk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이게 5세대의 핵심, 물걸레 기능을 할 수 있는 물통과 걸레에요&lt;/p&gt;
&lt;p&gt;물걸레를 사용할 때에는 꼭 충전기에 방수패드와 함께 사용하는게 좋습니다. 저처럼 목재바닥이라면 필수!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbquEV/btqzwvGxbf1/jl3UKsdHIHsLwqs0UNLkWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbquEV/btqzwvGxbf1/jl3UKsdHIHsLwqs0UNLkWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbquEV/btqzwvGxbf1/jl3UKsdHIHsLwqs0UNLkWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbquEV%2FbtqzwvGxbf1%2Fjl3UKsdHIHsLwqs0UNLkWk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;먼지통에 부착해야하는 필터 여분과 메인브러시 청소도구는 별도로 잘 보관해두고 있다가,&lt;/p&gt;
&lt;p&gt;설명서에 있는 정기 유지 보수 청소기간과 교체 권장 기간을 참고해서 관리하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYmnWI/btqzv6ttubS/7HESEI4nMpJNFIMvO6Sem0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYmnWI/btqzv6ttubS/7HESEI4nMpJNFIMvO6Sem0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYmnWI/btqzv6ttubS/7HESEI4nMpJNFIMvO6Sem0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYmnWI%2Fbtqzv6ttubS%2F7HESEI4nMpJNFIMvO6Sem0%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;본격적으로 사용설명서를 읽어봅시다!&lt;/p&gt;
&lt;p&gt;제품은 단순하지만, 그 안에 기능과 역할이 많다보니 설명하는 양도 어마어마하네요&lt;/p&gt;
&lt;p&gt;기본적으로 부품설명, 설치방법, 정기유지보수 방법 및 시기가 자세하게 설명되어있으니 꼭 한번은 제대로 읽어보셨으면 좋겠어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JYMLV/btqzxKXgkH9/Mmc0c1bynxXQnWvZ36CO01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JYMLV/btqzxKXgkH9/Mmc0c1bynxXQnWvZ36CO01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JYMLV/btqzxKXgkH9/Mmc0c1bynxXQnWvZ36CO01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJYMLV%2FbtqzxKXgkH9%2FMmc0c1bynxXQnWvZ36CO01%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQMM6u/btqzM0knvaA/Zw0MBpYTRDAl02caEojoJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQMM6u/btqzM0knvaA/Zw0MBpYTRDAl02caEojoJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQMM6u/btqzM0knvaA/Zw0MBpYTRDAl02caEojoJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQMM6u%2FbtqzM0knvaA%2FZw0MBpYTRDAl02caEojoJ0%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3P6HK/btqzMVjidT0/SfonkvfJbTkO3BXtdA0Hp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3P6HK/btqzMVjidT0/SfonkvfJbTkO3BXtdA0Hp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3P6HK/btqzMVjidT0/SfonkvfJbTkO3BXtdA0Hp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3P6HK%2FbtqzMVjidT0%2FSfonkvfJbTkO3BXtdA0Hp1%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv7KNa/btqzKeR7qCI/0vcqHcnRynKtVSZWFmklv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv7KNa/btqzKeR7qCI/0vcqHcnRynKtVSZWFmklv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv7KNa/btqzKeR7qCI/0vcqHcnRynKtVSZWFmklv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv7KNa%2FbtqzKeR7qCI%2F0vcqHcnRynKtVSZWFmklv1%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drzjrj/btqzMeQZAud/1DSekrHkIoSTgJy8hX7CHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drzjrj/btqzMeQZAud/1DSekrHkIoSTgJy8hX7CHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drzjrj/btqzMeQZAud/1DSekrHkIoSTgJy8hX7CHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrzjrj%2FbtqzMeQZAud%2F1DSekrHkIoSTgJy8hX7CHk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCuDE3/btqzKfpZvSf/WAucgwQ7EkKS5AuTU9E2Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCuDE3/btqzKfpZvSf/WAucgwQ7EkKS5AuTU9E2Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCuDE3/btqzKfpZvSf/WAucgwQ7EkKS5AuTU9E2Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCuDE3%2FbtqzKfpZvSf%2FWAucgwQ7EkKS5AuTU9E2Y0%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zbdm9/btqzKHGwRdT/QNaT4uL9JKLxsfNTYLn0Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zbdm9/btqzKHGwRdT/QNaT4uL9JKLxsfNTYLn0Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zbdm9/btqzKHGwRdT/QNaT4uL9JKLxsfNTYLn0Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZbdm9%2FbtqzKHGwRdT%2FQNaT4uL9JKLxsfNTYLn0Jk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTzanC/btqzMfCjOcI/5k70t4hw7iFd4FC302Vc4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTzanC/btqzMfCjOcI/5k70t4hw7iFd4FC302Vc4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTzanC/btqzMfCjOcI/5k70t4hw7iFd4FC302Vc4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTzanC%2FbtqzMfCjOcI%2F5k70t4hw7iFd4FC302Vc4k%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ee30JI/btqCIEfOPKW/qQKcapN4g62WryU0jKjGj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ee30JI/btqCIEfOPKW/qQKcapN4g62WryU0jKjGj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ee30JI/btqCIEfOPKW/qQKcapN4g62WryU0jKjGj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fee30JI%2FbtqCIEfOPKW%2FqQKcapN4g62WryU0jKjGj1%2Fimg.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4ccBQ/btqzM0q8YKq/GTJjlHqWck27HGWUBkgHzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4ccBQ/btqzM0q8YKq/GTJjlHqWck27HGWUBkgHzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4ccBQ/btqzM0q8YKq/GTJjlHqWck27HGWUBkgHzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4ccBQ%2FbtqzM0q8YKq%2FGTJjlHqWck27HGWUBkgHzk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KwaT1/btqzKeYVpqP/cnxpXI34WkDX7vMM5T7zy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KwaT1/btqzKeYVpqP/cnxpXI34WkDX7vMM5T7zy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KwaT1/btqzKeYVpqP/cnxpXI34WkDX7vMM5T7zy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKwaT1%2FbtqzKeYVpqP%2FcnxpXI34WkDX7vMM5T7zy0%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF1wVf/btqzMeXIDUu/dWPamwRpssxaKxRLMC6FO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF1wVf/btqzMeXIDUu/dWPamwRpssxaKxRLMC6FO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF1wVf/btqzMeXIDUu/dWPamwRpssxaKxRLMC6FO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF1wVf%2FbtqzMeXIDUu%2FdWPamwRpssxaKxRLMC6FO1%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvgWcP/btqzKexWF6D/60Ykk2BQnzuzwGmQJyhqCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvgWcP/btqzKexWF6D/60Ykk2BQnzuzwGmQJyhqCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvgWcP/btqzKexWF6D/60Ykk2BQnzuzwGmQJyhqCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvgWcP%2FbtqzKexWF6D%2F60Ykk2BQnzuzwGmQJyhqCk%2Fimg.png&quot; data-origin-width=&quot;0.0&quot; data-origin-height=&quot;0.0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# Mi Home Application 연동&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Mi Home App에는 로봇청소기 외에도 다양한 가전기기를 연동할 수 있는데요, 저는 Xiaowa E35(E Series)를 선택한 후 사용중입니다.&lt;/p&gt;
&lt;p&gt;현재 배터리량과 청소 상태, 예약 청소 기능까지 다양하게 제공하고 있어서 외부에서도 관리가 가능합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-42.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf3brp/btqCF8aU8lh/77rk9CuzUezsAfsSp8pgT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf3brp/btqCF8aU8lh/77rk9CuzUezsAfsSp8pgT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf3brp/btqCF8aU8lh/77rk9CuzUezsAfsSp8pgT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf3brp%2FbtqCF8aU8lh%2F77rk9CuzUezsAfsSp8pgT1%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-42.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2678&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;메뉴의 가장 오른쪽 표준부분을 누르면, 아래의 화면처럼 모드를 설정할 수 있어요&lt;/p&gt;
&lt;p&gt;안정, 표준, 강도, 최대 흡입력이 점점 높아질 수록 소음도 심하니 참고하세요!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-46.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PsRye/btqCF6c2xHS/iuvQcNUZX5CKlBx7JxUEW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PsRye/btqCF6c2xHS/iuvQcNUZX5CKlBx7JxUEW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PsRye/btqCF6c2xHS/iuvQcNUZX5CKlBx7JxUEW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPsRye%2FbtqCF6c2xHS%2FiuvQcNUZX5CKlBx7JxUEW0%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-46.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2656&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;실제로 청소가 완료되었을 때 지도 버튼을 누른 화면입니다&lt;/p&gt;
&lt;p&gt;어디를, 얼마나 청소했는지 한 눈에 볼 수 있고 침대 밑까지 구석구석 잘 다녔다는게 보여서 좋아요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-51.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBaU70/btqCGRUewro/8Z0uIrdaBt6ejsOiD8P6lK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBaU70/btqCGRUewro/8Z0uIrdaBt6ejsOiD8P6lK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBaU70/btqCGRUewro/8Z0uIrdaBt6ejsOiD8P6lK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBaU70%2FbtqCGRUewro%2F8Z0uIrdaBt6ejsOiD8P6lK%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_Photo_2020-03-16-00-09-51.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2670&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 실행영상&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;저희집에 처음 들어와서 이리저리 쿵쿵하면서 청소해야할 구역을 찾는 작업, 맵핑 중에 찍은 영상입니다 :)&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/channel/3348783/cliplink/403218430&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bjDnfg/hyDnn4SYmy/yPtRs2QQIa79P77juJZ3ZK/img.png?width=854&amp;amp;height=854&amp;amp;face=0_0_854_854,https://scrap.kakaocdn.net/dn/wCZND/hyDoRQN5By/GFvw9vuz6Nk5K0N2jycNi0/img.jpg?width=640&amp;amp;height=360&amp;amp;face=0_0_640_360&quot; data-video-width=&quot;854&quot; data-video-height=&quot;854&quot; data-video-play-service=&quot;daum_tistory&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/403218430?service=daum_tistory&quot; width=&quot;854&quot; height=&quot;854&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>Others</category>
      <category>로봇청소기 고장</category>
      <category>로봇청소기 비교</category>
      <category>로봇청소기 추천</category>
      <category>샤오미 A/S</category>
      <category>샤오미 로봇청소기</category>
      <category>샤오미 보조배터리</category>
      <category>샤오미 제품</category>
      <category>샤오와</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/78</guid>
      <comments>https://kkumalog.tistory.com/entry/Review#entry78comment</comments>
      <pubDate>Mon, 16 Mar 2020 00:17:58 +0900</pubDate>
    </item>
    <item>
      <title>[IT] Google, 크롬 UA스트링 (User Agent String) 사용 중지</title>
      <link>https://kkumalog.tistory.com/entry/IT</link>
      <description>&lt;p&gt;이 페이지는 이전에 포스팅했던 &lt;a href=&quot;https://kkumalog.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Get User Agent And IP Information&lt;/a&gt; 의 변화에 대해 설명하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1579588434090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JAVA] Get User Agent And IP Information&quot; data-og-description=&quot;이 페이지에서는 IP, Agent, 브라우저, OS등의 접속자 정보를 가져오는 방법에 대해 설명하고 있다. # IP X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP..&quot; data-og-host=&quot;kkumalog.tistory.com&quot; data-og-source-url=&quot;https://kkumalog.tistory.com/73&quot; data-og-url=&quot;https://kkumalog.tistory.com/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPPiKR/hyEFYUROKG/KJfmCF3kjHyQTOomKdpkO0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/oQLsa/hyEEOl2BqU/XMo1rzDltUqGPLcH7J3RW1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://kkumalog.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kkumalog.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPPiKR/hyEFYUROKG/KJfmCF3kjHyQTOomKdpkO0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/oQLsa/hyEEOl2BqU/XMo1rzDltUqGPLcH7J3RW1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[JAVA] Get User Agent And IP Information&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;이 페이지에서는 IP, Agent, 브라우저, OS등의 접속자 정보를 가져오는 방법에 대해 설명하고 있다. # IP X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kkumalog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;약 일주일 전 쯤 ZDNet을 통해 구글이 크롬 웹 브라우저에서 'User agent string(사용자 에이전트 문자열)'의 사용을 중지하며 점진적으로 폐기한다는 계획을 발표했다는 내용을 전해들었다.&lt;/p&gt;
&lt;p&gt;사용자 에이전트 문자열이란, 사용자를 대신하여 일을 수행하는 소프트웨어 에이전트로서 세션 개시 프로토콜에서는 통신 세션 양 쪽 끝을 말한다. 즉, 브라우저가 웹사이트에 연결을 시작할 때 사용자 기기 정보를 보내는 역할을 한다. 이 문자열에는 브라우저의 유형 및 운영체제 등의 정보를 가지고 있다.&lt;/p&gt;
&lt;p&gt;인터넷 광고업체에서 웹 이용자 기기 정보를 파악하는데 활용되어 온 기능이기에 사라지게 된다면&amp;nbsp;디지털 마케팅 시장에 큰 변화가 예상된다.&lt;/p&gt;
&lt;p&gt;이 기능은 1990년대 넷스케이프 브라우저의 요소로 개발되어 지금까지 쓰이고 있다. 웹사이트는 UA 스트링의 정보를 참조해 방문자의 기술적 명세표에 기반한 각종 서비스를 제공할 수 있다.&lt;/p&gt;
&lt;p&gt;이에 구글은 &quot;한번만 사용하는 메커니즘이 다른 측면의 골치거리가 됐다&quot;며 UA 스트링의 문제를 지적하였고,&lt;/p&gt;
&lt;p&gt;크롬재단에서 활동하는 요아브 바이스 구글 엔지니어는 &quot;사생활침해 문제에서 유저 에이전트 누설은 비주류 브라우저의 호환성 문제, 브라우저 자체에 관한 허위 정보, 구글 자산을 포함해 좋지 않은 원인으로 일부 브라우저에서 장애 등의 많은 자원이 된다. 이런 문제들을 해결하기 위해 구글은 표준을 완전히 동결해 크롬에서 UA 스트링의 중요성을 단계적으로 철폐할 계획&quot;이라고 밝혔다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글은 일단 크롬 브라우저의 신규 스트링에 대한 UA 요소의 업데이트를 중지할 예정이다. 장기적으로 너무 많은 사용자 정보를 드러내지 않는 일반값에 모든 크롬 UA 스트링을 통합한다. 새 스마트폰 모델이나 새 OS 같은 신규 플랫폼에 배포되는 향후의 크롬 브라우저는 일반 UA 스트링을 사용한다. 이는 특정 플랫폼에 맞춤화한 형태가 아니다.&lt;/p&gt;
&lt;p&gt;예를 들면, 웹사이트는 방문자의 크롬이 어떤 기기, 어떤 OS 버전에서 구동되는지 알 수 없다. 단지 크롬 사용자란 정보만 파악할 수 있으며, 데스크톱과 모바일 환경 정도만 구분할 수 있다.&lt;/p&gt;
&lt;p&gt;기존 사용자 환경의 호환성을 유지하기 위해 현존하는 크롬 UA 스트링은 계속 유지된다.&lt;/p&gt;
&lt;p&gt;계획은 이러하다.&lt;/p&gt;
&lt;p&gt;2020.03 크롬81 버전은 UA 스트링을 읽는 웹페이지 콘솔에서 경고문을 노출한다. 웹사이트 개발자는 이를 보고 웹사이트 코드를 조정할 수 있다.&lt;/p&gt;
&lt;p&gt;2020.06 크롬83 버전은 UA 스트링에서 크롬 브라우저 버전을 동결하고 OS 버전을 통합한다.&lt;/p&gt;
&lt;p&gt;2020.09 크롬85 버전은 UA 데스크톱 OS별 스트링을 데스크톱 브라우저의 일반값으로 통합한다. 구글은 이후 모바일 OS 및 기기의 스트링도 일반값으로 통합한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;UA 스트링이 사라지면 온라인 광고 시장이 영향을 받는다.&lt;/p&gt;
&lt;p&gt;인터넷 광고는 무료 웹사이트의 활력소이며 구글의 핵심사업이기 때문에 사생활침해요인을 제거하면서 시장의 충격을 줄이는 대안이 필요하다.&lt;/p&gt;
&lt;p&gt;구글은 UA 스트링의 대체품으로 '클라이언트 힌트(CH)'이라 불리는 메커니즘을 제안했다.&lt;/p&gt;
&lt;p&gt;클라이언트힌트는 웹사이트가 사용자에게 정보를 요청할 수 있지만, 사용 이력이나 핑거프린트는 파악할 수 없다. 웹사이트의 서버가 요청한 경우와 요청한 사항만 사용자의 정보를 알려주게 된다.&lt;/p&gt;
&lt;p&gt;현재 클라이언트힌트 메커니즘은 구글의 프라이버시 샌드박스 프로젝트의 일부로 개발되고 있다. 이 프로젝트는 작년 8월 발표됐다.&lt;/p&gt;
&lt;p&gt;프라이버시 샌드박스 기술은 사용자 정보를 과도하게 노출하지 않으면서, 필요한 정보만 웹사이트와 광고주가 브라우저에 질의할 수 있게 하는 기술이다.&lt;/p&gt;
&lt;p&gt;브라우저가 광고주에게 공유하는 정보는 사용자 그룹화 수준만 만들 수 있고, 상세한 개인별 프로필을 조합할 수준은 아니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 - ZDNet Korea (지디넷 코리아)&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>Chrome</category>
      <category>IT</category>
      <category>UA 스트링</category>
      <category>user agent string</category>
      <category>구글</category>
      <category>브라우저 분석</category>
      <category>브라우저 해킹</category>
      <category>에이전트 스트링</category>
      <category>크롬</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/81</guid>
      <comments>https://kkumalog.tistory.com/entry/IT#entry81comment</comments>
      <pubDate>Tue, 21 Jan 2020 15:53:44 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 배열 요소 수정/삭제 함수, splice()</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript-%EB%B0%B0%EC%97%B4-%EC%9A%94%EC%86%8C-%EC%88%98%EC%A0%95%EC%82%AD%EC%A0%9C-%ED%95%A8%EC%88%98-splice</link>
      <description>&lt;p&gt;이 페이지는 자바스크립트의 배열에서 요소를 삭제 또는 교체, 추가할 때 사용하는 내장함수 splice()에 대해 설명하고 있다.&lt;/p&gt;
&lt;p&gt;기본적으로 자바스크립트의 배열에는 요소를 제어하는 역할을 하는 splice() 메서드가 있다.&lt;/p&gt;
&lt;pre class=&quot;inform7&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array.splice(start[, deleteCount[, item1[, item2[, &amp;hellip;]]]])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기본 구조를 보면, start로 배열을 변경할 시작 인덱스를 지정하여 작업하고 변경된 요소를 담은 Array 객체를 반환한다.&lt;/p&gt;
&lt;p&gt;(제거한 요소를 담은 배열로 반환한다는것은, 하나의 요소만 제거한 경우 길이가 1인 배열을 반환하고, 아무 값도 제거하지 않았으면 빈 배열을 반환한다는 뜻이다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;start는 배열의 변경을 시작할 인덱스로, 음수인 경우 배열의 끝에서부터 센다.&lt;/p&gt;
&lt;p&gt;deleteCount는 제거할 요소의 갯수로, 생략하거나 array.length - start보다 크면 요소를 제거한다.&lt;/p&gt;
&lt;p&gt;item은 배열에 추가할 요소로, 지정하지 않으면 제거만 한다.&lt;/p&gt;
&lt;pre class=&quot;autoit&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
console.log(months);
// result: Array ['Jan', 'Feb', 'March', 'April', 'June']

months.splice(4, 1, 'May');
console.log(months);
// result: Array ['Jan', 'Feb', 'March', 'April', 'May']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex1)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;하나도 제거하지 않고, 2번 인덱스에 'drum' 추가&lt;/p&gt;
&lt;pre id=&quot;code_1578017864251&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2, 0, 'drum');

// myFish is ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'] 
// removed is [], no elements removed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;하나도 제거하지 않고, 2번 인덱스에 &amp;ldquo;drum'과 'guitar' 추가&lt;/p&gt;
&lt;pre id=&quot;code_1578017909173&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2, 0, 'drum', 'guitar');

// myFish is ['angel', 'clown', 'drum', 'guitar', 'mandarin', 'sturgeon'] 
// removed is [], no elements removed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex3)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;3번 인덱스에서 한 개 요소 제거&lt;/p&gt;
&lt;pre id=&quot;code_1578017961992&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
var removed = myFish.splice(3, 1);

// removed is ['mandarin']
// myFish is ['angel', 'clown', 'drum', 'sturgeon'] &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex4)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;2번 인덱스에서 한 개 요소 제거하고 'trumpet' 추가&lt;/p&gt;
&lt;pre id=&quot;code_1578017976652&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
var removed = myFish.splice(2, 1, 'trumpet');

// myFish is ['angel', 'clown', 'trumpet', 'sturgeon']
// removed is ['drum']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex5)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;0번 인덱스에서 두 개 요소 제거하고 'parrot', 'anemone', 'blue' 추가&lt;/p&gt;
&lt;pre id=&quot;code_1578017993944&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];
var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');

// myFish is ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'] 
// removed is ['angel', 'clown']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex6)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;2번 인덱스에서 두 개 요소 제거&lt;/p&gt;
&lt;pre id=&quot;code_1578018008017&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'];
var removed = myFish.splice(myFish.length - 3, 2);

// myFish is ['parrot', 'anemone', 'sturgeon'] 
// removed is ['blue', 'trumpet']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex7)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;-2번(끝에서 두번째) 인덱스에서 한 개 요소 제거&lt;/p&gt;
&lt;pre id=&quot;code_1578018028314&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(-2, 1);

// myFish is ['angel', 'clown', 'sturgeon'] 
// removed is ['mandarin']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;ex8)&lt;/b&gt;&lt;br /&gt;2번(중간) 인덱스를 포함해서 이후의 모든 요소 제거&lt;/p&gt;
&lt;pre id=&quot;code_1578018047765&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2);

// myFish is ['angel', 'clown'] 
// removed is ['mandarin', 'sturgeon']&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/JavaScript</category>
      <category>delete array element</category>
      <category>IT</category>
      <category>JavaScript</category>
      <category>javascript array</category>
      <category>Programming</category>
      <category>remove array element</category>
      <category>SPLICE</category>
      <category>splice()</category>
      <category>자바스크립트 배열</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/80</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript-%EB%B0%B0%EC%97%B4-%EC%9A%94%EC%86%8C-%EC%88%98%EC%A0%95%EC%82%AD%EC%A0%9C-%ED%95%A8%EC%88%98-splice#entry80comment</comments>
      <pubDate>Fri, 3 Jan 2020 11:30:14 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] Boolean vs tinyint(1) value in MySQL</title>
      <link>https://kkumalog.tistory.com/entry/MySQL-Boolean-vs-tinyint1-value-in-MySQL</link>
      <description>&lt;p&gt;이 페이지는 MySQL에서의 Boolean형이 tinyint(1)으로 저장되는 혼란스러움에 대해 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 BOOLEAN 형태는 5버전대부터 사용이 가능하다.&lt;/p&gt;
&lt;p&gt;실제로 자료형 BOOLEAN(또는 BOOL) 타입으로 정의하면 1비트의 공간을 할당하여 TINYINT(1) 타입으로 정의 된다.&lt;/p&gt;
&lt;p&gt;데이터는 TINYINT형태에 맞게 TRUE는 1, FALSE 는 0 으로 저장된다.&lt;/p&gt;
&lt;p&gt;Node.js에서 MySQL 테이블 모델을 정의할 때,&lt;/p&gt;
&lt;pre id=&quot;code_1575359570716&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;isCheck: {
  type: DataTypes.BOOLEAN,
  allowNull: false,
},&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위에 코드를 입력하고 isCheck = true, isCheck = false 를 저장해보니, 아래 사진처럼 MySQL 테이블 필드 설정은 TINYINT(1)로 변경되어있는것을 확인했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-03 오후 4.45.11.png&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6awJL/btqz9IZwvWv/2sBwSuaUcTD4KjKpGgIlo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6awJL/btqz9IZwvWv/2sBwSuaUcTD4KjKpGgIlo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6awJL/btqz9IZwvWv/2sBwSuaUcTD4KjKpGgIlo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6awJL%2Fbtqz9IZwvWv%2F2sBwSuaUcTD4KjKpGgIlo0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-03 오후 4.45.11.png&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;199&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-03 오후 4.45.37.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8WMeo/btqAaUrC1PW/g2KpTnyw7j5C9izKW5jKnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8WMeo/btqAaUrC1PW/g2KpTnyw7j5C9izKW5jKnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8WMeo/btqAaUrC1PW/g2KpTnyw7j5C9izKW5jKnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8WMeo%2FbtqAaUrC1PW%2Fg2KpTnyw7j5C9izKW5jKnK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-03 오후 4.45.37.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;46&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클라이언트에 0/1이 아닌, true/false로 보내고 싶다면 어떻게 해야할까?&lt;/p&gt;
&lt;p&gt;정답은 없다.&lt;/p&gt;
&lt;p&gt;아무작업을 하지 않아도 Boolean 타입으로 정의해주었기때문에 true/false로 리턴값을 던지기 때문에 이슈 종료 - 끄읕!!&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>Boolean타입</category>
      <category>JavaScript</category>
      <category>javascript 타입</category>
      <category>MySQL</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>tinyint타입</category>
      <category>데이터타입</category>
      <category>자료구조</category>
      <category>자료형</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/79</guid>
      <comments>https://kkumalog.tistory.com/entry/MySQL-Boolean-vs-tinyint1-value-in-MySQL#entry79comment</comments>
      <pubDate>Tue, 3 Dec 2019 16:57:34 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] How to Generate Random String</title>
      <link>https://kkumalog.tistory.com/entry/JAVA-How-to-Generate-Random-String</link>
      <description>&lt;p&gt;이 페이지는 문자, 숫자 등으로 이루어진 랜덤 문자열을 생성하는 방법을 설명하고 있다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# 랜덤 숫자(난수) 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. java.lang.Math.random() 함수&lt;/b&gt;&lt;br /&gt;Math.random()&amp;nbsp;메서드는&amp;nbsp;0.0&amp;nbsp;과&amp;nbsp;1.0&amp;nbsp;사이의&amp;nbsp;double&amp;nbsp;값을&amp;nbsp;생성하기&amp;nbsp;때문에,&amp;nbsp;정수를&amp;nbsp;얻고&amp;nbsp;싶다면&amp;nbsp;반드시&amp;nbsp;int형으로&amp;nbsp;캐스팅시켜야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1571123257533&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.Math;

double d = Math.random()*10;
System.out.println(&quot;double: &quot; + d); // double: 7.241387938681597

int i = (int)(Math.random()*10);
System.out.println(&quot;int: &quot; +i); // int: 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;2. import java.util.Random 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1571123335142&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Random;

Random rand = new Random();

int i = rand.nextInt(10); // 0~9까지의 정수
System.out.println(&quot;int: &quot; + i); // int: 2

float f = rand.nextFloat(); // 0.0f 에서 1.0f 까지의 실수
System.out.println(&quot;float: &quot; + f); //float: 0.23841155

boolean b = rand.nextBoolean(); // true(참), false(거짓)
System.out.println(&quot;boolean: &quot; + b); // boolean: false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# 랜덤 알파벳 문자 (A-Z, a-z) 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;1. hard coding(bad example)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1571123414486&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Random;

Random rand = new Random();

String abc1 = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;
char uc = abc1.charAt(rand.nextInt(abc1.length())); // 랜덤 대문자
System.out.println(uc); // Y

String abc2 = &quot;abcdefghijklmnopqrstuvwxyz&quot;;
char lc = abc2.charAt(rand.nextInt(abc2.length())); // 랜덤 소문자
System.out.println(lc); // t&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;알파벳은&amp;nbsp;영대문자,&amp;nbsp;영소문자&amp;nbsp;각각&amp;nbsp;26개로&amp;nbsp;확실히&amp;nbsp;정의되어&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;하드코딩으로&amp;nbsp;작업해도&amp;nbsp;무리없이&amp;nbsp;작성할&amp;nbsp;수는&amp;nbsp;있다.&lt;br /&gt;하지만,&amp;nbsp;좋은&amp;nbsp;코드가&amp;nbsp;아니기&amp;nbsp;때문에&amp;nbsp;다른&amp;nbsp;함수나&amp;nbsp;클래스를&amp;nbsp;이용하려한다.&lt;br /&gt;&lt;br /&gt;코딩에&amp;nbsp;앞서&amp;nbsp;아래&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;예시에서&amp;nbsp;사용되는&amp;nbsp;기본적인&amp;nbsp;지식이&amp;nbsp;필요하다.&lt;br /&gt;아스키코드에서&amp;nbsp;영대문자는&amp;nbsp;65-90,&amp;nbsp;영소문자는&amp;nbsp;97-122이다.&lt;br /&gt;26까지의&amp;nbsp;난수를&amp;nbsp;구한&amp;nbsp;후&amp;nbsp;65를&amp;nbsp;더한&amp;nbsp;후&amp;nbsp;대문자를,&amp;nbsp;97을&amp;nbsp;더하면&amp;nbsp;소문자를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;또한,&amp;nbsp;int&amp;nbsp;타입의&amp;nbsp;숫자를&amp;nbsp;char&amp;nbsp;타입으로&amp;nbsp;변환하면&amp;nbsp;ASCII&amp;nbsp;코드&amp;nbsp;문자를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;b&gt;java.lang.Math.random() 함수&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1571124173112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.Math;

char uc = (char)((int)(Math.random()*26+65)); // 랜덤 대문자
System.out.println(uc); // E

char lc = (char)((int)(Math.random()*26+97)); // 랜덤 소문자
System.out.println(lc); // k&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;3.import&amp;nbsp;java.util.Random&amp;nbsp;클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1571124294855&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Random rand = new Random();

char uc = (char)(rand.nextInt(26) + 'A' ); // 랜덤한 대문자
System.out.println(uc); // H

char lc = (char)(rand.nextInt(26) + 'a'); // 랜덤한 소문자
System.out.println(lc); // f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 코드를 사용할 때 주의해야 할 사항은 char 타입으로 처리가 되기 때문에, A와 a는 작은 따옴표로 감싸줘야한다.&lt;/p&gt;
&lt;p&gt;큰 따옴표(&quot;&quot;)는 문자열 String, 작은 따옴표('')는 문자 char 타입이기 때문에 아래 에러를 리턴할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;error: incompatible types: String cannot be converted to char&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고로, char타입의 문자를 string으로 변환하고 싶을때는 String.valueOf(char) 또는 Character.toString(char)를 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1571125273581&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char c = 'a';

String s = Character.toString(c);
System.out.println(s.getClass().getName()); // java.lang.String

String ss = String.valueOf(c);
System.out.println(ss.getClass().getName()); // java.lang.String&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# 영문, 숫자 혼합 랜덤 문자열 생성 예제 (10자리)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1571125496481&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Random;

Random rand = new Random();
StringBuffer sb = new StringBuffer();
for(int i = 0; i &amp;lt; 10; i ++) {
	int index = rand.nextInt(3);
	switch(index) {
		case 0:
			sb.append((char)(rand.nextInt(26) + 97));
			break;
		case 1:
			sb.append((char)(rand.nextInt(26) + 65));
			break;
		case 2:
			sb.append(rand.nextInt(10));
			break;
	}
}
System.out.println(sb); // X36Kq06S0G&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for문을 이용하여 10자리를 생성한다.&lt;/p&gt;
&lt;p&gt;10번을 도는동안 rand.nextInt(3)을 이용해 0, 1, 2 랜덤한 숫자를 출력하고 그에 맞게 대문자, 소문자, 숫자를 차례로 랜덤하게 추가한다.&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>Java</category>
      <category>java random function</category>
      <category>Programming</category>
      <category>random string</category>
      <category>난수 생성</category>
      <category>랜덤 문자열</category>
      <category>자바</category>
      <category>자바 난수 생성</category>
      <category>자바 랜덤 함수</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/77</guid>
      <comments>https://kkumalog.tistory.com/entry/JAVA-How-to-Generate-Random-String#entry77comment</comments>
      <pubDate>Tue, 15 Oct 2019 16:47:06 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 배열 정렬 함수, sort()</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC-%ED%95%A8%EC%88%98-sort</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 페이지는 자바스크립트에서 배열을 정렬할 때 사용하는 내장 함수 sort()에 대해서 설명하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 자바스크립트의 배열에는 정렬하여 반환하는 역할을 하는 sort() 메서드가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1570517223427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr.sort([compareFunction])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 구조를 보면, compareFunction로 정의된 정렬 순서를 통해 arr라는 Array 객체를 정렬하여 반환한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;compareFunction을 생략하면 기본적으로 각 요소의 유니코드 값에 따라 자동으로 정렬된다. (default 오름차순)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;정렬되면서 기존의 배열 데이터가 변경되는 메서드이기 때문에 신중하게 사용해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1570517499329&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// result: ['Dec', 'Feb', 'Jan', 'March']
const numbers = [1, 30, 4, 21, 100000];
numbers.sort();
console.log(numbers);
// result: [1, 100000, 21, 30, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자 정렬은 알파벳 순서대로 잘 정렬이 된 것을 확인할 수 있지만,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;숫자는 ASCII 코드 순서로 정렬하기 떄문에 결과값이 우리가 생각했던 순서로 정렬되지 않음을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음은 위의 오류를 개선하기 위한 코드이다.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) 오름차순&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1570517615934&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers.sort(function(a, b) {
    return a - b;
});
console.log(numbers);
// result: [ 1, 4, 21, 30, 100000 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;2) 내림차순&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1570517886091&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers.sort(function(a, b) {
    return b - a;
});
console.log(numbers);
// result: [ 100000, 30, 21, 4, 1 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당&amp;nbsp;코드들은&amp;nbsp;화살표&amp;nbsp;함수를&amp;nbsp;사용하여 아주아주 짧고&amp;nbsp;간결하게&amp;nbsp;변환&amp;nbsp;가능하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1570518264480&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers.sort((a, b) =&amp;gt; a - b); // 오름차순
numbers.sort((a, b) =&amp;gt; b - a); // 내림차순&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;화살표&amp;nbsp;함수&amp;nbsp;(arrow&amp;nbsp;function&amp;nbsp;expression)&amp;nbsp;in&amp;nbsp;ES6&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1570517962379&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;화살표 함수&quot; data-og-description=&quot;화살표 함수 표현(arrow function expression)은 function 표현에 비해 구문이 짧고 &amp;nbsp;자신의 this, arguments, super 또는 new.target을 바인딩 하지 않습니다. 화살표 함수는 항상 익명입니다. 이 &amp;nbsp;함수 표현은 메소드 함수가 아닌 곳에 가장 적합합니다. 그래서 생성자로서 사용할 수 없습니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cVzwY6/hyC82sA4Uk/FCggjxgg2ZmqBwmGobZCgK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cVzwY6/hyC82sA4Uk/FCggjxgg2ZmqBwmGobZCgK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;화살표 함수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;화살표 함수 표현(arrow function expression)은 function 표현에 비해 구문이 짧고 &amp;nbsp;자신의 this, arguments, super 또는 new.target을 바인딩 하지 않습니다. 화살표 함수는 항상 익명입니다. 이 &amp;nbsp;함수 표현은 메소드 함수가 아닌 곳에 가장 적합합니다. 그래서 생성자로서 사용할 수 없습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;Object 객체를 가진 리스트도 각각의 속성을 기준으로 정렬이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1570518448569&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// value 기준으로 정렬
items.sort(function (a, b) {
  if (a.value &amp;gt; b.value) {
    return 1;
  }
  if (a.value &amp;lt; b.value) {
    return -1;
  }
  // a must be equal to b
  return 0;
});

// name 기준으로 정렬
items.sort(function(a, b) {
  const nameA = a.name.toUpperCase(); // ignore upper and lowercase
  const nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA &amp;lt; nameB) {
    return -1;
  }
  if (nameA &amp;gt; nameB) {
    return 1;
  }

  // 이름이 같을 경우
  return 0;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 코드 또한 화살표함수를 통해 변환이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1570518678966&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// value 기준으로 정렬
items.sort((a, b) =&amp;gt; a.value - b.value);
console.log(items);
/* result:
	[{ name: 'The', value: -12 },
	{ name: 'Magnetic', value: 13 },
	{ name: 'Edward', value: 21 },
	{ name: 'Sharpe', value: 37 },
	{ name: 'Zeros', value: 37 },
	{ name: 'And', value: 45 } ]
*/

// name 기준으로 정렬
items.sort((a, b) =&amp;gt; (a.name &amp;gt; b.name) ? 1 : -1);
console.log(items);
/* result:
[ { name: 'And', value: 45 },
  { name: 'Edward', value: 21 },
  { name: 'Magnetic', value: 13 },
  { name: 'Sharpe', value: 37 },
  { name: 'The', value: -12 },
  { name: 'Zeros', value: 37 } ]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자열이 아닌 숫자를 비교하기 위한 &lt;span style=&quot;color: #000000;&quot;&gt;compareFunction에서는&lt;/span&gt; a에서 b를 뺄 수 있다. (Infinity 및 NaN이 포함되어 있지 않은 경우)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자는 해당 로직이 성립하지 않기 때문에 부등호를 통해 비교하여 1 또는 -1을 리턴했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만약 a.name - b.name같은 형태로 작성한다면 어떻게될까?&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1570519042227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;items.sort((a, b) =&amp;gt; {
    console.log(a.name - b.name);
    return a.name - b.name;
});

/* result:
NaN
NaN
NaN
NaN
NaN
[ { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 } ]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NaN NaN NaN!!!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;에러로 인해 배열의 순서가 변경되지 않고 기존 데이터 그대로 출력된것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <category>compareFunction</category>
      <category>IT</category>
      <category>javascript sort</category>
      <category>javscript</category>
      <category>NAN</category>
      <category>Programming</category>
      <category>reverse</category>
      <category>sort</category>
      <category>sort()</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/76</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC-%ED%95%A8%EC%88%98-sort#entry76comment</comments>
      <pubDate>Tue, 8 Oct 2019 16:51:27 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] Get Orientation Metadata and Rotate Image</title>
      <link>https://kkumalog.tistory.com/entry/JAVA-Get-Orientation-Metadata-and-Rotate-Image</link>
      <description>&lt;p&gt;이&amp;nbsp;페이지에서는&amp;nbsp;사진의&amp;nbsp;메타정보를&amp;nbsp;통해&amp;nbsp;각도를&amp;nbsp;얻어&amp;nbsp;회전시켜주는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;설명하고&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;모바일에서&amp;nbsp;사진을&amp;nbsp;찍어&amp;nbsp;업로드할&amp;nbsp;때,&amp;nbsp;아이폰&amp;nbsp;ios는&amp;nbsp;자동&amp;nbsp;회전을&amp;nbsp;지원하고&amp;nbsp;android는&amp;nbsp;사진이&amp;nbsp;돌아간&amp;nbsp;상태로&amp;nbsp;저장되는&amp;nbsp;이슈가&amp;nbsp;생겼다.&amp;nbsp;이를&amp;nbsp;해결하기&amp;nbsp;위한&amp;nbsp;방법으로&amp;nbsp;&amp;nbsp;이미지의&amp;nbsp;메타정보를&amp;nbsp;통해&amp;nbsp;사진의&amp;nbsp;각도를&amp;nbsp;확인하고&amp;nbsp;그&amp;nbsp;각도에&amp;nbsp;맞게&amp;nbsp;회전시키는&amp;nbsp;방식으로&amp;nbsp;진행하려 한다.&lt;br /&gt;&lt;br /&gt;해당&amp;nbsp;프로젝트에서&amp;nbsp;클라이언트가&amp;nbsp;보내주는&amp;nbsp;이미지&amp;nbsp;타입은&amp;nbsp;MultipartFile이기&amp;nbsp;때문에 편의를 위해 File로&amp;nbsp;변환한&amp;nbsp;후&amp;nbsp;진행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고) 타입 변환 및 userAgent 정보 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kkumalog.tistory.com/74&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1. Converting MultipartFile to File&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1568704370783&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://kkumalog.tistory.com/74&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://kkumalog.tistory.com/74&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnw8KQ/hyCRRSi0pw/3hXie4yi5mW624ItY8g1i1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[JAVA] Converting MultipartFile to File&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;이 페이지에서는 멀티파트파일을 파일객체로 변환하는 방식에 대해 설명하고 있다. # MultipartFile vs File 변환하는 코드 작성에 앞서 두 객체에 대해 간단하게 설명하려한다. 1) MultipartFile 멀티파트파일이..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kkumalog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://kkumalog.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2. Get User Agent And IP Information&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1568704379005&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://kkumalog.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://kkumalog.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PGyaL/hyCR5bWakH/EP20r17tLyKJKD0UkAODUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[JAVA] Get User Agent And IP Information&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;이 페이지에서는 IP, Agent, 브라우저, OS등의 접속자 정보를 가져오는 방법에 대해 설명하고 있다. # IP X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kkumalog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;# 코드 구현&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이슈가 발생한 안드로이드일 때에만&amp;nbsp;회전 로직을&amp;nbsp;수행하게&amp;nbsp;한다.&lt;br /&gt;(마지막에&amp;nbsp;ImageIO.write 이용해&amp;nbsp;BufferedImage를&amp;nbsp;File객체로&amp;nbsp;변환하여&amp;nbsp;반환하는&amp;nbsp;부분에서&amp;nbsp;gif는 오류가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;예외처리를&amp;nbsp;해주었다)&lt;/p&gt;
&lt;p&gt;이 로직을 완료한 후 리턴된 결과값 fileData를 원하는 곳에 활용하면된다.&lt;/p&gt;
&lt;pre id=&quot;code_1568705201052&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;File fileData = convert(file);
String origin = fileData.getName();
if (request.getHeader(&quot;User-Agent&quot;).contains(&quot;Android&quot;) &amp;amp;&amp;amp; !origin.substring(origin.lastIndexOf(&quot;.&quot;) + 1).equals(&quot;gif&quot;)) {
	BufferedImage image = checkImage(fileData, getOrientation(fileData));
	ImageIO.write(image,&quot;jpg&quot;, fileData);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;orientation의&amp;nbsp;값으로&amp;nbsp;현재&amp;nbsp;이미지&amp;nbsp;회전&amp;nbsp;상태를&amp;nbsp;확인하고&amp;nbsp;각도에&amp;nbsp;맞는&amp;nbsp;회전을&amp;nbsp;적용시켜준다. (정방향인 1 일때에는 그대로 리턴)&lt;/p&gt;
&lt;p&gt;아래 getOrientation함수에서 리턴하는 integer타입의 결과값을 파라미터로 받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1568704706316&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private BufferedImage checkImage(File file, int orientation) throws Exception {
	BufferedImage bi = ImageIO.read(file);
	if (orientation === 1) { // 정위치
    	return bi;
	} else if (orientation == 6) {
    	return rotateImage(bi, 90);
	} else if (orientation == 3) {
		return rotateImage(bi, 180);
	} else if (orientation == 8) {
		return rotateImage(bi, 270);
	} else{
		return bi;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;아래 함수는 checkImage의 파라미터인 orientation 값을 얻어오는 코드이다.&lt;/p&gt;
&lt;p&gt;먼저&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Metadata를 사용하기 위해서는 pom.xml에 metadata-extractor&amp;nbsp;lib를 추가해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;변환시킨 File객체를 이용해&amp;nbsp;메타데이터를&amp;nbsp;추출하여&amp;nbsp;orientation을&amp;nbsp;반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1568705576668&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
	&amp;lt;groupId&amp;gt;com.drewnoakes&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;metadata-extractor&amp;lt;/artifactId&amp;gt;
	&amp;lt;version&amp;gt;2.12.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568705776060&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int getOrientation(File file) throws Exception {
	int orientation = 1;
	Metadata metadata = ImageMetadataReader.readMetadata(file);
	Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
	if (directory != null) {
		orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
	}
	return orientation;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;아래 함수는 checkImage에서 조건에 맞게 회전 시켜주기 위해 호출하는 코드이다.&lt;/p&gt;
&lt;p&gt;File객체를 BufferedImage로 변환시켜준 후, radians와 함께 파라미터로 받아서 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1568707043539&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private BufferedImage rotateImage (BufferedImage bimage, int radians) {
	BufferedImage newImage;
	if(radians == 90 || radians == 270) {
		newImage = new BufferedImage(bimage.getHeight(),bimage.getWidth(),bimage.getType());
	} else if (radians==180){
		newImage = new BufferedImage(bimage.getWidth(),bimage.getHeight(),bimage.getType());
 	} else{
		return orgImage;
	}
	Graphics2D graphics = (Graphics2D) newImage.getGraphics();
	graphics.rotate(Math.toRadians(radians), newImage.getWidth() / 2, newImage.getHeight() / 2);
	graphics.translate((newImage.getWidth() - bimage.getWidth()) / 2, (newImage.getHeight() - bimage.getHeight()) / 2);
	graphics.drawImage(bimage, 0, 0, bimage.getWidth(), bimage.getHeight(), null);

	return newImage;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>java 이미지 업로드</category>
      <category>java 이미지 회전</category>
      <category>metadata orientation</category>
      <category>Programming</category>
      <category>메타데이터</category>
      <category>모바일 이미지 오류</category>
      <category>이미지회전</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/75</guid>
      <comments>https://kkumalog.tistory.com/entry/JAVA-Get-Orientation-Metadata-and-Rotate-Image#entry75comment</comments>
      <pubDate>Wed, 18 Sep 2019 08:24:37 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] Converting MultipartFile to File</title>
      <link>https://kkumalog.tistory.com/entry/JAVA-Converting-MultipartFile-to-File</link>
      <description>&lt;p&gt;이 페이지에서는 멀티파트파일을 파일객체로 변환하는 방식에 대해 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;# MultipartFile vs File&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;변환하는 코드 작성에 앞서 두 객체에 대해 간단하게 설명하려한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) MultipartFile&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;멀티파트파일이란,&amp;nbsp;사용자가&amp;nbsp;업로드한&amp;nbsp;File을&amp;nbsp;핸들러에서&amp;nbsp;손쉽게&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;도와주는 매개변수&amp;nbsp;중&amp;nbsp;하나이다.&lt;br /&gt;매개변수를&amp;nbsp;사용하기&amp;nbsp;위해서는&amp;nbsp;MultipartResolver&amp;nbsp;Bean이&amp;nbsp;등록되어 있어야 한다. 이는 springBoot에서는 자동 등록을 지원하지만, springMVC에서&amp;nbsp;기본으로&amp;nbsp;등록해주지 않으므로 꼭 확인해야한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) File&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;하드디스크에&amp;nbsp;존재하는&amp;nbsp;파일에&amp;nbsp;대한&amp;nbsp;경로&amp;nbsp;또는 참조를&amp;nbsp;추상화한&amp;nbsp;객체로, new File()을 통해 디렉토리를 생성할 수 있다.&lt;/p&gt;
&lt;p&gt;파일객체를 사용한 후에는 반드시 닫아줘야한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;# 코드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) File의 createNewFile()을 이용하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568682581269&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public File convert(MultipartFile mfile) {
	File file = new File(mfile.getOriginalFilename());
	file.createNewFile();
	FileOutputStream fos = new FileOutputStream(file);
	fos.write(mfile.getBytes());
	fos.close();
	return file;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) MultipartFile의 transferTo() 메소드를 이용하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568683710809&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public File multipartToFile(MultipartFile mfile) throws IllegalStateException, IOException {
	File file = new File(mfile.getOrigianlFilename());
	mfile.transferTo(file);
	return file()
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Java</category>
      <category>convert</category>
      <category>IT</category>
      <category>Java</category>
      <category>MultipartFile</category>
      <category>Programming</category>
      <category>Spring</category>
      <category>transferTo</category>
      <category>스프링</category>
      <category>자바</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/74</guid>
      <comments>https://kkumalog.tistory.com/entry/JAVA-Converting-MultipartFile-to-File#entry74comment</comments>
      <pubDate>Tue, 17 Sep 2019 11:02:59 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] Get User Agent And IP Information</title>
      <link>https://kkumalog.tistory.com/entry/JAVA-Get-User-Agent-And-IP-Information</link>
      <description>&lt;p&gt;이&amp;nbsp;페이지에서는&amp;nbsp;IP,&amp;nbsp;Agent,&amp;nbsp;브라우저,&amp;nbsp;OS등의&amp;nbsp;접속자&amp;nbsp;정보를&amp;nbsp;가져오는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;설명하고&amp;nbsp;있다. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;# IP&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;X-Forwarded-For&lt;span&gt;&amp;nbsp;&lt;/span&gt;(XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준이다.&lt;/p&gt;
&lt;p&gt;(X-Forwarded-For&lt;span&gt;&amp;nbsp;&lt;/span&gt;은 이메일 메시지가 다른 계정으로부터 포워딩되었음을 나타내는 이메일 헤더이기도 하다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;XFF를 사실상의 표준이라고 표현하는 이유는, 정식 RFC 에 포함된게 아니어서 다른 헤더를 사용하는 경우가 있기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 WebServer, WAS, L4, proxy 종류에 상관없이 원하는 client IP를 가져오게 하려면 먼저 해당 헤더가 있는지 확인하는 방식을 추가하여 아래와 같은 방식으로 코드를 작성해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568547744249&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String ip = request.getHeader(&quot;X-FORWARDED-FOR&quot;); 
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader(&quot;Proxy-Client-IP&quot;); 
}
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader(&quot;WL-Proxy-Client-IP&quot;);
}
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader(&quot;HTTP_CLIENT_IP&quot;);
}
if (ip == null || ip.length() == 0) { 
	ip = request.getRemoteAddr(); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 사이트 - mozilla&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1568547347612&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e1gvg/hyCP4jYIC4/znyMkiYVHjq1eJo1L5Qyx0/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;X-Forwarded-For&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준 헤더다. 클라이언트와 서버 중간에서 트래픽이 프록시나 로드 밸런서를 거치면, 서버 접근 로그에는 프록시나 로드 밸런서의 IP 주소만을 담고 있다.&amp;nbsp;클라이언트의 원 IP 주소를 보기위해 X-Forwarded-For&amp;nbsp;요청 헤더가 사용된다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;# User Agent&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;사용자 에이전트란, 사용자를 대신하여 일을 수행하는 소프트웨어 에이전트로서 세션 개시 프로토콜에서는 통신 세션 양 쪽 끝을 말한다.&lt;/p&gt;
&lt;p&gt;소프트웨어 에이전트가 네트워크 프로토콜 안에서 동작할 때, 식별 문자열을 피어에 제출함으로써 애플리케이션 유형, 운영체제, 소프트웨어 업체, 리비전을 식별할 수 있다. [출처 - 위키백과]&lt;/p&gt;
&lt;pre id=&quot;code_1568549410605&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String agent = request.getHeader(&quot;User-Agent&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위에서 언급한 것처럼 사용자 에이전트를 통해 브라우저, 운영체제를 식별 할 수 있다. 원하는 항목이 포함되어 있는지 체크하는 방식으로 코드를 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) browser&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568549806412&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String brower = null; 

if (agent != null) { 
 if (agent.indexOf(&quot;Trident&quot;) &amp;gt; -1) { 
	brower = &quot;MSIE&quot;; 
} else if (agent.indexOf(&quot;Chrome&quot;) &amp;gt; -1) { 
	brower = &quot;Chrome&quot;; 
} else if (agent.indexOf(&quot;Opera&quot;) &amp;gt; -1) { 
	brower = &quot;Opera&quot;; 
} else if (agent.indexOf(&quot;iPhone&quot;) &amp;gt; -1 &amp;amp;&amp;amp; agent.indexOf(&quot;Mobile&quot;) &amp;gt; -1) { 
	brower = &quot;iPhone&quot;; 
} else if (agent.indexOf(&quot;Android&quot;) &amp;gt; -1 &amp;amp;&amp;amp; agent.indexOf(&quot;Mobile&quot;) &amp;gt; -1) { 
	brower = &quot;Android&quot;; 
} &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;2) OS&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568550604561&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String os = null; 

if(agent.indexOf(&quot;NT 6.0&quot;) != -1) os = &quot;Windows Vista/Server 2008&quot;; 
else if(agent.indexOf(&quot;NT 5.2&quot;) != -1) os = &quot;Windows Server 2003&quot;; 
else if(agent.indexOf(&quot;NT 5.1&quot;) != -1) os = &quot;Windows XP&quot;; 
else if(agent.indexOf(&quot;NT 5.0&quot;) != -1) os = &quot;Windows 2000&quot;; 
else if(agent.indexOf(&quot;NT&quot;) != -1) os = &quot;Windows NT&quot;; 
else if(agent.indexOf(&quot;9x 4.90&quot;) != -1) os = &quot;Windows Me&quot;; 
else if(agent.indexOf(&quot;98&quot;) != -1) os = &quot;Windows 98&quot;; 
else if(agent.indexOf(&quot;95&quot;) != -1) os = &quot;Windows 95&quot;; 
else if(agent.indexOf(&quot;Win16&quot;) != -1) os = &quot;Windows 3.x&quot;; 
else if(agent.indexOf(&quot;Windows&quot;) != -1) os = &quot;Windows&quot;; 
else if(agent.indexOf(&quot;Linux&quot;) != -1) os = &quot;Linux&quot;; 
else if(agent.indexOf(&quot;Macintosh&quot;) != -1) os = &quot;Macintosh&quot;; 
else os = &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) mobile OS&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1568550955160&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] mobileos = {&quot;iPhone&quot;, &quot;iPod&quot;, &quot;Android&quot;, &quot;BlackBerry&quot;, &quot;Windows CE&quot;, &quot;Nokia&quot;, &quot;Webos&quot;, &quot;Opera Mini&quot;, &quot;SonyEricsson&quot;, &quot;Opera Mobi&quot;, &quot;IEMobile&quot;};

if (agent != null &amp;amp;&amp;amp; !agent.equals(&quot;&quot;)) {
	for(int i = 0; i &amp;lt; mobileos.length; i++) {
		if (agent.indexOf(mobileos[i]) &amp;gt; -1) {
			System.out.println(mobileos[i]);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Java</category>
      <category>Client IP</category>
      <category>ip가져오기</category>
      <category>IT</category>
      <category>Java</category>
      <category>Mozilla</category>
      <category>os 가져오기</category>
      <category>Programming</category>
      <category>User Agent</category>
      <category>자바</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/73</guid>
      <comments>https://kkumalog.tistory.com/entry/JAVA-Get-User-Agent-And-IP-Information#entry73comment</comments>
      <pubDate>Sun, 15 Sep 2019 21:44:57 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] Hoisting</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript-1</link>
      <description>&lt;p&gt;이 페이지에서는 자바스크립트의 호이스팅의 정의와 예시를 설명하고 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;hoist: 들어올리다, 끌어올리다&lt;/blockquote&gt;
&lt;p&gt;Hoisting(호이스팅)이란, 변수의 사용 및 함수의 실행 코드가 선언보다 먼저 일어나도 정상 진행이 되도록 하는 것.&lt;/p&gt;
&lt;p&gt;(흔히 선언코드가 끌어올려진다고 표현하지만, 실제 메모리에는 변화가 없다.)&lt;/p&gt;
&lt;p&gt;함수선언식만 호이스팅이 일어난다. 함수표현식은 NONO!&lt;/p&gt;
&lt;p&gt;할당구문은 런타임 과정에서 이루어지기 때문에 호이스팅되지않는다 -&amp;nbsp; 함수를 끌어올리지만 변수의 값은 끌어올리지않는다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;+ 함수선언식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1566191217508&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function foo() {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;+ 함수표현식 / 함수할당식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1566191322281&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var foo = function() {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;user-content-예제1&quot; href=&quot;https://github.com/lee-sohyun/Javascript/blob/master/Chapter02%20-%20Hoisting.md#%EC%98%88%EC%A0%9C1&quot;&gt;&lt;/a&gt;&lt;b&gt;# 예제1.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1566191401362&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Name(&quot;sohyun&quot;);

function Name(name) {
  console.log(&quot;My name is &quot; + name);
}

// 결과: &quot;My name is sohyun&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 예제2.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1566192356478&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = 6;
num + 7;
var num;

// 에러가 나지 않는다&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 예제3.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;(초기화가 아닌 선언만 끌어올린다. 만약 변수를 선언한 뒤에 나중에 초기화시켜 사용한다면, 그 값은 undefined.)&lt;/p&gt;
&lt;pre id=&quot;code_1566192471480&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = 1;
console.log(a + ' , ' + b); // '1 , undefined'
var b = 2;
console.log(a + ' , ' + b); // '1 , 2'

// 위의 코드는 아래와 같은 방식으로 동작합니다.
var a; // a 변수 선언
a = 1; // a 변수에 1 할당
var b; // b 변수 선언
console.log(a + ' , ' + b); // '1 , undefined'
b = 2; // b 변수에 2 할당
console.log(a + ' , ' + b); // '1 , 2'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 예제4.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1566192564689&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 실행 전
logMessage();
sumNumbers();
function logMessage() {
  return 'worked';
}

var sumNumbers = function () {
  return 10 + 20;
};

호이스팅에 의해 자바스크립트 해석기는 코드를 아래와 같이 인식한다.
// 실행 시
function logMessage() {
  return 'worked';
}

var sumNumbers;

logMessage(); // 'worked'
sumNumbers(); // Uncaught TypeError: sumNumbers is not a function

sumNumbers = function () {
  return 10 + 20;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드의 가독성과 유지보수를 위해 호이스팅이 일어나지 않도록 하는게 좋다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <category>Hoisting</category>
      <category>IT</category>
      <category>JavaScript</category>
      <category>Programming</category>
      <category>변수선언</category>
      <category>자바스크립트</category>
      <category>프로그래밍</category>
      <category>함수선언식</category>
      <category>함수표현식</category>
      <category>호이스팅</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/72</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript-1#entry72comment</comments>
      <pubDate>Mon, 19 Aug 2019 14:32:21 +0900</pubDate>
    </item>
    <item>
      <title>[IT] Naming Convention</title>
      <link>https://kkumalog.tistory.com/entry/%E3%85%A3</link>
      <description>&lt;p&gt;이 페이지에서는 프로그래밍에서 사용하는 변수 명명 규칙에 대해 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Naming Convention 이란, 변수명을 지을 때 관례적으로 사용하는 방법이다. 언어마다&amp;nbsp;권장하는&amp;nbsp;표기법이&amp;nbsp;다르고,&amp;nbsp;하나의&amp;nbsp;프로젝트에서&amp;nbsp;케이스를&amp;nbsp;섞어&amp;nbsp;쓰는것은&amp;nbsp;좋은&amp;nbsp;코드가&amp;nbsp;아니라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 카멜&amp;nbsp;표기법&amp;nbsp;(camel&amp;nbsp;case).&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;1)&amp;nbsp;소문자&amp;nbsp;카멜&amp;nbsp;케이스&amp;nbsp;(lower&amp;nbsp;camel&amp;nbsp;case)&lt;br /&gt;보통&amp;nbsp;카멜케이스라고&amp;nbsp;하면&amp;nbsp;소문자&amp;nbsp;카멜&amp;nbsp;표기법을&amp;nbsp;의미한다.&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표기하지만,&amp;nbsp;전체에서의 첫&amp;nbsp;글자는&amp;nbsp;소문자로 표기하여, 단봉낙타 표기법이라고 불리기도 한다.&lt;br /&gt;ex) camelCase,&amp;nbsp;lowerCamelCase&lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;대문자&amp;nbsp;카멜&amp;nbsp;케이스&amp;nbsp;(upper&amp;nbsp;camel&amp;nbsp;case)&amp;nbsp;/&amp;nbsp;파스칼&amp;nbsp;케이스&amp;nbsp;(pascal&amp;nbsp;case)&lt;br /&gt;파스칼&amp;nbsp;케이스는&amp;nbsp;카멜&amp;nbsp;표기법의&amp;nbsp;일부로&amp;nbsp;보기도&amp;nbsp;하고,&amp;nbsp;따로&amp;nbsp;분리된&amp;nbsp;개념으로&amp;nbsp;생각하는&amp;nbsp;경우도&amp;nbsp;있지만 여기서는 일부로 나타낸다.&lt;br /&gt;전체&amp;nbsp;이름의&amp;nbsp;첫&amp;nbsp;글자와&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;문자를&amp;nbsp;대문자로&amp;nbsp;표기하여, 쌍봉낙타 표기법이라고 불리기도 한다.&lt;br /&gt;ex) CamelCase,&amp;nbsp;UpperCamelCase,&amp;nbsp;PascalCase&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;# 스네이크&amp;nbsp;표기법&amp;nbsp;(snake&amp;nbsp;case)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;각&amp;nbsp;단어의&amp;nbsp;사이를&amp;nbsp;&amp;lsquo;_&amp;rsquo;(언더바)로&amp;nbsp;구분하여&amp;nbsp;표기한다.&lt;br /&gt;ex) camel_case,&amp;nbsp;snake_case&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 케밥 케이스 (Kebab case)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;각 단어 사이를 하이픈(붙임표, -)로 구분하여 표기한다.&lt;/p&gt;
&lt;p&gt;ex) kebab-case&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;# 헝가리안&amp;nbsp;표기법&amp;nbsp;(hungarian&amp;nbsp;notation)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이름앞에&amp;nbsp;변수의&amp;nbsp;타입을&amp;nbsp;접두어로&amp;nbsp;넣어주어&amp;nbsp;표기하는데, 접두어의&amp;nbsp;종류에는&amp;nbsp;ch-char,&amp;nbsp;db-double,&amp;nbsp;str-string,&amp;nbsp;b-boolean&amp;nbsp;등이&amp;nbsp;있다.&lt;br /&gt;ex) bCamelCase,&amp;nbsp;strCamelCase&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>IT</category>
      <category>Programming</category>
      <category>네이밍컨벤션</category>
      <category>리팩토링</category>
      <category>변수선언</category>
      <category>스네이크표기법</category>
      <category>카멜표기법</category>
      <category>코드컨벤션</category>
      <category>프로그래밍</category>
      <category>프로그래밍 언어</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/71</guid>
      <comments>https://kkumalog.tistory.com/entry/%E3%85%A3#entry71comment</comments>
      <pubDate>Thu, 8 Aug 2019 08:29:00 +0900</pubDate>
    </item>
    <item>
      <title>[Review] 캐논 인스픽S 포토프린터 (Cannon inspicS ZV-123A)</title>
      <link>https://kkumalog.tistory.com/entry/Review-Cannon</link>
      <description>&lt;p&gt;즉석카메라와 포토프린터의 기능을 모두 갖춘 '인스픽S' 리뷰를 써보려합니다 :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 포토프린터 + 즉석카메라&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;두 가지 기능을 가진 제품의 장점에 대해 먼저 살펴볼까요?&lt;/p&gt;
&lt;p&gt;우선 흔히 폴라로이드라고 말하는 &lt;b&gt;즉석카메라&lt;/b&gt;의 역할로 놓치기 싫은 소중한 순간을 바로 찍어 출력할 수 있고,&lt;/p&gt;
&lt;p&gt;이 기능에 더해진 포토프린터는 블루투스 기능으로 스마트폰 등 다양한 스마트기기의 사진을 원하는 만큼 출력할 수 있죠&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# LG 포켓포토 스냅 즉석카메라 (PC389)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;포토프린터가 너무너무 갖고 싶어서, 요기조기 여러 제품들을 비교한 후 구입하게 되었어요.&lt;/p&gt;
&lt;p&gt;이건 그 중 가장 고민됐던 제품이에요&lt;/p&gt;
&lt;p&gt;포토프린터하면 생각나는 가장 유명한 제품인 LG 포켓포토!&lt;/p&gt;
&lt;p&gt;가장 최신 제품은 '포켓포토 스냅 즉석카메라'입니다. 포켓포토의 스펙을 살펴볼까요?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 가장 마지막에 촬영한 사진의 재프린트 기능&lt;/p&gt;
&lt;p&gt;2. 카메라 자체의 흑백모드 지원 (카메라 셔터버튼을 5초간 누르면 흑백모드 자동전환)&lt;/p&gt;
&lt;p&gt;3. 나만의 스타일로 편집할 수 있는 포켓포토 전용 앱&lt;/p&gt;
&lt;p&gt;4. 변색없는 인화방식 - 긴 보관기간과 방수기능을 갖춘 염료승화방식 인화지&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우와... 스펙이 이렇게 좋은데 왜 선택을 안했냐구요?&lt;/p&gt;
&lt;p&gt;두가지이유때문이죠&lt;/p&gt;
&lt;p&gt;첫번째는 출시년월이 2018년 4월이어서 신상이라기엔 너무 오래됐다는 점.&lt;/p&gt;
&lt;p&gt;두번째는 보관기간입니다.&lt;/p&gt;
&lt;p&gt;'자사실험기준: 물에 닿은 후 5일 이상 경과하여도 변색없음. 앨범에 보관시 최소 5년 이상 변색없이 보관가능' 이라고 설명하고 있습니다. 앨범에 보관해도 5년후엔 변색된다는 걸까요....?&lt;/p&gt;
&lt;p&gt;출시후 5년이 되지않았기때문에 확인이 불가한것도 있지만, 아무리 찾아봐도 실제 제품 설명이 아닌 상업적인 리뷰밖에 안보이더라구요&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;혹시나 아래 캐논 인스픽S 리뷰를 보고도, 포켓포토가 더 끌리신다면 쿠팡에서 구입하는것을 추천합니다!&lt;/p&gt;
&lt;p&gt;본품에 카트리지 36p + 3in1충전케이블 구성으로 짱짱한데,&lt;/p&gt;
&lt;p&gt;쿠팡의 장점은 뭐다? 로켓배송★&lt;/p&gt;
&lt;p&gt;아래 링크를 나눠놓은 이유는 색깔 때문인데요, 블루와 핑크 두가지 색상 선택가능합니다 :)&lt;/p&gt;
&lt;p&gt;제가 비교하고 장바구니에 담아놨던 소듕한 링크에오&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://coupa.ng/bwsBRV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;포켓포토 &amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585491625568&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LG전자 포켓포토스냅 즉석카메라&quot; data-og-description=&quot;COUPANG&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://coupa.ng/bwsBRV&quot; data-og-url=&quot;https://www.coupang.com/vp/products/92527344&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kLeWz/hyFrZ1SW9L/Ejcal2tHDXfc5Q5ZvRTgK0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://coupa.ng/bwsBRV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coupa.ng/bwsBRV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kLeWz/hyFrZ1SW9L/Ejcal2tHDXfc5Q5ZvRTgK0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;LG전자 포켓포토스냅 즉석카메라&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;COUPANG&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 캐논 인스픽S 즉석카메라&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이제 본격적으로 인스픽S의 리뷰를 시작하겠습니다 :)&lt;/p&gt;
&lt;p&gt;아직 사용기간이 짧아서 리뷰라기보다는 개봉기에 가깝겠지만 같이 분석해봅시다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2019년 6월 출시된 인스픽S의 가장 주목할만한 스펙은 네가지인것 같아요!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;첫번째, 휴대성과 디자인.&lt;/p&gt;
&lt;p&gt;17mm의 두께와 188g으로 가벼운 무게로 작은 핸드백에도 쏙 들어가는 사이즈!&lt;/p&gt;
&lt;p&gt;컬러는 블랙과 화이트, 로즈골드 총 3가지 색상으로 다 예쁨★&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두번째, 셀카 특화.&lt;/p&gt;
&lt;p&gt;전면부에 다른 제품에서는 보지못한 큰 거울과 8개의 링 플래시 조명으로 대놓고 셀카에 강하다는걸 보여주고 있죠&lt;/p&gt;
&lt;p&gt;이는 혼자찍는것 뿐아니라 친구들과 함께 찍을 때, 더 빛을 발휘할 것이다&lt;/p&gt;
&lt;p&gt;반짝반짝 눈동자로 생기있는 사진을 찍어봅시다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;세번째, 저장공간.&lt;/p&gt;
&lt;p&gt;마이크로 SD카드를 장착가능하고, 최대 256GB의 대용량을 지원하여 많은 사진 데이터를 저장할 수 있다.&lt;/p&gt;
&lt;p&gt;하지만, 화질은 크게 기대하지 않는게 좋겠죠?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;네번째, 해상도.&lt;/p&gt;
&lt;p&gt;800만화소의 카메라를 탑재하고 있으며, 해상도는 314x600dpi라고 합니다.&lt;/p&gt;
&lt;p&gt;다만 흰색 표현력이 다소 아쉬워, 채도높은 색감을 배경으로 한 사진 결과물이 좋다고 합니다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배터리는 700mAh로 완충시 출력가능한 매수는 25매입니닷&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;비슷한 제품으로는, 즉석카메라의 역할만 하는 캐논사의 인스픽C도 있씁니다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 인스픽S UNBOXING(언박싱)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;저의 사랑 쿠팡의 로켓배송을 통해 주문한 다음날 바로 겟했습니다 힛★&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://coupa.ng/bh72RI&quot;&gt;https://coupa.ng/bh72RI&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1565015841324&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.coupang.com/vp/products/249266240&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://coupa.ng/bh72RI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxZqk8/hyChQ7C4WY/2FrGkNo1bKMFi629MpiGV0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/bby4gz/hyChDHcfBp/4wjUe4cOuDJb4kX4TCkkc0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;캐논 인스픽S 즉석카메라 ZV-123A + 인화지 60p&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;COUPANG&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;방향에 따라 변하는 제품의 모습을 열지 않고도 상자를 통해 미리 볼 수 있는게 눈에 띄네요&lt;/p&gt;
&lt;p&gt;크기는 대략 손바닥보다 조금 큰 정도, 손바닥이 좀 큰 남성분이라면 비슷할 것 같아욧&lt;/p&gt;
&lt;p&gt;이렇듯 아담한 사이즈여서 장난감같은 느낌을 주네요 짱이쁨 죠아죠아!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IyWxK/btqxhLc5jic/2StVZpECRwz7WK0NKkKzX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IyWxK/btqxhLc5jic/2StVZpECRwz7WK0NKkKzX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IyWxK/btqxhLc5jic/2StVZpECRwz7WK0NKkKzX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIyWxK%2FbtqxhLc5jic%2F2StVZpECRwz7WK0NKkKzX1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ti03c/btqxjhWR0N1/o32c3Vi5ryOykeBXgnACKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ti03c/btqxjhWR0N1/o32c3Vi5ryOykeBXgnACKk/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ti03c/btqxjhWR0N1/o32c3Vi5ryOykeBXgnACKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fti03c%2FbtqxjhWR0N1%2Fo32c3Vi5ryOykeBXgnACKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cElm89/btqxj2kC2B5/dMvOjJL1eoP9LeGSr4uo9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cElm89/btqxj2kC2B5/dMvOjJL1eoP9LeGSr4uo9k/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cElm89/btqxj2kC2B5/dMvOjJL1eoP9LeGSr4uo9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcElm89%2Fbtqxj2kC2B5%2FdMvOjJL1eoP9LeGSr4uo9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;20190629_142600.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE7po8/btqxhy5lg1V/h1MyIfYdqvflmwuYMzKOp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE7po8/btqxhy5lg1V/h1MyIfYdqvflmwuYMzKOp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE7po8/btqxhy5lg1V/h1MyIfYdqvflmwuYMzKOp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE7po8%2Fbtqxhy5lg1V%2Fh1MyIfYdqvflmwuYMzKOp0%2Fimg.jpg&quot; data-filename=&quot;20190629_142600.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 구성품은 포토프린터 본품 아래에 숨겨져있답니다&lt;/p&gt;
&lt;p&gt;꼬깃꼬깃 저 안에 '본체 + 스트랩 + 간단매뉴얼 + 설명서 + 충전 USB + 인화지 10매'의 알찬 구성품들이 숨어있었다!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/01ZsZ/btqxgWlQPGd/rsS72ioMqKR0H4FDPUf56K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/01ZsZ/btqxgWlQPGd/rsS72ioMqKR0H4FDPUf56K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/01ZsZ/btqxgWlQPGd/rsS72ioMqKR0H4FDPUf56K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F01ZsZ%2FbtqxgWlQPGd%2FrsS72ioMqKR0H4FDPUf56K%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsVZbQ/btqxhxziW6Z/uli6usFrAuGCrnvviM1KQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsVZbQ/btqxhxziW6Z/uli6usFrAuGCrnvviM1KQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsVZbQ/btqxhxziW6Z/uli6usFrAuGCrnvviM1KQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsVZbQ%2FbtqxhxziW6Z%2Fuli6usFrAuGCrnvviM1KQ1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인스픽은 잉크가 내장된 특수 인화지에 열을 가열하여 인쇄하는 Zink사의 열전사 인쇄용지를 사용한다. 열전사 방식의 인쇄 용지는 출력비용이 염료 승화방식에 비해 저렴하여 더 많이 찍고 뽑을 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p&gt;하지만, 물과 열에 약하니 주의해야하며 인화품질이 조금 떨어진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;+ 저는 보관기간을 늘리기 위해 다이소에서 손코팅지를 사서 보완 작업했습니다★&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQQl0r/btqxhzcRxIw/eZzM8JaeXswAma2zS4CwB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQQl0r/btqxhzcRxIw/eZzM8JaeXswAma2zS4CwB1/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQQl0r/btqxhzcRxIw/eZzM8JaeXswAma2zS4CwB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQQl0r%2FbtqxhzcRxIw%2FeZzM8JaeXswAma2zS4CwB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkEZN/btqxgzxEax6/s073udwXDpWRFZOpETHrc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkEZN/btqxgzxEax6/s073udwXDpWRFZOpETHrc0/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%;&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkEZN/btqxgzxEax6/s073udwXDpWRFZOpETHrc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqkEZN%2FbtqxgzxEax6%2Fs073udwXDpWRFZOpETHrc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;20190629_152703.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEkJrB/btqxdSj94JT/L7Hxh1jihudSB3QAkSzqh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEkJrB/btqxdSj94JT/L7Hxh1jihudSB3QAkSzqh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEkJrB/btqxdSj94JT/L7Hxh1jihudSB3QAkSzqh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEkJrB%2FbtqxdSj94JT%2FL7Hxh1jihudSB3QAkSzqh0%2Fimg.jpg&quot; data-filename=&quot;20190629_152703.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;처음에 신나서 여러장 뽑다보니 기본 10매는 금방이더라구요&lt;/p&gt;
&lt;p&gt;불안한마음에 50매짜리 추가로 왕창 구입했오요&lt;/p&gt;
&lt;p&gt;빨리 받고 싶어서 역시나 쿠팡 로켓배송.....로켓은 사랑입니다♡&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://coupa.ng/bh9ZNw&quot;&gt;https://coupa.ng/bh9ZNw&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1565103825293&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.coupang.com/vp/products/164634540&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://coupa.ng/bh9ZNw&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgJOfH/hyCjLc4YNp/kyexcaFGEEzo5JlsKoN9XK/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230,https://scrap.kakaocdn.net/dn/bYbBHN/hyChHJ72Jx/ayL7LEsRZx44fs1icUMwKk/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;징크 캐논 인스픽 인화지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;COUPANG&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUqMpU/btqxhyZkrEE/OQDcVfIna2zLje0X89GHLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUqMpU/btqxhyZkrEE/OQDcVfIna2zLje0X89GHLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUqMpU/btqxhyZkrEE/OQDcVfIna2zLje0X89GHLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUqMpU%2FbtqxhyZkrEE%2FOQDcVfIna2zLje0X89GHLk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;간단매뉴얼을 살펴볼까요?&lt;/p&gt;
&lt;p&gt;1. 전자제품의 기본인 충전, 초록불이 반짝반짝하게 충전&lt;/p&gt;
&lt;p&gt;2. 파란색 바코드 잉크지가 제품을 향하도록 넣기&lt;/p&gt;
&lt;p&gt;3. 촬영버튼을 이용해 사진을 찍고 출력 or 어플을 이용해 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zHpZg/btqxhLc5j3U/zkKPkBcS0RGEUuQSKvpG5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zHpZg/btqxhLc5j3U/zkKPkBcS0RGEUuQSKvpG5k/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zHpZg/btqxhLc5j3U/zkKPkBcS0RGEUuQSKvpG5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzHpZg%2FbtqxhLc5j3U%2FzkKPkBcS0RGEUuQSKvpG5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HoeU4/btqxhyyh3TS/UHjHVkdJfLHWYWZKgixw2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HoeU4/btqxhyyh3TS/UHjHVkdJfLHWYWZKgixw2k/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HoeU4/btqxhyyh3TS/UHjHVkdJfLHWYWZKgixw2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHoeU4%2Fbtqxhyyh3TS%2FUHjHVkdJfLHWYWZKgixw2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설명서는 영어, 한국어, 중국어로 되어있는데 제품 사용법에 관한 내용은 아니니 자세한 설명은 패스-&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJcN5K/btqxj1zfP2s/eFe2LIiwPeUGaCKKF3mny0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJcN5K/btqxj1zfP2s/eFe2LIiwPeUGaCKKF3mny0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJcN5K/btqxj1zfP2s/eFe2LIiwPeUGaCKKF3mny0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJcN5K%2Fbtqxj1zfP2s%2FeFe2LIiwPeUGaCKKF3mny0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EAYGG/btqxfeNTHZC/JDvfFkQ5qSm2iwS2aFHdnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EAYGG/btqxfeNTHZC/JDvfFkQ5qSm2iwS2aFHdnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EAYGG/btqxfeNTHZC/JDvfFkQ5qSm2iwS2aFHdnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEAYGG%2FbtqxfeNTHZC%2FJDvfFkQ5qSm2iwS2aFHdnk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgeCBj/btqxiNugpJg/eOJLN7NtNLMqYKLBbv8MzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgeCBj/btqxiNugpJg/eOJLN7NtNLMqYKLBbv8MzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgeCBj/btqxiNugpJg/eOJLN7NtNLMqYKLBbv8MzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgeCBj%2FbtqxiNugpJg%2FeOJLN7NtNLMqYKLBbv8MzK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bImk4w/btqxfEr2e5E/6JCkBarxeaawBO8pXY6YtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bImk4w/btqxfEr2e5E/6JCkBarxeaawBO8pXY6YtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bImk4w/btqxfEr2e5E/6JCkBarxeaawBO8pXY6YtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbImk4w%2FbtqxfEr2e5E%2F6JCkBarxeaawBO8pXY6YtK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;본격적으로 본체 탐구 시작!&lt;/p&gt;
&lt;p&gt;시크한 블랙, 깔끔 그자체의 본체가 완전 내스타일★&lt;/p&gt;
&lt;p&gt;가운데에는 둥근 거울이 있고, 그 주변에 LED램프가 켜지는데 이건 셀카를 위한 카메라?!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLqQHG/btqxfeG54Bl/NzXK0uexkRvUvEEkkxOJe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLqQHG/btqxfeG54Bl/NzXK0uexkRvUvEEkkxOJe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLqQHG/btqxfeG54Bl/NzXK0uexkRvUvEEkkxOJe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLqQHG%2FbtqxfeG54Bl%2FNzXK0uexkRvUvEEkkxOJe1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;제품 상단에는 보이는 순서대로 상태표시 LED, 플래시 조절 레버, 전원, 촬영버튼이 있다. 플래시 레버가 있어 플래시 조절이 가능하다는게 특징!&lt;/p&gt;
&lt;p&gt;제품 하단에는 충전단자와 sd카드 삽입하는 곳이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;잠깐! LED 표시방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;흰색 - 출력준비완료&lt;/li&gt;
&lt;li&gt;흰색깜빡임 - 출력중 / 블루스마트시트 진행중 / 펌웨어 업데이트&lt;/li&gt;
&lt;li&gt;빨강 - 제품 온도 높음&lt;/li&gt;
&lt;li&gt;빨강깜빡임 - 용지덮개열림 / 프린트 에러 / 용지없음 / 용지걸림&lt;/li&gt;
&lt;li&gt;빨강&amp;gt;흰색 순환 - 배터리없음&lt;/li&gt;
&lt;li&gt;파랑&amp;gt;파랑깜빡임 순환 - 부팅중&lt;/li&gt;
&lt;li&gt;파랑깜빡임 - 스마트시트 오류&lt;/li&gt;
&lt;li&gt;하늘색 - 제품 온도 낮음&lt;/li&gt;
&lt;li&gt;하늘색깜빡임 - 프린터 헤드 열식힘 중&lt;/li&gt;
&lt;li&gt;자주색 - 저장모드&lt;/li&gt;
&lt;li&gt;자주색깜빡임 - SD카드 오류&lt;/li&gt;
&lt;li&gt;노랑&amp;gt;자주&amp;gt;하늘&amp;gt;흰색 순환 - 프린팅 중&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7w56i/btqxfef0Fi9/TO8V73oEdbh0Y4IL8vi2nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7w56i/btqxfef0Fi9/TO8V73oEdbh0Y4IL8vi2nK/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7w56i/btqxfef0Fi9/TO8V73oEdbh0Y4IL8vi2nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7w56i%2Fbtqxfef0Fi9%2FTO8V73oEdbh0Y4IL8vi2nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lK7Cw/btqxf3ZnNr7/nvSAt2XPXqRMUFAeLLR1RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lK7Cw/btqxf3ZnNr7/nvSAt2XPXqRMUFAeLLR1RK/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lK7Cw/btqxf3ZnNr7/nvSAt2XPXqRMUFAeLLR1RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlK7Cw%2Fbtqxf3ZnNr7%2FnvSAt2XPXqRMUFAeLLR1RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6TT79/btqxhK6g0XD/r8WfanydiqfzSKQNqao300/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6TT79/btqxhK6g0XD/r8WfanydiqfzSKQNqao300/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6TT79/btqxhK6g0XD/r8WfanydiqfzSKQNqao300/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6TT79%2FbtqxhK6g0XD%2Fr8WfanydiqfzSKQNqao300%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;뷰파인더는 광학 뷰파인더로 창이 뚫려있는 형태이며, 위에서 보이는 버튼으로 인화비율을 선택하여 출력할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;20190629_143535.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSNaH4/btqxhKR1Hqw/X8yvXXUE5Z16TL0tgLwHg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSNaH4/btqxhKR1Hqw/X8yvXXUE5Z16TL0tgLwHg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSNaH4/btqxhKR1Hqw/X8yvXXUE5Z16TL0tgLwHg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSNaH4%2FbtqxhKR1Hqw%2FX8yvXXUE5Z16TL0tgLwHg1%2Fimg.jpg&quot; data-filename=&quot;20190629_143535.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 찍은 사진을 기다려봅니다 두근두근&lt;/p&gt;
&lt;p&gt;가장 처음에는 파란 잉크페이지가 나오는데 잘못된게 아니니 조금 더 기다려봅니다!&lt;/p&gt;
&lt;p&gt;출력시간이 생각보다 오래걸려서,&lt;/p&gt;
&lt;p&gt;요리조리 다양한 각도로 찍어보았습니다 히힛&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwvbXE/btqxgXdi3OO/4xOdP0k1hJJnoJcwNl4x1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwvbXE/btqxgXdi3OO/4xOdP0k1hJJnoJcwNl4x1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwvbXE/btqxgXdi3OO/4xOdP0k1hJJnoJcwNl4x1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwvbXE%2FbtqxgXdi3OO%2F4xOdP0k1hJJnoJcwNl4x1k%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bebVYX/btqxeKlUs1I/YKKNY1eaqPpKkkI4ED5Qkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bebVYX/btqxeKlUs1I/YKKNY1eaqPpKkkI4ED5Qkk/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1500&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bebVYX/btqxeKlUs1I/YKKNY1eaqPpKkkI4ED5Qkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbebVYX%2FbtqxeKlUs1I%2FYKKNY1eaqPpKkkI4ED5Qkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN7jtb/btqxfElhoRA/p5u1qT2MH8HCatKqslzQVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN7jtb/btqxfElhoRA/p5u1qT2MH8HCatKqslzQVK/img.png&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4193%;&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN7jtb/btqxfElhoRA/p5u1qT2MH8HCatKqslzQVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN7jtb%2FbtqxfElhoRA%2Fp5u1qT2MH8HCatKqslzQVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zn1wB/btqxgWMXsGR/SQHBjckJs63CdHf1mRTvs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zn1wB/btqxgWMXsGR/SQHBjckJs63CdHf1mRTvs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zn1wB/btqxgWMXsGR/SQHBjckJs63CdHf1mRTvs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZn1wB%2FbtqxgWMXsGR%2FSQHBjckJs63CdHf1mRTvs1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;제가 가장 먼저 뽑은 사진은 부모님 사진이에요&lt;/p&gt;
&lt;p&gt;포토프린터를 사고 싶었던 이유가 부모님사진을 많이 남겨드리고 싶어서였거든요 :)&lt;/p&gt;
&lt;p&gt;사진이 엄청 선명하지는 않지만, 추억을 기록하기엔 충분한거 같네요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cduWKz/btqxhx6x3Wq/8R1FZLHJXFf5hjsmGOdHr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cduWKz/btqxhx6x3Wq/8R1FZLHJXFf5hjsmGOdHr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cduWKz/btqxhx6x3Wq/8R1FZLHJXFf5hjsmGOdHr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcduWKz%2Fbtqxhx6x3Wq%2F8R1FZLHJXFf5hjsmGOdHr1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkaE1/btqxgWFrYk4/fnkv12SSeCdEhNc7lqhE80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkaE1/btqxgWFrYk4/fnkv12SSeCdEhNc7lqhE80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkaE1/btqxgWFrYk4/fnkv12SSeCdEhNc7lqhE80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkaE1%2FbtqxgWFrYk4%2Ffnkv12SSeCdEhNc7lqhE80%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1735&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 모바일 앱과 기기 연결&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;구글 플레이스토어 또는 애플 앱스토어에서 'Cannon Mini Print'를 설치하여 사용하도록 하겠씁니다&lt;/p&gt;
&lt;p&gt;그림으로 구성되어있어서 사용하는게 전혀 어렵지 않아요!&lt;/p&gt;
&lt;p&gt;+ 참고로 어플에서 셀프타이머, 원격촬영, 자동꺼짐기능을 제공합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;1519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmADvU/btqxhx0qFkY/UihGLGfRkSHoFdNIRu27C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmADvU/btqxhx0qFkY/UihGLGfRkSHoFdNIRu27C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmADvU/btqxhx0qFkY/UihGLGfRkSHoFdNIRu27C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmADvU%2Fbtqxhx0qFkY%2FUihGLGfRkSHoFdNIRu27C1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;1519&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;어플을 실행하면 아래처럼 간단한 설명을 다시 만날 수 있어요&lt;/p&gt;
&lt;p&gt;프린터 본체 충전, 전원켜기, 용지 공급, 블루투스로 프린터 연결 등 주요한 사용설명서이니 건너뛰지않고 읽는것을 추천합니다!&lt;/p&gt;
&lt;p&gt;기본 사진을 출력할 수도 있지만, 어플로 스티커 및 프레임 기능으로 꾸미거나 크기조절 해서 출력할 수 있어서 죠아요☆&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulll2/btqxfeG1nDQ/GH6avX8aKYw1VxgokK4atK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulll2/btqxfeG1nDQ/GH6avX8aKYw1VxgokK4atK/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143911_Mini Print.jpg&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulll2/btqxfeG1nDQ/GH6avX8aKYw1VxgokK4atK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fulll2%2FbtqxfeG1nDQ%2FGH6avX8aKYw1VxgokK4atK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykUpu/btqxf3Zjpvq/ktTMZ5llHQ5agjZAUn2k8K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykUpu/btqxf3Zjpvq/ktTMZ5llHQ5agjZAUn2k8K/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143916_Mini Print.jpg&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykUpu/btqxf3Zjpvq/ktTMZ5llHQ5agjZAUn2k8K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykUpu%2Fbtqxf3Zjpvq%2FktTMZ5llHQ5agjZAUn2k8K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5cpYT/btqxdRFzhCr/K7IOFgUSzlpoQQXd2utaj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5cpYT/btqxdRFzhCr/K7IOFgUSzlpoQQXd2utaj0/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143920_Mini Print.jpg&quot; style=&quot;width: 32.559%;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5cpYT/btqxdRFzhCr/K7IOFgUSzlpoQQXd2utaj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5cpYT%2FbtqxdRFzhCr%2FK7IOFgUSzlpoQQXd2utaj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHRgEc/btqxdRrZYLg/xGVCk7dXi1nVYLn21E5PT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHRgEc/btqxdRrZYLg/xGVCk7dXi1nVYLn21E5PT1/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143925_Mini Print.jpg&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHRgEc/btqxdRrZYLg/xGVCk7dXi1nVYLn21E5PT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHRgEc%2FbtqxdRrZYLg%2FxGVCk7dXi1nVYLn21E5PT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRjrJ/btqxdqg2WYV/Rsw15V3GpSn2a5FFWRlGZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRjrJ/btqxdqg2WYV/Rsw15V3GpSn2a5FFWRlGZ0/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143930_Mini Print.jpg&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRjrJ/btqxdqg2WYV/Rsw15V3GpSn2a5FFWRlGZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRjrJ%2Fbtqxdqg2WYV%2FRsw15V3GpSn2a5FFWRlGZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbQ7u5/btqxhziS5Sj/HMZGKnxuGAYuufRRLQfuj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbQ7u5/btqxhziS5Sj/HMZGKnxuGAYuufRRLQfuj0/img.jpg&quot; data-filename=&quot;Screenshot_20190629-143938_Mini Print.jpg&quot; style=&quot;width: 32.559%;&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;2960&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbQ7u5/btqxhziS5Sj/HMZGKnxuGAYuufRRLQfuj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbQ7u5%2FbtqxhziS5Sj%2FHMZGKnxuGAYuufRRLQfuj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;2960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;오른쪽 상단에 표시되는게 블루투스 설정입니다.&lt;/p&gt;
&lt;p&gt;연결이 됐을때는 아래의 화면처럼 배터리 잔량 표시 모양으로 변해요&lt;/p&gt;
&lt;p&gt;+ 참고로, 제 기기를 블루투스 연결했을때의 이름은&lt;b&gt; 'Cannon (EA:02) Instant Camera'&lt;/b&gt; 입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOdSA/btqxiMWqHoL/xYdKGLnH0QmxhfTTd1YQdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOdSA/btqxiMWqHoL/xYdKGLnH0QmxhfTTd1YQdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOdSA/btqxiMWqHoL/xYdKGLnH0QmxhfTTd1YQdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOdSA%2FbtqxiMWqHoL%2FxYdKGLnH0QmxhfTTd1YQdk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;블루투스 연결상태확인하고, 대기목록 생성하고 인쇄하면 끝!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdWSLK/btqxfd2tTyM/jakkgLrFNXdLQ9dxeQVfV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdWSLK/btqxfd2tTyM/jakkgLrFNXdLQ9dxeQVfV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdWSLK/btqxfd2tTyM/jakkgLrFNXdLQ9dxeQVfV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdWSLK%2Fbtqxfd2tTyM%2FjakkgLrFNXdLQ9dxeQVfV1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이만 개봉기 및 리뷰를 마치겠습니다 :)&lt;/p&gt;</description>
      <category>Others</category>
      <category>LG포켓포토</category>
      <category>인스픽s</category>
      <category>인화지</category>
      <category>제품리뷰</category>
      <category>즉석카메라</category>
      <category>카메라추천</category>
      <category>캐논</category>
      <category>포켓포토</category>
      <category>포토프린터</category>
      <category>폴라로이드</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/68</guid>
      <comments>https://kkumalog.tistory.com/entry/Review-Cannon#entry68comment</comments>
      <pubDate>Wed, 7 Aug 2019 08:29:14 +0900</pubDate>
    </item>
    <item>
      <title>[MAC] Microsoft Remote Desktop 10</title>
      <link>https://kkumalog.tistory.com/entry/k</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이&amp;nbsp;페이지는&amp;nbsp;맥에서&amp;nbsp;윈도우&amp;nbsp;환경에&amp;nbsp;원격&amp;nbsp;데스크톱&amp;nbsp;연결하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;설명하고&amp;nbsp;있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맥북,&amp;nbsp;아이맥&amp;nbsp;등&amp;nbsp;맥을&amp;nbsp;사용하고는&amp;nbsp;있지만&amp;nbsp;맥에서는&amp;nbsp;처리하지&amp;nbsp;못하는&amp;nbsp;일들이&amp;nbsp;있어&amp;nbsp;종종&amp;nbsp;리모트로&amp;nbsp;Windows&amp;nbsp;OS&amp;nbsp;환경을&amp;nbsp;사용해야&amp;nbsp;되는&amp;nbsp;경우를&amp;nbsp;대비해&amp;nbsp;알아&amp;nbsp;두면&amp;nbsp;좋을&amp;nbsp;것&amp;nbsp;같다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우선,&amp;nbsp;원격&amp;nbsp;데스크톱을&amp;nbsp;사용하면&amp;nbsp;나타나는&amp;nbsp;장점과&amp;nbsp;단점에&amp;nbsp;대해&amp;nbsp;먼저&amp;nbsp;확인해&amp;nbsp;볼&amp;nbsp;필요가&amp;nbsp;있다.&amp;nbsp;원격을&amp;nbsp;이용해&amp;nbsp;윈도우를&amp;nbsp;사용하면&amp;nbsp;별도의&amp;nbsp;윈도우를&amp;nbsp;맥에&amp;nbsp;설치하지&amp;nbsp;않아도&amp;nbsp;되는&amp;nbsp;장점이&amp;nbsp;있지만,&amp;nbsp;&amp;nbsp;별도의&amp;nbsp;윈도우&amp;nbsp;PC를&amp;nbsp;가지고&amp;nbsp;있어야&amp;nbsp;하며&amp;nbsp;그&amp;nbsp;PC는&amp;nbsp;항상&amp;nbsp;켜있는&amp;nbsp;상태여야&amp;nbsp;하는&amp;nbsp;단점도&amp;nbsp;존재한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;본격적으로&amp;nbsp;실행방법에&amp;nbsp;대해&amp;nbsp;설명하려한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;App&amp;nbsp;Store를&amp;nbsp;통해&amp;nbsp;Microsoft사의&amp;nbsp;&amp;lsquo;Microsoft&amp;nbsp;Remote&amp;nbsp;Desktop&amp;nbsp;10&amp;rsquo;&amp;nbsp;무료&amp;nbsp;앱을&amp;nbsp;다운받아&amp;nbsp;설치한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당&amp;nbsp;프로그램은&amp;nbsp;해상도&amp;nbsp;및&amp;nbsp;CPU&amp;nbsp;점유율&amp;nbsp;등&amp;nbsp;이슈가&amp;nbsp;있지만,&amp;nbsp;4점이상으로&amp;nbsp;꾸준히&amp;nbsp;유지하고&amp;nbsp;있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;현재&amp;nbsp;버전&amp;nbsp;10.2.13으로&amp;nbsp;3개월전&amp;nbsp;업데이트가&amp;nbsp;된&amp;nbsp;아이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.04.45.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDtA0D/btqw8BI8L4d/jn3VIwaXEs2YvPq1OpoEik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDtA0D/btqw8BI8L4d/jn3VIwaXEs2YvPq1OpoEik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDtA0D/btqw8BI8L4d/jn3VIwaXEs2YvPq1OpoEik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDtA0D%2Fbtqw8BI8L4d%2Fjn3VIwaXEs2YvPq1OpoEik%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.04.45.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로그램을&amp;nbsp;실행하면&amp;nbsp;아무것도&amp;nbsp;없어서&amp;nbsp;리스트가&amp;nbsp;텅텅비어있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;+버튼에서,&amp;nbsp;Desktop을&amp;nbsp;선택하여&amp;nbsp;누르고&amp;nbsp;리모트&amp;nbsp;접속할&amp;nbsp;원격&amp;nbsp;컴퓨터를&amp;nbsp;추가한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PC&amp;nbsp;name에는&amp;nbsp;placeholder로&amp;nbsp;나타나있는&amp;nbsp;것처럼,&amp;nbsp;&amp;lsquo;Host&amp;nbsp;name&amp;nbsp;or&amp;nbsp;IP&amp;nbsp;Address&amp;rsquo;를&amp;nbsp;입력한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래의&amp;nbsp;설정들은&amp;nbsp;본인의&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;선택하면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.05.49.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPTQce/btqw86Ccya4/SdNBFhP5y0ErkNdiwBmEdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPTQce/btqw86Ccya4/SdNBFhP5y0ErkNdiwBmEdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPTQce/btqw86Ccya4/SdNBFhP5y0ErkNdiwBmEdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPTQce%2Fbtqw86Ccya4%2FSdNBFhP5y0ErkNdiwBmEdK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.05.49.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추가한 항목을 리스트에서 선택하여 connect 또는 클릭하면,&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;화면이&amp;nbsp;뜬다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;접속하고자&amp;nbsp;하는&amp;nbsp;IP의&amp;nbsp;로그인&amp;nbsp;계정(Microsoft&amp;nbsp;계정)을&amp;nbsp;입력하라는&amp;nbsp;것이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;입력한&amp;nbsp;후&amp;nbsp;continue&amp;nbsp;버튼을&amp;nbsp;누르면&amp;nbsp;접속&amp;nbsp;완료!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.06.23.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PpvMo/btqxcNBqYCM/0AKuynjknWqobePFwXKKbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PpvMo/btqxcNBqYCM/0AKuynjknWqobePFwXKKbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PpvMo/btqxcNBqYCM/0AKuynjknWqobePFwXKKbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPpvMo%2FbtqxcNBqYCM%2F0AKuynjknWqobePFwXKKbk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-11 오전 11.06.23.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>app store 추천</category>
      <category>Mac</category>
      <category>Macbook pro</category>
      <category>microsoft계정</category>
      <category>remote desktop</category>
      <category>windows10</category>
      <category>맥북 원격데스크톱</category>
      <category>맥북프로</category>
      <category>원격 네트워크</category>
      <category>원격데스크톱</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/70</guid>
      <comments>https://kkumalog.tistory.com/entry/k#entry70comment</comments>
      <pubDate>Tue, 6 Aug 2019 20:24:28 +0900</pubDate>
    </item>
    <item>
      <title>[Instagram] Customizing Instagram Font</title>
      <link>https://kkumalog.tistory.com/entry/Instagram-Customizing-Instagram-Font</link>
      <description>&lt;p&gt;이 페이지는 인스타그램에서 폰트(글씨체)를 변경하는 방법을 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;요즘 인스타그램이나 유튜브같은 SNS를 안하는 사람이 없을 정도인데요,&lt;/p&gt;
&lt;p&gt;그 중 인스타그램 프로필에서 종종 보이는 귀여운 영문 폰트 쓰는법을 알려드릴게용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;'영문 폰트가 거기서 거기지, 뭐가 달라?' 하시는 분들도 있겠죠&lt;/p&gt;
&lt;p&gt;인스타그램에서 다른 사람들의 프로필을 보면 기본적으로 쓰는 영어 폰트가 아닌게 많이 보여요&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 바꾸는 방법에는 어플도 있지만!!&lt;/p&gt;
&lt;p&gt;설치가 필요없는 무료 웹사이트들도 많다는거★★&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 수많은 웹사이트들 중에서 제가 사용하는 사이트 두 군데를 소개시켜드릴게요&lt;/p&gt;
&lt;p&gt;제가 두 군데를 사용하는 이유는, 글꼴이 다른 몇개가 있어서 비교하며 사용하기 위해서 입니다 :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. Sprezz Keyboard&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sprezzkeyboard.com/&quot;&gt;https://www.sprezzkeyboard.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1563927931737&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;http://www.SprezzKeyboard.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.sprezzkeyboard.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Sprezz Keyboard&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Custom Keyboard Fonts &amp;amp; Themes for iOS8&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.sprezzkeyboard.com:443&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.25.23.png&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNJZCz/btqwYiiPiXz/KBS5XQqec4llq1leQt8ZF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNJZCz/btqwYiiPiXz/KBS5XQqec4llq1leQt8ZF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNJZCz/btqwYiiPiXz/KBS5XQqec4llq1leQt8ZF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNJZCz%2FbtqwYiiPiXz%2FKBS5XQqec4llq1leQt8ZF0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.25.23.png&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;941&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;'Enter text to stylize...' 부분에 원하는 문구를 써주면 완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.27.00.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TG4p5/btqwZZo1mWY/PTfXnQFPN7rb4HxtnwIdu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TG4p5/btqwZZo1mWY/PTfXnQFPN7rb4HxtnwIdu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TG4p5/btqwZZo1mWY/PTfXnQFPN7rb4HxtnwIdu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTG4p5%2FbtqwZZo1mWY%2FPTfXnQFPN7rb4HxtnwIdu1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.27.00.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;395&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아래쪽 폰트 리스트에서 텍스트를 드래그해서 복붙해서 원하는 곳에 사용하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. LingoJam - Discord Fonts&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lingojam.com/DiscordFonts&quot;&gt;https://lingojam.com/DiscordFonts&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1563928069857&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://lingojam.com/DiscordFonts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://lingojam.com/DiscordFonts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u5gpy/hyB6UoMnUq/K7jpPQSLPBmCbpDCoubtg1/img.png?width=789&amp;amp;height=535&amp;amp;face=0_0_789_535');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Discord Fonts (     ) ― LingoJam&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Welcome! This page allows you to generate Discord fonts that you can use in your chats. Discord doesn't allow you to change the font by default, but using this generator you can get around that so that you can post more than just bold and underlined text i&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;lingojam.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.28.53.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZLJDX/btqw0nC0Y6b/yifB9SCI8TQUfwKpe0K5v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZLJDX/btqw0nC0Y6b/yifB9SCI8TQUfwKpe0K5v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZLJDX/btqw0nC0Y6b/yifB9SCI8TQUfwKpe0K5v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZLJDX%2Fbtqw0nC0Y6b%2FyifB9SCI8TQUfwKpe0K5v1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.28.53.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;665&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;'Normal text goes here...' 부분에 원하는 문구를 써주면 완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.29.05.png&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zw5P9/btqw0a4VMxb/cv0P4D44cbnhcXpGbtC2kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zw5P9/btqw0a4VMxb/cv0P4D44cbnhcXpGbtC2kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zw5P9/btqw0a4VMxb/cv0P4D44cbnhcXpGbtC2kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzw5P9%2Fbtqw0a4VMxb%2Fcv0P4D44cbnhcXpGbtC2kk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-24 오전 9.29.05.png&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;605&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;마찬가지로 오른쪽 폰트 리스트에서 텍스트를 드래그해서 복붙해서 원하는 곳에 사용하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인스타그램 프로필 폰트 꾸미기 어렵지 않죠?&lt;/p&gt;</description>
      <category>Others</category>
      <category>영문키보드</category>
      <category>영문폰트</category>
      <category>영어키보드</category>
      <category>인스타그램</category>
      <category>인스타그램 글씨체</category>
      <category>인스타그램 꿀팁</category>
      <category>인스타그램 오류</category>
      <category>인스타그램 작은글씨</category>
      <category>인스타그램 폰트</category>
      <category>인스타그램 프로필</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/69</guid>
      <comments>https://kkumalog.tistory.com/entry/Instagram-Customizing-Instagram-Font#entry69comment</comments>
      <pubDate>Wed, 24 Jul 2019 09:35:59 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] Compare Version Numbers</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript-Compare-Version-Numbers</link>
      <description>&lt;p&gt;이&amp;nbsp;페이지는&amp;nbsp;자바스크립트를&amp;nbsp;이용한&amp;nbsp;버전비교를&amp;nbsp;설명하고&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;버전을&amp;nbsp;비교하기에&amp;nbsp;앞서&amp;nbsp;버전관리에&amp;nbsp;대해서&amp;nbsp;간단하게&amp;nbsp;설명하려한다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://semver.org/spec/v2.0.0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Semantic&amp;nbsp;Versioning&amp;nbsp;(SemVer)&lt;/a&gt;는&amp;nbsp;버전&amp;nbsp;형식에&amp;nbsp;의미를&amp;nbsp;부여하여&amp;nbsp;체계적인&amp;nbsp;버전관리를&amp;nbsp;위한&amp;nbsp;제안이다.&amp;nbsp;명확한&amp;nbsp;버전&amp;nbsp;구분을&amp;nbsp;통해&amp;nbsp;변화량을&amp;nbsp;짐작할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;보통&amp;nbsp;0.0.0&amp;nbsp;(Major,&amp;nbsp;Minor,&amp;nbsp;Patch)&amp;nbsp;같이&amp;nbsp;세부분으로&amp;nbsp;나눠진&amp;nbsp;형태의&amp;nbsp;버전을&amp;nbsp;많이&amp;nbsp;사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;Major:&amp;nbsp;전체를&amp;nbsp;뒤엎을&amp;nbsp;정도로&amp;nbsp;큰&amp;nbsp;변화가&amp;nbsp;발생했을&amp;nbsp;경우,&amp;nbsp;이전버전과&amp;nbsp;호환되지&amp;nbsp;않는&amp;nbsp;API&amp;nbsp;변경시&amp;nbsp;버전&amp;nbsp;증가&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor:&amp;nbsp;주요&amp;nbsp;기능의&amp;nbsp;추가나&amp;nbsp;변경&amp;nbsp;시&amp;nbsp;버전&amp;nbsp;증가&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Patch:&amp;nbsp;버그&amp;nbsp;수정&amp;nbsp;등&amp;nbsp;작은&amp;nbsp;변화&amp;nbsp;발생&amp;nbsp;시&amp;nbsp;버전&amp;nbsp;증가&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q.&amp;nbsp;버전은 1.0.0&amp;nbsp;/&amp;nbsp;1.0.23&amp;nbsp;/&amp;nbsp;1.1 처럼 '.'으로 구분된 문자열이다.&amp;nbsp;&lt;/b&gt;&lt;b&gt;두&amp;nbsp;개의&amp;nbsp;버전을&amp;nbsp;비교하는&amp;nbsp;프로그램을&amp;nbsp;작성하시오.&lt;/b&gt;&lt;br /&gt;(버전&amp;nbsp;비교의&amp;nbsp;예시)&lt;/p&gt;
&lt;p&gt;0.0.2&amp;nbsp;&amp;gt;&amp;nbsp;0.0.1&lt;/p&gt;
&lt;p&gt;1.0.10&amp;nbsp;&amp;gt;&amp;nbsp;1.0.3&lt;br /&gt;1.2.0&amp;nbsp;&amp;gt;&amp;nbsp;1.1.99&lt;br /&gt;1.1&amp;nbsp;&amp;gt;&amp;nbsp;1.0.1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;A1)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1561100885465&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const compareVer = (versionA, versionB) =&amp;gt; {
  const redex = /\./gi;
  const a = versionA.replace(redex, '');
  const b = versionB.replace(redex, '');

  if (a &amp;gt; b) {
    console.log(`${versionA} &amp;gt; ${versionB}`);
  } else if (a == b) {
    console.log(`${versionA} = ${versionB}`);
  } else {
    console.log(`${versionA} &amp;lt; ${versionB}`);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위의&amp;nbsp;코드는&amp;nbsp;문자열로&amp;nbsp;변환하여&amp;nbsp;비교하는&amp;nbsp;방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를&amp;nbsp;들면 '1.7.1' -&amp;gt;&amp;nbsp;171&amp;nbsp;vs '1.7.3' -&amp;gt;&amp;nbsp;173처럼 문자로 변환한 후 비교하여 '171' &amp;lt; '173' (true)의&amp;nbsp;결과를&amp;nbsp;낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한번에 계산 되기떄문에 편리하기는 하지만,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.7.13&amp;nbsp;vs&amp;nbsp;1.7.3&amp;nbsp;이를&amp;nbsp;문자열로&amp;nbsp;바꾸어 '1713' &amp;lt; '1.7.3' (true)의&amp;nbsp;결과를 내는 제대로 처리되지 못하는 예외의 경우가 발생할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;버전관리에&amp;nbsp;대해&amp;nbsp;이해했으니,&amp;nbsp;이&amp;nbsp;경우가&amp;nbsp;왜&amp;nbsp;잘못된건지&amp;nbsp;알&amp;nbsp;것이라고&amp;nbsp;믿는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(13&amp;nbsp;&amp;lt;&amp;nbsp;3&amp;nbsp;은&amp;nbsp;당연히&amp;nbsp;틀리죠?&amp;nbsp;false&amp;nbsp;false&amp;nbsp;false)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이러한&amp;nbsp;예외사항까지&amp;nbsp;처리하기위해&amp;nbsp;복잡하지만&amp;nbsp;아래의&amp;nbsp;코드를&amp;nbsp;사용하려한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;A2-1)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1561100909156&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const compareVer = (versionA, versionB) =&amp;gt; {
  let compareResult = true;

  const splitVersionA = versionA.split('.');
  const splitVersionB = versionB.split('.');

  const length = Math.max(splitVersionA.length, splitVersionB.length);

  for (let i = 0; i &amp;lt; length; i += 1) {
    const a = splitVersionA[i] ? parseInt(splitVersionA[i], 10) : 0;
    const b = splitVersionB[i] ? parseInt(splitVersionB[i], 10) : 0;
    if (a &amp;gt; b) {
      compareResult = false;
      break;
    }
  }
  if (compareResult == true) {
      console.log(`${versionA} &amp;lt; ${versionB}`);
  } else {
      console.log(`${versionA} &amp;gt;= ${versionB}`);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 코드는 &amp;lsquo;.&amp;rsquo;으로&amp;nbsp;나눠&amp;nbsp;앞에서부터&amp;nbsp;하나씩&amp;nbsp;자릿수별로&amp;nbsp;비교하는&amp;nbsp;방식이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;A2-2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A2-1과 같은 코드이지만, console 출력때문에 변수가 복잡해 보일 수 있어서 다시 정리한 실제 사용된 코드이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1561104903114&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const compareVer = (versionA, versionB) =&amp;gt; {
  let compareResult = true;

  versionA = versionA.split('.');
  versionB = versionB.split('.');

  const length = Math.max(versionA.length, versionB.length);

  for (let i = 0; i &amp;lt; length; i += 1) {
    const a = versionA[i] ? parseInt(versionA[i], 10) : 0;
    const b = versionB[i] ? parseInt(versionB[i], 10) : 0;
    if (a &amp;gt; b) {
      compareResult = false;
      break;
    }
  }
  return compareResult;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <category>IT</category>
      <category>JavaScript</category>
      <category>Programming</category>
      <category>SemanticVersioning</category>
      <category>version비교</category>
      <category>자바스크립트</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/67</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript-Compare-Version-Numbers#entry67comment</comments>
      <pubDate>Fri, 21 Jun 2019 17:22:09 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] Pass By Value / Pass By Reference</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript-Pass-By-Value-Pass-By-Reference</link>
      <description>&lt;p&gt;이&amp;nbsp;페이지는&amp;nbsp;Pass&amp;nbsp;By&amp;nbsp;Value와&amp;nbsp;Pass&amp;nbsp;By&amp;nbsp;Reference를&amp;nbsp;설명하고&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# pass&amp;nbsp;vs&amp;nbsp;call&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Call&amp;nbsp;By&amp;nbsp;Value,&amp;nbsp;Call&amp;nbsp;By&amp;nbsp;Reference&amp;nbsp;와&amp;nbsp;무슨&amp;nbsp;차이가&amp;nbsp;있을까? &lt;br /&gt;보통&amp;nbsp;주어가&amp;nbsp;함수일&amp;nbsp;때 call&amp;nbsp;by,&amp;nbsp;인수일&amp;nbsp;때 pass&amp;nbsp;by를&amp;nbsp;사용하는&amp;nbsp;듯&amp;nbsp;하다. &lt;br /&gt;&amp;gt;&amp;nbsp;They&amp;nbsp;are&amp;nbsp;synonymous.&amp;nbsp;The&amp;nbsp;term 'call-by-value' means&amp;nbsp;exactly&amp;nbsp;the&amp;nbsp;same&amp;nbsp;as 'pass-by-value'.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# Pass&amp;nbsp;By&amp;nbsp;Value&amp;nbsp;(Call&amp;nbsp;By&amp;nbsp;Value,&amp;nbsp;값에&amp;nbsp;의한&amp;nbsp;호출)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;:&amp;nbsp;인자로&amp;nbsp;넘기는&amp;nbsp;값을&amp;nbsp;복사해서&amp;nbsp;새로운&amp;nbsp;함수에&amp;nbsp;전달하는&amp;nbsp;방식.&amp;nbsp; &lt;br /&gt;값에&amp;nbsp;의한&amp;nbsp;호출은&amp;nbsp;원본값이&amp;nbsp;변경될&amp;nbsp;가능성은&amp;nbsp;없지만,&amp;nbsp;고비용과&amp;nbsp;메모리의&amp;nbsp;문제점이&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;예제1.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559919805176&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = 1; 
const b = a; 

console.log(a, b);    // 1  1 
console.log(a === b); // true 

a = 10; 
console.log(a, b);    // 1  10 
console.log(a === b); // false &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변수&amp;nbsp;a는&amp;nbsp;원시&amp;nbsp;타입인&amp;nbsp;숫자&amp;nbsp;타입&amp;nbsp;1을&amp;nbsp;저장하고&amp;nbsp;있다. 원시&amp;nbsp;타입의&amp;nbsp;경우&amp;nbsp;값이&amp;nbsp;복사되어&amp;nbsp;변수에&amp;nbsp;저장된다.&amp;nbsp;즉,&amp;nbsp;참조&amp;nbsp;타입으로&amp;nbsp;저장되는&amp;nbsp;것이&amp;nbsp;아니라&amp;nbsp;값&amp;nbsp;자체가&amp;nbsp;저장되게&amp;nbsp;된다.&lt;/p&gt;
&lt;p&gt;변수&amp;nbsp;b에&amp;nbsp;변수&amp;nbsp;a를&amp;nbsp;할당할&amp;nbsp;경우,&amp;nbsp;변수&amp;nbsp;a의&amp;nbsp;값&amp;nbsp;1은&amp;nbsp;복사되어&amp;nbsp;변수&amp;nbsp;b에&amp;nbsp;저장된다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;예제2.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559919965149&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const callByValue = (varOne, varTwo) =&amp;gt; {  
  console.log('Inside Call by Value Method');  
  const one = 100;  
  const two = 200;  
  console.log('varOne =' + varOne + 'varTwo =' + varTwo);  
}  
let varOne = 10;  
let varTwo = 20;  
console.log('Before Call by Value Method');  
console.log('varOne =' + varOne + 'varTwo =' +varTwo);  
callByValue(varOne, varTwo)
console.log('After Call by Value Method');  
console.log('varOne =' + varOne + 'varTwo =' + varTwo);  

output :  
&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;  
Before Call by Value Method  
varOne =10 varTwo =20  
Inside Call by Value Method  
varOne =100 varTwo =200  
After Call by Value Method  
varOne =10 varTwo =20 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# Pass&amp;nbsp;By&amp;nbsp;Reference&amp;nbsp;(Call&amp;nbsp;By&amp;nbsp;Reference,&amp;nbsp;참조에&amp;nbsp;의한&amp;nbsp;호출)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;:&amp;nbsp;주소값을&amp;nbsp;인자로&amp;nbsp;전달하는&amp;nbsp;방식. &lt;br /&gt;참조에&amp;nbsp;의한&amp;nbsp;호출은&amp;nbsp;원본값의&amp;nbsp;변경이&amp;nbsp;일어날&amp;nbsp;수도&amp;nbsp;있다는&amp;nbsp;문제점이&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;예제1.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559920076643&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const bar = foo; 
console.log(foo.val, bar.val); // 10 10 
console.log(foo === bar);      // true 

bar.val = 20; 
console.log(foo.val, bar.val); // 20 20 
console.log(foo === bar);      // true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;foo는&amp;nbsp;객체를&amp;nbsp;저장하고&amp;nbsp;있는&amp;nbsp;것이&amp;nbsp;아니라&amp;nbsp;생성된&amp;nbsp;객체의&amp;nbsp;참조값&amp;nbsp;주소를&amp;nbsp;저장하고&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;예제2.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559920259752&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const callByReference = (varObj) =&amp;gt; {  
  console.log('Inside Call by Reference Method');  
  varObj.a = 100;  
  console.log(varObj);  
}  
let varObj = { a: 1 }; 
console.log('Before Call by Reference Method');  
console.log(varObj); 
callByReference(varObj)  
console.log('After Call by Reference Method');  
console.log(varObj); 

output will be :  
&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;  
Before Call by Reference Method  
{ a: 1 }  
Inside Call by Reference Method  
{ a: 100 }  
After Call by Reference Method  
{ a: 100 }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/JavaScript</category>
      <category>call by reference</category>
      <category>call by value</category>
      <category>IT</category>
      <category>JavaScript</category>
      <category>pass by reference</category>
      <category>pass by value</category>
      <category>Programming</category>
      <category>자바스크립트</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/66</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript-Pass-By-Value-Pass-By-Reference#entry66comment</comments>
      <pubDate>Tue, 11 Jun 2019 08:13:45 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] replace / replaceAll</title>
      <link>https://kkumalog.tistory.com/entry/JavaScript</link>
      <description>&lt;p&gt;이&amp;nbsp;페이지는&amp;nbsp;JavaScript의&amp;nbsp;replace에&amp;nbsp;대해&amp;nbsp;설명하고&amp;nbsp;있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;&lt;span&gt;# replace&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559918483708&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String.replace(oldValue, newValue)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1559917630877&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = 'kkuma'.replace('k', a');
console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;result의&amp;nbsp;값은&amp;nbsp;무엇일까?&lt;/p&gt;
&lt;p&gt;위의&amp;nbsp;코드는&amp;nbsp;&amp;lsquo;kkuma&amp;rsquo;의&amp;nbsp;&amp;lsquo;k&amp;rsquo;를&amp;nbsp;모두&amp;nbsp;&amp;lsquo;a&amp;rsquo;로&amp;nbsp;바꾸고&amp;nbsp;싶었던&amp;nbsp;생각을&amp;nbsp;반영한&amp;nbsp;코드이다.&lt;/p&gt;
&lt;p&gt;그러나,&amp;nbsp;result는&amp;nbsp;&amp;lsquo;akuma&amp;rsquo;로&amp;nbsp;생각했던 값이 아닌&amp;nbsp;가장&amp;nbsp;앞에 k 하나만&amp;nbsp;변경된&amp;nbsp;값이었다.&lt;br /&gt;&lt;br /&gt;해결방안으로는&amp;nbsp;두&amp;nbsp;가지를 제안해본다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. 정규표현식&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;replace에 정규표현식을&amp;nbsp;이용하면 replaceAll의 역할을 할 수 있다. &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정규표현식 참조&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1559918992305&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HL3cp/hyBvgrqTDZ/KhC4O7K7V8KKjF8IWp1IGK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;정규 표현식&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;정규 표현식은 문자열에 나타는 특정 문자 조합과 대응시키기 위해&amp;nbsp;사용되는 패턴입니다. 자바스크립트에서, 정규 표현식 또한 객체입니다.&amp;nbsp; 이 패턴들은&amp;nbsp;RegExp의 exec 메소드와 test 메소드&amp;nbsp; ,그리고 String의&amp;nbsp; match메소드 , replace메소드 ,&amp;nbsp;search메소드 ,&amp;nbsp; split 메소드와 함께 쓰입니다 . 이 장에서는 자바스크립트의 정규식에 대하여 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1559918886758&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = 'kkuma'.replace(/k/gi,'a');
console.log(result);

&amp;gt; 'aauma' &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;g: 전역 검색 (global)&lt;/p&gt;
&lt;p&gt;i: 대소문자 구분 없는 검색 (ignore Case)&lt;/p&gt;
&lt;p&gt;m: 다중행 검색 (multi-line)&lt;/p&gt;
&lt;p&gt;u: 유니코드 (unicode)&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. replaceAll&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;그럼&amp;nbsp;혹시&amp;nbsp;replaceAll&amp;nbsp;이라는&amp;nbsp;메서드가&amp;nbsp;있나?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;놉.&amp;nbsp;제공되는&amp;nbsp;것은&amp;nbsp;없으나&amp;nbsp;만들어&amp;nbsp;사용할&amp;nbsp;수는&amp;nbsp;있다.&lt;/p&gt;
&lt;pre id=&quot;code_1559917458711&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const replaceAll = (str, a, b) =&amp;gt; { 
  return str.split(a).join(b);
}

const result = replaceAll('kkuma', 'k', 'a');
console.log(result);

&amp;gt; 'aauma'&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/JavaScript</category>
      <category>IT</category>
      <category>JavaScript</category>
      <category>Programming</category>
      <category>replace</category>
      <category>replaceAll</category>
      <category>자바스크립트</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/65</guid>
      <comments>https://kkumalog.tistory.com/entry/JavaScript#entry65comment</comments>
      <pubDate>Sun, 9 Jun 2019 08:58:19 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Password Security</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Password-Security</link>
      <description>&lt;p&gt;기존의&amp;nbsp;로그인&amp;nbsp;시스템에서&amp;nbsp;이슈가&amp;nbsp;생겨서&amp;nbsp;비밀번호&amp;nbsp;보안을&amp;nbsp;강화시키는&amp;nbsp;작업을&amp;nbsp;진행했고,&amp;nbsp;이&amp;nbsp;페이지는&amp;nbsp;그에&amp;nbsp;대한&amp;nbsp;설명하고&amp;nbsp;있다. &lt;br /&gt;기존의&amp;nbsp;시스템은 웹&amp;nbsp;화면쪽에서&amp;nbsp;입력된&amp;nbsp;값을&amp;nbsp;패킷으로&amp;nbsp;바로&amp;nbsp;전송하여&amp;nbsp;bcrypt를&amp;nbsp;이용했는데,&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;정보가&amp;nbsp;유출될&amp;nbsp;수&amp;nbsp;있어서&amp;nbsp;수정&amp;nbsp;보완하기로&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;암호화에는&amp;nbsp;크게&amp;nbsp;단방향&amp;nbsp;암호화와&amp;nbsp;양방향&amp;nbsp;암호화&amp;nbsp;두&amp;nbsp;가지가&amp;nbsp;있다. &lt;br /&gt;단방향&amp;nbsp;암호화는&amp;nbsp;복호화할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;암호화&amp;nbsp;방법이며,&amp;nbsp;복호화란&amp;nbsp;암호화된&amp;nbsp;문자열을&amp;nbsp;다시&amp;nbsp;원래&amp;nbsp;문자열로&amp;nbsp;해독하는것을&amp;nbsp;의미한다. &lt;br /&gt;단방향&amp;nbsp;암호화가&amp;nbsp;복호화&amp;nbsp;할&amp;nbsp;수&amp;nbsp;없다고&amp;nbsp;설명했지만,&amp;nbsp;최근&amp;nbsp;MD5나&amp;nbsp;SHA1&amp;nbsp;방식&amp;nbsp;등은&amp;nbsp;쉽게&amp;nbsp;해독이&amp;nbsp;가능하니&amp;nbsp;사용하지&amp;nbsp;않는것이&amp;nbsp;좋다.&amp;nbsp;자세한&amp;nbsp;내용은&amp;nbsp;MD5 파트에서&amp;nbsp;설명하고&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# bcrypt &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559227788038&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install bcrypt-nodejs&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559227849205&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const bcrypt = require(&amp;lsquo;bcrypt-nodejs&amp;rsquo;); 

// 로그인할 때에는 hash된 값과 입력된 값을 비교하는 작업이 필요하다. 
bcrypt.compareSync(data, encrypted) //bcrypt.compareSync(입력값, 비교값 hash) &lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;위의 코드는 입력값을&amp;nbsp;hash한&amp;nbsp;후&amp;nbsp;값이&amp;nbsp;일치하는지&amp;nbsp;비교하는 로직이다. &lt;br /&gt;&lt;br /&gt;bcrypt는&amp;nbsp;패스워드&amp;nbsp;저장&amp;nbsp;목적으로&amp;nbsp;설계되어,&amp;nbsp;현재까지는&amp;nbsp;강력한&amp;nbsp;암호화&amp;nbsp;방식&amp;nbsp;중&amp;nbsp;하나지만,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;입력&amp;nbsp;값으로&amp;nbsp;72bytes&amp;nbsp;character&amp;nbsp;사용해야&amp;nbsp;한다는&amp;nbsp;제약이&amp;nbsp;있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left; font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;b&gt;# md5&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;초반부에&amp;nbsp;단방향&amp;nbsp;암호화&amp;nbsp;방식&amp;nbsp;중&amp;nbsp;하나인&amp;nbsp;MD5가&amp;nbsp;쉽게&amp;nbsp;해독이&amp;nbsp;가능하다고&amp;nbsp;설명했는데,&amp;nbsp;이는&amp;nbsp;아래&amp;nbsp;사이트에&amp;nbsp;들어가보면&amp;nbsp;안다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://crackstation.net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://crackstation.net&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1559228189441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://crackstation.net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://crackstation.net&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;crackstation.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;22c14f311a60486b36f79f3bc962be66&amp;nbsp;해시값을&amp;nbsp;입력하면&amp;nbsp;md5방식이며,&amp;nbsp;a1b2c3d4&amp;nbsp;라는&amp;nbsp;값을&amp;nbsp;쉽게&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이&amp;nbsp;사이트에서&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;방식은&amp;nbsp;레인보우&amp;nbsp;테이블에서&amp;nbsp;비교하여&amp;nbsp;찾는&amp;nbsp;것이다.&amp;nbsp;레인보우&amp;nbsp;테이블이란,&amp;nbsp;해시된&amp;nbsp;값을&amp;nbsp;미리&amp;nbsp;변환해둔&amp;nbsp;테이블이다.&amp;nbsp;모든&amp;nbsp;값은&amp;nbsp;아니지만&amp;nbsp;엄청나게&amp;nbsp;많은&amp;nbsp;데이터들을&amp;nbsp;가지고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;해독이&amp;nbsp;쉽다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;굳이&amp;nbsp;사용한다고&amp;nbsp;하면,&amp;nbsp;아래&amp;nbsp;코드를&amp;nbsp;이용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;1) 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559228539550&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install md5&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;2) 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559228558015&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const md5 = require(&amp;lsquo;md5&amp;rsquo;); 
const security = md5(pw);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left; font-size: 1.25em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# salt&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;단방향&amp;nbsp;암호화&amp;nbsp;방식을&amp;nbsp;어떻게&amp;nbsp;더&amp;nbsp;안전하게&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있을까?&amp;nbsp; &lt;br /&gt;해커가&amp;nbsp;레인보우&amp;nbsp;테이블을&amp;nbsp;사용하지&amp;nbsp;못하게&amp;nbsp;하고&amp;nbsp;오랜시간을&amp;nbsp;들여야만&amp;nbsp;해독할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하는&amp;nbsp;방법이&amp;nbsp;필요하다. &lt;br /&gt;소금을&amp;nbsp;뿌려주는&amp;nbsp;일인데,&amp;nbsp;salt라는 특수한 값을 이용해 단방향 암호화한 값을 변형시키는 것이다. salt는 보통 랜덤&amp;nbsp;문자열을&amp;nbsp;생성해서&amp;nbsp;비밀번호와&amp;nbsp;같이&amp;nbsp;DB에&amp;nbsp;저장한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;같은&amp;nbsp;password를&amp;nbsp;사용하는&amp;nbsp;유저가&amp;nbsp;있다면&amp;nbsp;유출&amp;nbsp;시&amp;nbsp;다른&amp;nbsp;유저의 비밀번호 또한&amp;nbsp;유출될&amp;nbsp;수&amp;nbsp;있기때문에, 유저마다&amp;nbsp;다른&amp;nbsp;salt를&amp;nbsp;설정해야한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;그래서 사용한 salt의 값은 아래와 같다. 오늘 날짜에 랜덤한 값을 곱하여 만든 랜덤랜덤한 값이다.&lt;/p&gt;
&lt;pre id=&quot;code_1559229020723&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const salt = `${Math.round(new Date().valueOf() * Math.random())}`; 
bcrypt.hashSync(pw + salt); &lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;random 메소드는&amp;nbsp;매번&amp;nbsp;다른 값을 반환하기 때문에&amp;nbsp;암호화 결과가 매번 달라지기때문에, 꼭 비밀번호와 함께 저장해두어야한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;salt를&amp;nbsp;추가해도&amp;nbsp;시간을&amp;nbsp;들인다면&amp;nbsp;cracking&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있겠지만, 오랜시간이 걸린다. 만약 더 좋은 방식이 나온다면 변경하도록하자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>BCrypt</category>
      <category>IT</category>
      <category>MD5</category>
      <category>node.js</category>
      <category>Programming</category>
      <category>Salt</category>
      <category>Security</category>
      <category>비밀번호 암호화</category>
      <category>비밀번호 해킹</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/64</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Password-Security#entry64comment</comments>
      <pubDate>Fri, 31 May 2019 08:29:42 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Uploading image file to AWS S3</title>
      <link>https://kkumalog.tistory.com/entry/Uploading-image-file-to-AWS-S3</link>
      <description>&lt;p&gt;이 페이지는 aws S3에 이미지를 업로드하는 방법을 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래코드를 library에 따로 관리하여 호출하는것이 재사용성을 높이는 좋은 방법이다.&lt;/p&gt;
&lt;p&gt;텍스트와 이미지 파일 업로드 함수를 따로 분리하였으니 필요에 따라 사용.&lt;/p&gt;
&lt;p&gt;마지막 함수 deleteObject를 이용하여 s3에 있는 이미지도 삭제가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1555123396957&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fs = require('fs');
const S3 = require('aws').s3;

const errors = require('../libs/errors');

exports.putTextObject = (bucket, key, contentType, body) =&amp;gt; new Promise((resolve, reject) =&amp;gt; {
    const params = {
        Bucket : bucket,
        Key : key,
        ContentType : contentType,
        Body: body,
        ACL : 'public-read',
    };
    S3.putObject(params, (err, data) =&amp;gt; {
    	if (err) return reject(new errors.AWSS3Error());
        return resolve(data);
    });
});

exports.putObject = (bucket, key, contentType, file) =&amp;gt; new Promise((resolve, reject) =&amp;gt; {
    const fileStream = fs.createReadStream(file.path);
    const params = {
        Bucket : bucket,
        Key : key,
        ContentType : contentType,
        Body: fileStream,
        ACL : 'public-read',
    };
    S3.putObject(params, (err, data) =&amp;gt; {
        if (err) return reject(new errors.AWSS3Error());
        return resolve(data);
    });
});

exports.deleteObject = (bucket, key, callback) =&amp;gt; new Promise((resolve, reject) =&amp;gt; {
    S3.deleteObject({
        Bucket : bucket,
        Key : key,
    }, (err, data) =&amp;gt; {
        if (err) return reject(new errors.AWSS3Error());
        return resolve(data);
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;라이브러리에 작성된 코드를 아래의 형식처럼 호출하여 사용할 수 있다&lt;/p&gt;
&lt;pre id=&quot;code_1555123369413&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;await s3.putObject(bucket, key, 'image/png', file);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Node.js</category>
      <category>Amazon</category>
      <category>AWS</category>
      <category>aws s3</category>
      <category>error</category>
      <category>image upload</category>
      <category>Library</category>
      <category>Node</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>S3</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/63</guid>
      <comments>https://kkumalog.tistory.com/entry/Uploading-image-file-to-AWS-S3#entry63comment</comments>
      <pubDate>Fri, 17 May 2019 08:20:07 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Get data from excel file</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Get-data-from-excel-file</link>
      <description>&lt;p&gt;이 페이지는 node.js를 이용하여 엑셀 파일을 다루는 방법을 설명하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실제 코드 구현에 앞서 필요한 모듈인 node-xlsx와 fs를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1555242088298&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install node-xlsx --save&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1555242576372&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install fs --save&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# 예제 엑셀파일&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;예제로 사용한 엑셀파일은 아래와 같이 A1부터 바로 시작하는 형식이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;엑셀.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/okoEd/btquwepNSKV/HCulCOZlrE3yd3CmVHHJZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/okoEd/btquwepNSKV/HCulCOZlrE3yd3CmVHHJZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/okoEd/btquwepNSKV/HCulCOZlrE3yd3CmVHHJZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FokoEd%2FbtquwepNSKV%2FHCulCOZlrE3yd3CmVHHJZK%2Fimg.png&quot; data-filename=&quot;엑셀.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# 코드구현&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;위의 엑셀파일 데이터를 가져와 처리하는 코드를 설명하고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1555122701709&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const xlsx = require('node-xlsx');
const fs = require('fs');

exports.checkExcel = (excel) =&amp;gt; {
  try {
    fs.exists(excel.path, (exists) =&amp;gt; {
      if (exists) {
        const obj = xlsx.parse(excel.path);
        console.log(obj); // &amp;lt;1&amp;gt;
        console.log(obj[0]); // &amp;lt;2&amp;gt;
        console.log(obj[0].data); // &amp;lt;3&amp;gt;
        async.eachSeries(obj[0].data, async (data, done) =&amp;gt; {
          console.log(data); // &amp;lt;4&amp;gt;
          console.log(data[0]); // &amp;lt;5&amp;gt;
          // data를 이용하는 작업 코드
          return done(null);
        });
      }
    });
  } catch (err) {
    return Promise.reject(err);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# 결과값&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;처리과정에 따른 결과값을 따로 표기하였으니, 필요한 값을 이용하여 작업을 진행하시길 바랍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1555123080522&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;1&amp;gt; console.log(obj);
[ { name: '시트1', data: [ [Array], [Array], [Array] ] } ]

&amp;lt;2&amp;gt; console.log(obj[0]);
{ name: '시트1', data: [ [ 'test1' ], [ 'test2' ], [ 'test3' ] ] }

&amp;lt;3&amp;gt; console.log(obj[0].data);
[ [ 'test1' ], [ 'test2' ], [ 'test3' ] ]

&amp;lt;4&amp;gt; console.log(data);
[ 'test1' ]
[ 'test2' ]
[ 'test3' ]

&amp;lt;5&amp;gt; console.log(data[0]);
test1
test2
test3&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Node.js</category>
      <category>Excel</category>
      <category>FS</category>
      <category>IT</category>
      <category>node-xlsx</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>엑셀</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/62</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Get-data-from-excel-file#entry62comment</comments>
      <pubDate>Sun, 14 Apr 2019 20:59:37 +0900</pubDate>
    </item>
    <item>
      <title>[Tistory] Maximum call stack size exceeded Error</title>
      <link>https://kkumalog.tistory.com/entry/Tistory</link>
      <description>&lt;p&gt;이 페이지는 'Maximum call stack size exceeded' 에러 해결방법을 공유하고 있다.&lt;/p&gt;
&lt;p&gt;새 에디터가 생겼길래 신나게 글을 써보려고했는데, 밑에 사진에 보이는 메뉴와 카테고리가 클릭이 되지 않았다.&lt;/p&gt;
&lt;p&gt;당황스러워서 찾아보니 메뉴뿐만이 아니라 전체가 하얀화면으로 보이는 경우도 있다고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;메뉴.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r1Dd4/btqudtzcQn4/MjXN6MR4wLqMTnhCmu53jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r1Dd4/btqudtzcQn4/MjXN6MR4wLqMTnhCmu53jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r1Dd4/btqudtzcQn4/MjXN6MR4wLqMTnhCmu53jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr1Dd4%2FbtqudtzcQn4%2FMjXN6MR4wLqMTnhCmu53jK%2Fimg.png&quot; data-filename=&quot;메뉴.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;카테고리.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWA1zL/btquc2oiukf/0nre5rEIj1Dumpjz8012Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWA1zL/btquc2oiukf/0nre5rEIj1Dumpjz8012Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWA1zL/btquc2oiukf/0nre5rEIj1Dumpjz8012Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWA1zL%2Fbtquc2oiukf%2F0nre5rEIj1Dumpjz8012Dk%2Fimg.png&quot; data-filename=&quot;카테고리.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;개발자 도구로 확인했더니, 아래와 같은 에러가...&lt;/p&gt;
&lt;p&gt;원인은 shCore.js 때문이다.&lt;/p&gt;
&lt;p&gt;shCore.js란, 다수의 개발블로그에서 사용되고 있는 코드블럭 테마인 SyntaxHighlighter를 설정할때 추가했던 파일이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;error.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CG9sL/btquaPczos0/gi3PRYqfDFh3ZWkaNbC0hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CG9sL/btquaPczos0/gi3PRYqfDFh3ZWkaNbC0hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CG9sL/btquaPczos0/gi3PRYqfDFh3ZWkaNbC0hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCG9sL%2FbtquaPczos0%2Fgi3PRYqfDFh3ZWkaNbC0hk%2Fimg.png&quot; data-filename=&quot;error.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;'블로그관리 - 스킨편집 - html편집 - HTML 탭'에서 &lt;span style=&quot;color: #333333;&quot;&gt;SyntaxHighlighter를 사용하기 위해 추가했던 스크립트들과 아래 코드를 전부 삭제한 후 저장하니 정상적으로 작동하는것을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크립트.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFyuE/btquatgzHxq/6Se4bKNAfdNL4rJho9YRcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFyuE/btquatgzHxq/6Se4bKNAfdNL4rJho9YRcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFyuE/btquatgzHxq/6Se4bKNAfdNL4rJho9YRcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFyuE%2FbtquatgzHxq%2F6Se4bKNAfdNL4rJho9YRcK%2Fimg.png&quot; data-filename=&quot;스크립트.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tistory</category>
      <category>IT</category>
      <category>Programming</category>
      <category>syntaxhighlighter</category>
      <category>개발블로그</category>
      <category>티스토리 코드작성</category>
      <category>티스토리에러</category>
      <category>티스토리오류</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/61</guid>
      <comments>https://kkumalog.tistory.com/entry/Tistory#entry61comment</comments>
      <pubDate>Tue, 9 Apr 2019 09:30:35 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Using multer to upload image</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Using-multer-to-upload-image</link>
      <description>&lt;p&gt;이 페이지는 multer를 이용한 이미지 업로드 및 폼데이터 처리방식을 설명하고 있다.&lt;/p&gt;
&lt;p&gt;(* 아래 코드는 React.js와 Node.js 언어로 구현되어있다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;express와 함께 사용할 multer 모듈을 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1554515933275&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install multer --save&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# React.js&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;multer는 multipart/form-data에서만 동작하니 주의해주세요.&lt;/p&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1554515365114&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const formData = new FormData();

formData.append(&quot;image&quot;, file);

Axios.post('/api/upload',
  formData, {
  	headers: {
  		'Content-Type': 'multipart/form-data'
  	}
  }
).then((res) =&amp;gt; {
	console.log('SUCCESS!!');
}).catch((err) =&amp;gt; {
	console.log('FAILURE!!');
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;# Node.js&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) 한개의 이미지 파일&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1554515325610&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const router = require('express').Router();
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

router.post('/upload', upload.single('image'), (req, res, next) =&amp;gt; {
    console.log(req.file);
    // 이미지를 이용하는 작업 코드
});

module.exports = router;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 여러개의 이미지 파일 (array)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1554516593413&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const router = require('express').Router();
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

router.post('/upload', upload.array('image'), (req, res, next) =&amp;gt; {
    console.log(req.files);
    // 이미지를 이용하는 작업 코드
});

module.exports = router;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;image의 갯수를 제한시켜주려면 아래코드처럼 array에 숫자를 지정해줄 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3이라고 명시하면, 이미지를 3개까지만 허용하고 4개부터 ERROR!&lt;/p&gt;
&lt;pre id=&quot;code_1554516978027&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;router.post('/upload', upload.array('image', 3), (req, res, next) =&amp;gt; {
    console.log(req.files);
    // 이미지를 이용하는 작업 코드
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 여러개의 이미지 파일 (any)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;전달된 모든 파일을 허용하여 req.files에 저장하고, 기타 텍스트파일은 req.body에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1554516623754&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const router = require('express').Router();
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

router.post('/upload', upload.any(), (req, res, next) =&amp;gt; {
    console.log(req.files);
    // 이미지를 이용하는 작업 코드
});

module.exports = router;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;!&lt;/b&gt; req.file 과 req.files를 이용하는 코드를 구분시켜서 명시하였으니 꼭 체크해야한다.&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>express</category>
      <category>IT</category>
      <category>multer</category>
      <category>multer 모듈</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/60</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Using-multer-to-upload-image#entry60comment</comments>
      <pubDate>Sat, 6 Apr 2019 11:27:59 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Getting Metrics from Amazon AWS CloudWatch</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Getting-Metrics-from-Amazon-AWS-CloudWatch</link>
      <description>&lt;p&gt;이 페이지는 Node.js 프로젝트에 Amazon AWS CloudWatch 데이터를 가져오는 방법을 설명하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드설명에 앞서 CloudWatch에 대해 간단하게 설명하자면,&lt;/p&gt;
&lt;p&gt;개발자 / 시스템 운영자 / 사이트 안정성 엔지니어 및 IT관리자를 위해 구축된 모니터링 및 관리 서비스이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CloudWatch도 Amazon서비스이기때문에 코드작성에 앞서 연결하는 작업이 필요하다&lt;/p&gt;
&lt;p&gt;(아래 코드에서는 region, accessKeyId, secretAccessKey를 하드코딩이 아닌 환경변수에 저장해두고 가져오는 형태로 사용하였다)&lt;/p&gt;
&lt;pre id=&quot;code_1553774390680&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const AWS = require('aws-sdk')
AWS.config.update({
    region: config.AWSRegion,
    accessKeyId : config.AWSAccessKeyId,
    secretAccessKey: config.AWSSecretAccessKey
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래는&amp;nbsp;CloudWatch의&amp;nbsp;지표&amp;nbsp;중&amp;nbsp;하나인&amp;nbsp;'NumberOfMessagesPublished'&amp;nbsp;데이터를&amp;nbsp;가져오는&amp;nbsp;코드이다&lt;/p&gt;
&lt;p&gt;period(요청할시간)를 60이상으로 설정한 이유는, cloudWatch가 집계하는데 필요한 최소시간 단위가 1분이기 때문이다.&lt;/p&gt;
&lt;p&gt;또 확인할 것은 params에 있는 항목의 Key는 첫글자가 대문자이고, 빠지는 항목없이 작성해주어야한다는 것!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1553773395964&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const cw = new AWS.CloudWatch();

exports.getCloudWatch = async (req, res, next) =&amp;gt; {
    let { startDate, endDate, period } = req.query;
    if (period &amp;lt; 60) period = 60;
    const StartTime = new Date(startDate).toISOString();
    const EndTime = new Date(`${endDate}T23:59:59`).toISOString();
	const params = {
    	Namespace: 'AWS/SNS',
        Statistics: ['Sum'],
        Unit: 'Count',
        Dimensions: [{ Name: 'TopicName', Value: `${TopicNameValue}` }],
        MetricName: 'NumberOfMessagesPublished',
        StartTime,
        EndTime,
        Period: period,
    };
    
    cw.getMetricStatistics(params, (err, data) =&amp;gt; {
        if (err) return console.log(err);
        data.Datapoints.sort((a, b) =&amp;gt; (a.Timestamp &amp;gt; b.Timestamp) ? 1 : ((a.Timestamp &amp;lt; b.Timestamp) ? -1 : 0 ));
        return res.send({ result: data });
    });
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;getMetricStatistics의 결과값에는 순서가 없이 뒤죽박죽 섞여있어, sort함수를 이용해 Timestamp기준 오름차순으로 정렬해주었다.&lt;/p&gt;
&lt;p&gt;정렬된 최종 데이터는 다음과 같다 :)&lt;/p&gt;
&lt;pre id=&quot;code_1553777285604&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;NumberOfMessagesPublished&quot;: {
	&quot;ResponseMetadata&quot;: {
    	&quot;RequestId&quot;: &quot;&quot;
    },
  	&quot;Label&quot;: &quot;NumberOfMessagesPublished&quot;,
    &quot;Datapoints&quot;: [
      {
      	&quot;Timestamp&quot;: &quot;2019-03-28T00:00:00.000Z&quot;,
        &quot;Sum&quot;: 1,
        &quot;Unit&quot;: &quot;Count&quot;
      },
      {
        &quot;Timestamp&quot;: &quot;2019-03-28T00:10:00.000Z&quot;,
        &quot;Sum&quot;: 6,
        &quot;Unit&quot;: &quot;Count&quot;
      },
      {
        &quot;Timestamp&quot;: &quot;2019-03-28T00:20:00.000Z&quot;,
        &quot;Sum&quot;: 3,
        &quot;Unit&quot;: &quot;Count&quot;
      },
      {
        &quot;Timestamp&quot;: &quot;2019-03-28T00:25:00.000Z&quot;,
        &quot;Sum&quot;: 2,
        &quot;Unit&quot;: &quot;Count&quot;
      },  
      ... 생략
	]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>Amazon</category>
      <category>AWS</category>
      <category>CloudWatch</category>
      <category>IT</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/59</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Getting-Metrics-from-Amazon-AWS-CloudWatch#entry59comment</comments>
      <pubDate>Sat, 30 Mar 2019 08:56:03 +0900</pubDate>
    </item>
    <item>
      <title>[Review] SAMSUNG Galaxy Buds(SM-R170)</title>
      <link>https://kkumalog.tistory.com/entry/f</link>
      <description>&lt;p&gt;&lt;b&gt;# Galaxy Buds&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;'갤럭시 버드 또는 갤럭시 버즈'라고 불리는 삼성의 새로운 블루투스 무선 이어폰 리뷰를 써보려 합니다 :)&lt;/p&gt;
&lt;p&gt;아직 사용기간이 짧아서 리뷰라기보다는 개봉기에 가깝겠지만 같이 분석해봅시다&lt;/p&gt;
&lt;p&gt;갤럭시 S10 사전예약시 증정품으로 제공해주는 제품이어서 퀄리티가 떨어지는 건 아닌가 하는 생각이 들었지만 일단 믿고 사용해보려 합니다&lt;/p&gt;
&lt;p&gt;무선 이어폰을 살 때 고려할 가장 큰 세 가지를 갤럭시 버즈 스펙에서 살펴볼까요?&lt;/p&gt;
&lt;p&gt;첫 번째, 사운드.&lt;/p&gt;
&lt;p&gt;세계적인 음향 브랜드 AKG가 튜닝한 전문가 수준의 사운드!&lt;/p&gt;
&lt;p&gt;이번에 갤럭시 버즈가 최고의 음질을 내세우는 이유가 있었군요&lt;/p&gt;
&lt;p&gt;두 번째, 마이크.&lt;/p&gt;
&lt;p&gt;주변 환경에 따라 내/외부 2개의 마이크로 시끄럽고 바람이 많이 부는 환경에서도 외부 소음의 방해 없이 또렷하게 목소리를 전달할 수 있다?&lt;/p&gt;
&lt;p&gt;(전화통화의 경우는 아직 좀 더 테스트해봐야 할 것 같네요)&lt;/p&gt;
&lt;p&gt;세 번째, 배터리.&lt;/p&gt;
&lt;p&gt;한번 충전으로 최대 13시간, 고효율 배터리를 가지고 있으며 무선충전과 무선 배터리 공유 기능이 주목할만하다&lt;/p&gt;
&lt;p&gt;이런 스펙을 가진 갤럭시 버즈의 가격은 159,500원.&lt;/p&gt;
&lt;p&gt;한국에서는 화이트, 블랙, 옐로우로 출시되지만 사전예약 시 제공하는 컬러는 화이트 한 가지입니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 'Galaxy Buds Bluetooth Earphones' UNBOXING(언박싱)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;두둥 드디어 갤럭시 버즈를 개봉하도록 하겠습니다 :)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d712Bi/btqtUjLiN0A/vOEC9aQQo1Id1WtASTl0yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d712Bi/btqtUjLiN0A/vOEC9aQQo1Id1WtASTl0yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d712Bi/btqtUjLiN0A/vOEC9aQQo1Id1WtASTl0yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd712Bi%2FbtqtUjLiN0A%2FvOEC9aQQo1Id1WtASTl0yK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh07nN/btqtVIJ435p/segOhbSEKUTAHh4SOQjVJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh07nN/btqtVIJ435p/segOhbSEKUTAHh4SOQjVJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh07nN/btqtVIJ435p/segOhbSEKUTAHh4SOQjVJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh07nN%2FbtqtVIJ435p%2FsegOhbSEKUTAHh4SOQjVJk%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xDr8r/btqtS7LeeXR/2phvwI0FeCHOb3dLDqKIK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xDr8r/btqtS7LeeXR/2phvwI0FeCHOb3dLDqKIK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xDr8r/btqtS7LeeXR/2phvwI0FeCHOb3dLDqKIK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxDr8r%2FbtqtS7LeeXR%2F2phvwI0FeCHOb3dLDqKIK1%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;사진도 있고, 가장 중요시하는 스펙들도 있어서 기존의 갤럭시 휴대폰 케이스보다는 정보가 많이 있는게 눈에띄네요&lt;/p&gt;
&lt;p&gt;상자를 열면 심플 그 자체.&lt;/p&gt;
&lt;p&gt;너무 심플해서 상자 윗쪽에 끼어있는 설명서를 보지 못할 뻔 했어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvZL2U/btqtS6yPNXO/aZycMVsTSKb1HfLpYIzycK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvZL2U/btqtS6yPNXO/aZycMVsTSKb1HfLpYIzycK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvZL2U/btqtS6yPNXO/aZycMVsTSKb1HfLpYIzycK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvZL2U%2FbtqtS6yPNXO%2FaZycMVsTSKb1HfLpYIzycK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nn1vL/btqtT6k3Mwl/WqeQ5amGv9DfNNsxBvPZ20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nn1vL/btqtT6k3Mwl/WqeQ5amGv9DfNNsxBvPZ20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nn1vL/btqtT6k3Mwl/WqeQ5amGv9DfNNsxBvPZ20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNn1vL%2FbtqtT6k3Mwl%2FWqeQ5amGv9DfNNsxBvPZ20%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmEil2/btqtT57x7W4/kpXfG1zyBGMuPAojn1btCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmEil2/btqtT57x7W4/kpXfG1zyBGMuPAojn1btCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmEil2/btqtT57x7W4/kpXfG1zyBGMuPAojn1btCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmEil2%2FbtqtT57x7W4%2FkpXfG1zyBGMuPAojn1btCK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;작은 상자안에 들어있는 구성품은 충전을 위한 USB 케이블, 윙팁, 이어팁 세 가지다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDXHP6/btqtT6ZErzK/MS3fwmzJ10oXjYaY9LEBt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDXHP6/btqtT6ZErzK/MS3fwmzJ10oXjYaY9LEBt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDXHP6/btqtT6ZErzK/MS3fwmzJ10oXjYaY9LEBt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDXHP6%2FbtqtT6ZErzK%2FMS3fwmzJ10oXjYaY9LEBt1%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;드디어 이어버드를 만나다&lt;/p&gt;
&lt;p&gt;충전케이스를 열었을땐 밥솥같이 생긴 느낌이었는데, 꺼내어 뒤집어보니 새같다 짹짹=&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oClHh/btqtVJbRSiT/6GovGwMUY7fxjv8uE3PfWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oClHh/btqtVJbRSiT/6GovGwMUY7fxjv8uE3PfWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oClHh/btqtVJbRSiT/6GovGwMUY7fxjv8uE3PfWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoClHh%2FbtqtVJbRSiT%2F6GovGwMUY7fxjv8uE3PfWK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNyF6n/btqtVeQf1pi/LIBKWg8efgOso32wYbagz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNyF6n/btqtVeQf1pi/LIBKWg8efgOso32wYbagz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNyF6n/btqtVeQf1pi/LIBKWg8efgOso32wYbagz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNyF6n%2FbtqtVeQf1pi%2FLIBKWg8efgOso32wYbagz0%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A52vc/btqtVeo9ZBn/QIGkBY8dKlgkt5ndI866d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A52vc/btqtVeo9ZBn/QIGkBY8dKlgkt5ndI866d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A52vc/btqtVeo9ZBn/QIGkBY8dKlgkt5ndI866d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA52vc%2FbtqtVeo9ZBn%2FQIGkBY8dKlgkt5ndI866d1%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/54LPQ/btqtUj5vgWW/BvH9I8KnzoEySKphd5XcFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/54LPQ/btqtUj5vgWW/BvH9I8KnzoEySKphd5XcFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/54LPQ/btqtUj5vgWW/BvH9I8KnzoEySKphd5XcFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F54LPQ%2FbtqtUj5vgWW%2FBvH9I8KnzoEySKphd5XcFk%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 사용설명서&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;본격적으로 사용설명서를 읽어봅시다 :)&lt;/p&gt;
&lt;p&gt;작은 이어버드가 하는일이 많아서 명칭도 많네요&lt;/p&gt;
&lt;p&gt;배터리 충전하는 방법, 구성품과 명칭은 가볍게 읽고 이어버드와 모바일 기기 연결하는 방법은 아래에서 다시 설명하도록 할게요&lt;/p&gt;
&lt;p&gt;빠르게 쭉쭉쭉 읽고 빨리 휴대폰과 연결을 해보도록하죠!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMzn1/btqtVIpLrXH/K1Cb0WtKkD1zBIB17ujG01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMzn1/btqtVIpLrXH/K1Cb0WtKkD1zBIB17ujG01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMzn1/btqtVIpLrXH/K1Cb0WtKkD1zBIB17ujG01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMzn1%2FbtqtVIpLrXH%2FK1Cb0WtKkD1zBIB17ujG01%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNTi8/btqtUAF0FLy/e3tKAtAyYq1YrXd2sf4KGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNTi8/btqtUAF0FLy/e3tKAtAyYq1YrXd2sf4KGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNTi8/btqtUAF0FLy/e3tKAtAyYq1YrXd2sf4KGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNTi8%2FbtqtUAF0FLy%2Fe3tKAtAyYq1YrXd2sf4KGK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xc7Jh/btqtVsOe0Xr/6IqZdHKbAIjWgKgZwv1xQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xc7Jh/btqtVsOe0Xr/6IqZdHKbAIjWgKgZwv1xQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xc7Jh/btqtVsOe0Xr/6IqZdHKbAIjWgKgZwv1xQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxc7Jh%2FbtqtVsOe0Xr%2F6IqZdHKbAIjWgKgZwv1xQk%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbSOyq/btqtSxKsmr5/6tu15QUKfIXeEKzwambov0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbSOyq/btqtSxKsmr5/6tu15QUKfIXeEKzwambov0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbSOyq/btqtSxKsmr5/6tu15QUKfIXeEKzwambov0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbSOyq%2FbtqtSxKsmr5%2F6tu15QUKfIXeEKzwambov0%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bztViu/btqtT50JJoC/Pey09Fx2ta8CMaq90iHPgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bztViu/btqtT50JJoC/Pey09Fx2ta8CMaq90iHPgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bztViu/btqtT50JJoC/Pey09Fx2ta8CMaq90iHPgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbztViu%2FbtqtT50JJoC%2FPey09Fx2ta8CMaq90iHPgK%2Fimg.png&quot; width=&quot;820&quot; height=&quot;820&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2000&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;잠깐! 배터리정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;음악재생 - 한번 충전으로 최대 6시간 (충전 케이스 충전시 총 13시간)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;통화 - 한번 충전으로 최대 5시간 (충전 케이스 충전시 총 11시간)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;15분충전으로 100분사용가능하다고 합니다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 이어버드와 모바일 기기 연결&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;갤럭시 휴대폰에서는 기본 어플인 'Galaxy Wearable'를 사용하도록 하겠습니다&lt;/p&gt;
&lt;p&gt;어플을 들어가면 아래와 같은 화면을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;블루투스를 켠 상태에서 충전케이스를 여는 순간 연결완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000649615.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brjmiQ/btqtT6L8f6v/Oj4nnsKwEOS3gpZkESsxX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brjmiQ/btqtT6L8f6v/Oj4nnsKwEOS3gpZkESsxX1/img.jpg&quot; data-alt=&quot;연결이 해제된 상태의 어플&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brjmiQ/btqtT6L8f6v/Oj4nnsKwEOS3gpZkESsxX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrjmiQ%2FbtqtT6L8f6v%2FOj4nnsKwEOS3gpZkESsxX1%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000649615.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연결이 해제된 상태의 어플&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;연결이 되면 왼쪽, 오른쪽 이어버드 각각의 배터리 잔량도 확인가능하다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnsnHh/btqtWhMgz50/vtBv6jzgmexkz67aS6Kmy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnsnHh/btqtWhMgz50/vtBv6jzgmexkz67aS6Kmy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnsnHh/btqtWhMgz50/vtBv6jzgmexkz67aS6Kmy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnsnHh%2FbtqtWhMgz50%2FvtBv6jzgmexkz67aS6Kmy1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이퀄라이저도 설정 외에도 알림설정, 터치패드, 주변 소리 듣기, 내 이어버드 찾기, 이어버드 정보, Galaxy Wearable 정보가 있는데 하나하나 눌러볼게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000649886.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGYBm/btqtVJoG29J/3pFg1AgWrONbmkKFyZGET0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGYBm/btqtVJoG29J/3pFg1AgWrONbmkKFyZGET0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGYBm/btqtVJoG29J/3pFg1AgWrONbmkKFyZGET0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGYBm%2FbtqtVJoG29J%2F3pFg1AgWrONbmkKFyZGET0%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000649886.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000650029.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz2A4n/btqtSybywps/x0pguzIJZn5mtsJRqwnp4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz2A4n/btqtSybywps/x0pguzIJZn5mtsJRqwnp4K/img.jpg&quot; data-alt=&quot;알림설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz2A4n/btqtSybywps/x0pguzIJZn5mtsJRqwnp4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz2A4n%2FbtqtSybywps%2Fx0pguzIJZn5mtsJRqwnp4K%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000650029.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알림설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;터치패드 사용법은 크게 4가지로 나뉜다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;한 번 누르기 - 곡 재생 또는 일시정지&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;두 번 누르기 - 다음 곡 재생, 전화받기 및 끊기&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;세 번 누르기 - 이전 곡 재생&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;길게 누르기 - 사용자 선택 동작 (설정에서 변경), 전화거절&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000650161.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8aUBk/btqtSxRhcme/q7CCmMZZtuGC2oxaVxH4f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8aUBk/btqtSxRhcme/q7CCmMZZtuGC2oxaVxH4f1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8aUBk/btqtSxRhcme/q7CCmMZZtuGC2oxaVxH4f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8aUBk%2FbtqtSxRhcme%2Fq7CCmMZZtuGC2oxaVxH4f1%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000650161.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000650311.jpg&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;1185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAWcp6/btqtUkwDUmG/PgodQiyTkC8jMMi3hkUuL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAWcp6/btqtUkwDUmG/PgodQiyTkC8jMMi3hkUuL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAWcp6/btqtUkwDUmG/PgodQiyTkC8jMMi3hkUuL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAWcp6%2FbtqtUkwDUmG%2FPgodQiyTkC8jMMi3hkUuL0%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000650311.jpg&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;1185&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000650470.jpg&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;1147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nnvwm/btqtSzuON3i/LkiBx1UZKpS7gvBo3xzfs1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nnvwm/btqtSzuON3i/LkiBx1UZKpS7gvBo3xzfs1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nnvwm/btqtSzuON3i/LkiBx1UZKpS7gvBo3xzfs1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNnvwm%2FbtqtSzuON3i%2FLkiBx1UZKpS7gvBo3xzfs1%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000650470.jpg&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;1147&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000650605.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tm8nv/btqtS7EvEA7/HtyyLKFZoZ6DvVES9g2BIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tm8nv/btqtS7EvEA7/HtyyLKFZoZ6DvVES9g2BIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tm8nv/btqtS7EvEA7/HtyyLKFZoZ6DvVES9g2BIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftm8nv%2FbtqtS7EvEA7%2FHtyyLKFZoZ6DvVES9g2BIk%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000650605.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아래쪽 화면처럼 터치패드 잠금도 제공하고 있으며,&lt;/p&gt;
&lt;p&gt;그 밑에 있는 터치패드 길게 누르기에서 원하는 기능을 선택할 수 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mDJH5/btqtVIwzv67/uRUGRnHWpmsl1bIe9LAMh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mDJH5/btqtVIwzv67/uRUGRnHWpmsl1bIe9LAMh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mDJH5/btqtVIwzv67/uRUGRnHWpmsl1bIe9LAMh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmDJH5%2FbtqtVIwzv67%2FuRUGRnHWpmsl1bIe9LAMh1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;589&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;왼쪽, 오른쪽 이어버드 셀렉트박스엔 공통적으로 음성명령 및 즉시 주변 소리 듣기가 있다&lt;/p&gt;
&lt;p&gt;그리고 어느 한쪽에서 음량을 선택할 경우, 다른 한쪽도 음량으로 자동 변경된다 (왼쪽은 음량 내리기, 오른쪽은 음량 올리기)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b91S5N/btqtUjdqjSe/IBJMkTVRSPw9CsDuiGMwgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b91S5N/btqtUjdqjSe/IBJMkTVRSPw9CsDuiGMwgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b91S5N/btqtUjdqjSe/IBJMkTVRSPw9CsDuiGMwgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb91S5N%2FbtqtUjdqjSe%2FIBJMkTVRSPw9CsDuiGMwgk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbUFM4/btqtUA666BP/k3mnrtD4yekCinw0gOogC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbUFM4/btqtUA666BP/k3mnrtD4yekCinw0gOogC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbUFM4/btqtUA666BP/k3mnrtD4yekCinw0gOogC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbUFM4%2FbtqtUA666BP%2Fk3mnrtD4yekCinw0gOogC1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;445&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이어버드 정보와 Galaxy Wearable 정보에는 다음과 같은 항목들이 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000651148.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ci79S/btqtVJa8NgY/OG98Tgw9ONPkW2joUHVYF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ci79S/btqtVJa8NgY/OG98Tgw9ONPkW2joUHVYF0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ci79S/btqtVJa8NgY/OG98Tgw9ONPkW2joUHVYF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCi79S%2FbtqtVJa8NgY%2FOG98Tgw9ONPkW2joUHVYF0%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000651148.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000651267.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5GWNu/btqtSLaFE3Z/NRDgBVDX8GmR4fJELr6K4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5GWNu/btqtSLaFE3Z/NRDgBVDX8GmR4fJELr6K4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5GWNu/btqtSLaFE3Z/NRDgBVDX8GmR4fJELr6K4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5GWNu%2FbtqtSLaFE3Z%2FNRDgBVDX8GmR4fJELr6K4k%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000651267.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;# 참고&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;블루투스 연결할때 '&lt;b&gt;[Headphone] Galaxy Buds (EDFF)'&lt;/b&gt;라는 이름으로 보인다는 것을 참고하시고, 이만 개봉기를 마치겠습니다 :)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190328_000651404.jpg&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf6I6B/btqtT50J6ED/CxTcntgrKCMgW3VYc0tkak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf6I6B/btqtT50J6ED/CxTcntgrKCMgW3VYc0tkak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf6I6B/btqtT50J6ED/CxTcntgrKCMgW3VYc0tkak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf6I6B%2FbtqtT50J6ED%2FCxTcntgrKCMgW3VYc0tkak%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190328_000651404.jpg&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;677&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Others</category>
      <category>SM-R170</category>
      <category>갤럭시 버드</category>
      <category>갤럭시 버즈</category>
      <category>갤럭시S10</category>
      <category>무선이어폰</category>
      <category>블루투스이어폰</category>
      <category>이어버드</category>
      <category>제품리뷰</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/58</guid>
      <comments>https://kkumalog.tistory.com/entry/f#entry58comment</comments>
      <pubDate>Thu, 28 Mar 2019 08:38:58 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] AWS DynamoDB - Create, Read, Update, Delete (CRUD)</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-AWS-DynamoDB-Create-Read-Update-Delete-CRUD</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;이 페이지는 Node.js 프로젝트에 Amazon AWS DynamoDB를 연결하여 CRUD를 작업하는 방법을 설명하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;DynamoDB와 연결하여 화면출력하는&amp;nbsp;내용은 지난 포스트를 참고한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;참고)&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://kkumalog.tistory.com/50&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://kkumalog.tistory.com/50&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Movies 테이블 데이터 예시&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'year': '2013',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'title': 'Turn It Down, Or Else!',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'info': {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'directors': [&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Alice Smith',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Bob Jones'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;],&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'release_date': '2013-01-18T00:00:00Z',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'rating': 6.2,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'genres': [&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Comedy',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Drama'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;],&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'image_url;&amp;nbsp;: 'http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'plot'&amp;nbsp;: 'A rock band plays their music at high volumes, annoying the neighbors.',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'rank'&amp;nbsp;: 11,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'running_time_secs': 5215,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'actors': [&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'David Matthewman',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Ann Thomas',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'Jonathan G. Neff'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;]&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음 링크에서 샘플 데이터 파일을 다운받을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.02.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.02.html&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;# Create Item (항목 생성)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;항목을 생성할 때에는 반드시 기본 키가 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음 예제에서는 기본 키(year, title) 및 영화에 대한 자세한 정보를 가진 info속성을 추가하는 코드를 나타내고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const AWS = require('aws-sdk');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;// TODO region, accessKeyId, secretAccessKey 입력필요&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;AWS.config.update({&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;region: region,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;accessKeyId: accessKeyId,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;secretAccessKey: secretAccessKey&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const docClient = new AWS.DynamoDB.DocumentClient();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp;params = {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;TableName: 'Movies',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Item: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'year': 2015,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'title', 'The Big New Movie',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'info': {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'plot': 'Nothing happens at all',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'rating': 0&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;docClient.put(params, function(err, data) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (err) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.error(err);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;} else {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log('Add item');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Read Item (항목 읽기)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음 예제에서는 위에서 생성한 항목을 읽어오는 코드를 나타내고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;get 메서드를 사용하는데, 키 값을 지정해야 Movies 테이블에서 항목을 읽어올 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const AWS = require('aws-sdk');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;AWS.config.update({&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;region: region,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;accessKeyId: accessKeyId,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;secretAccessKey: secretAccessKey&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const docClient = new AWS.DynamoDB.DocumentClient();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const params = {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;TableName: 'Movies',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Key: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'year': 2015,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'title': 'The Big New Movie'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;docClient.get(params, function(err, data) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (err) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.error(err);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;} else {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log('Get Item');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Update Item (항목 업데이트)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;기존 속성의 값을 업데이트하거나 새로운 속성을 추가하거나 속성을 제거할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음 예제에서는&amp;nbsp;기존 속성 info의 plot, rating을 수정하고, 새로운&amp;nbsp;actors 항목을&amp;nbsp;추가하는 코드를 나타내고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ReturnValues 파라미터는 DynamoDB에게 업데이트된 속성만 반환하도록 지시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const AWS = require('aws-sdk');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;AWS.config.update({&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;region: region,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;accessKeyId: accessKeyId,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;secretAccessKey: secretAccessKey&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const docClient = new AWS.DynamoDB.DocumentClient();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const params = {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;TableName: 'Movies',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Key: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'year': 2015,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'title': 'The Big New Movie'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;},&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;UpdateExpression: 'set info.rating = :r, info.plot=:p, info.actors=:a',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ExpressionAttributeValues: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;':r': 5.5,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;':p': 'Everything happens all at once',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;':a': ['Larry', 'Moe', 'Curly']&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;},&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ReturnValues: 'UPDATED_NEW'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;docClient.update(params, function(err, data) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (err) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.error(err);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;} else {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log('Update Item');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;조건에 맞는 항목만 업데이트를 하고 싶을 땐, ConditionExpression 파라미터를 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ConditionExpression: 'size(info.actors) &amp;gt; :num',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Delete Item (항목 삭제)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;delete메서드를 사용해 기본 키를 지정함으로써 항목 1개를 삭제할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;수정과 마찬가지로 조건을 만족하는 경우만 선택하려면&amp;nbsp;ConditionExpression 옵션을 선택할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음 예제에서는 평점이 5 이하인 경우 특정 영화 항목을 삭제하는 코드를 나타내고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const AWS = require('aws-sdk');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;AWS.config.update({&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;region: region,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;accessKeyId: accessKeyId,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;secretAccessKey: secretAccessKey&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const docClient = new AWS.DynamoDB.DocumentClient();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp;params = {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;TableName: 'Movies',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Key: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'year: 2015,&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;'title': 'The Big New Movie'&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;},&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ConditionExpression: 'info.rating &amp;lt;= :val',&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ExpressionAttributeValues: {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;':val': 5.0&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;docClient.delete(params, function(err, data) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (err) {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.error(err);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;} else {&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log('Delete Item');&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>AWS</category>
      <category>CRUD</category>
      <category>Dynamodb</category>
      <category>IT</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/57</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-AWS-DynamoDB-Create-Read-Update-Delete-CRUD#entry57comment</comments>
      <pubDate>Sun, 17 Feb 2019 16:29:23 +0900</pubDate>
    </item>
    <item>
      <title>[GA] 이탈률(Bounce Rate) vs 종료율(Exit Rate)</title>
      <link>https://kkumalog.tistory.com/entry/GA-%EC%9D%B4%ED%83%88%EB%A5%A0Bounce-Rate-vs-%EC%A2%85%EB%A3%8C%EC%9C%A8Exit-Rate</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 페이지에서는 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;헷갈리는&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;용어 두가지인 이탈률과 종료율을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;비교하여 설명하고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 이탈률(Bounce Rate)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;해당 페이지로 홈페이지를 처음 방문해 해당 페이지만 보고 나가는 비율. 다시 말해, 다른 페이지로 이동하지 않고 접속한 페이지 하나만 보고 나가버리는 비율.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ 이탈률이 높게 나타난다는 것은 사용자가 홈페지이를 더 볼 것이 없다고 판단했다는 것을 의미하여, 사용자가 원하는 정보가 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;없는지 점검해야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;# 종료율(Exit Rate)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;해당 페이지에서 홈페이지를 종료한 비율.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ 어떤 페이지에서 종료율이 높게 나타난다면 해당 페이지에 문제가 없는지 점검해야한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;# 이탈률 vs 종료율&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;처음 방문한 페이지에서 다른 페이지로 이동하지 않고 종료했다면 이탈률에 포함.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다른 페이지로 이동했다가 다시 처음 방문한 페이지로 돌아와 종료했다면 종료율에 포함.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Example 1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;session1. A &amp;gt; B &amp;gt; C &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;session2. B &amp;gt; A &amp;gt; C &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;session3. A &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;session4. C &amp;gt; B &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;이탈률&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;A의 이탈률 : 50% (1/2)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ A로 시작하는 세션 2개 中 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;A에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;B의 이탈률: 0%&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ B에서 시작하고 B에서 끝난 세션이 존재하지 않는다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;C의 이탈률: 0%&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ C&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;에서 시작하고 C&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;에서 끝난 세션이 존재하지 않는다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;종료율&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;A의 종료율: 약 33% (&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;1/3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ A가 포함된 세션 3개 中 A에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;B의 종료율: 약 33&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;% (1/3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ B&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;가 포함된 세션 3개 中 B&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;C의 종료율: 약 66&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;% (2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;/3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;→ C&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;가 포함된 세션 3개 中 C&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 종료된 세션 2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Example 2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;session1. B&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;gt; A&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;gt; C &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;session2. B&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;session3. A &amp;gt; C &amp;gt; B &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;session4. C &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;session5. B &amp;gt; C &amp;gt; A &amp;gt; Exit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;이탈률&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;A의 이탈률 : &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;0%&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ A&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;에서 시작하고 A&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 끝난 세션이 존재하지 않는다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;B의 이탈률: 약 33&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;% (1/3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ B&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;로 시작하는 세션 3&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개 中 B&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;C의 이탈률: 100&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ C&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;로 시작하는 세션 1&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개 中 C&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;종료율&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;A의 종료율: 약 33% (&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1/3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ A가 포함된 세션 3개 中 A에서 종료된 세션 1개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;B의 종료율: &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;50% (2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;/4&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ B&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;가 포함된 세션 4&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개 中 B에서 종료된 세션 2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;C의 종료율: 50% (2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;/4&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ C&lt;/span&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;가 포함된 세션 4&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개 中 C에서 종료된 세션 2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;개&lt;/span&gt;&lt;/p&gt;</description>
      <category>Book/Google Analytics</category>
      <category>Analytics</category>
      <category>GA</category>
      <category>Google</category>
      <category>Google Analytics</category>
      <category>IT</category>
      <category>구글 애널리틱스</category>
      <category>분석</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/55</guid>
      <comments>https://kkumalog.tistory.com/entry/GA-%EC%9D%B4%ED%83%88%EB%A5%A0Bounce-Rate-vs-%EC%A2%85%EB%A3%8C%EC%9C%A8Exit-Rate#entry55comment</comments>
      <pubDate>Fri, 8 Feb 2019 09:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[GA] 구글 애널리틱스(Google Analytics)란?</title>
      <link>https://kkumalog.tistory.com/entry/GA-%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%84%90%EB%A6%AC%ED%8B%B1%EC%8A%A4Google-Analytics%EB%9E%80</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 분석의 시작&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;블로그를 시작하면서 여러 통계 정보를 확인하고 싶다는 생각을 하게되었다.&amp;nbsp;그러려면 어떻게든 데이터를 수집하고 수집된 데이터를 확인할 수 있는 통계 페이지가 있어야 하는데 어떻게 마련해야 하나 막막하기만 하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;바로 이럴때 누구나 쉽게 홈페이지의 데이터를 분석하고 확인할 수 있게 도와주는 도구인 구글 애널리틱스(Google Analytics)이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.google.com/analytics/web/?hl=ko&amp;amp;pli=1&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;https://www.google.com/analytics/web/?hl=ko&amp;amp;pli=1&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 웹로그&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;사용자가 어떻게 웹 서비스를 이용하고 있는지 분석하기 위해 수집하는 데이터로, 어떤 사용자가 어느 페이지에 언제 접속했는지 얼마나 오래 머물렀는지 등의 데이터를 말한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;그렇다면 웹 로그는 왜 수집하는 걸까?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;그 답은 웹 로그를 분석해 더 나은 웹 서비스를 제공하기 위해서다. 웹로그를 수집하고 분석하면 웹 서비스를 운영하는데 유용한 정보를 얻을 수 있기 때문이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 웹로그 분석 과정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) 웹 로그 분석의 목적을 정한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) 목적에 부합하는 데이터를 수집한다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3) 수집된 데이터를 분석한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4) 분석 결과를 바탕으로 행동한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;5) 다시 목적, 수집, 분석, 행동을 반복한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 구글 애널리틱스의 정의와 역할&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;구글 애널리틱스는 앞서 설명한 웹 로그 분석을 쉽게 진행할 수 있도록 도와주는 도구이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;프로그래밍 코드를 작성하고, 수집한 주소를 데이터베이스에 저장한 뒤 데이터베이스에서 SQL로 데이터를 추출하는 과정을 생략할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) 자동으로 데이터를 수집하고 저장한다&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;- 데이터 수집 계획 없이, 데이터 수집 프로그래밍 코드없이도 데이터 분석에 자주 사용되는 기본적인 정보를 자동으로 수집하여 데이터베이스에 저장한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) 데이터 확인을 위한 보고서와 검색 기능을 제공한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 구글 애널리틱스, 누가 사용할까&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) 마케터&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;마케터는 구글 애널리틱스의 각종 요소를 이용해 어떤 상품을, &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;어떤 대상에게, &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;어디에 마케팅을 진행할 것인지 확인하여 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;마케팅의 효율을 극대화할 수 있다&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) 기획자&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;기획자는 사용자가 실제로 홈페이지를 어떻게 사용하는지 확인하여, &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;자신이 담당하는 서비스의 사용자 경험을 개선할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3) 디자이너&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;디자이너는 기본적으로 기획자와 같은 목표로 구글 애널리틱스를 사용한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:10pt;&quot;&gt;어떤 부분이 사용성에 안 좋은 영향을 끼치는지 확인하여 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;자신의 디자인이 실제 사용자 행동을 불러일으키는지, 비즈니스 목표에 부합하는지 알 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4) CEO&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;CEO는 DAU, MAU같은 사용자 지표를 확인할 수 있다. 원하는 데이터를 원하는 시점에 확인해 의사 결정을 하기 위해서는 다른 어느 직군보다도 구글 애널리틱스를 잘 다루어야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Book/Google Analytics</category>
      <category>Analytics</category>
      <category>GA</category>
      <category>Google</category>
      <category>Google Analytics</category>
      <category>IT</category>
      <category>구글 애널리틱스</category>
      <category>분석</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/54</guid>
      <comments>https://kkumalog.tistory.com/entry/GA-%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%84%90%EB%A6%AC%ED%8B%B1%EC%8A%A4Google-Analytics%EB%9E%80#entry54comment</comments>
      <pubDate>Tue, 5 Feb 2019 08:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Login Authentication With Passport</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Login-Authentication-With-Passport</link>
      <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;이 페이지에서는 passport.js 패키지를 이용하여 로그인을 구현하는 방법을 설명하고 있다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;# 패키지 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;우선 아래의 코드를 이용해서 패키지를 설치한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;npm install passport passport-local express-session&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport passport-local은 로그인을 구현할 때, express-sesion은 로그인 후 세션에 유저정보를 입력할 때 사용될 것이다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 화면구현 Code&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;api를 호출해서 화면에 출력하는 과정에 대해서는 지난 포스트에서 설명했다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;참고)&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://kkumalog.tistory.com/49&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://kkumalog.tistory.com/49&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;이번에는 폼을 출력하고 폼에 입력한 데이터들을 post로 넘겨주는 과정을 설명하려한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;form action=&quot;/login&quot; method=&quot;post&quot;를 해석하면, /login 주소로 form data를 post방식으로 넘겨준다는 뜻이다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;1) api/test.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;function&amp;nbsp; templateHTML() {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;return&amp;nbsp; `&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;form action=“/login” method=“post”&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;label&amp;gt;UserId:&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;input type=“text” name=“username”/&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;label&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;input type=“password” name=“password”/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;button type=“submit”&amp;gt;Submit&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;`;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;exports.loginForm =&amp;nbsp; &amp;nbsp;function&amp;nbsp; getLoginForm(req, res, next) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;res.send(templateHTML());&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;2) router/test.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp; router = require(‘express’).Router();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp; test = require(‘../api/test’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.get(‘/‘, test.loginForm);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;module.exports = router;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;3) 로그인 화면 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://localhost:3000/test&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3000/test&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3000/test&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 608px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9929F6445C47037911&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9929F6445C47037911&quot; width=&quot;608&quot; height=&quot;378&quot; filename=&quot;0ca8f60ee2a5df8bb2f1de81d7bc93d3.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;# 로그인구현&amp;nbsp;Code&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;로그인폼에서 받아온 username, password를&amp;nbsp;passport.js를 이용해서 로그인 인증을 구현한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;코드 설명에 앞서, 흐름을 간단하게 설명하면 다음과 같다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;- admin테이블에 있는 유저들과&amp;nbsp;입력된 값을 비교한다&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;- username이 존재한다면, 암호화되어있는 유저 비밀번호를&amp;nbsp;해독(복호화, decryption)하여 비교한다&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;- 로그인 후에는 세션에 유저정보를 저장한다&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;1) database/dynamodb/admin.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp; router = require(‘express’).Router();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const&amp;nbsp; test = require(‘../api/test’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.get(‘/‘, test.loginForm);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;module.exports = router;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;2) passport.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const passport = require(‘passport’),&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;LocalStrategy = require(‘passport-local’).Strategy;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const bcrypt = require(‘bcrypt-nodejs’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const adminDB = require(‘../database/dynamodb/admin’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;exports.setup = async function() {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport.use(‘login’, new LocalStrategy({&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;usernameField: ‘username’,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passwordField: ‘password’,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;session: true,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passReqToCallback: true,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;async function (req, username, password, done) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const users = await adminDB.getAdmin();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;for ( const user&amp;nbsp; of users) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (username === user.id) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (bcrypt.compareSync(password, user.pw)) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 12em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;return done(null, user);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 10em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;return done(null, false, {message: ‘Not found user’})&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;} catch (err) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;return Promise.reject(err);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport.serializeUser(function (user, done) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;done(null, user);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport.deserializeUser(function (user, done) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;done(null, user);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;serializeUser는 로그인 성공 시 실행되는&amp;nbsp; done(null, user)에서 user 객체를 받아 req.session.passport.user 세션에 저장한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;저장된 세션은 페이지 이동 시에도 로그인 정보가 유지된다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;deserializeUser는 서버로 들어오는 요청마다 세션 정보를 실제 DB의 데이터와 비교한다. 해당하는 유저 정보가 있으면 done의 두 번째 인자를 req.user에 저장하고, 요청을 처리할 때 유저의 정보를 req.user를 통해서 넘겨준다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport를 동작시키게하기위해서는 이 두 메서드는 꼭 필요하다&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;3) api/login.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const passport = require(‘passport’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;require(‘../libs/passport’).setup();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;exports.getLogin = async (req, res, next) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;let isValid = true;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (!req.body.username){&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;isValid = false;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (!req.body.password){&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;isValid = false;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;if (isValid) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;passport.authenticate(‘login’, {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;successRedirect: ‘/login/success’,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;failureRedirect: ‘/login/failure’&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;})(req, res, next);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;catch (errors) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;return next(errors);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;exports.loginSuccess = async (req, res, next) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;res.redirect(“success”);&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;exports.loginFailure = async (req, res, next) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;res.send(“fail”);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;4) router/login.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const router = require(‘express’).Router();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const login = require(‘../api/login’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.post(‘/‘, login.getLogin);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.get(‘/success’, login.loginSuccess);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.get(‘/failure’, login.loginFailure);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;module.exports = router;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;5) app.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const express = require(‘express’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const app =&amp;nbsp; express();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const bodyParser = require(‘body-parser’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const passport = require(‘passport’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const session = require(‘express-session’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const main = require(‘./router/main’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const admin = require(‘./router/admin’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const test = require(‘./router/test’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const login = require(‘./router/login’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(bodyParser.json());&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(bodyParser.urlencoded({ extended:&amp;nbsp; false }));&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(session({&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;secret: ‘!@#’,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;resave:&amp;nbsp; false ,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;saveUninitialized:&amp;nbsp; true&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(passport.initialize());&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(passport.session());&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use('/', main);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use('/admin', admin);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use('/test', test);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use('/login', login);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.listen(3000, function() {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log(‘Example app listening on port 3000!’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 로그인 코드 실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://localhost:3000/login/success&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3000/login/success&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3000&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;https://localhost:3000/login/success&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;/login/success&lt;/a&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 610px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DB13485C47037938&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DB13485C47037938&quot; width=&quot;610&quot; height=&quot;457&quot; filename=&quot;a363a46f6f47399dff0e01e5a8fa8915.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://localhost:3000/login/failure&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3000/login/failure&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3000/login/failure&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 450px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D860495C47037934&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D860495C47037934&quot; width=&quot;450&quot; height=&quot;343&quot; filename=&quot;60141be9b182f6dd2e8900d9bf4e3790.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>authentication</category>
      <category>IT</category>
      <category>login</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>passport</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/52</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Login-Authentication-With-Passport#entry52comment</comments>
      <pubDate>Sat, 2 Feb 2019 08:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Connecting to Amazon AWS DynamoDB</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Connecting-to-Amazon-AWS-DynamoDB</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;이 페이지는 Node.js 프로젝트에 Amazon AWS DynamoDB를 연결하는 방법에 대해 설명하고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;폴더 구조에 관련한 내용은 지난 포스트를 참고한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;참고)&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/49&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/49&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$ npm install aws-sdk&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Code&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;여기서는 AWS DynamoDB의 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;'version'테이블&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 version 필드값이&amp;nbsp;'a'인 데이터를 가져오는 과정에 대한 코드를 나타내고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;(코드는 DB와 직접 연결하는 database폴더&amp;nbsp;→ 서버를 실행하는 app.js 순서로 설명한다. 또한 예시를 위해 aws 설정 관련 코드를 같은 파일에 작성했으나,&amp;nbsp;실제로는 코드의 재사용성을 위해 다른 파일로 분리하여 사용하고 있다)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) database/version.js&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const AWS = require(‘aws-sdk’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const doc = new AWS.DynamoDB.DocumentClient();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;//TODO region, accessKeyId, secretAccessKey 입력필요&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;AWS.config.update({&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;region: region,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;accessKeyId : accessKeyId,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;secretAccessKey: secretAccessKey&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const TableNameTree = {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;version: ‘version’&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const getVersion = async function getVersion() {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt; let data = await doc.query({&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;TableName: TableNameTree.version,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;KeyConditionExpression: '#version = :version',&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;ExpressionAttributeValues: { ':version': 'a' },&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;ExpressionAttributeNames: { '#version': 'version' },&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}).promise();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;if (data &amp;amp;&amp;amp; data.Items) data = data.Items;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;return data;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;} catch (err) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;return Promise.reject(err);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;module.exports = {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;getVersion&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) api/version.js&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;const versionDB = require(‘../database/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;version’);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const printVersion = async function getVersion(req, res, next) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const v = await versionDB.getVersion();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;res.send(v);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}&amp;nbsp; catch (e) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;res.send(e);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;module.exports = {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;printVersion&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3) router/version.js&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const router = require(‘express’).Router();&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const version = require(‘../api/version’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;router.get(‘/‘, version.printVersion);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;module.exports = router;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4) app.js&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const express = require(‘express’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const version = require(‘./router/version’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const app =&amp;nbsp; express();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;app.get(‘/‘,&amp;nbsp; function (req, res) {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;res.send(‘Hello World!’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;app.use(‘/version’, version);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;app.listen(3001,&amp;nbsp; function () {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;console.log(‘Example app listening on port 3001!’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 서버실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;a href=&quot;https://localhost:3001/version&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3001/version&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3001/version&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; 을 실행하면 obejct타입으로 결과를 얻을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>Amazon</category>
      <category>IT</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/50</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Connecting-to-Amazon-AWS-DynamoDB#entry50comment</comments>
      <pubDate>Wed, 30 Jan 2019 15:46:29 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Create Node.js Project in IntelliJ IDEA(2)</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Create-Nodejs-Project-in-IntelliJ-IDEA2</link>
      <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이전에 IntelliJ에서 Node.js 프로젝트를 생성해보았는데, 이 페이지에서는 Terminal을 통해 생성하는 방법과 폴더 구조에 대해&amp;nbsp;알아본다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;참고)&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/48&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/48&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Terminal을 통한 Node.js 프로젝트 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;원하는 디렉토리에 폴더를 생성한다. (ex-TestProject)&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$ cd TestProject/&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$npm init&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;이 명령을 실행하면 애플리케이션의 이름 및 버전과 같은 몇 가지 정보에 대해 프롬프트한다. 대부분의 항목에서 ENTER 키를 눌러 기본값을 수락할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;This utility will walk you through creating a package.json file.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;It only covers the most common items, and tries to guess sensible defaults.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;See `npm help json` for definitive documentation on these fields&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;and exactly what they do.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;Use `npm install &amp;lt;pkg&amp;gt;` afterwards to install a package and&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;save it as a dependency in the package.json file.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;Press ^C at any time to quit.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;package name: (testproject)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;version: (1.0.0)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;description:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;entry point: (index.js)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;test command:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;git repository:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;keywords:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;author:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;license: (ISC)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;About to write to /Users/kkuma/TestProject/package.json:&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“name”: “testproject,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“version”: “1.0.0”,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“description”: “”,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“main”: “index.js”,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“scripts”: {&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“test”: “echo \”Error: no test specified\” &amp;amp;&amp;amp; exit 1”&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“author”: “”,&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;“license”: “ISC”&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;Is this OK? (yes)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$ pwd&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;pwd (print working directory, 현재 작업 중인 디렉터리의 이름을 출력)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$ npm install express —save&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;express를 임시로 설치하고 종속 항목 목록에 추가하지 않으려면, —save 옵션 생략&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;→&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;npm install express&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;npm install body-parser&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# app.js 파일 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;- 이전 포스트로 이미 시작을 했다면, app.js는 이미 존재할 것이다. 아래의 package를 설치한 후 다음단계부터 진행하면된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9938234E5C4083FA03&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9938234E5C4083FA03&quot; width=&quot;820&quot; height=&quot;545&quot; filename=&quot;eb23873f100dde17267688ae24199777.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;api, router 폴더 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 279px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9912C73C5C4083FA36&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9912C73C5C4083FA36&quot; width=&quot;279&quot; height=&quot;314&quot; filename=&quot;3a7536007288878ee7c1f2c38ad2e176.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;구조는 app.js&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;→&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;router&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;→&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;api 순으로 호출을 하여 사용할 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Code&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;이 페이지는 Node.js로 프로젝트를 생성하고, router를 이용하는 방법을 설명하고있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;(추후에 로그인페이지를 구현하고자해서 파일의 이름은 login.js를 사용한다.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;1) app.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const express = require(‘express’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const login = require(‘./router/login’);&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const app =&amp;nbsp; express();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.get(‘/‘, function(req, res) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;res.send(‘Hello World!’);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.use(‘/login’, login);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;app.listen(3001, *function*() {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;console.log(‘Example app listening on port 3001’);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;2) router/login.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const router = require(‘express’).Router();&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;const login = require(‘../api/login’);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;router.get(‘/‘, login);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;module.exports = router;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;b&gt;3)&amp;nbsp; api/login.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;const login = function getLogin(req, res, next) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;res.send(‘Login Page’);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;module.exports = login;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;함수의 파라미터 순서는 req, res, next 이다. 파라미터의 순서가 바뀌면 에러가 생겨 진행할 수 없을 수도 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;만약 정의된 함수가 여러개라면 module.exports = { login, logout, signup} 형태로 사용할 수 있는데, 이 경우에는 라우터에서도 객체 형태로 받게된다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;ex) const api = require(‘../api/login’);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;router.get(‘/‘, api.login);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 서버실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;app.js를 실행한다 &lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 102, 102); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;Run ‘app.js’ 또는 Debug ‘app.js’)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 10pt;&quot;&gt;&lt;a href=&quot;https://localhost:3001&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3001&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3001&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 541px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991553365C4083FB34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991553365C4083FB34&quot; width=&quot;541&quot; height=&quot;338&quot; filename=&quot;ac97975b3c393e212210684af9447aa6.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;a href=&quot;https://localhost:3001/login&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://&lt;/a&gt;&lt;a href=&quot;https://localhost:3001/login&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;localhost:3001/login&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 489px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9990DB335C409B3203&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9990DB335C409B3203&quot; width=&quot;489&quot; height=&quot;284&quot; filename=&quot;03782526c2251f4443861ff4c599a141.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>intellij</category>
      <category>IT</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/49</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Create-Nodejs-Project-in-IntelliJ-IDEA2#entry49comment</comments>
      <pubDate>Mon, 28 Jan 2019 12:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Create Node.js Project in IntelliJ IDEA</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Create-Nodejs-Project-in-IntelliJ-IDEA</link>
      <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;이 페이지는 IntelliJ IDEA (인텔리제이)에서 프로젝트를 생성하고, Node.js 개발환경을 구축하는 방법에 대해서 설명하고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;File - New Project 선택&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Node.js and NPM&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ Node.js Express App&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Project name 작성 후, options/Template 변경 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Pug(Jade) → EJS&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 739px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A8E3415C3F15102C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A8E3415C3F15102C&quot; width=&quot;739&quot; height=&quot;554&quot; filename=&quot;14581f6dec9f9e2dec9b3aee52853002.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 735px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E74B455C3F150F0B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E74B455C3F150F0B&quot; width=&quot;735&quot; height=&quot;558&quot; filename=&quot;21a0651064b93508674c764562ddf274.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 플러그인 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Preferences → Plugins → Marketplace에서 EJS, NodeJs 설치&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AD22415C3F151004&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AD22415C3F151004&quot; width=&quot;820&quot; height=&quot;566&quot; filename=&quot;9f0ba88104f4555602522d05a6eb68b1.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B188335C3F15101D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B188335C3F15101D&quot; width=&quot;820&quot; height=&quot;575&quot; filename=&quot;fd932b0a0087db05f110e4e93a485c0e.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;설치가 완료되면 Installed에서 EJS와 NodeJS를 확인할 수 있다&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B691375C3F151007&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B691375C3F151007&quot; width=&quot;820&quot; height=&quot;555&quot; filename=&quot;979bc1427317b299b1b09d56e9facca9.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 서버&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;app.js파일을 &lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;실행한다 (Run ‘app.js’ 또는 Debug ‘app.js’)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;기본적으로 세팅된 Node.js Express App은 www로 실행되며, 기본 포트는 3000으로 설정되어있다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://localhost:3000&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://localhost:3000&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;을&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;실행해서 아래의 화면을 만났다면,&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;이제 Node.js로 공부할 준비가 끝난거다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&quot;Welcome to Express&quot;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AFBE3C5C3F15110D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AFBE3C5C3F15110D&quot; width=&quot;820&quot; height=&quot;594&quot; filename=&quot;01aee67e8d2fc61946f80baa6caca518.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>IT</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>Programming</category>
      <category>Server</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/48</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Create-Nodejs-Project-in-IntelliJ-IDEA#entry48comment</comments>
      <pubDate>Sat, 26 Jan 2019 10:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[IT] Linux Crontab</title>
      <link>https://kkumalog.tistory.com/entry/IT-Linux-Crontab</link>
      <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;기본개념&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;소프트웨어 유틸리티&amp;nbsp; cron은 유닉스계열 컴퓨터 운영체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Cron은 셸 명령어들이 주어진 일정에 주기적으로 실행하도록 규정해놓은 crontab파일에 의해 구동된다. crontab파일들은 잡 목록 및 cron 데몬에 대한 다른 명령들이 보관된 위치에 저장되어 있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;형식&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;┌────────분 (0 - 59)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ ┌──────── 시 (0 - 23)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ │ ┌───────── 일 (1 - 31)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ │ │ ┌────────── 월 (1 - 12)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ │ │ │ ┌─────────── 요일 (0 - 7) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일, 7:일요일)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ │ │ │ │&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;│ │ │ │ │&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;* * * * *&amp;nbsp; 수행할 명령어&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;명령어&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;$ crontab -e&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;편집할 수 있는 곳이 로딩되는데, 여기서 크론탭을 설정할 수 있다. 각종 크론탭 명령어를 입력한 후 콜론(:) wq 를 입력해 크론탭을 갱신시킨다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;$ crontab -l&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;
&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;현재 크론탭에 어떤 내용이 들어있는지 확인한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;$ crontab -r&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;
&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;위 명령어로 크론탭을 지울 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;예시&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;다음은 cron 사용자의 기본 셸이 본 셸 호환이라는 가정 하에 매일 자정 이후 1분 째에 아파치 오류 로그를 삭제한다.&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;1 0 * * *&amp;nbsp; printf &amp;gt; /var/log/apache/error_log&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;아래의 예는 매일 20시 (오후 8시)에 export_dump.sh라는 셸 프로그램을 실행한다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;0 20 * * * /home/oracle/scripts/export_dump.sh&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;*Linux기반이 아닌 Java/Spring에서도 cron을 사용할 수 있는데, schedule task를 생성하고 아래의 어노테이션(annotation)을 이용하여 수행할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;@Scheduled(cron = “* * * * * ?”)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/Cron&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;위키백과, 우리 모두의 백과사전 (&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/Cron&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://ko.wikipedia.org/wiki/Cron)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>cron</category>
      <category>cron job</category>
      <category>crontab</category>
      <category>crontab job</category>
      <category>IT</category>
      <category>Linux</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/47</guid>
      <comments>https://kkumalog.tistory.com/entry/IT-Linux-Crontab#entry47comment</comments>
      <pubDate>Wed, 23 Jan 2019 08:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Get data from excel file</title>
      <link>https://kkumalog.tistory.com/entry/Spring-Get-data-from-excel-file</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 페이지는 Excel에 있는 데이터를 가져와서 이용할 수 있는 방법에 대해 설명하고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# excel file format&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;txc-table&quot; width=&quot;175&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 175px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 86px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 88px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;A&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 86px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 88px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;test1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 86px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 88px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;test2&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 86px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 88px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;tes&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;t3&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Get data from excel file&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;public void ExcelTest(MultipartFile excel) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;try {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;Workbook workbook = WorkbookFactory.create(excel.getInputStream());&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;Sheet sheet = workbook.getSheetAt(0);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;DataFormatter dataFormatter = new DataFormatter();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;sheet.forEach(row -&amp;gt; {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;String data = dataFormatter.formatCellValue(row.getCell(0));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;list.add(data);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;});&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;} catch (IOException | InvalidFormatException e) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;e.printStackTrace();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;System.out.println(list);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/pre&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;→&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;output&lt;/span&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;[&quot;test1&quot;, &quot;test2&quot;, &quot;test3&quot;]&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;위의 코드를 실행하면 엑셀파일에 입력된 데이터들을 얻어낼 수 있고, 사용에 따라 출력이 아닌 다른 작업으로 수정하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>Java</category>
      <category>Programming</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/46</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-Get-data-from-excel-file#entry46comment</comments>
      <pubDate>Sun, 20 Jan 2019 11:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[IT] Request SMS Vertification on the Server</title>
      <link>https://kkumalog.tistory.com/entry/IT-Request-SMS-Vertification-on-the-Server</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 페이지는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;문자 인증서비스를 할 수 있는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;google SMS Retriever API&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;를 서버측에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이용하는 방법을 설명하고 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;SMS Retriever API는 Play 서비스 버전 10.2 이상이 설치된 Android 기기에서만 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;참고페이지)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;a href=&quot;https://developers.google.com/identity/sms-retriever/overview&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Automatic SMS Verification with the SMS Retriever API&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;a href=&quot;https://developers.google.com/identity/sms-retriever/verify&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Perform SMS Verification on a Server&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992F01425C36A12206&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992F01425C36A12206&quot; width=&quot;820&quot; height=&quot;309&quot; filename=&quot;img_sms_retriever_api_flow.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1) Obtain the user's phone number in Android&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;안드로이드에서 사용자 전화번호를 E164 형식으로 얻을 수 있는데, 경우에 따라 전화번호를 가져오지 못하는 경우가 있을 수 있다. 이 경우 사용자가 수동으로 입력하는 방법으로 진행해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ E164 format : 국제 표준화기구에서 정의한 국제 전화번호 형식.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;ex) +821012345678&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2) Construct a verification message&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;안드로이드에서 서버에게 확인 요청을 하면, 서버는 확인 메세지를 생성하고 전송받은 전화번호로 메시지를 보내게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;→ 사용자의 장치로 보낼 “확인 메시지”는 다음 조건들을 충족해야한다.&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;140 바이트 이하여야 한다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;접두어로 시작해야한다. &amp;lt;#&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;검증을 완료하기 위해 클라이언트가 서버로 다시 보내는 일회성 코드를 포함해야한다. (2-1 참조)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;앱을 식별하는 11자의 해시 문자열로 끝납니다 (2-2 참조)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;일회성 코드는 쉽게 추출할 수 있게 만드는 것이 좋은데, 위의 조건을 만족하는 확인 메시지는 다음과 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;#&amp;gt; ExampleApp 코드 : 123ABC78&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;FA + 9qCX9VSu&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;** 맨 앞에 &amp;lt;#&amp;gt; 값과 맨 뒤에 11자리의 해쉬값이 무조건 들어가야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2-1) Generating a one-time code&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;여러 가지 방법으로 일회성 코드를 구현할 수 있으며, 클라이언트가 코드를 서버로 다시 보낼 때 이 코드를 사용자 또는 전화 번호에 연결할 수 있다. 사용자가 직접 코드를 입력해야하는 상황이 생길수도 있으니 코드를 쉽게 입력해야한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;다양한 방법 중 일회성 코드를 구현하는 한 가지 방법은 데이터베이스 테이블에서 키로 사용하는 난수로 생성하는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;2-2) Computing your app's hash string&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Google Play 서비스는 해시 문자열을 사용하여 앱에 보낼 확인 메시지를 결정하는데, 해시 문자열은 앱의 패키지 이름과 앱의 공개 키 인증서로 구성됩니다. 해시 문자열을 생성하려면 다음과 같은 방식으로 진행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;앱의 공개 키 인증서를 소문자 문자열로 사용한다. keystore에서 16진수 문자열을 가져 오려면 다음 명령을 입력하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ keytool -alias MyAndroidKey -exportcert -keystore MyProduction.keystore | xxd -p | tr -d &quot;[:space:]&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;하나의 공백으로 구분하여 앱의 패키지 이름에 16 진수 문자열을 추가한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;결합 된 문자열의 SHA-256 합계를 계산한다. SHA-256 합을 계산하기 전에 문자열에서 공백을 제거해야한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Base64- SHA-256 합계의 이진 값을 인코딩하는데, 먼저 출력 형식에서 SHA-256 합계를 디코딩 해야 할 수도 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;앱의 해시 문자열은 base64 인코딩 해시의 처음 11자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;다음 명령은 앱의 프로덕션 키 저장소에서 해시 문자열을 계산하게 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ keytool -exportcert -alias MyAndroidKey -keystore MyProductionKeys.keystore | xxd -p | tr -d &quot;[:space:]&quot; | echo -n com.example.myapp `cat` | sha256sum | tr -d &quot;[:space:]-&quot; | xxd -r -p | base64 | cut -c1-11&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;(또는 SMS 검색기 샘플 응용 프로그램 의 AppSignatureHelper 클래스를 사용하여 응용 프로그램의 해시 문자열을 가져올 수 있는데, helper 클래스를 사용하는 경우 해시 문자열을 얻은 후 앱에서 해당 클래스를 제거해야한다. 확인 메시지에서 클라이언트에서 동적으로 계산 된 해시 문자열을 사용하지 않는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;3) send SMS&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;서버가 기존에 구축한 SMS 서비스를 사용하여 지정한 전화번호로 위에서 생성한 확인메시지를 보낼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;(그 이후는 클라이언트측에서 메시지가 수신되면 일회성 코드를 캐치할 것이다.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;4) Verify the one-time code when it's returned&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;전화 번호 확인 서버에서 클라이언트 응용 프로그램로부터 받은 일회성 코드를 수신하는데 아래와 같은 flow로 진행한다.&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;코드가 유효하고 만료되지 않았는지 확인한다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;코드에 링크 된 사용자가 전화 번호 확인을 완료했음을 기록한다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;코드의 데이터베이스 레코드를 제거하거나 다른 방법으로 같은 코드를 다시 사용할 수 없도록 해야한다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;사용자의 확인 상태를 기록하고 데이터베이스에서 코드를 제거하면 확인이 완료된다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>googleapi</category>
      <category>IT</category>
      <category>Programming</category>
      <category>SMS Verification</category>
      <category>안드로이드</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/45</guid>
      <comments>https://kkumalog.tistory.com/entry/IT-Request-SMS-Vertification-on-the-Server#entry45comment</comments>
      <pubDate>Thu, 17 Jan 2019 09:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] How to get AWS S3 bucket list</title>
      <link>https://kkumalog.tistory.com/entry/Spring-How-to-get-AWS-S3-bucket-list</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이전에&amp;nbsp;S3 버킷을 지정하고 그 안의 객체를 가져오는 내용에 대해서 작성했는데, 이번에는 S3 리스트를 가져오는 내용에 대해 작성하려한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;AWSConfig.java는 이전에 작성했던 게시글&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 작성했던 코드를 그대로 이용한다. (이전에도 언급했듯이, 저는 하나의 파일을 만들어두고 필요한 경우 불러오는 형태로 작업하고 있습니다)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Reding S3 text file as a string - &lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/39&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/39&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Uploading String to Amazon S3 -&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/38&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/38&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;#AWSConfig.java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_ACCESS_KEY_ID}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String accessKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_SECRET_KEY}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String secretKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${spring.aws.region}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String region;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public BasicAWSCredentials basicAWSCredentials() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new BasicAWSCredentials(accessKey, secretKey);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AWSCredentialsProvider awsCredentialsProvider(AWSCredentials awsCredentials) {&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new AWSCredentialsProvider() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;public AWSCredentials getCredentials() { return awsCredentials; }&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt; public void refresh() {} &lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;}; &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AmazonS3 amazonS3Client(AWSCredentialsProvider awsCredentialsProvider) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return AmazonS3ClientBuilder&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.standard()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withCredentials(awsCredentialsProvider)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withRegion(Regions./fromName/(region))&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.build();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Get AWS S3 bucket list&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;AmazonS3 s3Client = awsConfig.amazonS3Client(awsConfig.awsCredentialsProvider(awsConfig.basicAWSCredentials()));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;List&amp;lt;Bucket&amp;gt; buckets = s3Client.listBuckets();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;for (Bucket bucket : buckets) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;System.out.println(bucket.getName());&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;위의 코드를 실행하면 S3 버킷리스트를 출력할 수 있고, 사용에 따라 출력이 아닌 다른 작업으로 수정하면 된다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>Amazon</category>
      <category>IT</category>
      <category>Java</category>
      <category>Programming</category>
      <category>S3</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/44</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-How-to-get-AWS-S3-bucket-list#entry44comment</comments>
      <pubDate>Mon, 14 Jan 2019 09:16:41 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] How to get list objects in AWS S3 bucket</title>
      <link>https://kkumalog.tistory.com/entry/Spring-How-to-get-list-objects-in-AWS-S3-bucket</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 페이지는 S3 버킷을 지정하고 그 안의 객체를 가져오는 내용을 설명하고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;AWSConfig.java는 이전에 작성했던&amp;nbsp; &lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/39&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;'Reading S3 text file as a string&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://kkumalog.tistory.com/39&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;'&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;에서 작성했던 코드를 그대로 이용한다. (저는 하나의 파일을 만들어두고 필요한 경우 불러오는 형태로 작업하고 있습니다)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# AWSConfig.java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;S3 파일에 접근하기 위해서는 aws 설정이 필요합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;우선 보안상 / 코드의 효율성을 위해 다른 곳에 설정되어 있는&amp;nbsp; AWS ACCESS KEY, SECRET KEY, region 을 가져오는 코드를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_ACCESS_KEY_ID}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String accessKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_SECRET_KEY}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String secretKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${spring.aws.region}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String region;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public BasicAWSCredentials basicAWSCredentials() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new BasicAWSCredentials(accessKey, secretKey);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AWSCredentialsProvider awsCredentialsProvider(AWSCredentials awsCredentials) {&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new AWSCredentialsProvider() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;public AWSCredentials getCredentials() { return awsCredentials; }&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt; public void refresh() {} &lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;}; &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AmazonS3 amazonS3Client(AWSCredentialsProvider awsCredentialsProvider) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return AmazonS3ClientBuilder&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.standard()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withCredentials(awsCredentialsProvider)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withRegion(Regions./fromName/(region))&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.build();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Get list object in AWS S3 bucket&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;AmazonS3 s3Client = awsConfig.amazonS3Client(awsConfig.awsCredentialsProvider(awsConfig.basicAWSCredentials()));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;ObjectListing objectListing = s3Client.listObjects(BucketName, prefix); //prefix가 필요하지 않은 경우 다음과 같이 사용할 수도 있다. =&amp;gt; ObjectListing objectListing = s3Client.listObjects(BucketName);&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;for(S3ObjectSummary s : objectListing.getObjectSummaries()) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;System.out.println(s.getKey());&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;위의 코드를 실행하면 s3 버킷에 들어있는 파일리스트를 출력할 수 있고, 사용에 따라 출력이 아닌 다른 작업으로 수정하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>Amazon</category>
      <category>IT</category>
      <category>Java</category>
      <category>Programming</category>
      <category>S3</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/43</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-How-to-get-list-objects-in-AWS-S3-bucket#entry43comment</comments>
      <pubDate>Sat, 12 Jan 2019 10:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 날짜로 요일구하기</title>
      <link>https://kkumalog.tistory.com/entry/Python-%EB%82%A0%EC%A7%9C%EB%A1%9C-%EC%9A%94%EC%9D%BC%EA%B5%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;시간, 날짜와 관련된 내용들을&amp;nbsp;이전에 포스팅 했었는데, 그 중 요일 반환에 관련된 부분만 따로 자세하게 정리하려합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;시간모듈 - &lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/15&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/15&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;date -&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/16&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/16&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;time -&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/17&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/17&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;datetime&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/18&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://kkumalog.tistory.com/18&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;시간모듈(time)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; t = ['월', '화', '수', '목', '금', '토', '일']&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import time&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; n = time.localtime().tm_wday&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(t[n])&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;수&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 날짜시간모듈(datetime)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; t = ['월', '화', '수', '목', '금', '토', '일']&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import datetime&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; r = datetime.datetime.today().weekday()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(t[r])&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;수&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 내장함수 사용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt;dt = datetime.datetime.now()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt;dt&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;datetime.datetime(2019, 1, 9, 23, 23, 58, 180470)&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;now():&lt;/b&gt;&amp;nbsp;현재 시각을 datetime.datetime 클래스 객체로 반환&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;weekday()&lt;/b&gt;: 요일 반환 (0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 중 특히 많이 사용되는&amp;nbsp;날짜와 시간 정보를 문자열로 바꿔주는 strftime() 메서드,&amp;nbsp;이 메서드는 어떤 형식으로 문자열을 만들지 결정하는 형식 문자열을 인수로 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;strftime():&lt;/b&gt; 문자열 반환&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;ex) 토요일 / 일요일 체크&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt;dt.strftime(‘%A’) == ‘Saturday’ or dt.strftime(‘%A’) == ‘Sunday’&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;참고)&lt;/span&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;a href=&quot;http://kkumalog.tistory.com/15&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;날짜 및 시간 지정 문자열&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/15&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;-&amp;nbsp;&lt;/a&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://kkumalog.tistory.com/15&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://kkumalog.tistory.com/15&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4자리 연도 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%m&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2자리 월 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2자리 일 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;24시간 형식 2자리 시간 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2자리 분 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%S&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2자리 초 숫자&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;영어로 된 요일 문자열&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;%B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;영어로 된 월 문자열&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;a href=&quot;https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;예를 들어 dt의 시간 정보를 원하는 포맷의&amp;nbsp;문자열로 바꿀 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&amp;gt;&amp;gt;&amp;gt;dt.strftime(“%A %d. %B %Y”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;‘Wednesday 09.January 2019’&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;print(dt.strftime(“%H시 %M분 %S초”))&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;23시 23분 58초&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Python</category>
      <category>IT</category>
      <category>Programming</category>
      <category>Python</category>
      <category>파이썬</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/42</guid>
      <comments>https://kkumalog.tistory.com/entry/Python-%EB%82%A0%EC%A7%9C%EB%A1%9C-%EC%9A%94%EC%9D%BC%EA%B5%AC%ED%95%98%EA%B8%B0#entry42comment</comments>
      <pubDate>Thu, 10 Jan 2019 08:57:25 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Node.js 시작하기</title>
      <link>https://kkumalog.tistory.com/entry/Nodejs-Nodejs-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# NVM(Node Version Manager) 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ curl https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;그 다음, 쉘을 재시작하거나, 아래의 명령어를 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ source ~/.bash_profile&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;제대로 설치되었는지 버전 정보를 확인해본다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ nvm --version&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Node.js 설치하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;가장 최신의 stable 버전을 설치하려면 아래의 명령어를,&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ nvm install stable&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;원하는 특정 버전 있다면 아래의 명령어를 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ nvm install v0.0.0 //특정버전입력&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;설치할 수 있는 버전 목록을 보려면 아래의 명령어를 실행한다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ nvm ls-remote&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;여러 버전의 노드를 설치하셨다면, 아래의 명령어로 원하는 버전을 선택하여 전환할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;
&lt;/span&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ nvm use v0.0.0 //특정버전입력&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <category>IT</category>
      <category>Node</category>
      <category>node.js</category>
      <category>NVM</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/41</guid>
      <comments>https://kkumalog.tistory.com/entry/Nodejs-Nodejs-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#entry41comment</comments>
      <pubDate>Mon, 7 Jan 2019 09:26:24 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Collections.sort()를 이용한 List 정렬</title>
      <link>https://kkumalog.tistory.com/entry/Java-Collectionssort%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-List-%EC%A0%95%EB%A0%AC</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Collections.sort(), Collections.reverse()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;다양한 데이터들을 처리하는 경우에 정렬은 필수적으로 사용되는데, 다양한 정렬 방식&amp;nbsp;중&amp;nbsp;&quot;컬렉션(Collections)&quot;을 사용하는 방법을&amp;nbsp;알아보도록&amp;nbsp;하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;import java.util.ArrayList;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;import java.util.Collections;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;list.add(1);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;list.add(5);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;list.add(3);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;list.add(2);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;list.add(9);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(&quot;정렬하기 전&quot;);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(list);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;Collections.sort(list);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(&quot;\n오름차순 정렬&quot;);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(list);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;Collections.reverse(list);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(&quot;\n내림차순 정렬&quot;);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;System.out.println(list);&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;→ &lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;output&lt;/span&gt;
&lt;/b&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;정렬하기 전&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;[1, 5, 3, 2, 9]&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;오름차순 정렬&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;[1, 2, 3, 5, 9]&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;내림차순 정렬&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;[9, 5, 3, 2, 1]&lt;/div&gt;
&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>Collections</category>
      <category>IT</category>
      <category>Java</category>
      <category>list</category>
      <category>List 정렬</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/40</guid>
      <comments>https://kkumalog.tistory.com/entry/Java-Collectionssort%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-List-%EC%A0%95%EB%A0%AC#entry40comment</comments>
      <pubDate>Sun, 30 Dec 2018 11:47:15 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Reading S3 text file as a string</title>
      <link>https://kkumalog.tistory.com/entry/Spring-Reading-S3-text-file-as-a-string</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;지난 포스팅에서는 string을 S3에 저장하는 방법을 작성하였고, 이번 포스팅에서는 저장된 S3 텍스트파일을 가져오는 방법에 대해 작성해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;참고_ &lt;/span&gt;&lt;a href=&quot;http://kkumalog.tistory.com/38&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;http://kkumalog.tistory.com/38&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;#AWSConfig.java&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;S3 파일에 접근하기 위해서는 aws 설정이 필요합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;우선 보안상 / 코드의 효율성을 위해 다른 곳에 설정되어 있는&amp;nbsp; AWS ACCESS KEY, SECRET KEY, region 을 가져오는 코드를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_ACCESS_KEY_ID}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String accessKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${AWS_SECRET_KEY}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String secretKey;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Value(“${spring.aws.region}”)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private String region;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public BasicAWSCredentials basicAWSCredentials() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new BasicAWSCredentials(accessKey, secretKey);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AWSCredentialsProvider awsCredentialsProvider(AWSCredentials awsCredentials) {&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new AWSCredentialsProvider() {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;public AWSCredentials getCredentials() { return awsCredentials; }&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;@Override&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt; public void refresh() {} &lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;}; &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;@Bean&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public AmazonS3 amazonS3Client(AWSCredentialsProvider awsCredentialsProvider) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return AmazonS3ClientBuilder&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.standard()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withCredentials(awsCredentialsProvider)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.withRegion(Regions./fromName/(region))&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;.build();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;#Reading S3 text file&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;위에서 설정된 aws 정보를 호출하고, 이를 이용하여 bucket에 접근해 데이터를 가져오는 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;AmazonS3 s3Client = awsConfig.amazonS3Client(awsConfig.awsCredentialsProvider(awsConfig.basicAWSCredentials()));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;S3Object s3object = s3Client.getObject(new GetObjectRequest(buckets, key));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;BufferedReader reader = new BufferedReader(new InputStreamReader((s3object.getObjectContent())));&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;String line = null;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;try {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;line = reader.readLine();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;} catch (IOException e) {&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;e.printStackTrace();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>Java</category>
      <category>Programming</category>
      <category>Spring</category>
      <category>스프링</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/39</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-Reading-S3-text-file-as-a-string#entry39comment</comments>
      <pubDate>Wed, 19 Dec 2018 09:34:14 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Uploading String to Amazon S3</title>
      <link>https://kkumalog.tistory.com/entry/Spring-Uploading-String-to-Amazon-S3</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# JAVA&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;String to ByteArrayOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;DataOutputStream 파라미터에 String ByteArray 값을 넣어주고, byteArrayOutputStream이 가지고 있는 ByteArray값을 리턴한다&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;js-gist-file-update-container js-task-list-container file-box&quot;&gt;&lt;div class=&quot;file&quot; id=&quot;file-bytearrayoutputstream-java&quot;&gt;&lt;div class=&quot;file-header&quot;&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;public byte[] getByteArray(String data) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;DataOutputStream out = new DataOutputStream(byteArrayOutputStream);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;try {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;out.write(data.getBytes());&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;byteArrayOutputStream.flush();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;byteArrayOutputStream.close();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;} catch (IOException e) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;e.printStackTrace();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return byteArrayOutputStream.toByteArray();&lt;/div&gt;&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;js-gist-file-update-container js-task-list-container file-box&quot;&gt;&lt;div class=&quot;file&quot; id=&quot;file-java-byte-array-md&quot;&gt;&lt;div class=&quot;readme blob instapaper_body&quot; id=&quot;readme&quot;&gt;&lt;article class=&quot;markdown-body entry-content&quot; itemprop=&quot;text&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;참고&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;https://gist.github.com/kykkyn2/052382599134adf504abfa096282b816&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# uploading file to Amazon S3&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;(S&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3에 파일 업로드, S3Helper)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;입력받은 byteArray값을 ByteArrayInputStream으로 변환한 뒤 저장한다&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;js-gist-file-update-container js-task-list-container file-box&quot;&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;import com.amazonaws.services.s3.AmazonS3;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;public PutObjectResult putObject(&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;byte[] bytes,&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;Buckets buckets,&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;String key, &lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;String fileContentType,&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;CannedAccessControlList cannedAccessControlList&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;ObjectMetadata objectMetadata = new ObjectMetadata();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;objectMetadata.setContentType(fileContentType);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;PutObjectRequest putObjectRequest = new PutObjectRequest(&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;buckets.getBucketName(),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;key,&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;byteArrayToFileInputStream(bytes),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;objectMetadata&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;putObjectRequest.withCannedAcl(cannedAccessControlList);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return amazonS3.putObject(putObjectRequest);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;private InputStream byteArrayToFileInputStream(byte[] bytes) {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return new ByteArrayInputStream(bytes);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Uploading String to Amazon S3&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;저장할 String 문자열을 위의 코드들을 이용해 변환한 뒤 text file로 S3에 저장하게 된다&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;DataOutputStream out = new DataOutputStream(byteArrayOutputStream);&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;String word = &quot;kkuma&quot;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;try {&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;out.write(word.getBytes());&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;byteArrayOutputStream.close();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;} catch (IOException e) {&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;e.printStackTrace();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;byte[] bytes = byteArrayOutputStream.toByteArray();&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;s3Helper.putObject(&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;bytes,&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;Buckets.TEST&lt;span style=&quot;font-size: 10pt;&quot;&gt;, // Bucket&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;test&quot;&lt;span style=&quot;font-size: 10pt;&quot;&gt;, // key&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;“txt/plain”, //&amp;nbsp;&lt;span style=&quot;font-size: 10pt;&quot;&gt;fileContentType&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;CannedAccessControlList.PublicRead&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;);&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>amazin</category>
      <category>IT</category>
      <category>Programming</category>
      <category>S3</category>
      <category>s3Bucket</category>
      <category>Spring</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/38</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-Uploading-String-to-Amazon-S3#entry38comment</comments>
      <pubDate>Wed, 12 Dec 2018 10:10:40 +0900</pubDate>
    </item>
    <item>
      <title>[IT] REST API</title>
      <link>https://kkumalog.tistory.com/entry/IT-REST-API</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# REST(Representational State&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;Transfer)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;REST는 웹의 창시자 중의 한 사람인 로이 필딩(Roy Fielding)이 2000년에 발표한 박사학위&amp;nbsp;논문에 의해서 소개되었다. 현재의 아키텍처가 웹의 본래 설계의 우수성을 많이 사용하지 못하고 있다고 판단했기 때문에 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처를 소개했는데, 그것이 바로 Representational Safe Transfer (REST)이다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: sans-serif; font-size: 10pt;&quot;&gt;간단한 의미로는, 웹 상의 자료를&lt;/span&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;HTTP&lt;/span&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: sans-serif; font-size: 10pt;&quot;&gt;위에서&lt;/span&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: sans-serif; font-size: 10pt;&quot;&gt;&amp;nbsp;SOAP&lt;/span&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: sans-serif; font-size: 10pt;&quot;&gt;이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스를 말한다. REST 원리를 따르는 시스템은 종종 RESTful이란 용어로 지칭된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# REST API의 구성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;REST API는 다음&amp;nbsp;3가지 구성으로 이루어져있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) 자원(Resource) - URI&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) 행위(Verb) -&amp;nbsp;HTTP Method&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3) 표현(Representations), 메시지&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# HTTP 메서드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;HTTP에는 여러가지 메서드가 있지만, REST에서는 CRUD(Create Read Update Delete)에 해당하는 4가지의 메서드를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;txc-table&quot; width=&quot;752&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 752px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 261px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(234, 234, 234);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;메서드&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 179px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204); background-color: rgb(234, 234, 234);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Idempotent&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 312px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204); background-color: rgb(234, 234, 234);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;의미&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:261;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;POST&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 179px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;X&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 312px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Create, 생성&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:261;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;GET&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 179px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;O&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 312px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Select, 조회&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:261;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;PUT&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 179px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;O&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 312px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Update, 수정&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:261;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;DELETE&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 179px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;O&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 312px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Delete, 삭제&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;위의 테이블에서 Id&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;empotent(멱등성)이란, 매번 결과가 달라지지 않는다는 뜻이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# REST API의 특성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1) 유니폼 인터페이스(Uniform Interface) :&amp;nbsp;HTTP 표준에만 따른다면 어떠한 기술이든지 사용할 수 있는 인터페이스 스타일이다. 특정언어나 기술에 종속 받지 않고 사용할 수 있는 느슨한 결합 형태의 구조이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2) 무상태성(Stateless) : &amp;nbsp;클라이언트의 컨텍스트를 서버 쪽에 유지하지 않는다는 의미로, 세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 서버에서는&amp;nbsp;들어오는 요청만을 단순히 처리하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3) 캐시가능(Cacheable) : HTTP 라는 기존 웹표준을 그대로 사용하기 때문에 웹에서 사용하는 기존 인프라를 그대로 활용이 가능해&amp;nbsp;HTTP가 가진 캐싱 기능이 적용 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4) 자체표현구조(Self-descriptiveness) : REST의 가장 큰 특징 중의 하나는 REST API 자체가 쉬워서 API메시지만 보고도 이를 이해 할 수 있는 자체 표현 구조로 되어있다는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;5) 클라이언트 서버 구조 (Client-Server) : 서버는 API를 제공하고 제공된 API를 이용해서 비즈니스 로직 처리 및 저장을 책임진다. 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보를 직접 관리하고 책임지는 구조로 역할이 나누어지고 있다. 이렇게 각각의 역할이 확실하게 구분되면서 개발 관점에서 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로의 개발에서 의존성이 줄어들게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;6) 계층형 구조(Layered System) : 클라이언트로서는 REST API 서버만 호출하고, 서버는 다중 계층으로&amp;nbsp;구성될 수 있다. 다중 계층으로 구성된 서버는 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>IT</category>
      <category>Programming</category>
      <category>REST</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/36</guid>
      <comments>https://kkumalog.tistory.com/entry/IT-REST-API#entry36comment</comments>
      <pubDate>Sun, 9 Dec 2018 10:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Review] MINISO 블루투스 이어폰(MINISO-K6H)</title>
      <link>https://kkumalog.tistory.com/entry/Review-MINISO-%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EC%9D%B4%EC%96%B4%ED%8F%B0MINISO-K6H</link>
      <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;'MINISO-K6H Bluetooth Earphones' UNBOXING(언박싱)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991883395BFEA71E15&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991883395BFEA71E15&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;44cac5c24d01e586f242efc9c1b21352.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A23A415BFEA71F24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A23A415BFEA71F24&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;97b60c78c877f08fd70e06cb458cc2db.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;가격은 위안화 단위로 199元, 한화 약 32000원. (1위안 ≒&amp;nbsp;160원)&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CC38455BFEA71F03&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CC38455BFEA71F03&quot; width=&quot;820&quot; height=&quot;398&quot; filename=&quot;net.daum.android.tistoryapp_20181128233148_2_rotate.jpeg&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;박스안에는 제품 설명서, 본품, 충전케이스, 이어팁(이어캡)이&amp;nbsp;들어있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;제품설명서는 중국어, 영어로 되어있습니다 (그래서 언젠간 한국어로 번역해보려합니다^__^)&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994B44355BFEA7201D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994B44355BFEA7201D&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;3b7f096e52c52bae43cf3355a96bb3da.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;충전은 케이스에&amp;nbsp;이어폰을 쏙쏙 집어넣고, 위에 버튼을 눌러주시면 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9908F6505BFEAAFA1C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9908F6505BFEAAFA1C&quot; width=&quot;820&quot; height=&quot;398&quot; filename=&quot;20181128_162955.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9917253E5BFEA72126&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9917253E5BFEA72126&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;2709aa1fb5bcb0b7d2930835b3e36871.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;그럼 케이스는 어떻게 충전할까?&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;케이스의 뒤쪽에 있는걸 열면 나오는 usb타입의 충전단자로 충전합니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9978D83B5BFEA7221B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9978D83B5BFEA7221B&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;08d73cbc964d09a3aa064b8141c03dc4.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9961E9425BFEA72308&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9961E9425BFEA72308&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;842f7458186f333135f849725670d673.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CFB74D5BFEA7230F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CFB74D5BFEA7230F&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;91a1871ccf7d1806de2ed97144e5adc8.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993649375BFEA7240E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993649375BFEA7240E&quot; width=&quot;820&quot; height=&quot;399&quot; filename=&quot;7c52f8e37aea4bf8325332a90ebc7bdb.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이어폰 본품에는 이렇게 L / R 이 명확하게 적혀있고, 옆모습은&amp;nbsp;뚠뚠하고 짧아서 귀여운 모습입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;Product Manual (제품설명서&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Specification&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Model: K6H&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Bluetooth version: v4.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Battery type: rechargeable polymer lithium battery&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Rated voltage: 3.7V&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Input: DC5V-500mA(pedestal)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Support agreement: A2DP/HFP/HSP/AVRCP&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;This product can receive voice frequency from phone, lap top and other Bluetooth devices.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Once paired with PC Bluetooth DONGLE, it can play various voice documents.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Function Introduction&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Multi-function button(&quot;MFB&quot; in short)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Start-up: press the MFB button for 5 seconds, the blue light flashes for 3 times, and the earphones start up.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Shutdown: press the MFB button of the earphones for 5 seconds while the product is not connected with other devices and under starting up status. When the earphones are connected to the peer device after starting up, press the MFB button of any device for 5 seconds, and the two headphones are off. Put it back on the charging seat to charge, it will turn off.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Pairing mode: when it is not connected, double-click the MFB button to enter matching mode.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;The searching time is 2 minutes. Red and blue lights flicker alternately.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Search peer device: in the shutdown state, press the MFB button for 7 seconds to enter the peer device searching state.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;The searching time is 2 minutes. Red and blue lights flicker alternately.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Connect peer device: the peer devices is in searching mode(red and blue lights flicker alternately), automatically connect.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;First pairing of single earphone: in the shutdown state, press the MFB button for about 7 seconds, the red and blue lights flicker alternately. Turn on the Bluetooth function of the phone and search the device. When the phone find the &quot;MINISO-K6H&quot;, click it to connect. After connection, the light flashes off.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Double earphones pairing for the first time: when used for the first time, press the MFB for both earphones about 7 seconds at the same time in the shutdown state, until the red and blue lights flicker, the right and left earphone will pair automatically. About 10 seconds later, one earphone lights fade out while another keeps flashing(the main earphone), open the phone's Bluetooth immediately, find &quot;MINISO-K6H&quot;, and connect, after connection, lights flash out.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Voice dialing: in standby mode, press the host MFB key for 1 seconds and release.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Final redial: in standby or listening mode, double-click the host MFB button to dial the last dialing-number.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Hang up: while answering or calling, press the host MFB button shortly to end the call.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Reject: long press the MFB key and release to refuse the call.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Answer: press the host MFB button briefly to answer the call.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Play/pause: in standby of listening mode, 1. If connected with a peer device, press the host MFB button. 2. If connected with a peer device, press the MFB key on any headset.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Three-way call: 1. Click the host MFB button to answer or hang up the call. 2. When the second call comes during a dialog, double-click the host MFB button to answer the second call and keep the first call.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;IOS power display: Bluetooth headphone power can be displayed on iPhone.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Reset: in charging state, double-click MFB key to clear all paired information.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Reconnect: within the connection range, automatically connect the paired Bluetooth device after starting up.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;In standby mode, press the main device briefly reconnect. If it is beyond the available range during call, answer, standby or listening, return to the accessible range (within 3 minutes), it will reconnect automatically.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Low power alarm: when the battery voltage is lower than 3.3V, low power voice prompt, red light flash.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Automatic shutdown: 1. No connection after starting up, and the earphones will off after 3 minutes.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. When the battery voltage is lower than 3.0V, the Bluetooth headset turns off.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Charging: red light on and earphones off while charging.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Full Charge: about 1-2 hours. when charged, the blue light will be on for 15 minutes before it goes off.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Caution&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1. Store and use this product in room temperature.&lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. Avoid exposing to rain and moisture environment.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3. Throw or drop will damage the product.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4.&amp;nbsp;Do not self-disassemble or modify it.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.2;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;5.&amp;nbsp;Please dispose the battery according to the local rules, recycle it if possible. It cannot be disposed as household waste, it can cause environmental pollution.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;line-height: 1.2;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;Review&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;중국 칭다오 여행 중에 미니소에서 구매한 이 낯선아이.&lt;/p&gt;&lt;p&gt;다른 블루투스 이어폰을 사용해보지 않아서 비교할 수는 없지만, 이 제품의 첫 리뷰인만큼 객관적으로 리뷰하겠습니다!&lt;/p&gt;&lt;p&gt;우선 줄이 없는 코드프리 이어폰 처음 써봤는데 굉장히 편하다.&lt;/p&gt;&lt;p&gt;가격도 에어팟에 비해 훨씬 저렴하고, 샤오미의 에어닷보다도 저렴하다.&lt;/p&gt;&lt;p&gt;그러나!&lt;/p&gt;&lt;p&gt;싸게 파는데는 이유가 있는듯하다.&lt;/p&gt;&lt;p&gt;막귀인 나에게도 '미니소 블루투스 이어폰'의 음질은 나쁘다.&lt;/p&gt;&lt;p&gt;음량을 크게 키우면 안들리는데, 음량을 작게 했을 경우&amp;nbsp;거슬리는 기계음이 노래와 함께&amp;nbsp;들린다.&lt;/p&gt;&lt;p&gt;또 다른 단점은, 마이크가 있는지 잘 모르겠다는 것이다.&lt;/p&gt;&lt;p&gt;휴대폰 녹음기로 테스트하는데, 휴대폰과 조금 떨어진상태에서도 녹음이 되지 않았다.&lt;/p&gt;&lt;p&gt;전화도 해보려했는데,&lt;/p&gt;&lt;p&gt;녹음과 마찬가지로 휴대폰과 조금 떨어진 상태에서는 상대방이 안들린다고 짜증을 냈고,&lt;/p&gt;&lt;p&gt;휴대폰 근처에서는 스피커폰으로 통화하는듯하다고 하여 종료했다.... (후에 다시 테스트해볼 예정이다&lt;img src=&quot;//i1.daumcdn.net/deco/contents/emoticon/things_11.gif?v=2&quot; border=&quot;0&quot; class=&quot;txc-emo&quot;&gt;)&lt;/p&gt;&lt;p&gt;국내에서는 보지 못한 것 같아 선물용까지 구매했으나, 선물하고도 욕먹을까봐 조금 더 테스트 해보려한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cf. 막귀: 이어폰, 헤드셋 등의 음향기기로 노래를 감상할 때 음질이 좋고 나쁨을 잘 구별하지 못하는 귀&lt;/p&gt;</description>
      <category>Others</category>
      <category>IT</category>
      <category>miniso</category>
      <category>미니소</category>
      <category>블루투스 이어폰</category>
      <category>이어폰</category>
      <category>제품리뷰</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/33</guid>
      <comments>https://kkumalog.tistory.com/entry/Review-MINISO-%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EC%9D%B4%EC%96%B4%ED%8F%B0MINISO-K6H#entry33comment</comments>
      <pubDate>Thu, 29 Nov 2018 10:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[MAC] DockBar Delay</title>
      <link>https://kkumalog.tistory.com/entry/MAC-DockBar-Delay</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;딜레이 제거&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;defaults write com.apple.dock autohide -bool true &amp;amp;&amp;amp; defaults write com.apple.dock autohide-delay -float 0 &amp;amp;&amp;amp; defaults write com.apple.dock autohide-time-modifier -float 0 &amp;amp;&amp;amp; killall Dock&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 딜레이 조정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;defaults write com.apple.dock autohide -bool true &amp;amp;&amp;amp; defaults write com.apple.dock autohide-delay -float 0.3 &amp;amp;&amp;amp; defaults write com.apple.dock autohide-time-modifier -float 0.3 &amp;amp;&amp;amp; killall Dock&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 딜레이 원상복구&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;defaults delete com.apple.dock autohide &amp;amp;&amp;amp; defaults delete com.apple.dock autohide-delay &amp;amp;&amp;amp; defaults delete com.apple.dock autohide-time-modifier &amp;amp;&amp;amp; killall Dock&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>IT</category>
      <category>Mac</category>
      <category>Macbook</category>
      <category>Programming</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/31</guid>
      <comments>https://kkumalog.tistory.com/entry/MAC-DockBar-Delay#entry31comment</comments>
      <pubDate>Tue, 20 Nov 2018 09:12:17 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 공휴일체크</title>
      <link>https://kkumalog.tistory.com/entry/Python-%EA%B3%B5%ED%9C%B4%EC%9D%BC%EC%B2%B4%ED%81%AC</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;pip install tox&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;pip install workalendar==2.4.0&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;class SouthKorea(WesternCalendar, ChineseNewYearCalendar):&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;FIXED_HOLIDAYS = WesternCalendar.FIXED_HOLIDAYS + (&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(3, 1, &quot;Independence Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(5, 5, &quot;Children's Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(6, 6, &quot;Memorial Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(8, 15, &quot;Liberation Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(10, 3, &quot;National Foundation Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(10, 9, &quot;Hangul Day&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;(12, 25, &quot;Christmas Day&quot;)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;chinese_new_year_label = &quot;Korean New Year's Day&quot;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;include_chinese_new_year_eve = True&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;chinese_new_year_eve_label = &quot;Korean New Year's Day&quot;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;include_chinese_second_day = True&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;chinese_second_day_label = &quot;Korean New Year's Day&quot;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;def get_variable_days(self, year):&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;days = super(SouthKorea, self).get_variable_days(year)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;days.extend([&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;(ChineseNewYearCalendar.lunar(year, 4, 8), &quot;Buddha's Birthday&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;(ChineseNewYearCalendar.lunar(year, 8, 14), &quot;Midautumn Festival&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;(ChineseNewYearCalendar.lunar(year, 8, 15), &quot;Midautumn Festival&quot;),&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 6em;&quot;&gt;(ChineseNewYearCalendar.lunar(year, 8, 16), &quot;Midautumn Festival&quot;)&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;])&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt; return days&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;사용하는 방법을 예를 들면, 공휴일인지 아닌지 체크를 할 때&amp;nbsp;&amp;nbsp;core.py에 있는 아래의 함수를 이용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;def is_holiday(self, day, extra_holidays=None):&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;&quot;&quot;&quot;Return True if it's an holiday.&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt; n addition to the regular holidays, you can add exceptions.&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;By providing ``extra_holidays``, you'll state that these dates **are**&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;holidays, even if not in the regular calendar holidays (or weekends).&quot;&quot;&quot;&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;# a little exception: chop the datetime type&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;if type(day) is datetime:&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;day = day.date()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;if extra_holidays and day in extra_holidays:&lt;/div&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 4em;&quot;&gt;return True&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;file-actions&quot; style=&quot;margin-left: 2em;&quot;&gt;return day in self.holidays_set(day.year)&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;실제 사용할 때&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;calendar = SouthKorea()&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;calendar.is_holiday(확인하고싶은날짜)&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;참고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;https://github.com/peopledoc/workalendar&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Python</category>
      <category>IT</category>
      <category>Programming</category>
      <category>Python</category>
      <category>파이썬</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/30</guid>
      <comments>https://kkumalog.tistory.com/entry/Python-%EA%B3%B5%ED%9C%B4%EC%9D%BC%EC%B2%B4%ED%81%AC#entry30comment</comments>
      <pubDate>Wed, 14 Nov 2018 09:52:23 +0900</pubDate>
    </item>
    <item>
      <title>[MAC] 마우스 속도조절</title>
      <link>https://kkumalog.tistory.com/entry/MAC-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%86%8D%EB%8F%84%EC%A1%B0%EC%A0%88</link>
      <description>&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 669px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D19F375BE92CCF14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D19F375BE92CCF14&quot; width=&quot;669&quot; height=&quot;323&quot; filename=&quot;스크린샷 2018-11-12 오후 4.32.23(3).png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;환경설정 - 마우스 - 이동속도 에서 지정할 수 있는 최대 속도는 3&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;그 이상을 사용하기 위해서는 터미널에서 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ defaults write -g com.apple.mouse.scaling {원하는 속도}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;// defaults write -g com.apple.mouse.scaling 5&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;변경된 속도 확인하는 방법은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:scroll&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ defaults read -g com.apple.mouse.scaling&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;적용하기 위해서는 반드시 재부팅 또는 로그아웃을 해야한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Other</category>
      <category>IT</category>
      <category>Mac</category>
      <category>Macbook</category>
      <category>Programming</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/29</guid>
      <comments>https://kkumalog.tistory.com/entry/MAC-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%86%8D%EB%8F%84%EC%A1%B0%EC%A0%88#entry29comment</comments>
      <pubDate>Mon, 12 Nov 2018 16:35:00 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git 명령어(2)</title>
      <link>https://kkumalog.tistory.com/entry/Git-git-%EB%AA%85%EB%A0%B9%EC%96%B42</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;stash / pop 기능은 여럿이 업무를 할 때 유용하며, 최근 자주 사용하게 되어 따로 정리한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# stash 란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;사전적 정의:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;(안전한 곳에) 넣어두다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# stash하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;어떤 작업 중에 급한 일이 생겨 다른 브랜치로 변경해야한다. 그런데 현재 하던 작업이 진행중이어서 커밋을 하기에는 애매하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;커밋하지 않고, 나중에 다시 돌아와서 작업을 이어서 하고 싶을 때는 git stash 명령을 사용해서 해결&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;워킹 디렉토리에 Unstaged - git add 는 수행됨 파일들을 백업하고 워킹디렉토리를 HEAD - 이전 커밋 상태로 만드는 명령이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;stash 명령 적용대상&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Modified + Tracked 상태인 파일 (한번이라도 add를 한 적이 있는 파일)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Staging Area에 있는 파일&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# save&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash save&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;현재 작업을 저장해두고 branch를 head로 돌린다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# list&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash list&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;저장되어있는 stash보기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;#pop&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash pop&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;stash들은 stack에 저장되기때문에, 가장 최근에 저장된 stash가 현재 branch에 적용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# apply&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash apply&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git stash pop 과 비슷한 명령어지만 stash list에서 삭제하지 않는다는 점이 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git stash apply 명령을 실행하여 Stash 내용을 다시 적용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git stash apply stash@{2} 처럼 원하는 Stash 를 골라서 적용하는 것도 가능하다. (이름이 없으면 가장 최근 Stash 적용)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git stash apply --index 옵션을 통해서 Staged 상태까지 적용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# stash 적용한 브랜치 만들기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash branch&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git stash branch 명령을 실행하면 Stash 할 당시의 커밋을 Checkout 한 후 새로운 브랜치를 만들고 여기에 적용한다. 이 모든 것이 성공하면 Stash를 삭제한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 필요없는 stash 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash drop&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;#전체 stash list 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git stash clear&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# git clean&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git clean&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;워킹 디렉토리 안의 추적하고 있지 않은 모든 파일을 지운다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git clean -n 옵션을 통해서 가상으로 실행해보고 어떤 파일들이 지워질지 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. .gitignore`에 명시했거나 해서 무시되는 파일은 지우지 않는다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Git</category>
      <category>git</category>
      <category>IT</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/28</guid>
      <comments>https://kkumalog.tistory.com/entry/Git-git-%EB%AA%85%EB%A0%B9%EC%96%B42#entry28comment</comments>
      <pubDate>Wed, 7 Nov 2018 14:59:02 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git 명령어(1)</title>
      <link>https://kkumalog.tistory.com/entry/Git-git-%EB%AA%85%EB%A0%B9%EC%96%B41</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;git 저장소 만들기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git init&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 기존 저장소 가져오기 (Clone)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;p&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git clone http://github.com/test/test.git&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 파일 상태&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git status&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 브랜치(Branch)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git branch { 브랜치명}&amp;nbsp; // 브랜치 생성&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ git branch -r // 원격 브랜치 목록&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ git branch -a // 로컬 브랜치 목록&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Commit&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;커밋은 의미있는 한 단계의 작업을 나타내며,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;매 커밋당 로그가 남아 나중에 되돌아갈 수 있게 한다&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git commit -m &quot;로그메세지&quot;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;매번 커밋을 해줄 때마다 add를 통해 staging area에 넣어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;tracked 상태인 파일이 자동으로 추가되기를 원한다면 \-a를 추가하자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git commit -a -m “로그메시지”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git commit -am “로그메시지”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# Pull&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git pull&amp;nbsp;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git서버에서 최신 코드 받아와 merge 하기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# Push&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;add하고 commit한 코드 git server에 보내기 (git push origin master)&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git push&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 파일 삭제하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ git rm {파일명}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;$ git rm index.html&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git rm 명령어는 파일 삭제와 git rm을 순차적으로 진행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;만약 파일 삭제를 하고싶지 않다면 –cached 옵션을 붙인다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git rm {파일명} –cached&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git rm index.html –cached&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;rm 이후에는 커밋&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 파일명 변경하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git mv {대상파일} {바꿀이름}&lt;/div&gt;
&lt;div class=&quot;file-actions&quot;&gt;// $ git mv index.html main.html&amp;nbsp; -- index.html 을 main.html로 변경&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# 커밋 히스토리, 로그&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git log&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;커밋로그가 많으면 많을 수록 보기 힘드니 아래 명령어를 사용하자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git log –oneline(한줄로) –decorate(이쁘게) –all(모든브랜치를) –graph(그래프형태로) 보여주세요&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;git log –oneline –decorate –all –graph&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;# git 별명(Alias)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush&quot; style=&quot;overflow-x:auto&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size:11pt;&quot;&gt;&lt;div class=&quot;file-actions&quot;&gt;$ git alias&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git config --global alias.co checkout&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git config --global alias.br branch&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git config --global alias.ci commit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;$ git config --global alias.st status&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Programming/Git</category>
      <category>git</category>
      <category>IT</category>
      <category>Programming</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/27</guid>
      <comments>https://kkumalog.tistory.com/entry/Git-git-%EB%AA%85%EB%A0%B9%EC%96%B41#entry27comment</comments>
      <pubDate>Tue, 6 Nov 2018 17:10:55 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] AOP(Aspect Oriented Programming)</title>
      <link>https://kkumalog.tistory.com/entry/Spring-AOPAspect-Oriented-Programming</link>
      <description>&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 11pt&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 11pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;# AOP(Aspect Oriented Programming)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;AOP는 문제를 바라보는 관점을 기준으로 프로래밍하는 기법을 의미한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍함으로써 공통모듈을 여러 코드에 쉽게 적용할 수 있도록 한다&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- 공통 관심 사항 : 공통 기능으로 어플리케이션 전반에 걸쳐 필요한 기능&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- 핵심 관심 사항 :&amp;nbsp;핵심 로직, 핵심 비즈니스 로직&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 11pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;&lt;strong&gt;# 용어&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- Joinpoint : Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 이에 해당한다. &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- Advice : Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 조인포인트를 나타낸다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- Pointcut : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- Weaving : Advice를 핵심 로직 코드에 적용하는 것을 말한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;- Aspect : 여러 객체에 공통으로 적용하는 기능을 말한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 11pt&quot;&gt;# Advice의 종류&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;Before Advice : 대상 객체의 메서드 호출 전에 공통 기능을 실행한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;After Returning Advice : 대상 객체의 메서드가 익셉션 없이 실행된 이후에 공통 기능을 실행한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;After Throwing Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;After Advice : 대상 객체의 메서드를 실행하는 도중에 익셉션이 발생했는지의 여부에 상관없이 메서드 실행 후 공통 기능을 실행한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif&quot;&gt;Around Advice : 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행하는데 사용된다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 14px; FONT-FAMILY: sans-serif; WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; FONT-WEIGHT: 400; COLOR: rgb(34,34,34); FONT-STYLE: normal; TEXT-ALIGN: left; ORPHANS: 2; WIDOWS: 2; DISPLAY: inline !important; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial&quot;&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>Programming</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/26</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-AOPAspect-Oriented-Programming#entry26comment</comments>
      <pubDate>Sun, 28 Oct 2018 22:42:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 응답보안헤더</title>
      <link>https://kkumalog.tistory.com/entry/Spring-%EC%9D%91%EB%8B%B5%EB%B3%B4%EC%95%88%ED%97%A4%EB%8D%94</link>
      <description>&lt;P style='FONT-SIZE: 16px; FONT-FAMILY: -apple-system, system-ui, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; COLOR: rgb(23,43,77); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; MARGIN-TOP: 1.14em; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px'&gt;&lt;SPAN style=&quot;COLOR: #000000&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;# HTTP 응답 보안 헤더&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style='FONT-SIZE: 16px; FONT-FAMILY: -apple-system, system-ui, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; COLOR: rgb(23,43,77); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; MARGIN-TOP: 1.14em; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px'&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;응답헤더에 &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;특정&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt; 내용을 기입함으로써 웹브라우저에 지시를 내리게 된다.&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style='FONT-SIZE: 16px; FONT-FAMILY: -apple-system, system-ui, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; COLOR: rgb(23,43,77); MARGIN: 10px 0px 0px'&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;Cach&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;e Control : 악의적인 사용자가 브라우저 히스토리를 악용할 수 있기 때문에 브라우저가 웹페이지 컨텐츠를 캐싱하지 않도록 설정&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;Content Type Option : 컨텐츠 스니핑을 하지 못하도록 설정&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;HTTP Strict Transport Security (HSTS) : 어떤 사이트가 웹브라우저의 HSTS 호스트 목록에 저장되면, 다음에 해당하는 사이트에 접속 할 때에는 자동으로 https:// 를 붙여 보안상으로 안전하게 접속할 수 있다&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;Frame Options : 웹사이트에 프레임을 허용하는 것은 클릭재킹과 같은 공격에 취약한데, Frame Option을 DENY로 설정하면 프레임 내부에서 페이지가 렌더링되는 것을 막는다&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;XSS Protection : 웹 브라우저의 내장 XSS filter를 사용하도록 하는 옵션&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style=&quot;FONT-SIZE: 1em; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;Content Security Policy : XSS와 같은 공격의 피해를 최소화하기 위해, 스크립트를 허용할 URL을 헤더에 설정하는 옵션&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style='FONT-SIZE: 16px; FONT-FAMILY: -apple-system, system-ui, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; COLOR: rgb(23,43,77); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; MARGIN-TOP: 1.14em; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px'&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;cf. 클릭재킹(Clickjacking): 감춰진 링크를 사용자가 클릭함으로써 의도되지 않은 행동을 수행하게 하는 악의적인 기법으로, 공격자는 비밀정보나 컴퓨터에 대한 제어를 얻을 수 있다.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style='FONT-SIZE: 16px; FONT-FAMILY: -apple-system, system-ui, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; COLOR: rgb(23,43,77); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN-LEFT: 0px; MARGIN-TOP: 1.14em; LETTER-SPACING: 0em; LINE-HEIGHT: 1.714; PADDING-RIGHT: 0px; MARGIN-RIGHT: 0px'&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 맑은 고딕,sans-serif; COLOR: #000000&quot;&gt;cf. P3P(Platform for Privacy Preferences): 프라이버시 보호 관련 표준 기술, P3P를 적용한 사이트에서는 HTTP 헤더 또는 링크된 XML 파일을 통해 해당 사이트에서 취급하는 개인정보의 레벨이나 성격을 웹브라우저에게 알려준다. (압축된 정책 중 PHY는 physical의 약자로, 연락처 또는 위치정보를 의미한다)&lt;/SPAN&gt;&lt;/P&gt;</description>
      <category>Programming/Java</category>
      <category>IT</category>
      <category>Programming</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>프로그래밍</category>
      <author>sohyun_</author>
      <guid isPermaLink="true">https://kkumalog.tistory.com/25</guid>
      <comments>https://kkumalog.tistory.com/entry/Spring-%EC%9D%91%EB%8B%B5%EB%B3%B4%EC%95%88%ED%97%A4%EB%8D%94#entry25comment</comments>
      <pubDate>Thu, 25 Oct 2018 11:05:04 +0900</pubDate>
    </item>
  </channel>
</rss>