<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>우디의 개발스터디</title>
    <link>https://coding-plant.tistory.com/</link>
    <description>깃허브 블로그 주소
https://yuuisang.github.io/</description>
    <language>ko</language>
    <pubDate>Sun, 7 Jun 2026 16:28:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발자 우디</managingEditor>
    <image>
      <title>우디의 개발스터디</title>
      <url>https://tistory1.daumcdn.net/tistory/5081905/attach/d2c1767301f34e37ae81a9d7fa0daffa</url>
      <link>https://coding-plant.tistory.com</link>
    </image>
    <item>
      <title>리눅스 AWS 서버 실무 배포 및 운영 관리 정리(putty, filezilla)</title>
      <link>https://coding-plant.tistory.com/161</link>
      <description>&lt;div class=&quot;rgyPostIt&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 서버 배포 및 운영 방법 정리 &lt;br /&gt;2022.11.08 최신화 &lt;br /&gt;내가보려고 저장 &lt;br /&gt;url 들은 그냥 삼성으로 예시&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;END POINT 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CMD에 아래 줄 입력해서 확인! telnet 뒤는 주소, 맨 뒤 숫자는 포트번호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;telnet engageimportapi.samsung.com 443&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CMD 에서 확인하면 로컬에서 날리는 확인이고, 서버에서 API 보내려고 확인하는거면 동일한 방법으로 Putty 에서 입력해서 확인할 것.&lt;/li&gt;
&lt;li&gt;포트번호는 http 는 80, https 는 443 으로 규약&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;IDE&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IDE 내에서 프로젝트 우클릭 EXPORT 해서 WAR 파일확장자로 선택 후 추출&lt;/li&gt;
&lt;li&gt;로컬 디렉토리에 원하는 특정 위치에 deploy 폴더 생성하고 그 안에 해당 일자 폴더 만들고(ex.20220511) 그 안에 AP, API 디렉토리 2개 생성 후 그 중 작업할 디렉토리 안에 ROOT.war 로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리눅스 서버 배포 팁&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ROOT.war 파일의 기존과 변경파일 용량과 시간을 꼭 잘 확인할 것!&lt;/li&gt;
&lt;li&gt;기존 tomcat 종료 시 pid 값이 일치하지 않으면 &lt;br /&gt;-&amp;nbsp;vi&amp;nbsp;tomcat.pid&amp;nbsp;열어서&amp;nbsp;현재&amp;nbsp;돌아가는&amp;nbsp;것과&amp;nbsp;일치하게&amp;nbsp;변경&amp;nbsp;후&amp;nbsp;[i]&amp;nbsp;-&amp;gt;&amp;nbsp;ESC&amp;nbsp;-&amp;gt;&amp;nbsp;:wq&amp;nbsp; &lt;br /&gt;- 위 과정 완료 후 ./shutdown.sh 로 종료&lt;/li&gt;
&lt;li&gt;서버 재시작은 ./startup.sh&lt;/li&gt;
&lt;li&gt;프론트 파일들은 서버 재시작 필요 없음&lt;/li&gt;
&lt;li&gt;위 과정 후 꼭 제대로 돌아가는지 로그로 보면서 확인할 것.&lt;/li&gt;
&lt;li&gt;기존 서버에 ROOT.war 파일은 확장자명을 바꿔서 백업해둘것. 예시) ROOT.war.bk0831 --&amp;gt; 이런식으로 변경해서 두고 새로 바뀐 war파일을 추가하면 됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Putty&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ps -ef | grep tomcat : 톰캣 가용 서버 확인&lt;/li&gt;
&lt;li&gt;예시: /data/log-backup/samsung/webapp/logs : log4j 로그 저장 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;진행 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;putty 터미널을 2개 킨다(하나는 로그확인용, 하나는 명령어 실행용)&lt;/li&gt;
&lt;li&gt;일반계정(centos)으로 로그인 한 후 su 입력해서 root 계정으로 전환&lt;/li&gt;
&lt;li&gt;현재 돌아가는 톰캣서버들을 확인하려면 ps -ef | grep tomcat 입력해서 173, 174 둘 다 확인&lt;/li&gt;
&lt;li&gt;현재 위치 / 루트로 이동(cd /) 후 로그 디렉토리로 이동 --&amp;gt; 예시) cd svc/samsung-api/engine/apache-tomcat-9.0.7/logs&lt;/li&gt;
&lt;li&gt;putty 창 2개 중 하나는 프로젝트 cd svc/engine/apache-tomcat-X.X.X/logs로 들어가 tail -f catalina.out 다음 명령어를 입력해서 로그를 살펴본다&lt;/li&gt;
&lt;li&gt;윗 줄이 동작하지 않을 시 --&amp;gt; cd data/log-backup/samsung-api/webapp/logs/debug 들어가서 tail -f debug.log 입력해서 로그 확인.&lt;/li&gt;
&lt;li&gt;putty 창 2개 중 다른 하나는 프로젝트경로/webapp으로 들어가 ps -ef | grep&amp;nbsp;&amp;nbsp;이나&amp;nbsp;&amp;nbsp;tomcat | grep [프로젝트명] 을 입력해 현재, 서버가 돌고 있는지 확인한다. (비즈메세지 센터에서 모니터링으로 확인도 같이)&lt;/li&gt;
&lt;li&gt;로그 확인 후 안돌아가고있으면 톰캣경로/bin 디렉토리 내에 ./shutdown.sh 해주고 [FileZilla]에서 ROOT.war 최신으로 교체하고 다시 putty에서 ./startup.sh 배치파일 실행해서 톰캣서버 재시작.&lt;/li&gt;
&lt;li&gt;경로예시) cd /svc/samsung-api/engine/apache-tomcat-9.0.7/bin
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;./shutdown.sh &amp;lt;&amp;lt; ./ 필수 (톰캣이 아닌 리눅스 자체를 종료해버릴수 있음 주의!!!!!)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;vi 명령어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vi + 파일명&lt;/li&gt;
&lt;li&gt;vi 내에서 [i] 입력모드&lt;/li&gt;
&lt;li&gt;vi 내에서 :q 는 탈출, :wq 는 저장후 탈출&lt;/li&gt;
&lt;li&gt;vi 내에서 /찾고싶은문자열 + n(ctrl+F 와 동일)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FileZilla&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 접속 시 SFTP - SSH 로 선택해서 들어가야함 일반 계정으로(셀렉박스 2번째에 위치)&lt;/li&gt;
&lt;li&gt;호스트: 예시)10.101.83.174&lt;/li&gt;
&lt;li&gt;사용자명 : 예시)admin1&lt;/li&gt;
&lt;li&gt;비밀번호: 예시)root1&lt;/li&gt;
&lt;li&gt;포트: 2022&amp;nbsp;&amp;nbsp;&amp;nbsp;==&amp;gt; 정보 입력 후 연결&lt;/li&gt;
&lt;li&gt;리모트 서버 경로 webapp 까지 이동(WEB 일때)&lt;/li&gt;
&lt;li&gt;API 는 경로 /svc/samsung-api/webapp 에 있음&lt;/li&gt;
&lt;li&gt;리모트 서버에 있는 ROOT.war 파일 로컬에 ORG 폴더에 백업(혹시모를 에러대비)&lt;/li&gt;
&lt;li&gt;백업이 완료 되었으면 수정 적용된 버전을 FTP 를 통해 서버에 반영&lt;/li&gt;
&lt;li&gt;ROOT.war 파일 디패키징 경로 예시 ==&amp;gt; /svc/samsung/engine/apache-tomcat-9.0.7/webapps&lt;/li&gt;
&lt;li&gt;FTP 21 번 포트는 보안 관련사항으로 막아져 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리눅스 명령어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pwd : 현재 위치&lt;/li&gt;
&lt;li&gt;cd : 이동&lt;/li&gt;
&lt;li&gt;ls : 현재 디렉토리 파일 확인&lt;/li&gt;
&lt;li&gt;ls -al : 리스트로&lt;/li&gt;
&lt;li&gt;ls -alrt : 정렬까지&lt;/li&gt;
&lt;li&gt;su : root 계정으로 전환&lt;/li&gt;
&lt;li&gt;ps -ef|grep tomcat: 톰캣 실행중인것 확인&lt;/li&gt;
&lt;li&gt;vi : 텍스트파일 열기&lt;/li&gt;
&lt;li&gt;i : 입력모드&lt;/li&gt;
&lt;li&gt;dd : 한 줄 삭제&lt;/li&gt;
&lt;li&gt;:q : 텍스트파일 나가기&lt;/li&gt;
&lt;li&gt;:q! : 저장하지않고 나가기&lt;/li&gt;
&lt;li&gt;:wq : 저장하고 나가기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;hosts&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 서버 확인하기 전에 먼저 조회하는 ip 설정해두는 파일, 리눅스에도 존재함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C:\Windows\System32\drivers\etc\hosts 파일 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TIP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;timeout 에러는 connection time out 과 read time out 이 있는데, 전자는 연결까지 허용할 수 있는 시간을 초과한 것이고 후자는 연결된 후 작업이 마무리 되는 데 까지 걸리는 허용 시간을 초과한 것이다.&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <category>AWS</category>
      <category>Linux</category>
      <category>리눅스</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/161</guid>
      <comments>https://coding-plant.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 8 Nov 2022 10:33:14 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 만나이 계산</title>
      <link>https://coding-plant.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;업무 중 중계서버에서 주민등록번호를 넘겨 받아 스크립트에서 만나이를 조건으로 분기해야하는 작업이 있었다. 함수로 간단하게 구현해봤는데 테스트 결과 문제없이 잘 동작하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실제로는&amp;nbsp;아래&amp;nbsp;코드에&amp;nbsp;분기&amp;nbsp;조건까지&amp;nbsp;들어갔었지만&amp;nbsp;어차피&amp;nbsp;만나이를&amp;nbsp;계산하는&amp;nbsp;과정이&amp;nbsp;중요한거니까&amp;nbsp;해당&amp;nbsp;조건&amp;nbsp;분기&amp;nbsp;부분은&amp;nbsp;지우고&amp;nbsp;&lt;u&gt;만나이를&amp;nbsp;계산해서&amp;nbsp;리턴&lt;/u&gt;하는&amp;nbsp;부분까지의&amp;nbsp;코드만&amp;nbsp;포스팅&amp;nbsp;하려고&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;필요한&amp;nbsp;사람이&amp;nbsp;있다면&amp;nbsp;참고하면&amp;nbsp;좋을&amp;nbsp;것&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665122595866&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 파라미터로 주민등록번호 받아서 만나이 계산
function fn_checkBirthAge(jumin){
	
	// 전달받은 주민번호 데이터에 '-' 확인 후 있으면 제거
	if(jumin.includes('-')){
		jumin = jumin.replace('-','');
	}
	
	// 전달받은 주민번호 데이터 자체에 문제가 있는 경우
	if(jumin.includes('-') == false &amp;amp;&amp;amp; jumin.length != 13){
		console.log(&quot;==================ERROR:주민등록번호 데이터 확인 필요&quot;);
		return false;
	}
	
	let today = new Date();	// 현재 날짜 및 시간

	let juminFront = jumin.substr(0,6); // 주민번호앞자리
	let juminBackFirstVal = jumin.substr(6,1); //주민번호뒷자리 첫 문자열(2000년도 이전생인지 확인)

	let age = 0;
	let birthDate = null;
	let juminYear = null;
	let juminMonth = jumin.substr(2,2);//10
	let juminDate = jumin.substr(4,2);//03
	
	let monthCheck = 0;

	if(juminBackFirstVal == 1 || juminBackFirstVal == 2){
		// 2000년생 이전일 경우
		juminYear = &quot;19&quot; + jumin.substr(0,2);//93~~

		// 문법상 Month(월)은 0부터 시작하기 때문에 -1 처리해야 됨.
		birthDate = new Date(juminYear*1, juminMonth-1, juminDate*1);
		
		// 현재 연도에서 - 태어난 연도
		age = today.getFullYear() - birthDate.getFullYear();

		// 현재 월에서 - 태어난 월
		monthCheck = today.getMonth() - birthDate.getMonth();

		// 생일 월이 현재 월을 지나지 않았을 경우 만 나이기 때문에 -1
		if(monthCheck &amp;lt; 0 || (monthCheck === 0 &amp;amp;&amp;amp; today.getDate() &amp;lt; birthDate.getDate())){
			age--;
		}
	}else{
		// 2000년생 이후
		juminYear = &quot;20&quot; + jumin.substr(0,2);//01~~
		
		birthDate = new Date(juminYear*1, juminMonth-1, juminDate*1);
		
		age = today.getFullYear() - birthDate.getFullYear();

		monthCheck = today.getMonth() - birthDate.getMonth();

		if(monthCheck &amp;lt; 0 || (monthCheck === 0 &amp;amp;&amp;amp; today.getDate() &amp;lt; birthDate.getDate())){
			age--;
		}
	}

	console.log(&quot;=====================만 나이: &quot;,age + &quot;세&quot;);
		
	return age;
}


//TEST CASE 1
// fn_checkBirthAge('010509-3012345'); //00년생 이후 테스트

//TEST CASE 2
fn_checkBirthAge('9310031234567'); //00년생 이전 테스트
// fn_checkBirthAge('920216-1234567'); //00년생 이전 테스트&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발/프론트엔드</category>
      <category>만나이계산</category>
      <category>자바스크립트</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/159</guid>
      <comments>https://coding-plant.tistory.com/159#entry159comment</comments>
      <pubDate>Fri, 7 Oct 2022 15:03:31 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] localhost 와 127.0.0.1</title>
      <link>https://coding-plant.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발 업무를 하다 보면 자연스럽게 주소창에 localhost:8080이나 127.0.0.1:8080을 입력해 로컬 환경에서 테스트를 해보고는 한다. 거의 매일같이 사용하는데 막상 정확한 원리를 모르는 것 같아서 찾아봤다.&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;/b&gt; 이라는 것부터 설명하자면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;자신의 로컬 PC를 스스로 서버로 만들고 그 로컬 PC 내에서 요청을 보내고 응답을 받을 수 있는 것이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 내 PC 환경만으로 별도의 외부서버와 통신하는 것처럼 요청과 응답을 주고받을 수 있다는 뜻이다. 운영체제는 이런 루프백을 위해 고정된 아이피와 호스트네임을 제공하는데 그것이 바로 &lt;b&gt;127.0.0.1&lt;/b&gt;과 &lt;b&gt;localhost&lt;/b&gt;이다. 그렇기 때문에 127.0.0.1은 인터넷상에 일반 IP로 쓸 수 없게 지정되어 있다. OS에 귀속되는 가상의 주소라고 생각하면 될 것 같다.&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;그렇다면 localhost:8080 과 127.0.0.1:8080은 어떤 차이가 있을까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localhost:8080 은 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 이라고 치면&lt;/li&gt;
&lt;li&gt;127.0.0.1:8080 은 142.250.76.132(구글의 응답 ip주소)라고 생각하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCqDmJ/btrME24t7Mn/rKSxVFCUf9GR4kK4MPgomk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCqDmJ/btrME24t7Mn/rKSxVFCUf9GR4kK4MPgomk/img.png&quot; data-alt=&quot;구글의 ip주소 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCqDmJ/btrME24t7Mn/rKSxVFCUf9GR4kK4MPgomk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCqDmJ%2FbtrME24t7Mn%2FrKSxVFCUf9GR4kK4MPgomk%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;800&quot; height=&quot;475&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구글의 ip주소 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 웹 브라우저에 입력하는 사이트 url은 DNS(domain name server) 을 통해 ip 주소로 변환되게 되고, 이를 통해 요청과 응답을 주고받는 연결이 가능해진다. 참고로 루프백은 내 로컬 PC가 내 로컬 PC에 요청과 응답을 주고받는 기능이기 때문에, DNS 서버를 통해 ip주소로 변환할 수가 없다.&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;따라서 OS가 해당 부분을 조정해줘야 하는데, 그것을 담당하는 부분이 OS hosts 파일의 &lt;b&gt;redirect rules&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;해당 hosts 파일이 존재하는 윈도우 파일 경로&lt;/h4&gt;
&lt;pre id=&quot;code_1663720210909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C\Windows\System32\drivers\etc\hosts&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;여기에서 localhost 를 특정 ip로 redirecting 시킬 것인지 지정할 수 있는데, 만약 이 부분에서 localhost의 redirecting ip를 다르게 지정해 놓았다면 localhost:8080을 주소창에 입력하더라도 로컬 서버로 접근이 불가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5HcTr/btrMEhuaoKj/cdnhuE4iB0aM4Oczpm5HQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5HcTr/btrMEhuaoKj/cdnhuE4iB0aM4Oczpm5HQk/img.png&quot; data-alt=&quot;내 PC의 hosts 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5HcTr/btrMEhuaoKj/cdnhuE4iB0aM4Oczpm5HQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5HcTr%2FbtrMEhuaoKj%2FcdnhuE4iB0aM4Oczpm5HQk%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;616&quot; height=&quot;342&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내 PC의 hosts 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 보이는대로 localhost의 ip주소가 지정이 되어있다. 위는 ip.v4 아래는 ip.v6 환경에서 redirecting 되는 내용이다.&lt;br /&gt;참고로 해당 파일에 특정 사이트의 도메인과 ip 주소의 redirecting rules를 지정해두면 DNS 서버를 거치지 않고 도메인 네임만으로도 접속이 가능하게 할 수 있다.&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;</description>
      <category>개발/서버 및 네트워크</category>
      <category>127.0.0.1</category>
      <category>dns</category>
      <category>hosts</category>
      <category>localhost</category>
      <category>네트워크</category>
      <category>도메인</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/158</guid>
      <comments>https://coding-plant.tistory.com/158#entry158comment</comments>
      <pubDate>Wed, 21 Sep 2022 09:37:06 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 서버 인증 방식 - 쿠키/세션, 토큰</title>
      <link>https://coding-plant.tistory.com/157</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/38Q0d/btrMA3W5TGx/CiHoEqoVKthTFL4EXFPA4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/38Q0d/btrMA3W5TGx/CiHoEqoVKthTFL4EXFPA4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/38Q0d/btrMA3W5TGx/CiHoEqoVKthTFL4EXFPA4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F38Q0d%2FbtrMA3W5TGx%2FCiHoEqoVKthTFL4EXFPA4K%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;1280&quot; height=&quot;517&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;517&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;HTTP는 &lt;u&gt;비연결성 및 무상태성&lt;/u&gt;이라는 특징을 가지고 있다. 따라서 클라이언트의 요청을 처리한 뒤 연결을 끊어버리기 때문에, 클라이언트의 상태 정보 및 현재 통신 상태가 남아있지 않는다.&lt;br /&gt;&lt;br /&gt;그렇다면 왜 HTTP는 비연결성이라는 특성을 가지고 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 비연결성의 &lt;b&gt;장점&lt;/b&gt;은 서버의 &lt;u&gt;자원 낭비를 줄일 수 있다&lt;/u&gt;는 점이다. 예를 들어 만약 다수의 클라이언트가 서버와의 연결을 유지한다면 서버의 자원 낭비가 심해지고 성능의 저하를 야기할 수 있기 때문이다.&lt;br /&gt;&lt;br /&gt;허나&amp;nbsp;비연결성은&amp;nbsp;클라이언트를&amp;nbsp;식별할&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;&lt;b&gt;단점&lt;/b&gt; 또한 존재한다. 로그인을 하더라도 다음번 요청에서 해당 클라이언트를 식별할 수 있는 무언가가 없기 때문에, 계속 로그인을 해야 할 것이다. 참고로 이렇게되면 웹 브라우저(Ex.크롬)에서 새로고침을 누를 때마다 로그인을 해야한다.&lt;br /&gt;&lt;br /&gt;이런 장점과 단점들을 보완하기 위해 &lt;b&gt;Cookie&lt;/b&gt;와 &lt;b&gt;Session &lt;/b&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;h2 data-ke-size=&quot;size26&quot;&gt;쿠키 (Cookie)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키(Cookie)란 클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용되고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 파일을 일컫는다. 간단히 말해 서버와 클라이언트가 대화하기 위한 수단이다.&lt;br /&gt;&lt;br /&gt;서버는 클라이언트의 로그인 요청에 대한 응답을 작성할 때, 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담는다(쿠키는 Key-Value형식의 문자열이다.) 이후 해당 클라이언트는 요청을 보낼 때마다 매번 저장된 쿠키를 요청 헤더의 Cookie에 담아 보낸다. 서버는 쿠키에 담긴 정보를 바탕으로 해당 요청의 클라이언트가 누군지 식별할 수 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저가 서버와 연결이 되었을 때 브라우저에서 자동적으로 쿠키를 생성하고, response 할 때 쿠키를 담아서 보낸다.&lt;/li&gt;
&lt;li&gt;특정 호스트에서 생성된 쿠키는 이후 모든 요청마다 서버로 전송된다.&lt;/li&gt;
&lt;li&gt;요청 해더의 set-cookie 속성에 정보를 담을 수 있다.&lt;/li&gt;
&lt;li&gt;쿠키에 담긴 데이터는 브라우저에서 관리된다.&lt;/li&gt;
&lt;li&gt;이름, 값, 만료 날짜, 경로 정보로 구성된다.&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안에 취약하다. (요청 시 쿠키의 값을 그대로 보내어, 유출 및 조작당할 위험이 존재한다.)&lt;/li&gt;
&lt;li&gt;용량 제한이 있어, 많은 정보를 담을 수 없다.&lt;/li&gt;
&lt;li&gt;웹 브라우저마다 쿠키에 대한 지원 형태가 다르기에, 브라우저 간 공유가 불가능하다.&lt;/li&gt;
&lt;li&gt;쿠키의&amp;nbsp;사이즈가&amp;nbsp;커질수록&amp;nbsp;네트워크에&amp;nbsp;부하가&amp;nbsp;심해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 (Session)&lt;/h2&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CQ1Bu/btrMxUs6nvi/j9twKWdiZjqKyaGzNVmvcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CQ1Bu/btrMxUs6nvi/j9twKWdiZjqKyaGzNVmvcK/img.png&quot; data-alt=&quot;동작 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CQ1Bu/btrMxUs6nvi/j9twKWdiZjqKyaGzNVmvcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCQ1Bu%2FbtrMxUs6nvi%2Fj9twKWdiZjqKyaGzNVmvcK%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;970&quot; height=&quot;512&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동작 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세션이란&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은&amp;nbsp;비밀번호&amp;nbsp;등&amp;nbsp;클라이언트의&amp;nbsp;인증&amp;nbsp;정보를&amp;nbsp;쿠키가&amp;nbsp;아닌&amp;nbsp;&lt;u&gt;서버&amp;nbsp;측에&amp;nbsp;저장&lt;/u&gt;하고&amp;nbsp;관리한다.&lt;br /&gt;&lt;br /&gt;서버는&amp;nbsp;클라이언트의&amp;nbsp;로그인&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;응답을&amp;nbsp;작성할&amp;nbsp;때,&amp;nbsp;인증&amp;nbsp;정보는&amp;nbsp;서버에&amp;nbsp;저장하고,&amp;nbsp;클라이언트&amp;nbsp;식별자인&amp;nbsp;&lt;b&gt;JSESSIONID&lt;/b&gt;를&amp;nbsp;쿠키에&amp;nbsp;담는다.&amp;nbsp;이후&amp;nbsp;클라이언트는&amp;nbsp;요청을&amp;nbsp;보낼&amp;nbsp;때마다&amp;nbsp;JSESSIONID쿠키를&amp;nbsp;함께&amp;nbsp;보낸다.&amp;nbsp;그리하면&amp;nbsp;서버는&amp;nbsp;JSESSIONID의&amp;nbsp;유효성을&amp;nbsp;판별해&amp;nbsp;클라이언트를&amp;nbsp;식별한다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자가 로그인 요청한다.&lt;/li&gt;
&lt;li&gt;서버에서 계정 정보를 읽어 사용자를 확인 하고, 사용자의 고유한 ID를 부여하여 세션 저장소에 저장한 후, 이와 연결된 세션ID를 발급한다.&lt;/li&gt;
&lt;li&gt;사용자는 서버에서 해당 세션ID를 받아 쿠키에 저장 한 후, 인증이 필요한 요청마다 쿠키를 헤더에 실어 보낸다.&lt;/li&gt;
&lt;li&gt;서버는 쿠키를 받아 세션 저장소에서 대조 후 대응되는 정보를 가져온다.&lt;/li&gt;
&lt;li&gt;인증이&amp;nbsp;완료&amp;nbsp;되고&amp;nbsp;서버는&amp;nbsp;사용자에&amp;nbsp;맞는&amp;nbsp;데이터를&amp;nbsp;보내준다.&lt;/li&gt;
&lt;/ol&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 서버와 통신을 시작하면 서버는 해당 클라이언트에 대해 유일한 고유값인 세션 ID를 부여, 세션 스토리지에 해당 세션 ID 정보를 저장한다.&lt;/li&gt;
&lt;li&gt;클라이언트는 이 세션ID를 쿠키를 통해 기억한다.&lt;/li&gt;
&lt;li&gt;클라이언트가 추가로 어떤 요청을 보낼 때마다 헤더의 cookie에 세션 ID를 담아서 전송함.(식별을 위해)&lt;/li&gt;
&lt;li&gt;서버는 클라이언트가 보낸 요청의 쿠키에 담긴 세션ID와 세션 스토리지에 담긴 세션ID를 대조해 인증 상태를 판단함(즉, 세션과 쿠키는 완전히 분리된 개념이 아니며 세션은 쿠키를 기반으로 함)&lt;/li&gt;
&lt;li&gt;각 클라이언트마다 유니크한 세션 객체가 주어지고, 이 세션 객체에 데이터를 담아 관리할 수 도 있음(세션 객체가 자물쇠로 잠긴 상자라면 세션ID가 열쇠)&lt;/li&gt;
&lt;li&gt;세션을&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;쿠키만으로&amp;nbsp;어떤&amp;nbsp;데이터를&amp;nbsp;주고받는다면,&amp;nbsp;클라이언트는&amp;nbsp;이미&amp;nbsp;모든&amp;nbsp;데이터를&amp;nbsp;알고&amp;nbsp;있다는&amp;nbsp;것.&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버가 클라이언트의 웹 브라우저에 의존하지 않아도 된다.&lt;/li&gt;
&lt;li&gt;쿠키를 포함한 요청이 외부에 노출되어도 세션 ID 자체는 유의미한 개인 정보를 담지 않는다.&lt;/li&gt;
&lt;li&gt;각 사용자마다 고유한 세션 ID가 발급되기 때문에, 요청이 들어올 때마다 회원 정보를 확인(로그인)할 필요 없다.&lt;/li&gt;
&lt;/ul&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;해커가 세션 ID를 중간에 탈취하여 클라이언트인 척 위장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서&amp;nbsp;세션&amp;nbsp;저장소를&amp;nbsp;사용하기&amp;nbsp;때문에,&amp;nbsp;요청이&amp;nbsp;많아지면&amp;nbsp;서버에&amp;nbsp;부하가&amp;nbsp;생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;토큰 (Token)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 세션/쿠키와 함께 가장 대표적인 인증 수단이다. JWT(JSON Web Token)의 약자로 인증에 필요한 정보들을 암호화시킨 토큰을 뜻한다. 세션/쿠키&amp;nbsp;방법과&amp;nbsp;유사하게&amp;nbsp;사용자는&amp;nbsp;Access&amp;nbsp;Token(JWT토큰)을&amp;nbsp;HTTP헤더에&amp;nbsp;실어&amp;nbsp;서버로&amp;nbsp;보낸다.&lt;/p&gt;
&lt;pre id=&quot;code_1663649354467&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JWT(JSON Web Token)는 인증에 필요한 정보들을 암호화시킨 토큰이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blgRWf/btrMDpEXlor/32xa4Mc2vOwT7uejqjPqQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blgRWf/btrMDpEXlor/32xa4Mc2vOwT7uejqjPqQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blgRWf/btrMDpEXlor/32xa4Mc2vOwT7uejqjPqQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblgRWf%2FbtrMDpEXlor%2F32xa4Mc2vOwT7uejqjPqQ1%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;648&quot; height=&quot;174&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;JWT의&amp;nbsp;구조는&amp;nbsp;위&amp;nbsp;사진과&amp;nbsp;같이&amp;nbsp;세가지&amp;nbsp;문자열의&amp;nbsp;조합이다.&amp;nbsp;실제&amp;nbsp;디코딩된&amp;nbsp;JWT는&amp;nbsp;&lt;b&gt;Header&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Payload&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Signature&lt;/b&gt;로&amp;nbsp;이루어져&amp;nbsp;있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Header : 위 3가지 정보를 암호화할 방식(alg), 타입(type) 등&lt;/li&gt;
&lt;li&gt;Payload : 서버에서 보낼 데이터. 일반적으로 유저의 고유 ID값, 유효기간&lt;/li&gt;
&lt;li&gt;Verify&amp;nbsp;Signature&amp;nbsp;:&amp;nbsp;Base64&amp;nbsp;방식으로&amp;nbsp;인코딩한&amp;nbsp;Header,payload&amp;nbsp;그리고&amp;nbsp;SECRET&amp;nbsp;KEY를&amp;nbsp;더한&amp;nbsp;후&amp;nbsp;서명&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJFABu/btrMy1ZCTo1/S0pwtNuLFN48X5nF8sFo0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJFABu/btrMy1ZCTo1/S0pwtNuLFN48X5nF8sFo0K/img.png&quot; data-alt=&quot;토큰 액세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJFABu/btrMy1ZCTo1/S0pwtNuLFN48X5nF8sFo0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJFABu%2FbtrMy1ZCTo1%2FS0pwtNuLFN48X5nF8sFo0K%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;980&quot; height=&quot;564&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 액세스&lt;/figcaption&gt;
&lt;/figure&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트 로그인 요청이 들어오면, 서버는 검증 후 클라이언트 고유 ID등의 정보를 Payload에 담는다.&lt;/li&gt;
&lt;li&gt;암호화할 비밀키를 사용해 Access Token(JWT)을 발급한다.&lt;/li&gt;
&lt;li&gt;클라이언트는 전달받은 토큰을 저장해두고, 서버에 요청할 때마다 토큰을 요청 헤더 Authorization에 포함시켜 함께 전달한다.&lt;/li&gt;
&lt;li&gt;서버는 토큰의 Signature 을 비밀키로 복호화한 다음, 위변조 여부 및 유효 기간 등을 확인한다.&lt;/li&gt;
&lt;li&gt;유효한 토큰이라면 요청에 응답한다.&lt;/li&gt;
&lt;/ol&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.&lt;/li&gt;
&lt;li&gt;인증 정보에 대한 별도의 저장소가 필요 없다. (I/O 처리 필요 없음)&lt;/li&gt;
&lt;li&gt;JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됐음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.&lt;/li&gt;
&lt;li&gt;클라이언트의 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(Stateless)가 된다.&lt;/li&gt;
&lt;li&gt;확장성이 우수하다.&lt;/li&gt;
&lt;li&gt;토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. (토큰 서버 활용)&lt;/li&gt;
&lt;li&gt;토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.&lt;/li&gt;
&lt;li&gt;OAuth의 경우 Facebook, Google 등 소셜 계정을 이용해 다른 웹서비스에서도 로그인 할 수 있다.&lt;/li&gt;
&lt;li&gt;모바일 어플리케이션 환경에서도 잘 동작한다.&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키, 세션과 다르게 JWT는 토큰의 길이가 길어, 인증 요청이 많을수록 네트워크 부하가 심해진다.&lt;/li&gt;
&lt;li&gt;Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다. (패스워드 등)&lt;/li&gt;
&lt;li&gt;토큰을 탈취당하면 대처하기 어렵다. 토큰은 한 번 발급되면 유효기간이 만료될 때까지 계속 사용이 가능하다.&lt;/li&gt;
&lt;li&gt;특정 사용자의 접속을 강제로 만료하기 어렵다. (쿠키/세션 기반 인증은 서버 단에서 쉽게 삭제할 수 있지만 토큰은 그게 안 됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 단점을 보완하기 위한 토큰 전략들은 몇 가지가 있는데 그 중 기존의 Access Token의 유효기간을 짧게 하고 &lt;b&gt;Refresh Token&lt;/b&gt;이라는 새로운 토큰을 발급해서 Access Token을 탈취 당해도 상대적으로 피해를 줄일 수 있는 방법이 있다.&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;Refresh Token&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Access Token(JWT)를 통한 인증 방식의 문제는 제 3자에게 탈취당할 경우 보안에 취약하다는 점이다. 유효기간이 짧은 Token의 경우 그만큼 사용자는 로그인을 자주해서 새롭게 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;&quot;그러면 유효기간을 짧게 하면서 더 좋은 방법은 없을까?&quot; 라는 고민에 의해 탄생하게 된 것이 Refresh 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;Refresh Token은 Access Token과 똑같은 형태의 JWT이다. 처음에 로그인을 완료 했을때 Access Token과 동시에 발급되는 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 발급해주는 열쇠가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Access 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;Refresh&amp;nbsp;Token의&amp;nbsp;휴효기간이&amp;nbsp;만료&amp;nbsp;됐다면,&amp;nbsp;사용자는&amp;nbsp;새로&amp;nbsp;로그인&amp;nbsp;해야한다.&amp;nbsp;Refresh&amp;nbsp;Token도&amp;nbsp;탈취될&amp;nbsp;가능성이&amp;nbsp;있기때문에&amp;nbsp;적절한&amp;nbsp;유효기간&amp;nbsp;설정이&amp;nbsp;필요하다.(보통&amp;nbsp;2주)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kingth/%EC%84%9C%EB%B2%84-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4-%ED%86%A0%ED%81%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@kingth/%EC%84%9C%EB%B2%84-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4-%ED%86%A0%ED%81%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kingth/%EC%84%9C%EB%B2%84-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4-%ED%86%A0%ED%81%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@kingth/%EC%84%9C%EB%B2%84-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4-%ED%86%A0%ED%81%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/&lt;/a&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <category>jwt</category>
      <category>네트워크</category>
      <category>세션</category>
      <category>쿠키</category>
      <category>토큰</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/157</guid>
      <comments>https://coding-plant.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 20 Sep 2022 14:06:50 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 브라우저에 URL을 입력한 후 동작 순서</title>
      <link>https://coding-plant.tistory.com/156</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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAd0VM/btrMaGgxuzG/eV11botzsQyFd0KIqklVc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAd0VM/btrMaGgxuzG/eV11botzsQyFd0KIqklVc1/img.png&quot; data-alt=&quot;축약 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAd0VM/btrMaGgxuzG/eV11botzsQyFd0KIqklVc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAd0VM%2FbtrMaGgxuzG%2FeV11botzsQyFd0KIqklVc1%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;840&quot; height=&quot;622&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;축약 이미지&lt;/figcaption&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;b&gt;8단계로 &lt;/b&gt;나열해봤을때&amp;nbsp;&lt;a href=&quot;http://maps.google.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;특정 사이트(maps.google.com)&lt;/a&gt;를 예로 들자면&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자가 브라우저 주소창에 특정 URL(예시: maps.google.com)을 입력한다.&lt;/li&gt;
&lt;li&gt;브라우저가&amp;nbsp;maps.google.com의&amp;nbsp;IP&amp;nbsp;주소를&amp;nbsp;찾기&amp;nbsp;위해&amp;nbsp;캐시에서&amp;nbsp;DNS&amp;nbsp;기록을&amp;nbsp;확인한다.&lt;/li&gt;
&lt;li&gt;만약 요청한 URL(maps.google.com)이 캐시에 없다면, ISP의 DNS 서버가 DNS 쿼리로 maps.google.com을 호스팅 하는 서버의 IP 주소를 찾는다.&lt;/li&gt;
&lt;li&gt;브라우저가 해당 서버와 TCP 연결을 시작한다.&lt;/li&gt;
&lt;li&gt;브라우저가 웹서버에 HTTP 요청을 보낸다.&lt;/li&gt;
&lt;li&gt;서버가 요청을 처리하고 응답을 보낸다.&lt;/li&gt;
&lt;li&gt;서버가 HTTP 응답을 보낸다.&lt;/li&gt;
&lt;li&gt;브라우저가 HTML 콘텐츠를 렌더링한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도메인 IP 주소 조회하는 방법&lt;/h2&gt;
&lt;pre id=&quot;code_1663302173510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nslookup [URL주소]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsXCX5/btrMd520YBp/oITKsNStyRtAExT5xsh8K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsXCX5/btrMd520YBp/oITKsNStyRtAExT5xsh8K0/img.png&quot; data-alt=&quot;nslookup 명령어 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsXCX5/btrMd520YBp/oITKsNStyRtAExT5xsh8K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsXCX5%2FbtrMd520YBp%2FoITKsNStyRtAExT5xsh8K0%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;819&quot; height=&quot;510&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nslookup 명령어 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고한 사이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&quot;&gt;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663203795110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What happens when you type a URL in the browser and press enter?&quot; data-og-description=&quot;If you are in any technical profession, I am sure someone at some point has asked you this question. Whether you are an engineer&amp;hellip;&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&quot; data-og-url=&quot;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/exMssE/hyPMVBrvuO/kwkTFBrkqT2a3CViAahtK0/img.jpg?width=500&amp;amp;height=332&amp;amp;face=0_0_500_332,https://scrap.kakaocdn.net/dn/e9qWz/hyPNT9Ukye/KfHBCBH32jANmvkYpMnpRk/img.png?width=1400&amp;amp;height=642&amp;amp;face=0_0_1400_642,https://scrap.kakaocdn.net/dn/gFyB9/hyPMPH3B5t/LDrKkakoQdA2EEVxt3kdrk/img.png?width=1302&amp;amp;height=322&amp;amp;face=0_0_1302_322&quot;&gt;&lt;a href=&quot;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&quot; data-source-url=&quot;https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/exMssE/hyPMVBrvuO/kwkTFBrkqT2a3CViAahtK0/img.jpg?width=500&amp;amp;height=332&amp;amp;face=0_0_500_332,https://scrap.kakaocdn.net/dn/e9qWz/hyPNT9Ukye/KfHBCBH32jANmvkYpMnpRk/img.png?width=1400&amp;amp;height=642&amp;amp;face=0_0_1400_642,https://scrap.kakaocdn.net/dn/gFyB9/hyPMPH3B5t/LDrKkakoQdA2EEVxt3kdrk/img.png?width=1302&amp;amp;height=322&amp;amp;face=0_0_1302_322');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What happens when you type a URL in the browser and press enter?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you are in any technical profession, I am sure someone at some point has asked you this question. Whether you are an engineer&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <category>dns</category>
      <category>Url</category>
      <category>네트워크</category>
      <category>도메인</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/156</guid>
      <comments>https://coding-plant.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 15 Sep 2022 10:03:57 +0900</pubDate>
    </item>
    <item>
      <title>[Eclipse] 톰캣 서버 시작시 경로인 Context root 지정</title>
      <link>https://coding-plant.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트 패스(Context Path)는 WAS(Web Application Server)에서 &lt;u&gt;웹어플리케이션을 구분하기 위한 Path&lt;/u&gt;로 예를들자면 아래 주소에서 '&lt;b&gt;Service&lt;/b&gt;' 부분에 해당하는 루트 경로이다.&lt;span&gt;(이클립스에서 프로젝트를 생성하면 자동으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;server.xml&lt;/b&gt;에 추가되어 서버를 구동시키면 자동으로 잡히는 경로)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localhost:8080/&lt;u&gt;Services&lt;/u&gt;/&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 간혹 서버는 잘돌고있는데 404 에러가 발생하면서 해당 루트를 찾지 못하는 경우가 있는데 그럴 경우 &lt;b&gt;Context root &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;h2 data-ke-size=&quot;size26&quot;&gt;1. Properties 변경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 원하는 프로젝트 우클릭 후 &lt;b&gt;Properties&lt;/b&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkoPLf/btrLx0Usl5z/Xd4xj1ZS7ay1YOteBKbcA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkoPLf/btrLx0Usl5z/Xd4xj1ZS7ay1YOteBKbcA1/img.png&quot; data-alt=&quot;원하는 프로젝트 우클릭 후 Properties 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkoPLf/btrLx0Usl5z/Xd4xj1ZS7ay1YOteBKbcA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkoPLf%2FbtrLx0Usl5z%2FXd4xj1ZS7ay1YOteBKbcA1%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;501&quot; height=&quot;644&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원하는 프로젝트 우클릭 후 Properties 클릭&lt;/figcaption&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;2. 좌측 메뉴 중 &lt;b&gt;Web Project Settings&lt;/b&gt; 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Context root 경로를 '/' 로 변경 후 OK&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/78k9N/btrLwJyDIq1/0Vt6yeTqv3VmE2ANiCCq51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/78k9N/btrLwJyDIq1/0Vt6yeTqv3VmE2ANiCCq51/img.png&quot; data-alt=&quot;Context root 경로 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/78k9N/btrLwJyDIq1/0Vt6yeTqv3VmE2ANiCCq51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F78k9N%2FbtrLwJyDIq1%2F0Vt6yeTqv3VmE2ANiCCq51%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;605&quot; height=&quot;533&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Context root 경로 지정&lt;/figcaption&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;h2 data-ke-size=&quot;size26&quot;&gt;2. Server의 프로젝트 config에서 변경하는 것으로 위에서 말한 server.xml의 Context path값을 변경&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsy1PQ/btrLx1zbsRt/gLHZnVLoYoxJnrugk2wzKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsy1PQ/btrLx1zbsRt/gLHZnVLoYoxJnrugk2wzKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsy1PQ/btrLx1zbsRt/gLHZnVLoYoxJnrugk2wzKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsy1PQ%2FbtrLx1zbsRt%2FgLHZnVLoYoxJnrugk2wzKk%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;317&quot; height=&quot;163&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Package Explorer 에서 Servers 폴더를 열고, [프로젝트-config] 의 server.xml 파일을 연다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;13&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMxQNj/btrLwAV5LBf/k5wCqKKzi5cXTsfCB2K6yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMxQNj/btrLwAV5LBf/k5wCqKKzi5cXTsfCB2K6yK/img.png&quot; data-alt=&quot;해당 속성 설정하는 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMxQNj/btrLwAV5LBf/k5wCqKKzi5cXTsfCB2K6yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMxQNj%2FbtrLwAV5LBf%2Fk5wCqKKzi5cXTsfCB2K6yK%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;755&quot; height=&quot;13&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;13&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해당 속성 설정하는 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분을 찾아서 Context 태그 내에 path 속성값을 원하는 값으로 변경해주면 된다.(보통 '/' 로 많이 사용)&lt;/p&gt;</description>
      <category>개발</category>
      <category>contextroot</category>
      <category>Eclipse</category>
      <category>Tomcat</category>
      <category>이클립스</category>
      <category>톰캣</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/154</guid>
      <comments>https://coding-plant.tistory.com/154#entry154comment</comments>
      <pubDate>Tue, 6 Sep 2022 15:17:29 +0900</pubDate>
    </item>
    <item>
      <title>[Postman] JSON 파라미터 보내기</title>
      <link>https://coding-plant.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;포스트맨에서 JSON 데이터를 보내는 방법은 매우 간단하다.&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;[Body] &amp;gt; [raw] &amp;gt; [JSON] 선택&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8328/btrLu2rQidU/Y7OAPkUip4wSlPQBNEWVsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8328/btrLu2rQidU/Y7OAPkUip4wSlPQBNEWVsk/img.png&quot; data-alt=&quot;JSON 데이터 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8328/btrLu2rQidU/Y7OAPkUip4wSlPQBNEWVsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8328%2FbtrLu2rQidU%2FY7OAPkUip4wSlPQBNEWVsk%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;741&quot; height=&quot;384&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JSON 데이터 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요청 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clPfjI/btrLyZVgPui/c24NQ6eBGI5U4A69h3aUK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clPfjI/btrLyZVgPui/c24NQ6eBGI5U4A69h3aUK0/img.png&quot; data-alt=&quot;요청 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clPfjI/btrLyZVgPui/c24NQ6eBGI5U4A69h3aUK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclPfjI%2FbtrLyZVgPui%2Fc24NQ6eBGI5U4A69h3aUK0%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;1521&quot; height=&quot;746&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청 결과&lt;/figcaption&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;</description>
      <category>개발</category>
      <category>JSON</category>
      <category>postman</category>
      <category>포스트맨</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/153</guid>
      <comments>https://coding-plant.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 6 Sep 2022 15:09:10 +0900</pubDate>
    </item>
    <item>
      <title>[Database] Lock 이란</title>
      <link>https://coding-plant.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마전 업무 중 DB 락이 걸려서 잠시 애를 먹은적이 있다. 다행히 구글링을 통해 락이 걸린 프로세스들을 찾아 금방 해결할 수 있었지만 LOCK 이 정확히 어떤건지 알고 넘어가는게 좋을 것 같다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;락 해제 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-plant.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-plant.tistory.com/148&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662350930276&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[PostgreSQL] 테이블 Lock 조회 및 Kill 방법&quot; data-og-description=&quot;현재&amp;nbsp;수행중인&amp;nbsp;SQL&amp;nbsp;전체&amp;nbsp;조회 select datname, pid, usename, application_name, client_addr, client_port, backend_start, query_start, wait_event_type, state, backend_xmin query from pg_stat_activity..&quot; data-og-host=&quot;coding-plant.tistory.com&quot; data-og-source-url=&quot;https://coding-plant.tistory.com/148&quot; data-og-url=&quot;https://coding-plant.tistory.com/148&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/diLtLF/hyPFZ5fFOd/5kH5Ojtp8FCZzLumkq3iZ0/img.png?width=800&amp;amp;height=444&amp;amp;face=0_0_800_444,https://scrap.kakaocdn.net/dn/bDqI3u/hyPHsEKloW/rtmpB7U5SxKH20DM0ZkqF1/img.png?width=800&amp;amp;height=444&amp;amp;face=0_0_800_444&quot;&gt;&lt;a href=&quot;https://coding-plant.tistory.com/148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coding-plant.tistory.com/148&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/diLtLF/hyPFZ5fFOd/5kH5Ojtp8FCZzLumkq3iZ0/img.png?width=800&amp;amp;height=444&amp;amp;face=0_0_800_444,https://scrap.kakaocdn.net/dn/bDqI3u/hyPHsEKloW/rtmpB7U5SxKH20DM0ZkqF1/img.png?width=800&amp;amp;height=444&amp;amp;face=0_0_800_444');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[PostgreSQL] 테이블 Lock 조회 및 Kill 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;현재&amp;nbsp;수행중인&amp;nbsp;SQL&amp;nbsp;전체&amp;nbsp;조회 select datname, pid, usename, application_name, client_addr, client_port, backend_start, query_start, wait_event_type, state, backend_xmin query from pg_stat_activity..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;coding-plant.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DB Lock 이란&lt;/h2&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;p data-ke-size=&quot;size16&quot;&gt;DB에서 데이터 수정은 DB Lock을 가진 세션만 가능하다. &lt;u&gt;데이터를 수정하기 위해 접근하면, 세션은 DB Lock을 얻을 수 있는지 확인하고 가능하다면 바로 획득한다. 그리고 트랜잭션이 Commit 될 때, DB Lock을 반납&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DB Lock이 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 두 개의 DB 세션이 존재한다고 가정해보자. 세션 1이 A라는 행의 데이터를 수정중이고 이를 아직 커밋하지 않은 상황이다. 이 때, 세션2가 A라는 행에 접근해서 데이터를 수정하는 상황이 있다고 가정해보자. 한 마디로 설명하면, A라는 곳을 동시에 여러 세션이 수정하려고 하는 상황이다. 이러한 과정은 데이터의 정합성과 원자성을 무너뜨리기 떄문에 문제가 야기될수 있다.&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;과정으로 보자면 세션1은 A &amp;rarr; B &amp;rarr; C 순으로 접근해서 각각의 데이터를 수정하는 일을 한다고 가정한다. 세션1이 A의 값을 수정하고, B의 값을 수정하는 순간 세션2가 A의 값을 다시 수정한다고 가정해보자. 그리고 세션1이 C의 값을 수정하는 순간 문제가 발생해서 세션1의 트랜잭션이 롤백된다고 가정해보자.&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;그렇다면 이 때, 'A'의 값은 어떤 값으로 롤백 되는 것이 맞을까? 트랜잭션이 시작되기 전 지점으로 돌아가는 것이 맞을까? 아니면 세션2가 수정한 값으로 변경한 값이 맞을까? 다양한 경우의 수가 존재하게 될 것이다.&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;DB Lock&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Lock의 종류는&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lock은 크게 두 종류로 구분한다.&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Shared Lock&lt;/b&gt;(공유 Lock 또는 Read Lock) &lt;br /&gt;보통 데이터를 읽을 때 사용한다. 원하는 데이터에 Lock을 걸었지만 다른 세션에서 읽을 수 있고, 공유Lock을 설정한 경우 추가로 공유Lock을 설정할 수 있지만, 배타적 Lock은 설정할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 내가 보고 있는 데이터는 다른 사용자가 볼 수 있지만, 변경할 수는 없는 상태&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Exclusive Lock&lt;/b&gt;(배타적 Lock 또는 Write lock)&lt;br /&gt;보통 데이터를 변경할 때 사용한다. 이름에서 보여지듯이 해당 Lock이 해제되기 전까지는, 다른 공유Lock, 배타적Lock을 설정할 수 없다.&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;h2 data-ke-size=&quot;size26&quot;&gt;Blocking&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로킹은 &lt;u&gt;Lock들의 경합(==Race condition)이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 의미한다.&lt;/u&gt; (공유Lock과 배타적Lock) 또는 (배타적Lock과 배타적Lock)끼리 블로킹이 발생할 수 있다. 이를 해결하는 방법은 Transaction &lt;b&gt;commit&lt;/b&gt; 또는 &lt;b&gt;rollback&lt;/b&gt; 으로 제어하는 방법뿐이다.&lt;br /&gt;&lt;br /&gt;경합이 발생할 때, 먼저 Lock을 설정한 트랜잭션을 기다려야하기 때문에, 이런 현상이 반복되면 사용자에게 양질의 서비스를 제공하기가 어려워진다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;블로킹 해결 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;트랜잭션을 가능한 짧게 정의하면 경합을 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;동일한 데이터를 동시에 변경하는 작업을 하지 않도록 설계하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;트랜잭션이 활발한 주간에는 대용량 갱신 작업을 수행하면 안됨.&lt;/li&gt;
&lt;li&gt;대용량작업이 불가피할 경우, 작업단위를 쪼개거나 &lt;b&gt;lock_timeout&lt;/b&gt;을 설정하여 해당 Lock의 최대시간을 설정할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1662351333523&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 예시
set lock_timeout 3000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dead Lock&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeadLock은 트랜잭션간의 교착상태를 의미한다. 두 개의 트랜잭션간에 각 트랜잭션이 가지고 있는 리소스의 Lock을 획득하려고 할 때 발생하는 교착상태이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFIdOx/btrLiWsjeaP/XbpFzWpF8OSKD11zxOE19K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFIdOx/btrLiWsjeaP/XbpFzWpF8OSKD11zxOE19K/img.png&quot; data-alt=&quot;DeadLock 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFIdOx/btrLiWsjeaP/XbpFzWpF8OSKD11zxOE19K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFIdOx%2FbtrLiWsjeaP%2FXbpFzWpF8OSKD11zxOE19K%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;573&quot; height=&quot;373&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DeadLock 예시&lt;/figcaption&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;위 사진은 가장 흔히 떠올릴 수 있는 deadlock 상황이다. 좌측 1번 트랜잭션에서 우측 2번 리소스의 잠금을 획득, 2번 트랜잭션에서는 1번 리소스의 잠금을 획득한 상태이다. 이 때, 동시에 상대방의 데이터를 엑세스하려고 할때 기존의 Lock이 해제될 때까지 기다리게 되는 교착상태에 빠지게 된다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ppbJH/btrLqXcncPT/ClfKyXjIpTudKqk5yQei21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ppbJH/btrLqXcncPT/ClfKyXjIpTudKqk5yQei21/img.png&quot; data-alt=&quot;DeadLock 예시2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ppbJH/btrLqXcncPT/ClfKyXjIpTudKqk5yQei21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FppbJH%2FbtrLqXcncPT%2FClfKyXjIpTudKqk5yQei21%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;559&quot; height=&quot;364&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DeadLock 예시2&lt;/figcaption&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;두번째 예시는, 1번 트랜잭션이 공유Lock을 설정하고 Sleep에 빠져버렸을 때를 보여준다. 이때 2번 트랜잭션은 배타적Lock을 설정하려고 시도하여도, 계속 기다리게만 되는 교착상태에 빠지게 된다.&lt;br /&gt;&lt;br /&gt;참고로 내가 업무에서 주로 사용하는 Postgresql 에서는 자동적으로 deadlock을 인지하고 교착상태를 해결하기 위하여 하나의 트랜잭션을 취소시켜준다. 하지만 정확히 어떤 트랜잭션이 취소될 지 판단하는게 불가능하다.&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;div class=&quot;rgyInfo&quot;&gt;
&lt;div class=&quot;rgyInfo-circle&quot;&gt;
&lt;div class=&quot;topDiv&quot;&gt;TIP&lt;/div&gt;
&lt;div class=&quot;bottomDiv&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;bottomDiv2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;rgyInfo-text&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 이상의 프로세스가 특정 자원을 얻지 못해서 다음 명령을 처리 못하는 상태 (교착상태) 한정된 자원을 여러 곳에서 사용하려고 할 때 발생&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.sqler.com/320577&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.sqler.com/320577&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662351830326&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;개발자 커뮤니티 SQLER.com - 교착상태 (DeadLock)&quot; data-og-description=&quot;교착상태(DeadLock)은 서로 다른 두개의 작업(트랜잭션)이 리소스 잠금을 교차해서 획득하려 할 때 발생합니다. 가장 보편적인 DeadLock그림입니다. T1작업은 R1(리소스)의 잠금을 획득하고 R2를 액세&quot; data-og-host=&quot;www.sqler.com&quot; data-og-source-url=&quot;http://www.sqler.com/320577&quot; data-og-url=&quot;https://www.sqler.com/board_Column/320577&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cQyxNu/hyPF55t6Pq/6DvVIlQY5KvY0epjApDPK0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/WBfYx/hyPHi3dajP/HkftwytmYXux3klTqcP62K/img.jpg?width=981&amp;amp;height=268&amp;amp;face=0_0_981_268,https://scrap.kakaocdn.net/dn/cuhdLE/hyPFVht6aP/Q0Vll21WoZvc8B2kZ1IsO0/img.jpg?width=529&amp;amp;height=358&amp;amp;face=0_0_529_358&quot;&gt;&lt;a href=&quot;http://www.sqler.com/320577&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.sqler.com/320577&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cQyxNu/hyPF55t6Pq/6DvVIlQY5KvY0epjApDPK0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/WBfYx/hyPHi3dajP/HkftwytmYXux3klTqcP62K/img.jpg?width=981&amp;amp;height=268&amp;amp;face=0_0_981_268,https://scrap.kakaocdn.net/dn/cuhdLE/hyPFVht6aP/Q0Vll21WoZvc8B2kZ1IsO0/img.jpg?width=529&amp;amp;height=358&amp;amp;face=0_0_529_358');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자 커뮤니티 SQLER.com - 교착상태 (DeadLock)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;교착상태(DeadLock)은 서로 다른 두개의 작업(트랜잭션)이 리소스 잠금을 교차해서 획득하려 할 때 발생합니다. 가장 보편적인 DeadLock그림입니다. T1작업은 R1(리소스)의 잠금을 획득하고 R2를 액세&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sqler.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ojt90902.tistory.com/856&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ojt90902.tistory.com/856&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662353724221&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring DB : DB 락 - 개념 이해&quot; data-og-description=&quot;이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. DataBase Lock의 개념 이해 두 개의 DB 세션이 존재한다고 가정해보자. 세션 1이 A라는 행의 데이터를 수정중이고 이를 아직 커밋하지 &quot; data-og-host=&quot;ojt90902.tistory.com&quot; data-og-source-url=&quot;https://ojt90902.tistory.com/856&quot; data-og-url=&quot;https://ojt90902.tistory.com/856&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xYuUK/hyPFWtWPKj/RlG02M2hzku8QWXxSV39Ek/img.png?width=631&amp;amp;height=146&amp;amp;face=0_0_631_146,https://scrap.kakaocdn.net/dn/cphVaP/hyPHm5C52i/SCPgtDBWQoUF0J3KdvrKa1/img.png?width=631&amp;amp;height=146&amp;amp;face=0_0_631_146,https://scrap.kakaocdn.net/dn/bDd1KW/hyPHtp8K6c/FzIuDa11135La5TP9PxBBK/img.png?width=1069&amp;amp;height=248&amp;amp;face=818_168_854_204&quot;&gt;&lt;a href=&quot;https://ojt90902.tistory.com/856&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ojt90902.tistory.com/856&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xYuUK/hyPFWtWPKj/RlG02M2hzku8QWXxSV39Ek/img.png?width=631&amp;amp;height=146&amp;amp;face=0_0_631_146,https://scrap.kakaocdn.net/dn/cphVaP/hyPHm5C52i/SCPgtDBWQoUF0J3KdvrKa1/img.png?width=631&amp;amp;height=146&amp;amp;face=0_0_631_146,https://scrap.kakaocdn.net/dn/bDd1KW/hyPHtp8K6c/FzIuDa11135La5TP9PxBBK/img.png?width=1069&amp;amp;height=248&amp;amp;face=818_168_854_204');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring DB : DB 락 - 개념 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. DataBase Lock의 개념 이해 두 개의 DB 세션이 존재한다고 가정해보자. 세션 1이 A라는 행의 데이터를 수정중이고 이를 아직 커밋하지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ojt90902.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/데이터베이스</category>
      <category>db</category>
      <category>DB LOCK</category>
      <category>DB 락</category>
      <category>데이터베이스 락</category>
      <category>백엔드</category>
      <category>코딩</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/151</guid>
      <comments>https://coding-plant.tistory.com/151#entry151comment</comments>
      <pubDate>Mon, 5 Sep 2022 13:25:04 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] 테이블 Lock 조회 및 Kill 방법</title>
      <link>https://coding-plant.tistory.com/148</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재&amp;nbsp;수행중인&amp;nbsp;SQL&amp;nbsp;전체&amp;nbsp;조회&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1662081041488&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select  datname, 
        pid, 
        usename, 
        application_name, 
        client_addr, 
        client_port, 
        backend_start, 
        query_start, 
        wait_event_type, 
        state, 
        backend_xmin
        query 
from pg_stat_activity;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 287px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;datid&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;oid&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 20px;&quot;&gt;데이터베이스 oid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;datname&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;name&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 20px;&quot;&gt;데이터베이스 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;pid&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;integer&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 20px;&quot;&gt;프로세스 고유id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;usesysid&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;oid&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 20px;&quot;&gt;사용자고유번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;usename&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 20px;&quot;&gt;name&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 20px;&quot;&gt;사용자이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;application_name&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;text&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;응용프로그램이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;client_addr&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;inet&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;접속ip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;client_hostname&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;text&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;접속 호스트 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;client_port&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;integer&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;접속한 TCP 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;backend_start&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;timestamp&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;서버 접속시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;xact_start&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;timestamp&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;트랜잭션 시작 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;query_satrt&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;timestamp&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;쿼리 시작 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;state_change&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;timestamp&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;state 마지막 변경 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;waiting&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;대기중 = true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;state&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;text&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;상태 정보 (하단 참조) query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;query&lt;/td&gt;
&lt;td style=&quot;width: 269.328px; height: 17px;&quot;&gt;text&lt;/td&gt;
&lt;td style=&quot;width: 269.344px; height: 17px;&quot;&gt;state=active 인 row에 대해 실행중인쿼리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;state&amp;nbsp;(상태&amp;nbsp;정보)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;active&amp;nbsp;&lt;/b&gt;:&amp;nbsp;쿼리&amp;nbsp;실행중&lt;br /&gt;&lt;b&gt;idle&lt;/b&gt;&amp;nbsp;:&amp;nbsp;새로운&amp;nbsp;명령&amp;nbsp;대기중&lt;br /&gt;&lt;b&gt;idle&amp;nbsp;in&amp;nbsp;transaction&lt;/b&gt;&amp;nbsp;:&amp;nbsp;트랜잭션은&amp;nbsp;있지만&amp;nbsp;현재&amp;nbsp;실행중인&amp;nbsp;쿼리&amp;nbsp;없음&lt;br /&gt;&lt;b&gt;idle&amp;nbsp;in&amp;nbsp;transaction&amp;nbsp;(aborted)&lt;/b&gt;&amp;nbsp;:&amp;nbsp;트랜잭션은&amp;nbsp;있고&amp;nbsp;실행중인&amp;nbsp;쿼리는&amp;nbsp;없으나&amp;nbsp;트랜잭션에&amp;nbsp;오류가&amp;nbsp;발생&lt;br /&gt;&lt;b&gt;fastpath&amp;nbsp;function&amp;nbsp;call&lt;/b&gt;&amp;nbsp;:&amp;nbsp;함수&amp;nbsp;실행중&lt;br /&gt;&lt;b&gt;disabled&lt;/b&gt; : track_activities 무효&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LOCK 걸린 테이블 조회&lt;/h2&gt;
&lt;pre id=&quot;code_1662081155257&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT  t.relname,
        l.locktype,
        page,
        virtualtransaction,
        pid,
        mode,
        granted
FROM pg_locks l,
 pg_stat_all_tables t
WHERE l.relation = t.relid
ORDER BY relation ASC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 테이블에 lock을 확인 할 수 있다. 기본적으로 대부분의 lock 테이블은 괜찮으나 RowExclusiveLock 이 검색된다면 해당 테이블에 접근이 지연되어 다른 쿼리에도 영향을 미칠 수 있으므로 반드시 잡고있는 트랜잭션이나 서버 상태 등을 점검하여 lock을 해제 해 주는 작업이 필요하다.&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;PID 값&lt;/b&gt;을 가지고 조건문에 넣어주면 해당 문제가 발생한 시점도 알 수 있다.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDe4L/btrLaU1LifD/qrBB9tKbFBniMabGcKCZ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDe4L/btrLaU1LifD/qrBB9tKbFBniMabGcKCZ4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDe4L/btrLaU1LifD/qrBB9tKbFBniMabGcKCZ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDe4L%2FbtrLaU1LifD%2FqrBB9tKbFBniMabGcKCZ4K%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;835&quot; height=&quot;121&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;해당 프로세스 중지(Kill)&lt;/h2&gt;
&lt;pre id=&quot;code_1662081185669&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT pg_cancel_backend([pid]);
SELECT pg_terminate_backend([pid]) FROM pg_stat_activity;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pg_cancel_backend는 해당 PID만 중지시키고, pg_terminate_backend는 해당 PID와 연계된 모든 상위 쿼리 프로세스를 종료시킨다. 따라서 pg_cancel_backend로 해당 작업이 종료 되는지 먼저 체크한 뒤, 중지 되지 않는다면 pg_terminate_backend를 수행하여 해당 프로세스를 종료시키는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/데이터베이스</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/148</guid>
      <comments>https://coding-plant.tistory.com/148#entry148comment</comments>
      <pubDate>Fri, 2 Sep 2022 11:03:57 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Tomcat 서버 시작/종료/재시작</title>
      <link>https://coding-plant.tistory.com/147</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 업무 시간 종료 후 서버에 변경사항을 배포할 일이 있었는데 실수로 명령어를 잘못입력해서 &lt;code&gt;Tomcat&lt;/code&gt; 이 아닌 &lt;code&gt;리눅스&lt;/code&gt; 자체를 종료시킨적이 있었다. 서버관리팀에 요청해서 금방 재부팅하고 마저 진행했지만 혹시나 이런 실수를 반복할 수 있으니 정리해둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버 시작&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592468-ea97a895-8a20-459e-a3f7-b78588376d5f.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ ./startup.sh
$ ps -ef | grep tomcat 명령어로 톰캣이 제대로 가동되었는지 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592111-31eb0b18-806b-4635-aee9-46e1ec847c30.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tomcat 서버 종료&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187591967-6902481e-7282-4d0e-9672-45c9317427b0.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 만약 &lt;code&gt;./shutdown.sh&lt;/code&gt; 가 동작하지 않는다면 &lt;code&gt;tomcat.pid&lt;/code&gt; 파일의 &lt;code&gt;pid&lt;/code&gt; 값이 현재 돌아가는 톰캣 프로세스와 일치하지 않아서 그럴 확률이 있으니 확인해볼 것.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592111-31eb0b18-806b-4635-aee9-46e1ec847c30.png&quot; alt=&quot;image&quot; /&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592195-447f6a5e-e836-48c9-ba22-ea1afd94204a.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd 톰캣까지의경로/apache-tomcat-9.0.22/bin
$ ./shutdown.sh
$ ps -ef | grep tomcat 명령어로 톰캣이 제대로 종료되었는지 확인&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;tomcat.pid 파일 수정&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592237-eb69688d-9328-4b36-8863-d4220c5e322a.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tomcat.pid 파일을 vi 텍스트 모드로 열어서 직접 알맞게 수정 후 다시 서버 종료 시도&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ vi tomcat.pid
$ 값 수정
$ :wq 저장하고 텍스트모드 나가기
$ ./shutdown.sh 서버 종료&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉토리를 나타내는 &lt;code&gt;./&lt;/code&gt; 를 입력하지 않고 그냥 &lt;code&gt;shutdown&lt;/code&gt; 명령어만 입력하게 되면 톰캣 서버가 아닌 리눅스 서버 자체를 꺼버릴 수 있기 때문에 반드시 명령어 사용에 주의해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버 재시작&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187592468-ea97a895-8a20-459e-a3f7-b78588376d5f.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ ./startup.sh
$ ps -ef | grep tomcat 명령어로 톰캣이 제대로 재가동되었는지 확인&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발</category>
      <category>centos</category>
      <category>Tomcat</category>
      <category>리눅스</category>
      <category>서버</category>
      <category>웹</category>
      <category>이클립스</category>
      <category>자바</category>
      <category>톰캣</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/147</guid>
      <comments>https://coding-plant.tistory.com/147#entry147comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:42:34 +0900</pubDate>
    </item>
    <item>
      <title>[에러메세지 ]이클립스 War Export 추출 시 오류 'Module name is invalid'</title>
      <link>https://coding-plant.tistory.com/146</link>
      <description>&lt;p&gt;회사에서 업무중 배포할 일이 있어 war 파일을 추출하려는데 갑자기 이상한 에러가나서 당황스러웠다.&lt;/p&gt;
&lt;p&gt;다행히 쉽게 해결할 수 있는 환경설정 문제였어서 나중에 까먹을까봐 정리해둔다.&lt;/p&gt;
&lt;h2&gt;WAR 파일 Export 시도&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122183-7f1a0d01-eab9-4b26-a2a5-a3063ab16aed.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Module name is invalid 에러 발생&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122203-716c385d-ebb2-4e85-a1bd-68677136481f.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2&gt;프로젝트 설정 변경&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Properties&lt;/code&gt; 진입&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122219-28b3c495-3ca8-4c63-9636-5775a243186e.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Project Facets&lt;/code&gt; -&amp;gt; &lt;code&gt;Dynamic Web Module&lt;/code&gt; 체크 후 Apply&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122242-193bb942-ba48-4dd1-bf1d-b2f22e7b4765.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;적용 중 모습&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122257-8503a968-df33-4905-834c-ef19a1844193.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;완료 후 다시 Export 시도&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122283-f75040f3-bf02-4cb6-b669-26597164cc70.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;정상적으로 추출 완료!&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122296-78b4ac1f-3e39-4945-ba56-f65437305599.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;생각보다 간단하게 해결할 수 있는 문제였다.&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/146</guid>
      <comments>https://coding-plant.tistory.com/146#entry146comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:39:42 +0900</pubDate>
    </item>
    <item>
      <title>[Blog] HTML form태그에서 메일보내기 : Google Apps Mail</title>
      <link>https://coding-plant.tistory.com/144</link>
      <description>&lt;p&gt;티스토리에서 깃허브 블로그로 넘어오면서 내 블로그를 방문한 사람들이 전달하고 싶은 말을 바로 나에게 편하게 보낼 수 있도록 메일 서비스를 적용하고 싶었다.&lt;/p&gt;
&lt;p&gt;HTML에서 &lt;code&gt;mailto&lt;/code&gt;를 사용하면, 구현은 간단하지만 outlook 등 같은 서드파티 앱을 실행해 직접 메일을 보내는 방식이기 때문에 내가 생각한 편리함은 없었다.&lt;/p&gt;
&lt;p&gt;하지만 역시 세상은 넓고 똑똑한 사람은 많다보니 이런 기능을 적용해본 블로거분이 계셔서 그 분의 글을 보며 &lt;code&gt;별도 서버가 없는 순수 HTML과 자바스크립트&lt;/code&gt;로 메일보내기를 구현할 수 있었다.&lt;/p&gt;
&lt;p&gt;내가 바라던대로 방문자(사용자)는 계정에 로그인하고 메일을 보내는 귀찮음을 느낄 필요도 없이 간단한 웹페이지의 양식대로만 입력해서 쉽고 빠르게 메일을 보낼 수 있다.&lt;/p&gt;
&lt;p&gt;이 방법을 찾기 전에는 서버를 하나 결제해야하나 고민했는데 구글에서 제공하는 방법으로 우회해서 해결할 수 있어서 다행이었다 &lt;/p&gt;
&lt;br&gt;

&lt;p&gt;&lt;a href=&quot;https://kutar37.tistory.com/entry/%EC%A0%95%EC%A0%81-HTML-form%ED%83%9C%EA%B7%B8%EC%97%90%EC%84%9C-%EB%A9%94%EC%9D%BC%EB%B3%B4%EB%82%B4%EA%B8%B0-Google-Apps-Mail&quot;&gt;참고한 사이트&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;

&lt;h2&gt;메일 보내는 페이지(화면)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122577-510b97eb-c777-41e9-877d-aa5c07b4d9de.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;위 사진은 내 블로그에서 전달할 내용과 정보를 입력하는 페이지이다.&lt;br&gt;페이지는 이미 구성을 했고, 이제 기능을 구현해보자.&lt;/p&gt;
&lt;p&gt;우선 참고한 사이트에서 진행한 방식 그대로 따라가봤다.&lt;/p&gt;
&lt;h2&gt;Google Apps Mail을 사용해 정적 HTML Form에서 메일을 보내기&lt;/h2&gt;
&lt;p&gt;작동 예제&lt;br&gt;&lt;a href=&quot;https://dwyl.github.io/learn-to-send-email-via-google-script-html-no-server/&quot;&gt;링크&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;동작 원리&lt;/h3&gt;
&lt;p&gt;유지보수가 필요한 서버를 이용해 이메일을 보내는 대신, &lt;u&gt;사용자를 대신하여 Google로 메일을 보내고 Google 스프레드시트를 사용해 데이터를 추적&lt;/u&gt;하는 방식&lt;/p&gt;
&lt;h3&gt;진행 시작&lt;/h3&gt;
&lt;h4&gt;1. Sample Spreadsheet를 복사&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Bn4m6iA_Xch1zzhNvo_6CoQWqOAgwwkOWJKC-phHx2Q/copy&quot;&gt;https://docs.google.com/spreadsheets/d/1Bn4m6iA_Xch1zzhNvo_6CoQWqOAgwwkOWJKC-phHx2Q/copy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;본인 Google 계정에 로그인하고 &amp;quot;사본 만들기&amp;quot;를 클릭&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122597-e65ea2fe-1c9e-49be-b090-93eb23a45ec5.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;사본 만들기를 클릭하고 나면 이렇게 클라우드에서 사본이 열린다.&lt;/p&gt;
&lt;h4&gt;2. 스크립트 편집기 열기&lt;/h4&gt;
&lt;p&gt;메뉴에서 &lt;code&gt;확장프로그램&lt;/code&gt; -&amp;gt; &lt;code&gt;Apps Script&lt;/code&gt; 를 클릭한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;위에 가이드 문서에서는 &lt;code&gt;도구&lt;/code&gt; -&amp;gt; &lt;code&gt;스크립트편집기&lt;/code&gt; 라고 나와있는데 나는 메뉴가 달라 저렇게 구성되어 있었다.. 아마 버전의차이아닐까&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;3. 스크립트에서 TO_ADDRESS 를 설정&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122620-5d12c4aa-6e17-4e6b-9134-a961be3df119.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;해당 빨간 밑줄 부분을 &lt;code&gt;본인 메일주소&lt;/code&gt;로 수정&lt;/p&gt;
&lt;h4&gt;4. 스크립트의 새로운 버전 저장&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122648-b8f55a3c-ab18-4bd7-888b-fec84a1ef029.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;메뉴에서 &lt;code&gt;파일&lt;/code&gt; -&amp;gt; &lt;code&gt;버전기록&lt;/code&gt; -&amp;gt; &lt;code&gt;현재버전 이름저장&lt;/code&gt; 클릭&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122675-2f0280b6-dc39-4d1d-ae8e-a5d33b1a6140.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;여기까지 완료했다면&lt;/p&gt;
&lt;h4&gt;5. 업데이트된 스크립트를 웹 앱으로 배포&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122697-3f713693-597a-4e40-9a89-a84c6239be0c.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;해당 스크립트 안에서 &lt;code&gt;배포&lt;/code&gt; -&amp;gt; &lt;code&gt;새 배포&lt;/code&gt; 클릭&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122711-7cfcaa2e-0c8b-4930-89d4-bf930e4b7ebd.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;아무 설명이나 써넣고 &lt;code&gt;배포&lt;/code&gt; 클릭&lt;/p&gt;
&lt;h4&gt;6. 이메일을 보내기 위해 스크립트를 인증&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122743-61ca440e-45ca-45b1-a3f6-c8f21fbe044a.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;해당 인증 부분 캡처들을 못 찍어서 &lt;code&gt;참조 이미지로 대체&lt;/code&gt;함.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122772-a4f6a848-43da-4830-9242-9ab39c55dc79.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;이제 배포 ID와 웹 URL을 메모장 같은 곳에 기록해두고 마무리!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;잊어버려도 &lt;code&gt;배포관리&lt;/code&gt; 메뉴에 들어가면 다시 확인할 수 있음.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122793-a626be3e-606d-497e-af28-b991d08be925.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7. 이제 실제 화면 페이지를 구성(HTML)&lt;/h4&gt;
&lt;p&gt;이건 사람마다 본인이 원하는 화면 구성이 다 다를테니 내 블로그 코드를 예로 보여주자면&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;---
layout: page
title: 연락하기
---
&amp;lt;div class=&amp;quot;contact-area bg-color1 p-t-130 p-b-130&amp;quot;&amp;gt;
   &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
      &amp;lt;article class=&amp;quot;&amp;quot;  data-aos=&amp;quot;fade-up&amp;quot;&amp;gt;
         &amp;lt;div class=&amp;quot;row m-b-60&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;
               &amp;lt;div class=&amp;quot;contact-info&amp;quot;&amp;gt;
                  &amp;lt;div class=&amp;quot;info-logo&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;{{site.baseurl}}/assets/images/contact-info-logo.png&amp;quot; alt=&amp;quot;contact info logo&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;
                  &amp;lt;div class=&amp;quot;info-content&amp;quot;&amp;gt;
                     &amp;lt;h5 class=&amp;quot;heading-5&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Office Address&amp;lt;/a&amp;gt;&amp;lt;/h5&amp;gt;
                  &amp;lt;/div&amp;gt;
               &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;
               &amp;lt;div class=&amp;quot;contact-info&amp;quot;&amp;gt;
                  &amp;lt;div class=&amp;quot;info-logo&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;{{site.baseurl}}/assets/images/contact-info-logo2.png&amp;quot; alt=&amp;quot;contact info logo&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;
                  &amp;lt;div class=&amp;quot;info-content&amp;quot;&amp;gt;
                     &amp;lt;h5 class=&amp;quot;heading-5&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Email Address&amp;lt;/a&amp;gt;&amp;lt;/h5&amp;gt;
                  &amp;lt;/div&amp;gt;
               &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;
               &amp;lt;div class=&amp;quot;contact-info m-0&amp;quot;&amp;gt;
                  &amp;lt;div class=&amp;quot;info-logo&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;{{site.baseurl}}/assets/images/contact-info-logo3.png&amp;quot; alt=&amp;quot;contact info logo&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;
                  &amp;lt;div class=&amp;quot;info-content&amp;quot;&amp;gt;
                     &amp;lt;h5 class=&amp;quot;heading-5&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Phone Number&amp;lt;/a&amp;gt;&amp;lt;/h5&amp;gt;
                  &amp;lt;/div&amp;gt;
               &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
         &amp;lt;/div&amp;gt;
         &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;col-md-7&amp;quot;&amp;gt;
               &amp;lt;div class=&amp;quot;comment-form&amp;quot;&amp;gt;
                  &amp;lt;!-- &amp;lt;script data-cfasync=&amp;quot;false&amp;quot; type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://cdn.rawgit.com/dwyl/html-form-send-email-via-google-script-without-server/master/form-submission-handler.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;
                  &amp;lt;div class=&amp;quot;inner-title&amp;quot;&amp;gt;
                     &amp;lt;h5 class=&amp;quot;heading-5&amp;quot;&amp;gt;Send Your Message&amp;lt;/h5&amp;gt;
                  &amp;lt;/div&amp;gt;
                  &amp;lt;form id=&amp;quot;emailForm&amp;quot; class=&amp;quot;gform&amp;quot; method=&amp;quot;POST&amp;quot; data-email=&amp;quot;clothes.yoo@gmail.com&amp;quot; 
                        action=&amp;quot;https://script.google.com/macros/s/AKfycbzm-PBHodHx2va9AAauDKxBxYOybY37cHxzQVRy6Qq6hJ5kqpSObQVUi-FcdJ612QUR/exec&amp;quot;&amp;gt;
                     &amp;lt;div class=&amp;quot;form-row&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;
                           &amp;lt;div class=&amp;quot;form-row&amp;quot;&amp;gt;
                              &amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;
                                 &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;
                                    &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; id=&amp;quot;senderEmail&amp;quot; name=&amp;quot;senderEmail&amp;quot; placeholder=&amp;quot;Your Email&amp;quot; required&amp;gt;
                                 &amp;lt;/div&amp;gt;
                              &amp;lt;/div&amp;gt;
                           &amp;lt;/div&amp;gt;
                           &amp;lt;div class=&amp;quot;form-row&amp;quot;&amp;gt;
                              &amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;
                                 &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;
                                    &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; id=&amp;quot;senderName&amp;quot; name=&amp;quot;senderName&amp;quot;placeholder=&amp;quot;Your Name&amp;quot; required&amp;gt;
                                 &amp;lt;/div&amp;gt;
                              &amp;lt;/div&amp;gt;
                           &amp;lt;/div&amp;gt;
                           &amp;lt;div class=&amp;quot;form-row&amp;quot;&amp;gt;
                              &amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;
                                 &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;
                                    &amp;lt;textarea class=&amp;quot;form-control&amp;quot; id=&amp;quot;message&amp;quot; name=&amp;quot;message&amp;quot; rows=&amp;quot;5&amp;quot; placeholder=&amp;quot;Your Message&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                                 &amp;lt;/div&amp;gt;
                              &amp;lt;/div&amp;gt;
                           &amp;lt;/div&amp;gt;
                           &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
                              (function() {
                                 // get all data in form and return object
                                 function getFormData(form) {
                                    var elements = form.elements;
                                    var honeypot;

                                    var fields = Object.keys(elements).filter(function(k) {
                                       if (elements[k].name === &amp;quot;honeypot&amp;quot;) {
                                       honeypot = elements[k].value;
                                       return false;
                                       }
                                       return true;
                                    }).map(function(k) {
                                       if(elements[k].name !== undefined) {
                                       return elements[k].name;
                                       // special case for Edge&amp;#39;s html collection
                                       }else if(elements[k].length &amp;gt; 0){
                                       return elements[k].item(0).name;
                                       }
                                    }).filter(function(item, pos, self) {
                                       return self.indexOf(item) == pos &amp;amp;&amp;amp; item;
                                    });

                                    var formData = {};
                                    fields.forEach(function(name){
                                       var element = elements[name];

                                       // singular form elements just have one value
                                       formData[name] = element.value;

                                       // when our element has multiple items, get their values
                                       if (element.length) {
                                       var data = [];
                                       for (var i = 0; i &amp;lt; element.length; i++) {
                                          var item = element.item(i);
                                          if (item.checked || item.selected) {
                                             data.push(item.value);
                                          }
                                       }
                                       formData[name] = data.join(&amp;#39;, &amp;#39;);
                                       }
                                    });

                                    // add form-specific values into the data
                                    formData.formDataNameOrder = JSON.stringify(fields);
                                    formData.formGoogleSheetName = form.dataset.sheet || &amp;quot;responses&amp;quot;; // default sheet name
                                    formData.formGoogleSendEmail
                                       = form.dataset.email || &amp;quot;&amp;quot;; // no email by default

                                    return {data: formData, honeypot: honeypot};
                                 }

                                 function handleFormSubmit(event) {  // handles form submit without any jquery
                                    event.preventDefault();           // we are submitting via xhr below
                                    var form = event.target;
                                    var formData = getFormData(form);
                                    var data = formData.data;

                                    // If a honeypot field is filled, assume it was done so by a spam bot.
                                    if (formData.honeypot) {
                                       return false;
                                    }

                                    disableAllButtons(form);
                                    var url = form.action;
                                    var xhr = new XMLHttpRequest();
                                    xhr.open(&amp;#39;POST&amp;#39;, url);
                                    // xhr.withCredentials = true;
                                    xhr.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);
                                    xhr.onreadystatechange = function() {
                                       if (xhr.readyState === 4 &amp;amp;&amp;amp; xhr.status === 200) {
                                          form.reset();
                                          var formElements = form.querySelector(&amp;quot;.form-elements&amp;quot;)
                                          if (formElements) {
                                             formElements.style.display = &amp;quot;none&amp;quot;; // hide form
                                          }
                                          var thankYouMessage = form.querySelector(&amp;quot;.thankyou_message&amp;quot;);
                                          if (thankYouMessage) {
                                             thankYouMessage.style.display = &amp;quot;block&amp;quot;;
                                             alert(&amp;quot;메일 전송에 성공했습니다. 확인 후 회신드리겠습니다.&amp;quot;);
                                          }
                                       }
                                    };
                                    // url encode form data for sending as post data
                                    var encoded = Object.keys(data).map(function(k) {
                                       return encodeURIComponent(k) + &amp;quot;=&amp;quot; + encodeURIComponent(data[k]);
                                    }).join(&amp;#39;&amp;amp;&amp;#39;);
                                    xhr.send(encoded);
                                 }

                                 function loaded() {
                                    // bind to the submit event of our form
                                    var forms = document.querySelectorAll(&amp;quot;form.gform&amp;quot;);
                                    for (var i = 0; i &amp;lt; forms.length; i++) {
                                       forms[i].addEventListener(&amp;quot;submit&amp;quot;, handleFormSubmit, false);
                                    }
                                 };
                                 document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, loaded, false);

                                 function disableAllButtons(form) {
                                    var buttons = form.querySelectorAll(&amp;quot;button&amp;quot;);
                                    for (var i = 0; i &amp;lt; buttons.length; i++) {
                                       buttons[i].disabled = true;
                                    }
                                 }
                                 })();
                           &amp;lt;/script&amp;gt;
                           &amp;lt;div class=&amp;quot;form-group m-0&amp;quot;&amp;gt;
                              &amp;lt;button id=&amp;quot;btnSubmit&amp;quot; class=&amp;quot;btn-submit mt-2&amp;quot;&amp;gt;Send Message&amp;lt;/button&amp;gt;
                           &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                     &amp;lt;/div&amp;gt;

                     &amp;lt;div style=&amp;quot;display:none&amp;quot; class=&amp;quot;thankyou_message&amp;quot;&amp;gt;
                        &amp;lt;h2&amp;gt;&amp;lt;em&amp;gt;Thanks&amp;lt;/em&amp;gt; for contacting us! We will get back to you soon!&amp;lt;/h2&amp;gt;
                     &amp;lt;/div&amp;gt;
                  &amp;lt;/form&amp;gt;
               &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&amp;quot;col-md-4 offset-md-1&amp;quot;&amp;gt;
               &amp;lt;div class=&amp;quot;contact-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;{{site.baseurl}}/assets/images/contact-image.png&amp;quot; alt=&amp;quot;contact image&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
         &amp;lt;/div&amp;gt;
      &amp;lt;/article&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;

&lt;p&gt;이렇게 구성되어 있다.&lt;/p&gt;
&lt;h4&gt;8. 주의사항&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;1. 만약 이 레포지토리의 예제가 아닌 직접 작성한 form을 벌써 사용하려고 한다면 각각의 form 요소 name 속성은 Google 시트의 컬럼네임과 같아야 한다.

2. form태그의 class는 gform이 되어야 함. 즉, &amp;lt;form class = &amp;quot;gform&amp;quot;&amp;gt;

3. Form태그의 action 속성을 전 단계에서 복사해놓은 URL로 고쳐야 함을 잊지 말 것!!(중요)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122825-dc72e3b8-a115-4223-ae50-738be3818aba.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;9. 브라우저에서 HTML Form (페이지) 열기&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;HTML Form에서 테스트 데이터를 채움&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122852-c9fc81d2-3d3c-42db-bfdd-974e82cbf5f1.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;submit 버튼 클릭 후 json 결과 데이터 확인&lt;br&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122867-3f18e881-341f-45fd-a7eb-3a90a3f95699.png&quot; alt=&quot;image&quot;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;참고로 위 2개의 캡처는 참조용 이미지임.&lt;/p&gt;
&lt;h4&gt;10. 아까 설정했던 본인 메일주소로 들어가 받은편지함을 확인&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122897-efcff9bc-176b-43a2-9c75-386cfa699382.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h4&gt;11. JavaScript 와 &amp;quot;AJAX&amp;quot; 를 사용한 양식 제출 + 양식이 제출될 때 나오는 메시지 커스터마이징&lt;/h4&gt;
&lt;p&gt;여기서부턴 꼭 필요한 과정은 아니지만 사용자 편리성을 위해 필요하다고 볼 수있는 부분이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;페이지가 JSON 응답/결과로 변경되지 않도록 하려면 `AJAX`를 사용하여 양식을 제출해야 한다.

파일 끝 (*&amp;lt;/body&amp;gt; 태그 닫기 전)에 다음 JavaScript 파일을 포함하도록 index.html을 업데이트.

&amp;lt;script data-cfasync=&amp;quot;false&amp;quot; type=&amp;quot;text/javascript&amp;quot;
src=&amp;quot;https://cdn.rawgit.com/dwyl/html-form-send-email-via-google-script-without-server/master/form-submission-handler.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;참고로 &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;위의 3단계에서 TO_ADDRESS 변수를 설정하지 않은 경우, 메인 form 요소에 data-email=&amp;quot;&lt;a href=&quot;mailto:example@email.net&quot;&gt;example@email.net&lt;/a&gt;&amp;quot;를 포함시켜야 된다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;12. thankyou_message div를 만들어 직접 메시지를 만든다&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- 해당 div의 위치는 &amp;lt;form&amp;gt; 태그의 안에 속하게 할 것. --&amp;gt;

&amp;lt;div style=&amp;quot;display:none&amp;quot; class=&amp;quot;thankyou_message&amp;quot;&amp;gt;
 &amp;lt;!-- You can customize the thankyou message by editing the code below --&amp;gt;
 &amp;lt;h2&amp;gt;&amp;lt;em&amp;gt;Thanks&amp;lt;/em&amp;gt; for contacting us! We will get back to you soon!
 &amp;lt;/h2&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122929-4530c0f4-93c0-4768-9fc8-302f61ce60bd.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;사용자들에게 전송이 잘 되었다는것을 알리기 위한 것이므로 나는 Alert 메세지까지 추가했다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187122976-6a369e42-e340-4727-b134-4df94f01f2ac.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p&gt;여기까지만 하면 일단 기능적으로는 전부 끝났다.&lt;br&gt;CSS 나 메일 수신시 양식을 변경하는 것은 반드시 해야하는 기능은 아니기 때문에 작성하지 않으려고 한다.&lt;/p&gt;
&lt;p&gt;시도하는 모든 사람들 화이팅 &lt;/p&gt;</description>
      <category>블로그</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/144</guid>
      <comments>https://coding-plant.tistory.com/144#entry144comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:31:34 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git 명령어 모음</title>
      <link>https://coding-plant.tistory.com/143</link>
      <description>&lt;h2&gt;git 초기 세팅 관련&lt;/h2&gt;
&lt;p&gt;현재 위치에서 지역 저장소를 생성&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;깃 환경에서 사용자 이름을 &lt;code&gt;사용자명&lt;/code&gt;으로 지정&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git config --global user.name &amp;quot;사용자명&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;깃 환경에서 사용자 이메일을 &lt;code&gt;사용자이메일명&lt;/code&gt;으로 지정&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git config --global user.email &amp;quot;사용자이메일명&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;깃의 상태를 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git status&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;commit 명령어&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;파일명.확장자명&lt;/code&gt;을 스테이지에 올림&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git add 파일명.확장자명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커밋 메시지 &lt;code&gt;메시지명&lt;/code&gt;을 붙여 커밋&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git commit -m &amp;quot;메시지명&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;메시지 &lt;code&gt;메시지명&lt;/code&gt;을 붙여서 스테이징과 커밋을 동시에 진행&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git commit -a -m &amp;quot;메시지명&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커밋 내역 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git log
   $ git log --pretty=oneline # 한줄로 표기하기&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;특정 커밋 내역 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git show 커밋 id&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;최근 버전과 작업 폴더의 수정 파일 사이의 차이를 출력&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git diff
   $ git diff 이전커밋 id 이후커밋 id&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지정한 커밋 해시로 이동&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git checkout 커밋 해시&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;가장 최근 커밋을 취소&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git reset HEAD^ # 현재 HEAD의 이전 커밋으로 되돌리기
   $ git reset HEAD~n # 현재로 부터 n 번째 이전 커밋으로 되돌리기&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지정한 커밋 해시로 이동하고 커밋을 취소&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git reset 커밋 해시&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   reset의 3가지 옵션&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git reset --soft 커밋ID # head 만 바뀜
   $ git reset --mixed 커밋ID # staging 도 그 때로 바뀜
   $ git reset --hard 커밋ID # working디렉토리/staging 모두 그 때로 바꿈&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지정한 커밋 해시의 변경 이력을 취소&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git revert 커밋 해시&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커밋 수정하는 법&lt;br&gt;   파일 수정 한 뒤&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git add .
   $ git commit --amend : 최신 커밋 수정&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;브랜치 명령어&lt;/h2&gt;
&lt;p&gt;새로운 브랜치 &lt;code&gt;브랜치명&lt;/code&gt;을 생성&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git branch 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   브랜치 조회하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git branch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;브랜치명&lt;/code&gt;으로 체크아웃(이동)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git checkout 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git checkout -b 브랜치명 # 브랜치만들고 바로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   브랜치 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git branch -d 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커밋 로그에서 한 줄에 한 커밋씩 출력&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git log --oneline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;수정한 전체 파일을 스페이지에 올린다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git add .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커밋 로그에 각 브랜치의 커밋을 그래프로 표시&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git log --branches --graph&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;브랜치명&lt;/code&gt;을 master 브랜치와 병합&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git merge 브랜치명
   $ git merge 브랜치명 --edit // 병합 후 바로 vi 편집기가 나오면서 커밋 메시지 수정 가능
   $ git merge 브랜치명 --no-edit // 커밋 메시지 수정없이 바로 병합&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;merge 취소하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git merge --abort&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;github 원격 저장소&lt;/h2&gt;
&lt;p&gt;원격 저장소에 연결&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git remote add origin github 레포지 주소
   $ git remote add origin branch 이름 #없으면 생성됨&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격 저장소에 연결됐는지 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git remote -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;지역 저장소의 커밋을 맨 처음 원격 저장소에 올리는 경우&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git push -u origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;윗 줄 동작을 한 후에 지역 저장소의 커밋을 원격 저장소에 올리는 경우(업로드)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git push
   $ git push origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격 저장소의 커밋을 지역 저장소로 가져옴&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git pull
   $ git pull origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH 키를 생성함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ ssh-keygen&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격 저장소 복제하기&lt;br&gt;   첫번째 커밋이 아니라면 풀 먼저하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git remote remove origin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   원격 저장소를 &lt;code&gt;지역저장소명&lt;/code&gt;에 복제하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git clone 원격 저장소 주소&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격 저장소의 커밋을 가져오기만 하고 merge하지 않는다&lt;br&gt;   가져온 branch 내용은 origin/&lt;code&gt;브랜치&lt;/code&gt; 로 저장됨&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git fetch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   이후엔 diff 로 비교&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git diff test origin/test # 브랜치 이름이 test일 경우 예시&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;패치로 가져온 정보가 있는 브랜치`FETCH_HEAD`로 이동&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git checkout FETCH_HEAD&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;패치로 가져온 정보가 있는 브랜치&lt;code&gt;FETCH_HEAD&lt;/code&gt;를 master 브랜치에 병합한다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git merge FETCH_HEAD&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;브랜치명&lt;/code&gt;을 만드는 것과 동시에 체크아웃한다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git checkout -b 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격 저장소에 &lt;code&gt;브랜치명&lt;/code&gt;의 브랜치의 커밋을 올린다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git push origin 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원격저장소 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git remote remove origin&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;파일/보관 명령어(stash)&lt;/h2&gt;
&lt;p&gt;파일 내용 출력&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ cat 파일명.확장자명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;디렉토리를 만드는 동시에 지역저장소 생성&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ cd init 디렉토리명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현재 커밋을 다른 브랜치에 있는 &lt;code&gt;커밋메시지&lt;/code&gt; 커밋으로 되돌림&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git reset 커밋메시지 커밋해시&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;병합이 끝난 &lt;code&gt;브랜치명&lt;/code&gt;을 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git branch 브랜치명 -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;작업 트리의 수정 내용 stash에 따로 보관하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash
   $ git stash save&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;보관한 내용을 목록을 출력&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;보관한 내용을 적용&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash apply
   $ git stash apply stash@{1}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;보관한 내용 중 가장 최근 항목을 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash drop
   $ git stash drop stash@{1}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;stash를 apply하고 제거(drop) 하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash pop&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;기타 명령어&lt;/h2&gt;
&lt;p&gt;긴 명령어 짧게 이름 붙여 사용하기&lt;br&gt;   ex) git log --pretty=oneline을&lt;br&gt;   -&amp;gt;git history 라는 별명으로 바꾸기.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git config alias.별명 &amp;#39;원하는 명령어&amp;#39;
   $ git config alias.history &amp;#39;log --pretty=oneline&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tag 설정 하기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git tag 태그이름 커밋 ID
   $ git tag Version_2 86a99 # tag 달기
   $ git tag #tag 조회하기
   $ git show Version_2&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/143</guid>
      <comments>https://coding-plant.tistory.com/143#entry143comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:30:37 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Linux 명령어 모음</title>
      <link>https://coding-plant.tistory.com/142</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;주로 사용하는 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pwd (print working directory)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용자가 위치하고 있는 경로를 출력해줌.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ls (list)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 위치한 디렉토리에 있는 파일과 디렉토리 리스트를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[옵션]&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ ls -l : 파일과 디렉토리에 대한 내용을 구체적으로 출력함
(권한 소유계정 그룹계정 파일크기[Byte] 생성날짜 파일이름)
(== `ll 과 동일`)
$ ls -a : 현재 디렉토리에서 숨김파일을 포함하여 출력함
$ ls -li: ls-l상태에서 inode번호를 함께 출력함
$ ll: ls-l과 동일함
$ ls -alrt: 정렬까지해서 상세하게 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;chmod (change Mode)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 변경&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;$ chomd 664 fileName (ex. chomd 664 note.txt)
$ chmod u+x fileName (ex. chomd u+x note.txt)
u(user), g(group), o(other)를 의미하며 +는 권한부여, -는 권한박탈
(ex. u+x =&amp;gt; 유저에게 execute권한을 부여)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mkdir (make Directory)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리를 생성함&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;$ mkdir dirName&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;touch&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 파일 생성&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ touch fileName&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;rm (remove)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일삭제 명령&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ rm fileName
$ rm -r dirName (-f 옵션이 없으면 directory는 지워지지 않음)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cd (change Directory)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리를 이동함&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;$ cd path&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mv (move)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일, 디렉토리를 이동시키거나 이름을 변경시키는 명령어&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;$ mv file1 file2 (이름변경)
$ mv file1 dir1 (file을 dir로 이동시킴)
$ mv dir1 dir2 (dir1을 dir2 하위로 이동)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cp (copy)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일, 디렉토리를 복사함&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;$ cp file1 copy_file
$ cp -r dir1 copy_dir (-r 옵션이 없으면 directory복사 안됨)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ln (link)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크파일을 생성함&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ ln -s source target (softlink, target은 source를 참조)
$ ln source target (hardlink, 같은 inode번호를 가진다.)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cat&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 내용을 출력함&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ cat FileName (fileName의 내용을 출력)
$ cat FileName | more (내용이 많을경우 좀 더 편하게 볼 수 있음)
$ cat source &amp;gt; target
(출력의 방향을 파일로 변경함, source를 target으로 복사했다고 볼 수 있다. 조심해야 하는점은 만약 target으로 지정한 파일의 이름이 이미 존재하는 경우 그 파일에 source의 내용이 덮어씌워진다.)
$ cat source &amp;gt;&amp;gt; target (source의 내용이 target파일에 append됨)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;head&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 맨 앞에서 몇 라인만을 출력함&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ head fileName&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;option으로 Line수를 지정할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tail&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 맨 아래부분 몇 라인만을 출력함&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ tail fileName
$ tail -f fileName (파일의 마지막에 데이터가 추가되는 즉시 파일의 내용을 출력해줌, 개발 시 로그파일을 볼 때 많이 사용한다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;grep&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하고자 하는 문자를 옵션으로 주면 해당 문자열과 일치하는 파일을 찾아준다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ grep 문자열 파일이름 (ex. grep test *.log)
$ grep -H 문자열 파일이름 (어떤 파일인지를 함께 출력해줌)
$ grep -w 문자열 파일이름 (입력한 문자열과 정확히 일치하는 파일만을 출력)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;less&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 열고 내용을 볼 수 있는 TextViewer기능을 가진다.&lt;br /&gt;&lt;br /&gt;목적도 용도가 vi와는 다르기 때문에 별도로 알아야 할 필요가 있다.&lt;br /&gt;&lt;br /&gt;1GB정도 되는 로그파일을 vi로 열게되면 1GB가 모두 메모리에 올라가고, 네트워트 트래픽 또한 1GB만큼 발생하게 된다. &lt;br /&gt;&lt;br /&gt;하지만 less명령어를 이용하여 열면 화면에 보이는만큼만 메모리에 올라간다. 즉, 용량이 큰 로그파일을 열때는 less명령어를 사용하는 것이 좋다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;System 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tar&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축관련 명령어&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;tar cvfz target.tar.gz source1 source2
(source1, source2를 target으로 압축한다. 현재 디렉토리를 모두 압축하고 싶은경우에는 *를 사용한다.)

cvfz중 c가 create를 의미한다는 정도만 알아두어도 된다.

tar.gz는 tar(파일과 디렉토리를 한 묶음으로 만듬)라는 명령어를 이용하여 gzip으로 압축한다는 의미이다.

tar xvfz source.tar.gz

xvfz중 x는 extract를 의미하며 압축을 해제할 때 사용한다.

압축과 압축해제는 옵션까지 한 묶음으로 숙지하는것이 좋다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;sudo&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한을 사용할 수 있는 명령어&lt;br /&gt;root계정으로 접속하여 etc/sudoers(CentOS 7기준)파일에서 계정에 권한을 주어야 함.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ sudo ~~&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;chown (change Owner)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 또는 디렉토리의 소유자, 그룹명을 변경하는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소유권을 뺏을수도 있는것이기 때문에 관리자 권한이 필요하다. (sudo)&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;$ chown user: group(or user) target&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;find&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이나 디렉토리를 찾을 때 사용하는 명령어이다. 검색조건이 매우 다양함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;find 경로 조건 target&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;$ find / -name system.log
$ find / -name debug.log* //뒤에 * 을 붙이면 해당 이름이 포함된 전체를 조회&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;which&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어의 위치를 조회하는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;which 찾을명령어&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;$ which ls =&amp;gt; /bin/ls&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;top&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영중인 서버의 CPU, Memory등의 상태를 확인하는 명령어&lt;br /&gt;&lt;br /&gt;상단에는 CPU사용률과 메모리 사용률을 표시한다.&lt;br /&gt;&lt;br /&gt;하단에는 프로세스 별 CPU사용률과 메모리 사용률을 표시한다.&lt;br /&gt;&lt;br /&gt;갱신하는 주기는 default 3초이다.&lt;br /&gt;&lt;br /&gt;매 초마다 갱신하고 싶다면 화면에서 d를 누르고 1을 입력하거나 top명령어를 실행할 때 top -d 1처럼 옵션을 입력하여 실행해도 된다.&lt;br /&gt;&lt;br /&gt;실행화면에서 h를 누르면 사용할 수 있는 명령어가 나온다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;w&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 리눅스 장비에 접속한 사용자가 누구인지 조회하는 명령어&lt;br /&gt;&lt;br /&gt;사용자 아이디, 접속한 시간, IP, CPU사용률, 어떤 작업을 수행중인지 출력한다.&lt;br /&gt;&lt;br /&gt;간단하게 보고싶으면 who명령어를 사용하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ping&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 설정이 잘 되어 있는지 알아보는 경우에 많이 사용함&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ ping domain(or IP) (ex. ping google.com)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nslookup !!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain을 이용하여 IP를 알아낼 때 사용하는 명령어&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ nslookup domain&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ps (process status)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 구동중인 모든 프로세스 정보를 조회할 때 사용하는 명령어&lt;br /&gt;&lt;br /&gt;너무많은 정보를 보여주기 때문에 주로 옵션과 함께 사용한다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ ps -ef |grep apache (프로세스 중 apache가 들어간 것을 조회)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PID는 각 프로세스마다 할당되는 유니크한 번호이다.&lt;br /&gt;&lt;br /&gt;PID오른쪽에는 해당 프로세스의 부모 프로세스 PID를 나타낸다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;kill&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 종료하는 경우 사용하는 명령어&lt;br /&gt;&lt;br /&gt;PID를 이용하여 종료시킨다.&lt;br /&gt;&lt;br /&gt;kill은 관리자 권한이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ kill -9 PID (-9옵션을 주면 강제종료 한다.)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;df&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 시스템 디스크 사용량을 조회하는 명령어&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187123318-93ea29b6-3144-4e74-a22a-9b37e2a5a76f.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션들&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187123331-54dcc4af-2369-43b2-a93e-a3c5956cab26.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 &lt;code&gt;df -h&lt;/code&gt; 가 가장 많이 사용된다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ df -h&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;du&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;df 명령어가 시스템 전체의 디스크 공간을 확인하는 명령어라면, du 명령은 특정 디렉토리를 기준으로 디스크 사용량을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187123349-2c151b89-eb81-48c9-b906-9b1941388542.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리 안에 있는 서브 디렉토리의 디스크 사용량도 표시함.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ du -h&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;man&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어에 대한 메뉴얼을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;man 3 sleep처럼 3을 옵션으로 주면 프로그래밍에 대한 메뉴얼도 제공받을 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;adduser&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 사용자를 추가하는 경우에 사용하는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한이 필요한 명령어&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;$ adduser 사용자ID&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;su&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자를 변경할 때 사용하는 명령어&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ su - (root계정 접속)
$ su -l userID (해당 userID로 접속)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;deluser&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자를 삭제하는 경우에 사용하는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한이 필요한 명령어&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ deluser 사용자ID&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;권한&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ls -l&lt;/code&gt;을 이용하여 디렉토리 정보를 출력하면 맨 앞쪽에 &lt;code&gt;drwxrwxrwx&lt;/code&gt;처럼 권한에 대한 내용이 출력된다.&lt;br /&gt;&lt;br /&gt;가장 먼저 나오는 알파벳은 파일의 유형을 의미하며 d, l, -로 나뉘고 각각 directory, link, file을 의미한다.&lt;br /&gt;&lt;br /&gt;권한정보인 rwx는 각각 read write execute를 의미한다.&lt;br /&gt;&lt;br /&gt;예를들어 --x권한을 가지고 있다면 읽거나 쓰지는 못하고 실행만 할 수 있다.&lt;br /&gt;&lt;br /&gt;권한정보는 rwx(User 권한) rwx(Group 권한) rwx(Other 권한)처럼 3자리씩 끊어서 하나의 세트로 볼 수 있다.&lt;br /&gt;&lt;br /&gt;또한 rwx를 숫자로 표현하면 421로 표현할 수 있다 (이진수 표기법)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;경로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ : 절대위치 기준 경로 (root가 시작점)&lt;br /&gt;&lt;br /&gt;./ : 현재위치 기준 경로 (현재 디렉토리가 시작점, 생략가능)&lt;br /&gt;&lt;br /&gt;../ : 현재 위치의 상위 기준 (root/home 이라면 ../는 root임)&lt;br /&gt;&lt;br /&gt;~/ : Home 위치 기준&lt;/p&gt;</description>
      <category>개발</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/142</guid>
      <comments>https://coding-plant.tistory.com/142#entry142comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:28:49 +0900</pubDate>
    </item>
    <item>
      <title>[블로그] Github 블로그 검색엔진에 등록 (구글/네이버/다음)</title>
      <link>https://coding-plant.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리나라에서 검색량이 많은 구글, 네이버, 다음에 등록을 해보려 한다. 각 포털사이트별로 검색엔진에 등록방법을 구글링을 해본 결과들을 정리해보려고 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;sitemap.xml 생성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 검색엔진에서 GitHub 블로그의 글들을 긁어올 수 있도록, 사이트의 모든 페이지 정보를 모아두는 &lt;code&gt;sitemap.xml&lt;/code&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;&lt;a href=&quot;https://github.com/yuuisang/yuuisang.github.io/blob/main/sitemap.xml&quot;&gt;사이트맵 코드 링크 이동&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크의 코드를 복사해서 루트 디렉토리에 sitemap.xml 파일을 만들고 &lt;code&gt;깃에 push&lt;/code&gt; 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드 후, https://본인블로그주소/sitemap.xml 에 접속해서 내 블로그의 모든 페이지 주소를 정상적으로 출력하는지 확인되면 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187135859-3a8241be-aee9-4e87-b652-873c3a49f3a0.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;robots.txt 생성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 사이트를 검색엔진에 등록하면 구글 검색 엔진의 크롤러가 내 사이트에 방문하여 정보를 가져간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 크롤러가 방문했을 때 참고할 수 있는 정책을 명시해주면 좋다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;User-agent: *
Allow: /
Sitemap: https://yuuisang.github.io/sitemap.xml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 복붙해서 robots.xml 파일을 만들고, 루트디렉토리에 추가하면 됨.&lt;br /&gt;참고로 깃허브 주소는 본인껄로 변경해야함!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;feed.xml 생성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 필수는 아닌데 RSS Feed로도 등록될 수 있도록 feed.xml 까지 만들어본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/yuuisang/yuuisang.github.io/blob/main/feed.xml&quot;&gt;feed.xml 코드 링크 이동&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크내의 코드를 복사해서 feed.xml 파일을 만들고 &lt;code&gt;루트디렉토리&lt;/code&gt;에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기까지 등록 전 준비단계는 전부 끝났다.&lt;br /&gt;이제 각 포털사이트에 등록하러 가보자!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구글서치콘솔 등록&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://search.google.com/search-console?resource_id=https%3A%2F%2Fyuuisang.github.io%2F&amp;amp;hl=ko&quot;&gt;구글 웹마스터 도구&lt;/a&gt; 접속 -&amp;gt; &lt;code&gt;URL 접두어&lt;/code&gt; 탭으로 이동 -&amp;gt; 등록하고자하는 사이트의 &lt;code&gt;URL 입력&lt;/code&gt; -&amp;gt; 계속 버튼 클릭&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187135899-95aff5c2-671e-4fee-a62e-1638693fabee.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;본인의 url을 등록해야 한다. 방법은 여러가지 있는데 HTML 파일을 직접 저장시키는게 가장 권장사항이다.&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187135957-4c46cbf7-bd86-4916-913a-eaab4a3e40ff.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;이 파일을 깃허브 디렉토리 내 루트에 저장!&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187135983-5663ccdb-093f-4378-b8ff-0ce03d92bdb4.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136000-707fcaea-9ce2-44b1-b227-af7fe1fe3c88.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; start=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기까지 됐으면 좌측 메뉴에서 Sitemaps 을 클릭 -&amp;gt; 새 사이트맵 추가 에 https://본인깃허브주소/sitemap.xml 을 입력 -&amp;gt; 제출 버튼 클릭&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136026-6c3346d6-6b8f-47c0-bdb4-a5d31b316cd7.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;위 이미지처럼 뜨면 성공이다.&lt;/li&gt;
&lt;/ol&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네이버 서치어드바이저&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://searchadvisor.naver.com/&quot;&gt;네이버 서치어드바이저&lt;/a&gt; 에 접속.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;웹 마스터 도구&lt;/code&gt; -&amp;gt; &lt;code&gt;사이트 관리&lt;/code&gt; -&amp;gt; &lt;code&gt;사이트 등록 페이지&lt;/code&gt;로 이동한다.&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136054-d87bdf3a-2868-44fb-8ca7-7e408d348056.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;URL을 입력한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;사이트 소유확인 페이지&lt;/code&gt;에서 &lt;code&gt;HTML 파일 업로드&lt;/code&gt; 를 선택한다.&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136078-c325a160-fd32-4d43-9dd4-5b9ebec0abd6.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HTML 확인 파일&lt;/code&gt; 을 클릭하여 다운로드 한다.&lt;/li&gt;
&lt;li&gt;등록하고자하는 깃허브의 루트 디렉토리에 해당 파일을 업로드한다.&lt;/li&gt;
&lt;li&gt;가이드 되어있는 링크를 클릭하여 제대로 업로드 되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;소유확인 버튼&lt;/code&gt;을 누른 후 아래와 같은 팝업이 뜨는지 확인한다.&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136101-55ecbdc0-cad2-4f4b-a2a2-b4ff48db2f3c.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 확인파일을 찾을수 없거나, 네이버 검색로봇 사이트 서버에 접근할 수 없습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; start=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 문구가 뜬다면 하루 정도 기다렸다가 다시 진행해보면 되는 경우가 많다.&lt;/li&gt;
&lt;li&gt;정상적으로 마무리가 되었다면 목록에 이렇게 뜬다.&lt;br /&gt;
&lt;div&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136135-32e36a14-4cce-4fd3-b2dc-eb082321c22a.png&quot; alt=&quot;image&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이제 &lt;code&gt;사이트맵&lt;/code&gt; 을 제출해 보자!&lt;br /&gt;(구글과 동일하게 제출만 하면 된다.)&lt;/li&gt;
&lt;li&gt;등록된 블로그 링크를 클릭하여 &lt;code&gt;사이트 관리&lt;/code&gt; 페이지로 들어간다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;요청&lt;/code&gt; -&amp;gt; &lt;code&gt;사이트맵 제출&lt;/code&gt; 메뉴로 들어간다.&lt;/li&gt;
&lt;li&gt;아까 만들어서 내 깃허브에 업로드했던 &lt;code&gt;sitemap.xml&lt;/code&gt; 의 주소를 다음과 같이 입력하고 &lt;code&gt;확인&lt;/code&gt; 버튼을 누른다.&lt;br /&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136178-946c22e2-ce3a-4e8d-b048-e687554d4a5e.png&quot; alt=&quot;image&quot; /&gt;&lt;/li&gt;
&lt;li&gt;잘 되었는지 확인해 본다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다음&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://register.search.daum.net/index.daum&quot;&gt;다음 검색등록&lt;/a&gt; 에 접속한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;블로그 등록&lt;/code&gt; 을 클릭하고 &lt;code&gt;블로그 URL&lt;/code&gt;을 넣고 &lt;code&gt;확인&lt;/code&gt; 을 클릭하면 끝!&lt;br /&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136232-6b795b1d-2669-4913-951c-914a0ff3491a.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136289-be20981e-6404-4096-92b6-29f0c869d434.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/58925978/187136312-e92bad6c-d1b7-4ce6-a6c2-492e8056e42f.png&quot; alt=&quot;image&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;앞서 두 구글,네이버 사이트에 비해 엄청 간단하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SEO 검색 엔진 최적화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tech.songyunseop.com/post/2016/09/seo-for-blog/&quot;&gt;https://tech.songyunseop.com/post/2016/09/seo-for-blog/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이분 포스트를 보면서 차차 진행해 볼 예정이다.&lt;/p&gt;</description>
      <category>블로그</category>
      <category>SEO</category>
      <category>검색엔진</category>
      <category>구글서치콘솔</category>
      <category>네이버서치어드바이저</category>
      <category>블로그 검색 유입</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/141</guid>
      <comments>https://coding-plant.tistory.com/141#entry141comment</comments>
      <pubDate>Fri, 2 Sep 2022 09:25:18 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] input 태그 총 정리</title>
      <link>https://coding-plant.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;input&amp;gt; 태그는 &lt;u&gt;사용자로부터 값을 입력받을 수 있는 대화형 컨트롤(=필드)&lt;/u&gt;를 나타낸다. 기본적으로 인라인 요소이고, 닫는 태그가 없는 단일태그이다. &amp;lt;input&amp;gt; 태그는 type 속성을 통해 입력받는 요소의 데이터 유형이 달라진다. 사용가능한 type 은 20여 가지이며, 기본값은 text 이다.&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;h2 data-ke-size=&quot;size26&quot;&gt;다양한 type&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;text&lt;/h3&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-origin-width=&quot;217&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rfHcx/btrIXBXJvDw/9oWh2Dq44DuP01PL28mVxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rfHcx/btrIXBXJvDw/9oWh2Dq44DuP01PL28mVxK/img.png&quot; data-alt=&quot;text type(default)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rfHcx/btrIXBXJvDw/9oWh2Dq44DuP01PL28mVxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrfHcx%2FbtrIXBXJvDw%2F9oWh2Dq44DuP01PL28mVxK%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;217&quot; height=&quot;123&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;text type(default)&lt;/figcaption&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;password&lt;/h3&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-origin-width=&quot;215&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FXMSP/btrIYmTHINb/XwkoyiE4Fnc5hpiMGDlQfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FXMSP/btrIYmTHINb/XwkoyiE4Fnc5hpiMGDlQfK/img.png&quot; data-alt=&quot;password type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FXMSP/btrIYmTHINb/XwkoyiE4Fnc5hpiMGDlQfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFXMSP%2FbtrIYmTHINb%2FXwkoyiE4Fnc5hpiMGDlQfK%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;215&quot; height=&quot;120&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;password type&lt;/figcaption&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;radio&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 name 값&lt;/b&gt;을 가진 여러개의 선택중에서 하나의 값을 선택하게 하는 라디오 버튼&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA8IhU/btrI0et8zVT/rs3HZvAdoyr0HkGWLhZzSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA8IhU/btrI0et8zVT/rs3HZvAdoyr0HkGWLhZzSK/img.png&quot; data-alt=&quot;radio type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA8IhU/btrI0et8zVT/rs3HZvAdoyr0HkGWLhZzSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA8IhU%2FbtrI0et8zVT%2Frs3HZvAdoyr0HkGWLhZzSK%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;217&quot; height=&quot;120&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;radio type&lt;/figcaption&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;submit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;form&amp;gt; ~ &amp;lt;/form&amp;gt; 내에 있는 정보들을 서버로 전달하는 버튼&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVU0P/btrIWN5Cc6z/jhqeLqyXKzLmyuhz3r8SJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVU0P/btrIWN5Cc6z/jhqeLqyXKzLmyuhz3r8SJ1/img.png&quot; data-alt=&quot;submit type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVU0P/btrIWN5Cc6z/jhqeLqyXKzLmyuhz3r8SJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVU0P%2FbtrIWN5Cc6z%2FjhqeLqyXKzLmyuhz3r8SJ1%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;216&quot; height=&quot;82&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;submit type&lt;/figcaption&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;range&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 가려진 숫자를 입력하는 컨트롤. 디폴트 값이 중간값인 범위 위젯으로 표시하고, 접속사 min 와 max 사이에 사용되며 수용가능한 값의 범위를 정의한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMgLKy/btrI1VU7Jek/wt2l0P8kk97ucZ67LjFOr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMgLKy/btrI1VU7Jek/wt2l0P8kk97ucZ67LjFOr1/img.png&quot; data-alt=&quot;range type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMgLKy/btrI1VU7Jek/wt2l0P8kk97ucZ67LjFOr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMgLKy%2FbtrI1VU7Jek%2Fwt2l0P8kk97ucZ67LjFOr1%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;217&quot; height=&quot;173&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;range type&lt;/figcaption&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;button&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본&amp;nbsp;행동을&amp;nbsp;가지지&amp;nbsp;않으며&amp;nbsp;value을&amp;nbsp;레이블로&amp;nbsp;사용하는&amp;nbsp;푸시&amp;nbsp;버튼.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wBtg1/btrI1h49bXZ/NjSkeCiJ4VH8kvKJNGnfsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wBtg1/btrI1h49bXZ/NjSkeCiJ4VH8kvKJNGnfsk/img.png&quot; data-alt=&quot;button type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wBtg1/btrI1h49bXZ/NjSkeCiJ4VH8kvKJNGnfsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwBtg1%2FbtrI1h49bXZ%2FNjSkeCiJ4VH8kvKJNGnfsk%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;216&quot; height=&quot;84&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;button type&lt;/figcaption&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;checkbox&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erCEQY/btrI1jonj4A/QbnGSJ7UmU63eD2l1M16YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erCEQY/btrI1jonj4A/QbnGSJ7UmU63eD2l1M16YK/img.png&quot; data-alt=&quot;checkbox type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erCEQY/btrI1jonj4A/QbnGSJ7UmU63eD2l1M16YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerCEQY%2FbtrI1jonj4A%2FQbnGSJ7UmU63eD2l1M16YK%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;213&quot; height=&quot;83&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;checkbox type&lt;/figcaption&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;date&lt;/h3&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-origin-width=&quot;218&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oaCl1/btrIT9HV8Fc/VTTIRBBSMkeLFKxFXL2APK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oaCl1/btrIT9HV8Fc/VTTIRBBSMkeLFKxFXL2APK/img.png&quot; data-alt=&quot;date 기본형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oaCl1/btrIT9HV8Fc/VTTIRBBSMkeLFKxFXL2APK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoaCl1%2FbtrIT9HV8Fc%2FVTTIRBBSMkeLFKxFXL2APK%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;218&quot; height=&quot;100&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;date 기본형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvBkva/btrIVgmDyKx/ED8HPp5vLhLXJebKeLW83k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvBkva/btrIVgmDyKx/ED8HPp5vLhLXJebKeLW83k/img.png&quot; data-alt=&quot;달력 클릭시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvBkva/btrIVgmDyKx/ED8HPp5vLhLXJebKeLW83k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvBkva%2FbtrIVgmDyKx%2FED8HPp5vLhLXJebKeLW83k%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;238&quot; height=&quot;327&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;달력 클릭시&lt;/figcaption&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;file&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 지정할 수 있는 컨트롤. accept 특성을 사용하면 허용하는 파일 유형을 지정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/60dQ2/btrIXwib3SF/XDgOcEw5oLIjAo97q1Wdo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/60dQ2/btrIXwib3SF/XDgOcEw5oLIjAo97q1Wdo1/img.png&quot; data-alt=&quot;file 기본형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/60dQ2/btrIXwib3SF/XDgOcEw5oLIjAo97q1Wdo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F60dQ2%2FbtrIXwib3SF%2FXDgOcEw5oLIjAo97q1Wdo1%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;216&quot; height=&quot;99&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;file 기본형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xL7Vs/btrITm1jI15/xost4GJZ2gMVkcl0zYwBoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xL7Vs/btrITm1jI15/xost4GJZ2gMVkcl0zYwBoK/img.png&quot; data-alt=&quot;파일 선택 클릭시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xL7Vs/btrITm1jI15/xost4GJZ2gMVkcl0zYwBoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxL7Vs%2FbtrITm1jI15%2Fxost4GJZ2gMVkcl0zYwBoK%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;530&quot; height=&quot;289&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 선택 클릭시&lt;/figcaption&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;hidden&lt;/h3&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-origin-width=&quot;219&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOaWf7/btrI1Vt1NT0/21tKAbNH4d0gcdyBUtNsC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOaWf7/btrI1Vt1NT0/21tKAbNH4d0gcdyBUtNsC0/img.png&quot; data-alt=&quot;hidden type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOaWf7/btrI1Vt1NT0/21tKAbNH4d0gcdyBUtNsC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOaWf7%2FbtrI1Vt1NT0%2F21tKAbNH4d0gcdyBUtNsC0%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;219&quot; height=&quot;77&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hidden type&lt;/figcaption&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;image&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 특성에 지정한 이미지로 나타나는 시각적 제출 버튼. &amp;lt;img&amp;gt; 태그와 동일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dy9VZ/btrIYnyhVwG/26sH9WKbyDhzlZpaiceKR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dy9VZ/btrIYnyhVwG/26sH9WKbyDhzlZpaiceKR0/img.png&quot; data-alt=&quot;image type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dy9VZ/btrIYnyhVwG/26sH9WKbyDhzlZpaiceKR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDy9VZ%2FbtrIYnyhVwG%2F26sH9WKbyDhzlZpaiceKR0%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;215&quot; height=&quot;100&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;image type&lt;/figcaption&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;&lt;s&gt;이 외에도 몇개 더 있지만 딱히 중요한 것은 없다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;name 지정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;radio&lt;/b&gt;&amp;nbsp;타입에서는 반드시 name 지정 필수!&lt;/p&gt;
&lt;pre id=&quot;code_1659674636905&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;radio&quot; name=&quot;age&quot; value=&quot;1&quot;&amp;gt;1
&amp;lt;input type=&quot;radio&quot; name=&quot;age&quot; value=&quot;2&quot;&amp;gt;2
&amp;lt;input type=&quot;radio&quot; name=&quot;age&quot; value=&quot;3&quot;&amp;gt;3
&amp;lt;input type=&quot;radio&quot; name=&quot;age&quot; value=&quot;4&quot;&amp;gt;4&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;h2 data-ke-size=&quot;size26&quot;&gt;다양한 전역 속성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;input&amp;gt; 요소&lt;/b&gt;는 전역 속성(Global Attributes)과 다음 특성을 포함한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;유형&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefaccept&quot;&gt;accept&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;file&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;파일을 업로드 컨트롤에서 기대하는 파일 유형을 암시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefalt&quot;&gt;alt&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;이미지 유형에 대한 대체 속성. accessibiltiy 측면에서 필요.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefautocomplete&quot;&gt;autocomplete&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 자동생성 기능 (form autofill) 암시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefautofocus&quot;&gt;autofocus&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;페이지가 로딩될때 양식 제어에 오토포커스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefcapture&quot;&gt;capture&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;file&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;파일 업로드 제어에서 input 방식에서 미디어 capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefchecked&quot;&gt;checked&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;radio, checkbox&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;커맨드나 컨트롤이 체크 되었는지의 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefdirname&quot;&gt;dirname&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;text, search&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 전송시 요소의 방향성을 전송할 때 양식 필드의 Name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefdisabled&quot;&gt;disabled&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 컨트롤이 비활성화되었는지의 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefform&quot;&gt;form&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;컨트롤을 양식 요소와 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefformaction&quot;&gt;formaction&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image, submit&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 전송시 URL 사용하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefformenctype&quot;&gt;formenctype&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image, submit&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식의 데이터 인코딩 유형이 양식 전송시 사용될 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefformmethod&quot;&gt;formmethod&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image, submit&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 전송시 HTTP 방식을 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefformnovalidate&quot;&gt;formnovalidate&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image, submit&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 전송시 양식 컨트롤 확인을 무시하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefformtarget&quot;&gt;formtarget&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image, submit&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 전송시 브라우징 맥락&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefheight&quot;&gt;height&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;이미지 높이에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;height&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성과 같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdeflist&quot;&gt;list&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;almost all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;datalist 자동입력 옵션의 id 속성값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefmax&quot;&gt;max&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;numeric types&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;최대값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefmaxlength&quot;&gt;maxlength&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;password, search, tel, text, url&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;value의 최대 길이 (문자수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefmin&quot;&gt;min&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;numeric types&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;최소값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefminlength&quot;&gt;minlength&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;password, search, tel, text, url&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;value의 최소 길이 (문자수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefmultiple&quot;&gt;multiple&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;email, file&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;불리언값. 여러 값을 허용할지의 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefname&quot;&gt;name&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;input 양식 컨트롤의 이름. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefpattern&quot;&gt;pattern&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;password, text, tel&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;value&lt;span&gt;&amp;nbsp;&lt;/span&gt;가 유효하기 위해 일치해야 하는 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefplaceholder&quot;&gt;placeholder&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;password, search, tel, text, url&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 컨트롤이 비어있는 때 양식 컨트롤에 나타나는 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/readonly&quot;&gt;readonly&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;almost all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;불리언값. 이 값은 수정이 불가능함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/required&quot;&gt;required&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;almost all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;불리언값. 양식이 전송되기 위해서 반드시 입력하거나 확인이 필요한 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefsize&quot;&gt;size&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;email, password, tel, text&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;컨트롤의 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefsrc&quot;&gt;src&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;이미지 출처의 주소에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;src&lt;span&gt;&amp;nbsp;&lt;/span&gt;와 같은 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefstep&quot;&gt;step&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;numeric types&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;유효한 증분적인 (Incremental)값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdeftype&quot;&gt;type&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;input 양식 컨트롤의 유형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefvalue&quot;&gt;value&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;all&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;양식 컨트롤의 현재 값. 이름/값 짝(name/value pair)의 일부로서 양식과 함께 전송된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.3489%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#htmlattrdefwidth&quot;&gt;width&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;image&lt;/td&gt;
&lt;td style=&quot;width: 60.6976%;&quot;&gt;이미지의&lt;span&gt;&amp;nbsp;&lt;/span&gt;width&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성과 같다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <category>HTML</category>
      <category>input</category>
      <category>tag</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/138</guid>
      <comments>https://coding-plant.tistory.com/138#entry138comment</comments>
      <pubDate>Fri, 5 Aug 2022 14:05:39 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] ul, ol, li 태그(목록, 리스트 나열)</title>
      <link>https://coding-plant.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 에서는 크게 순서가 있는 리스트, 순서가 없는 리스트 2가지로 나누는데, 순서가 없는 리스트는 Unordered List 의 약어인 &lt;b&gt;&amp;lt;ul&amp;gt; 태그&lt;/b&gt;를 사용하고 순서가 있는 리스트는 Ordered List 의 약어인 &lt;b&gt;&amp;lt;ol&amp;gt; 태그&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;ol&amp;gt;&amp;lt;/ol&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서의 여부를 통해 &amp;lt;ul&amp;gt; 과 &amp;lt;ol&amp;gt; 중에 필요한 것을 정하면 이제 그 안에 리스트 항목들을 채워넣어야 하는데 안에 들어가는 항목은 공통으로 &lt;b&gt;&amp;lt;li&amp;gt; 태그&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시) ul&lt;/h2&gt;
&lt;pre id=&quot;code_1659673154447&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;순서가&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;없는&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;리스트&amp;lt;/li&amp;gt;
&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예시) ol&lt;/h2&gt;
&lt;pre id=&quot;code_1659673212691&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ol&amp;gt;
	&amp;lt;li&amp;gt;순서1&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;순서2&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;순서3&amp;lt;/li&amp;gt;
&amp;lt;ol&amp;gt;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/137</guid>
      <comments>https://coding-plant.tistory.com/137#entry137comment</comments>
      <pubDate>Fri, 5 Aug 2022 13:22:21 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] 하이퍼링크 a 태그</title>
      <link>https://coding-plant.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a&amp;gt; 태그는 anchor의 약어로 닻을 의미한다. &amp;lt;a&amp;gt; 태그는 &lt;u&gt;href 속성을 통해 다른 페이지, 전화번호, 이메일주소 와 그 외에 다른 url로 연결할 수 있는 링크(연결)을 만든다&lt;/u&gt;. 인라인 요소이고, 콘텐츠는 주로 링크의 목적지를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;a&amp;gt; 태그의 대표 속성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;href&lt;/b&gt; : 연결하고 싶은 주소를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;target&lt;/b&gt; : 링크를 클릭했을 때 창의 형태를 지정한다.(총 4가지)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;_blank : 새창에서 열기&lt;/li&gt;
&lt;li&gt;_self : 현재 탭에서 열기(기본값)&lt;/li&gt;
&lt;li&gt;_top :&amp;nbsp;&lt;/li&gt;
&lt;li&gt;_bottom&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;title&amp;nbsp;&lt;/b&gt;:&amp;nbsp;링크에&amp;nbsp;대한&amp;nbsp;설명이&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;h2 data-ke-size=&quot;size26&quot;&gt;href 속성의 다양한 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a 태그의 href에는 웹 문서의 주소 뿐만 아니라 전화번호나 메일주소 등을 지정할 수도 있다. 이때 각 유형별로 필요한 추가 텍스트가 있다.&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. 전화번호&lt;/h3&gt;
&lt;pre id=&quot;code_1659661467591&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;tel:010-1234-5678&quot; target=&quot;_self&quot;&amp;gt;
	전화 걸기
&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 메일쓰기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mailto:&lt;/b&gt; 를 실제 메일주소앞에 붙여야함&lt;/p&gt;
&lt;pre id=&quot;code_1659661729808&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;mailto:clothes.yoo@gmail.com&quot; target=&quot;_blank&quot;&amp;gt;
	메일 쓰기
&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <category>a태그</category>
      <category>HTML</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/136</guid>
      <comments>https://coding-plant.tistory.com/136#entry136comment</comments>
      <pubDate>Fri, 5 Aug 2022 10:10:35 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] 컨테이너 태그(div, span) - 시멘틱 구조</title>
      <link>https://coding-plant.tistory.com/135</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;콘텐츠나 레이아웃에 아무런 영향도 주지 않고, 여러 요소들을 하나로 묶어 관리하기 편하게하는 태그를 &lt;b&gt;컨테이너 태그&lt;/b&gt;라고 한다. 콘텐츠 내용을 구분하거나, 특정 영역마다 공통적인 스타일(css)를 적용하고자 할 때 개발자는 컨테이너태그를 사용하는 것이 좋다.&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;시멘틱(Semantic) 태그&lt;/b&gt;와 &lt;b&gt;논-시멘틱(non-Semantic) 태그&lt;/b&gt;로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시멘틱(Semantic) 태그&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MnLig/btrIPX8tnDS/WYOksovcnn9BEBN5TsvmNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MnLig/btrIPX8tnDS/WYOksovcnn9BEBN5TsvmNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MnLig/btrIPX8tnDS/WYOksovcnn9BEBN5TsvmNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnLig%2FbtrIPX8tnDS%2FWYOksovcnn9BEBN5TsvmNk%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;589&quot; height=&quot;454&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시멘틱 태그란 &lt;u&gt;브라우저, 개발자와 사용자에게 태그에 종속되어있는 내용을 직설적으로 알려주는 태그이다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그의 종류로는 header, nav, section, article, aside, footer 가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;header&lt;/b&gt; : 전체 사이트의 헤더, article에 관련된 헤더이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nav&lt;/b&gt; : 로그인, 목차 네비게이터 등으로 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;section&lt;/b&gt; : 뉴스헤드라인, 컨텐츠 분류, 본문바디에서 구간을 나눌 때, 본문안에서 본문끼리의 그룹을 지을 때 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;article&lt;/b&gt; : 페이지의 주요 내용정보를 담을 때 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;aside&lt;/b&gt; : 분몬 내용을 서포트 할 때 사용, aside가 어디에 포함되냐에 따라 사용 용도가 다르다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;article 내 aside :&lt;/b&gt; article에 종속되어있는 내용을 서포트해주는 정보를 담을 때 사용, 사용검색엔진이 스캐닝을 할때 article에 관련된 aside인지 알수있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 aside :&lt;/b&gt; 사이트 전체의 해당 되는 내용을 서포트 할 수 잇는 정보를 담은 aside, 간단한 네비 넣을 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;footer&lt;/b&gt; : 회사소개, 저작권 약관등의 정보를 넣음&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;논-시멘틱(non-Semantic) 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무런 의미가 부여되지 않는 태그이다. 스타일(css)을 주거나, 서버에서 데이터를 받아서 그룹형 컨테이너(혹은 모듈)로 manipulate를 해야할 때 컨테이너형 태그를 사용한다. 논 시멘틱 태그는 div 와 span 이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;div&amp;gt; 와 &amp;lt;span&amp;gt; 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;div&amp;gt;&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;박스 형태로 영역이 설정되고 그 안에 정렬된다.&lt;/li&gt;
&lt;li&gt;width, height 크기 지정이 가능함.&lt;/li&gt;
&lt;li&gt;자동으로 줄바꿈이 된다.&lt;/li&gt;
&lt;li&gt;margin 속성이 4방향 모두 적용이 되며 위 아래 겹쳐지는 여백은 상쇄된다. 즉 여백의 크기가 더해서 2배가 되는 것이 아니라 겹쳐지는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;span&amp;gt;&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;span 은 줄 단위로 영역이 설정된다.&lt;/li&gt;
&lt;li&gt;inline 속성을 가지기 때문에 width 와 height 를 속성값으로 정해 줄 수 없다.&lt;/li&gt;
&lt;li&gt;줄바꿈이 되지 않고 옆으로 나열된다.&lt;/li&gt;
&lt;li&gt;margin 속성이 양 옆으로만 적용되며 겹쳐지지 않는다. 가시적으로 더 넓어 보임.&lt;/li&gt;
&lt;/ul&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;</description>
      <category>개발/프론트엔드</category>
      <category>HTML</category>
      <category>tag</category>
      <category>시멘틱구조</category>
      <category>컨테이너태그</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/135</guid>
      <comments>https://coding-plant.tistory.com/135#entry135comment</comments>
      <pubDate>Thu, 4 Aug 2022 15:04:08 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] 이미지(img) 태그</title>
      <link>https://coding-plant.tistory.com/134</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;&lt;b&gt;&amp;lt;img&amp;gt;&lt;/b&gt; 태그는 이미지를 표시할 때 일반적으로 사용하는 태그이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;(참고로 이미지를 표시하는 방법에는 표시할 엘리먼트 대상에 background-image 속성으로 정의하는 방법도 있다.)&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 태그로서 닫는 &amp;lt;/&amp;gt; 태그를 필요로 하지 않는다. 콘텐츠를 적어주는 대신 표시할 이미지에 대한 정보를 속성으로 지정해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 형태&lt;/h2&gt;
&lt;pre id=&quot;code_1659586716487&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;표시할이미지파일의경로&quot; alt=&quot;이미지 설명&quot; /&amp;gt;&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;lt;img&amp;gt; 태그의 속성들을 확인해보자면 먼저 &lt;b&gt;src 속성&lt;/b&gt;은 표시할 이미지의 경로 정보와 파일명을 입력받는 속성이다. &lt;u&gt;즉 이미지의 url을 입력받는다.&lt;/u&gt; 서버(클라우드)에 위치한 이미지 파일도 가능하고, 내 로컬 PC에 저장된 이미지 파일도 가능하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre id=&quot;code_1659586793908&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 로컬 PC 경로내 이미지 --&amp;gt;
&amp;lt;img src=&quot;./image/tempImg.png&quot; alt=&quot;임시이미지&quot;&amp;gt;

&amp;lt;!-- 특정 서버에 저장된 이미지 --&amp;gt;
&amp;lt;img src=&quot;https://item.kakaocdn.net/do/493188dee481260d5c89790036be0e66effd194bae87d73dd00522794070855d&quot; alt=&quot;클라우드에저장된이미지&quot; &amp;gt;&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;alt 속성&lt;/b&gt;은 alternative의 약자로 대체 텍스트 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;이미지가 로딩되기 전이나 이미지 로딩에 실패한 경우 이미지 대신에 대체할 텍스트&lt;/u&gt;가 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alt는 사용하면 이미지는 볼 수 없는 시각장애인에게 웹 페이지를 서비스해야 하는 상황에 대한 대비가 가능하다.&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;loading 속성&lt;/b&gt;은 &lt;u&gt;페이지 내에서 바로 필요하지 않은 이미지들을 로딩 시점을 뒤로 미루는 것&lt;/u&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;사용하는 이유는 크게 &lt;u&gt;1) 성능향상 2) 비용감소&lt;/u&gt; 가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1659587128406&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;./image/img.png&quot; alt=&quot;대체텍스트&quot; loading=&quot;lazy&quot;&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;이미지 크기 조절하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;img&amp;gt; 태그를 통해 이미지를 표시할 때는 이미지가 표시될 크기를 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 넒이와 높이를 속성으로 각각 지정할 수 있다.&lt;s&gt;(참고로 이 속성을 이용하지 않고 별도의 CSS에서 설정해도 무관하다.)&lt;/s&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;예시&lt;/h3&gt;
&lt;pre id=&quot;code_1659587418143&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;이미지경로&quot; alt=&quot;대체텍스트&quot; width=&quot;넓이값&quot; height=&quot;높이값&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 넓이와 높이는 각각 픽셀(px) 단위로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <category>HTML</category>
      <category>IMG</category>
      <category>이미지태그</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/134</guid>
      <comments>https://coding-plant.tistory.com/134#entry134comment</comments>
      <pubDate>Thu, 4 Aug 2022 13:31:30 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] HTML 텍스트 관련 태그(p, hr, em, strong, u, b, mark, br, &amp;amp;nbsp 등) 사용법</title>
      <link>https://coding-plant.tistory.com/133</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;p&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문단을 표시하는 태그(단락을 구분)&lt;/p&gt;
&lt;pre id=&quot;code_1659573450510&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	&amp;lt;p&amp;gt;단락1 입니다.&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;단락2 입니다.&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;h1&amp;gt;, &amp;lt;h2&amp;gt; ... &amp;lt;h6&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤드라인을 표시하는 태그이며, 숫자가 작을수록 크기가 크다.&lt;/p&gt;
&lt;pre id=&quot;code_1659573555591&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	&amp;lt;h1&amp;gt;제일 큰 제목&amp;lt;/h1&amp;gt;
        &amp;lt;h2&amp;gt;2번째로 큰 제목&amp;lt;/h2&amp;gt;
        &amp;lt;h3&amp;gt;3번째로 큰 제목&amp;lt;/h3&amp;gt;
        &amp;lt;h4&amp;gt;4번째로 큰 제목&amp;lt;/h4&amp;gt;
        &amp;lt;h5&amp;gt;5번째로 큰 제목&amp;lt;/h5&amp;gt;
        &amp;lt;h6&amp;gt;가장 작은 제목&amp;lt;/h6&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;hr&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수평선을 표시하는 태그로 주제 변경이나 내용 구분시에 사용하는 태그이다.&lt;/p&gt;
&lt;pre id=&quot;code_1659573645728&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	&amp;lt;p&amp;gt;첫 단락&amp;lt;/p&amp;gt;
        
        &amp;lt;hr&amp;gt;
        
        &amp;lt;p&amp;gt;두번째 단락&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;br&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;줄바꿈(==Enter) 을 적용해주는 태그이다. &amp;lt;br&amp;gt; 태그 하나당 1줄씩 줄바꿈 처리 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1659573717632&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	첫 줄 내용    
        &amp;lt;br&amp;gt;        
        두번째 줄 내용
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;b&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &amp;lt;b&amp;gt; ~~ &amp;lt;/b&amp;gt; 안의 텍스트에 Bold(강조) 를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659573781624&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	일반 글씨
        
        &amp;lt;br&amp;gt;
        
        &amp;lt;b&amp;gt;강조된 Bold 글씨&amp;lt;/b&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;strong&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &amp;lt;strong&amp;gt; ~~ &amp;lt;/strong&amp;gt; 안의 텍스트를 굵게 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1659574515011&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	일반 텍스트
        
        &amp;lt;br&amp;gt;
        
        &amp;lt;strong&amp;gt;폰트 굵게 적용된 텍스트&amp;lt;/strong&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;u&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &amp;lt;u&amp;gt; ~~ &amp;lt;/u&amp;gt; 안의 텍스트에 언더바( _ ) 를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659574028886&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	일반 내용
        
        &amp;lt;br&amp;gt;
        
        &amp;lt;u&amp;gt;밑줄 쳐진 내용&amp;lt;/u&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;em&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &amp;lt;em&amp;gt; ~~ &amp;lt;/em&amp;gt; 안의 텍스트에 이탈릭체(폰트)를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659574396588&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	일반 텍스트
        
        &amp;lt;br&amp;gt;
        
        &amp;lt;em&amp;gt;이탈릭체 적용 텍스트&amp;lt;/em&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;mark&amp;gt; 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &amp;lt;mark&amp;gt; ~~ &amp;lt;/mark&amp;gt; 안의 텍스트에 형광펜 표시를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659574613595&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	일반 텍스트
        
        &amp;lt;br&amp;gt;
        
        &amp;lt;mark&amp;gt;형광펜 효과 적용 텍스트&amp;lt;/mark&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;amp;nbsp&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그는 아니지만 HTML에서 띄어쓰기(==SpaceBar) 1칸을 의미한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659573886395&quot; class=&quot;dts&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	띄어쓰기전문구 &amp;amp;nbsp 1칸띄어쓰기후문구
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/133</guid>
      <comments>https://coding-plant.tistory.com/133#entry133comment</comments>
      <pubDate>Thu, 4 Aug 2022 09:43:52 +0900</pubDate>
    </item>
    <item>
      <title>[HTML] HTML 개념 및 기본구조</title>
      <link>https://coding-plant.tistory.com/132</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;HTML 은 &lt;b&gt;Hyper Text Markup Language&lt;/b&gt; 의 약자로 하이퍼링크를 통해 특정 웹 페이지에서 다른 페이지로 접근할 수 있는 마크업 언어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTML의 기본 구조&lt;/h2&gt;
&lt;pre id=&quot;code_1659515784775&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    	&amp;lt;meta charset = &quot;utf-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;문서의 제목&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	브라우저 화면에 표시할 부분
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;HTML 은 크게 &lt;b&gt;&amp;lt;head&amp;gt; &amp;lt;/head&amp;gt;&lt;/b&gt; 영역과 &lt;b&gt;&amp;lt;body&amp;gt; &amp;lt;/body&amp;gt;&lt;/b&gt; 영역 총 2가지 영역으로 나누곤 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 생각해서 한 웹 페이지 화면을 나눈다고 생각했을 때 &lt;b&gt;&amp;lt;head&amp;gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;영역은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사람의 머리부분이라고 생각하면 되고, &lt;b&gt;&amp;lt;body&amp;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;b&gt;&amp;lt;head&amp;gt;&lt;/b&gt; 영역은 화면을 구성하는데에는 포함이 되지 않고, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;&amp;lt;body&amp;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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm0HJj/btrIOSLL2Nz/a3nYidu0CUDeOPRFugePA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm0HJj/btrIOSLL2Nz/a3nYidu0CUDeOPRFugePA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm0HJj/btrIOSLL2Nz/a3nYidu0CUDeOPRFugePA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm0HJj%2FbtrIOSLL2Nz%2Fa3nYidu0CUDeOPRFugePA0%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;522&quot; height=&quot;320&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;353&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;h2 data-ke-size=&quot;size26&quot;&gt;HTML의 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 페이지 구조(뼈대)를 만드는 언어이다.&lt;/li&gt;
&lt;li&gt;이미지, 텍스트, 비디오, 버튼 등 웹사이트에 보여줄 내용 구성을 태그를 통해 추가/삭제 할수있다.&lt;/li&gt;
&lt;li&gt;파일유형이 .html 이다.&lt;/li&gt;
&lt;li&gt;일반적인 태그는 시작태그와 끝 태그로 구성되어있다.(예외로 img,br,input 등의 태그들은 끝태그(&amp;lt;/&amp;gt;) 없이 사용 가능)&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;HTML의 구성요소&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 엘리먼트(element) == 태그(tag)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;콘텐츠(요소포함)를 감싸는 태그(tag) 를 지칭함.(요소라고도 함)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeHpu3/btrILdXT0EZ/6MjorXFlYlzKFVuKSkVPAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeHpu3/btrILdXT0EZ/6MjorXFlYlzKFVuKSkVPAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeHpu3/btrILdXT0EZ/6MjorXFlYlzKFVuKSkVPAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeHpu3%2FbtrILdXT0EZ%2F6MjorXFlYlzKFVuKSkVPAK%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;595&quot; height=&quot;234&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;380&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. 어트리뷰트(attribute)&lt;/h3&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-origin-width=&quot;966&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sp2GG/btrIOvcuWqO/XsBpF16Huw7muUBMv0lv3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sp2GG/btrIOvcuWqO/XsBpF16Huw7muUBMv0lv3k/img.png&quot; data-alt=&quot;속성과 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sp2GG/btrIOvcuWqO/XsBpF16Huw7muUBMv0lv3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSp2GG%2FbtrIOvcuWqO%2FXsBpF16Huw7muUBMv0lv3k%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;580&quot; height=&quot;178&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;속성과 값&lt;/figcaption&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;3. 벨류(value)&lt;/h3&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;h2 data-ke-size=&quot;size26&quot;&gt;태그 개념&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서의 첫 부분에서 문서 유형을 지정하는 단일 태그이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 문서 유형이란 웹 브라우저에게 '이 문서는 OO 니까 그렇게 알고 처리해줘' 라는 메시지를 전달하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 은 시간이 지나면서 계속 버전이 업그레이드 되고 있는데 현재 표준으로 사용되고 있는 버전을 사용하기 위해 적어주는 명칭이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;html&lt;/b&gt;&lt;span&gt;&amp;nbsp;&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;&amp;lt;html&amp;gt; ~ &amp;lt;/html&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;head&amp;gt; ~ &amp;lt;/head&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저 화면에 보이진 않지만 웹 브라우저가 알아야 할 정보들은 모두 이 태그에 들어간다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt; : 문자 인코딩 및 문서 키워드 등에 대한 요약 정보를 기입하는 단일 태그이다.&lt;/li&gt;
&lt;li&gt;&amp;lt;title&amp;gt; ~ &amp;lt;/title&amp;gt; : 문서의 제목을 나타낸다. 콘텐츠는 브라우저탭에 표시된다.&lt;/li&gt;
&lt;li&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt; : 해당 웹 페이지에서 사용할 Javascript 정의&lt;/li&gt;
&lt;li&gt;&amp;lt;style&amp;gt; : CSS 파일 내부에서 정의&lt;/li&gt;
&lt;li&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;경로/이름.css&quot;&amp;gt; : CSS 파일 외부에서 정의해서 사용&lt;/li&gt;
&lt;/ul&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;lt;body&amp;gt; ~ &amp;lt;/body&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 브라우저 화면에 표시될 내용을 입력하는 태그이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기엔 다음과 같은 유형의 태그들이 포함될 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 표시 태그&lt;/li&gt;
&lt;li&gt;이미지 표시 태그&lt;/li&gt;
&lt;li&gt;각종 사용자 인터페이스(버튼, 입력란, 드롭다운메뉴, 테이블, 캔버스 등...)를 나타내는 태그&lt;/li&gt;
&lt;/ul&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;</description>
      <category>개발/프론트엔드</category>
      <category>HTML</category>
      <category>개념정리</category>
      <category>웹</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/132</guid>
      <comments>https://coding-plant.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 3 Aug 2022 17:37:48 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Iterator 개념 및 사용법</title>
      <link>https://coding-plant.tistory.com/128</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Iterator&lt;span&gt;&amp;nbsp;란&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterator 는 자바에서 Collection 객체의 값을 가져오거나 조작할 때 사용하는 인터페이스 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collection 객체는 대표적으로 &lt;b&gt;List&lt;/b&gt;, &lt;b&gt;Set&lt;/b&gt;, &lt;b&gt;map&lt;/b&gt;, &lt;b&gt;Queue&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;Iterator의 &lt;b&gt;장점&lt;/b&gt;으로는 모든 컬렉션 프레임워크에 공통으로 사용 가능이 가능하기 때문에 코드 개발 및 유지보수에 용이하다.&lt;/p&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;또한 대량의 데이터를 제어하려고 하면 성능이 떨어진다.&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;h2 data-ke-size=&quot;size26&quot;&gt;코드 예시&lt;/h2&gt;
&lt;pre id=&quot;code_1658124046088&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JSONObject jsonObj = (JSONObject)jsonArray1.get(i);
Iterator&amp;lt;String&amp;gt; iterator = jsonObj.keySet().iterator();
ArrayList&amp;lt;String&amp;gt; keyList = new ArrayList();

while(iterator.hasNext()){
    String temp = iterator.next(); // 다음 순서 가져옴
    keyList.add(temp); // 다른 컬렉션에 추가
    iterator.remove(temp); // 삭제
}&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;h2 data-ke-size=&quot;size26&quot;&gt;Iterator 활용 함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Iterator.hasNext()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterator 안에 다음 값이 들어있는지 확인한다. 존재하면 True, 없으면 False 를 Return 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Iterator.next()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iterator의 다음 값을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Iterator.remove()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iterator에서 next() 함수 호출 시 가져온 값을 컬렉션(List, Set, Map) 등에서 삭제한다.&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/백엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/128</guid>
      <comments>https://coding-plant.tistory.com/128#entry128comment</comments>
      <pubDate>Mon, 18 Jul 2022 15:03:09 +0900</pubDate>
    </item>
    <item>
      <title>[Java] ArrayList 2차원 배열</title>
      <link>https://coding-plant.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;업무중에 ArrayList 로 &lt;u&gt;2차원 배열&lt;/u&gt;을 만들어야할 일이 생겼는데 이후로도 가끔 필요할 것 같아 정리해두려고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ArrayList 란&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EmH9Z/btrG874ijor/YvTUuxiPvKgQ27QJZUEK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EmH9Z/btrG874ijor/YvTUuxiPvKgQ27QJZUEK41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EmH9Z/btrG874ijor/YvTUuxiPvKgQ27QJZUEK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmH9Z%2FbtrG874ijor%2FYvTUuxiPvKgQ27QJZUEK41%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;1280&quot; height=&quot;249&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArrayList란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있다.&lt;br /&gt;&lt;br /&gt;표준 배열보다는 속도가 느리지만, &lt;b&gt;가변 배열&lt;/b&gt;로 사용해야 할 때 매우 편리하고, Depth 는 &lt;b&gt;List 인터페이스&lt;/b&gt;에서 상속 받아 사용이 가능하다. 쉽게 말해 객체가 추가되어 용량을 초과하면 자동으로 부족한 크기만큼 용량이 늘어난다.(일반 배열처럼 length 가 고정 될 일이 없다는 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 ArrayList 선언&lt;/h2&gt;
&lt;pre id=&quot;code_1657613827765&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;String&amp;gt; list1 = new ArrayList&amp;lt;String&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ArrayList 2차원 배열 선언&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 생성 시 배열 부호 [ ] 사용&lt;/p&gt;
&lt;pre id=&quot;code_1657613885273&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;String&amp;gt;[] list_D1 = new ArrayList[3]; 
for(int i=0; i&amp;lt;3; i++){
    list_D1[i] = new ArrayList&amp;lt;String&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 배열 인덱스 &lt;b&gt;lsit_D1[i]&lt;/b&gt; 에 &lt;b&gt;new ArrayList&amp;lt;String&amp;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;h2 data-ke-size=&quot;size26&quot;&gt;ArrayList 2차원 배열에 값 추가&lt;/h2&gt;
&lt;pre id=&quot;code_1657614107005&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i=0; i&amp;lt;list_D1.length; i++){
    for(int j=0; j&amp;lt;tempArray.length; j++){
        list_D1[i].add(&quot;추가할 값&quot;); // 해당 값 추가
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ArrayList 2차원 배열 값 사용&lt;/h2&gt;
&lt;pre id=&quot;code_1657614160450&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i=0; i&amp;lt;list_D1.length; i++){
    for(int j=0; j&amp;lt;tempArray.length; j++){
        System.out.println(list_D1[i].get(j)); // 해당 값 확인
    }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/백엔드</category>
      <category>2차원 배열</category>
      <category>ArrayList</category>
      <category>java</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/126</guid>
      <comments>https://coding-plant.tistory.com/126#entry126comment</comments>
      <pubDate>Tue, 12 Jul 2022 17:23:20 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] HTTP(HyperText Transfer Protocol) 개념 정리</title>
      <link>https://coding-plant.tistory.com/125</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP(Hypertext Transfer Protocol)하이퍼텍스트 전송 규약. 웹 브라우저(web browser) 같은 응용프로그램을 통해 웹 클라이언트(사용자)와 웹 서버(서비스 제공자) 사이 데이터를 전송하는 프로토콜이다. 인터넷 통신을 위해 사용 되는 Protocol이며, HTML뿐만 아니라, 각종 이미지, 동영상, 음성 데이터 전송이 가능하다. 웹&amp;nbsp;서버와&amp;nbsp;사용자&amp;nbsp;컴퓨터에&amp;nbsp;설치된&amp;nbsp;웹&amp;nbsp;브라우저&amp;nbsp;사이에&amp;nbsp;문서를&amp;nbsp;전송하기&amp;nbsp;위한&amp;nbsp;&lt;b&gt;통신&amp;nbsp;규약&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP의 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 클라이언트와 HTTP 서버에 의해서 해석이 된다.&lt;/li&gt;
&lt;li&gt;TCP/IP를 이용하는 응용 프로토콜(application protocol)이다.&lt;/li&gt;
&lt;li&gt;연결 상태를 유지하지 않는 비연결성 프로토콜이다.&lt;/li&gt;
&lt;li&gt;요청/응답(Request/Response) 방식으로 동작한다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;HTTP는 기본 포트인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;80번 포트&lt;/b&gt;에서 서비스 대기한다.&lt;/li&gt;
&lt;/ul&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;b&gt;쿠키(Cookie)&lt;/b&gt;와&amp;nbsp;&lt;b&gt;세션(Session)&lt;/b&gt;이&amp;nbsp;등장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP의 통신 과정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lP9g2/btrG6XUN2QF/oRzqxIPwZvgo6xDXx2cKeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lP9g2/btrG6XUN2QF/oRzqxIPwZvgo6xDXx2cKeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lP9g2/btrG6XUN2QF/oRzqxIPwZvgo6xDXx2cKeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlP9g2%2FbtrG6XUN2QF%2FoRzqxIPwZvgo6xDXx2cKeK%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;757&quot; height=&quot;328&quot; data-origin-width=&quot;757&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;서버에&amp;nbsp;&lt;b&gt;HTTP Request (요청) 전송&lt;/b&gt;&lt;br /&gt;서버가 사용자의 요청을 받고 &lt;b&gt;HTTP Response (응답) 회신&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;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 상태 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 코드는&amp;nbsp;&amp;nbsp;IETF (Internet Engineering Task Force)에서 정의한 인터넷 표준에 따라 개발되며, 총 5가지 클래스로 분류된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1xx: Informational - 요청 정보 처리 중&lt;/li&gt;
&lt;li&gt;2xx: Success - 요청을 정상적으로 처리함&lt;/li&gt;
&lt;li&gt;3xx: Redirection - 요청을 완료하기 위해 추가 동작 필요&lt;/li&gt;
&lt;li&gt;4xx: Client Error - 서버가 요청을 이해하지 못함&lt;/li&gt;
&lt;li&gt;5xx: Server Error - 서버가 요청 처리 실패함&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1xx: Informational 정보&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 요청을 클라이언트에서 성공적으로 수신했으며 서버 끝에서 처리 중이라는 정보를 나타낸다. 서버의 임시 응답이며 일반적으로 상태 줄과 선택적 헤더 만 포함하며 빈 줄로 끝난다. 현재는 거의 사용하지 않는다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2xx: Success 성공&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 요청을 받고 성공적으로 처리되었음을 나타낸다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3xx: Redirection 리디렉션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 자동으로 다른 URL로 리디렉션되므로 브라우저 창에는이 코드가 표시되지 않지만, 이미지 파일처럼 캐싱된 파일을 새로고침 후 확인하면 3xx 코드를 확인할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4xx: Client Error 클라이언트 오류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 해결할 수 없는 클라이언트 측 에러 코드다. 주로 클라이언트(사용자)가 서버에 잘못된 요청을 했을 경우 발생한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5xx: Server Error 서버 오류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 클라이언트의 요청을 처리하지 못했을 때 발생한다. 서버는 보안 상 통신하지 않는 것이 가장 좋으므로 대부분의 에러 코드를 500 Error로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP 응답 코드(자세히)&lt;/h2&gt;
&lt;table style=&quot;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 data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:100}&quot;&gt;100&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Continue (클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청함)&amp;quot;}&quot;&gt;Continue (클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:101}&quot;&gt;101&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Switching protocols&amp;quot;}&quot;&gt;Switching protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:200}&quot;&gt;200&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;OK(요청이 성공적으로 수행되었음)&amp;quot;}&quot;&gt;OK(요청이 성공적으로 수행되었음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:201}&quot;&gt;201&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Created (PUT 메소드에 의해 원격지 서버에 파일 생성됨)&amp;quot;}&quot;&gt;Created (PUT 메소드에 의해 원격지 서버에 파일 생성됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:202}&quot;&gt;202&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Accepted(웹 서버가 명령 수신함)&amp;quot;}&quot;&gt;Accepted(웹 서버가 명령 수신함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:203}&quot;&gt;203&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Non-authoritative information (서버가 클라이언트 요구 중 일부만 전송)&amp;quot;}&quot;&gt;Non-authoritative information (서버가 클라이언트 요구 중 일부만 전송)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:204}&quot;&gt;204&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;No content, (사용자 요구 처리하였으나 전송할 데이터가 없음)&amp;quot;}&quot;&gt;No content, (사용자 요구 처리하였으나 전송할 데이터가 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:301}&quot;&gt;301&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Moved permanently (요구한 데이터를 변경된 타 URL에 요청함)&amp;quot;}&quot;&gt;Moved permanently (요구한 데이터를 변경된 타 URL에 요청함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:302}&quot;&gt;302&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Not temporarily&amp;quot;}&quot;&gt;Not temporarily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:304}&quot;&gt;304&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Not modified (컴퓨터 로컬의 캐시 정보를 이용함, 대개 gif 등은 웹 서버에 요청하지 않음)&amp;quot;}&quot;&gt;Not modified (컴퓨터 로컬의 캐시 정보를 이용함, 대개 gif 등은 웹 서버에 요청하지 않음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:400}&quot;&gt;400&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Bad request (사용자의 잘못된 요청을 처리할 수 없음)&amp;quot;}&quot;&gt;Bad request (사용자의 잘못된 요청을 처리할 수 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:401}&quot;&gt;401&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Unauthorized (인증이 필요한 페이지를 요청한 경우)&amp;quot;}&quot;&gt;Unauthorized (인증이 필요한 페이지를 요청한 경우)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:402}&quot;&gt;402&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Payment required(예약됨)&amp;quot;}&quot;&gt;Payment required(예약됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:403}&quot;&gt;403&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Forbidden (접근 금지, 디렉터리 리스팅 요청 및 관리자 페이지 접근 등을 차단)&amp;quot;}&quot;&gt;Forbidden (접근 금지, 디렉터리 리스팅 요청 및 관리자 페이지 접근 등을 차단)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:404}&quot;&gt;404&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Not found, (요청한 페이지 없음)&amp;quot;}&quot;&gt;Not found, (요청한 페이지 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:405}&quot;&gt;405&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Method not allowed (혀용되지 않는 http method 사용함)&amp;quot;}&quot;&gt;Method not allowed (혀용되지 않는 http method 사용함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:407}&quot;&gt;407&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Proxy authentication required (프락시 인증 요구됨)&amp;quot;}&quot;&gt;Proxy authentication required (프락시 인증 요구됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:408}&quot;&gt;408&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Request timeout (요청 시간 초과)&amp;quot;}&quot;&gt;Request timeout (요청 시간 초과)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:410}&quot;&gt;410&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Gone (영구적으로 사용 금지)&amp;quot;}&quot;&gt;Gone (영구적으로 사용 금지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:412}&quot;&gt;412&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Precondition failed (전체 조건 실패)&amp;quot;}&quot;&gt;Precondition failed (전체 조건 실패)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:414}&quot;&gt;414&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Request-URI too long (요청 URL 길이가 긴 경우임)&amp;quot;}&quot;&gt;Request-URI too long (요청 URL 길이가 긴 경우임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:500}&quot;&gt;500&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Internal server error (내부 서버 오류)&amp;quot;}&quot;&gt;Internal server error (내부 서버 오류)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:501}&quot;&gt;501&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Not implemented (웹 서버가 처리할 수 없음)&amp;quot;}&quot;&gt;Not implemented (웹 서버가 처리할 수 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:503}&quot;&gt;503&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Service unnailable (서비스 제공 불가)&amp;quot;}&quot;&gt;Service unnailable (서비스 제공 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:504}&quot;&gt;504&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;Gateway timeout (게이트웨이 시간 초과)&amp;quot;}&quot;&gt;Gateway timeout (게이트웨이 시간 초과)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:505}&quot;&gt;505&lt;/td&gt;
&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;HTTP version not supported (해당 http 버전 지원되지 않음)&amp;quot;}&quot;&gt;HTTP version not supported (해당 http 버전 지원되지 않음)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP Method&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GET&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET 요청 방식은 URI(URL)가 가진 정보를 검색하기 위해 서버 측에 요청하는 형태&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;POST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST 요청 방식은 요청 URI(URL)에 폼 입력을 처리하기 위해 구성한 서버 측 스크립트(ASP, PHP, JSP 등) 혹은 CGI 프로그램으로 구성되고 Form Action과 함께 전송되는데, 이때 헤더 정보에 포함되지 않고 데이터 부분에 요청 정보가 들어가게 된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PUT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST와 유사한 전송 구조를 가지기 때문에 헤더 이외에 메시지(데이터)가 함께 전송된다.원격지 서버에 지정한 콘텐츠를 저장하기 위해 사용되며 홈페이지 변조에 많이 악용되고 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DELETE&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격지 웹 서버에 파일을 삭제하기 위해 사용되며 PUT과는 반대 개념의 메소드&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PATCH&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분적인 수정을 위해 사용&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TRACE&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격지 서버에 Loopback(루프백) 메시지를 호출하기 위해 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HEAD&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEAD 요청 방식은 GET과 유사한 방식이나 웹 서버에서 헤더 정보 이외에는 어떤 데이터도 보내지 않는다.웹 서버의 다운 여부 점검(Health Check)이나 웹 서버 정보(버전 등)등을 얻기 위해 사용될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OPTIONS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메소드를 통해 시스템에서 지원되는 메소드 종류를 확인 가능&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CONNECT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹&amp;nbsp;서버에&amp;nbsp;프락시&amp;nbsp;기능을&amp;nbsp;요청할&amp;nbsp;때&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/125</guid>
      <comments>https://coding-plant.tistory.com/125#entry125comment</comments>
      <pubDate>Tue, 12 Jul 2022 11:13:50 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 포트(Port)의 개념</title>
      <link>https://coding-plant.tistory.com/124</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;포트(Port)의 개념&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4We9/btrG1zO6RbI/1UKavDBeU6610ZKj6aAptK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4We9/btrG1zO6RbI/1UKavDBeU6610ZKj6aAptK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4We9/btrG1zO6RbI/1UKavDBeU6610ZKj6aAptK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4We9%2FbtrG1zO6RbI%2F1UKavDBeU6610ZKj6aAptK%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;450&quot; height=&quot;450&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&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;h4 data-ke-size=&quot;size20&quot;&gt;사용법&lt;/h4&gt;
&lt;pre id=&quot;code_1663917211139&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예시) https://000.000.000.000:21&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기서 000.000.000.000은 IP 주소를 나타내며 그 뒤에 있는 21이 포트 번호를 의미한다.&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;u&gt;집&amp;nbsp;주소에&amp;nbsp;해당&amp;nbsp;하는&amp;nbsp;것이&amp;nbsp;&lt;b&gt;IP&lt;/b&gt;&lt;/u&gt;이며, 방번호가&lt;u&gt; &lt;b&gt;Port&lt;/b&gt;&lt;/u&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;포트(Port)범위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;0 ~ 65535&lt;/b&gt; : 16비트 숫자로 구성됨&lt;br /&gt;&lt;b&gt;0 ~ 1023&lt;/b&gt; : 잘 알려진 포트 번호로 웹 서버, 메일 서버 같은 프로그램들이 사용한다. &lt;br /&gt;&lt;b&gt;1024 ~ 49151&lt;/b&gt; : 잘 알려지지 않은 프로그램들이 사용한다. &lt;br /&gt;&lt;b&gt;49152 ~ 65535&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;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/124</guid>
      <comments>https://coding-plant.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 12 Jul 2022 10:13:03 +0900</pubDate>
    </item>
    <item>
      <title>코드 정리 사이트(HTML/Javascript/CSS)</title>
      <link>https://coding-plant.tistory.com/123</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. segio&lt;/h2&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;&lt;a href=&quot;http://html.segio.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://html.segio.com/ko/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527147622&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTML 소스 태그정리 (segio.com)&quot; data-og-description=&quot;대상 작업 (속성, 태그, 여백)을 선택한 후 아래에서 제거하십시오. 추가할 내용은 콜론으로 구분하여 입력하세요. 태그 삭제시 &amp;quot;!--/--&amp;quot;의 의미는 &amp;quot; &amp;quot; 태그를 의미합니다.&quot; data-og-host=&quot;html.segio.com&quot; data-og-source-url=&quot;http://html.segio.com/ko/&quot; data-og-url=&quot;http://html.segio.com/ko/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://html.segio.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://html.segio.com/ko/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HTML 소스 태그정리 (segio.com)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;대상 작업 (속성, 태그, 여백)을 선택한 후 아래에서 제거하십시오. 추가할 내용은 콜론으로 구분하여 입력하세요. 태그 삭제시 &quot;!--/--&quot;의 의미는 &quot; &quot; 태그를 의미합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;html.segio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Tabifier&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML&lt;/b&gt;, &lt;b&gt;CSS&lt;/b&gt;, &lt;b&gt;C Style&lt;/b&gt;, &lt;b&gt;JSON&lt;/b&gt; 코드 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tools.arantius.com/tabifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tools.arantius.com/tabifier&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527256641&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Tools - Tabifier (HTML and CSS code beautifier) - arantius.com&quot; data-og-description=&quot;Tabifier The tabifier is a tool to properly indent computer code. The style it produces is a mix of my personal preferences for indentation plus what I could manage to make a program produce from dirty source. The tabifier currently supports CSS, HTML, and&quot; data-og-host=&quot;tools.arantius.com&quot; data-og-source-url=&quot;https://tools.arantius.com/tabifier&quot; data-og-url=&quot;https://tools.arantius.com/tabifier&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tools.arantius.com/tabifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tools.arantius.com/tabifier&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tools - Tabifier (HTML and CSS code beautifier) - arantius.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tabifier The tabifier is a tool to properly indent computer code. The style it produces is a mix of my personal preferences for indentation plus what I could manage to make a program produce from dirty source. The tabifier currently supports CSS, HTML, and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tools.arantius.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Online&amp;nbsp;JavaScript&amp;nbsp;Beautifier&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Javascript&lt;/b&gt; 코드 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beautifier.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://beautifier.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527360054&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Online JavaScript beautifier&quot; data-og-description=&quot;HTML &amp;lt;style&amp;gt;, &amp;lt;script&amp;gt; formatting: Keep indent level of the tag Add one indent level Separate indentation&quot; data-og-host=&quot;beautifier.io&quot; data-og-source-url=&quot;https://beautifier.io/&quot; data-og-url=&quot;https://beautifier.io/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://beautifier.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://beautifier.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Online JavaScript beautifier&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML &amp;lt;style&amp;gt;, &amp;lt;script&amp;gt; formatting: Keep indent level of the tag Add one indent level Separate indentation&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;beautifier.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.&lt;span&gt; Javascript Compressor&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;코드 한줄로 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://javascriptcompressor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://javascriptcompressor.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527476689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Javascript Compressor - compress code online for free&quot; data-og-description=&quot;&quot; data-og-host=&quot;javascriptcompressor.com&quot; data-og-source-url=&quot;https://javascriptcompressor.com/&quot; data-og-url=&quot;https://javascriptcompressor.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://javascriptcompressor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://javascriptcompressor.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Javascript Compressor - compress code online for free&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;javascriptcompressor.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.&lt;span&gt;&lt;span&gt; Cleancss&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CSS &lt;/b&gt;코드 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cleancss.com/css-beautify/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.cleancss.com/css-beautify/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527532703&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;CSS Formatter&quot; data-og-description=&quot;Format your CSS to clean it up and beautify it. Make your CSS easier to read and validate it.&quot; data-og-host=&quot;www.cleancss.com&quot; data-og-source-url=&quot;https://www.cleancss.com/css-beautify/&quot; data-og-url=&quot;https://www.cleancss.com/css-beautify/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.cleancss.com/css-beautify/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cleancss.com/css-beautify/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CSS Formatter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Format your CSS to clean it up and beautify it. Make your CSS easier to read and validate it.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cleancss.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.&lt;span&gt;&lt;span&gt;&lt;span&gt; CSS Minifier&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CSS&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;코드 한줄로 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.toptal.com/developers/cssminifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.toptal.com/developers/cssminifier&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657527630576&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CSS Minifier &amp;amp; Compressor | Toptal&amp;reg;&quot; data-og-description=&quot;Use our CSS Minifier &amp;amp; Compressor tool to reduce CSS code size and make your website load faster. Get started for free now.&quot; data-og-host=&quot;www.toptal.com&quot; data-og-source-url=&quot;https://www.toptal.com/developers/cssminifier&quot; data-og-url=&quot;https://www.toptal.com/developers/cssminifier&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.toptal.com/developers/cssminifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.toptal.com/developers/cssminifier&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CSS Minifier &amp;amp; Compressor | Toptal&amp;reg;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use our CSS Minifier &amp;amp; Compressor tool to reduce CSS code size and make your website load faster. Get started for free now.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.toptal.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>유틸리티</category>
      <category>코드 정리</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/123</guid>
      <comments>https://coding-plant.tistory.com/123#entry123comment</comments>
      <pubDate>Mon, 11 Jul 2022 17:20:41 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 공인 IP 대역과 사설 IP 대역</title>
      <link>https://coding-plant.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 업무를 보다보면 IP 주소 관련해서 헷갈리는 경우가 많았다. 내부 IP 주소와 고객사 IP 주소 등..&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;h2 data-ke-size=&quot;size26&quot;&gt;공인 IP (Public IP) 대역의 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 사용자의 로컬 네트워크를 식별하기 위해 ISP(Internet Service Provider, 인터넷 서비스 공급자)가 제공하는 IP주소이다. 공용 IP주소라고도 불리며 외부에 공개되어 있는 IP주소이다. 공인 IP는 전 세계에서 유일한 IP주소를 갖고 있으며(중복 X), 공인 IP 주소가 외부에 공개되어 있기때문에 &lt;b&gt;인터넷에 연결된 다른 PC로부터의 접근이 가능하다.&lt;/b&gt; 따라서 공인 IP 주소를 사용하는 경우에는 방화벽 등의 &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;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 통신사 SK,KT,LG등을 통해서 사용하고 있는 인터넷망을 공인 IP라고 할 수 있다.&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;공인 IP 대역&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.0.0.0&amp;nbsp;~&amp;nbsp;127.255.255.255 &lt;br /&gt;128.0.0.0&amp;nbsp;~&amp;nbsp;191.255.255.255 &lt;br /&gt;192.0.0.0&amp;nbsp;~&amp;nbsp;233.255.255.255 &lt;br /&gt;224.0.0.0&amp;nbsp;~&amp;nbsp;239.255.255.255 &lt;br /&gt;240.0.0.0&amp;nbsp;~&amp;nbsp;255.255.255.255&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;h2 data-ke-size=&quot;size26&quot;&gt;사설 IP (Private IP)대역의 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 가정이나 회사 내 등에 할당된 네트워크의 IP주소이다. 로컬 IP, 가상 IP라고도 불리며 IPv4의 주소부족으로 인해 서브넷팅된 IP이기 때문에 라우터에 의해 &lt;b&gt;로컬 네트워크상의 PC나 장치에 할당&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;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 공유기에 연결된 PC,TV,스마트폰 등이 대표적인 사설 IP주소이다. 외부에는 공개되지 않아서 외부에서 검색, 접근이 불가능하다.&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;사설&amp;nbsp;IP&amp;nbsp;대역&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.0.0.0&amp;nbsp;~&amp;nbsp;10.255.255.255 &lt;br /&gt;172.16.0.0&amp;nbsp;~&amp;nbsp;172.31.255.255 &lt;br /&gt;192.168.0.0&amp;nbsp;~&amp;nbsp;192.168.255.255&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <category>IP대역</category>
      <category>공인IP</category>
      <category>네트워크</category>
      <category>사설IP</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/122</guid>
      <comments>https://coding-plant.tistory.com/122#entry122comment</comments>
      <pubDate>Mon, 11 Jul 2022 11:39:30 +0900</pubDate>
    </item>
    <item>
      <title>[티스토리] 티스토리에 쿠팡파트너스 배너 넣기</title>
      <link>https://coding-plant.tistory.com/117</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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 쿠팡 파트너스 사이트에 접속&lt;/h2&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;&lt;a href=&quot;https://partners.coupang.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://partners.coupang.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656826020730&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Coupang Partners&quot; data-og-description=&quot;쿠팡과 함께 수익을 창출해보세요&quot; data-og-host=&quot;partners.coupang.com&quot; data-og-source-url=&quot;https://partners.coupang.com/&quot; data-og-url=&quot;https://partners.coupang.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1tPIA/hyOYiwmUe4/pjVKK0Jrkc689CCWKxCzl0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400&quot;&gt;&lt;a href=&quot;https://partners.coupang.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://partners.coupang.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1tPIA/hyOYiwmUe4/pjVKK0Jrkc689CCWKxCzl0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Coupang Partners&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쿠팡과 함께 수익을 창출해보세요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;partners.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 쿠팡 파트너스 로그인&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0bsPo/btrGjcsYXly/oNo3lYUu3RN3dQBaafNmK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0bsPo/btrGjcsYXly/oNo3lYUu3RN3dQBaafNmK1/img.png&quot; data-alt=&quot;쿠팡 파트너스 홈페이지 메인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0bsPo/btrGjcsYXly/oNo3lYUu3RN3dQBaafNmK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0bsPo%2FbtrGjcsYXly%2FoNo3lYUu3RN3dQBaafNmK1%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;1560&quot; height=&quot;1070&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠팡 파트너스 홈페이지 메인 화면&lt;/figcaption&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;b&gt;가입하는 과정&lt;/b&gt;부터 보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1. 쿠팡 파트너스 회원가입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrpJm/btrGit9Bj4L/gIkQIzyG6sAICc3f8T5bU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrpJm/btrGit9Bj4L/gIkQIzyG6sAICc3f8T5bU1/img.png&quot; data-alt=&quot;일반적인 블로그 운영만 하는 경우 [개인] 이 맞음.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrpJm/btrGit9Bj4L/gIkQIzyG6sAICc3f8T5bU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnrpJm%2FbtrGit9Bj4L%2FgIkQIzyG6sAICc3f8T5bU1%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;1512&quot; height=&quot;935&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;935&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적인 블로그 운영만 하는 경우 [개인] 이 맞음.&lt;/figcaption&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AePgc/btrGivM5NyS/Mng6GYqaIloiDLIPuFPgx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AePgc/btrGivM5NyS/Mng6GYqaIloiDLIPuFPgx1/img.png&quot; data-alt=&quot;기본정보 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AePgc/btrGivM5NyS/Mng6GYqaIloiDLIPuFPgx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAePgc%2FbtrGivM5NyS%2FMng6GYqaIloiDLIPuFPgx1%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;1503&quot; height=&quot;815&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본정보 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천인 ID&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656827446998&quot; class=&quot;dns&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AF6600364&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1543&quot; data-origin-height=&quot;1003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VmyrM/btrGlgBroKo/69aVsenD2eyRPMeRklwBe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VmyrM/btrGlgBroKo/69aVsenD2eyRPMeRklwBe0/img.png&quot; data-alt=&quot;적용할 사이트 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VmyrM/btrGlgBroKo/69aVsenD2eyRPMeRklwBe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVmyrM%2FbtrGlgBroKo%2F69aVsenD2eyRPMeRklwBe0%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;1543&quot; height=&quot;1003&quot; data-origin-width=&quot;1543&quot; data-origin-height=&quot;1003&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용할 사이트 목록&lt;/figcaption&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOk4Zh/btrGksB56tv/kMUoawnnuCX81Y8mojtDzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOk4Zh/btrGksB56tv/kMUoawnnuCX81Y8mojtDzK/img.png&quot; data-alt=&quot;가입 완료!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOk4Zh/btrGksB56tv/kMUoawnnuCX81Y8mojtDzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOk4Zh%2FbtrGksB56tv%2FkMUoawnnuCX81Y8mojtDzK%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;1491&quot; height=&quot;999&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가입 완료!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 쿠팡 파트너스 로그인 후 #링크 생성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8xAVw/btrGiRn3aYS/HZgdcqkUKJ8EklQRvSkur1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8xAVw/btrGiRn3aYS/HZgdcqkUKJ8EklQRvSkur1/img.png&quot; data-alt=&quot;기존 배너가 없을테니, [배너 생성] 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8xAVw/btrGiRn3aYS/HZgdcqkUKJ8EklQRvSkur1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8xAVw%2FbtrGiRn3aYS%2FHZgdcqkUKJ8EklQRvSkur1%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;1500&quot; height=&quot;725&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 배너가 없을테니, [배너 생성] 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 배너 만들기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;1300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdkgBe/btrGnWCewAk/J42ECtITfFy1QBKQzKb85K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdkgBe/btrGnWCewAk/J42ECtITfFy1QBKQzKb85K/img.png&quot; data-alt=&quot;배너 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdkgBe/btrGnWCewAk/J42ECtITfFy1QBKQzKb85K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdkgBe%2FbtrGnWCewAk%2FJ42ECtITfFy1QBKQzKb85K%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;1493&quot; height=&quot;1300&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;1300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배너 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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;참고로 잘못설정해도 추후에 얼마든지 변경하거나 다시 만들 수 있으니 걱정할 필요는 없다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;티스토리&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 티스토리 스킨 편집에 생성한 쿠팡파트너스 배너 추가&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mCIOK/btrGkr4h8XM/UJJhLg807JDfYtwZgVXva1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mCIOK/btrGkr4h8XM/UJJhLg807JDfYtwZgVXva1/img.png&quot; data-alt=&quot;적용하는 코드 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mCIOK/btrGkr4h8XM/UJJhLg807JDfYtwZgVXva1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmCIOK%2FbtrGkr4h8XM%2FUJJhLg807JDfYtwZgVXva1%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;936&quot; height=&quot;464&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용하는 코드 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1656826831635&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;searchP-ad-container flex&quot; style=&quot;border-top: 3px solid #e5e5e5;height:150px&quot;&amp;gt;
    &amp;lt;div class=&quot;searchP-ad position-relative width-100&quot;&amp;gt;
      &amp;lt;!-- 검색바 하단 광고 --&amp;gt;
      &amp;lt;script src=&quot;https://ads-partners.coupang.com/g.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
      &amp;lt;script&amp;gt;
        new PartnersCoupang.G({
          &quot;id&quot;:591916,
          &quot;template&quot;:&quot;carousel&quot;,
          &quot;trackingCode&quot;:&quot;AF6600364&quot;,
          &quot;width&quot;:&quot;99%&quot;,
          &quot;height&quot;:&quot;150&quot;
        });
        try {
          setTimeout(function() {
            var iframeNode = document.querySelector('iframe[id^=&quot;591916&quot;]');
            document.querySelector('.searchP-ad').appendChild(iframeNode);
          }, 1000);
        } catch (e) {
          console.error(e);
        }
      &amp;lt;/script&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;coupang-notice&quot;&amp;gt;이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&amp;lt;/span&amp;gt;&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;위 캡처에서 &lt;b&gt;&quot;id&quot;: 591916&lt;/b&gt; 이랑 &lt;b&gt;&quot;trackingCode&quot;: &quot;AF6600364&quot;&lt;/b&gt; 그리고 &lt;b&gt;'iframe[id^=&quot;591916&quot;]'&lt;/b&gt; 이렇게 총 3 부분이 나의 쿠팡파트너스 고유 식별 정보를 담고 있는 부분이다.&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;저 3 부분의 숫자만 본인의 값으로 변경해서 사용하면 된다.&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;h2 data-ke-size=&quot;size26&quot;&gt;6. 결과물&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQn9NS/btrHCXAwUoF/J3qzwZdDgkhNT58QBiol1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQn9NS/btrHCXAwUoF/J3qzwZdDgkhNT58QBiol1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQn9NS/btrHCXAwUoF/J3qzwZdDgkhNT58QBiol1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQn9NS%2FbtrHCXAwUoF%2FJ3qzwZdDgkhNT58QBiol1k%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;1088&quot; height=&quot;373&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;373&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>블로그</category>
      <category>블로그 운영</category>
      <category>쿠팡파트너스</category>
      <category>쿠팡파트너스 등록</category>
      <category>티스토리</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/117</guid>
      <comments>https://coding-plant.tistory.com/117#entry117comment</comments>
      <pubDate>Sun, 3 Jul 2022 14:42:37 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 명령프롬프트(CMD) netstat 명령어를 통한 네트워크 상태 확인 방법 및 taskkill 명령어로 프로세스 강제 종료</title>
      <link>https://coding-plant.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;netstat 명령어&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M6sP3/btrFsZGxLsN/aSr1KtgbYoa42DIg7AkU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M6sP3/btrFsZGxLsN/aSr1KtgbYoa42DIg7AkU01/img.png&quot; data-alt=&quot;내가 주로 사용하는 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M6sP3/btrFsZGxLsN/aSr1KtgbYoa42DIg7AkU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM6sP3%2FbtrFsZGxLsN%2FaSr1KtgbYoa42DIg7AkU01%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;979&quot; height=&quot;512&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내가 주로 사용하는 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655863583018&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netstat -an&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;사용 방법&lt;/b&gt;&lt;br /&gt;netstat&amp;nbsp;[옵션]&amp;nbsp;[|&amp;nbsp;grep&amp;nbsp;포트&amp;nbsp;번호&amp;nbsp;or&amp;nbsp;서비스&amp;nbsp;명] &lt;br /&gt;&lt;br /&gt;&lt;b&gt;option&lt;/b&gt;&lt;br /&gt;-l&amp;nbsp;(listen)&amp;nbsp;:&amp;nbsp;연결&amp;nbsp;가능한&amp;nbsp;상태 &lt;br /&gt;-n&amp;nbsp;(number&amp;nbsp;port)&amp;nbsp;:&amp;nbsp;포트&amp;nbsp;넘버 &lt;br /&gt;-t&amp;nbsp;(tcp)&amp;nbsp;:&amp;nbsp;tcp &lt;br /&gt;-u&amp;nbsp;(udp)&amp;nbsp;:&amp;nbsp;udp &lt;br /&gt;-p&amp;nbsp;:&amp;nbsp;프로그램&amp;nbsp;이름&amp;nbsp;/&amp;nbsp;PID &lt;br /&gt;-a&amp;nbsp;:&amp;nbsp;모두 &lt;br /&gt;-i&amp;nbsp;:&amp;nbsp;이더넷&amp;nbsp;카드별&amp;nbsp;정상/에러/드랍&amp;nbsp;송수신&amp;nbsp;패킷&amp;nbsp;수&amp;nbsp;확인 &lt;br /&gt;-r&amp;nbsp;:&amp;nbsp;라우팅&amp;nbsp;테이블 &lt;br /&gt;-s : 네트워크 통계&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;자주&amp;nbsp;사용&amp;nbsp;하는&amp;nbsp;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netstat -ano : 사용중인 포트와 해당 포트의 PID 까지 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netstat -nap : 연결을 기다리는 목록과 프로그램을 보여준다.&lt;br /&gt;netstat -an | grep 포트번호 : 특정 포트가 사용 중에 있는지 확인.&lt;br /&gt;netstat -nlpt : TCP listening 상태의 포트와 프로그램을 보여준다.&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;h2 data-ke-size=&quot;size26&quot;&gt;taskkill 명령어&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F0UoQ/btrFoCmd53W/DP8zwglMqGgFh9lMfAOo2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F0UoQ/btrFoCmd53W/DP8zwglMqGgFh9lMfAOo2k/img.png&quot; data-alt=&quot;사용 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F0UoQ/btrFoCmd53W/DP8zwglMqGgFh9lMfAOo2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF0UoQ%2FbtrFoCmd53W%2FDP8zwglMqGgFh9lMfAOo2k%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;977&quot; height=&quot;510&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655863601584&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;taskkill -f -pid 9024&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;netstat&lt;/b&gt; 으로 종료하고 싶은 프로세스의 &lt;b&gt;pid&lt;/b&gt; 값을 확인한 뒤 &lt;b&gt;taskkill /f /pid&lt;/b&gt;&amp;nbsp; 명령어로 강제 종료 시키면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;&lt;b&gt;/f&lt;/b&gt; 는 강제종료, &lt;b&gt;/pid&lt;/b&gt;는 프로세스 pid 값을 사용하여 종료하겠다는 의미이다.&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/서버 및 네트워크</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/116</guid>
      <comments>https://coding-plant.tistory.com/116#entry116comment</comments>
      <pubDate>Wed, 22 Jun 2022 09:51:47 +0900</pubDate>
    </item>
    <item>
      <title>Everything : 이름으로 파일과 폴더를 빠르게 찾을 수 있는 윈도우용 검색 유틸리티</title>
      <link>https://coding-plant.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;&lt;b&gt;Everything&lt;/b&gt; 은 이름별로 파일과 폴더를 빠르게 찾을 수있는 윈도우 용 검색 유틸리티다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;파일&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cJukWa/btrFi9WTr57/kpQEpMMxNugbWzji4h0Y7k/Everything-1.4.1.1017.x64.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Everything-1.4.1.1017.x64.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.70MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;참고로 무설치 형이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 다운로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.voidtools.com/ko-kr/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.voidtools.com/ko-kr/downloads/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655701144005&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;다운로드 - voidtools&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.voidtools.com&quot; data-og-source-url=&quot;https://www.voidtools.com/ko-kr/downloads/&quot; data-og-url=&quot;https://www.voidtools.com/ko-kr/downloads/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.voidtools.com/ko-kr/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.voidtools.com/ko-kr/downloads/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;다운로드 - voidtools&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.voidtools.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KyyiZ/btrFe34V5gt/kH1yhAaWWUVClEkIPaFy3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KyyiZ/btrFe34V5gt/kH1yhAaWWUVClEkIPaFy3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KyyiZ/btrFe34V5gt/kH1yhAaWWUVClEkIPaFy3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKyyiZ%2FbtrFe34V5gt%2FkH1yhAaWWUVClEkIPaFy3k%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;949&quot; height=&quot;656&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;656&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;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>유틸리티</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/115</guid>
      <comments>https://coding-plant.tistory.com/115#entry115comment</comments>
      <pubDate>Mon, 20 Jun 2022 14:00:29 +0900</pubDate>
    </item>
    <item>
      <title>WinMerge : 텍스트(코드) 비교 프로그램</title>
      <link>https://coding-plant.tistory.com/114</link>
      <description>&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;그럴때마다 일일이 다른 부분을 직접 찾는건 너무 번거롭고 비효율적인 방법인데, 그럴때 사용하기 좋은 무료 툴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/mFnZA/btrFdHueavm/3hFfebeLCGUqSDyC35Md4K/WinMerge-2.16.14-x64-Setup.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;WinMerge-2.16.14-x64-Setup.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;7.69MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 다운로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://winmerge.org/downloads/?lang=en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://winmerge.org/downloads/?lang=en&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655700794929&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download WinMerge - WinMerge&quot; data-og-description=&quot;Download WinMerge The easiest way to install WinMerge is to download and run the Installer. Read the online manual for help using it. WinMerge 2.16.20 The current WinMerge version is 2.16.20 and was released at 2022-04-27. For detailed info on what is new,&quot; data-og-host=&quot;winmerge.org&quot; data-og-source-url=&quot;https://winmerge.org/downloads/?lang=en&quot; data-og-url=&quot;https://winmerge.org/downloads/?lang=en&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://winmerge.org/downloads/?lang=en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://winmerge.org/downloads/?lang=en&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download WinMerge - WinMerge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download WinMerge The easiest way to install WinMerge is to download and run the Installer. Read the online manual for help using it. WinMerge 2.16.20 The current WinMerge version is 2.16.20 and was released at 2022-04-27. For detailed info on what is new,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;winmerge.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1023&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beMyYR/btrFciIiHAb/ZfZm0Q5ZbqQXSfDmT7p1Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beMyYR/btrFciIiHAb/ZfZm0Q5ZbqQXSfDmT7p1Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beMyYR/btrFciIiHAb/ZfZm0Q5ZbqQXSfDmT7p1Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeMyYR%2FbtrFciIiHAb%2FZfZm0Q5ZbqQXSfDmT7p1Pk%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;1700&quot; height=&quot;1023&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1023&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 새문서 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 비교할 텍스트를 양쪽에 입력 후 [2] 번 클릭 시 비교 실행&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;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>유틸리티</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/114</guid>
      <comments>https://coding-plant.tistory.com/114#entry114comment</comments>
      <pubDate>Mon, 20 Jun 2022 13:46:37 +0900</pubDate>
    </item>
    <item>
      <title>[티스토리] 티스토리 업비트 실시간 가격 띄우기</title>
      <link>https://coding-plant.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코인 매매와 공부하는 걸 좋아하다보니 내 블로그에도 업비트의 실시간 가격이 떴으면 좋겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁금해서 찾다보니 &lt;a href=&quot;https://juni-official.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고할만한 블로그(꾸생님)&lt;/a&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;h2 data-ke-size=&quot;size26&quot;&gt;결과물&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QJDOl/btrG7YGUpnG/yPJL8ejChzEq2ms2uJqt0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QJDOl/btrG7YGUpnG/yPJL8ejChzEq2ms2uJqt0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QJDOl/btrG7YGUpnG/yPJL8ejChzEq2ms2uJqt0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQJDOl%2FbtrG7YGUpnG%2FyPJL8ejChzEq2ms2uJqt0K%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;332&quot; height=&quot;564&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;564&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;h2 data-ke-size=&quot;size26&quot;&gt;HTML 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1655625942803&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;price-wrap&quot;&amp;gt;
  &amp;lt;div class=&quot;slide-wrap&quot;&amp;gt;
    &amp;lt;span class=&quot;item-BTC&quot;&amp;gt;
      &amp;lt;i class=&quot;bx bxl-bitcoin&quot;&amp;gt;&amp;lt;/i&amp;gt;
      &amp;lt;span class=&quot;ticker-price-rise&quot;&amp;gt;33,415,000&amp;lt;/span&amp;gt;
    &amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;item-ETH&quot;&amp;gt;
      &amp;lt;!--&amp;lt;span class=&quot;ticker-txt&quot;&amp;gt;ETH : &amp;lt;/span&amp;gt;--&amp;gt;
      &amp;lt;i class=&quot;bx bxl-ethereum&quot;&amp;gt;&amp;lt;/i&amp;gt;
      &amp;lt;span class=&quot;ticker-price-rise&quot;&amp;gt;1,769,500&amp;lt;/span&amp;gt;
    &amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;item-ADA&quot;&amp;gt;
      &amp;lt;!--&amp;lt;span class=&quot;ticker-txt&quot;&amp;gt;ADA : &amp;lt;/span&amp;gt;--&amp;gt;
      &amp;lt;i class=&quot;bx bxl-ada&quot;&amp;gt;&amp;lt;/i&amp;gt;
      &amp;lt;span class=&quot;ticker-price-rise&quot;&amp;gt;500&amp;lt;/span&amp;gt;
    &amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;script&amp;gt;
    var slideBar = document.querySelector(&quot;.slide-wrap&quot;);
    setInterval(function() {
      var upbit = &quot;https://api.upbit.com/v1/ticker?markets=&quot;;
      var crypto = &quot;KRW-BTC,KRW-ETH,KRW-ADA&quot;;
      axios.get(upbit + crypto).then(function(res) {
        var data = res.data;
        res.data.forEach(function(el, idx) {
          var pirceBar = el.market.substr(4, 4) === &quot;BTC&quot; ? &quot;&amp;lt;span class=\&quot;ticker-txt\&quot;&amp;gt;&amp;lt;i class='bx bxl-bitcoin bx-xs'&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=\&quot;ticker-price-rise\&quot;&amp;gt;&quot;.concat(el.trade_price.toLocaleString(), &quot;&amp;lt;/span&amp;gt;&quot;) : &quot;&amp;lt;span class=\&quot;ticker-txt\&quot;&amp;gt;&quot;.concat(el.market.substr(4, 4), &quot; :&amp;lt;/span&amp;gt;&amp;lt;span class=\&quot;ticker-price-rise\&quot;&amp;gt;&quot;).concat(el.trade_price.toLocaleString(), &quot;&amp;lt;/span&amp;gt;&quot;);
          if (el.change === &quot;RISE&quot;) {
            slideBar.children[idx].innerHTML = pirceBar;
          } else if (el.change === &quot;FALL&quot;) {
            slideBar.children[idx].innerHTML = pirceBar;
          } else {
            slideBar.children[idx].innerHTML = pirceBar;
          }
        });
      })[&quot;catch&quot;](function(err) {
        console.log(err);
      });
    }, 1200);
  &amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;&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;밑에 Javascript 코드 영역은 따로 기술해 두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2 data-ke-size=&quot;size26&quot;&gt;Javascript 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1655625797562&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    var slideBar = document.querySelector(&quot;.slide-wrap&quot;);
    setInterval(function() {
      var upbit = &quot;https://api.upbit.com/v1/ticker?markets=&quot;;
      var crypto = &quot;KRW-BTC,KRW-ETH,KRW-ADA&quot;;
      axios.get(upbit + crypto).then(function(res) {
        var data = res.data;
        res.data.forEach(function(el, idx) {
          var pirceBar = el.market.substr(4, 4) === &quot;BTC&quot; ? &quot;&amp;lt;span class=\&quot;ticker-txt\&quot;&amp;gt;&amp;lt;i class='bx bxl-bitcoin bx-xs'&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=\&quot;ticker-price-rise\&quot;&amp;gt;&quot;.concat(el.trade_price.toLocaleString(), &quot;&amp;lt;/span&amp;gt;&quot;) : &quot;&amp;lt;span class=\&quot;ticker-txt\&quot;&amp;gt;&quot;.concat(el.market.substr(4, 4), &quot; :&amp;lt;/span&amp;gt;&amp;lt;span class=\&quot;ticker-price-rise\&quot;&amp;gt;&quot;).concat(el.trade_price.toLocaleString(), &quot;&amp;lt;/span&amp;gt;&quot;);
          if (el.change === &quot;RISE&quot;) {
            slideBar.children[idx].innerHTML = pirceBar;
          } else if (el.change === &quot;FALL&quot;) {
            slideBar.children[idx].innerHTML = pirceBar;
          } else {
            slideBar.children[idx].innerHTML = pirceBar;
          }
        });
      })[&quot;catch&quot;](function(err) {
        console.log(err);
      });
    }, 1200);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 현재 에이다만 분할로 매수하는 중이기 때문에 &lt;b&gt;비트코인&lt;/b&gt;, &lt;b&gt;이더리움&lt;/b&gt;, &lt;b&gt;에이다&lt;/b&gt; 총 3개의 코인의 가격만 실시간으로 받아오고자 스크립트를 구성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CSS 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1655626054341&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 업비트 API */
@media (min-width: 992px) {
  .price-wrap {
    height: 35px;
    /*background: #f8f8f8 url(images/bg.svg);*/
  }
}

.price-wrap {
  position: sticky;
  top: -15px;
  display: inline-block;
  padding: 0;
  margin: 35px 15px 0 15px;
  box-sizing: border-box;
  width: 280px;
  background-color: #161a1e;
  /*box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px;*/
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  overflow: hidden;
  z-index: 9998;
  font-size: 1.0rem !important;
  color: #fff !important;
  border: 0 solid #d0d0d0;
  background: #f1f1f191;
  border-radius: 10px;
  box-shadow: 0 1px 10px rgb(0 0 0 / 18%);
}

.price-wrap:after {
  content: 'Upbit';
  display: inline-block;
  /*position: absolute;*/
  top: 0;
  left: 0;
  height: 100%;
  background-color: #093687;
  z-index: 9999;
  padding: 10px;
  font-size: 15px;
  color: #fff;
  font-weight: bold;
  font-style: italic;
  font-family: 'IBM Plex Sans', sans-serif;
}

.ticker-txt {
  color: #333 !important;
  font-weight: bold;
  font-family: Maplestory-Light !important;
}

.bxl-bitcoin {
  color: #ef8e18;
  margin-top: 2px;
}

.bxl-ethereum {
  color: #3b3f52d8;
  margin-top: 2px;
}

.bxl-ada {
  color: #3f18ef;
  margin-top: 2px;
}

.slide-wrap&amp;gt;span {
  position: absolute;
  top: 50%;
  left: 110%;
  transform: translate(0, -50%);
  display: -ms-flexbox;
  display: flex;
  -ms-flex-pack: center;
  justify-content: center;
  -ms-flex-align: center;
  align-items: center;
  width: 110px;
  height: 20px;
  white-space: nowrap;
  text-align: center;
  color: #333;
  font-size: 1.1rem;
  font-family: 'IBM Plex Sans', sans-serif;
  z-index: 9997;
}

.slide-wrap&amp;gt;span span {
  font-size: 13px;
  margin: 2px;
  display: inline-block;
  vertical-align: middle;
}

.ticker-price-fall {
  color: #f6465d;
  margin: 0;
}

.ticker-price-rise {
  color: #0ecb81;
  margin: 0;
}

.ticker-price-same {
  color: #fff;
  margin: 0;
}

.item-BTC {
  animation: slidingSlow 15s 0s linear infinite;
}

.item-ETH {
  animation: slidingSlow 15s 5s linear infinite;
}

.item-ADA {
  animation: slidingSlow 15s 10s linear infinite;
}

@keyframes slidingSlow {
  0% {
    left: 100%;
  }

  100% {
    left: 5%;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML&lt;/b&gt; 과 &lt;b&gt;CSS&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ref&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://juni-official.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://juni-official.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658193377911&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;꾸생의 DevLog&quot; data-og-description=&quot;꾸준함이 생명입니다.&quot; data-og-host=&quot;juni-official.tistory.com&quot; data-og-source-url=&quot;https://juni-official.tistory.com/&quot; data-og-url=&quot;https://juni-official.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fbEP8/hyO8TCX1x7/I9K05uF1NNNbjcTtwqw84k/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/4Bshi/hyO7JPAbNI/WP5Fym0YJyHkvGGliXgwz0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/rCetO/hyO8X6qjB7/P2XkSCqw5EK8S2l61rkX50/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900&quot;&gt;&lt;a href=&quot;https://juni-official.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://juni-official.tistory.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fbEP8/hyO8TCX1x7/I9K05uF1NNNbjcTtwqw84k/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/4Bshi/hyO7JPAbNI/WP5Fym0YJyHkvGGliXgwz0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/rCetO/hyO8X6qjB7/P2XkSCqw5EK8S2l61rkX50/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;꾸생의 DevLog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;꾸준함이 생명입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;juni-official.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FJ8nG/btrHN3VJwOO/eZzgFkZk9qXkSIhwddHYIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FJ8nG/btrHN3VJwOO/eZzgFkZk9qXkSIhwddHYIK/img.png&quot; data-alt=&quot;꾸생님 방명록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FJ8nG/btrHN3VJwOO/eZzgFkZk9qXkSIhwddHYIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFJ8nG%2FbtrHN3VJwOO%2FeZzgFkZk9qXkSIhwddHYIK%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;878&quot; height=&quot;340&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;꾸생님 방명록&lt;/figcaption&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;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>블로그</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/113</guid>
      <comments>https://coding-plant.tistory.com/113#entry113comment</comments>
      <pubDate>Sun, 19 Jun 2022 17:11:02 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] JSON 데이터 [object object] alert 나 console.log 함수로 출력하는 방법</title>
      <link>https://coding-plant.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 JS에서 JSON 데이터는 콘솔이나 Alert 로 출력시 [Object object] 로만 출력되고 내용은 보이지 않는다.&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;h2 data-ke-size=&quot;size26&quot;&gt;JSON.stringify()&lt;/h2&gt;
&lt;pre id=&quot;code_1654834646080&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//data == 확인할 JSON 데이터
console.log(JSON.stringify(data));
alert(JSON.stringify(data));&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/111</guid>
      <comments>https://coding-plant.tistory.com/111#entry111comment</comments>
      <pubDate>Fri, 10 Jun 2022 13:17:43 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] Javascript 파일에서 다른 JS 함수 호출 하는법</title>
      <link>https://coding-plant.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 처럼 Module.import/export 로 하는 방법말고 그냥 js에서 하는 방법을 찾고 있었는데&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;h2 data-ke-size=&quot;size26&quot;&gt;호출한 파일 : calc_forecasting.js&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출 대상 : erlangc.js&lt;/p&gt;
&lt;pre id=&quot;code_1654828611967&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 외부 js파일 호출(erlangc.js)
document.write('&amp;lt;script src=&quot;/com/js/erlangc.js&quot;&amp;gt;&amp;lt;/script&amp;gt;');

// 외부 js파일에 있는 함수 호출(Agents)
// function Agents() --&amp;gt; erlangc.js 파일 내에 정의된 함수

// 사용 예시
var Agents_t = Agents(SLA, SERVICE_TIME, tempVal ,AHT);&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/110</guid>
      <comments>https://coding-plant.tistory.com/110#entry110comment</comments>
      <pubDate>Fri, 10 Jun 2022 11:39:21 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] jQuery UI datepicker 사용법(ex_날짜 제한)</title>
      <link>https://coding-plant.tistory.com/107</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 세팅 옵션&lt;/h2&gt;
&lt;pre id=&quot;code_1652935884957&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$.datepicker.setDefaults({
        dateFormat: 'yy-mm-dd',	//날짜 포맷이다. 'yy-mm-dd' 를 보편적으로 사용
        prevText: '이전 달',	// 마우스 오버시 이전달 텍스트
        nextText: '다음 달',	// 마우스 오버시 다음달 텍스트
        closeText: '닫기', // 닫기 버튼 텍스트 변경
        currentText: '오늘', // 오늘 텍스트 변경
        monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],	//한글 캘린더중 월 표시를 위한 부분
        monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],	//한글 캘린더 중 월 표시를 위한 부분
        dayNames: ['일', '월', '화', '수', '목', '금', '토'],	//한글 캘린더 요일 표시 부분
        dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],	//한글 요일 표시 부분
        dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],	// 한글 요일 표시 부분
        showMonthAfterYear: true,	// true : 년 월  false : 월 년 순으로 보여줌
        yearSuffix: '년',	
        showButtonPanel: true,	// 오늘로 가는 버튼과 달력 닫기 버튼 보기 옵션
        buttonImageOnly: true,	// input 옆에 조그만한 아이콘으로 캘린더 선택가능하게 하기
        buttonImage: &quot;images/calendar.gif&quot;,	// 조그만한 아이콘 이미지
        buttonText: &quot;Select date&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 날짜 구하기&lt;/h2&gt;
&lt;pre id=&quot;code_1652936261307&quot; class=&quot;arcade&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var today = $.datepicker.formatDate('yy-mm-dd', new Date());&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;h2 data-ke-size=&quot;size26&quot;&gt;선택할 수 있는 날짜 제한&lt;/h2&gt;
&lt;pre id=&quot;code_1652935994637&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(&quot;#datepicker1&quot;).datepicker({
	maxDate : &quot;+1m +1w&quot;,	//선택할 수 있는 최대 날짜  +1m +1w 은 1달 1주일 뒤 까지 선택가능  [+,-][숫자][y,m,w,d] 
	minDate : &quot;-1y&quot;	//선택할 수 있는 최소 날짜 
    //maxDate : new Date('2022-05-05'), // 이런식으로 사용해도 됨
    //minDate : new Date('2022-01-01') //
});&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/107</guid>
      <comments>https://coding-plant.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 19 May 2022 13:58:17 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] Object.keys - 객체의 Key 값 가져오기, Object.value - value값 가져오기</title>
      <link>https://coding-plant.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 객체로 다루다보면 key값만 추출해서 따로 사용하거나 value값만 추출해서 사용해야하는 경우가 종종 생긴다.&lt;br /&gt;이럴 때 배열에 돌려서 일일이 꺼내 쓰는건 굉장히 귀찮은 작업이기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JS에서는 &lt;b&gt;Object.keys()&lt;/b&gt;, &lt;b&gt;Object.values()&lt;/b&gt; 라는 메서드를 제공해준다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;rgyInfo&quot;&gt;
&lt;div class=&quot;rgyInfo-circle&quot;&gt;
&lt;div class=&quot;topDiv&quot;&gt;TIP&lt;/div&gt;
&lt;div class=&quot;bottomDiv&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;bottomDiv2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;rgyInfo-text&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;쉽게 설명하자면 특정 객체를 대상으로 key, value 값들만 뽑아서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;배열로 리턴&lt;/b&gt;하는 함수다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652683649517&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var obj = { a: 1, b: 2, c: 3 }; 
var keys = Object.keys(obj); 
var values = Object.values(obj);

console.log(&quot;결과1:&quot;+keys);
console.log(&quot;결과2:&quot;+values);

// 결과1 : [a, b, c]
// 결과2 : [1, 2, 3]&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;참고로 Object 이다보니 &lt;b&gt;순서는 명확하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 데이터에 명확한 인덱스(순서)를 알아야 한다면 조금 투박한 방법이지만&lt;/p&gt;
&lt;pre id=&quot;code_1652683829624&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var obj = { a: 1, b: 2, c: 3 }; 
var keys = Object.keys(obj); 
var values = Object.values(obj);

console.log(&quot;결과1:&quot;+keys);
console.log(&quot;결과2:&quot;+values);

// 결과1 : [a, b, c]
// 결과2 : [1, 2, 3]

// 순서 확인
var keys_arr = [];
var vals_arr = [];
keys.sort(); // 이름순으로 정렬
for(var i=0; i &amp;lt; keys.length; i++){
    vals_arr.push(values[keys[i]]);
}

console.log(&quot;keys 순서대로 정렬된 value 값들 : &quot;+vals_arr);&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/106</guid>
      <comments>https://coding-plant.tistory.com/106#entry106comment</comments>
      <pubDate>Mon, 16 May 2022 15:54:51 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] jqGrid 사용법 총 정리</title>
      <link>https://coding-plant.tistory.com/97</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;jqGrid&lt;/b&gt;는 jQuery라이브러리를 이용한 Grid Plugin 이다. 웹에서 테이블 형식의 데이터를 표시하고 조작을 위한 Ajax기반 자바스크립트 컨트롤러 기능을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;jqGrid는&amp;nbsp;&amp;nbsp;Ajax가 내장되어 있어서 조금만 이해하고 공부한다면 쉽게 데이터를 화면에 뿌려줄 수 있지만,&amp;nbsp;&lt;br /&gt;반대로 jQuery 기반의 플러그인이기 때문에 jQuery에 대한 기본적인 지식이 없다면 사용하기 어려울 수 있다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;jqGrid의 대표적인 장점은 페이징, 정렬과 같은 기능을 제공해준다는 점이다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;정해준 형식에 맞춰 사용해야 하지만 익숙해지기만 한다면 굉장히 편리하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 디자인 같은 경우 jQuery-UI에서 제공하는 CSS로 자기 입맛에 맞는 디자인을 할 수 있으니 이 또한 그리드의 장점이다.&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;h2 data-ke-size=&quot;size26&quot;&gt;라이브러리 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDN 방식으로 추가 시 다음과 같이 진행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;js 파일로 직접 추가해서도 가능&lt;/p&gt;
&lt;pre id=&quot;code_1651473709441&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// jqGrid 라이브러리 추가
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../resources/css/jquery-ui-1.10.4.custom.css&quot; /&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../resources/css/ui.jqgrid.css&quot; /&amp;gt;
 
// jQuery js파일을 jqGrid js파일보다 상위에 선언해야 제대로 동작함
&amp;lt;script src=&quot;../resources/js/jquery-1.11.0.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script src=&quot;../resources/js/i18n/grid.locale-kr.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;../resources/js/jquery.jqGrid.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;수많은 옵션들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;url&lt;/b&gt; : 데이터 API 요청을 보낼 주소를 입력&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;mtype&lt;/b&gt; : API 요청 방식을 설정(get || post)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;datatype&lt;/b&gt; : 가지고 오는 데이터의 타입을 설정한다. 보통 xml, json,local 이렇게 세 가지를 자주 사용.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;colNames&lt;/b&gt; : 그리드 각각의 컬럼에 출력되는 이름이고, 배열로 설정한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;colModel&lt;/b&gt; : 각 컬럼에 대한 상세 정보이다. 서버로부터 받아온 데이터를 매핑해서 출력한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;- colModel 하위에 label이 들어가는데, colNames를 사용하지 않고 label 내부에 설정해도 동일하게 사용이 가능하다.(하단 코드 예시 참고)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;jsonReader/xmlReader&lt;/b&gt; : 데이터 타입이 json/xml일 경우 reader를 통해서 데이터를 어떻게 읽어들일지 설정.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;rowNum&lt;/b&gt; : 초기에 출력할 데이터의 개수를 설정.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;pager&lt;/b&gt; : 그리드의 대표기능인 페이저를 설정, jqGrid &amp;lt;Table&amp;gt; 하위에 &amp;lt;div&amp;gt; 를 넣어주고 그 div의 id값을 써주면 된다.(하단 예시 참고)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;multiselect&lt;/b&gt; : row마다 selectbox가 생긴다(이벤트 처리 가능)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;postData&lt;/b&gt; : 서버에 파라미터로 넘길 데이터를 설정한다. 배열의 형태로 설정 가능하고, &amp;lt;FORM&amp;gt; 태그로 감싼 데이터들을 한번에 serialize() 해서 보낼수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;b&gt;loadComplete&lt;/b&gt; : 서버에 모든 요청 후 즉시 발생&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;b&gt;onCellSelect&lt;/b&gt; : 그리드의&amp;nbsp;특정&amp;nbsp;셀을&amp;nbsp;클릭시&amp;nbsp;발생&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;ondblClickRow : row가&amp;nbsp;더블클릭한&amp;nbsp;직후&amp;nbsp;발생&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;b&gt;autowidth&lt;/b&gt;: true,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// jQgrid width 자동100% 채워지게&lt;br /&gt;&lt;b&gt;shrinkToFit&lt;/b&gt;: false,&amp;nbsp;&amp;nbsp;// width를 자동설정 해주는 기능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651473880454&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// FORM 태그로 감싼 모든 Submit 데이터
var formData = $('#FORM1').serialize();

// grid 란 id 값을 가진 테이블에 jqGrid 생성
$(&quot;#grid&quot;).jqGrid({
	url : &quot;&amp;lt;%=APP_ROOT%&amp;gt;/auth/root/bbs/getList&quot;,
        postData : formData,
        datatype: &quot;json&quot;,
        /*
            // colModel 옵션들
            name : 출력할 데이터의 이름입니다. 서버에서 받은 데이터의 변수명과 일치해야 함.
            index : 컬럼 정렬 시 서버에 넘어가는 값이다. index값을 설정하지 않으면 name값이 넘어간다.
            width : 컬럼의 넓이를 설정.
            align : 컬럼 내 데이터의 정렬을 설정.
            hidden : 데이터값은 설정하고 화면에서 보이고 싶지 않을 때 사용.
            formatter : 데이터로 들어온 값을 특정 형식으로 변환해서 보여줄 수 있다.
            frozen : true or false // 이 옵션을 넣은경우 그리드를 전부다 그린뒤 $(&quot;#gridid&quot;).jqGrid('setFrozenColumns'); 함수를 호출해줘야한다. + reload 까지도
        */
        colModel : [
            {label : &quot;KEY&quot;,name : &quot;ID&quot;, width:120, hidden: true},
            {label : &quot;ID&quot;, name : &quot;ID&quot;, align:'center'},
            {label : &quot;나이&quot;, name : &quot;AGE&quot;, align:'center', formatter : &quot;integer&quot;, sorttype : &quot;integer&quot;},
            {label : &quot;이름&quot;, name : &quot;NAMES&quot;, align:'center', editable:true, edittype:'text'
                , editoptions:{
                    
                }						
            },
            
        ],
        formatter: {
            integer: {thousandsSeparator: &quot;,&quot;, defaultValue: '0'}
        },
        cellEdit: true,
        cellsubmit: 'clientArray',
        cellurl : '',
        afterEditCell:function(rowid, cellname, value, iRow, iCol){
            /* //input HTML 태그가 입력되어버리는 문제 해결
            //jqGrid에서 CellEdit 모드 일 때 마우스가 Input에서 focus를 벗어 났을 때 Cell Save
            $(&quot;#&quot;+rowid+&quot;_&quot;+cellname).blur(function(){
                $(&quot;#grid&quot;).jqGrid(&quot;saveCell&quot;,iRow,iCol);
            });	 
            */	
        },
        loadtext : '로딩중..',
        autowidth: true,
        loadonce : true,
        viewrecords: true,
        height : 'auto',
        rowNum: 20,
        rowList:[10,30,50,80,100],
        pager: '#pager',
        pgtext : &quot;Page {0} of {1}&quot;,
        jsonReader: {cell:&quot;&quot;},
        multiselect:true,
        ondblClickRow: function(id,irow,icol,e){

        },        
        onSelectRow  : function(rowid){
            var idArry = $(&quot;#grid&quot;).jqGrid('getDataIDs'); //grid의 id 값을 배열로 가져옴

            for(var i=0 ; i &amp;lt; idArry.length; i++){
                var ret =  $(&quot;#grid&quot;).getRowData(idArry[i]); // 해당 id의 row 데이터를 가져옴
                if(&quot;N&quot; != ret.finish_yn){ //해당 row의 COMPLETED_YN 컬럼 값이 N이 아니면 checkbox disabled 처리
                    //해당 row의 checkbox disabled 처리 &quot;jqg_list_&quot; 이 부분은 grid에서 자동 생성
                    $(&quot;#jqg_grid_&quot;+idArry[i]).removeAttr(&quot;checked&quot;);
                    $(&quot;#&quot;+idArry[i]).removeClass('ui-state-highlight');
                }
            }  
        },
        onSelectAll: function(aRowids,status) { //disabled 처리된 checkbox 선택 안되도록 해주는 부분
            if (status) {
                var cbs = $(&quot;tr.jqgrow &amp;gt; td &amp;gt; input.cbox:disabled&quot;, $(&quot;#grid&quot;)[0]);
                cbs.removeAttr(&quot;checked&quot;);

                $(&quot;#grid&quot;)[0].p.selarrrow = $(&quot;#grid&quot;).find(&quot;tr.jqgrow:has(td &amp;gt; input.cbox:checked)&quot;).map(function() { return this.id; }).get();

                var idArry = $(&quot;#grid&quot;).jqGrid('getDataIDs'); 

                for(var i=0 ; i &amp;lt; idArry.length; i++){
                    var ret =  $(&quot;#grid&quot;).getRowData(idArry[i]);
                    //if(&quot;N&quot; != ret.COMPLETED_YN){ 
                    if(&quot;N&quot; != ret.finish_yn){ //해당 row의 COMPLETED_YN 컬럼 값이 N이 아니면 checkbox disabled 처리 
                        $(&quot;#&quot;+idArry[i]).removeClass('ui-state-highlight');
                    }
                }  
            }
        },
        loadComplete: function (data) {
            var allRow = jQuery(&quot;#grid&quot;).jqGrid('getGridParam', 'records');
            if(allRow == 0 ){
                $(&quot;#grid &amp;gt;tbody&quot;).append(&quot;&amp;lt;tr&amp;gt;&amp;lt;td align='center' colspan='10' style=''&amp;gt;조회된 데이터가 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
            }

            var idArry = $(&quot;#grid&quot;).jqGrid('getDataIDs'); 

            for(var i=0 ; i &amp;lt; idArry.length; i++){
                var ret =  $(&quot;#grid&quot;).getRowData(idArry[i]); 
                //if(&quot;N&quot; != ret.COMPLETED_YN){ 
                if(&quot;N&quot; != ret.finish_yn){ //해당 row의 COMPLETED_YN 컬럼 값이 N이 아니면 checkbox disabled 처리 
                   $(&quot;#jqg_grid_&quot;+idArry[i]).attr(&quot;disabled&quot;, true); 
                }
             }
        },
})&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1651474392848&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- jqGrid 페이징 처리 예시 --&amp;gt;
&amp;lt;div class=&quot;grid full-height full-height-strict&quot;&amp;gt;
    &amp;lt;table id=&quot;grid&quot; class=&quot;full-size-jq-grid&quot;&amp;gt;&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
	&amp;lt;div id=&quot;pager&quot; style=&quot;height: 35px; &quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;jqGrid 열명(th) 변경하는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것 때문에 꽤나 애를 먹었는데 정확한 방법을 찾아냈다.&lt;/p&gt;
&lt;pre id=&quot;code_1651477981314&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기존 그리드를 담은 엘리먼트(테이블) 제거
$('#grid').jqGrid(&quot;clearGridData&quot;)
$.jgrid.gridDestroy(&quot;grid&quot;)

// 새 테이블(그리드를 담을 그릇) 추가
// id = parentDiv 인 &amp;lt;div&amp;gt; 는 기존에 grid 를 적용한 테이블을 감싸고 있는 바로 상위의 엘리먼트
$(&quot;#parentDiv&quot;).append('&amp;lt;table id=&quot;grid&quot; class=&quot;full-size-jq-grid&quot;&amp;gt;&amp;lt;/table&amp;gt;')

// 새 jqGrid 추가
$(&quot;#grid&quot;).jqGrid({
    url : ..
    ..
})&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;h2 data-ke-size=&quot;size26&quot;&gt;자주 발생하는 에러&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;No&amp;nbsp;such&amp;nbsp;method:&amp;nbsp;GridDestroy&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jquery 버전 차이 때문에 발생하는 에러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 예시 : $('#grid').jqGrid('GridDestroy');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변경할 예시 : $.jgrid.gridDestroy(&quot;grid&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GridUnload&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;&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/프론트엔드</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/97</guid>
      <comments>https://coding-plant.tistory.com/97#entry97comment</comments>
      <pubDate>Mon, 2 May 2022 16:27:33 +0900</pubDate>
    </item>
    <item>
      <title>텔레그램 코인 알림봇 개발 (Node.js 를 이용한 Rest 방식)</title>
      <link>https://coding-plant.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는 평소 코인을 거래할 때 &lt;a href=&quot;https://kimpga.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;김프가&lt;/a&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;2022.04.24 어제 새벽에 시작했고, 현재 내가 시도한 방법이 &lt;u&gt;몇몇 코인들의 정보를 가져오는데는 전혀 문제가 없지만&lt;/u&gt; 업비트의 &lt;b&gt;API Request 수 제한&lt;/b&gt;에 걸리기 때문에 &lt;u&gt;전체를 대상&lt;/u&gt;으로는 부적합한 방법이라는 걸 깨닫고 전체 데이터를 실시간으로 조회할 새로운 방법을 찾아 시작하기 전에 내가 시도한 방법에 대한 정리를 하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Node.js&lt;/a&gt; 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2052&quot; data-origin-height=&quot;1594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Omxqu/btrAgqc3pY1/1BgcLNEn3IQKgoVdvj6tqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Omxqu/btrAgqc3pY1/1BgcLNEn3IQKgoVdvj6tqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Omxqu/btrAgqc3pY1/1BgcLNEn3IQKgoVdvj6tqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOmxqu%2FbtrAgqc3pY1%2F1BgcLNEn3IQKgoVdvj6tqk%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;690&quot; height=&quot;536&quot; data-origin-width=&quot;2052&quot; data-origin-height=&quot;1594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js 를 설치(본인 운영체제에 맞게)&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3360&quot; data-origin-height=&quot;1924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njB9s/btrAfCEN7AO/xI2NJH01iFKDKKlldQDZU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njB9s/btrAfCEN7AO/xI2NJH01iFKDKKlldQDZU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njB9s/btrAfCEN7AO/xI2NJH01iFKDKKlldQDZU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjB9s%2FbtrAfCEN7AO%2FxI2NJH01iFKDKKlldQDZU0%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;3360&quot; height=&quot;1924&quot; data-origin-width=&quot;3360&quot; data-origin-height=&quot;1924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json 파일을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 필요한 모듈들은 필요할 때마다 터미널에 'npm install __ ' 해서 사용!&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;h2 data-ke-size=&quot;size26&quot;&gt;프로그램 올릴 개인용 무료 서버 &lt;a href=&quot;https://dashboard.heroku.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Heroku&lt;/a&gt; 가입 및 등록&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3360&quot; data-origin-height=&quot;1662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCRkh/btrAcUrU851/JbaupiI3kor3WzQJ6Z5Ge0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCRkh/btrAcUrU851/JbaupiI3kor3WzQJ6Z5Ge0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCRkh/btrAcUrU851/JbaupiI3kor3WzQJ6Z5Ge0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCRkh%2FbtrAcUrU851%2FJbaupiI3kor3WzQJ6Z5Ge0%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;3360&quot; height=&quot;1662&quot; data-origin-width=&quot;3360&quot; data-origin-height=&quot;1662&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3358&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgwilr/btrAh7RGDmG/kgrzAuqKKWTkfJlxXN3PM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgwilr/btrAh7RGDmG/kgrzAuqKKWTkfJlxXN3PM1/img.png&quot; data-alt=&quot;Config Vars 세팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgwilr/btrAh7RGDmG/kgrzAuqKKWTkfJlxXN3PM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgwilr%2FbtrAh7RGDmG%2FkgrzAuqKKWTkfJlxXN3PM1%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;3358&quot; height=&quot;1648&quot; data-origin-width=&quot;3358&quot; data-origin-height=&quot;1648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Config Vars 세팅&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Settings 메뉴에서 Config Vars 에 텔레그램에서 발급받은 키를 입력했다.(&lt;b&gt;중요&lt;/b&gt;!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INTERVAL은 몇초마다 결과를 받을지 테스트할겸 적용한 값이다.(중요하지 않음)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nC2vn/btrAeOS3rWN/WiGGPGzzbfPA5uiObuhspK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nC2vn/btrAeOS3rWN/WiGGPGzzbfPA5uiObuhspK/img.png&quot; data-alt=&quot;heroku git 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nC2vn/btrAeOS3rWN/WiGGPGzzbfPA5uiObuhspK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnC2vn%2FbtrAeOS3rWN%2FWiGGPGzzbfPA5uiObuhspK%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;2048&quot; height=&quot;496&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;heroku git 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heroku에 올릴 때도 깃 명령어는 다른 깃 사용법과 동일하다.&lt;/p&gt;
&lt;pre id=&quot;code_1651193376633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 깃 기본 세팅
git init
# 깃 저장소 세팅
heroku git:remote -a test-mv
# 현재 프로젝트 파일을 깃 현재 저장소에 등록
git add .
# 현재 저장소에 저장
git commit -am &quot;make it better&quot;
# Heroku 서버 마스터로 푸시
git push heroku master&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;h2 data-ke-size=&quot;size26&quot;&gt;Heroku 서버 자동 Sleep 방지 모니터링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Heroku는 일정 시간 동안 deploy한 앱에 접속 요청이 없을 경우, 앱을 sleep 시켜버린다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 sleep 이 된다고 해서 영원한 잠에 빠지거나 하는 건 아니고, 다음 요청이 있을 때까지 죽여 놓는 것이다. 새로운 요청을 받으면 앱을 새로 구동한 다음 웹 페이지를 보여준다. 평범한 블로그나 웹 사이트라면 sleep 상태라고 해도 10~30초 정도만 기다리면 되는 것이다.&lt;br /&gt;하지만 텔레그램 봇은 웹이 아니어서 그런지 한 번 sleep 상태로 빠져들면 다시는 깨어나지 않았다.&lt;br /&gt;&lt;br /&gt;그래서 나온 꼼수가 http end point를 만든 다음, 주기적으로 ping을 보내주는 서비스에 봇의 http end point를 등록해서 봇이 잠들지 않도록 해주는 것이다. 이런 서비스들 중 하나가 바로 &lt;a href=&quot;https://uptimerobot.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;uptimerobot&lt;/a&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;New Monitor&lt;/b&gt; 클릭한 뒤 본인이 원하는 도메인을 세팅하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU0X8C/btrAh7YplzI/NVAnqWkEdmutrckBF1cRM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU0X8C/btrAh7YplzI/NVAnqWkEdmutrckBF1cRM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU0X8C/btrAh7YplzI/NVAnqWkEdmutrckBF1cRM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU0X8C%2FbtrAh7YplzI%2FNVAnqWkEdmutrckBF1cRM0%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;2028&quot; height=&quot;928&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;928&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;h2 data-ke-size=&quot;size26&quot;&gt;텔레그램 봇 API key 발급&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;1788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1iSbO/btrAj2on7ow/I3F0gbeFLdr1kwkGskhKCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1iSbO/btrAj2on7ow/I3F0gbeFLdr1kwkGskhKCK/img.png&quot; data-alt=&quot;텔레그램 봇 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1iSbO/btrAj2on7ow/I3F0gbeFLdr1kwkGskhKCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1iSbO%2FbtrAj2on7ow%2FI3F0gbeFLdr1kwkGskhKCK%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;571&quot; height=&quot;701&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;1788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텔레그램 봇 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텔레그램에서 &lt;b&gt;@BotFather&lt;/b&gt; 채널을 검색해서 채팅창에 &lt;b&gt;/start&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/newbot&lt;/li&gt;
&lt;li&gt;본인이 정한bot 이름 입력&amp;nbsp;&lt;/li&gt;
&lt;/ol&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;h2 data-ke-size=&quot;size26&quot;&gt;bot.js&lt;/h2&gt;
&lt;pre id=&quot;code_1650804709862&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
    텔레그램 김프 봇
    EuiSang Yu
    2022.04.25
*/

// 업비트 조회
// 2022.04.25 기준 총 113개
const Upbit = require('./upbit')

// 업비트 정보 가져오기
async function upbit_start() {
    const upbit = new Upbit('시리얼키 자리', '액세스키 자리')

    let market_all = await upbit.market_all()
    let market_krw = [];
    for(let i=0; i&amp;lt;market_all.data.length; i++){
        if(market_all.data[i].market.includes(&quot;KRW&quot;)){
            market_krw.push({&quot;data&quot; : market_all.data[i]});
        }
    }
    console.log(&quot;원화 상장 코인 총 개수 : &quot; + market_krw.length)

    for (let i=0; i&amp;lt; market_krw.length; i++){
        {
            let {'data': data} = await upbit.market_ticker(market_krw[i].data.market)
            console.log(data)
        }

        //result.push({&quot;market&quot; : data[i].market, &quot;trade_price&quot; : data[i].trade_price})
    }
}

upbit_start()


// 바이낸스 정보 가져오기
const Binance = require('node-binance-api');
const binance = new Binance().options({
    APIKEY: '액세스키 자리',
    APISECRET: '시크릿키 자리',
    useServerTime: true,
    test: true
})


//사용자 id 저장
var  idSet  =  new  Set();

// Telegram Api 연동
const TelegramBot = require('node-telegram-bot-api');
var  http  =  require('http');
var  request  =  require('sync-request');

// 텔레그램 정보 가져오기
const getToken = (function(){
    const token = process.env.TELEGRAM_TOKEN;
    return function() {
        return token;
    };
})();

const bot = new TelegramBot(getToken(), {polling: true});

bot.onText(/\/start/, (msg, match) =&amp;gt; {
    if(idSet.has(msg.chat.id) ==  false) {
        idSet.add(msg.chat.id);
    }
});

bot.onText(/\/stop/, (msg, match) =&amp;gt; {
    if(idSet.has(msg.chat.id)) {
        idSet.delete(msg.chat.id);
    }
});

setInterval(function() {
    
    // res.map(coin  =&amp;gt; {
    //     for(let  id  of  idSet) {
    //         bot.sendMessage(id, &quot;현재 &quot; + coin.market +&quot; 가격은 [&quot;  +  coin.trade_price +  &quot;] 원 입니다.&quot;);
    //     }
    // });

}, process.env.INTERVAL);&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;h2 data-ke-size=&quot;size26&quot;&gt;upbit.js&lt;/h2&gt;
&lt;pre id=&quot;code_1650804814557&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const rp = require(&quot;request-promise&quot;)
const sign = require(&quot;jsonwebtoken&quot;).sign
const queryEncode = require(&quot;querystring&quot;).encode

async function request(url, qs, token, method) {
    if (!method) {
        method = 'GET'
    }
    let options = {
        method: method, 
        url: url,
        json: true,
        transform: function (body, response) {
            let remain_min = 0
            let remain_sec = 0
            if (response.headers &amp;amp;&amp;amp; response.headers['remaining-req']) {
                let items = response.headers['remaining-req'].split(';')
                for (let item of items) {
                    let [key, val] = item.split('=')
                    if (key.trim()=='min') {
                        remain_min = parseInt(val.trim())
                    } else if (key.trim()=='sec') {
                        remain_sec = parseInt(val.trim())
                    }
                }
            }
            return {
                'success': true,
                'remain_min': remain_min, 
                'remain_sec': remain_sec, 
                'data': body
            }
        }
    }
    if (method=='POST') {
        options.json = qs
    } else {
        options.qs = qs
    }
    if (token) {
        options.headers = {Authorization: `Bearer ${token}`}
    }
    let result = {'success': false, 'message': null, 'name': null}
    try {
        result = await rp(options)
    } catch(e) {
        result.data = null
        if (e.error.error) {
            result.message = e.error.error.message
            result.name = e.error.error.name
        } else {
            result.message = e.message
        }
    }

    return result
}

//전체 계좌 조회
async function accounts() {
    const url = 'https://api.upbit.com/v1/accounts'

    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, {}, token)
    return result
}

// 주문 리스트
async function order_list(market, state, uuids, page) {
    //market: null KRW-BTC
    //state: wait done
    const url = 'https://api.upbit.com/v1/orders'
    let qs = {state:state, page:page}
    if (market) qs['market'] = market
    if (uuids) qs['uuids'] = uuids

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token)
    return result
}

// 주문(매수)
async function order_bid(market, volume, price) {
    //market: KRW-BTC
    const url = 'https://api.upbit.com/v1/orders'
    let qs = {market:market, side:'bid', volume:volume, price:price, ord_type:'limit'}

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token, 'POST')
    return result
}

// 주문(매도)
async function order_ask(market, volume, price) {
    //market: KRW-BTC
    const url = 'https://api.upbit.com/v1/orders'
    let qs = {market:market, side:'ask', volume:volume, price:price, ord_type:'limit'}

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token, 'POST')
    return result
}

// 주문 상세
async function order_detail(uuid) {
    const url = 'https://api.upbit.com/v1/order'
    let qs = {uuid:uuid}

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token)
    return result
}

// 주문 취소
async function order_delete(uuid) {
    const url = 'https://api.upbit.com/v1/order'
    let qs = {uuid:uuid}

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token, 'DELETE')
    return result
}

// 주문 가능 정보
async function order_chance(market) {
    const url = 'https://api.upbit.com/v1/orders/chance'
    let qs = {market:market}

    const query = queryEncode(qs)
    const payload = {
        access_key: this.accessKey,
        nonce: (new Date).getTime(),
        query: query
    }
    const token = sign(payload, this.secretKey)

    let result = await request(url, qs, token)
    return result
}

// 시세종목정보
async function market_all() {
    const url = 'https://api.upbit.com/v1/market/all'
    let result = await request(url)
    return result
}

// 분 캔들
async function market_minute(market, unit, to, count) {
    //unit:  1, 3, 5, 15, 10, 30, 60, 240
    //to: yyyy-MM-dd'T'HH:mm:ssXXX
    const url = 'https://api.upbit.com/v1/candles/minutes/'+unit
    let qs = {market:market}
    if (to) qs.to = to
    if (count) qs.count = count

    let result = await request(url, qs)
    return result
}

// 일 캔들
async function market_day(market, to, count) {
    //to: yyyy-MM-dd'T'HH:mm:ssXXX
    const url = 'https://api.upbit.com/v1/candles/days'
    let qs = {market:market}
    if (to) qs.to = to
    if (count) qs.count = count

    let result = await request(url, qs)
    return result
}

// 주 캔들
async function market_week(market, to, count) {
    //to: yyyy-MM-dd'T'HH:mm:ssXXX
    const url = 'https://api.upbit.com/v1/candles/weeks'
    let qs = {market:market}
    if (to) qs.to = to
    if (count) qs.count = count

    let result = await request(url, qs)
    return result
}

// 월 캔들
async function market_month(market, to, count) {
    //to: yyyy-MM-dd'T'HH:mm:ssXXX
    const url = 'https://api.upbit.com/v1/candles/months'
    let qs = {market:market}
    if (to) qs.to = to
    if (count) qs.count = count

    let result = await request(url, qs)
    return result
}

// 채결 정보
async function market_trade_tick(market, to, count) {
    //to: yyyy-MM-dd'T'HH:mm:ssXXX
    const url = 'https://api.upbit.com/v1/trades/ticks'
    let qs = {market:market}
    if (to) qs.to = to
    if (count) qs.count = count

    let result = await request(url, qs)
    return result
}


// 시세 Ticker
async function market_ticker(markets) {
    // markets: KRW-BTC,KRW-ETH
    const url = 'https://api.upbit.com/v1/ticker'
    let qs = {markets:markets}

    let result = await request(url, qs)
    return result
}


// 호가 정보
async function trade_orderbook(markets) {
    // markets: KRW-BTC,KRW-ETH
    const url = 'https://api.upbit.com/v1/orderbook'
    let qs = {markets:markets}

    let result = await request(url, qs)
    return result
}

// class Upbit
function Upbit(s, a) {
    this.secretKey = s
    this.accessKey = a
}

Upbit.prototype.accounts = accounts
Upbit.prototype.order_list = order_list
Upbit.prototype.order_bid = order_bid
Upbit.prototype.order_ask = order_ask
Upbit.prototype.order_detail = order_detail
Upbit.prototype.order_delete = order_delete
Upbit.prototype.order_chance = order_chance
Upbit.prototype.market_all = market_all
Upbit.prototype.market_minute = market_minute
Upbit.prototype.market_day = market_day
Upbit.prototype.market_week = market_week
Upbit.prototype.market_month = market_month
Upbit.prototype.market_trade_tick = market_trade_tick
Upbit.prototype.market_ticker = market_ticker
Upbit.prototype.trade_orderbook = trade_orderbook

module.exports = Upbit&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;h2 data-ke-size=&quot;size26&quot;&gt;web.js&lt;/h2&gt;
&lt;pre id=&quot;code_1650804843234&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
    http end-point
*/
const express = require('express');
var packageInfo = require('./package.json');

var app = express();

app.get('/', function (req, res) {
    res.json({ version: packageInfo.version });
});

var server = app.listen(process.env.PORT, function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log('Web server started at http://%s:%s', host, port);
});&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;h2 data-ke-size=&quot;size26&quot;&gt;index.js&lt;/h2&gt;
&lt;pre id=&quot;code_1650804875730&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;require('./bot');
require('./web');&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;텔레그램 봇으로 채팅 받는 것까지 성공!!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성을해서 테스트 중이었고 실제로 텔레그램 봇으로 코인 정보를 10초마다 실시간으로 채팅 받는 것까지 성공했다...&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FHZqc/btrAjoMlbH0/Q3e8QduGSD5uBCB1qK1jX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FHZqc/btrAjoMlbH0/Q3e8QduGSD5uBCB1qK1jX0/img.png&quot; data-alt=&quot;PC 텔레그램 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FHZqc/btrAjoMlbH0/Q3e8QduGSD5uBCB1qK1jX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFHZqc%2FbtrAjoMlbH0%2FQ3e8QduGSD5uBCB1qK1jX0%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;516&quot; height=&quot;632&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC 텔레그램 화면&lt;/figcaption&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crjr74/btrAoEvELJN/LV0JD65nNTYCUOuOar5bU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crjr74/btrAoEvELJN/LV0JD65nNTYCUOuOar5bU0/img.jpg&quot; data-alt=&quot;아이폰 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crjr74/btrAoEvELJN/LV0JD65nNTYCUOuOar5bU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrjr74%2FbtrAoEvELJN%2FLV0JD65nNTYCUOuOar5bU0%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;341&quot; height=&quot;585&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아이폰 화면&lt;/figcaption&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;&lt;s&gt;&lt;b&gt;하지만...원화 마켓에 있는 총 113개의 코인의 이름과 현재 종가(trade_price)를 한번에 받아오려고 하니 업비트의 Rest API 요청 수 제한이 있다는 사실을 뒤늦게 깨달아 버렸다... &lt;/b&gt;&lt;/s&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2752&quot; data-origin-height=&quot;1454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqUjcY/btrAdc6ULaj/o7V4WkbM0D5S0YSNYCIGD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqUjcY/btrAdc6ULaj/o7V4WkbM0D5S0YSNYCIGD0/img.png&quot; data-alt=&quot;too many request....-_-&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqUjcY/btrAdc6ULaj/o7V4WkbM0D5S0YSNYCIGD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqUjcY%2FbtrAdc6ULaj%2Fo7V4WkbM0D5S0YSNYCIGD0%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;2752&quot; height=&quot;1454&quot; data-origin-width=&quot;2752&quot; data-origin-height=&quot;1454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;too many request....-_-&lt;/figcaption&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJM4nB/btrAhGFTTFd/3WSk5ENoL6o8zZeoMF45Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJM4nB/btrAhGFTTFd/3WSk5ENoL6o8zZeoMF45Yk/img.png&quot; data-alt=&quot;아... 요청 수 제한이라니 석우형 진짜 선넘네...ㄹㅇ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJM4nB/btrAhGFTTFd/3WSk5ENoL6o8zZeoMF45Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJM4nB%2FbtrAhGFTTFd%2F3WSk5ENoL6o8zZeoMF45Yk%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;2910&quot; height=&quot;1464&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아... 요청 수 제한이라니 석우형 진짜 선넘네...ㄹㅇ&lt;/figcaption&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;그리하여 나의 8시간을 불태운 작업은 여기서 마무리 되었다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;그리고 생각해보니 가능하면 트위터 API도 같이 끌어와야겠다... 매번 트위터켜서 코인들 소식 검색하는것도 귀찮으니ㅜ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kACmF/btrAnEIoZbI/viICc2pJzHamQEYMWRFa50/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kACmF/btrAnEIoZbI/viICc2pJzHamQEYMWRFa50/img.jpg&quot; data-alt=&quot;귀찮귀찮...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kACmF/btrAnEIoZbI/viICc2pJzHamQEYMWRFa50/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkACmF%2FbtrAnEIoZbI%2FviICc2pJzHamQEYMWRFa50%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;379&quot; height=&quot;292&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;귀찮귀찮...&lt;/figcaption&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;/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;그럼 다음 글은 파이썬으로 adios.............&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;h2 data-ke-size=&quot;size26&quot;&gt;Ref&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://johngrib.github.io/blog/2017/03/12/telegram-bot/&quot;&gt;https://johngrib.github.io/blog/2017/03/12/telegram-bot/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://note.heyo.me/%EC%97%85%EB%B9%84%ED%8A%B8api-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%94%A9-1-%EC%A4%80%EB%B9%84-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://note.heyo.me/%EC%97%85%EB%B9%84%ED%8A%B8api-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%94%A9-1-%EC%A4%80%EB%B9%84-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://steemit.com/kr-dev/@asinayo/nodejs-heroku&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://steemit.com/kr-dev/@asinayo/nodejs-heroku&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/95</guid>
      <comments>https://coding-plant.tistory.com/95#entry95comment</comments>
      <pubDate>Sun, 24 Apr 2022 22:18:53 +0900</pubDate>
    </item>
    <item>
      <title>Cause: java.sql.SQLException: ORA-00911: 문자가 부적합합니다</title>
      <link>https://coding-plant.tistory.com/87</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1645775472471&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Cause: java.sql.SQLException: ORA-00911: 문자가 부적합합니다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;DB 툴에서는 ' ; ' 를 작성하는게 맞지만 자바 프로젝트의 xml 파일 내에서는 세미콜론 ' ; ' 을 붙이면 에러가 발생한다.&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-origin-width=&quot;416&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOIm8U/btruiSfAyQm/kzmVRxy2Al6l4v2o2rxsFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOIm8U/btruiSfAyQm/kzmVRxy2Al6l4v2o2rxsFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOIm8U/btruiSfAyQm/kzmVRxy2Al6l4v2o2rxsFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOIm8U%2FbtruiSfAyQm%2FkzmVRxy2Al6l4v2o2rxsFK%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;416&quot; height=&quot;473&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;473&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;h2 data-ke-size=&quot;size26&quot;&gt;해결방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세미콜론을 제거해주면 완료!&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <category>SQL에러</category>
      <category>자바 에러</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/87</guid>
      <comments>https://coding-plant.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 25 Feb 2022 16:56:16 +0900</pubDate>
    </item>
    <item>
      <title>Cause: java.sql.SQLException: ORA-01722: 수치가 부적합합니다</title>
      <link>https://coding-plant.tistory.com/86</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1645683927384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### Cause: java.sql.SQLException: ORA-01722: 수치가 부적합합니다&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;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;DB 칼럼은 문자형인데 파라미터 데이터는 숫자형 ex) &quot;23&quot; &amp;lt;-- 이런식으로만 받는경우 파라미터를 숫자로 인식&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 내 경우는 백단에서 쿼리로 넘겨주는 데이터가 String인데 DB칼럼은 Number 로 되어있어서 나는 에러였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DcgTv/btruiTYkB5x/cUeKLfdZj6Vlb5rkGc8LWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DcgTv/btruiTYkB5x/cUeKLfdZj6Vlb5rkGc8LWK/img.png&quot; data-alt=&quot;ANALY_UNIT 요놈!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DcgTv/btruiTYkB5x/cUeKLfdZj6Vlb5rkGc8LWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDcgTv%2FbtruiTYkB5x%2FcUeKLfdZj6Vlb5rkGc8LWK%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;384&quot; height=&quot;462&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ANALY_UNIT 요놈!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfDRSh/btruhwPM9ai/UsyhaKETBj4wECY1QSbCr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfDRSh/btruhwPM9ai/UsyhaKETBj4wECY1QSbCr0/img.png&quot; data-alt=&quot;이게 범인이었다..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfDRSh/btruhwPM9ai/UsyhaKETBj4wECY1QSbCr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfDRSh%2FbtruhwPM9ai%2FUsyhaKETBj4wECY1QSbCr0%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;4952&quot; height=&quot;190&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이게 범인이었다..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입을 다시 제대로 맞춰주면 해결 완료!&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <category>자바 에러</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/86</guid>
      <comments>https://coding-plant.tistory.com/86#entry86comment</comments>
      <pubDate>Thu, 24 Feb 2022 15:44:47 +0900</pubDate>
    </item>
    <item>
      <title>java.lang.IllegalArgumentException: 메소드 이름에 유효하지 않은 문자가 발견되었습니다. HTTP 메소드 이름은 유효한 토큰이어야 합니다.</title>
      <link>https://coding-plant.tistory.com/85</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baNG9i/btrsYGULSyp/v3XMZUB4qddDYcOt1saRO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baNG9i/btrsYGULSyp/v3XMZUB4qddDYcOt1saRO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baNG9i/btrsYGULSyp/v3XMZUB4qddDYcOt1saRO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaNG9i%2FbtrsYGULSyp%2Fv3XMZUB4qddDYcOt1saRO0%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;778&quot; height=&quot;246&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;246&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;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https 보안으로 인한 문제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b139zC/btrs4MlQ5fh/0Gkdzxwjd2W8QGYvPIZkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b139zC/btrs4MlQ5fh/0Gkdzxwjd2W8QGYvPIZkkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b139zC/btrs4MlQ5fh/0Gkdzxwjd2W8QGYvPIZkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb139zC%2Fbtrs4MlQ5fh%2F0Gkdzxwjd2W8QGYvPIZkkK%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;406&quot; height=&quot;32&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;32&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;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https 를 http 로 변경하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAYxFd/btrs1RPsxeJ/eaVbMMmEtpgFQguNglrkYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAYxFd/btrs1RPsxeJ/eaVbMMmEtpgFQguNglrkYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAYxFd/btrs1RPsxeJ/eaVbMMmEtpgFQguNglrkYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAYxFd%2Fbtrs1RPsxeJ%2FeaVbMMmEtpgFQguNglrkYk%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;400&quot; height=&quot;37&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/85</guid>
      <comments>https://coding-plant.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 11 Feb 2022 10:42:39 +0900</pubDate>
    </item>
    <item>
      <title>Mybatis CDATA 사용법</title>
      <link>https://coding-plant.tistory.com/83</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;CDATA 쓰는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이바티스에서&amp;nbsp;.xml&amp;nbsp;파일을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;쿼리문안에&amp;nbsp;문자열&amp;nbsp;비교연산자&amp;nbsp;혹은&amp;nbsp;부등호를&amp;nbsp;처리해야할&amp;nbsp;일이&amp;nbsp;있다. &lt;br /&gt;이 때 CDATA 를 사용하지 않으면 DB툴에서 동작시에는 문제없이 동작하지만 마이바티스 xml 파일내에서 입력하면 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;간단한 예시&lt;/h2&gt;
&lt;pre id=&quot;code_1643183270006&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT	*
FROM TABLE_A
&amp;lt;![CDATA[
WHERE columA &amp;lt;&amp;gt; 'B의값'
]]&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런 비교연산자가 있을 때 CDATA 를 사용하지 않으면 부등호 '&amp;lt;', '&amp;gt;'가 열림,닫힘 태그로 인식되어 버리기 때문에 에러가 발생한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script data-mce-fragment=&quot;1&quot;&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/83</guid>
      <comments>https://coding-plant.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 26 Jan 2022 16:49:04 +0900</pubDate>
    </item>
    <item>
      <title>java.lang.Integer cannot be cast to java.lang.String</title>
      <link>https://coding-plant.tistory.com/82</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1643170447505&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java.lang.Integer cannot be cast to java.lang.String&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자타입의 값(Int,Long..) 을 String으로 바로 캐스팅하려고 시도해서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643170623788&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 실패 예시
String TEMP = (String)request.getAttribute(&quot;백단에서 넘겨준 값&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;pre id=&quot;code_1643171881714&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답
String TEMP = String.valueOf(request.getAttribute(&quot;백단에서 넘겨준 값&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 같이 String.valueOf() 함수를 이용하면 해결 가능&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;&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/82</guid>
      <comments>https://coding-plant.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 26 Jan 2022 13:18:33 +0900</pubDate>
    </item>
    <item>
      <title>Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near &amp;quot;,&amp;quot;</title>
      <link>https://coding-plant.tistory.com/81</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1642746062470&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### Error querying database.  Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near &quot;,&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 내용 그대로 문자 오류이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성한 쿼리문에 &quot;,&quot; 가 잘못들어가있는 위치를 찾으면 해결가능!&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;나같은 경우엔 WHERE 절에 AND 와 &quot;,&quot; 가 같이 적혀 있어 생긴 에러였다.&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/81</guid>
      <comments>https://coding-plant.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 21 Jan 2022 15:22:31 +0900</pubDate>
    </item>
    <item>
      <title>Mapped Statements collection does not contain value for..</title>
      <link>https://coding-plant.tistory.com/80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1642567981190&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for alimtalk_csv.selectNextAlimtalkCSVSeq&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러 원인&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mapper id가 다를 경우 &lt;br /&gt;- mapper파일(MyBatis의 쿼리문을 등록한 XML 파일)에 &amp;lt;select id=''.. 에 id와 mapper파일에 직접 접근하는 service 메소드 id값이 다름&lt;/li&gt;
&lt;li&gt;Parameter와 bean의 필드명이 틀림&lt;/li&gt;
&lt;li&gt;mapper파일(MyBatis의 쿼리문을 등록한 XML 파일)에에 정의된 네임스페이스(namespace)와&amp;nbsp; &lt;br /&gt;mapper파일에 직접 접근하는 java파일(DAO나 service)에서 호출하는 네임스페이스(namespace)가 다름&lt;/li&gt;
&lt;li&gt;MyBatis config파일에 mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우&lt;/li&gt;
&lt;li&gt;mapper에 정의된 namespace 명칭이 같은 Application 내에 중복될 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우는 &lt;b&gt;mybatis-config-postgres.xml&lt;/b&gt; 파일에서 새로추가한 xml 파일을 매핑시켜주지 않아서 생긴 문제였다.&lt;/p&gt;
&lt;pre id=&quot;code_1642646207307&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
	&amp;lt;mappers&amp;gt;
		&amp;lt;mapper resource=&quot;bizmsg/alimtalk_csv/sql/AlimtalkCSV_Postgres.xml&quot; /&amp;gt;
	&amp;lt;/mappers&amp;gt;
&amp;lt;/configuration&amp;gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/80</guid>
      <comments>https://coding-plant.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 19 Jan 2022 13:54:53 +0900</pubDate>
    </item>
    <item>
      <title>[Log4j] log4j 2 사용법</title>
      <link>https://coding-plant.tistory.com/78</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;log4j2.xml&amp;nbsp;파일&amp;nbsp;코드&amp;nbsp;구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APACHE 공식 래퍼런스 문서&amp;nbsp;기본 형태 + 업무에서 배운 형태&lt;/p&gt;
&lt;pre id=&quot;code_1640766902836&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;Configuration status=&quot;debug&quot; name=&quot;RoutingTest&quot; monitorInterval=&quot;30&quot;&amp;gt;
  &amp;lt;Properties&amp;gt;
    &amp;lt;Property name=&quot;filename&quot;&amp;gt;target/rolling1/rollingtest-$${sd:type}.log&amp;lt;/Property&amp;gt;
  &amp;lt;/Properties&amp;gt;
  &amp;lt;ThresholdFilter level=&quot;debug&quot;/&amp;gt;
 
  &amp;lt;Appenders&amp;gt;
    &amp;lt;Console name=&quot;STDOUT&quot;&amp;gt;
      &amp;lt;PatternLayout pattern=&quot;%m%n&quot;/&amp;gt;
      &amp;lt;ThresholdFilter level=&quot;debug&quot;/&amp;gt;
    &amp;lt;/Console&amp;gt;
    &amp;lt;Routing name=&quot;Routing&quot;&amp;gt;
      &amp;lt;Routes pattern=&quot;$${sd:type}&quot;&amp;gt;
        &amp;lt;Route&amp;gt;
          &amp;lt;RollingFile name=&quot;Rolling-${sd:type}&quot; fileName=&quot;${filename}&quot;
                       filePattern=&quot;target/rolling1/test1-${sd:type}.%i.log.gz&quot;&amp;gt;
            &amp;lt;PatternLayout&amp;gt;
              &amp;lt;pattern&amp;gt;%d %p %c{1.} [%t] %m%n&amp;lt;/pattern&amp;gt;
            &amp;lt;/PatternLayout&amp;gt;
            &amp;lt;TimeBasedTriggeringPolicy interval=&quot;1&quot; modulate=&quot;true&quot; /&amp;gt;
            &amp;lt;SizeBasedTriggeringPolicy size=&quot;500&quot; /&amp;gt;
          &amp;lt;/RollingFile&amp;gt;
        &amp;lt;/Route&amp;gt;
        &amp;lt;Route ref=&quot;STDOUT&quot; key=&quot;Audit&quot;/&amp;gt;
      &amp;lt;/Routes&amp;gt;
    &amp;lt;/Routing&amp;gt;
  &amp;lt;/Appenders&amp;gt;
 
  &amp;lt;Loggers&amp;gt;
    &amp;lt;Logger name=&quot;EventLogger&quot; level=&quot;info&quot; additivity=&quot;false&quot;&amp;gt;
      &amp;lt;AppenderRef ref=&quot;Routing&quot;/&amp;gt;
    &amp;lt;/Logger&amp;gt;
 
    &amp;lt;Root level=&quot;error&quot;&amp;gt;
      &amp;lt;AppenderRef ref=&quot;STDOUT&quot;/&amp;gt;
    &amp;lt;/Root&amp;gt;
  &amp;lt;/Loggers&amp;gt;
 
&amp;lt;/Configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;각각의 요소에 대해 하나씩 정리해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우선 가장 상단의 &amp;lt;Configuration&amp;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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Configuration&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1640767141088&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Configuration status=&quot;debug&quot; name=&quot;RoutingTest&quot; monitorInterval=&quot;30&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;Configuration&amp;gt;은 로그 설정의 최상위 노드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;Configuration&amp;gt;은 &amp;lt;Properties&amp;gt;, &amp;lt;Appenders&amp;gt;, &amp;lt;Loggers&amp;gt;요소를 자식노드로 가지고 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;status 속성은 log4j의 내부 이벤트에 대한 로그 레벨을 의미. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;monitorInterval=&quot;30&quot; 은 Log4j가 파일의 변경 여부를 확인하는 주기를 '30'분 주기로 하겠다는 뜻이다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Properties&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1640767416432&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Properties&amp;gt;
    &amp;lt;Property name=&quot;filename&quot;&amp;gt;target/rolling1/rollingtest-$${sd:type}.log&amp;lt;/Property&amp;gt;
  &amp;lt;/Properties&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;Properties&amp;gt;는 해당 &amp;lt;Configuration&amp;gt; 영역 내에서 사용할 프로퍼티를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Layout&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1640767567356&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;PatternLayout&amp;gt;
	&amp;lt;pattern&amp;gt;%d %p %c{1.} [%t] %m%n&amp;lt;/pattern&amp;gt;
&amp;lt;/PatternLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;날짜나 시간(12,24) 포맷, 색깔, 출력 요소 등을 결정할 수 있는 요소이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구체적인 사용 방법은 &lt;u&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://logging.apache.org/log4j/2.x/manual/layouts.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/b&gt;&lt;/u&gt;&amp;nbsp;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Appenders&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Appender는 log 메세지를 특정 위치에 전달해주는 역할이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Appender는 layout을 통해 로그를 formatting 하고, 어떤 방식으로 로그를 제공할지 결정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Appender에는 여러 종류가 있다. 소개되지 않은 나머지는 &lt;u&gt;&lt;b&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://logging.apache.org/log4j/2.x/manual/appenders.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/b&gt;&lt;/u&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ConsoleAppender&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;RollingFileAppender&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;FileAppender&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JDBCAppender&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;등등...&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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: #333333;&quot;&gt;여기서 가장 핵심이라고 생각하는 &lt;b&gt;RollingFileAppender&lt;/b&gt; 만 따로 설명하자면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1640786492376&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;RollingFile name=&quot;Rolling-${sd:type}&quot; fileName=&quot;${filename}&quot; 
	filePattern=&quot;target/rolling1/test1-${sd:type}.%i.log.gz&quot;&amp;gt;
       
       &amp;lt;PatternLayout&amp;gt;
       		&amp;lt;pattern&amp;gt;%d %p %c{1.} [%t] %m%n&amp;lt;/pattern&amp;gt;
       &amp;lt;/PatternLayout&amp;gt;
       &amp;lt;Policies&amp;gt;
       	&amp;lt;TimeBasedTriggeringPolicy interval=&quot;1&quot; modulate=&quot;true&quot; /&amp;gt;
       	&amp;lt;SizeBasedTriggeringPolicy size=&quot;500&quot; /&amp;gt;
       &amp;lt;/Policies&amp;gt;
       &amp;lt;DefaultRolloverStrategy max=&quot;10&quot; fileIndex=&quot;min&quot;/&amp;gt;
&amp;lt;/RollingFile&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로그 파일에 문제가 생기면 로그가 전부 유실될 수 있기 때문에 &lt;b&gt;RollingFileAppender&lt;/b&gt;에서 설정을 해줌으로서 미연에 방지할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;RollingFileAppender 는 파일에 로그를 기록하고, 특정 기준에 따라 압축하여 저장하는 방식의 Appender 이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;RollingFileAppender의 구체적인 속성들을 설명하자면&lt;/span&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;span style=&quot;color: #333333;&quot;&gt;Policy&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Policy는 간단하게 설명하자면 기준이되는 트리거를 정할 수 있고, 구체적인 제약사항을 정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;File Rolling Up 기준이고, 하나의 RollingFileAppender에는 여러 Policy를 적용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를 들어 TimeBasedTriggeringPolicy 를 삽입한다고 치면 설정한 interval=? 에 따라 주기가 달라진다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;OnStartupTriggeringPolicy&amp;nbsp;&lt;/b&gt;:&amp;nbsp;jvm&amp;nbsp;start시&amp;nbsp;trigger&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;TimeBasedTriggeringPolicy&lt;/b&gt; : time에 따른 trigger&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;SizeBasedTriggeringPolicy&lt;/b&gt; : file size에 따른 trigger&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;CronTriggeringPolicy&lt;/b&gt; : Cron Expression(시간에 관한 표현)에 따른 trigger&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;&quot;&gt;DefaultRolloverStrategy&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DefaultRolloverStrategy는 datetime 패턴과 File Pattern의 int값을 받아서 정해진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;File Pattern 숫자는 DB에서 사용되는 자동증가 Sequence처럼 rollover 마다 1씩 증가한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;datetime은 현재 시간으로 대체되고, 각각 rollover 이후에는 정해준 형식대로 아래 사진처럼(예시) 저장된다.&lt;/span&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL1E67/btrpdoDF8mx/yDItnN7rkvccapvtQCAM1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL1E67/btrpdoDF8mx/yDItnN7rkvccapvtQCAM1K/img.png&quot; data-alt=&quot;예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL1E67/btrpdoDF8mx/yDItnN7rkvccapvtQCAM1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL1E67%2FbtrpdoDF8mx%2FyDItnN7rkvccapvtQCAM1K%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;248&quot; height=&quot;26&quot; data-origin-width=&quot;248&quot; data-origin-height=&quot;26&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시&lt;/figcaption&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: #333333;&quot;&gt;해당 &lt;b&gt;Strategy&lt;/b&gt;에 부여할 수 있는 속성들&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;fileIndex&lt;/b&gt; : max로 설정 시 높은 index가 더 최신 파일이 됩니다. min으로 설정 시 작은 index가 최신 파일이 된다. 기존의 파일들을 rename하는 방식으로 동작.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;compressionLevel&lt;/b&gt; : 0~9까지 정수값. 0은 압축하지 않고, 1은 최고 속도, 9는 최고 압축. ZIP파일만 가능함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;tempCompressedFilePattern&lt;/b&gt; : 압축하는 동안의 파일 이름 패턴.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;min&lt;/b&gt; : counter 최소값. 기본값은 1&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;max&lt;/b&gt; : counter 최대값. 만약 최대값에 도달하면 오래된 파일을 삭제. 기본값은 7&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Logger&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1640824817325&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Loggers&amp;gt;
	&amp;lt;!-- Additivity값은 중복된 로그를 남길 지에 대한 속성 --&amp;gt;
    &amp;lt;Logger name=&quot;EventLogger&quot; level=&quot;INFO&quot; additivity=&quot;false&quot;&amp;gt;
      &amp;lt;AppenderRef ref=&quot;Routing&quot;/&amp;gt;
    &amp;lt;/Logger&amp;gt;
 
    &amp;lt;Root level=&quot;error&quot;&amp;gt;
      &amp;lt;AppenderRef ref=&quot;STDOUT&quot;/&amp;gt;
    &amp;lt;/Root&amp;gt;
&amp;lt;/Loggers&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Root패키지의 &amp;lt;Logger&amp;gt;는 필수이고, 여러개를 적용할 때에는 &amp;lt;Loggers&amp;gt; 내에 복수개의 &amp;lt;Logger&amp;gt;로 설정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당 로거는 name=&quot;EventLogger&quot; 패키지에 해당하는 파일들에 대해서 INFO 이상 레벨의 로그를 콘솔에 남기는 로거이다.&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;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;letter-spacing: 0px; color: #333333;&quot;&gt;그냥 여태까지는 로그를 찍어야하는구나하고 대충 사용할 줄만 알았었는데 이번 기회에 조금 자세히 공부할 수 있었다&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ref&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution&lt;/a&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;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/백엔드</category>
      <category>log4j2</category>
      <category>log4j2.xml</category>
      <category>Logger</category>
      <category>로그</category>
      <category>스프링</category>
      <category>자바</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/78</guid>
      <comments>https://coding-plant.tistory.com/78#entry78comment</comments>
      <pubDate>Wed, 29 Dec 2021 17:40:54 +0900</pubDate>
    </item>
    <item>
      <title>Unable to scan WEB-INF for JAX-RS annotations, you must manually register your classes/resources</title>
      <link>https://coding-plant.tistory.com/77</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러메세지&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crAFxE/btro30JbXxe/Cll46k8JlmSvGt3rCJD6d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crAFxE/btro30JbXxe/Cll46k8JlmSvGt3rCJD6d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crAFxE/btro30JbXxe/Cll46k8JlmSvGt3rCJD6d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrAFxE%2Fbtro30JbXxe%2FCll46k8JlmSvGt3rCJD6d0%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;1375&quot; height=&quot;74&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;74&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;h2 data-ke-size=&quot;size26&quot;&gt;해결방법 1(추천X)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web.xml 파일 내에서 해당 구문을 찾아 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt; 로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 해당 &amp;lt;context-param&amp;gt; 전체 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvbDY/btroTVPG17I/kbM9B3TG1o7o8hasKdBiqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvbDY/btroTVPG17I/kbM9B3TG1o7o8hasKdBiqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvbDY/btroTVPG17I/kbM9B3TG1o7o8hasKdBiqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvvbDY%2FbtroTVPG17I%2FkbM9B3TG1o7o8hasKdBiqk%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;474&quot; height=&quot;92&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 방법은 대신 실서버에서 하위 Path들을 못잡는 문제가 발생할 수 있음.&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;h2 data-ke-size=&quot;size26&quot;&gt;해결방법 2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 javassist.jar 파일을 최신버전으로 변경하는 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Maven 이나 Gradle을 사용하는 프로젝트라면 &amp;lt;dependency&amp;gt;에서 변경하면 되고, 로컬에서 jar 파일로 관리하고 있다면 아래와 같은 방법으로 해결할 수 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;javassist-3.12.1.GA.jar &amp;ndash; 기존 파일 삭제&lt;/li&gt;
&lt;li&gt;javassist-3.20.0-GA.jar &amp;ndash; 기존 파일 삭제&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;라이브러리 추가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Javassist 3.28.0-GA.jar &amp;ndash; 새로 추가(&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Java 8 버전&lt;/b&gt;&lt;/span&gt;일 때)&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bJ3ZuP/btrpmfZKHjJ/t9iGIxieo1eyck1PiQXGQk/Javassist%203.28.0-GA.jar?attach=1&amp;amp;knm=tfile.jar&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Javassist 3.28.0-GA.jar&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.74MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Javassist 3.23.1-GA.jar &amp;ndash; 새로 추가(&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Java&amp;nbsp;7&amp;nbsp;버전&lt;/b&gt;&lt;/span&gt;일&amp;nbsp;때)&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/5mRcE/btrpoWMfqmg/DymBACzq4AKNg2LJkSxCw1/Javassist%203.23.1-GA.jar?attach=1&amp;amp;knm=tfile.jar&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Javassist 3.23.1-GA.jar&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.72MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/에러메세지</category>
      <category>스프링</category>
      <category>에러</category>
      <category>예외</category>
      <category>자바</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/77</guid>
      <comments>https://coding-plant.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 28 Dec 2021 11:45:57 +0900</pubDate>
    </item>
    <item>
      <title>백준 11021 A+B-7(Java)</title>
      <link>https://coding-plant.tistory.com/76</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11021&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제보기&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eb36uO/btro13rK7wy/L1BuOw3t70ASFz5Jm9uckk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eb36uO/btro13rK7wy/L1BuOw3t70ASFz5Jm9uckk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eb36uO/btro13rK7wy/L1BuOw3t70ASFz5Jm9uckk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feb36uO%2Fbtro13rK7wy%2FL1BuOw3t70ASFz5Jm9uckk%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;992&quot; height=&quot;686&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;686&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;h2 data-ke-size=&quot;size26&quot;&gt;정답&lt;/h2&gt;
&lt;pre id=&quot;code_1640571923680&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package baekjoon.ex_for;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Q_11021 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		/*
		 * 문제 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
		 * 
		 * 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다.
		 * 
		 * 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)
		 * 
		 * 출력 각 테스트 케이스마다 &quot;Case #x: &quot;를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
		 * 
		 * 예제 입력 1 5 1 1 2 3 3 4 9 8 5 2 예제 출력 1 Case #1: 2 Case #2: 5 Case #3: 7 Case
		 * #4: 17 Case #5: 7
		 * 
		 */

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		int T = Integer.parseInt(str);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		ArrayList&amp;lt;Integer&amp;gt; arrlist = new ArrayList&amp;lt;Integer&amp;gt;();

		for (int i = 0; i &amp;lt; T; i++) {
			String[] temp = br.readLine().split(&quot; &quot;);
			int A = Integer.parseInt(temp[0]);
			int B = Integer.parseInt(temp[1]);
			arrlist.add(A + B);
		}
		for (int i = 0; i &amp;lt; arrlist.size(); i++) {
			bw.append(&quot;Case #&quot; + (i + 1) + &quot;: &quot; + arrlist.get(i) + &quot;\n&quot;);
		}

		br.close();
		bw.flush();
		bw.close();

	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/백준</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/76</guid>
      <comments>https://coding-plant.tistory.com/76#entry76comment</comments>
      <pubDate>Mon, 27 Dec 2021 11:25:30 +0900</pubDate>
    </item>
    <item>
      <title>백준 2742 기찍 N(Java)</title>
      <link>https://coding-plant.tistory.com/75</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;u&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2742&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제보기&lt;/a&gt;&lt;/u&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRt1yB/btroVjJcJoe/Lvx1kPAmZkGqQ1jzstTDZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRt1yB/btroVjJcJoe/Lvx1kPAmZkGqQ1jzstTDZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRt1yB/btroVjJcJoe/Lvx1kPAmZkGqQ1jzstTDZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRt1yB%2FbtroVjJcJoe%2FLvx1kPAmZkGqQ1jzstTDZ1%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;1012&quot; height=&quot;645&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;645&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;h2 data-ke-size=&quot;size26&quot;&gt;정답&lt;/h2&gt;
&lt;pre id=&quot;code_1640571792849&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package baekjoon.ex_for;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Q_2742 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		/*
		 * 문제 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
		 * 
		 * 입력 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
		 * 
		 * 출력 첫째 줄부터 N번째 줄 까지 차례대로 출력한다.
		 * 
		 * 예제 입력 1 5 예제 출력 1 5 4 3 2 1
		 * 
		 */

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		int N = Integer.parseInt(str);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		for (int i = N; i &amp;gt;= 1; i--) {
			bw.append(i + &quot;\n&quot;);
		}

		br.close();
		bw.flush();
		bw.close();

	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
  if (window.location.pathname.split(&quot;/&quot;)[1] === &quot;m&quot; &amp;&amp; navigator.userAgent.indexOf(&quot;Tistory&quot;) === -1 &amp;&amp; navigator.userAgent.indexOf(&quot;Android&quot;) === -1) {
    window.location.href = window.location.origin + window.location.pathname.substr(2);
  }
&lt;/script&gt;
&lt;/p&gt;</description>
      <category>개발/백준</category>
      <author>개발자 우디</author>
      <guid isPermaLink="true">https://coding-plant.tistory.com/75</guid>
      <comments>https://coding-plant.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 27 Dec 2021 11:23:19 +0900</pubDate>
    </item>
  </channel>
</rss>