<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>낭만 프로그래머</title>
    <link>https://ibluenet.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 27 May 2026 20:06:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>조영래</managingEditor>
    <image>
      <title>낭만 프로그래머</title>
      <url>https://tistory1.daumcdn.net/tistory/1867005/attach/cb28609977944574a03728a4822a1e5f</url>
      <link>https://ibluenet.tistory.com</link>
    </image>
    <item>
      <title>GitLab 백업 / 복구</title>
      <link>https://ibluenet.tistory.com/216</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;* GitLab의 백업 및 복구를 위해서는 GitLab의 설치 버전을 정확히 알아 놓는 것이 중요하다.&lt;/h4&gt;
&lt;pre id=&quot;code_1762491669601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gitlab-rake gitlab:env:info&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;스크린샷 2025-11-07 오후 2.00.12.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tTFoR/dJMcahvXQ84/ZPb1Su5kkGH2RxJIvBQeAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tTFoR/dJMcahvXQ84/ZPb1Su5kkGH2RxJIvBQeAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tTFoR/dJMcahvXQ84/ZPb1Su5kkGH2RxJIvBQeAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtTFoR%2FdJMcahvXQ84%2FZPb1Su5kkGH2RxJIvBQeAk%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;537&quot; height=&quot;394&quot; data-filename=&quot;스크린샷 2025-11-07 오후 2.00.12.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;pre id=&quot;code_1762491834566&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo timedatectl set-timezone Asia/Seoul&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762491849654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[&amp;nbsp; 백업&amp;nbsp; ]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 백업 위치 저장&lt;/h4&gt;
&lt;pre id=&quot;code_1762492002626&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/gitlab/gitlab.rb&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762492471879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#자동 권한 주기 주석 해제
gitlab_rails[manage_backup_path] = true

#저장할 백업위치 수정
gitlab_rails['backup_path'] = &quot;/backups&quot;

..

# 오래된 백업파일을 백업실행시 삭제를 주석 해제
gitlab_rails['backup_keep_time&quot;] = 604800&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;스크린샷 2025-11-07 오후 2.44.09.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4QUtY/dJMcaawQa5h/To73wbm13vycYDxe6jjQc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4QUtY/dJMcaawQa5h/To73wbm13vycYDxe6jjQc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4QUtY/dJMcaawQa5h/To73wbm13vycYDxe6jjQc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4QUtY%2FdJMcaawQa5h%2FTo73wbm13vycYDxe6jjQc0%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;645&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2025-11-07 오후 2.44.09.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;2. 백업&lt;/h4&gt;
&lt;pre id=&quot;code_1762493053861&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gitlab-backup create&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 백업을 스케쥴링 하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762493146107&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo crontab -e&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762493351182&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 내용 추가
# 매일 오전 2시에 백업실행
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 복구 ]&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 백업 파일을 백업 폴더로 이동 및 소유자 변경&lt;/h4&gt;
&lt;pre id=&quot;code_1762493523473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /backups
sudo chown git:git gitlab_backup_20250109.tar&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. GitLab 중지&lt;/h4&gt;
&lt;pre id=&quot;code_1762493587016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 복구&lt;/h4&gt;
&lt;pre id=&quot;code_1762493632339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo sudo gitlab-backup restore BACKUP=gitlab_backup_20250109.tar&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. GitLab 재시작&lt;/h4&gt;
&lt;pre id=&quot;code_1762493702898&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Linux/Common</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/216</guid>
      <comments>https://ibluenet.tistory.com/216#entry216comment</comments>
      <pubDate>Fri, 7 Nov 2025 15:00:14 +0900</pubDate>
    </item>
    <item>
      <title>Nginx에서 index.html 파일만 캐시를 사용하지 않게 만들기</title>
      <link>https://ibluenet.tistory.com/215</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Anuglar 와 같은 SPA 같은 경우 서버에 수정한 부분을 반영했음에도 불구하고 브라우저의 캐시 문제로 인하여 새로운 index.html 파일을 가져오지 못하여 이전 페이지가 계속 나타나는 문제가 발생한다.&lt;br /&gt;이런 경우에는 서버 설정에 index.html 인 경우에는 캐싱을 하지 말고 항상 가져가야 한다는 것을 정의해 놓으면 된다.&lt;br /&gt;참고로 몇가지 이야기 하자면 서버에 설정을 수정하여 반영했다고 해서 100% 브라우저에 바로 적용되지는 않는 것 같다. 그런 경우에는 Clinet PC를 재부팅을 해보던지 브라우저에서 애플리케이션 페이지에 접속한 후 Ctrl+Shift+R 을 눌러서 새로 가져오도록 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* nginx.conf 파일 수정 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1757604552039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

server {
		listen 446 ssl http2;
		server_name 도메인;
		
		root C:/nginx-1.22.1/html;
		index index.html index.htm;
    
		# &quot;/&quot; 로만 접근했을 때 /index.html 로 리다이렉트
		location = / {
			return 301 /index.html;
		}
		
		 # Angular와 같은 SPA를 위한 설정 (중요)
		location / {
			try_files $uri /index.html;
		}

		# index.html에 대한 캐시 비활성화 (가장 구체적인 규칙)
		location = /index.html {
			add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
			add_header Pragma &quot;no-cache&quot; always;
			add_header Expires &quot;0&quot; always;
		}
	
		ssl on;
		ssl_certificate C:/nginx-1.22.1/ssl/도메인.pem;
		ssl_certificate_key C:/nginx-1.22.1/ssl/도메인.key;
		ssl_session_timeout 5m;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:HIGH:MEDIUM:!MD5:!aNULL:!EDH:!RC4:!DSS;
		ssl_prefer_server_ciphers on; 
		ssl_session_cache shared:SSL:10m;
	 
	 
 }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Javascript/Angular</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/215</guid>
      <comments>https://ibluenet.tistory.com/215#entry215comment</comments>
      <pubDate>Fri, 12 Sep 2025 00:40:55 +0900</pubDate>
    </item>
    <item>
      <title>IIS 서버 SSL 인증서 갱신</title>
      <link>https://ibluenet.tistory.com/214</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 인증서 준비 (pfx 파일)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;112&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmtDWu/btsLePfdTkf/eTkRhlguUKNK49ysxWpUkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmtDWu/btsLePfdTkf/eTkRhlguUKNK49ysxWpUkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmtDWu/btsLePfdTkf/eTkRhlguUKNK49ysxWpUkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmtDWu%2FbtsLePfdTkf%2FeTkRhlguUKNK49ysxWpUkk%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;112&quot; height=&quot;111&quot; data-origin-width=&quot;112&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. IIS(인터넷 정보 서비스) 관리자 실행&amp;nbsp; ▶ 서버 선택&amp;nbsp; ▶ 서버 인증서 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OHLhK/btsLfDkRkkq/mJLKbT1ShQakkkYZYelWJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OHLhK/btsLfDkRkkq/mJLKbT1ShQakkkYZYelWJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OHLhK/btsLfDkRkkq/mJLKbT1ShQakkkYZYelWJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHLhK%2FbtsLfDkRkkq%2FmJLKbT1ShQakkkYZYelWJK%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;1003&quot; height=&quot;689&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 갱신 할 서버 인증서 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ &lt;/span&gt;갱신... 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhw709/btsLeLRrh0v/VBdKP45KL1T3xCUKsbrwN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhw709/btsLeLRrh0v/VBdKP45KL1T3xCUKsbrwN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhw709/btsLeLRrh0v/VBdKP45KL1T3xCUKsbrwN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhw709%2FbtsLeLRrh0v%2FVBdKP45KL1T3xCUKsbrwN1%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;1006&quot; height=&quot;649&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;649&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 인증서 파일 가져오기 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶확인 클릭&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1EZ3E/btsLfyqxE2J/yzIDZY0AAXkO51o5mxYsQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1EZ3E/btsLfyqxE2J/yzIDZY0AAXkO51o5mxYsQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1EZ3E/btsLfyqxE2J/yzIDZY0AAXkO51o5mxYsQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1EZ3E%2FbtsLfyqxE2J%2FyzIDZY0AAXkO51o5mxYsQ1%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;355&quot; height=&quot;315&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 사이트 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ 바인딩... 클릭&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/md7JW/btsLfmqai6a/gxpBnUEPP2oKeQ4iFuyczK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/md7JW/btsLfmqai6a/gxpBnUEPP2oKeQ4iFuyczK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/md7JW/btsLfmqai6a/gxpBnUEPP2oKeQ4iFuyczK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmd7JW%2FbtsLfmqai6a%2FgxpBnUEPP2oKeQ4iFuyczK%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;1005&quot; height=&quot;634&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6. https를 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶&lt;/span&gt;&lt;/span&gt; 편집(E)... 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qV8JI/btsLfOzK4v8/khnn5G2lEqyJGtnPLO5CTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qV8JI/btsLfOzK4v8/khnn5G2lEqyJGtnPLO5CTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qV8JI/btsLfOzK4v8/khnn5G2lEqyJGtnPLO5CTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqV8JI%2FbtsLfOzK4v8%2Fkhnn5G2lEqyJGtnPLO5CTk%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;641&quot; height=&quot;374&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;7. 선택 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ15sq%2FbtsLfxypEid%2FG0ldkbwbZ7BBjzOpzUKa0K%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;524&quot; height=&quot;416&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8. 만료일을 확인 한 후 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶확인 클릭&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FNgzG/btsLfNOhWkk/FuRbDnC2JWgpqXwHzx30a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FNgzG/btsLfNOhWkk/FuRbDnC2JWgpqXwHzx30a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FNgzG/btsLfNOhWkk/FuRbDnC2JWgpqXwHzx30a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFNgzG%2FbtsLfNOhWkk%2FFuRbDnC2JWgpqXwHzx30a0%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;731&quot; height=&quot;507&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;9. 확인 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ15sq/btsLfxypEid/G0ldkbwbZ7BBjzOpzUKa0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ15sq%2FbtsLfxypEid%2FG0ldkbwbZ7BBjzOpzUKa0K%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;524&quot; height=&quot;416&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10. 서버 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ 서버 인증서 클릭 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ 만료일을 확인하고 이전 인증서 선택 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ 제거 클릭&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxJRyz/btsLfuVYFR3/IZaBAxfYjHfNPSPzokLs71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxJRyz/btsLfuVYFR3/IZaBAxfYjHfNPSPzokLs71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxJRyz/btsLfuVYFR3/IZaBAxfYjHfNPSPzokLs71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxJRyz%2FbtsLfuVYFR3%2FIZaBAxfYjHfNPSPzokLs71%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;1004&quot; height=&quot;623&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;11. 사이트 클릭 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▶ &lt;/span&gt;&lt;/span&gt;다시 시작 클릭&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9Wqu/btsLfG9E9Mz/Qsjwo6DY1Ab0dvkiaGHlw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9Wqu/btsLfG9E9Mz/Qsjwo6DY1Ab0dvkiaGHlw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9Wqu/btsLfG9E9Mz/Qsjwo6DY1Ab0dvkiaGHlw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9Wqu%2FbtsLfG9E9Mz%2FQsjwo6DY1Ab0dvkiaGHlw0%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;1003&quot; height=&quot;631&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;12. 웹사이트 들어가서 체크&lt;/span&gt;&lt;/h3&gt;</description>
      <category>ETC</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/214</guid>
      <comments>https://ibluenet.tistory.com/214#entry214comment</comments>
      <pubDate>Thu, 12 Dec 2024 11:44:12 +0900</pubDate>
    </item>
    <item>
      <title>MSSQL 특정 컬럼을 가지고 있는 테이블 찾기</title>
      <link>https://ibluenet.tistory.com/213</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL에서 특정 컬럼을 가지고 있는 테이블을 찾아 볼 경우가 종종있다.&lt;/p&gt;
&lt;pre id=&quot;code_1721089451931&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.name AS table_name, C.name AS column_name
  FROM sys.tables AS T
 INNER JOIN sys.columns AS C ON T.object_id = C.object_id
 WHERE C.name = '컬럼이름'&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ETC</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/213</guid>
      <comments>https://ibluenet.tistory.com/213#entry213comment</comments>
      <pubDate>Tue, 16 Jul 2024 09:24:31 +0900</pubDate>
    </item>
    <item>
      <title>Angular에서 브라우저 Cache 문제 해결</title>
      <link>https://ibluenet.tistory.com/211</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Angular로 개발 후 Deploy 하다보면 브러우저 Cache가 남아 있어서 변경된 부분이 적용되지 않는 문제가 발생하였다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;구글링 해서 찾아 보니 빌드시에 몇가지 꼼수를 쓰면 해결 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. package.json 파일 수정&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- {빌더 폴더}에 index.html이 존재하는 폴더 위치를 적는다. 아래 부분을 scripts 안의 아래쪽에 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706757893735&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
    ...
    
    &quot;deploy_dev&quot;: &quot;ng build --configuration=development --aot=true --output-hashing=all --extract-css=true &amp;amp;&amp;amp; npm run add_date&quot;,
    &quot;deploy_prd&quot;: &quot;ng build --configuration=production &amp;amp;&amp;amp; npm run add_date&quot;,
    &quot;add_date&quot;: &quot;npm run add_date_js &amp;amp;&amp;amp; npm run add_date_css &amp;amp;&amp;amp; npm run rm_bak_files&quot;,
    &quot;add_date_js&quot;: &quot;for i in dist/{빌드 폴더}/*; do if [ -f $i ]; then LC_ALL=C sed -i.bak 's:js\&quot;:js?'$(date +%H%M%m%d%y)'\&quot;:g' $i; fi done&quot;,
    &quot;add_date_css&quot;: &quot;sed -i.bak 's:css\&quot;:css?'$(date +%H%M%m%d%y)'\&quot;:g' dist/{빌드 폴더}/index.html&quot;,
    &quot;rm_bak_files&quot;: &quot;find dist/{빌드 폴더} -name '*.bak' -exec rm -Rf {} \\;&quot;
    
  },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 빌드 실행&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 일반적으로 터미널에서 ng build .... 을 실행하였지만 npm 의 script를 실행하여 빌드 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706758036132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run-script dev_prd
또는
npm run-script deploy_prd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 설명&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 이전에 사용하는 방식이었는데 스크립트화 시켜 사용한다. js 와 css 참조하는 문법에 &quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;?현재날짜시간&quot;를 추가하여 브라우저가 새로운 파일로 인식하도록 코드에 자동으로 찾아서 수정해 주는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Javascript/Angular</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/211</guid>
      <comments>https://ibluenet.tistory.com/211#entry211comment</comments>
      <pubDate>Thu, 1 Feb 2024 12:33:10 +0900</pubDate>
    </item>
    <item>
      <title>Swift 기본 문법 정리</title>
      <link>https://ibluenet.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 변수, 상수&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;var : 변수&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;let : 상수&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 접근제한자 : (제약이 많음) open &amp;gt; public &amp;gt; internal &amp;gt; fileprivate &amp;gt; private (제약이 적음)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* static, class : 전역변수로 사용 (static은 오버라이딩이 안됨)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* final : 오버라이딩 불가&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 타입? : null일수 있음&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 변수! : 강제로 null이 아님을 지정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* ( 변수 ?? default ) : nil일 경우 default를 값으로&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. Tuple&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689725852482&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var tuple1 = {&quot;data1&quot;, &quot;data2&quot;}
tuple1.0 //data1
tuple1.1 //data2

var tuple2 = {status: &quot;data1&quot;, title: &quot;data2&quot;}
tuple2.status //data1
tuple2.title //data2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. IF&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689726992384&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if count &amp;lt;= 10 {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4.&amp;nbsp; Switch&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 다른 언어와 달리 break를 해주지 않아도 해당 case만 실행 한 후 빠져나온&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689727126219&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;switch test {
case &quot;a&quot;, &quot;A&quot;:
    print(&quot;A&quot;)
default:
    print(&quot;Not&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. For&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689726778373&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for country in countries 

for (key, value) in keyValues 

for index in 1...20&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6. While&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689726923298&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while count &amp;lt; 10 {
}

repeat {
} while count &amp;lt; 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;7. String&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 변수.description : String 형으로 변환되어 보여줌&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* last()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* dropLast()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* split()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8. Array&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689727751160&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var countryArray = Array&amp;lt;String&amp;gt;()
var countryArray = [String]()

for (index, country) in countryArray.enumerated() {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* append()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* insert()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* sort(), sorted()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;9. Set&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689728107674&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var set1: Set = [1,2,3,4,5,6]
var set2: Set = [1,2,3,4,5,6]

set1.union(set2) //합집합
set1.insertsection(set2) //교집합
set1.symmetricDifference(set2) // 합집합-교집합
set1.subtracting(set2) //여집합&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10. Dictionary&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689728307471&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var isoCountry = [String : String]()
isoCountry[&quot;kor&quot;] = &quot;대한민국&quot;

var isoCountry = [&quot;kor&quot; : &quot;대한민국&quot;, &quot;ukr&quot; : &quot;우크라이나&quot;]
isoCountry.keys

for data in isoCountry {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;11. Function&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689730348395&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func plus(num1: Int, num2: Int) -&amp;gt; Int {
	return num1+num2
}

func plus(num1: Int, num2: Int) -&amp;gt; (Int, String) {
	return (num1+num2, &quot;테스트&quot;)
}

func plus(_ num1: Int, _ num2: Int) -&amp;gt; Int {
	return num1+num2
}

func parentPlus(num1: Int, num2: Int, plusFunc: ((Int, Int) -&amp;gt; Int)) {
	plusFunc(num1, num2)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;12. Closure&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689730764347&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let testClosure = { (a: Int) -&amp;gt; String in
	return &quot;\(a)점&quot;
}

let testCLosure = { (a: Int) -&amp;gt; String in
	&quot;\(a)점&quot;
}

let testCLosure = { (a: Int) in
	&quot;\(a)점&quot;
}

let testCLosure: (Int) -&amp;gt; String  = { a in
	&quot;\(a)점&quot;
}

let testCLosure: (Int) -&amp;gt; String  = { 
	&quot;\($0)점&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;13. enum&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689731160354&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Classification {
    case part
    case drawing
    case document
}

enum Classification {
    case part(title: String, seq: Int)
    case drawing(title: String, seq: Int)
    case document(title: String, seq: Int)
}

func saveClassification(classification Classification) {
	if classification == .part {
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;14. class&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689731431190&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Info {
	init(n: String) {
    }
    
    init(n: String, m: Int) {
    }
    
    convenience init() {
        self.init(&quot;ADS&quot;)
    }
    
    deinit {
    }
}

var infoInstance = Info(&quot;AAAAA&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1689731719697&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Parent {
    func abc() -&amp;gt; String {
    	return &quot;AA&quot;
    }
    
    func ttt() -&amp;gt; String {
    	return &quot;AA&quot;
    }
}

class Child: Parent {
	override func abc() -&amp;gt; String {
    	return super.ttt()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1689731767453&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var name = &quot;&quot; //클래스 생성시 메모리 로딩
lazy var name = &quot;&quot; //호출 시점에 메모리 로딩

var _title = &quot;&quot;
var title: String {
    get{
        return _title
    }
    set{
        _title = newValue
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;15. struct&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* class와 다르게 참조가 아닌 복사로 기능이 이루어 진다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689732449764&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Test {
	var name = &quot;&quot;
    func someFunc() {
    }
}

var test1 = Test()
var test2 = test1 // test2와 test1은 다른 인스턴스임 (복사니까)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;16. extension&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689732710836&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extension Int {
	var oddEven: Int {
    	if self % 2 == 0 {
            return 1
        }
        else {
            return 2
        }
    }
}

4.oddEven&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;17. protocal&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* interface와 유사함. 여러개를 implements 할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689746181862&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocal UserInfo {
    var name: String {get set}
    var age: Int {get set}
    
    func isAult() -&amp;gt; Bool
}

extension UserInfo {
    func isChild() -&amp;gt; Bool {
        return false
    }
}

class My: UserInfo {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;18. generic&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689746601297&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct IntStack&amp;lt;CustomType&amp;gt; {
    var items = [CustomType]()
    
    mutating func push(item: CustomType) {
        items.append(item)
    }
    
    mutating func pop() -&amp;gt; MyType? {
    }
}

var myStack = IntStack&amp;lt;String&amp;gt;()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;19. 고차원 함수&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* map()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* reduce()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* filter()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* compactMap()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* flatMap()&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/210</guid>
      <comments>https://ibluenet.tistory.com/210#entry210comment</comments>
      <pubDate>Wed, 19 Jul 2023 11:13:19 +0900</pubDate>
    </item>
    <item>
      <title>[MSSQL] DB 전체에 특정 문자열 찾기</title>
      <link>https://ibluenet.tistory.com/209</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 프로시저 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689302679244&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE PROCEDURE spSearchOnAlldb @phrase varchar(8000), @OutFullRecords bit=0 AS

declare @sql varchar(8000)
declare @tbl varchar(128)
declare @col varchar(128)
declare @id_present bit

declare @is_char_phrase bit
declare @min_len int
declare @loop_idx int
declare @loop_chr char(1)

set nocount on

if IsNull(@phrase,'')=''
begin
  raiserror('Phrase is absent',16,-1)
  return
end

select @loop_idx=1, @is_char_phrase=0, @min_len=0

while @loop_idx&amp;lt;=LEN(@phrase)
begin
  set @loop_chr=SUBSTRING(@phrase,@loop_idx,1)
  if @loop_chr not in ('%','_') set @min_len=@min_len+1
  if @is_char_phrase=0 and @loop_chr not in ('%','_','0','1','2','3','4','5','6','7','8','9','.') 
       set @is_char_phrase=1
  set @loop_idx=@loop_idx+1
end

create table #tbl_res
                (TableName varchar(128) not NULL,
                 ColumnName varchar(128) not NULL,
                 Id int NULL,
                 ColumnValue varchar(7500) not NULL)

declare CRR cursor local fast_forward for
  select t.name, c.name, 1
  from sysobjects t, syscolumns c
  where t.type='U'
  and c.id=t.id
  and c.status&amp;amp;0x80=0 -- Not IDENTITY
  and exists (select * from syscolumns c2 where t.id=c2.id and c2.status&amp;amp;0x80=0x80 and c2.xtype in (48,52,56))
  and (   (@is_char_phrase=1 and c.xtype in (175,239,99,231,35,167) and c.length&amp;gt;=@min_len) -- char only
       or (@is_char_phrase=0 and c.xtype not in (34,165,173,189,61,58,36))) -- char and numeric
  union select t.name, c.name, 0
  from sysobjects t, syscolumns c
  where t.type='U'
  and c.id=t.id
  and not exists (select * from syscolumns c2 where t.id=c2.id and c2.status&amp;amp;0x80=0x80 and c2.xtype in (48,52,56))
  and (   (@is_char_phrase=1 and c.xtype in (175,239,99,231,35,167) and c.length&amp;gt;=@min_len) -- char only
       or (@is_char_phrase=0 and c.xtype not in (34,165,173,189,61,58,36))) -- char and numeric
  order by 1,2
open CRR
fetch CRR into @tbl, @col, @id_present
while @@FETCH_STATUS=0
begin
  if @OutFullRecords=0
  begin
    set @sql='insert into #tbl_res (TableName,ColumnName,Id,ColumnValue) '
            +'select '+char(39)+@tbl+char(39)+', '
                      +char(39)+@col+char(39)+', '
    if @id_present=1 set @sql=@sql+'IDENTITYCOL, '
                else set @sql=@sql+'NULL, '
    set @sql=@sql+'convert(varchar(7500),'+@col+') '
                 +'from '+@tbl+' (nolock) '
                 +'where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)
  end
  if @OutFullRecords=1
  begin
    set @sql='if exists (select * from '+@tbl+' (nolock) '
                       +'where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)+') '
            +'select '+char(39)+@tbl+char(39)+' TableName, '+char(39)+@col+char(39)+' ColumnName, * '
            +'from '+@tbl+' (nolock) where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)
  end
  exec(@sql)
  fetch CRR into @tbl, @col, @id_present
end
close CRR
deallocate CRR


if @OutFullRecords=0
begin
  -- For the clients supporting new types:
  --exec('select * from #tbl_res order by 1,2,3')

  -- For the clients who are not supporting new types:
  exec('select TableName, ColumnName, Id, convert(varchar(255),ColumnValue) ColumnValue from #tbl_res order by 1,2,3')
end
 
drop table #tbl_res&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689302730160&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exec  spSearchOnAlldb 'Sugar%'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참조]&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://www.sqler.com/board_SQLQA/336483&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.sqler.com/board_SQLQA/336483&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/209</guid>
      <comments>https://ibluenet.tistory.com/209#entry209comment</comments>
      <pubDate>Fri, 14 Jul 2023 11:46:55 +0900</pubDate>
    </item>
    <item>
      <title>Kendo UI Angular 에서 PdfViewer 사용시 에러</title>
      <link>https://ibluenet.tistory.com/207</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[발생 에러]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Error:&amp;nbsp;node_modules/pdfjs-dist/types/src/display/text_layer.d.ts:119:41&amp;nbsp;-&amp;nbsp;error&amp;nbsp;TS2304:&amp;nbsp;Cannot&amp;nbsp;find&amp;nbsp;name&amp;nbsp;'OffscreenCanvasRenderingContext2D'.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[해결 방법]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Step 1.&amp;nbsp; package.json 파일 수정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - devDependencies에 &quot;@types/offscreencanvas&quot;: &quot;2019.7.0&quot; 추가&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;&quot;devDependencies&quot;: {
  &quot;@angular-devkit/build-angular&quot;: &quot;^14.2.9&quot;,
  &quot;@angular/cli&quot;: &quot;~14.2.9&quot;,
  &quot;@angular/compiler-cli&quot;: &quot;^14.2.0&quot;,
  &quot;@types/jasmine&quot;: &quot;~4.0.0&quot;,
  &quot;jasmine-core&quot;: &quot;~4.3.0&quot;,
  &quot;karma&quot;: &quot;~6.4.0&quot;,
  &quot;karma-chrome-launcher&quot;: &quot;~3.1.0&quot;,
  &quot;karma-coverage&quot;: &quot;~2.2.0&quot;,
  &quot;karma-jasmine&quot;: &quot;~5.1.0&quot;,
  &quot;karma-jasmine-html-reporter&quot;: &quot;~2.0.0&quot;,
  &quot;typescript&quot;: &quot;~4.7.2&quot;,
  &quot;@types/offscreencanvas&quot;: &quot;2019.7.0&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Step 2. tsconfig.app.json 파일 수정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - types에 &quot;offscreencanvas&quot; 추가&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  &quot;extends&quot;: &quot;./tsconfig.json&quot;,
  &quot;compilerOptions&quot;: {
    &quot;outDir&quot;: &quot;./out-tsc/app&quot;,
    &quot;types&quot;: [
      &quot;offscreencanvas&quot;
    ]
  },
  &quot;files&quot;: [
    &quot;src/main.ts&quot;,
    &quot;src/polyfills.ts&quot;
  ],
  &quot;include&quot;: [
    &quot;src/**/*.d.ts&quot;
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript/Angular</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/207</guid>
      <comments>https://ibluenet.tistory.com/207#entry207comment</comments>
      <pubDate>Tue, 13 Jun 2023 10:37:08 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 22.04에 MariaDB 10.11 설치</title>
      <link>https://ibluenet.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 패키지 업데이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686186598788&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 upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. MariaDB 특정 버전을 설치하기 위한 사전 작업&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; a. 실행&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686187433386&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install apt-transport-https curl
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; b. /etc/apt/sources.list 파일 마지막에 아래 내용을 붙여 넣음&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686192980398&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deb https://mirrors.xtom.jp/mariadb/repo/10.11/ubuntu jammy main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 업데이트 후에 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686193095774&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
sudo apt install mariadb-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 기본적인&amp;nbsp;보안&amp;nbsp;설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686193129778&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mysql_secure_installation&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1686193178085&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 사용자 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686194475898&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create user 'user명'@'%' identified by '패스워드';
create user 'user명'@'localhost' identified by '패스워드';
flush privileges;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;6. DB 생성&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686194517015&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create database DB명;
grant all privileges on DB명.* to 'user명'@'%';
grant all privileges on DB명.* to 'user명'@'localhost';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조 : &lt;a href=&quot;https://dongle94.github.io/ubuntu/ubuntu-mariadb-install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dongle94.github.io/ubuntu/ubuntu-mariadb-install/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Ubuntu</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/206</guid>
      <comments>https://ibluenet.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 8 Jun 2023 12:06:52 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 22.04 + Nginx 에 SSL 인증서 설치</title>
      <link>https://ibluenet.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. SSL 인증서 준비&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 도메인 인증서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 체인 인증서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 루트 인증서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 개인키 파일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 인증서 합치기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685680801443&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat 도메인인증서 체인인증서 루트인증서 &amp;gt; 도메인명.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;합쳐진 파일을 열어보면 -----END CERTIFICATE----------BEGIN CERTIFICATE----- 와 같이 붙어 있을 수 있다. 다른 줄로 수정해야 함&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X8OLv/btsiqVthdo5/mt5zEUSrARzwKhQsYh41Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X8OLv/btsiqVthdo5/mt5zEUSrARzwKhQsYh41Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X8OLv/btsiqVthdo5/mt5zEUSrARzwKhQsYh41Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX8OLv%2FbtsiqVthdo5%2Fmt5zEUSrARzwKhQsYh41Xk%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;532&quot; height=&quot;187&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnGrM/btsirKrO8XG/DYF2BFdXP8lXEOKWVafYuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnGrM/btsirKrO8XG/DYF2BFdXP8lXEOKWVafYuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnGrM/btsirKrO8XG/DYF2BFdXP8lXEOKWVafYuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnGrM%2FbtsirKrO8XG%2FDYF2BFdXP8lXEOKWVafYuK%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;547&quot; height=&quot;129&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 설정 파일 수정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685682612728&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/nginx/site-available/default&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685684817904&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server {
	listen 80 default_server;
	server_name 도메인;
	return 301 https://$host$request_uri;
}

server {
	listen 443 ssl default_server;
	server_name 도메인;
	
	ssl_certificate /etc/nginx/ssl/병합한 인증서.pem;
	ssl_certificate_key /etc/nginx/ssl/키파일.key;

	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;

	location / {
		try_files $uri $uri/ =404;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. Nginx 재시작&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685684895086&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 참고로 crt에서 pem로 변환은 확장명을 pem으로 다른이름으로 저장하면 된다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux/Ubuntu</category>
      <author>조영래</author>
      <guid isPermaLink="true">https://ibluenet.tistory.com/205</guid>
      <comments>https://ibluenet.tistory.com/205#entry205comment</comments>
      <pubDate>Fri, 2 Jun 2023 14:52:22 +0900</pubDate>
    </item>
  </channel>
</rss>