<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Dev. MK</title>
    <link>https://devmg.tistory.com/</link>
    <description>풀 스택 개발자 되기 프로젝트</description>
    <language>ko</language>
    <pubDate>Sun, 10 May 2026 08:30:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev.mk</managingEditor>
    <image>
      <title>Dev. MK</title>
      <url>https://tistory1.daumcdn.net/tistory/2043522/attach/9fecb2ba7aff40b6ac471c78300fa960</url>
      <link>https://devmg.tistory.com</link>
    </image>
    <item>
      <title>클래식 바람의나라 국내성 부여성 지도 및 단축키</title>
      <link>https://devmg.tistory.com/356</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;검정색 = 건물, 상점&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;빨강색 = 사냥터&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #006dd7; color: #ffffff;&quot;&gt;파란색&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 직업의 길&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #a6bc00; color: #ffffff;&quot;&gt;녹색&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 성황당&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;국내성 지도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.webp&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myMER/btsLryc2MdB/S0GY1culbsCCJutwscVuT1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myMER/btsLryc2MdB/S0GY1culbsCCJutwscVuT1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myMER/btsLryc2MdB/S0GY1culbsCCJutwscVuT1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyMER%2FbtsLryc2MdB%2FS0GY1culbsCCJutwscVuT1%2Fimg.webp&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;847&quot; height=&quot;850&quot; data-filename=&quot;img.webp&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내성 전사의 길은 중앙 국내성 왕궁을 기준으로 11시 방향, 도적의 길은 5시, 술사의 길은 1시, 도사의 길은 5시 방향에 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙네(21,15)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙언니네(12,15)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙이모네(14,25)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙네2(154,88)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙언니네2(163,88)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왈숙이모네2(156,98)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;순이네푸줏간(40,131)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이쁜이포목상(82,160)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;떼보갑옷점(81,168)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;털보네대장간(59,122)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;장터(17,1)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;채희네상점(87,147)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;백일의상점(196,200)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;백이의상점(60,207)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;백삼의상점(17,13)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;전사의길(48,38)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도적의길(21,187)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도사의길(184,183)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;술사의길(168,63)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;좌성황(42,91)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;우성황(197,93)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왕초보사냥터(38,171)(47,178)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;초보사냥터(52,179)(58,178)(110,137)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;초보미궁(30,23)(172,96)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;쥐굴(46,112)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;뱀굴(쥐굴6굴:17,19)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;곰굴(199,69)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;돼지굴(195,124)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;여우굴(19,163)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;자호굴(195,138)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사마귀굴(79,34)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;인형굴(170,122)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해골굴(147,17)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;흑해골굴(30,30)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도깨비굴(백륜동)(42,28)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;비밀세작의집(137,204)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;흉가(34,63)&lt;br /&gt;국내성왕궁내부(108,92)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;무한장(184,31)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예식장(152,188)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;소극장(94,48)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;감옥(149,152)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;영혼사(도호귀인의집)(76,186)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;기원(121,169)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;놀이방(윷놀이방, 장기방, 빙고방, 경품상)(126,169)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;영채(112,94)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;벼락맞은나무(21,40)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;고구려무도가(56,40)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부여성지도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img (1).webp&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KSPhp/btsLs0T1DbL/kiHsy0CtbC1pEr7azPsdT1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KSPhp/btsLs0T1DbL/kiHsy0CtbC1pEr7azPsdT1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KSPhp/btsLs0T1DbL/kiHsy0CtbC1pEr7azPsdT1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKSPhp%2FbtsLs0T1DbL%2FkiHsy0CtbC1pEr7azPsdT1%2Fimg.webp&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;792&quot; height=&quot;849&quot; data-filename=&quot;img (1).webp&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부여성 전사의 길은 부여성을 기준으로 11시, 도적의 길은 9시, 술사의 길은 1시, 도사의 길은 5시 방향에 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212121; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;연실네(36,105)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;연실언니네(43,105)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;연실이모네(46,105)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;옥이네푸줏간(38,129)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예쁜이네포목상(19,119)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;몽치네갑옷점(4,10)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;떡쇠네대장간(18,103) 장터(13,1)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;전사의길(26,26)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도적의길(21,89)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도사의길(96,102)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;술사의길(126,36)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;좌성황(29,57)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;우성황(125,58)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;왕초보사냥터(32,117)(68,94)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;초보사냥터(31,40)(33,122)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;초보미궁(58,107)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;쥐굴(15,77)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;뱀굴(쥐굴6굴:17,19)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;곰굴(41,143)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;돼지굴(32,45)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;여우굴(124,143)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;자호굴(111,125)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;전갈굴(129,46)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;인형굴(19,140)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;유령굴(88,25)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;흑령굴(103,22)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;도깨비굴(물망동)(99,112)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;비밀세작의집(87,143)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;흉가(69,123)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;부여성왕궁내부(72,53)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;무한장(126,75)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예식장(73,103)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;소극장(29,143)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;감옥(9,49)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;영혼사(82,131)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;기원(96,122)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;놀이방(윷놀이방, 장기방, 화투방, 카드방, 경품상)(96,131)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;재봉사의집(62,136)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;방물장수의집(57,136)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;경마장(132,23)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;얼음돌이(110,88)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사용자오엑스퀴즈도우미(70,150)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;부여성북문지기(71,22)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단축키&lt;/h3&gt;
&lt;table style=&quot;background-color: #ffffff; color: #212121; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;키 조합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;스펠 인벤토리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + =&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;스펠 인벤토리창을 확인합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;U &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Ctrl &amp;rarr; 아이템 슬롯 번호 (a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템을 사용합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;모두 줍기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + ,(&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;쉼표)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;여러 아이템을 줍습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 버리기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;D &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템을 버립니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;모두 버리기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + D &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;전체 아이템을 버립니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 먹기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;E &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템을 먹습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 순서 바꾸기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;C&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;rarr; 아이템1, 아이템2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;두 아이템의 슬롯 위치를 바꿉니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;스펠 순서 바꾸기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + C&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;rarr; 스펠 슬롯 번호1, 스펠 슬롯 번호2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;두 스펠의 스펠창 슬롯 위치를 바꿉니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;던지기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;T &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호 (a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템을 던집니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;감정표현&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + ; +&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;감정표현 (a~p)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;감정표현을 표시합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;외치기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift +1(&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;숫자키)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;현재 위치한 맵에 모든 유저가 들을 수 있도록 말합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;무기 입기&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;W &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;무기를 장비합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;갑옷 입기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + W &amp;rarr;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아이템 슬롯 번호(a~z)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;갑옷을 장비합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;장비 벗기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;현재 입고 있는 장비를 벗습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;SAYMACRO&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Alt + SAYMACRO&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;번호 (1~10)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;F10&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;옵션에서 설정한 SAYMACRO를 출력합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;월드 끝내기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Alt + X&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;월드를 종료합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;교환 ON/OFF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + E&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;교환 기능을 ON/OFF합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그룹(파티)허가 ON/OFF&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Shift + G&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;그룹 허가 기능을 ON/OFF 합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;오브젝트 반투명효과 ON/OFF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Alt + T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;text-align: start;&quot;&gt;오브젝트 반투명효과를 ON/OFF 합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>클래식_바람의나라</category>
      <category>구 바람의나라 부여성</category>
      <category>구바람지도</category>
      <category>국내성지도</category>
      <category>국내성흉퀘</category>
      <category>바람의나라 단축키</category>
      <category>부여성 흉퀘</category>
      <category>부여성지도</category>
      <category>클래식바람의나라지도</category>
      <category>클바 단축키</category>
      <category>클바 지도</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/356</guid>
      <comments>https://devmg.tistory.com/356#entry356comment</comments>
      <pubDate>Sun, 22 Dec 2024 21:34:17 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트(TypeScript) 란?</title>
      <link>https://devmg.tistory.com/355</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;타입스크립트(TypeScript)란?&amp;nbsp;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;타입스크립트(TypeScript)는&amp;nbsp;마이크로소프트가&amp;nbsp;개발한&amp;nbsp;오픈소스&amp;nbsp;프로그래밍&amp;nbsp;언어이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;자바스크립트(JavaScript)의&amp;nbsp;상위&amp;nbsp;확장&amp;nbsp;언어이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 자바스크립트의 문법을 기반으로 하면서 정적 타입(static type)을 지원하여, 코드를 작성할 때 타입 오류를 사전에 검출할 수 있는 장점이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 최신 ECMAScript(ES) 기능을 사용할 수 있으며, 코드가 자바스크립트로 컴파일되어 브라우저나 Node.js 환경에서 실행할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입 안정성&lt;/b&gt;: 변수, 함수 등의 데이터 타입을 명시할 수 있어 타입 오류를 컴파일 단계에서 발견할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;코드의 안정성과 유지보수성이 크게 향상된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발 생산성 향상&lt;/b&gt;: 코드 자동 완성, 리팩토링 도구가 강화되어 대규모 프로젝트에서 코드 관리가 쉬워진다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ES6+ 지원:&lt;/b&gt; 최신 자바스크립트 문법을 사용할 수 있으며, 구형 브라우저에서도 호환되도록 ES5로 트랜스파일(transpile)할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍 지원: 클래스, 인터페이스, 상속 등 객체 지향 프로그래밍(OOP) 기능이 강화되어 보다 구조적인 코딩이 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예제&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;test.ts&lt;/p&gt;
&lt;pre id=&quot;code_1732429458301&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 타입을 명시한 변수 선언
let userName: string = &quot;홍길동&quot;;
let age: number = 30;
let isActive: boolean = true;

// 함수에 타입 지정
function greet(name: string): string {
  return `Hello, ${name}`;
}

console.log(greet(userName));  // 결과: Hello, 홍길동

// 인터페이스 사용 예제
interface User {
  name: string;
  age: number;
  isActive: boolean;
}

// 객체에 인터페이스 적용
const user: User = {
  name: &quot;김철수&quot;,
  age: 25,
  isActive: false
};

// 클래스 사용 예제
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  introduce(): string {
    return `안녕하세요, 저는 ${this.name}이고, ${this.age}살입니다.`;
  }
}

const person = new Person(&quot;박영희&quot;, 22);
console.log(person.introduce());  // 결과: 안녕하세요, 저는 박영희이고, 22살입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 내용을 js로 컴파일한 결과&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;test.js&lt;/p&gt;
&lt;pre id=&quot;code_1732429491976&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 타입을 명시한 변수 선언
var userName = &quot;홍길동&quot;;
var age = 30;
var isActive = true;
// 함수에 타입 지정
function greet(name) {
    return &quot;Hello, &quot;.concat(name);
}
console.log(greet(userName)); // 결과: Hello, 홍길동
// 객체에 인터페이스 적용
var user = {
    name: &quot;김철수&quot;,
    age: 25,
    isActive: false
};
// 클래스 사용 예제
var Person = /** @class */ (function () {
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    Person.prototype.introduce = function () {
        return &quot;안녕하세요, 저는 &quot;.concat(this.name, &quot;이고, &quot;).concat(this.age, &quot;살입니다.&quot;);
    };
    return Person;
}());
var person = new Person(&quot;박영희&quot;, 22);
console.log(person.introduce()); // 결과: 안녕하세요, 저는 박영희이고, 22살입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;타입스크립트의 핵심 인터페이스 그리고 클래스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 인터페이스(Interface)&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터페이스&lt;/b&gt;는 객체의 구조를 정의하는 타입으로, 객체가 가져야 할 속성과 메서드를 명시할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 주로 코드의 일관성과 명확성을 높이고, 코드 작성 시 타입 검사를 강화하는 데 도움이 된다.&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;인터페이스의 주요 사용 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;타입 안정성&lt;/b&gt;: 인터페이스를 사용하면 객체가 미리 정의된 구조를 따르게 강제할 수 있다. 타입 오류를 컴파일 단계에서 사전에 발견할 수 있어 코드 안정성이 높아진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 일관성&lt;/b&gt;: 인터페이스를 사용하면 일관된 데이터 구조를 강제할 수 있다. 예를 들어, 여러 곳에서 동일한 데이터 구조가 필요할 때 인터페이스를 정의하고 그 구조를 공유함으로써 일관성을 유지할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연한 확장성&lt;/b&gt;: 인터페이스는 상속을 지원하여 하나의 인터페이스를 확장해 새로운 인터페이스를 만들 수 있다. 이를 통해 코드의 재사용성을 높이고, 기존 구조를 유연하게 확장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제&lt;/p&gt;
&lt;pre id=&quot;code_1732429868272&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Person {
  name: string;
  age: number;
  introduce(): string;
}

const person: Person = {
  name: &quot;홍길동&quot;,
  age: 30,
  introduce() {
    return `안녕하세요, 저는 ${this.name}이고, ${this.age}살입니다.`;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;위 예제에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Person&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인터페이스를 정의하고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;person&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체가 그 인터페이스 구조를 따르도록 설정했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;만약 객체에 정의되지 않은 속성을 추가하거나 필요한 속성이 누락되면 타입 오류가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 클래스(Class)&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스&lt;/b&gt;는 객체 지향 프로그래밍(OOP)의 기본 요소로, 상태와 동작을 캡슐화한 객체를 생성하기 위한 청사진 역할을 한다. TypeScript는 클래스 기반 프로그래밍을 지원하여, 자바스크립트보다 객체 지향적 패턴을 쉽게 사용할 수 있다.&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;클래스의 주요 사용 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;캡슐화&lt;/b&gt;: 클래스는 데이터(속성)와 메서드(기능)를 하나의 단위로 묶어 캡슐화할 수 있다. 이렇게 하면 객체의 내부 상태를 보호하고, 외부에서 접근할 수 있는 부분을 제한하여 코드의 안정성을 높일 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재사용성&lt;/b&gt;: 클래스는 인스턴스를 생성하여 동일한 구조와 동작을 갖는 객체를 여러 개 만들 수 있다. 이를 통해 코드 재사용이 용이하며, 유지 보수가 편리해진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상속과 다형성&lt;/b&gt;: 클래스를 사용하면 상속을 통해 기존 클래스를 확장할 수 있고, 여러 클래스가 동일한 인터페이스를 구현하여 다형성을 제공할 수 있다. 이를 통해 유연하고 확장 가능한 구조를 설계할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제&lt;/p&gt;
&lt;pre id=&quot;code_1732429968390&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PersonClass {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  introduce(): string {
    return `안녕하세요, 저는 ${this.name}이고, ${this.age}살입니다.`;
  }
}

const personInstance = new PersonClass(&quot;홍길동&quot;, 30);
console.log(personInstance.introduce());  // 결과: 안녕하세요, 저는 홍길동이고, 30살입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서 PersonClass라는 클래스를 정의하고, 그 안에 name과 age 속성을 포함하고, introduce 메서드를 구현했다. new 키워드를 사용하여 이 클래스의 인스턴스를 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;인터페이스와 클래스의 차이점 및 결합 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: 인터페이스는 주로 데이터의 구조를 정의하는 데 사용되며, 클래스는 데이터와 행동을 묶어 실제로 객체를 생성하는 데 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추상화&lt;/b&gt;: 인터페이스는 구현이 없고 오로지 타입만을 정의하므로, 여러 클래스가 같은 구조를 따르도록 강제할 수 있다. 클래스는 구현체를 포함하며, 구체적인 객체의 인스턴스를 생성하는 데 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결합 사용&lt;/b&gt;: 클래스와 인터페이스를 함께 사용하여 객체 지향적인 구조와 타입 안정성을 동시에 제공할 수 있다. 예를 들어, 클래스가 특정 인터페이스를&lt;span&gt;&amp;nbsp;&lt;/span&gt;implements&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드로 구현하여 인터페이스에서 정의된 타입을 따르도록 강제할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결합&amp;nbsp;사용&amp;nbsp;예제&lt;/p&gt;
&lt;pre id=&quot;code_1732430082014&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Person {
  name: string;
  age: number;
  introduce(): string;
}

class Student implements Person {
  name: string;
  age: number;
  studentId: number;

  constructor(name: string, age: number, studentId: number) {
    this.name = name;
    this.age = age;
    this.studentId = studentId;
  }

  introduce(): string {
    return `안녕하세요, 저는 ${this.name}이고, ${this.age}살이며, 학번은 ${this.studentId}입니다.`;
  }
}

const student = new Student(&quot;김영희&quot;, 20, 2021001);
console.log(student.introduce());  // 결과: 안녕하세요, 저는 김영희이고, 20살이며, 학번은 2021001입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;위 예제에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Student&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Person&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인터페이스를 구현하여,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;name&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;age&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;introduce&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드를 반드시 포함하도록 강제한다. 이를 통해 일관된 구조를 유지하면서 필요한 속성과 기능을 추가하여 확장할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인터페이스&lt;/b&gt;는 객체의 구조를 정의하여 일관된 데이터 형태를 강제하고 타입 안정성을 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클래스&lt;/b&gt;는 실제 객체의 인스턴스를 만들고 캡슐화, 상속 등의 객체 지향적 특징을 활용하는 데 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결합 사용&lt;/b&gt;을 통해 인터페이스와 클래스의 장점을 모두 활용하여 안정성과 유연성을 동시에 갖춘 구조를 설계할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TypeScript에서 인터페이스와 클래스를 사용하는 이유는 이렇게 명확한 구조와 유지보수성 높은 코드를 작성하고, 대규모 프로젝트에서도 안정적이고 일관된 코드를 유지하기 위함임.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;출처 GPT-4&lt;/span&gt;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/355</guid>
      <comments>https://devmg.tistory.com/355#entry355comment</comments>
      <pubDate>Sun, 24 Nov 2024 15:55:27 +0900</pubDate>
    </item>
    <item>
      <title>Redis 레디스 + 스프링부트 SpringBoot 연동 RedisTemplate,  @Cacheable 사용하기</title>
      <link>https://devmg.tistory.com/354</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;레디스 사용방법을 간단하게 작성하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째. &lt;b&gt;RedisTemplate&lt;/b&gt;를 이용하여 &lt;b&gt;CRUD&lt;/b&gt; 하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 실무에서는 보통&amp;nbsp; jwt_token 관리에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째. &lt;b&gt;@Cacheable&lt;/b&gt; 어노테이션을이용하여 데이터 캐싱하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 실무에서는 보통 통계 데이터나 대용량 데이터를 여러번 호출할때 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 스프링부트에 레디스를 설정해보자&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. build.gradle에 redis 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1729410064777&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-data-redis'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. application.yml 프로퍼티에 레디스 프로퍼티 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1729410055164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  application:
    name: SpringBoot3WithRedis
  redis:
    host: 185.224.12.50       #클라우드 아이피
    port: 6379                #레디스 포트
    password: redis4321       #레디스 AUTH 비밀번호 AUTH redis
  cache:
    type: redis               #스프링에서 캐시 사용을 레디스로 설정하겠다는 뜻이다.
    redis:
      time-to-live: 5         # 단위(초): @Cacheable의 캐싱시간&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. SpringBootApplication.java 어노테이션 정의&lt;/h3&gt;
&lt;pre id=&quot;code_1729410178310&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
//Spring Boot에 캐싱 사용 알려주기
@EnableCaching
public class SpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBoot3WithRedisApplication.class, args);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Redis 환경설정 java 작성&lt;/h3&gt;
&lt;pre id=&quot;code_1729410215294&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
public class RedisConfig {

    //application.yml 정의한 IP (클라우드 IP 이거나 본인의 아이피)
    @Value(&quot;${spring.redis.host}&quot;)
    private String redisHost;

    //application.yml 정의한 포트번호
    @Value(&quot;${spring.redis.port}&quot;)
    private String redisPort;

    //application.yml 정의한 레디스 관리자 비밀번호(보안을 위해 필수)
    @Value(&quot;${spring.redis.password}&quot;)
    private String redisPassword;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {

        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
        redisStandaloneConfiguration.setPassword(redisPassword);
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);

        return lettuceConnectionFactory;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;application.yml 파일에 정의한 상수들을&lt;/b&gt; 가져와 커넥션하는 메서드에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. @Cacheable 설정 관련 java 작성&lt;/h3&gt;
&lt;pre id=&quot;code_1729410359553&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.time.Duration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Value(&quot;${spring.cache.redis.time-to-live}&quot;)
    private long cacheTtlInSeconds;

    @Bean
    public CacheManager devmkCacheManager(RedisConnectionFactory cf) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(new GenericJackson2JsonRedisSerializer()))
//                .entryTtl(Duration.ofMinutes(3L));    기존 3분 (분)
                .entryTtl(Duration.ofSeconds(cacheTtlInSeconds)); // 현재 (초)
        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(cf)
                .cacheDefaults(redisCacheConfiguration).build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 빈으로 등록한 메소드명 &lt;b&gt;devmkCacheManager&lt;/b&gt;을 &lt;b&gt;@Cacheable&lt;/b&gt; &lt;b&gt;cacheManager&lt;/b&gt; = &quot;&lt;b&gt;devmkCacheManager&lt;/b&gt;&quot; 으로 사용한다.&amp;nbsp; &lt;b&gt;캐싱 만료시간 (TTL)도 application.yml에 정의한 시간&lt;/b&gt; 프로퍼티값을 가져와서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. RedisTemplate 서비스 작성&lt;/h3&gt;
&lt;pre id=&quot;code_1729412742411&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.concurrent.TimeUnit;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class RedisUtils {

    private final RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate;

    public RedisUtils(RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
    //TTL(Time To Live)이란? 
    //레디스에서 데이터를 캐싱하는 생명주기시간
    
    //데이터 저장
    public void setData(String key, String value, Long expiredTime) {
    	//위 코드에서는 opsForValue().set() 메서드를 사용해 값을 저장하고 있으며, 
    	//expiredTime과 TimeUnit을 전달함으로써 만료 시간(예: 밀리초 단위)을 설정한다.
    	//이 만료 시간(TTL)이 지나면 Redis에 저장된 해당 키가 자동으로 삭제된다.
    	
        redisTemplate.opsForValue().set(key, value, expiredTime, TimeUnit.MILLISECONDS);
    }
    
    //데이터저장 (TTL없이 무기한)
    public void setDataWithoutExpire(String key, String value) {
        redisTemplate.opsForValue().set(key, value); // 만료 시간 없이 저장
    }
    
    //TTL 업데이트와 만료시간 관리
    public void updateExpire(String key, Long newExpireTime) {
    	//이미 설정된 키에 대해 TTL을 업데이트하거나 연장하려면 Redis의 expire() 메서드를 사용할 수도 있다.
        redisTemplate.expire(key, newExpireTime, TimeUnit.MILLISECONDS);
    }

    //데이터 조회
    public String getData(String key) {
    	//키를 이용해 Redis에 저장된 값을 조회하는 메서드이다.
    	//반환된 데이터가 String이라고 가정하고 형 변환((String))하고 있다.
        return (String) redisTemplate.opsForValue().get(key);
    }

    //데이터삭제
    public void deleteData(String key) {
    	//특정 키에 대한 데이터를 삭제하는 간단한 메서드 이다.
    	//이 메서드는 키가 Redis에서 즉시 제거된다.
        redisTemplate.delete(key);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedisTemplate로 CRUD할때 사용하는 서비스다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. RedisTemplate로 CRUD 테스트하기&lt;/h3&gt;
&lt;pre id=&quot;code_1729412872343&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.bind.annotation.*;

import kr.co.test.login.vo.TokenRequest;
import kr.co.test.util.RedisUtils;

@RestController
@RequestMapping(&quot;/api/crud&quot;)
public class RedisTemplateCRUDController {

    private final RedisUtils redisUtils;
    private static final Long EXPIRE_TIME = 600_000L; // 10분(밀리초 단위)

    public RedisTemplateCRUDController(RedisUtils redisUtils) {
        this.redisUtils = redisUtils;
    }
	
    //저장
    @PostMapping(&quot;/store&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; storeToken(@RequestBody TokenRequest tokenRequest) {
        redisUtils.setData(tokenRequest.getToken(), &quot;valid&quot;, EXPIRE_TIME);
        return ResponseEntity.status(HttpStatus.CREATED).body(&quot;JWT 토큰이 Redis에 저장되었습니다.&quot;);
    }
    
    //조회
    @GetMapping(&quot;/validate&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; validateToken(@RequestParam(name = &quot;token&quot;) String token) {
        String tokenStatus = redisUtils.getData(token);
        if (tokenStatus == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(&quot;유효하지 않은 토큰입니다.&quot;);
        }
        return ResponseEntity.ok(&quot;유효한 토큰입니다.&quot;);
    }
    //삭제
    @DeleteMapping(&quot;/delete&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; deleteToken(@RequestParam(name = &quot;token&quot;) String token) {
        redisUtils.deleteData(token);
        return ResponseEntity.ok(&quot;JWT 토큰이 삭제되었습니다.&quot;);
    }
    //업데이트
    @PutMapping(&quot;/refresh&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; refreshToken(@RequestParam(name = &quot;token&quot;) String token) {
        String tokenStatus = redisUtils.getData(token);
        if (tokenStatus == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(&quot;토큰이 존재하지 않습니다.&quot;);
        }
        redisUtils.updateExpire(token, EXPIRE_TIME);
        return ResponseEntity.ok(&quot;JWT 토큰의 만료 시간이 갱신되었습니다.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 컨트롤러를 만들어준다. jwt토큰을 사용한다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postman으로 테스트하면서 서버의 Redis CLI로&amp;nbsp; 데이터가 어떻게 저장되고 보여지는지 확인하자&lt;/p&gt;
&lt;pre id=&quot;code_1729413612320&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it redis redis-cli
127.0.0.1:6379&amp;gt; AUTH {비밀번호}
OK&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;uarr; docker redis cli 로그인 과정일뿐.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레디스 데이터 저장&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST방식 /api/crud/store&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{ &quot;token&quot; : &quot;devmk_token&quot; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;레디스 데이터 조회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET방식 /api/crud/validate?token=devmk_token&lt;/p&gt;
&lt;pre id=&quot;code_1729413667791&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; keys *
1) &quot;devmk_token&quot;
127.0.0.1:6379&amp;gt; get devmk_token
&quot;valid&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 임의로 정한 토큰이름으로 &quot;&lt;b&gt;valid&lt;/b&gt;&quot; 라는 값이 저장됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레디스 데이터 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE방식 /api/crud/delete?token=devmk_token&lt;/p&gt;
&lt;pre id=&quot;code_1729413742492&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; keys *
(empty array)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제를 했기때문에 저장된 &lt;b&gt;데이터가 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레디스 만료시간 업데이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT방식 /api/crud/refresh?token=devmk_token&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 레디스 캐싱 이용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐싱하는 서비스 작성&lt;/p&gt;
&lt;pre id=&quot;code_1729413831871&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Service
@RequiredArgsConstructor
public class CacheService {

    @Cacheable(cacheNames = &quot;getAll&quot;, key = &quot;#root.target + #root.methodName&quot;, sync = true, cacheManager = &quot;devmkCacheManager&quot;)
    public List&amp;lt;CacheVo&amp;gt; getAll() {

        log.info(&quot; ::::: 캐싱대상 서비스 입니다.:::::&quot;);
        List&amp;lt;CacheVo&amp;gt; dummyList = new ArrayList&amp;lt;&amp;gt;();
        dummyList.add(new CacheVo(&quot;홍길동&quot;, &quot;20&quot;, &quot;남자&quot;));
        dummyList.add(new CacheVo(&quot;임꺽정&quot;, &quot;30&quot;, &quot;여자&quot;));
        dummyList.add(new CacheVo(&quot;김민호&quot;, &quot;30&quot;, &quot;남자&quot;));

        return dummyList;

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임의로 더미데이터를 만드는 서비스를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러 작성&lt;/p&gt;
&lt;pre id=&quot;code_1729413961110&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import kr.co.test.cache.service.CacheService;
import kr.co.test.cache.vo.CacheVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequestMapping(&quot;/cache&quot;)
@RequiredArgsConstructor
public class CacheController {

    private final CacheService cacheService;

    @GetMapping(&quot;/getAll&quot;)
    public ResponseEntity&amp;lt;List&amp;lt;CacheVo&amp;gt;&amp;gt; getAll() {

        log.info(&quot; :::: 레디스 캐싱 서비스를 호출을 시작 합니다. ::::&quot;);
        List&amp;lt;CacheVo&amp;gt; body = cacheService.getAll();
        log.info(&quot; :::: 레디스 캐싱 서비스를 호출을 종료 합니다. ::::&quot;);

        return ResponseEntity.ok(body);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레디스 데이터 캐싱하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET방식 /cache/getAll&lt;/p&gt;
&lt;div style=&quot;background-color: #fffffe; color: #000000;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;홍길동&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;20&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;sex&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;남자&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;임꺽정&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;30&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;sex&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;여자&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;김민호&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;30&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;sex&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;&quot;남자&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;형태의 데이터가 저장됐다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1729414176448&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; keys *
1) &quot;getAll::kr.co.test.cache.service.CacheService@14f9a8c9getAll&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key명은 getAll::kr.co.test.cache.service.CacheService@14f9a8c9getAll 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 키명으로 임의로 만든 배열이 저장됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Cacheable key는 아무거나 지정해도된다. 나는 단지 호출한서비스의 path를 key명으로 사용했을뿐이다.&lt;/p&gt;
&lt;pre id=&quot;code_1729414243377&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; get getAll::kr.co.test.cache.service.CacheService@14f9a8c9getAll
&quot;[\&quot;java.util.ArrayList\&quot;,[{\&quot;@class\&quot;:\&quot;kr.co.test.cache.vo.CacheVo\&quot;
,\&quot;age\&quot;:\&quot;\xed\x99\x8d\xea\xb8\xb8\xeb\x8f\x99\&quot;
,\&quot;name\&quot;:\&quot;20\&quot;,\&quot;sex\&quot;:\&quot;\xeb\x82\xa8\xec\x9e\x90\&quot;}
,{\&quot;@class\&quot;:\&quot;kr.co.test.cache.vo.CacheVo\&quot;
,\&quot;age\&quot;:\&quot;\xec\x9e\x84\xea\xba\xbd\xec\xa0\x95\&quot;
,\&quot;name\&quot;:\&quot;30\&quot;,\&quot;sex\&quot;:\&quot;\xec\x97\xac\xec\x9e\x90\&quot;}
,{\&quot;@class\&quot;:\&quot;kr.co.test.cache.vo.CacheVo\&quot;
,\&quot;age\&quot;:\&quot;\xea\xb9\x80\xeb\xaf\xbc\xed\x98\xb8\&quot;
,\&quot;name\&quot;:\&quot;30\&quot;,\&quot;sex\&quot;:\&quot;\xeb\x82\xa8\xec\x9e\x90\&quot;}]]&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis cli에서 확인해보지 이런식으로 저장됐다. 서버에는 인코딩이 깨지지만 자바에서 불러올땐 제대로 나옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729414963516&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;127.0.0.1:6379&amp;gt; get getAll::kr.co.test.cache.service.CacheService@14f9a8c9getAll
(nil)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐싱시간을 yml파일에 정의한 5초 이기때문에 5초후 다시 호출하면 값이 Null이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5초동안 레디스가 캐싱한 데이터를 대신 보여주고&amp;nbsp;&lt;b&gt;CacheService.getAll()&lt;/b&gt; 서비스를 호출하지 않는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대충 사용방법은 다 작성한것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 jwt+redis 이용한 토큰관리를 포스트하겠다~&lt;/p&gt;</description>
      <category>Spring Boot</category>
      <category>redis cacheable</category>
      <category>redistemplate</category>
      <category>spring boot cachemanager</category>
      <category>spring boot redis 연동</category>
      <category>spring boot redistemplate</category>
      <category>레디스 @cacheable</category>
      <category>스프링부트 레디스 연동</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/354</guid>
      <comments>https://devmg.tistory.com/354#entry354comment</comments>
      <pubDate>Sun, 20 Oct 2024 18:12:29 +0900</pubDate>
    </item>
    <item>
      <title>우분투 도커Docker 레디스Redis 설치 (도커볼륨이용) with 네이버 클라우드</title>
      <link>https://devmg.tistory.com/353</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 도커에 레디스 이미지 다운&lt;/h3&gt;
&lt;pre id=&quot;code_1728738145630&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull redis&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-07 091413.png&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgLdNA/btsJY5KiP3w/lwJSIoHhK1OPJshKKOI5ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgLdNA/btsJY5KiP3w/lwJSIoHhK1OPJshKKOI5ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgLdNA/btsJY5KiP3w/lwJSIoHhK1OPJshKKOI5ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgLdNA%2FbtsJY5KiP3w%2FlwJSIoHhK1OPJshKKOI5ok%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;1053&quot; height=&quot;281&quot; data-filename=&quot;스크린샷 2024-10-07 091413.png&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 다운된 레디스 이미지 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1728738178212&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-07 091433.png&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uhAD/btsJ0dUJiv3/S4q59BvqpJuJT4u8SLtuak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uhAD/btsJ0dUJiv3/S4q59BvqpJuJT4u8SLtuak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uhAD/btsJ0dUJiv3/S4q59BvqpJuJT4u8SLtuak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uhAD%2FbtsJ0dUJiv3%2FS4q59BvqpJuJT4u8SLtuak%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;829&quot; height=&quot;109&quot; data-filename=&quot;스크린샷 2024-10-07 091433.png&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 레디스 볼륨설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 in-memory 기반 저장소이기 때문에 Docker Container 내에서 실행 시 해당 컨테이너가 중지되거나 삭제되면 Redis에 저장된 모든 데이터가 손실된다. 이런 문제를 방지하기 위해 도커를 사용할 때 볼륨이라는 개념을 사용해서 컨테이너에 파일 or 디렉토리를 마운트하여 방지한다. 따라서 먼저, Redis 백업용 도커 볼륨을 생성해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1728738293512&quot; class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;docker volume create (만들 볼륨이름)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미사용중인 볼륨 보기&lt;/p&gt;
&lt;pre id=&quot;code_1728738368050&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker volume ls -f dangling=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어진 볼륨의 정보 보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker volume inspect (만든 볼륨이름)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-07 091958.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh55WF/btsJZTvnORg/S4Ij2fymmRqR2Y96RyKNkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh55WF/btsJZTvnORg/S4Ij2fymmRqR2Y96RyKNkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh55WF/btsJZTvnORg/S4Ij2fymmRqR2Y96RyKNkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh55WF%2FbtsJZTvnORg%2FS4Ij2fymmRqR2Y96RyKNkK%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;782&quot; height=&quot;328&quot; data-filename=&quot;스크린샷 2024-10-07 091958.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 레디스 컨피그 파일 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임의의 경로에 redis.conf 파일을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 만든 경로는 &lt;span&gt;/home/redis/redis.conf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728738581420&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi redis.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨피그 파일 내용 (Ctrl + C , Ctrl + V 이용)&lt;/p&gt;
&lt;pre id=&quot;code_1728738662864&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 연결 가능한 네트위크(0.0.0.0 = Anywhere)
bind 0.0.0.0

# 연결 포트
port 6379

# Master 노드의 기본 사용자 비밀번호
requirepass redis1234

# 최대 사용 메모리 용량(Default : 시스템 전체 용량)
maxmemory 2gb

# 설정된 최대 사용 메모리 용량을 초과했을때 처리 방식
# - noeviction : 쓰기 동작에 대해 error 반환 (Default)
# - volatile-lru : expire 가 설정된 key 들중에서 LRU algorithm 에 의해서 선택된 key 제거
# - allkeys-lru : 모든 key 들 중 LRU algorithm에 의해서 선택된 key 제거
# - volatile-random : expire 가 설정된 key 들 중 임의의 key 제거
# - allkeys-random : 모든 key 들 중 임의의 key 제거
# - volatile-ttl : expire time(TTL)이 가장 적게 남은 key 제거 (minor TTL)
maxmemory-policy volatile-ttl

# RDB 설정 (주기적 백업)
# 15분 안에 최소 1개 이상의 key가 변경되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경되었을 때
save 60 10000

# AOF 설정 (쓰기에 대한 로그 파일 저장)
## AOF 사용 여부
# appendonly yes
# 저장할 AOF 파일명
# appendfilename appendonly.aof
# 디스크와 동기화 처리 방식
# - always : AOF 값을 추가할 때마다 fsync를 호출해서 디스크에 쓰기
# - everysec : 매초마다 fsync를 호출해서 디스크에 쓰기
# - no : OS가 실제 sync를 할 때까지 따로 설정하지 않음
# appendfsync everysec


## Replication 관련 설정
## Slave Redis 설정
#slaveof 127.0.0.1 6380&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※※ 레디스 해킹을 방지하여 비밀번호 설정을 하는것이 좋다. requirepass를 통해 비밀번호를 설정을 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Docker Container로 Redis 실행&lt;/h3&gt;
&lt;pre id=&quot;code_1728738845147&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run \
-d \
--restart=always \
--name=(redis container name) \
-p (host port):(container port) \
-v (redis.conf 생성한 경로)/redis.conf:/etc/redis/redis.conf \
-v (생성한 Docker Volume Mountpoint):/data \
redis:latest redis-server /etc/redis/redis.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컨테이너를 실행과 동시에 여러 옵션을 함께 넣었기 때문에 내용이 주렁주렁 길다. (오타 조심해야함!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무슨 옵션인제 긁어서 GPT에 넣으면 친절히 설명해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 레디스 실행하기&lt;/h3&gt;
&lt;pre id=&quot;code_1728739057936&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -i -t (생성한 redis 컨테이너 이름) redis-cli -a 비밀번호
127.0.0.1:6379&amp;gt; AUTH 비밀번호
OK
127.0.0.1:6379&amp;gt; ping
PONG
127.0.0.1:6379&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-10-07 092804.png&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDCoxR/btsJ3OA4gwf/NTzLJSuZc2SUeNnR1nx06k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDCoxR/btsJ3OA4gwf/NTzLJSuZc2SUeNnR1nx06k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDCoxR/btsJ3OA4gwf/NTzLJSuZc2SUeNnR1nx06k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDCoxR%2FbtsJ3OA4gwf%2FNTzLJSuZc2SUeNnR1nx06k%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;1343&quot; height=&quot;433&quot; data-filename=&quot;edited_스크린샷 2024-10-07 092804.png&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 네이버클라우드 인바운드 포트에 6379 등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console &amp;gt; Server &amp;gt; ACG &amp;gt; ACG 설정 &amp;gt; Inbound 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스트에는 스프링부트에서 레디스 이용하는 포스트를 하겠다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본문의 참고 &lt;a href=&quot;https://ksh-coding.tistory.com/129&quot;&gt;https://ksh-coding.tistory.com/129&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>docker redis</category>
      <category>docker redis 설치</category>
      <category>redis spring boot</category>
      <category>redis 스프링부트</category>
      <category>도커 레디스 설치</category>
      <category>레디스 설치</category>
      <category>레디스 스프링부트</category>
      <category>리눅스 레디스 설치</category>
      <category>우분투 도커 레디스</category>
      <category>우분투 레디스 설치</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/353</guid>
      <comments>https://devmg.tistory.com/353#entry353comment</comments>
      <pubDate>Sat, 12 Oct 2024 22:27:12 +0900</pubDate>
    </item>
    <item>
      <title>로지텍 M720 마우스 스위치 수리하기</title>
      <link>https://devmg.tistory.com/352</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;※고장증상&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;로지텍&amp;nbsp; 고장 종특인 더블클릭 증상. 다른 모델들도 한 2년정도 쓰다보면 이런 문제가 생긴다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;준비물&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjENNW/btsJWQFeSYC/J0qIdT24A6ckZO7qpfvcXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjENNW/btsJWQFeSYC/J0qIdT24A6ckZO7qpfvcXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjENNW/btsJWQFeSYC/J0qIdT24A6ckZO7qpfvcXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjENNW%2FbtsJWQFeSYC%2FJ0qIdT24A6ckZO7qpfvcXK%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;409&quot; height=&quot;546&quot; data-filename=&quot;0.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 옴므론 D2FC-F-7N(20M) 스위치.&amp;nbsp; 가격 개당 약 1천원.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호안에 숫자는 클릭 수명이다. 내가 산 스위치의 수명은 클릭수명이 약 2000만회다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5M은 500만, 10M 1000만 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 드라이버 세트 ,인두, 납, 흡입기, 납흡수지 등등&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNfyet/btsJVDABtLj/xIV1TZvkissRfT9Zpk43Qk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNfyet/btsJVDABtLj/xIV1TZvkissRfT9Zpk43Qk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNfyet/btsJVDABtLj/xIV1TZvkissRfT9Zpk43Qk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNfyet%2FbtsJVDABtLj%2FxIV1TZvkissRfT9Zpk43Qk%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;728&quot; height=&quot;546&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epdTEN/btsJW35osh2/ifIHkZt2xNRu2c9DSkxsD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epdTEN/btsJW35osh2/ifIHkZt2xNRu2c9DSkxsD1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epdTEN/btsJW35osh2/ifIHkZt2xNRu2c9DSkxsD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepdTEN%2FbtsJW35osh2%2FifIHkZt2xNRu2c9DSkxsD1%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;409&quot; height=&quot;546&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v18is/btsJWhcdqQ2/u9NQmOJAOOEMeURCNzaqTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v18is/btsJWhcdqQ2/u9NQmOJAOOEMeURCNzaqTK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v18is/btsJWhcdqQ2/u9NQmOJAOOEMeURCNzaqTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv18is%2FbtsJWhcdqQ2%2Fu9NQmOJAOOEMeURCNzaqTK%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;409&quot; height=&quot;546&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분해를하려면 맨위 마우스 서퍼를 뗴어내야 숨어있는 나사를 풀 수있다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;재활용을 해야하니 조심히 뗴어&lt;/b&gt;&lt;/span&gt;낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 상하판분리&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.jpg&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UqBP4/btsJW7NsX84/k2Ok1NKCkeHEcZXyYhgov0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UqBP4/btsJW7NsX84/k2Ok1NKCkeHEcZXyYhgov0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UqBP4/btsJW7NsX84/k2Ok1NKCkeHEcZXyYhgov0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUqBP4%2FbtsJW7NsX84%2Fk2Ok1NKCkeHEcZXyYhgov0%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;2016&quot; height=&quot;1512&quot; data-filename=&quot;4.jpg&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(주의) 상하판을 분리하려면 저 아주 얇은 케이브을 분리해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.jpg&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAoLZJ/btsJXs4YECL/BeJNwap5FuWFKKTcc2PmI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAoLZJ/btsJXs4YECL/BeJNwap5FuWFKKTcc2PmI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAoLZJ/btsJXs4YECL/BeJNwap5FuWFKKTcc2PmI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAoLZJ%2FbtsJXs4YECL%2FBeJNwap5FuWFKKTcc2PmI1%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;1087&quot; height=&quot;574&quot; data-filename=&quot;5.jpg&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 &lt;span style=&quot;color: #ee2323;&quot;&gt;아주 작은 커넥터가 이빨로 케이블을 물고&lt;/span&gt;있다. &lt;span style=&quot;color: #ee2323;&quot;&gt;90도 위로 올리면 &lt;/span&gt;파란색부분의 케이블이 분리 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 커넥터를 위로 올려야 하는지모르고 힘으로 빼다가 커넥터가 빠졌다. &lt;span style=&quot;color: #ee2323;&quot;&gt;다행이도 다시 끼면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 휠 분리&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0CT2c/btsJWydHlrs/4Ueq5osYvmUa9all6c3Kp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0CT2c/btsJWydHlrs/4Ueq5osYvmUa9all6c3Kp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0CT2c/btsJWydHlrs/4Ueq5osYvmUa9all6c3Kp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0CT2c%2FbtsJWydHlrs%2F4Ueq5osYvmUa9all6c3Kp1%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;728&quot; height=&quot;546&quot; data-filename=&quot;6.jpg&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휠사이에 껴있는 고정플라스틱 핀을 왼쪽으로 당겨 휠뭉치를 분리시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.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/bNh7NJ/btsJW3K6JSb/QU9HkKpoU5AzGMMZ4Jjj9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNh7NJ/btsJW3K6JSb/QU9HkKpoU5AzGMMZ4Jjj9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNh7NJ/btsJW3K6JSb/QU9HkKpoU5AzGMMZ4Jjj9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNh7NJ%2FbtsJW3K6JSb%2FQU9HkKpoU5AzGMMZ4Jjj9K%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;4032&quot; height=&quot;3024&quot; data-filename=&quot;7.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 하판 PCB 분리&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WhnGs/btsJVsy55U2/5w7oxTFQdidpxqkmRndDM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WhnGs/btsJVsy55U2/5w7oxTFQdidpxqkmRndDM0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WhnGs/btsJVsy55U2/5w7oxTFQdidpxqkmRndDM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWhnGs%2FbtsJVsy55U2%2F5w7oxTFQdidpxqkmRndDM0%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;409&quot; height=&quot;546&quot; data-filename=&quot;8.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4UWTj/btsJWqfTt9n/MreeGaZWNhabZGgVAxpcfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4UWTj/btsJWqfTt9n/MreeGaZWNhabZGgVAxpcfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4UWTj/btsJWqfTt9n/MreeGaZWNhabZGgVAxpcfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4UWTj%2FbtsJWqfTt9n%2FMreeGaZWNhabZGgVAxpcfK%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;409&quot; height=&quot;546&quot; data-filename=&quot;9.jpg&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 스위치 교체&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Q9iV/btsJVgyVkhD/jKZN1NUjyiNp3meBT0wDv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Q9iV/btsJVgyVkhD/jKZN1NUjyiNp3meBT0wDv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Q9iV/btsJVgyVkhD/jKZN1NUjyiNp3meBT0wDv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Q9iV%2FbtsJVgyVkhD%2FjKZN1NUjyiNp3meBT0wDv0%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;10.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 뭐 스킬은없다 인두로 납을 녹이고 흡입기로 납을 흡입하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.jpg&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PdAHN/btsJWTIGapB/5SxcYMtI6BMA677ymWm5S1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PdAHN/btsJWTIGapB/5SxcYMtI6BMA677ymWm5S1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PdAHN/btsJWTIGapB/5SxcYMtI6BMA677ymWm5S1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPdAHN%2FbtsJWTIGapB%2F5SxcYMtI6BMA677ymWm5S1%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;916&quot; height=&quot;515&quot; data-filename=&quot;11.jpg&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 역시 잘 안된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;니퍼로 기존 스위치를 전부 부셔버리고 뺐다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;u&gt;조립은 분해의 역순&lt;/u&gt;&lt;/h3&gt;</description>
      <category>취미</category>
      <category>로지텍 m720 더블클릭</category>
      <category>로지텍 m720 더블클릭 증상 수리</category>
      <category>로지텍 m720 스위치 교체ㅡ</category>
      <category>로지텍 마우스 수리</category>
      <category>로지텍 옴므론 수리</category>
      <category>로지텍 옴므론 스위치</category>
      <category>마우스 로지텍 수리</category>
      <category>마우스 수리</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/352</guid>
      <comments>https://devmg.tistory.com/352#entry352comment</comments>
      <pubDate>Sun, 6 Oct 2024 20:12:03 +0900</pubDate>
    </item>
    <item>
      <title>도커Dcoker에 젠킨스Jenkins 설치하기 with 네이버 클라우드</title>
      <link>https://devmg.tistory.com/351</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;도커에 젠킨스 이미지를 받아 컨테이너를 띄워보자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;우분투버전&lt;/h4&gt;
&lt;pre id=&quot;code_1727954232543&quot; class=&quot;livecodeserver&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lsb_release -a&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;- 22.04.3 LTS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Docker&amp;nbsp;27.3.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Jenkins 컨테이너 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1727954363473&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker run -d --name jenkins -p 8080:8080 jenkins/jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;-d:&amp;nbsp;컨테이너를&amp;nbsp;데몬으로&amp;nbsp;띄운다. &lt;br /&gt;&amp;nbsp;--name:&amp;nbsp;컨테이너의&amp;nbsp;이름을&amp;nbsp;jenkins로&amp;nbsp;설정한다 &lt;br /&gt;&amp;nbsp;-p&amp;nbsp;8080:8080:&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;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스1.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0jGkZ/btsJT711RLH/9pe1EtlWLrTeKR4tL05Rrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0jGkZ/btsJT711RLH/9pe1EtlWLrTeKR4tL05Rrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0jGkZ/btsJT711RLH/9pe1EtlWLrTeKR4tL05Rrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0jGkZ%2FbtsJT711RLH%2F9pe1EtlWLrTeKR4tL05Rrk%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;852&quot; height=&quot;309&quot; data-filename=&quot;젠킨스1.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 네이버클라우드 인바운드 포트에 8080 등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console &amp;gt; Server &amp;gt; ACG &amp;gt; ACG 설정 &amp;gt; Inbound 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. {PUBLIC IP}:8080 으로 Jenkins 접속&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스2.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV7jS3/btsJUyrmzRg/vWUxvuTgNI8fhmOz0fSfqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV7jS3/btsJUyrmzRg/vWUxvuTgNI8fhmOz0fSfqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV7jS3/btsJUyrmzRg/vWUxvuTgNI8fhmOz0fSfqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV7jS3%2FbtsJUyrmzRg%2FvWUxvuTgNI8fhmOz0fSfqk%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;1048&quot; height=&quot;932&quot; data-filename=&quot;젠킨스2.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;젠킨스 컨테이너 내부로 접속하여 관리자 Key를 복사하여 넣어야 설치가 마무리 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 젠킨스 컨테이너 접속&lt;/h3&gt;
&lt;pre id=&quot;code_1727954452992&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker exec -it jenkins bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 관리자 키 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1727954469376&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /var/jenkins_home/secrets/initialAdminPassword&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스3.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFsVWq/btsJT9elcME/aPtcP6sByQQUkKMIbjz1hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFsVWq/btsJT9elcME/aPtcP6sByQQUkKMIbjz1hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFsVWq/btsJT9elcME/aPtcP6sByQQUkKMIbjz1hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFsVWq%2FbtsJT9elcME%2FaPtcP6sByQQUkKMIbjz1hk%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;608&quot; height=&quot;58&quot; data-filename=&quot;젠킨스3.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자키 복사한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스4.png&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boMxWO/btsJU1T51I0/ptM836ncG5vKpnaaQfGg2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boMxWO/btsJU1T51I0/ptM836ncG5vKpnaaQfGg2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boMxWO/btsJU1T51I0/ptM836ncG5vKpnaaQfGg2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboMxWO%2FbtsJU1T51I0%2FptM836ncG5vKpnaaQfGg2k%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;1079&quot; height=&quot;938&quot; data-filename=&quot;젠킨스4.png&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스5.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH118X/btsJTnxDMtl/XtRhXIeqn6SQeij53Y4WmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH118X/btsJTnxDMtl/XtRhXIeqn6SQeij53Y4WmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH118X/btsJTnxDMtl/XtRhXIeqn6SQeij53Y4WmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH118X%2FbtsJTnxDMtl%2FXtRhXIeqn6SQeij53Y4WmK%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;1048&quot; height=&quot;926&quot; data-filename=&quot;젠킨스5.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 플러그인이 일괄 설치된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스6.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEVBI/btsJTGX2xUW/l3bTA8xxWob3Ta7xndrZfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEVBI/btsJTGX2xUW/l3bTA8xxWob3Ta7xndrZfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEVBI/btsJTGX2xUW/l3bTA8xxWob3Ta7xndrZfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEVBI%2FbtsJTGX2xUW%2Fl3bTA8xxWob3Ta7xndrZfk%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;1086&quot; height=&quot;944&quot; data-filename=&quot;젠킨스6.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 끝나면 관리자를 등록해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스7.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWdYWC/btsJTLSv3wG/BkmjdE87ZyDbEYKtIQK5P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWdYWC/btsJTLSv3wG/BkmjdE87ZyDbEYKtIQK5P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWdYWC/btsJTLSv3wG/BkmjdE87ZyDbEYKtIQK5P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWdYWC%2FbtsJTLSv3wG%2FBkmjdE87ZyDbEYKtIQK5P1%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;1089&quot; height=&quot;939&quot; data-filename=&quot;젠킨스7.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins 접속 URL 설정,&lt;br /&gt;젠킨스에 접속할 때 사용할 URL 설정이다&lt;br /&gt;기본 설정 public IP:8080으로 유지하고 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스8.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WboXc/btsJUu3vW8W/vMy14D0yuIerVFkpHuFdCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WboXc/btsJUu3vW8W/vMy14D0yuIerVFkpHuFdCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WboXc/btsJUu3vW8W/vMy14D0yuIerVFkpHuFdCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWboXc%2FbtsJUu3vW8W%2FvMy14D0yuIerVFkpHuFdCk%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;1076&quot; height=&quot;937&quot; data-filename=&quot;젠킨스8.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스9.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9qkj/btsJTp93Olx/fD2pUJozmaLwUL2exKAADK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9qkj/btsJTp93Olx/fD2pUJozmaLwUL2exKAADK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9qkj/btsJTp93Olx/fD2pUJozmaLwUL2exKAADK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9qkj%2FbtsJTp93Olx%2FfD2pUJozmaLwUL2exKAADK%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;1070&quot; height=&quot;941&quot; data-filename=&quot;젠킨스9.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Jenkins 웹 접속&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://{PUBLIC IP}:8080&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설정한 관리자 계정 입력 후 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;젠킨스10.png&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVruJs/btsJT6IPJgm/sWRzhnfG9pJkPXthTUwrb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVruJs/btsJT6IPJgm/sWRzhnfG9pJkPXthTUwrb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVruJs/btsJT6IPJgm/sWRzhnfG9pJkPXthTUwrb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVruJs%2FbtsJT6IPJgm%2FsWRzhnfG9pJkPXthTUwrb1%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;1913&quot; height=&quot;815&quot; data-filename=&quot;젠킨스10.png&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>docker jenkins 설치</category>
      <category>docker 젠킨스 설치</category>
      <category>ubuntu docker jenkins</category>
      <category>ubuntu docker 젠킨스 설치</category>
      <category>네이버 클라우드 젠킨스 설치</category>
      <category>도커 젠킨스 설치</category>
      <category>도커 젠킨스 컨테이너</category>
      <category>리눅스 젠킨스 설치</category>
      <category>우분투 도커 젠킨스</category>
      <category>젠킨스 설치</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/351</guid>
      <comments>https://devmg.tistory.com/351#entry351comment</comments>
      <pubDate>Thu, 3 Oct 2024 20:26:01 +0900</pubDate>
    </item>
    <item>
      <title>네이버 클라우드 도커 Nginx와 Nginx Proxy Manager 설치하기 그리고   socket() [::]:80 failed 오류</title>
      <link>https://devmg.tistory.com/350</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;우분투버전&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;- 22.04.3 LTS&lt;/h4&gt;
&lt;pre id=&quot;code_1727952033312&quot; class=&quot;livecodeserver&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;lsb_release -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 도커 컴포즈 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apt 패키지 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1727952370659&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker compose 설치&lt;/p&gt;
&lt;pre id=&quot;code_1727952384838&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install -y docker-compose&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.&amp;nbsp; 도커 컴포즈로 nginx + nginx proxy manager 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPM을 설치할 디렉토리를 만든다&lt;/p&gt;
&lt;pre id=&quot;code_1727952303817&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir /home/npm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 도커 컴포즈 파일을 작성 &lt;span&gt;docker-compose.yml&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;vi편집기로 아래의 내용을 입력하여 &lt;/span&gt;&lt;span&gt;docker-compose.yml 파일을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727952554315&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용&lt;/p&gt;
&lt;pre id=&quot;code_1727952496332&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'  # Docker Compose 파일 버전

services:
  npm:
    image: jc21/nginx-proxy-manager:latest  # 사용할 Docker 이미지 (Nginx Proxy Manager의 최신 버전)
    restart: unless-stopped  # 컨테이너가 중지된 경우 자동 재시작 (수동으로 중지하지 않는 한)

    ports:
      - &quot;80:80&quot;       # HTTP 포트 (외부 80 포트를 컨테이너의 80 포트에 매핑)
      - &quot;81:81&quot;       # 관리 UI 포트 (외부 81 포트를 컨테이너의 81 포트에 매핑)
      - &quot;443:443&quot;     # HTTPS 포트 (외부 443 포트를 컨테이너의 443 포트에 매핑)

    volumes:
      - ./data:/data  # 로컬 ./data 디렉토리를 컨테이너의 /data 디렉토리에 매핑 (데이터 저장소)
      - ./letsencrypt:/etc/letsencrypt  # 로컬 ./letsencrypt 디렉토리를 컨테이너의 /etc/letsencrypt 디렉토리에 매핑 (SSL 인증서 저장소)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 저장을하고 현재 디렉토리에서 도커 컴포즈를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727952612220&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm1.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nyhNY/btsJVh3sLGM/FVk8cZ0m7RIDxN3nzZfXo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nyhNY/btsJVh3sLGM/FVk8cZ0m7RIDxN3nzZfXo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nyhNY/btsJVh3sLGM/FVk8cZ0m7RIDxN3nzZfXo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnyhNY%2FbtsJVh3sLGM%2FFVk8cZ0m7RIDxN3nzZfXo1%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;1055&quot; height=&quot;720&quot; data-filename=&quot;npm1.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx 와 nginx proxy manager를 다운받고 설치중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm2.png&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgWD6/btsJUXYyWuA/nR76KGh6b3qhY5NQFGxYQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgWD6/btsJUXYyWuA/nR76KGh6b3qhY5NQFGxYQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgWD6/btsJUXYyWuA/nR76KGh6b3qhY5NQFGxYQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgWD6%2FbtsJUXYyWuA%2FnR76KGh6b3qhY5NQFGxYQ1%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;1301&quot; height=&quot;848&quot; data-filename=&quot;npm2.png&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료 됐는데 도커 컨테이너를 올릴때 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;nginx:&amp;nbsp;[emerg]&amp;nbsp;socket()&amp;nbsp;[::]:80&amp;nbsp;failed&amp;nbsp;(97:&amp;nbsp;Address&amp;nbsp;family&amp;nbsp;not&amp;nbsp;supported&amp;nbsp;by&amp;nbsp;protocol)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;nginx:&amp;nbsp;[emerg]&amp;nbsp;socket()&amp;nbsp;[::]:80&amp;nbsp;failed&amp;nbsp;(97:&amp;nbsp;Address&amp;nbsp;family&amp;nbsp;not&amp;nbsp;supported&amp;nbsp;by&amp;nbsp;protocol)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;nginx:&amp;nbsp;[emerg]&amp;nbsp;socket()&amp;nbsp;[::]:80&amp;nbsp;failed&amp;nbsp;(97:&amp;nbsp;Address&amp;nbsp;family&amp;nbsp;not&amp;nbsp;supported&amp;nbsp;by&amp;nbsp;protocol)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm3.png&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBe2Sh/btsJS5cVV0h/e1i54Xt6VilcTjiRw67fOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBe2Sh/btsJS5cVV0h/e1i54Xt6VilcTjiRw67fOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBe2Sh/btsJS5cVV0h/e1i54Xt6VilcTjiRw67fOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBe2Sh%2FbtsJS5cVV0h%2Fe1i54Xt6VilcTjiRw67fOK%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;981&quot; height=&quot;539&quot; data-filename=&quot;npm3.png&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;네이버 클라우드는 IPv6을 지원하지 않는데&lt;/b&gt; &amp;nbsp;&lt;b&gt;nginx 기본설정파일에 IPv6 포트를 맵핑&lt;/b&gt;&lt;/u&gt;하는 구문이 있어서 시작시 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;에러가 난다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;nginx 컨테이너 내부로 들어가서 conf파일을 수정해야하는 번거러움이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내부로 들어가려면 컨테이너 아이디나 컨테이너 이름을 알아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727952837613&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1727952885819&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it npm-npm-1 /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 내부로 들어오고 nginx conf파일 디렉토리로 접근한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727952928035&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /etc/nginx/conf.d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm4.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FmHUS/btsJTSqnFK0/1kRosqdKAw6VdakEIjI4PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FmHUS/btsJTSqnFK0/1kRosqdKAw6VdakEIjI4PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FmHUS/btsJTSqnFK0/1kRosqdKAw6VdakEIjI4PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmHUS%2FbtsJTSqnFK0%2F1kRosqdKAw6VdakEIjI4PK%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;1132&quot; height=&quot;456&quot; data-filename=&quot;npm4.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정해야하는 conf 파일은 2개이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;default.conf&amp;nbsp; &amp;gt; 80,443 포트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;production.conf &amp;gt; 81 포트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 내부에 vi 편집기가 설지되어 있지 않다. 설치해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727953001716&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get update
apt-get install vim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm5.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZcLSU/btsJTD76GFD/20QIhaPNEmUJLvAwci6MfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZcLSU/btsJTD76GFD/20QIhaPNEmUJLvAwci6MfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZcLSU/btsJTD76GFD/20QIhaPNEmUJLvAwci6MfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZcLSU%2FbtsJTD76GFD%2F20QIhaPNEmUJLvAwci6MfK%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;791&quot; height=&quot;553&quot; data-filename=&quot;npm5.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 conf파일을 수정하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727953044395&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi default.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm6.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUCY1/btsJTUIuUm7/IRGvzBxh2t3tnncuwNKrnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUCY1/btsJTUIuUm7/IRGvzBxh2t3tnncuwNKrnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUCY1/btsJTUIuUm7/IRGvzBxh2t3tnncuwNKrnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUCY1%2FbtsJTUIuUm7%2FIRGvzBxh2t3tnncuwNKrnK%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;1028&quot; height=&quot;897&quot; data-filename=&quot;npm6.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨간줄 listen [::] 부분 주석처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727953090377&quot; class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;vi production.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm7.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dX4g9a/btsJUj8YhED/4e4Wda5w1llClESb1RHDCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dX4g9a/btsJUj8YhED/4e4Wda5w1llClESb1RHDCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dX4g9a/btsJUj8YhED/4e4Wda5w1llClESb1RHDCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdX4g9a%2FbtsJUj8YhED%2F4e4Wda5w1llClESb1RHDCk%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;1026&quot; height=&quot;893&quot; data-filename=&quot;npm7.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨간줄 listen [::] 부분 주석처리 후 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727953174127&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 도커 컴포즈 yml이 있는 디렉토리로 이동&lt;/p&gt;
&lt;pre id=&quot;code_1727953193915&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /home/npm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컴포즈 재실행&lt;/p&gt;
&lt;pre id=&quot;code_1727953214022&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 로그를 봐도 오류없이 잘 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http://{본인의 Public IP}:81&amp;nbsp; 로 접속&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-03 오후 8.14.18.png&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/svF4n/btsJUYiTAZh/0V5bmFOmisEuk6rscVGkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/svF4n/btsJUYiTAZh/0V5bmFOmisEuk6rscVGkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/svF4n/btsJUYiTAZh/0V5bmFOmisEuk6rscVGkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsvF4n%2FbtsJUYiTAZh%2F0V5bmFOmisEuk6rscVGkKK%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;1758&quot; height=&quot;892&quot; data-filename=&quot;스크린샷 2024-10-03 오후 8.14.18.png&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 관리자 정보를 입력해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Email : admin@example.com &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Password : changeme&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 이메일과 비밀번호를 입력하고 저장하면 기본적인 계정 셋팅은 끝&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>80 failed nginx proxy manager</category>
      <category>ncloud nginx 설치</category>
      <category>ncloud npm 설치</category>
      <category>nginx proxy manager socket error</category>
      <category>socket() [::]:80 failed 오류</category>
      <category>ubuntu nginx proxy manager</category>
      <category>네이버 클라우드 npm 오류</category>
      <category>네이버 클라우드 프록시 매니저 설치</category>
      <category>우분투 nginx proxy manager 설치</category>
      <category>우분투 엔진엑스 설치</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/350</guid>
      <comments>https://devmg.tistory.com/350#entry350comment</comments>
      <pubDate>Thu, 3 Oct 2024 20:08:23 +0900</pubDate>
    </item>
    <item>
      <title>우분투 MySQL 설치하기 with 네이버 클라우드</title>
      <link>https://devmg.tistory.com/349</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투에서 간단하게 MySQL을 설치해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;우분투버전&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 22.04.3 LTS&lt;/h4&gt;
&lt;pre id=&quot;code_1727951828258&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lsb_release -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. apt 패키지 이용&lt;/h3&gt;
&lt;pre id=&quot;code_1727950763519&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install mysql-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql1.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vf1mS/btsJU0t6SLe/axCADWl9k45Q2icCW7xMl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vf1mS/btsJU0t6SLe/axCADWl9k45Q2icCW7xMl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vf1mS/btsJU0t6SLe/axCADWl9k45Q2icCW7xMl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVf1mS%2FbtsJU0t6SLe%2FaxCADWl9k45Q2icCW7xMl1%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;1430&quot; height=&quot;776&quot; data-filename=&quot;mysql1.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치중...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 설치확인&lt;/h3&gt;
&lt;pre id=&quot;code_1727950801523&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netstat -tnlp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql2.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/475SF/btsJUw75vGg/Aruykyj3t7vOz3zD0dFa0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/475SF/btsJUw75vGg/Aruykyj3t7vOz3zD0dFa0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/475SF/btsJUw75vGg/Aruykyj3t7vOz3zD0dFa0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F475SF%2FbtsJUw75vGg%2FAruykyj3t7vOz3zD0dFa0k%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;828&quot; height=&quot;195&quot; data-filename=&quot;mysql2.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3306 포트로 mysql이 올라왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. mysql 접속 및 루트계정 비밀번호 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1727950849949&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql3.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb6FKI/btsJT6IO9xr/SNGZMlfw1WZ6dvQO04EnM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb6FKI/btsJT6IO9xr/SNGZMlfw1WZ6dvQO04EnM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb6FKI/btsJT6IO9xr/SNGZMlfw1WZ6dvQO04EnM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb6FKI%2FbtsJT6IO9xr%2FSNGZMlfw1WZ6dvQO04EnM1%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;660&quot; height=&quot;280&quot; data-filename=&quot;mysql3.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enter password: 가 나오면 초기비밀번호를 넣고 엔터친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &quot;Welcome to the MySQL&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 데이터베이스 생성 및 사용자 계정 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 버전보기&lt;/p&gt;
&lt;pre id=&quot;code_1727950951637&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select version();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql4.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PoIcc/btsJSP87Rqk/NkkZuMzdVjHZtaCmNF0MuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PoIcc/btsJSP87Rqk/NkkZuMzdVjHZtaCmNF0MuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PoIcc/btsJSP87Rqk/NkkZuMzdVjHZtaCmNF0MuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPoIcc%2FbtsJSP87Rqk%2FNkkZuMzdVjHZtaCmNF0MuK%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;372&quot; height=&quot;213&quot; data-filename=&quot;mysql4.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정보 확인&lt;/p&gt;
&lt;pre id=&quot;code_1727950997734&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use mysql
select host, user from user;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql5.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mDnS6/btsJTTCPFYP/LpyCE0e4Kxlj6KlT78WL61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mDnS6/btsJTTCPFYP/LpyCE0e4Kxlj6KlT78WL61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mDnS6/btsJTTCPFYP/LpyCE0e4Kxlj6KlT78WL61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmDnS6%2FbtsJTTCPFYP%2FLpyCE0e4Kxlj6KlT78WL61%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;742&quot; height=&quot;639&quot; data-filename=&quot;mysql5.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 베이스 생성하기&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727951057453&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create database study;  -- study라는 데이터베이스 생성
create user 'study'@'%' identified by '1234'; -- 계정은 study 비밀번호는 1234
grant all privileges on * . * to 'study'@'%';  -- study에 모든 권한 부여
flush privileges;	-- 적용하기, 반드시해야함&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql6.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LlO0K/btsJUkfLCco/s3v36WuDq77y0wbwMk7GIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LlO0K/btsJUkfLCco/s3v36WuDq77y0wbwMk7GIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LlO0K/btsJUkfLCco/s3v36WuDq77y0wbwMk7GIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLlO0K%2FbtsJUkfLCco%2Fs3v36WuDq77y0wbwMk7GIk%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;514&quot; height=&quot;497&quot; data-filename=&quot;mysql6.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 마지막으로 네이버클라우드 인바운드 포트에 3306 포트를 등록해주자~&lt;br /&gt;console&amp;nbsp;&amp;gt;&amp;nbsp;Server&amp;nbsp;&amp;gt;&amp;nbsp;ACG&amp;nbsp;&amp;gt;&amp;nbsp;ACG&amp;nbsp;설정&amp;nbsp;&amp;gt;&amp;nbsp;Inbound&amp;nbsp;등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 추가로 설정해줘야하는 부분이 있다. 이것은 아래글을 확인하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;추가 설정 바로가기&quot; href=&quot;https://devmg.tistory.com/347&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devmg.tistory.com/347&lt;/a&gt;&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>ncloud mysql 설치</category>
      <category>ncloud ubuntu mysql 설치</category>
      <category>네이버 클라우드 mysql 설치</category>
      <category>리눅스 mysql 설치</category>
      <category>우분투 mysql 설치</category>
      <category>우분투 mysql 설치하기</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/349</guid>
      <comments>https://devmg.tistory.com/349#entry349comment</comments>
      <pubDate>Thu, 3 Oct 2024 19:29:38 +0900</pubDate>
    </item>
    <item>
      <title>우분투 Ubuntu 인스턴스에 Docker 도커설치 with 네이버 클라우드</title>
      <link>https://devmg.tistory.com/348</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;OS환경 Ubuntu 22.04&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 우분투 시스템 패키지 업데이트&lt;/h3&gt;
&lt;pre id=&quot;code_1727833654129&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 필요한 패키지 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1727833669190&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;3. Docker의 공식 GPG키를 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1727833688075&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;4. Docker의 공식 apt 저장소를 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1727833700930&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.&amp;nbsp;시스템&amp;nbsp;패키지&amp;nbsp;업데이트&lt;/h3&gt;
&lt;pre id=&quot;code_1727833720355&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;6.&amp;nbsp;Docker&amp;nbsp;설치&lt;/h3&gt;
&lt;pre id=&quot;code_1727833727270&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;7. 도커 실행상태 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1727833732903&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status docker&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;도커&amp;nbsp;실행&lt;/h3&gt;
&lt;pre id=&quot;code_1727833741273&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;9. 현재 실행중인 컨테이너 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1727833746245&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 中....&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-02 121719.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKAlC/btsJRCV1H3D/DC9xgZLYVCtuYKkOvzYEXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKAlC/btsJRCV1H3D/DC9xgZLYVCtuYKkOvzYEXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKAlC/btsJRCV1H3D/DC9xgZLYVCtuYKkOvzYEXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKAlC%2FbtsJRCV1H3D%2FDC9xgZLYVCtuYKkOvzYEXk%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;1136&quot; height=&quot;835&quot; data-filename=&quot;스크린샷 2024-10-02 121719.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-02 121734.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojXvI/btsJTH8W9FV/rkTqd6FHP7BlzNjhXVGNck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojXvI/btsJTH8W9FV/rkTqd6FHP7BlzNjhXVGNck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojXvI/btsJTH8W9FV/rkTqd6FHP7BlzNjhXVGNck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FojXvI%2FbtsJTH8W9FV%2FrkTqd6FHP7BlzNjhXVGNck%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;1014&quot; height=&quot;871&quot; data-filename=&quot;스크린샷 2024-10-02 121734.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>Ubuntu 20.04 설치</category>
      <category>ubuntu docker 설치</category>
      <category>네이버 클라우드 도커 설치</category>
      <category>네이버 클라우드 우분투 도커</category>
      <category>우분투 도커설치</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/348</guid>
      <comments>https://devmg.tistory.com/348#entry348comment</comments>
      <pubDate>Wed, 2 Oct 2024 10:53:08 +0900</pubDate>
    </item>
    <item>
      <title>우분투 MySQL설치시 오류(네이버 클라우드) Connection refused: no further informationthe last packet sent successfully to the server was 0 milliseconds ago. the driver has not received any packets from the server. connection refused: no further infomation</title>
      <link>https://devmg.tistory.com/347</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 클라우드 우분투 서버에 mysql을 설치하고 인바운드 방화벽 규칙까지 설정했는데도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBeaver 디비에서 연결시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Connection&amp;nbsp;refused:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;no&amp;nbsp;further&amp;nbsp;informationthe&amp;nbsp;last&amp;nbsp;packet&amp;nbsp;sent&amp;nbsp;successfully&amp;nbsp;to&amp;nbsp;the&amp;nbsp;server&amp;nbsp;was&amp;nbsp;0&amp;nbsp;milliseconds&amp;nbsp;ago.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;the&amp;nbsp;driver&amp;nbsp;has&amp;nbsp;not&amp;nbsp;received&amp;nbsp;any&amp;nbsp;packets&amp;nbsp;from&amp;nbsp;the&amp;nbsp;server.&amp;nbsp;connection&amp;nbsp;refused:&amp;nbsp;no&amp;nbsp;further&amp;nbsp;infomation&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 외부접속허용을 위해 bind-adress의 아이피를 수정해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql conf파일을 수정해야하며 아래의 명령어로 설정파일을 편집모드로 들어간다.&lt;/p&gt;
&lt;pre id=&quot;code_1727005681451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/mysql/mysql.conf.d/mysqld.cnf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용중에&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-20 164211.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVpby/btsJHnLeAxP/KvrZdhurt169vWOxiQ3cD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVpby/btsJHnLeAxP/KvrZdhurt169vWOxiQ3cD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVpby/btsJHnLeAxP/KvrZdhurt169vWOxiQ3cD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVpby%2FbtsJHnLeAxP%2FKvrZdhurt169vWOxiQ3cD1%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;920&quot; height=&quot;859&quot; data-filename=&quot;스크린샷 2024-09-20 164211.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;859&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;bind-address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 127.0.0.1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;을 &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;0.0.0.0&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 변경&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mysqlx-bind-address 는 주석처리.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[AFTER]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bind-address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 0.0.0.0&lt;/b&gt;&lt;br /&gt;&lt;b&gt;#mysqlx-bind-address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;127.0.0.1&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저장.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ test connection에서 public key 문제 시&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;b&gt;Driver properties탭&amp;nbsp;&lt;/b&gt;에서 설정 &lt;b&gt;TRUE&lt;/b&gt;&amp;nbsp;로&amp;nbsp;변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-02 120704.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9b7j/btsJRpQedma/7sKHMuLjuwB43rr4q6uQc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9b7j/btsJRpQedma/7sKHMuLjuwB43rr4q6uQc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9b7j/btsJRpQedma/7sKHMuLjuwB43rr4q6uQc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9b7j%2FbtsJRpQedma%2F7sKHMuLjuwB43rr4q6uQc1%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;680&quot; height=&quot;572&quot; data-filename=&quot;스크린샷 2024-10-02 120704.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>네이버 클라우드</category>
      <category>connection refused 오류</category>
      <category>mysql 우분투 설치</category>
      <category>네이버 mysql 디비버 오류</category>
      <category>네이버 mysql설치</category>
      <category>네이버 클라우드 mysql설치</category>
      <author>dev.mk</author>
      <guid isPermaLink="true">https://devmg.tistory.com/347</guid>
      <comments>https://devmg.tistory.com/347#entry347comment</comments>
      <pubDate>Sun, 22 Sep 2024 20:51:13 +0900</pubDate>
    </item>
  </channel>
</rss>