<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%EA%B3%84%EB%B0%9C%EC%9E%90</id>
	<title>IT 위키 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%EA%B3%84%EB%B0%9C%EC%9E%90"/>
	<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/%EA%B3%84%EB%B0%9C%EC%9E%90"/>
	<updated>2026-09-15T23:51:32Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=Git_%ED%8C%A8%EC%8A%A4%ED%8A%B8_%ED%8F%AC%EC%9B%8C%EB%93%9C&amp;diff=73350</id>
		<title>Git 패스트 포워드</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=Git_%ED%8C%A8%EC%8A%A4%ED%8A%B8_%ED%8F%AC%EC%9B%8C%EB%93%9C&amp;diff=73350"/>
		<updated>2026-08-19T00:39:13Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: &amp;#039;&amp;#039;&amp;#039;Git 패스트 포워드&amp;#039;&amp;#039;&amp;#039;(Git fast-forward)는 Git에서 현재 브랜치가 가리키는 커밋이 병합 대상 커밋의 조상(ancestor)인 경우, 별도의 병합 커밋(merge commit)을 만들지 않고 현재 브랜치의 포인터를 대상 커밋으로 이동시키는 병합 방식이다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot;&amp;gt;Git, 「git-merge Documentation」, https://git-scm.com/docs/git-merge, 2026년 8월 19일 확인.&amp;lt;/ref&amp;gt;  == 개요 == Git에서 두 브랜치를 병합...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Git 패스트 포워드&#039;&#039;&#039;(Git fast-forward)는 [[Git]]에서 현재 브랜치가 가리키는 커밋이 병합 대상 커밋의 조상(ancestor)인 경우, 별도의 병합 커밋(merge commit)을 만들지 않고 현재 브랜치의 포인터를 대상 커밋으로 이동시키는 병합 방식이다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot;&amp;gt;Git, 「git-merge Documentation」, https://git-scm.com/docs/git-merge, 2026년 8월 19일 확인.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
Git에서 두 브랜치를 병합할 때 현재 브랜치와 대상 브랜치의 커밋 이력이 서로 갈라지지 않았다면 새로운 병합 커밋을 만들 필요가 없다. 현재 브랜치가 가리키는 커밋에서 대상 브랜치의 최신 커밋까지 하나의 커밋 계보를 따라 이동할 수 있기 때문이다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음과 같은 커밋 구조가 있다고 가정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B  main&lt;br /&gt;
     \&lt;br /&gt;
      C---D  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`main` 브랜치의 최신 커밋 `B`는 `feature` 브랜치의 최신 커밋 `D`의 조상이다. 이 상태에서 `main`에 `feature`를 병합하면 Git은 `main`의 브랜치 포인터를 `D`까지 이동시킬 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C---D  main, feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 과정에서는 새로운 병합 커밋이 생성되지 않는다. Git 공식 Pro Git 문서에서도 한 브랜치가 다른 브랜치 이후의 커밋을 가리키고 있을 경우 브랜치 포인터를 최신 커밋으로 이동시키는 방식을 패스트 포워드라고 설명한다.&amp;lt;ref name=&amp;quot;progit-merge&amp;quot;&amp;gt;Scott Chacon, Ben Straub, 「Git 브랜치 - 브랜치와 Merge 의 기초」, https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88.html, 2026년 8월 19일 확인.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 실행 ==&lt;br /&gt;
일반적인 `git merge`는 패스트 포워드가 가능한 경우 기본적으로 이를 이용한다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음과 같이 `feature` 브랜치를 `main`에 병합할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git switch main&lt;br /&gt;
git merge feature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
패스트 포워드가 이루어지면 출력에 다음과 같이 `Fast-forward`가 표시될 수 있다.&amp;lt;ref name=&amp;quot;progit-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Updating abc1234..def5678&lt;br /&gt;
Fast-forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 경우 `main` 브랜치가 가리키는 커밋만 `feature`의 최신 커밋으로 이동하며 별도의 merge commit은 생성되지 않는다.&lt;br /&gt;
&lt;br /&gt;
== 패스트 포워드가 가능한 조건 ==&lt;br /&gt;
패스트 포워드가 가능하려면 현재 브랜치의 최신 커밋이 병합 대상 브랜치 최신 커밋의 조상이어야 한다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
다음과 같은 경우 패스트 포워드가 가능하다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C  main&lt;br /&gt;
         \&lt;br /&gt;
          D---E  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`main`이 가리키는 `C`는 `feature`가 가리키는 `E`의 조상이므로 `main`의 포인터를 `E`로 이동시키는 것만으로 병합을 완료할 수 있다.&lt;br /&gt;
&lt;br /&gt;
반면 두 브랜치에서 각각 새로운 커밋이 만들어져 이력이 갈라진 경우에는 패스트 포워드만으로 병합할 수 없다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      C---D  main&lt;br /&gt;
     /&lt;br /&gt;
A---B&lt;br /&gt;
     \&lt;br /&gt;
      E---F  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 구조에서 `D`는 `F`의 조상이 아니다. 따라서 단순히 `main`의 포인터를 `F`로 이동시키면 `C`와 `D`의 변경 이력을 현재 브랜치에서 잃게 된다.&lt;br /&gt;
&lt;br /&gt;
일반적인 `git merge feature`를 실행하면 Git은 두 브랜치의 끝과 공통 조상을 이용하는 3-way merge를 수행하고 그 결과를 새로운 병합 커밋으로 기록한다.&amp;lt;ref name=&amp;quot;progit-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      C---D&lt;br /&gt;
     /     \&lt;br /&gt;
A---B       G  main&lt;br /&gt;
     \     /&lt;br /&gt;
      E---F  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 관련 옵션 ==&lt;br /&gt;
`git merge`는 `--ff`, `--no-ff`, `--ff-only` 옵션으로 패스트 포워드 동작을 제어할 수 있다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 옵션&lt;br /&gt;
! 동작&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--ff&amp;lt;/code&amp;gt;&lt;br /&gt;
| 가능한 경우 패스트 포워드한다. 패스트 포워드가 불가능하면 일반적인 병합을 수행해 병합 커밋을 생성한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--no-ff&amp;lt;/code&amp;gt;&lt;br /&gt;
| 패스트 포워드가 가능한 경우에도 병합 커밋을 생성한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--ff-only&amp;lt;/code&amp;gt;&lt;br /&gt;
| 패스트 포워드가 가능한 경우에만 병합하고, 불가능하면 병합하지 않고 오류 상태로 종료한다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== --ff ===&lt;br /&gt;
`--ff`는 병합 대상 이력이 현재 이력의 후손이라면 브랜치 포인터만 이동시키고 별도의 병합 커밋을 만들지 않는다. 일반적인 상황에서 `git merge`의 기본 동작이다. 다만 자연스러운 `refs/tags/` 위치에 저장되지 않은 annotated tag를 병합하는 경우 등의 예외가 있다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git merge --ff feature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== --no-ff ===&lt;br /&gt;
`--no-ff`를 사용하면 패스트 포워드가 가능한 경우에도 새로운 병합 커밋을 생성한다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git merge --no-ff feature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 원래 다음과 같은 구조에서,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C  main&lt;br /&gt;
         \&lt;br /&gt;
          D---E  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
일반적인 패스트 포워드를 사용하면 다음처럼 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C---D---E  main, feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
반면 `--no-ff`를 사용하면 개념적으로 다음과 같이 기능 브랜치가 병합되었다는 사실을 나타내는 별도의 병합 커밋을 남길 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C-------M  main&lt;br /&gt;
         \     /&lt;br /&gt;
          D---E  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
따라서 기능 브랜치 단위의 병합 기록을 커밋 그래프에 명시적으로 남길 필요가 있는 개발 정책에서 사용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== --ff-only ===&lt;br /&gt;
`--ff-only`는 패스트 포워드가 가능한 경우에만 병합한다. 두 브랜치의 이력이 갈라져 패스트 포워드가 불가능하면 Git은 병합 커밋을 자동으로 생성하지 않고 명령을 실패시킨다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git merge --ff-only feature&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
따라서 병합으로 인해 의도하지 않은 비선형 커밋 이력이 생성되는 것을 방지하려는 경우 사용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
== 일반 병합과의 차이 ==&lt;br /&gt;
패스트 포워드와 비 패스트 포워드 병합의 가장 큰 차이는 새로운 병합 커밋의 생성 여부와 커밋 그래프의 형태이다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 구분&lt;br /&gt;
! 패스트 포워드&lt;br /&gt;
! 비 패스트 포워드 병합&lt;br /&gt;
|-&lt;br /&gt;
! 조건&lt;br /&gt;
| 현재 커밋이 대상 커밋의 조상&lt;br /&gt;
| 두 브랜치의 이력이 서로 갈라진 경우 등&lt;br /&gt;
|-&lt;br /&gt;
! 브랜치 포인터&lt;br /&gt;
| 대상 커밋으로 이동&lt;br /&gt;
| 새 병합 커밋으로 이동&lt;br /&gt;
|-&lt;br /&gt;
! 새 병합 커밋&lt;br /&gt;
| 생성하지 않음&lt;br /&gt;
| 일반적으로 생성&lt;br /&gt;
|-&lt;br /&gt;
! 커밋 그래프&lt;br /&gt;
| 선형 구조를 유지&lt;br /&gt;
| 분기와 병합 구조가 남음&lt;br /&gt;
|-&lt;br /&gt;
! 3-way merge&lt;br /&gt;
| 필요하지 않음&lt;br /&gt;
| 일반적으로 수행&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
패스트 포워드는 서로 독립적으로 변경된 두 이력을 실제로 합치는 작업이 아니라 기존 커밋 계보를 따라 브랜치의 위치를 앞으로 이동시키는 작업에 가깝다. 따라서 일반적인 3-way merge에서 발생할 수 있는 변경 내용 간의 병합 충돌도 패스트 포워드 자체에서는 발생하지 않는다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rebase와의 관계 ==&lt;br /&gt;
[[Git rebase]]는 브랜치의 기반을 다른 커밋으로 변경하면서 기존 변경 사항을 새로운 기반 위에 다시 적용한다. 이를 이용하면 서로 갈라져 있던 브랜치를 패스트 포워드가 가능한 구조로 만들 수 있다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음과 같이 `main`과 `feature`가 갈라져 있다고 가정한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      C---D  main&lt;br /&gt;
     /&lt;br /&gt;
A---B&lt;br /&gt;
     \&lt;br /&gt;
      E---F  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 상태에서는 `main`에서 `feature`로 바로 패스트 포워드할 수 없다.&lt;br /&gt;
&lt;br /&gt;
`feature`를 `main` 위로 rebase하면 개념적으로 다음과 같이 커밋 이력을 구성할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A---B---C---D  main&lt;br /&gt;
             \&lt;br /&gt;
              E&#039;---F&#039;  feature&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이후 `main`에서 `feature`를 병합하면 `main`의 포인터를 `F&#039;`로 이동시키는 패스트 포워드가 가능하다.&lt;br /&gt;
&lt;br /&gt;
다만 rebase와 패스트 포워드는 서로 다른 작업이다. rebase는 기존 변경 사항을 새로운 기반 위에 다시 적용하면서 새로운 커밋을 만들기 때문에 해당 커밋들의 ID가 변경될 수 있다. 반면 패스트 포워드 자체는 기존 커밋을 다시 작성하지 않고 브랜치 포인터를 기존 커밋으로 이동시킨다.&lt;br /&gt;
&lt;br /&gt;
== Git pull과 패스트 포워드 ==&lt;br /&gt;
`git pull`은 원격 저장소에서 변경 사항을 가져온 뒤 현재 브랜치에 통합하는 명령이다. 현재 Git 공식 문서에서는 `git pull`이 먼저 `git fetch`를 실행한 뒤 선택된 방식에 따라 원격 브랜치의 변경 사항을 현재 브랜치에 통합한다고 설명한다.&amp;lt;ref name=&amp;quot;git-pull&amp;quot;&amp;gt;Git, 「git-pull Documentation」, https://git-scm.com/docs/git-pull, 2026년 8월 19일 확인.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
로컬 브랜치에 원격 브랜치와 갈라지는 별도의 이력이 없다면 패스트 포워드 방식으로 갱신할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --ff-only&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`--ff-only`를 사용하면 로컬 브랜치와 원격 브랜치의 이력이 갈라지지 않은 경우에만 갱신한다. 이력이 갈라져 패스트 포워드할 수 없다면 명령이 실패하므로, 자동으로 병합 커밋이 만들어지는 것을 원하지 않을 때 사용할 수 있다.&amp;lt;ref name=&amp;quot;git-pull&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 설정 ==&lt;br /&gt;
패스트 포워드 정책은 명령행 옵션뿐 아니라 Git 설정을 통해 지정할 수도 있다. `merge.ff`를 `false`로 설정하면 `git merge --no-ff`와 같은 동작을 하며, `only`로 설정하면 `git merge --ff-only`와 같은 방식으로 패스트 포워드 병합만 허용한다.&amp;lt;ref name=&amp;quot;git-merge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 모든 저장소에서 패스트 포워드 가능한 병합만 허용하도록 설정하려면 다음과 같이 구성할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git config --global merge.ff only&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
특정 저장소에만 적용하려면 `--global`을 제외한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git config merge.ff only&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`git pull`의 패스트 포워드 정책은 `pull.ff` 설정으로도 제어할 수 있다.&amp;lt;ref name=&amp;quot;git-pull&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 같이 보기 ==&lt;br /&gt;
* [[Git]]&lt;br /&gt;
* [[Git merge]]&lt;br /&gt;
* [[Git rebase]]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:Git]]&lt;br /&gt;
[[분류:버전 관리]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=Node.js_pnpm&amp;diff=56861</id>
		<title>Node.js pnpm</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=Node.js_pnpm&amp;diff=56861"/>
		<updated>2026-06-07T03:50:08Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: pnpm은 Node.js 및 JavaScript 프로젝트의 의존성 관리를 위한 오픈소스 패키지 매니저로, 빠른 설치와 디스크 공간 효율을 목표로 하는 npm 대안 CLI이다.  == 개요 == pnpm은 npm, Yarn과 함께 Node.js 생태계에서 사용되는 패키지 매니저이다. Node.js 공식 문서는 npm을 Node.js의 표준 패키지 매니저로 설명하면서, Yarn과 pnpm을 npm CLI의 대안으로 함께 언급한다.&amp;lt;ref name=&amp;quot;node-npm&amp;quot;&amp;gt;Node.js, 「...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pnpm은 Node.js 및 JavaScript 프로젝트의 의존성 관리를 위한 오픈소스 패키지 매니저로, 빠른 설치와 디스크 공간 효율을 목표로 하는 npm 대안 CLI이다.&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
pnpm은 npm, Yarn과 함께 Node.js 생태계에서 사용되는 패키지 매니저이다. Node.js 공식 문서는 npm을 Node.js의 표준 패키지 매니저로 설명하면서, Yarn과 pnpm을 npm CLI의 대안으로 함께 언급한다.&amp;lt;ref name=&amp;quot;node-npm&amp;quot;&amp;gt;Node.js, 「An introduction to the npm package manager」, https://nodejs.org/learn/getting-started/an-introduction-to-the-npm-package-manager, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pnpm의 공식 설명은 “빠르고 디스크 공간을 효율적으로 사용하는 패키지 매니저”이다. pnpm은 패키지를 프로젝트마다 반복 복사하는 대신 콘텐츠 주소화 저장소(content-addressable store)에 저장하고, 프로젝트의 node_modules에는 하드 링크 또는 리플링크를 통해 연결하는 방식을 사용한다.&amp;lt;ref name=&amp;quot;pnpm-overview&amp;quot;&amp;gt;pnpm, 「pnpm 공식 웹사이트」, https://pnpm.io/; pnpm GitHub 저장소, 「pnpm/pnpm README」, https://github.com/pnpm/pnpm, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2026년 6월 7일 확인 기준 npm 레지스트리의 pnpm 최신 배포판은 11.5.2이며, 라이선스는 MIT이다. 해당 패키지의 engines 필드는 Node.js 22.13 이상을 요구한다.&amp;lt;ref name=&amp;quot;pnpm-latest&amp;quot;&amp;gt;npm Registry, 「pnpm latest package metadata」, https://registry.npmjs.org/pnpm/latest, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 특징 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 특징 !! 설명&lt;br /&gt;
|-&lt;br /&gt;
| 디스크 공간 절약 || 패키지를 전역 콘텐츠 주소화 저장소에 보관하고 프로젝트별 node_modules에는 링크를 배치하여 중복 저장을 줄인다.&lt;br /&gt;
|-&lt;br /&gt;
| 빠른 설치 || 이미 저장소에 존재하는 패키지는 다시 내려받기보다 링크를 통해 재사용할 수 있다.&lt;br /&gt;
|-&lt;br /&gt;
| 엄격한 의존성 구조 || 패키지가 자신의 package.json에 명시된 의존성만 접근하도록 하는 구조를 지향한다.&lt;br /&gt;
|-&lt;br /&gt;
| 결정적 설치 || pnpm-lock.yaml 잠금 파일을 사용해 설치 결과의 재현성을 높인다.&lt;br /&gt;
|-&lt;br /&gt;
| 모노레포 지원 || pnpm-workspace.yaml을 기반으로 여러 패키지를 하나의 저장소에서 관리할 수 있다.&lt;br /&gt;
|}&lt;br /&gt;
pnpm의 주요 특징은 전역 콘텐츠 주소화 저장소, 링크 기반 node_modules 구성, 엄격한 의존성 접근, 워크스페이스 지원으로 요약된다.&amp;lt;ref name=&amp;quot;pnpm-overview&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 설치 ==&lt;br /&gt;
pnpm 11.x 문서 기준, standalone script 또는 @pnpm/exe를 사용하지 않는 경우 pnpm 실행을 위해 Node.js 22 이상이 필요하다. 설치 방법으로는 Corepack, npm, Homebrew, winget, Scoop, Chocolatey 등이 안내되어 있다. Corepack을 사용하면 프로젝트의 package.json에 packageManager 필드를 기록해 팀 내에서 동일한 pnpm 버전을 사용하도록 고정할 수 있다.&amp;lt;ref name=&amp;quot;pnpm-install&amp;quot;&amp;gt;pnpm, 「Installation」, https://pnpm.io/installation, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Corepack 사용&lt;br /&gt;
npm install --global corepack@latest&lt;br /&gt;
corepack enable pnpm&lt;br /&gt;
corepack use pnpm@latest-11&lt;br /&gt;
&lt;br /&gt;
# npm으로 전역 설치&lt;br /&gt;
npm install -g pnpm@latest-11&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 주요 명령어 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 명령어 !! 용도&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm install&amp;lt;/code&amp;gt; || 프로젝트의 모든 의존성을 설치한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm add 패키지명&amp;lt;/code&amp;gt; || 패키지를 dependencies에 추가한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm add -D 패키지명&amp;lt;/code&amp;gt; || 패키지를 devDependencies에 추가한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm add -O 패키지명&amp;lt;/code&amp;gt; || 패키지를 optionalDependencies에 추가한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm add -g 패키지명&amp;lt;/code&amp;gt; || 패키지를 전역으로 설치한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm update&amp;lt;/code&amp;gt; || package.json의 버전 범위에 따라 의존성을 갱신한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm list&amp;lt;/code&amp;gt; || 설치된 패키지와 의존성 트리를 조회한다.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pnpm store&amp;lt;/code&amp;gt; || pnpm 패키지 저장소를 점검하거나 정리한다.&lt;br /&gt;
|}&lt;br /&gt;
주요 CLI 명령은 패키지 설치, 의존성 추가, 갱신, 조회, 저장소 관리 기능으로 구성된다.&amp;lt;ref name=&amp;quot;pnpm-cli&amp;quot;&amp;gt;pnpm, 「CLI commands」, https://pnpm.io/cli/add; https://pnpm.io/cli/install; https://pnpm.io/cli/update; https://pnpm.io/cli/list; https://pnpm.io/cli/store, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 워크스페이스 ==&lt;br /&gt;
pnpm은 모노레포 또는 멀티 패키지 저장소를 위한 워크스페이스 기능을 내장하고 있다. 워크스페이스를 사용하려면 저장소 루트에 pnpm-workspace.yaml 파일을 두어야 한다. 워크스페이스 내부 패키지는 &amp;lt;code&amp;gt;workspace:&amp;lt;/code&amp;gt; 프로토콜로 참조할 수 있으며, 이 프로토콜을 사용하면 레지스트리의 외부 패키지가 아니라 로컬 워크스페이스 패키지만 해석 대상으로 삼도록 강제할 수 있다.&amp;lt;ref name=&amp;quot;pnpm-workspace&amp;quot;&amp;gt;pnpm, 「Workspace」, https://pnpm.io/workspaces, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
packages:&lt;br /&gt;
  - &amp;quot;packages/*&amp;quot;&lt;br /&gt;
  - &amp;quot;apps/*&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;@example/shared&amp;quot;: &amp;quot;workspace:*&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pnpm 11 ==&lt;br /&gt;
pnpm 11은 2026년 4월 28일 공개되었다. 이 버전은 Node.js 22 이상을 요구하며, pnpm 자체가 순수 ESM으로 배포된다. 또한 공급망 보안 기본값 강화, npm CLI에 위임하지 않는 자체 publish 흐름, SQLite 기반 저장소 인덱스, 전역 설치 격리 등이 주요 변경점으로 소개되었다. 2026년 6월 5일 공개된 pnpm 11.5.2는 lockfile 검증, peer dependency 해석, Windows 네트워크 요청 종료 시 충돌 회피, 동시 설치 상황에서의 패키지 materialization 문제 수정 등을 포함한 패치 릴리스이다.&amp;lt;ref name=&amp;quot;pnpm-11&amp;quot;&amp;gt;pnpm, 「pnpm 11.0」, https://pnpm.io/blog/releases/11.0; GitHub, 「Release pnpm 11.5.2 · pnpm/pnpm」, https://github.com/pnpm/pnpm/releases/tag/v11.5.2, 확인일: 2026년 6월 7일.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== npm과의 차이 ==&lt;br /&gt;
npm은 Node.js의 표준 패키지 매니저로 널리 사용되며, pnpm은 npm 레지스트리와 package.json 생태계를 활용하면서 설치 구조와 저장 방식에서 차이를 둔다. pnpm은 패키지를 저장소에 한 번 보관하고 프로젝트별로 링크하는 방식, 엄격한 의존성 접근, pnpm-lock.yaml 기반 잠금 파일, 모노레포 워크스페이스 기능을 주요 차별점으로 삼는다.&amp;lt;ref name=&amp;quot;node-npm&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;pnpm-overview&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 활용 분야 ==&lt;br /&gt;
pnpm은 다음과 같은 환경에서 자주 사용된다.&lt;br /&gt;
&lt;br /&gt;
* 여러 Node.js 프로젝트를 동시에 다루어 로컬 디스크 사용량을 줄이고 싶은 개발 환경&lt;br /&gt;
* 의존성이 많은 프론트엔드 또는 백엔드 JavaScript 프로젝트&lt;br /&gt;
* 단일 저장소에서 여러 패키지를 관리하는 모노레포&lt;br /&gt;
* CI/CD에서 설치 속도와 잠금 파일 재현성이 중요한 프로젝트&lt;br /&gt;
* package.json에 명시되지 않은 의존성 접근을 줄이고 싶은 프로젝트&lt;br /&gt;
&lt;br /&gt;
== 같이 보기 ==&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:패키지 관리자]]&lt;br /&gt;
[[분류:자바스크립트]]&lt;br /&gt;
[[분류:개발 도구]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_WebLogic&amp;diff=41443</id>
		<title>오라클 WebLogic</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_WebLogic&amp;diff=41443"/>
		<updated>2025-10-06T23:58:21Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: Oracle WebLogic Server(줄여서 WebLogic)은 자바 엔터프라이즈 애플리케이션 서버로, Java EE(현재 Jakarta EE) 기반 애플리케이션을 개발하고 배포하기 위한 플랫폼이다.  이 서버는 온프레미스 또는 클라우드 환경에서 고성능, 확장성, 관리 편의성을 제공하는 미들웨어 역할을 한다. ==역사 및 배경== WebLogic은 원래 WebLogic, Inc.에서 개발한 J2EE 애플리케이션 서버였으며, 1998년 BEA...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oracle WebLogic Server(줄여서 WebLogic)은 자바 엔터프라이즈 애플리케이션 서버로, Java EE(현재 Jakarta EE) 기반 애플리케이션을 개발하고 배포하기 위한 플랫폼이다.  이 서버는 온프레미스 또는 클라우드 환경에서 고성능, 확장성, 관리 편의성을 제공하는 미들웨어 역할을 한다.&lt;br /&gt;
==역사 및 배경==&lt;br /&gt;
WebLogic은 원래 WebLogic, Inc.에서 개발한 J2EE 애플리케이션 서버였으며, 1998년 BEA Systems가 WebLogic, Inc.를 인수하였다.  이후 2008년에 BEA Systems 자체가 Oracle에 인수되면서 WebLogic은 Oracle의 미들웨어 제품군의 일부가 되었다.  현재 WebLogic은 Oracle Fusion Middleware 포트폴리오에 포함되어 있다.&lt;br /&gt;
==주요 특징==&lt;br /&gt;
WebLogic이 제공하는 주요 기능 및 특징은 다음과 같다.&lt;br /&gt;
*Java EE / Jakarta EE 완전 구현 — Servlet, JSP, EJB, JPA, JMS 등 표준 기술을 지원한다.&lt;br /&gt;
*클러스터링 및 고가용성 — 여러 WebLogic 인스턴스를 클러스터로 구성해 부하 분산과 장애 대응이 가능하다.&lt;br /&gt;
*도메인 기반 관리 구조 — 하나의 도메인(domain) 안에 Administration Server와 여러 Managed Server가 포함되는 구조로 구성된다.&lt;br /&gt;
*운영 및 관리 도구 제공 — 콘솔 UI, 명령줄 도구, REST API 등을 통해 설정 및 모니터링이 가능하다.&lt;br /&gt;
*클라우드 및 컨테이너 지원 — Kubernetes, Docker 등 컨테이너 환경 배포를 지원하며, 클라우드 연동 기능을 제공한다.&lt;br /&gt;
*Oracle 제품군과의 통합성 — Oracle Database, Coherence, SOA Suite 등과 긴밀히 연계된다.&lt;br /&gt;
==아키텍처 개요==&lt;br /&gt;
WebLogic의 전반적인 구조는 다음 요소들로 구성된다.&lt;br /&gt;
===도메인(Domain)===&lt;br /&gt;
도메인은 WebLogic 서버 환경의 관리 단위이다. 도메인 내에는 아래 구성 요소들이 포함된다.&lt;br /&gt;
*Administration Server — 도메인의 중앙 관리 서버로, 설정 및 배포를 제어한다.&lt;br /&gt;
*Managed Server — 실제 애플리케이션이 배포되는 서버 인스턴스이다.&lt;br /&gt;
*클러스터(Cluster) — 동일 도메인 내 여러 Managed Server를 묶어 부하 분산과 장애 대응을 수행한다.&lt;br /&gt;
===서비스 계층과 자원===&lt;br /&gt;
WebLogic은 다양한 자원을 관리하고 제공한다.&lt;br /&gt;
*데이터 소스 (JDBC 커넥션 풀)&lt;br /&gt;
*JMS (Java Messaging Service)&lt;br /&gt;
*트랜잭션 서비스 (JTA)&lt;br /&gt;
*보안 서비스 (인증, 인가, SSL 등)&lt;br /&gt;
*웹 서비스 및 REST API 서비스&lt;br /&gt;
*캐시 및 세션 복제&lt;br /&gt;
==버전 및 배포==&lt;br /&gt;
WebLogic은 6.x, 8.x, 9.x, 10.x, 12c, 14c 등 여러 메이저 버전을 거쳐 발전해왔다.  최신 버전에서는 Java 17, Jakarta EE 9를 지원하며, 클라우드 네이티브 및 컨테이너 환경 통합이 강화되었다.  배포 유형에는 온프레미스 설치, 가상화 기반 배포, Docker 및 Kubernetes를 이용한 컨테이너 배포가 있다.&lt;br /&gt;
==장점 및 고려사항==&lt;br /&gt;
===장점===&lt;br /&gt;
*높은 안정성과 성능&lt;br /&gt;
*도메인 기반의 체계적인 관리&lt;br /&gt;
*Oracle 제품군과의 통합성&lt;br /&gt;
*보안 기능 및 고가용성 지원&lt;br /&gt;
===고려사항 및 단점===&lt;br /&gt;
*상용 라이선스 제품으로 비용이 발생할 수 있다.&lt;br /&gt;
*클러스터 및 도메인 설정이 복잡하다.&lt;br /&gt;
*경량 애플리케이션에는 다소 과도할 수 있다.&lt;br /&gt;
==응용 및 활용 사례==&lt;br /&gt;
WebLogic은 다음과 같은 환경에서 널리 사용된다.&lt;br /&gt;
*대규모 엔터프라이즈 웹 애플리케이션&lt;br /&gt;
*금융권, 공공기관, 통신사 등의 핵심 업무 시스템&lt;br /&gt;
*Oracle ADF, SOA Suite, ERP 등과 연계된 시스템&lt;br /&gt;
*클라우드 또는 하이브리드 아키텍처 기반 애플리케이션&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Java EE]]&lt;br /&gt;
*[[Oracle ADF]]&lt;br /&gt;
*[[미들웨어]]&lt;br /&gt;
*[[클러스터링]]&lt;br /&gt;
*[[트랜잭션 처리 시스템]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Oracle Corporation, “Oracle WebLogic Server Documentation”&lt;br /&gt;
*Oracle Corporation, “Fusion Middleware Concepts Guide”&lt;br /&gt;
*TechTarget, “What is Oracle WebLogic Server?”&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:미들웨어]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_ADF&amp;diff=41442</id>
		<title>오라클 ADF</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_ADF&amp;diff=41442"/>
		<updated>2025-10-06T23:48:09Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: 오라클 ADF(Oracle Application Development Framework)은 자바 엔터프라이즈 애플리케이션 개발을 위한 프레임워크이다.  이 프레임워크는 선언적(declarative) 개발, 시각적 도구, MVC 구조, 데이터 바인딩 추상화를 결합하여 개발 생산성을 높이기 위해 설계되었다. ==개요== Oracle ADF는 Java EE 표준과 일부 오픈 소스 기술을 기반으로 구축된 엔드투엔드 애플리케이션 프레임워크이다....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;오라클 ADF(Oracle Application Development Framework)은 자바 엔터프라이즈 애플리케이션 개발을 위한 프레임워크이다.  이 프레임워크는 선언적(declarative) 개발, 시각적 도구, MVC 구조, 데이터 바인딩 추상화를 결합하여 개발 생산성을 높이기 위해 설계되었다.&lt;br /&gt;
==개요==&lt;br /&gt;
Oracle ADF는 Java EE 표준과 일부 오픈 소스 기술을 기반으로 구축된 엔드투엔드 애플리케이션 프레임워크이다.  웹, 모바일, 데스크톱 등 다양한 인터페이스를 지원하며, 전체 애플리케이션의 모델, 뷰, 컨트롤러 계층을 아우르는 통합 구조를 제공한다.&lt;br /&gt;
&lt;br /&gt;
ADF는 다음과 같은 주요 개념을 중심으로 동작한다:&lt;br /&gt;
*선언적 데이터 바인딩 (UI ↔ 모델)&lt;br /&gt;
*비즈니스 로직 및 유효성 검증의 재사용&lt;br /&gt;
*모듈화된 페이지 흐름 (Task Flows)&lt;br /&gt;
*리치 UI 구성 요소 (ADF Faces 등)&lt;br /&gt;
*보안 및 커스터마이징을 위한 메타데이터 기반 접근&lt;br /&gt;
==주요 구성 요소==&lt;br /&gt;
Oracle ADF는 다음 계층 또는 구성 요소들로 나뉜다.&lt;br /&gt;
===비즈니스 서비스 계층===&lt;br /&gt;
비즈니스 서비스 계층은 애플리케이션이 데이터를 액세스하고 조작하는 핵심 기능을 제공한다.  ADF는 ADF Business Components (ADF BC)를 이용해 관계형 데이터베이스에 대한 CRUD, 트랜잭션 제어, 유효성 검증 등을 선언적으로 정의할 수 있게 한다.&lt;br /&gt;
&lt;br /&gt;
ADF BC의 주요 구성 요소로는 다음이 있다:&lt;br /&gt;
*Entity Object — 데이터베이스 테이블의 레코드 단위 객체&lt;br /&gt;
*View Object — 쿼리 기반 또는 엔터티 기반의 뷰 추상화&lt;br /&gt;
*Application Module — 여러 View Object를 묶고 트랜잭션 범위를 관리하는 단위&lt;br /&gt;
*Association / ViewLink — 엔터티 간 관계 및 뷰 객체 간의 연결&lt;br /&gt;
===모델 계층 (Model)===&lt;br /&gt;
모델 계층은 비즈니스 서비스 계층과 UI 계층 사이의 추상화 계층이다.  UI 개발자는 모델 계층을 통해 데이터를 조작하며, 내부적으로는 데이터 컨트롤(Data Controls)과 바인딩(Bindings)을 통해 서비스 계층과 연계된다.  이 방식은 UI와 비즈니스 로직 간의 결합도를 낮추고 유연성을 제공한다.&lt;br /&gt;
===컨트롤러 계층===&lt;br /&gt;
컨트롤러 계층에서는 사용자 요청 흐름과 네비게이션을 제어한다.  ADF는 JSF 기반 네비게이션을 확장한 ADF Task Flow 개념을 제공한다.  Task Flow는 모듈화된 흐름(유한 경계 범위, 재사용 가능)과 선언적 전환, 예외 처리, 트랜잭션 처리를 지원한다.&lt;br /&gt;
&lt;br /&gt;
Task Flow는 크게 Bounded Task Flow와 Unbounded Task Flow로 나눌 수 있으며,  Bounded Task Flow는 진입점(entry point)과 흐름 경계가 정의된 작은 흐름 단위이다.&lt;br /&gt;
===뷰 계층 (View)===&lt;br /&gt;
뷰 계층은 사용자 인터페이스를 담당한다.  ADF는 여러 UI 기술을 지원하며, 대표적으로 ADF Faces 라는 JSF 기반 리치 UI 컴포넌트 라이브러리를 제공한다.  ADF Faces는 AJAX, 부분 페이지 렌더링(partial page rendering), 다이얼로그, 팝업, 드래그 앤 드롭, 스킨(테마) 지원 등을 포함한다.&lt;br /&gt;
&lt;br /&gt;
또한 ADF는 모바일 UI, 데스크톱 통합, 브라우저 및 디바이스 대응을 위한 기능을 포함할 수 있다.&lt;br /&gt;
==개발 프로세스 개관==&lt;br /&gt;
ADF 애플리케이션 개발은 일반적으로 다음 단계로 진행된다.&lt;br /&gt;
#애플리케이션 워크스페이스 및 프로젝트 구조 생성&lt;br /&gt;
#비즈니스 서비스 모델 설계 및 정의 (ADF BC 등)&lt;br /&gt;
#UI 뷰 생성 및 바인딩 설정&lt;br /&gt;
#Task Flow 구성 및 페이지 흐름 정의&lt;br /&gt;
#보안, 인증/인가 설정&lt;br /&gt;
#테스트, 디버깅&lt;br /&gt;
#배포 및 운영&lt;br /&gt;
JDeveloper IDE는 ADF 개발을 위한 시각적 도구, 마법사, 드래그 앤 드롭 바인딩 기능 등을 제공한다.&lt;br /&gt;
==장점 및 고려사항==&lt;br /&gt;
===장점===&lt;br /&gt;
*개발 생산성 향상 — 선언적, 시각적 개발을 통해 수작업 코딩을 줄일 수 있다&lt;br /&gt;
*일관된 아키텍처 구조 — MVC 기반으로 모듈화, 계층 분리를 강제&lt;br /&gt;
*재사용성 및 유지보수성 — Task Flow, 컴포넌트, 비즈니스 객체의 재활용 가능&lt;br /&gt;
*보안 및 사용자 맞춤화 지원 — 메타데이터 기반 권한 제어, 커스터마이징 가능&lt;br /&gt;
*Oracle 제품군 및 Java EE 환경과의 통합이 용이&lt;br /&gt;
===고려사항 및 단점===&lt;br /&gt;
*학습 곡선 — ADF의 구조와 메타데이터 바인딩 개념이 복잡할 수 있다&lt;br /&gt;
*성능 튜닝 필요성 — 자동화된 구성이나 리치 UI 사용 시 성능 저하가 발생할 수 있다&lt;br /&gt;
*벤더 종속성 — Oracle ADF 자체에 종속되는 코드와 구성이 많아 이식성이 낮을 수 있다&lt;br /&gt;
*라이센스 및 배포 제약 — 핵심 ADF 기능은 유료 라이센스가 필요할 수 있다 (ADF Essentials는 핵심 기능만 무료 제공)&lt;br /&gt;
==버전 및 최근 동향==&lt;br /&gt;
Oracle은 지속적으로 ADF를 발전시키고 있으며, ADF 12c 버전에서는 Maven 통합 강화, 스킨 에디터 개선, SVG 인라인 지원, 새로운 ADF Faces 컴포넌트 등이 도입되었다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[Oracle JDeveloper]]&lt;br /&gt;
*[[JavaServer Faces]]&lt;br /&gt;
*[[Model-View-Controller (소프트웨어 구조)]]&lt;br /&gt;
*[[Java EE]]&lt;br /&gt;
*[[Oracle WebLogic Server]]&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:프로그래밍]]&lt;br /&gt;
[[분류:개발 프레임워크]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EB%A9%80%ED%8B%B0_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1_%EB%AA%A8%EB%93%88&amp;diff=41035</id>
		<title>아파치 멀티 프로세싱 모듈</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EC%95%84%ED%8C%8C%EC%B9%98_%EB%A9%80%ED%8B%B0_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1_%EB%AA%A8%EB%93%88&amp;diff=41035"/>
		<updated>2025-06-10T22:35:21Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: 아파치 멀티 프로세싱 모듈(Apache Multi-Processing Module, MPM)은 아파치 HTTP 서버에서 클라이언트 요청을 처리하는 방식과 서버의 동작 방식을 정의하는 구성 요소이다. ==개요== 아파치 HTTP 서버는 다양한 운영 체제와 하드웨어 환경에서 효율적으로 동작할 수 있도록 설계되었으며, 이를 위해 멀티 프로세싱 모듈(MPM, Multi-Processing Modules)을 사용하여 요청 처리 메커니즘을...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;아파치 멀티 프로세싱 모듈(Apache Multi-Processing Module, MPM)은 아파치 HTTP 서버에서 클라이언트 요청을 처리하는 방식과 서버의 동작 방식을 정의하는 구성 요소이다.&lt;br /&gt;
==개요==&lt;br /&gt;
아파치 HTTP 서버는 다양한 운영 체제와 하드웨어 환경에서 효율적으로 동작할 수 있도록 설계되었으며, 이를 위해 멀티 프로세싱 모듈(MPM, Multi-Processing Modules)을 사용하여 요청 처리 메커니즘을 유연하게 구성할 수 있도록 한다. MPM은 서버의 요청 처리 모델을 결정하며, 각 MPM은 고유한 방식으로 프로세스와 스레드를 관리한다.&lt;br /&gt;
==주요 MPM 종류==&lt;br /&gt;
아파치 HTTP 서버에서 일반적으로 사용되는 주요 MPM 유형은 다음과 같다.&lt;br /&gt;
*&#039;&#039;&#039;prefork&#039;&#039;&#039;: 각 요청을 별도의 프로세스가 처리하는 구조로, 스레드를 사용하지 않는다. 안정성과 호환성이 중요할 때 적합하다.&lt;br /&gt;
*&#039;&#039;&#039;worker&#039;&#039;&#039;: 각 프로세스가 여러 개의 스레드를 갖고 있으며, 스레드가 요청을 처리한다. 적절한 성능과 자원 사용의 균형을 제공한다.&lt;br /&gt;
*&#039;&#039;&#039;event&#039;&#039;&#039;: worker MPM을 기반으로 하며, keep-alive 연결을 보다 효율적으로 처리할 수 있도록 설계되었다. 비동기 이벤트 기반 처리 방식으로, 고성능 서버 환경에 적합하다.&lt;br /&gt;
==MPM의 선택 기준==&lt;br /&gt;
서버 환경과 애플리케이션의 특성에 따라 적절한 MPM을 선택하는 것이 중요하다. 예를 들어, 다음과 같은 기준이 고려된다.&lt;br /&gt;
*&#039;&#039;&#039;스레드 안전성&#039;&#039;&#039;: 사용하는 모듈이나 애플리케이션이 스레드 안전하지 않다면 prefork MPM이 더 적합하다.&lt;br /&gt;
*&#039;&#039;&#039;성능&#039;&#039;&#039;: 많은 동시 접속이 필요한 경우 event 또는 worker MPM이 유리하다.&lt;br /&gt;
*&#039;&#039;&#039;시스템 자원 사용&#039;&#039;&#039;: worker와 event MPM은 더 적은 메모리로 많은 요청을 처리할 수 있다.&lt;br /&gt;
==설정 및 변경 방법==&lt;br /&gt;
MPM은 아파치 서버의 빌드 방식에 따라 고정되거나 동적으로 설정할 수 있다.&lt;br /&gt;
===MPM 확인===&lt;br /&gt;
설치된 아파치의 MPM 종류는 다음 명령어로 확인할 수 있다.&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -V | grep MPM&lt;br /&gt;
&amp;lt;/pre&amp;gt;또는 동적으로 MPM이 로드되는 경우, 아파치 설정 파일에서 &amp;lt;code&amp;gt;LoadModule&amp;lt;/code&amp;gt; 디렉티브를 통해 확인할 수 있다.&lt;br /&gt;
===MPM 변경 방법===&lt;br /&gt;
*&#039;&#039;&#039;동적 MPM 환경의 경우&#039;&#039;&#039;: 아파치 설정 파일(&amp;lt;code&amp;gt;httpd.conf&amp;lt;/code&amp;gt;) 또는 포함된 설정 파일(&amp;lt;code&amp;gt;mods-enabled/mpm_*.conf&amp;lt;/code&amp;gt;)에서 원하는 MPM 모듈만 활성화하고, 나머지는 비활성화해야 한다.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule mpm_event_module modules/mod_mpm_event.so&lt;br /&gt;
#LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;고정 MPM 환경의 경우&#039;&#039;&#039;: 아파치를 재컴파일해야 하며, &amp;lt;code&amp;gt;--with-mpm&amp;lt;/code&amp;gt; 옵션을 사용한다.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure --with-mpm=worker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===주요 설정 디렉티브===&lt;br /&gt;
MPM별로 설정할 수 있는 주요 디렉티브는 다음과 같다. 예시는 &#039;&#039;&#039;event&#039;&#039;&#039; MPM 기준이다.&lt;br /&gt;
*&amp;lt;code&amp;gt;StartServers&amp;lt;/code&amp;gt;: 초기 프로세스 수&lt;br /&gt;
*&amp;lt;code&amp;gt;MinSpareThreads&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MaxSpareThreads&amp;lt;/code&amp;gt;: 여유 스레드 최소/최대값&lt;br /&gt;
*&amp;lt;code&amp;gt;ThreadsPerChild&amp;lt;/code&amp;gt;: 하나의 프로세스당 생성되는 스레드 수&lt;br /&gt;
*&amp;lt;code&amp;gt;MaxRequestWorkers&amp;lt;/code&amp;gt;: 동시 요청 최대 처리 수&lt;br /&gt;
*&amp;lt;code&amp;gt;ServerLimit&amp;lt;/code&amp;gt;: 생성 가능한 최대 프로세스 수&lt;br /&gt;
해당 디렉티브는 MPM에 따라 다소 상이하며, &amp;lt;code&amp;gt;conf/extra/httpd-mpm.conf&amp;lt;/code&amp;gt; 파일에서 설정하는 경우가 많다.&lt;br /&gt;
==같이 보기==&lt;br /&gt;
*[[아파치 HTTP 서버]]&lt;br /&gt;
*[[웹 서버]]&lt;br /&gt;
*[[Nginx]]&lt;br /&gt;
*[[서버 소프트웨어]]&lt;br /&gt;
*[[동시성 처리]]&lt;br /&gt;
==참고 문헌==&lt;br /&gt;
*Laurie, Ben, and Peter Laurie. &#039;&#039;Apache: The Definitive Guide&#039;&#039;. O&#039;Reilly Media, 2003.&lt;br /&gt;
*Bowen, Rich. &#039;&#039;The Apache Modules Book: Application Development with Apache&#039;&#039;. Prentice Hall, 2007.&lt;br /&gt;
==각주==&lt;br /&gt;
[[분류:백엔드]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_logrotate&amp;diff=41027</id>
		<title>리눅스 logrotate</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_logrotate&amp;diff=41027"/>
		<updated>2025-06-03T02:25:49Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
;로그 파일을 주기적으로 압축하고 이름을 바꾸어 관리한다.&lt;br /&gt;
* 리눅스에서만 지원&lt;br /&gt;
* 경로 : /usr/sbin/logrotate&lt;br /&gt;
* 설정 파일 경로&lt;br /&gt;
** 베이스 설정 파일: /etc/logrotate.conf&lt;br /&gt;
** 로그별 설정 파일 디렉터리: /etc/logrotate.d/&lt;br /&gt;
&lt;br /&gt;
== 사용법 ==&lt;br /&gt;
로그별 설정 파일 디렉터리(/etc/logrotate.d/)에 설정 파일을 넣어 두기만 하면 알아서 동작한다. 내부적으로 cron 기반이므로 재기동 등의 특별한 절차가 필요하지 않다.&lt;br /&gt;
&lt;br /&gt;
아래와 같은 명령어도 있으나, 기본적으론 설정 파일을 만들어 넣는 식으로 이용하는 것만으로 충분하다. 베이스 설정 파일에 기본적인 설정(ex. datetext)들이 있으므로 새로운 설정 파일엔 경로 등 일부 간단한 설정만 넣어줘도 된다.&lt;br /&gt;
&lt;br /&gt;
설정 파일을 만드는 것이 핵심이므로 아래 문법보단 [[리눅스 logrotate.conf]] 문서를 참고하자.&lt;br /&gt;
&lt;br /&gt;
== 동작 과정 ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;기존 로그 파일 이름 변경&#039;&#039;&#039;&lt;br /&gt;
** 예: &amp;lt;code&amp;gt;access_log&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;access_log.1&amp;lt;/code&amp;gt; 또는 &amp;lt;code&amp;gt;access_log-2025-06-02&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;필요 시 압축 처리&#039;&#039;&#039;&lt;br /&gt;
** 예: &amp;lt;code&amp;gt;access_log.1&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;access_log.1.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;새로운 빈 로그 파일 생성&#039;&#039;&#039;&lt;br /&gt;
** &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt; 옵션이 있으면 &amp;lt;code&amp;gt;access_log&amp;lt;/code&amp;gt; 파일을 &#039;&#039;&#039;다시 생성&#039;&#039;&#039;하고 권한 부여&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;서비스에 로그 파일 교체를 알림&#039;&#039;&#039;&lt;br /&gt;
** 보통 &amp;lt;code&amp;gt;postrotate&amp;lt;/code&amp;gt;에서 &amp;lt;code&amp;gt;systemctl reload&amp;lt;/code&amp;gt; 같은 명령으로 알림&lt;br /&gt;
&lt;br /&gt;
== 문법 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logrotate [옵션] &amp;lt;설정파일&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 옵션 ===&lt;br /&gt;
* -d : 디버거 모드&lt;br /&gt;
* -f, --force : 새로운 목록이 추가되었거나 오래된 로그 파일을 수동으로 삭제할 경우 강제로 실행한다.&lt;br /&gt;
* -s, --state [statefile] : 지정한 정책 파일(statefile)으로 logrotate를 실행한다.&lt;br /&gt;
* --usage : 사용법을 출력한다.&lt;br /&gt;
&lt;br /&gt;
=== 설정파일 옵션 ===&lt;br /&gt;
&lt;br /&gt;
* yearly, monthly, weekly, daily 주기 옵션으로 로테이트를 실행할때 로그를 어떤 주기로 로테이트를 할지 선택&lt;br /&gt;
* rotate [숫자] 로그파일의 개수가 숫자이상이면 가장 오래된 로그파일을 삭제합니다.&lt;br /&gt;
* create [권한] [유저] [그룹] 로테이트 될때 생성되는 로그파일 권한 및 소유자 지정&lt;br /&gt;
* notifempty 로그 내용이 없으면 로테이트를 실행하지 않음 이와 반대로&lt;br /&gt;
* ifempty는 로그 내용이 없어도 로테이트를 진행&lt;br /&gt;
* compress 로테이트로 생성되는 로그파일 gzip으로 압축생성&lt;br /&gt;
* nocompress 로테이트로 생성되는 로그파일을 압축하지 않고 생성&lt;br /&gt;
* missingok 로그파일을 발견하지 못해도 에러처리 하지 않음&lt;br /&gt;
* dateext 로테이트 파일의 이름에 날짜가 들어가도록 생성&lt;br /&gt;
* size [숫자 K,M,G] 로그 파일이 크기가 설정보다 커지면 로테이트 실행&lt;br /&gt;
* maxage [숫자] 파일이 지정일 이상되면 삭제&lt;br /&gt;
* postrotate 실행후 스크립트 파일 실행&lt;br /&gt;
* endscript 스크립트를 실행하는 옵션 다음에 들어가야하는 옵션&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
httpd 기본 설정 내용&lt;br /&gt;
 /var/log/httpd/*log {&lt;br /&gt;
     missingok&lt;br /&gt;
     notifempty&lt;br /&gt;
     sharedscripts&lt;br /&gt;
     delaycompress&lt;br /&gt;
     postrotate&lt;br /&gt;
         /bin/systemctl reload httpd.service &amp;gt; /dev/null 2&amp;gt;/dev/null || true&lt;br /&gt;
     endscript&lt;br /&gt;
 }&lt;br /&gt;
아파치는 그 동작 구성 상 한번 구동이 되면 로그 파일 핸들을, 첫 구동 시 만든 것으로 계속 사용한다. 그래서 기존에 쓰고 있던 로그 파일을 없애고 새롭게 로그파일을 생성한 경우 reload를 해줘야 정상적으로 새로운 파일에 로그를 기록한다.&amp;lt;ref&amp;gt;위 동작 과정을 보면 알 수 있다. 만약 기존 로그 파일을 복제한 후, 내용을 비우는 방식이라면 reload가 필요 없겠지만 그렇게 하면 복제를 위한 I/O가 크기 때문에 mv로 파일명만 바꾸고 새로운 빈 파일을 만드는 식으로 동작하기 때문이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 같이 보기 ==&lt;br /&gt;
&lt;br /&gt;
* [[리눅스 logrotate.conf]]&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;br /&gt;
* [https://book.naver.com/bookdb/book_detail.naver?bid=6413239 유닉스 리눅스 명령어 사전, 2010. 11. 30., 우종경, 박종오]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
[[분류:리눅스]][[분류:리눅스 명령어]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_systemctl&amp;diff=39422</id>
		<title>리눅스 systemctl</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_systemctl&amp;diff=39422"/>
		<updated>2024-07-13T15:03:11Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;systemctl은 systemd 시스템 및 서비스 매니저에서 시스템과 서비스 관련 작업을 제어하고 관리하는 데 사용되는 명령어입니다. systemd는 현대 리눅스 배포판에서 널리 사용되는 시스템 및 서비스 매니저로, 부팅 프로세스, 서비스 관리, 시스템 상태 확인 등을 통합적으로 관리합니다.&lt;br /&gt;
&lt;br /&gt;
== 등록된 systemctl 서비스 리스트 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# systemctl로 실행하는 서비스 목록 확인&lt;br /&gt;
systemctl list-unit-files&lt;br /&gt;
&lt;br /&gt;
# 원하는 서비스명을 검색&lt;br /&gt;
systemctl list-unit-files | grep &amp;lt;찾고자하는 서비스명&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 서비스 상태 ==&lt;br /&gt;
상태는 static, generated, masked, enable, disabled로 표시됩니다.&lt;br /&gt;
&lt;br /&gt;
* enable: 활성화된 서비스입니다. 시스템 부팅 시 자동으로 시작됩니다.&lt;br /&gt;
* disable: 비활성화된 서비스입니다. 시스템 부팅 시 자동으로 시작되지 않으며 사용자가 직접 실행해야 합니다.&lt;br /&gt;
* masked: 시스템에서(사용자나 관리자가) 실행할 수 없는 서비스입니다.&lt;br /&gt;
* static: 정적 서비스입니다. 주로 다른 서비스에서 사용되며, 직접 실행할 수 없습니다.&lt;br /&gt;
* generated: 다른 설정 파일로부터 자동 생성된 unit 파일을 의미합니다.&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;br /&gt;
&lt;br /&gt;
* [https://priming.tistory.com/73 &amp;lt;nowiki&amp;gt;원문 출처: [Linux] systemctl 명령어 서비스 목록 확인, 등록 방법&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
[[분류:리눅스 명령어]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_systemctl&amp;diff=39421</id>
		<title>리눅스 systemctl</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_systemctl&amp;diff=39421"/>
		<updated>2024-07-13T15:02:46Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: systemctl은 systemd 시스템 및 서비스 매니저에서 시스템과 서비스 관련 작업을 제어하고 관리하는 데 사용되는 명령어입니다. systemd는 현대 리눅스 배포판에서 널리 사용되는 시스템 및 서비스 매니저로, 부팅 프로세스, 서비스 관리, 시스템 상태 확인 등을 통합적으로 관리합니다.  == 등록된 systemctl 서비스 리스트 == &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; # systemctl로 실행하는 서비스...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;systemctl은 systemd 시스템 및 서비스 매니저에서 시스템과 서비스 관련 작업을 제어하고 관리하는 데 사용되는 명령어입니다. systemd는 현대 리눅스 배포판에서 널리 사용되는 시스템 및 서비스 매니저로, 부팅 프로세스, 서비스 관리, 시스템 상태 확인 등을 통합적으로 관리합니다.&lt;br /&gt;
&lt;br /&gt;
== 등록된 systemctl 서비스 리스트 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# systemctl로 실행하는 서비스 목록 확인&lt;br /&gt;
systemctl list-unit-files&lt;br /&gt;
&lt;br /&gt;
# 원하는 서비스명을 검색&lt;br /&gt;
systemctl list-unit-files | grep &amp;lt;찾고자하는 서비스명&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 서비스 상태 ==&lt;br /&gt;
상태는 static, generated, masked, enable, disabled로 표시됩니다.&lt;br /&gt;
&lt;br /&gt;
* enable: 활성화된 서비스입니다. 시스템 부팅 시 자동으로 시작됩니다.&lt;br /&gt;
* disable: 비활성화된 서비스입니다. 시스템 부팅 시 자동으로 시작되지 않으며 사용자가 직접 실행해야 합니다.&lt;br /&gt;
* masked: 시스템에서(사용자나 관리자가) 실행할 수 없는 서비스입니다.&lt;br /&gt;
* static: 정적 서비스입니다. 주로 다른 서비스에서 사용되며, 직접 실행할 수 없습니다.&lt;br /&gt;
* generated: 다른 설정 파일로부터 자동 생성된 unit 파일을 의미합니다.&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;br /&gt;
&lt;br /&gt;
* [https://priming.tistory.com/73 &amp;lt;nowiki&amp;gt;원문 출처: [Linux] systemctl 명령어 서비스 목록 확인, 등록 방법&amp;lt;/nowiki&amp;gt;]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_yum&amp;diff=39420</id>
		<title>리눅스 yum</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_yum&amp;diff=39420"/>
		<updated>2024-07-13T14:23:31Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스]][[분류:리눅스 프로그램]]&lt;br /&gt;
== 사용법 ==&lt;br /&gt;
&#039;&#039;&#039;yum [옵션] [명령] [패키지]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 옵션 ==&lt;br /&gt;
* -h, --help : 사용법을 출력한다.&lt;br /&gt;
* -C : 캐쉬 정보에서 실행하지만, 캐쉬는 갱신하지 않는다.&lt;br /&gt;
* -c [config file] : 설정 파일을 지정한다.&lt;br /&gt;
* -R [minutes] : 최대 명령어 대기 시간&lt;br /&gt;
* -d [debug level] : 디버깅 출력 레벨&lt;br /&gt;
* --showduplicates : 목록이나 찾기 명령에서 최신 버전만 출력하는 대신, 저장소와 중복된 것도 출력한다.&lt;br /&gt;
* -e [error level] : 에러 출력 레벨&lt;br /&gt;
* -q, --quiet : 에러를 출력하지 않는다.&lt;br /&gt;
* -v, --verbose : 상세한 정보를 출력한다.&lt;br /&gt;
* -y : 모든 물음에 yes로 대답한다.&lt;br /&gt;
* --version : yum 버전 정보를 출력한다.&lt;br /&gt;
* --installroot＝[path] : 인스톨 루트 디렉터리를 설정한다.&lt;br /&gt;
* --enablerepo＝[repo] : 하나 이상의 저장소를 활성화한다(와일드카드 허용).&lt;br /&gt;
* --disablerepo＝[repo] : 하나 이상의 저장소를 비활성화한다(와일드카드 허용).&lt;br /&gt;
* -x [package], --exclude＝[package] : 이름이나 패턴 매칭으로 패키지를 제외한다.&lt;br /&gt;
* --disableexcludes＝[repo] : 설정 파일에서 지정한 제외를 비활성화한다.&lt;br /&gt;
* --obsoletes : 업데이트 동안 yum의 쓸모없는 프로세스 로직을 활성화한다.&lt;br /&gt;
* --noplugins : yum 플러그인을 비활성화한다.&lt;br /&gt;
* --nogpgcheck : gpg 시그너쳐 체크를 비활성화한다.&lt;br /&gt;
* --disableplugin＝[plugin] : 이름으로 플러그인을 비활성화한다.&lt;br /&gt;
* --enableplugin＝[plugin] : 이름으로 플러그인을 활성화한다.&lt;br /&gt;
* --skip-broken : 의존성 문제를 가진 패키지를 건너뛴다.&lt;br /&gt;
* --color＝COLOR : 색깔을 사용할지 컨트롤한다.&lt;br /&gt;
&lt;br /&gt;
== 명령 ==&lt;br /&gt;
* check-update : 가능한 패키지 업데이트가 있는지 체크한다.&lt;br /&gt;
* clean : 캐쉬 데이터를 제거한다.&lt;br /&gt;
* deplist : 패키지 의존성 목록을 출력한다.&lt;br /&gt;
* downgrade : 패키지를 다운그레이드한다.&lt;br /&gt;
* erase : 시스템에서 패키지나 패키지들을 제거한다.&lt;br /&gt;
* groupinfo : 패키지 그룹에 관한 상세한 정보를 출력한다.&lt;br /&gt;
* groupinstall : 시스템에 그룹으로 패키지를 설치한다.&lt;br /&gt;
* grouplist : 가능한 패키지 그룹 목록을 출력한다.&lt;br /&gt;
* groupremove : 시스템에서 그룹의 패키지를 제거한다.&lt;br /&gt;
* help : 사용법을 출력한다.&lt;br /&gt;
* history : 트랜잭션 히스토리를 출력하거나 사용한다.&lt;br /&gt;
* info : 패키지나 패키지 그룹의 상세한 정보를 출력한다.&lt;br /&gt;
* install : 시스템에 패키지나 패키지들을 설치한다.&lt;br /&gt;
* list : 패키지나 패키지 그룹 목록을 출력한다.&lt;br /&gt;
* localinstall : 로컬 RPM을 설치한다.&lt;br /&gt;
* makecache : 메타 데이터 캐쉬를 생성한다.&lt;br /&gt;
* provides : 주어진 값에 제공하는 패키지를 찾는다.&lt;br /&gt;
* reinstall : 패키지를 재설치한다.&lt;br /&gt;
* repolist : 설정 소프트웨어 저장소를 출력한다.&lt;br /&gt;
* resolvedep : 주어진 의존성에서 제공하는 패키지를 결정한다.&lt;br /&gt;
* search : 주어진 문자열에 대한 패키지의 상세한 정보를 찾는다.&lt;br /&gt;
* shell : 상호작용 yum 셸을 실행한다.&lt;br /&gt;
* update : 시스템에 패키지나 패키지들을 업데이트한다.&lt;br /&gt;
* upgrade : update –obsoletes와 같다.&lt;br /&gt;
* version : 버전 정보를 출력한다.&lt;br /&gt;
&lt;br /&gt;
== 예시 ==&lt;br /&gt;
yum을 통해 설치된 모든 패키지 보기&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
yum list installed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;특정 패키지를 제외하고 업데이트 (특정 버전을 유지해야 하는 경우, dependency 에러가 나는 경우 등)&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo yum update --exclude=google-chrome* -y&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=Git_%EB%AA%85%EB%A0%B9%EC%96%B4&amp;diff=39387</id>
		<title>Git 명령어</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=Git_%EB%AA%85%EB%A0%B9%EC%96%B4&amp;diff=39387"/>
		<updated>2024-06-06T06:46:17Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: == 보기 전에 == Git에 대한 기본 개념은 Git 문서 확인  == 명령어 ==  === git branch === 브랜치 목록을 확인할 수 있다.  === git checkout === 작업할 브랜치를 선택한다.  === git stash === 하던 작업을 임시로 저장하여 다음에 불러쓸 수 있도록 한다.  === git pull === 원격 저장소의 소스를 로컬 저장소로 가져온다.  ==== git pull --rebase ====&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 보기 전에 ==&lt;br /&gt;
Git에 대한 기본 개념은 [[Git]] 문서 확인&lt;br /&gt;
&lt;br /&gt;
== 명령어 ==&lt;br /&gt;
&lt;br /&gt;
=== git branch ===&lt;br /&gt;
브랜치 목록을 확인할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== git checkout ===&lt;br /&gt;
작업할 브랜치를 선택한다.&lt;br /&gt;
&lt;br /&gt;
=== git stash ===&lt;br /&gt;
하던 작업을 임시로 저장하여 다음에 불러쓸 수 있도록 한다.&lt;br /&gt;
&lt;br /&gt;
=== git pull ===&lt;br /&gt;
원격 저장소의 소스를 로컬 저장소로 가져온다.&lt;br /&gt;
&lt;br /&gt;
==== git pull --rebase ====&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39322</id>
		<title>리눅스 iptables</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39322"/>
		<updated>2024-05-19T15:16:12Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스]][[분류:리눅스 프로그램]]&lt;br /&gt;
==개요==&lt;br /&gt;
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.&lt;br /&gt;
&lt;br /&gt;
==사용법==&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables  [-t 테이블] [액션] [체인] [매치] [-j 타겟]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===테이블(Table)===&lt;br /&gt;
* filter, nat, mangle, raw&lt;br /&gt;
* 명시하지 않으면 기본적으로 filter이다.&lt;br /&gt;
&lt;br /&gt;
===액션(Action)===&lt;br /&gt;
* -A: APPEND: 정책 추가&lt;br /&gt;
* -I: INSERT: 정책 삽입&lt;br /&gt;
* -D: DELETE: 정책 삭제&lt;br /&gt;
* -R: REPLACE: 정책 교체&lt;br /&gt;
* -F: FLUSH: 모든 정책 삭제&lt;br /&gt;
* -P: POLICY: 기본 정책을 설정&lt;br /&gt;
* -L: LIST: 정책 나열&lt;br /&gt;
&lt;br /&gt;
===체인(Chain)===&lt;br /&gt;
* INPUT&lt;br /&gt;
* OUTPUT&lt;br /&gt;
* FORWARD&lt;br /&gt;
* PREROUTING&lt;br /&gt;
* POSTROUTING&lt;br /&gt;
&lt;br /&gt;
=== 매치(Match) ===&lt;br /&gt;
* -s: 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src)&lt;br /&gt;
* -d: 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst)&lt;br /&gt;
* -p: 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음&lt;br /&gt;
* -i: 입력 인터페이스와 매칭(––in-interface)&lt;br /&gt;
* -o: 출력 인터페이스와 매칭(––out-interface)&lt;br /&gt;
* -j: 매치되는 패킷을 어떻게 처리할지 지정 (--jump)&lt;br /&gt;
&lt;br /&gt;
== 타깃(target) ==&lt;br /&gt;
패킷이 규칙과 일치할 때 취하는 동작을 지정한다.&lt;br /&gt;
&lt;br /&gt;
* ACCEPT: 패킷을 허용한다.&lt;br /&gt;
* DROP: 패킷을 버린다(패킷이 전송된 적이 없던 것처럼)&lt;br /&gt;
* REJECT: 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable)&lt;br /&gt;
* LOG: 패킷을 syslog에 기록한다.&lt;br /&gt;
* SNAT --to [주소]: 소스 IP를 [변환(NAT)|NAT]한다.&lt;br /&gt;
* DNAT --to [주소]: 목적지 IP를 변환(NAT)한다.&lt;br /&gt;
* RETURN: 호출 체인 내에서 패킷 처리를 계속한다.&lt;br /&gt;
&lt;br /&gt;
== 정책 열람·저장·반영 ==&lt;br /&gt;
* 보기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -L&lt;br /&gt;
 또는&lt;br /&gt;
# cat /etc/sysconfig/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 차단 횟수 및 byte 수 포함하여 보기&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -L -nvx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# service iptables save&lt;br /&gt;
또는&lt;br /&gt;
# iptables-save&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 &amp;amp; 불러오기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; firewall.sh&lt;br /&gt;
# iptables-restore &amp;lt; firewall.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
&lt;br /&gt;
=== 특정 IP 및 IP 대역 차단 ===&lt;br /&gt;
(참고) IDS/IPS나 WAF로부터 악성 공격을 일삼는 IP를 차단하는 경우 C 클래스 대역을 통째로 차단해주는 것을 권장한다. (특히 해외 IP인 경우)&lt;br /&gt;
&lt;br /&gt;
* 차단 정책 적용 후 iptables-save를 꼭 해야 함을 명심하자&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;단순 차단 예제&#039;&#039;&#039;&lt;br /&gt;
* 192.168.10.22로부터 들어오는 패킷들은 차단하는 정책을 추가&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 192.168.10. 대역으로부터 들어오는 패킷들은 차단하는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 차단 정책 추가 시 코멘트(주석)를 추가해서 기록을 남겨주는 것이 좋다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.0/24 -j DROP -m comment --comment &amp;quot;bruteforce ip 20240516&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 앞단에 방화벽이나 LB가 있는 경우 X-Forwarded-For IP를 기준으로 해야 하는 경우도 있다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -m string --string &amp;quot;x-forwarded-for: 111.222.333.444&amp;quot; --algo bm --icase -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* X-Forwarded-For를 쓸 때 대역으로 차단하고 싶다면 여기선 서브넷이 아닌 일부 IP만 적어야 한다. 문자열 일치 기준으로 검사하기 때문&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -m string --string &amp;quot;x-forwarded-for: 111.222.333&amp;quot; --algo bm --icase -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 기본 차단, 인터페이스별 포워딩 ===&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP)&lt;br /&gt;
** 두 번째 이더넷카드(eth1)로 들어오는 패킷인 경우에만 포워딩을 허가한다.&lt;br /&gt;
** 어떠한 방화벽도 설정되어 있지 않고 커널에서 포워딩을 허가한 상태이다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -P FORWARD DROP&lt;br /&gt;
# iptables -A FORWARD -i eth1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6483 리눅스마스터 1급 1602 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –t nat –A POSTROUTING -o eth0 –j SNAT --to 203.247.40.100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6547 리눅스마스터 1급 1701 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 첫 번째로 기존에 설정된 정책을 전부 삭제한다.&lt;br /&gt;
** 두 번째로 INPUT 체인에 loopback 인터페이스에 들어오는 모든 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 세 번째로 INPUT 체인에 프로토콜이 tcp이며 목적지포트가 22번부터 23번 포트인 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 마지막으로 INPUT 체인에 대한 기본 정책을 거부 메시지 없이 거절로 변경한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -F INPUT&lt;br /&gt;
# iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
# iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT&lt;br /&gt;
# iptables -P INPUT DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6499 리눅스마스터 1급 1502 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다.&lt;br /&gt;
** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다.&lt;br /&gt;
** INPUT 체인의 기본 정책은 DROP이다.&lt;br /&gt;
**# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp destination-unreachable 패킷에 대해서 허용한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-request -s 192.168.10.1 –d 0/0 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-reply -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&lt;br /&gt;
** 로드 밸런서나 프록시 등을 통해 들어온 경우X-Forwarded-For을 사용하여 차단&lt;br /&gt;
** String을 기반으로 차단 규칙 설정&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -I INPUT -p tcp --dport 80 -m string --string &amp;quot;X-Forwarded-For: 111.222.111.222&amp;quot; --algo bm -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 대상 프로토콜 SSH&lt;br /&gt;
** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP시키는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;삭제&#039;&#039;&#039;&lt;br /&gt;
** --line-number 옵션을 통해 정책의 번호를 확인한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -L --line-numbers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** -D 옵션을 지정하여 특정 번호의 정책을 삭제한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -D INPUT [번호]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39319</id>
		<title>리눅스 iptables</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39319"/>
		<updated>2024-05-16T09:51:56Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스]][[분류:리눅스 프로그램]]&lt;br /&gt;
==개요==&lt;br /&gt;
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.&lt;br /&gt;
&lt;br /&gt;
==사용법==&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables  [-t 테이블] [액션] [체인] [매치] [-j 타겟]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===테이블(Table)===&lt;br /&gt;
* filter, nat, mangle, raw&lt;br /&gt;
* 명시하지 않으면 기본적으로 filter이다.&lt;br /&gt;
&lt;br /&gt;
===액션(Action)===&lt;br /&gt;
* -A: APPEND: 정책 추가&lt;br /&gt;
* -I: INSERT: 정책 삽입&lt;br /&gt;
* -D: DELETE: 정책 삭제&lt;br /&gt;
* -R: REPLACE: 정책 교체&lt;br /&gt;
* -F: FLUSH: 모든 정책 삭제&lt;br /&gt;
* -P: POLICY: 기본 정책을 설정&lt;br /&gt;
* -L: LIST: 정책 나열&lt;br /&gt;
&lt;br /&gt;
===체인(Chain)===&lt;br /&gt;
* INPUT&lt;br /&gt;
* OUTPUT&lt;br /&gt;
* FORWARD&lt;br /&gt;
* PREROUTING&lt;br /&gt;
* POSTROUTING&lt;br /&gt;
&lt;br /&gt;
=== 매치(Match) ===&lt;br /&gt;
* -s: 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src)&lt;br /&gt;
* -d: 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst)&lt;br /&gt;
* -p: 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음&lt;br /&gt;
* -i: 입력 인터페이스와 매칭(––in-interface)&lt;br /&gt;
* -o: 출력 인터페이스와 매칭(––out-interface)&lt;br /&gt;
* -j: 매치되는 패킷을 어떻게 처리할지 지정 (--jump)&lt;br /&gt;
&lt;br /&gt;
== 타깃(target) ==&lt;br /&gt;
패킷이 규칙과 일치할 때 취하는 동작을 지정한다.&lt;br /&gt;
&lt;br /&gt;
* ACCEPT: 패킷을 허용한다.&lt;br /&gt;
* DROP: 패킷을 버린다(패킷이 전송된 적이 없던 것처럼)&lt;br /&gt;
* REJECT: 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable)&lt;br /&gt;
* LOG: 패킷을 syslog에 기록한다.&lt;br /&gt;
* SNAT --to [주소]: 소스 IP를 [변환(NAT)|NAT]한다.&lt;br /&gt;
* DNAT --to [주소]: 목적지 IP를 변환(NAT)한다.&lt;br /&gt;
* RETURN: 호출 체인 내에서 패킷 처리를 계속한다.&lt;br /&gt;
&lt;br /&gt;
== 정책 열람·저장·반영 ==&lt;br /&gt;
* 보기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -L&lt;br /&gt;
 또는&lt;br /&gt;
# cat /etc/sysconfig/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 차단 횟수 및 byte 수 포함하여 보기&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -L -nvx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# service iptables save&lt;br /&gt;
또는&lt;br /&gt;
# iptables-save&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 &amp;amp; 불러오기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; firewall.sh&lt;br /&gt;
# iptables-restore &amp;lt; firewall.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
&lt;br /&gt;
=== 특정 IP 및 IP 대역 차단 ===&lt;br /&gt;
(참고) IDS/IPS나 WAF로부터 악성 공격을 일삼는 IP를 차단하는 경우 C 클래스 대역을 통째로 차단해주는 것을 권장한다. (특히 해외 IP인 경우)&lt;br /&gt;
&lt;br /&gt;
* 차단 정책 적용 후 iptables-save를 꼭 해야 함을 명심하자&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;단순 차단 예제&#039;&#039;&#039;&lt;br /&gt;
* 192.168.10.22로부터 들어오는 패킷들은 차단하는 정책을 추가&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 192.168.10. 대역으로부터 들어오는 패킷들은 차단하는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 차단 정책 추가 시 코멘트(주석)를 추가해서 기록을 남겨주는 것이 좋다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.0/24 -j DROP -m comment --comment &amp;quot;bruteforce ip 20240516&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 기본 차단, 인터페이스별 포워딩 ===&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP)&lt;br /&gt;
** 두 번째 이더넷카드(eth1)로 들어오는 패킷인 경우에만 포워딩을 허가한다.&lt;br /&gt;
** 어떠한 방화벽도 설정되어 있지 않고 커널에서 포워딩을 허가한 상태이다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -P FORWARD DROP&lt;br /&gt;
# iptables -A FORWARD -i eth1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6483 리눅스마스터 1급 1602 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –t nat –A POSTROUTING -o eth0 –j SNAT --to 203.247.40.100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6547 리눅스마스터 1급 1701 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 첫 번째로 기존에 설정된 정책을 전부 삭제한다.&lt;br /&gt;
** 두 번째로 INPUT 체인에 loopback 인터페이스에 들어오는 모든 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 세 번째로 INPUT 체인에 프로토콜이 tcp이며 목적지포트가 22번부터 23번 포트인 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 마지막으로 INPUT 체인에 대한 기본 정책을 거부 메시지 없이 거절로 변경한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -F INPUT&lt;br /&gt;
# iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
# iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT&lt;br /&gt;
# iptables -P INPUT DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6499 리눅스마스터 1급 1502 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다.&lt;br /&gt;
** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다.&lt;br /&gt;
** INPUT 체인의 기본 정책은 DROP이다.&lt;br /&gt;
**# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp destination-unreachable 패킷에 대해서 허용한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-request -s 192.168.10.1 –d 0/0 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-reply -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&lt;br /&gt;
** 로드 밸런서나 프록시 등을 통해 들어온 경우X-Forwarded-For을 사용하여 차단&lt;br /&gt;
** String을 기반으로 차단 규칙 설정&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -I INPUT -p tcp --dport 80 -m string --string &amp;quot;X-Forwarded-For: 111.222.111.222&amp;quot; --algo bm -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 대상 프로토콜 SSH&lt;br /&gt;
** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP시키는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;삭제&#039;&#039;&#039;&lt;br /&gt;
** --line-number 옵션을 통해 정책의 번호를 확인한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -L --line-numbers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** -D 옵션을 지정하여 특정 번호의 정책을 삭제한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -D INPUT [번호]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39318</id>
		<title>리눅스 iptables</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_iptables&amp;diff=39318"/>
		<updated>2024-05-16T09:34:50Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스]][[분류:리눅스 프로그램]]&lt;br /&gt;
==개요==&lt;br /&gt;
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.&lt;br /&gt;
&lt;br /&gt;
==사용법==&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables  [-t 테이블] [액션] [체인] [매치] [-j 타겟]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===테이블(Table)===&lt;br /&gt;
* filter, nat, mangle, raw&lt;br /&gt;
* 명시하지 않으면 기본적으로 filter이다.&lt;br /&gt;
&lt;br /&gt;
===액션(Action)===&lt;br /&gt;
* -A: APPEND: 정책 추가&lt;br /&gt;
* -I: INSERT: 정책 삽입&lt;br /&gt;
* -D: DELETE: 정책 삭제&lt;br /&gt;
* -R: REPLACE: 정책 교체&lt;br /&gt;
* -F: FLUSH: 모든 정책 삭제&lt;br /&gt;
* -P: POLICY: 기본 정책을 설정&lt;br /&gt;
* -L: LIST: 정책 나열&lt;br /&gt;
&lt;br /&gt;
===체인(Chain)===&lt;br /&gt;
* INPUT&lt;br /&gt;
* OUTPUT&lt;br /&gt;
* FORWARD&lt;br /&gt;
* PREROUTING&lt;br /&gt;
* POSTROUTING&lt;br /&gt;
&lt;br /&gt;
=== 매치(Match) ===&lt;br /&gt;
* -s: 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src)&lt;br /&gt;
* -d: 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst)&lt;br /&gt;
* -p: 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음&lt;br /&gt;
* -i: 입력 인터페이스와 매칭(––in-interface)&lt;br /&gt;
* -o: 출력 인터페이스와 매칭(––out-interface)&lt;br /&gt;
* -j: 매치되는 패킷을 어떻게 처리할지 지정 (--jump)&lt;br /&gt;
&lt;br /&gt;
== 타깃(target) ==&lt;br /&gt;
패킷이 규칙과 일치할 때 취하는 동작을 지정한다.&lt;br /&gt;
&lt;br /&gt;
* ACCEPT: 패킷을 허용한다.&lt;br /&gt;
* DROP: 패킷을 버린다(패킷이 전송된 적이 없던 것처럼)&lt;br /&gt;
* REJECT: 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable)&lt;br /&gt;
* LOG: 패킷을 syslog에 기록한다.&lt;br /&gt;
* SNAT --to [주소]: 소스 IP를 [변환(NAT)|NAT]한다.&lt;br /&gt;
* DNAT --to [주소]: 목적지 IP를 변환(NAT)한다.&lt;br /&gt;
* RETURN: 호출 체인 내에서 패킷 처리를 계속한다.&lt;br /&gt;
&lt;br /&gt;
== 정책 열람·저장·반영 ==&lt;br /&gt;
* 보기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -L&lt;br /&gt;
 또는&lt;br /&gt;
# cat /etc/sysconfig/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 차단 횟수 및 byte 수 포함하여 보기&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -L -nvx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# service iptables save&lt;br /&gt;
또는&lt;br /&gt;
# iptables-save&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 &amp;amp; 불러오기&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; firewall.sh&lt;br /&gt;
# iptables-restore &amp;lt; firewall.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
&lt;br /&gt;
=== IP 차단 ===&lt;br /&gt;
(참고) IDS/IPS나 WAF로부터 악성 공격을 일삼는 IP를 차단하는 경우 C 클래스 대역을 통째로 차단해주는 것을 권장한다. (특히 해외 IP인 경우)&lt;br /&gt;
&lt;br /&gt;
* 차단 정책 적용 후 iptables-save를 꼭 해야 함을 명심하자&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;단순 차단 예제&#039;&#039;&#039;&lt;br /&gt;
* 192.168.10.22로부터 들어오는 패킷들은 차단하는 정책을 추가&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.22 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 192.168.10. 대역으로부터 들어오는 패킷들은 차단하는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -A INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
또는&lt;br /&gt;
# iptables -I INPUT -s 192.168.10.0/24 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP)&lt;br /&gt;
** 두 번째 이더넷카드(eth1)로 들어오는 패킷인 경우에만 포워딩을 허가한다.&lt;br /&gt;
** 어떠한 방화벽도 설정되어 있지 않고 커널에서 포워딩을 허가한 상태이다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -P FORWARD DROP&lt;br /&gt;
# iptables -A FORWARD -i eth1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6483 리눅스마스터 1급 1602 실기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –t nat –A POSTROUTING -o eth0 –j SNAT --to 203.247.40.100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6547 리눅스마스터 1급 1701 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 첫 번째로 기존에 설정된 정책을 전부 삭제한다.&lt;br /&gt;
** 두 번째로 INPUT 체인에 loopback 인터페이스에 들어오는 모든 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 세 번째로 INPUT 체인에 프로토콜이 tcp이며 목적지포트가 22번부터 23번 포트인 패킷에 대해 허용 정책을 추가 한다.&lt;br /&gt;
** 마지막으로 INPUT 체인에 대한 기본 정책을 거부 메시지 없이 거절로 변경한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -F INPUT&lt;br /&gt;
# iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
# iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT&lt;br /&gt;
# iptables -P INPUT DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/6499 리눅스마스터 1급 1502 실시 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다.&lt;br /&gt;
** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다.&lt;br /&gt;
** INPUT 체인의 기본 정책은 DROP이다.&lt;br /&gt;
**# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다.&lt;br /&gt;
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp destination-unreachable 패킷에 대해서 허용한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-request -s 192.168.10.1 –d 0/0 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type echo-reply -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
# iptables –A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 –d 192.168.10.1 -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&lt;br /&gt;
** 로드 밸런서나 프록시 등을 통해 들어온 경우X-Forwarded-For을 사용하여 차단&lt;br /&gt;
** String을 기반으로 차단 규칙 설정&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# iptables -I INPUT -p tcp --dport 80 -m string --string &amp;quot;X-Forwarded-For: 111.222.111.222&amp;quot; --algo bm -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;예제 조건&#039;&#039;&#039;&amp;lt;ref&amp;gt;http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제&amp;lt;/ref&amp;gt;&lt;br /&gt;
** 대상 프로토콜 SSH&lt;br /&gt;
** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP시키는 정책을 추가&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;삭제&#039;&#039;&#039;&lt;br /&gt;
** --line-number 옵션을 통해 정책의 번호를 확인한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -L --line-numbers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** -D 옵션을 지정하여 특정 번호의 정책을 삭제한다.&lt;br /&gt;
&amp;lt;pre class=&#039;shell&#039;&amp;gt;&lt;br /&gt;
iptables -D INPUT [번호]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=CTL&amp;diff=39317</id>
		<title>CTL</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=CTL&amp;diff=39317"/>
		<updated>2024-05-16T09:14:17Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 리눅스 명령어 어미의 CTL ==&lt;br /&gt;
&#039;&#039;&#039;C&#039;&#039;&#039;on&#039;&#039;&#039;T&#039;&#039;&#039;ro&#039;&#039;&#039;L&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
servicectl, apachectl 등의 어미에 붙은 ctl은 control의 줄임말이다.&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=CTL&amp;diff=39316</id>
		<title>CTL</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=CTL&amp;diff=39316"/>
		<updated>2024-05-16T09:14:01Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;on&amp;#039;&amp;#039;&amp;#039;T&amp;#039;&amp;#039;&amp;#039;ro&amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;  servicectl, apachectl 등의 어미에 붙은 ctl은 control의 줄임말이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;C&#039;&#039;&#039;on&#039;&#039;&#039;T&#039;&#039;&#039;ro&#039;&#039;&#039;L&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
servicectl, apachectl 등의 어미에 붙은 ctl은 control의 줄임말이다.&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_.htaccess_%ED%8A%B9%EC%A0%95_IP_%EC%B0%A8%EB%8B%A8&amp;diff=39282</id>
		<title>리눅스 .htaccess 특정 IP 차단</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_.htaccess_%ED%8A%B9%EC%A0%95_IP_%EC%B0%A8%EB%8B%A8&amp;diff=39282"/>
		<updated>2024-05-01T05:26:07Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: 2가지 방법을 이용할 수 있다.  === 단순 차단 (403 처리) === &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; &amp;lt;RequireAll&amp;gt;   Require all granted   Require not ip 123.123.123.123 &amp;lt;/RequireAll&amp;gt; &amp;lt;/syntaxhighlight&amp;gt;  === 특정 페이지로 넘기기 === &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; RewriteCond %{HTTP:X-FORWARDED-FOR} ^123.123.123.123$ [OR] RewriteCond %{REMOTE_ADDR} ^123.123.123.123$  RewriteRule !blocked.php$ /blocked.php [L,R=301] &amp;lt;/syntaxhighlight&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2가지 방법을 이용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 단순 차단 (403 처리) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;RequireAll&amp;gt;&lt;br /&gt;
  Require all granted&lt;br /&gt;
  Require not ip 123.123.123.123&lt;br /&gt;
&amp;lt;/RequireAll&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 특정 페이지로 넘기기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
RewriteCond %{HTTP:X-FORWARDED-FOR} ^123.123.123.123$ [OR]&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} ^123.123.123.123$ &lt;br /&gt;
RewriteRule !blocked.php$ /blocked.php [L,R=301]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_logrotate&amp;diff=39281</id>
		<title>리눅스 logrotate</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_logrotate&amp;diff=39281"/>
		<updated>2024-05-01T04:47:00Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
;로그 파일을 주기적으로 압축하고 이름을 바꾸어 관리한다.&lt;br /&gt;
* 리눅스에서만 지원&lt;br /&gt;
* 경로 : /usr/sbin/logrotate&lt;br /&gt;
&lt;br /&gt;
== 사용법 ==&lt;br /&gt;
=== 문법 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logrotate [옵션] &amp;lt;설정파일&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 옵션 ===&lt;br /&gt;
* -d : 디버거 모드&lt;br /&gt;
* -f, --force : 새로운 목록이 추가되었거나 오래된 로그 파일을 수동으로 삭제할 경우 강제로 실행한다.&lt;br /&gt;
* -s, --state [statefile] : 지정한 정책 파일(statefile)으로 logrotate를 실행한다.&lt;br /&gt;
* --usage : 사용법을 출력한다.&lt;br /&gt;
&lt;br /&gt;
=== 설정파일 옵션 ===&lt;br /&gt;
&lt;br /&gt;
* yearly, monthly, weekly, daily 주기 옵션으로 로테이트를 실행할때 로그를 어떤 주기로 로테이트를 할지 선택&lt;br /&gt;
* rotate [숫자] 로그파일의 개수가 숫자이상이면 가장 오래된 로그파일을 삭제합니다.&lt;br /&gt;
* create [권한] [유저] [그룹] 로테이트 될때 생성되는 로그파일 권한 및 소유자 지정&lt;br /&gt;
* notifempty 로그 내용이 없으면 로테이트를 실행하지 않음 이와 반대로&lt;br /&gt;
* ifempty는 로그 내용이 없어도 로테이트를 진행&lt;br /&gt;
* compress 로테이트로 생성되는 로그파일 gzip으로 압축생성&lt;br /&gt;
* nocompress 로테이트로 생성되는 로그파일을 압축하지 않고 생성&lt;br /&gt;
* missingok 로그파일을 발견하지 못해도 에러처리 하지 않음&lt;br /&gt;
* dateext 로테이트 파일의 이름에 날짜가 들어가도록 생성&lt;br /&gt;
* size [숫자 K,M,G] 로그 파일이 크기가 설정보다 커지면 로테이트 실행&lt;br /&gt;
* maxage [숫자] 파일이 지정일 이상되면 삭제&lt;br /&gt;
* postrotate 실행후 스크립트 파일 실행&lt;br /&gt;
* endscript 스크립트를 실행하는 옵션 다음에 들어가야하는 옵션&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
== 참고 문헌 ==&lt;br /&gt;
* [https://book.naver.com/bookdb/book_detail.naver?bid=6413239 유닉스 리눅스 명령어 사전, 2010. 11. 30., 우종경, 박종오]&lt;br /&gt;
&lt;br /&gt;
[[분류:리눅스]][[분류:리눅스 명령어]]&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=TCP_Wrapper&amp;diff=39280</id>
		<title>TCP Wrapper</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=TCP_Wrapper&amp;diff=39280"/>
		<updated>2024-05-01T03:13:18Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스 프로그램]][[분류:보안 도구]]&lt;br /&gt;
==개요==&lt;br /&gt;
* 서비스별 중앙통제 ACL 시스템&lt;br /&gt;
* 리눅스 또는 BSD 같은 운영 체제의 인터넷 프로토콜 서버에서 네트워크 접근을 필터링하기 위해 사용됨&lt;br /&gt;
* 대부분 서비스 자체적으로 ACL기능을 제공하기 때문에 점점 안 쓰이는 분위기다.&lt;br /&gt;
&lt;br /&gt;
== TCP Wrapper 접근제어 가능 서비스 ==&lt;br /&gt;
&lt;br /&gt;
* FTP&lt;br /&gt;
* Telnet&lt;br /&gt;
* SSH&lt;br /&gt;
* TFTP&lt;br /&gt;
* finger&lt;br /&gt;
* systat&lt;br /&gt;
* rlogin&lt;br /&gt;
* rsh&lt;br /&gt;
* talk&lt;br /&gt;
* exec&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;httpd는 해당사항이 없다!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==사용 방법==&lt;br /&gt;
hosts.allow와 hosts.deny를 통해 서비스별 필터링을 수행한다.&lt;br /&gt;
&lt;br /&gt;
* /etc/hosts.allow: 접근을 허용할 Source IP 설정&lt;br /&gt;
* /etc/hosts.deny: 접근을 제한할 Source IP 설정&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
서비스 목록: 호스트 목록&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
형태로 사용된다. 특정 서비스에 대한 접근 통제만 하려면 hosts.deny만 작성해도 된다.&lt;br /&gt;
&lt;br /&gt;
* 둘다 설정되어 있을 경우 allow가 우선순위 높음&lt;br /&gt;
&lt;br /&gt;
=== 서비스 목록 ===&lt;br /&gt;
서비스명이 아닌 실행 데몬명으로 적어야 한다.&lt;br /&gt;
* 예를 들어 telnet제어 시 in.telnetd라고 적는다.&lt;br /&gt;
* 복수의 경우 따옴표로 구분한다.&lt;br /&gt;
&lt;br /&gt;
=== 호스트 목록 ===&lt;br /&gt;
아래와 같이 표현할 수 있다.&lt;br /&gt;
* 192.168.10.&lt;br /&gt;
* 192.168.10.0/255.255.255.0&lt;br /&gt;
* .itwiki.kr&lt;br /&gt;
* 192.168.10.0/255.255.255.0, .itwiki.kr&lt;br /&gt;
* .itwiki.kr EXCEPT crack.itwiki.kr&lt;br /&gt;
* .kr EXCEPT www.crack.kr&lt;br /&gt;
===hosts.deny===&lt;br /&gt;
접속을 막을 목록을 관리한다. 화이트리스트 기반으로 운영하려면 아래와 같이 설정한다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/hosts.deny&lt;br /&gt;
ALL:ALL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===hosts.allow===&lt;br /&gt;
화이트리스트 기반으로 운영하려면 hosts.deny에서 ALL:ALL로 다 막아놓고 hosts.allow에 허용할 서비스만 연다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/hosts.allow&lt;br /&gt;
ALL:localhost&lt;br /&gt;
in.telnetd:192.168.10.&lt;br /&gt;
sshd, vsftpd:.itwiki.kr EXCEPT crack.itwiki.kr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 로그 ==&lt;br /&gt;
TCP Wrapper가 기록하는 로그 내용은 운영체제별로 다음 장소에 기록&lt;br /&gt;
* aix: /var/admin/messages&lt;br /&gt;
* hpux10: /usr/spool/mqueue/syslog&lt;br /&gt;
* irix: /var/admin/syslog&lt;br /&gt;
* solaris: /var/log/syslog&lt;br /&gt;
* linux: /var/log/messages, /var/log/secure&lt;br /&gt;
&lt;br /&gt;
==기타==&lt;br /&gt;
* 잘 사용하진 않지만 Shell Command를 사용하여 어떤 서비스에 어떤 호스트가 접속할 경우 이메일을 발송하는 등의 고급 옵션을 지정할 수 있다.&lt;br /&gt;
* hosts.allow 맨 아래쪽에 다음과 같은 특수한 정책을 넣어 hosts.deny의 역할을 대신할 수 있다.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# vi /etc/hosts.allow&lt;br /&gt;
ALL:localhost&lt;br /&gt;
in.telnetd:192.168.10.&lt;br /&gt;
sshd, vsftpd:.itwiki.kr EXCEPT crack.itwiki.kr&lt;br /&gt;
ALL:ALL:Deny&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 지양되는 기술 ==&lt;br /&gt;
* 현대 리눅스에선 네트워크 단위의 접근 통제, 서비스 자체적인 ACL이 지원되고 있기 때문에 TCP Wrapper의 사용은 지양된다.&amp;lt;br&amp;gt;[https://fedoraproject.org/wiki/Changes/Deprecate_TCP_wrappers#Deprecate_TCP_wrappers 페도라 위키(원문): 현대 리눅스에서 TCP Wrapper는 지양되어야 한다는 내용]&lt;br /&gt;
&lt;br /&gt;
* 다만 설정이 무척 간단하고 직관적이라 현장에선 아직 많이 사용되고 있다.&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_yum&amp;diff=39275</id>
		<title>리눅스 yum</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_yum&amp;diff=39275"/>
		<updated>2024-04-23T14:54:11Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:리눅스]][[분류:리눅스 프로그램]]&lt;br /&gt;
== 사용법 ==&lt;br /&gt;
&#039;&#039;&#039;yum [옵션] [명령] [패키지]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 옵션 ==&lt;br /&gt;
* -h, --help : 사용법을 출력한다.&lt;br /&gt;
* -C : 캐쉬 정보에서 실행하지만, 캐쉬는 갱신하지 않는다.&lt;br /&gt;
* -c [config file] : 설정 파일을 지정한다.&lt;br /&gt;
* -R [minutes] : 최대 명령어 대기 시간&lt;br /&gt;
* -d [debug level] : 디버깅 출력 레벨&lt;br /&gt;
* --showduplicates : 목록이나 찾기 명령에서 최신 버전만 출력하는 대신, 저장소와 중복된 것도 출력한다.&lt;br /&gt;
* -e [error level] : 에러 출력 레벨&lt;br /&gt;
* -q, --quiet : 에러를 출력하지 않는다.&lt;br /&gt;
* -v, --verbose : 상세한 정보를 출력한다.&lt;br /&gt;
* -y : 모든 물음에 yes로 대답한다.&lt;br /&gt;
* --version : yum 버전 정보를 출력한다.&lt;br /&gt;
* --installroot＝[path] : 인스톨 루트 디렉터리를 설정한다.&lt;br /&gt;
* --enablerepo＝[repo] : 하나 이상의 저장소를 활성화한다(와일드카드 허용).&lt;br /&gt;
* --disablerepo＝[repo] : 하나 이상의 저장소를 비활성화한다(와일드카드 허용).&lt;br /&gt;
* -x [package], --exclude＝[package] : 이름이나 패턴 매칭으로 패키지를 제외한다.&lt;br /&gt;
* --disableexcludes＝[repo] : 설정 파일에서 지정한 제외를 비활성화한다.&lt;br /&gt;
* --obsoletes : 업데이트 동안 yum의 쓸모없는 프로세스 로직을 활성화한다.&lt;br /&gt;
* --noplugins : yum 플러그인을 비활성화한다.&lt;br /&gt;
* --nogpgcheck : gpg 시그너쳐 체크를 비활성화한다.&lt;br /&gt;
* --disableplugin＝[plugin] : 이름으로 플러그인을 비활성화한다.&lt;br /&gt;
* --enableplugin＝[plugin] : 이름으로 플러그인을 활성화한다.&lt;br /&gt;
* --skip-broken : 의존성 문제를 가진 패키지를 건너뛴다.&lt;br /&gt;
* --color＝COLOR : 색깔을 사용할지 컨트롤한다.&lt;br /&gt;
&lt;br /&gt;
== 명령 ==&lt;br /&gt;
* check-update : 가능한 패키지 업데이트가 있는지 체크한다.&lt;br /&gt;
* clean : 캐쉬 데이터를 제거한다.&lt;br /&gt;
* deplist : 패키지 의존성 목록을 출력한다.&lt;br /&gt;
* downgrade : 패키지를 다운그레이드한다.&lt;br /&gt;
* erase : 시스템에서 패키지나 패키지들을 제거한다.&lt;br /&gt;
* groupinfo : 패키지 그룹에 관한 상세한 정보를 출력한다.&lt;br /&gt;
* groupinstall : 시스템에 그룹으로 패키지를 설치한다.&lt;br /&gt;
* grouplist : 가능한 패키지 그룹 목록을 출력한다.&lt;br /&gt;
* groupremove : 시스템에서 그룹의 패키지를 제거한다.&lt;br /&gt;
* help : 사용법을 출력한다.&lt;br /&gt;
* history : 트랜잭션 히스토리를 출력하거나 사용한다.&lt;br /&gt;
* info : 패키지나 패키지 그룹의 상세한 정보를 출력한다.&lt;br /&gt;
* install : 시스템에 패키지나 패키지들을 설치한다.&lt;br /&gt;
* list : 패키지나 패키지 그룹 목록을 출력한다.&lt;br /&gt;
* localinstall : 로컬 RPM을 설치한다.&lt;br /&gt;
* makecache : 메타 데이터 캐쉬를 생성한다.&lt;br /&gt;
* provides : 주어진 값에 제공하는 패키지를 찾는다.&lt;br /&gt;
* reinstall : 패키지를 재설치한다.&lt;br /&gt;
* repolist : 설정 소프트웨어 저장소를 출력한다.&lt;br /&gt;
* resolvedep : 주어진 의존성에서 제공하는 패키지를 결정한다.&lt;br /&gt;
* search : 주어진 문자열에 대한 패키지의 상세한 정보를 찾는다.&lt;br /&gt;
* shell : 상호작용 yum 셸을 실행한다.&lt;br /&gt;
* update : 시스템에 패키지나 패키지들을 업데이트한다.&lt;br /&gt;
* upgrade : update –obsoletes와 같다.&lt;br /&gt;
* version : 버전 정보를 출력한다.&lt;br /&gt;
&lt;br /&gt;
== 예시 ==&lt;br /&gt;
&#039;&#039;&#039;특정 패키지를 제외하고 업데이트 (특정 버전을 유지해야 하는 경우, dependency 에러가 나는 경우 등)&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo yum update --exclude=google-chrome* -y&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_vi&amp;diff=39273</id>
		<title>리눅스 vi</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%A6%AC%EB%88%85%EC%8A%A4_vi&amp;diff=39273"/>
		<updated>2024-04-18T13:49:02Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: == 주요 단축키 ==  === 시작 명령어 === {| class=&amp;quot;wikitable&amp;quot; !&amp;#039;&amp;#039;&amp;#039;명령어&amp;#039;&amp;#039;&amp;#039; !&amp;#039;&amp;#039;&amp;#039;설명&amp;#039;&amp;#039;&amp;#039; !&amp;#039;&amp;#039;&amp;#039;예제&amp;#039;&amp;#039;&amp;#039; |- !vi {파일명} |파일열기, 작성 |vi test.txt |- !vi +{행번호} {파일명} |파일을 열고, 입력한 행으로 커서 이동 |vi -100 test.txt |- !vi +/&amp;quot;{검색 문자열}&amp;quot; {파일명} |“문자열”의 처음발생 단어부터 열기 |vi -/&amp;quot;adc&amp;quot; test.txt |- !vi –r {파일명} |손상된 파일 회복 |vi -r test.txt |- !view {파일명} |읽기...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 주요 단축키 ==&lt;br /&gt;
&lt;br /&gt;
=== 시작 명령어 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;명령어&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;예제&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!vi {파일명}&lt;br /&gt;
|파일열기, 작성&lt;br /&gt;
|vi test.txt&lt;br /&gt;
|-&lt;br /&gt;
!vi +{행번호} {파일명}&lt;br /&gt;
|파일을 열고, 입력한 행으로 커서 이동&lt;br /&gt;
|vi -100 test.txt&lt;br /&gt;
|-&lt;br /&gt;
!vi +/&amp;quot;{검색 문자열}&amp;quot; {파일명}&lt;br /&gt;
|“문자열”의 처음발생 단어부터 열기&lt;br /&gt;
|vi -/&amp;quot;adc&amp;quot; test.txt&lt;br /&gt;
|-&lt;br /&gt;
!vi –r {파일명}&lt;br /&gt;
|손상된 파일 회복&lt;br /&gt;
|vi -r test.txt&lt;br /&gt;
|-&lt;br /&gt;
!view {파일명}&lt;br /&gt;
|읽기 전용으로 열기기&lt;br /&gt;
|view test.txt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 커서 이동 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;커서&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!h (←)&lt;br /&gt;
|왼쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!j (↓)&lt;br /&gt;
|아래로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!k (↑)&lt;br /&gt;
|위로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!l (→)&lt;br /&gt;
|오른쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!w&lt;br /&gt;
|오른쪽 한 단어의 끝 부분으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!e&lt;br /&gt;
|오른쪽 한 단어의 앞 부분으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!b&lt;br /&gt;
|왼쪽 한 단어의 앞 부분으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!Enter&lt;br /&gt;
|한 행 아래로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!Back space&lt;br /&gt;
|한 문자 왼쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!Space Bar&lt;br /&gt;
|한 문자 오른쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!^&lt;br /&gt;
|행의 맨 왼쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!$&lt;br /&gt;
|행의 맨 오른쪽으로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!H&lt;br /&gt;
|화면의 맨 위로 이동&lt;br /&gt;
|-&lt;br /&gt;
!M&lt;br /&gt;
|화면의 중간으로 이동&lt;br /&gt;
|-&lt;br /&gt;
!L&lt;br /&gt;
|화면의 맨 아래로 이동&lt;br /&gt;
|-&lt;br /&gt;
!숫자G&lt;br /&gt;
|‘숫자’ 만큼 지정한 줄로 커서 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + i&lt;br /&gt;
|한 화면 위로 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + b&lt;br /&gt;
|한 화면 아래로 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + d&lt;br /&gt;
|반 화면 위로 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + u&lt;br /&gt;
|반 화면 아래로 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + e&lt;br /&gt;
|한 줄씩 위로 이동&lt;br /&gt;
|-&lt;br /&gt;
!Ctrl + y&lt;br /&gt;
|한 줄씩 아래로 이동&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 문자, 행 , 삽입 명령어 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;커서&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!a&lt;br /&gt;
|커서 오른쪽에 문자 삽입&lt;br /&gt;
|-&lt;br /&gt;
!A&lt;br /&gt;
|커서 오른쪽, 행의 끝에 문자 삽입&lt;br /&gt;
|-&lt;br /&gt;
!i&lt;br /&gt;
|커서 왼쪽에 문자 삽입&lt;br /&gt;
|-&lt;br /&gt;
!I&lt;br /&gt;
|커서 왼쪽, 행의 처음에 문자 삽입&lt;br /&gt;
|-&lt;br /&gt;
!o&lt;br /&gt;
|커서 아래에 행 삽입&lt;br /&gt;
|-&lt;br /&gt;
!O&lt;br /&gt;
|커서 위에 행 삽입&lt;br /&gt;
|-&lt;br /&gt;
!ESC&lt;br /&gt;
|종료&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;텍스트 변경 명령어&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;명령어&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!cw&lt;br /&gt;
|단어 변경&lt;br /&gt;
|-&lt;br /&gt;
!cc&lt;br /&gt;
|행 변경&lt;br /&gt;
|-&lt;br /&gt;
!C&lt;br /&gt;
|커서 오른쪽의 행 변경&lt;br /&gt;
|-&lt;br /&gt;
!s&lt;br /&gt;
|커서가 위치한 문자열 대체&lt;br /&gt;
|-&lt;br /&gt;
!S&lt;br /&gt;
|커서가 위치한 라인의 문자열 대체&lt;br /&gt;
|-&lt;br /&gt;
!r&lt;br /&gt;
|커서 위치 문자를 다른 문자로 대체&lt;br /&gt;
|-&lt;br /&gt;
!r-Enter&lt;br /&gt;
|행 분리&lt;br /&gt;
|-&lt;br /&gt;
!J&lt;br /&gt;
|현재 행과 아래 행 결합&lt;br /&gt;
|-&lt;br /&gt;
!xp&lt;br /&gt;
|커서 위치 문자와 오른쪽 문자 교환&lt;br /&gt;
|-&lt;br /&gt;
!~&lt;br /&gt;
|문자형(대, 소문자) 변경&lt;br /&gt;
|-&lt;br /&gt;
!u&lt;br /&gt;
|이전 명령 취소&lt;br /&gt;
|-&lt;br /&gt;
!U&lt;br /&gt;
|행 변경 사항 취소, 이전의 최종 행 취소&lt;br /&gt;
|-&lt;br /&gt;
!.&lt;br /&gt;
|이전 최종 명령 반복&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 텍스트 삭제 명령어 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;명령어&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!x&lt;br /&gt;
|커서가 있는 문자 삭제&lt;br /&gt;
|-&lt;br /&gt;
!nx&lt;br /&gt;
|커서가 있는 위치부터 n개의 문자를 삭제&lt;br /&gt;
|-&lt;br /&gt;
!dw&lt;br /&gt;
|현재 커서에 있는 한 단어 삭제&lt;br /&gt;
|-&lt;br /&gt;
!dd&lt;br /&gt;
|커서가 있는 라인 삭제&lt;br /&gt;
|-&lt;br /&gt;
!ndd&lt;br /&gt;
|커서가 있는 라인부터 n개의 라인 삭제&lt;br /&gt;
|-&lt;br /&gt;
!db&lt;br /&gt;
|커서의 위치에서 거꾸로 한 단어 삭제&lt;br /&gt;
|-&lt;br /&gt;
!D&lt;br /&gt;
|커서 오른쪽 행 삭제&lt;br /&gt;
|-&lt;br /&gt;
!:5,10d&lt;br /&gt;
|5~10번째 행 삭제&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 복사 및 이동 명령어 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;명령어&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;설명&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!yy&lt;br /&gt;
|커서가 위치한 줄 복사&lt;br /&gt;
|-&lt;br /&gt;
!Y&lt;br /&gt;
|행 yank 또는 복사&lt;br /&gt;
|-&lt;br /&gt;
!yh&lt;br /&gt;
|커서의 왼쪽 문자 복사&lt;br /&gt;
|-&lt;br /&gt;
!yl&lt;br /&gt;
|커서에 위치한 문자 복사&lt;br /&gt;
|-&lt;br /&gt;
!yi&lt;br /&gt;
|커서가 위치한 줄과 그 아랫줄 복사&lt;br /&gt;
|-&lt;br /&gt;
!yk&lt;br /&gt;
|커서가 위치한 줄과 그 윗줄 복사&lt;br /&gt;
|-&lt;br /&gt;
!p&lt;br /&gt;
|yank 되거나 삭제된 행 현재 행 위로 삽입&lt;br /&gt;
|-&lt;br /&gt;
!P&lt;br /&gt;
|yank 되거나 삭제된 행 현재 행 아래에 삽입&lt;br /&gt;
|-&lt;br /&gt;
!:1,2 co 3&lt;br /&gt;
|1~2행을 3행 다음으로 복사&lt;br /&gt;
|-&lt;br /&gt;
!:4,5 m 6&lt;br /&gt;
|4~5행을 6행 위로 이동&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%ED%98%88%EC%A4%91_%EC%82%B0%EC%86%8C_%ED%8F%AC%ED%99%94%EB%8F%84&amp;diff=39262</id>
		<title>혈중 산소 포화도</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%ED%98%88%EC%A4%91_%EC%82%B0%EC%86%8C_%ED%8F%AC%ED%99%94%EB%8F%84&amp;diff=39262"/>
		<updated>2024-04-10T07:39:01Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: 혈중 산소 포화도 또는 혈중 산소 농도란 혈액 속에서 헤모글로빈과 결합된 산소량을 백분율로 나타낸 값으로, 혈압이나 심박수 등과 함꼐 생명징후 모니터의 주요 항목으로 쓰인다. 단위는 백분율(Percentage)이다.  &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 응급실에서 한 환자의 상태가 악화되면서 산소포화도가 낮아진다. 인공호흡기를 부착하고 산소를 최대 농도로 투여하여 산소포화도를...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;혈중 산소 포화도 또는 혈중 산소 농도란 혈액 속에서 헤모글로빈과 결합된 산소량을 백분율로 나타낸 값으로, 혈압이나 심박수 등과 함꼐 생명징후 모니터의 주요 항목으로 쓰인다. 단위는 백분율(Percentage)이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 응급실에서 한 환자의 상태가 악화되면서 산소포화도가 낮아진다. 인공호흡기를 부착하고 산소를 최대 농도로 투여하여 산소포화도를 끌어 올리려 안간힘을 쓴다.&lt;br /&gt;
&lt;br /&gt;
스마트폰, 웨어러블 기기 등으로 간단하게 산소포화도 측정이 가능해지면서 이 수치가 의미하는 것은 무엇인지, 정상수치는 얼마인지 궁금해하는 이가 많다. 산소포화도는 대개 위 사례처럼 폐렴, 다발성 장기부전 등에 의한 매우 위중한 상태에서 수치가 떨어진다. 만성 폐쇄성 폐질환 등 호흡기 질환이 악화되거나 간혹 마취 후 회복과정 등에서도 수치가 떨어질 수 있다.&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EA%B5%AC%EA%B8%80_%EA%B0%9C%EB%B0%9C%EC%9E%90_%EC%9C%A0%ED%98%95&amp;diff=39261</id>
		<title>구글 개발자 유형</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EA%B5%AC%EA%B8%80_%EA%B0%9C%EB%B0%9C%EC%9E%90_%EC%9C%A0%ED%98%95&amp;diff=39261"/>
		<updated>2024-04-10T07:05:19Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: 구글 개발자 유형이란 구글에서 플레이스토어에 앱을 배포하는 개발자가 &amp;quot;개인&amp;quot;인지 &amp;quot;조직&amp;quot;인지 구분하는 유형을 말한다.  == 종류 == &amp;quot;조직&amp;quot;과 &amp;quot;개인&amp;quot; 두가지로 나뉜다. 구글에 따르면 설명은 아래와 같다.  * &amp;#039;&amp;#039;&amp;#039;조직:&amp;#039;&amp;#039;&amp;#039; 조직 또는 비즈니스용 계정이라면 선택하세요. 예를 들어 상업, 산업, 전문 또는 정부 활동에 참여하는 경우가 여기에 해당합니다. * &amp;#039;&amp;#039;&amp;#039;개인:&amp;#039;&amp;#039;&amp;#039; 개인...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;구글 개발자 유형이란 구글에서 플레이스토어에 앱을 배포하는 개발자가 &amp;quot;개인&amp;quot;인지 &amp;quot;조직&amp;quot;인지 구분하는 유형을 말한다.&lt;br /&gt;
&lt;br /&gt;
== 종류 ==&lt;br /&gt;
&amp;quot;조직&amp;quot;과 &amp;quot;개인&amp;quot; 두가지로 나뉜다. 구글에 따르면 설명은 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;조직:&#039;&#039;&#039; 조직 또는 비즈니스용 계정이라면 선택하세요. 예를 들어 상업, 산업, 전문 또는 정부 활동에 참여하는 경우가 여기에 해당합니다.&lt;br /&gt;
* &#039;&#039;&#039;개인:&#039;&#039;&#039; 개인용 계정이라면 선택하세요. 예를 들어 학생, 취미 개발자 또는 아마추어 개발자가 여기에 해당합니다. 이 경우에도 Google Play에서 수익을 창출하고 다른 사람을 계정에 초대할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
언뜻 그냥 의미상의 구분인 것으로 보이지만, &amp;quot;조직&amp;quot;을 선택하는 경우 DUNS 번호를 발급받아 등록해야 한다. 개인을 선택하면 등록 절차는 간편하지만 앱을 배포할 때 테스트 요구사항이 까다로워지는 등 배포상의 제약이 있다.&lt;br /&gt;
&lt;br /&gt;
== 조직 계정 ==&lt;br /&gt;
&lt;br /&gt;
=== 필요사항 ===&lt;br /&gt;
[[D-U-N-S 번호]] 제출&lt;br /&gt;
&lt;br /&gt;
== 개인 계정 ==&lt;br /&gt;
&lt;br /&gt;
=== 제약 사항 ===&lt;br /&gt;
배포 전 테스트 요구사항&lt;br /&gt;
&lt;br /&gt;
* 업데이트된 앱을 배포하기 전에 20명의 Opt-in 클로즈 베타 테스트가 요구된다. 즉, 기능이 개선된 앱을 배포하고자 했을 때 모든 사용자에게 즉시 자동 배포할 수 없다. 사용자가 직접 &amp;quot;업데이트&amp;quot;를 눌러 20명 이상이 업데이트를 하고 일정 기간 문제 없이 사용한 경우에만 다른 사용자들에게 자동 배포가 가능하다. &amp;lt;ref&amp;gt;https://medium.com/@contact_7627/new-restriction-on-google-play-personal-developer-account-54058e3595a3&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 및 관련 링크 ==&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=GitHub&amp;diff=39257</id>
		<title>GitHub</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=GitHub&amp;diff=39257"/>
		<updated>2024-04-05T14:12:54Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: == GitHub의 장점 ==  * 편리한 GUI 인터페이스&amp;lt;ref&amp;gt;이는 GitLab이나 비트버킷(Bitbucket)과 같은 Git 호스팅 서비스의 공통적인 장점이다. &amp;lt;/ref&amp;gt; * Issue, Wiki 등을 통한 효율적인 협업 * Pull Request를 통한 공동 개발 가능&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GitHub의 장점 ==&lt;br /&gt;
&lt;br /&gt;
* 편리한 GUI 인터페이스&amp;lt;ref&amp;gt;이는 GitLab이나 비트버킷(Bitbucket)과 같은 Git 호스팅 서비스의 공통적인 장점이다. &amp;lt;/ref&amp;gt;&lt;br /&gt;
* Issue, Wiki 등을 통한 효율적인 협업&lt;br /&gt;
* Pull Request를 통한 공동 개발 가능&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=39256</id>
		<title>PHP 파일 쓰기</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=39256"/>
		<updated>2024-04-05T09:17:39Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 파일 열기 ==&lt;br /&gt;
&lt;br /&gt;
* 쓰기 모드(w)로 파일을 연다.&lt;br /&gt;
* fopen을 사용한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myFile = fopen(&amp;quot;testfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;(참고) 파일 열기 모드&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* r : 읽기(read)&lt;br /&gt;
* w : 쓰기(write)&lt;br /&gt;
* a: 추가하기(append)&lt;br /&gt;
&lt;br /&gt;
== 파일 쓰기 ==&lt;br /&gt;
&lt;br /&gt;
* fwrite를 이용해 파일을 쓴다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
    $txt = &amp;quot;John Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    $txt = &amp;quot;Jane Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 결과는 아래와 같다. (newfile.txt)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
John Doe&lt;br /&gt;
Jane Doe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 파일 닫기 ==&lt;br /&gt;
&lt;br /&gt;
* fclose로 파일을 닫는다.&lt;br /&gt;
* php 파일이 끝나면 알아서 닫기지만, 다 쓰고 나면 아래와 같이 명시적으로 닫아주는 것이 좋다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
    $txt = &amp;quot;John Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    $txt = &amp;quot;Jane Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    fclose($myfile);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=37975</id>
		<title>PHP 파일 쓰기</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=37975"/>
		<updated>2023-02-18T02:50:15Z</updated>

		<summary type="html">&lt;p&gt;계발자: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 파일 열기 ==&lt;br /&gt;
&lt;br /&gt;
* 쓰기 모드(w)로 파일을 연다.&lt;br /&gt;
* fopen을 사용한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myFile = fopen(&amp;quot;testfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 파일 쓰기 ==&lt;br /&gt;
&lt;br /&gt;
* fwrite를 이용해 파일을 쓴다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
    $txt = &amp;quot;John Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    $txt = &amp;quot;Jane Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 결과는 아래와 같다. (newfile.txt)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
John Doe&lt;br /&gt;
Jane Doe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 파일 닫기 ==&lt;br /&gt;
&lt;br /&gt;
* fclose로 파일을 닫는다.&lt;br /&gt;
* php 파일이 끝나면 알아서 닫기지만, 다 쓰고 나면 아래와 같이 명시적으로 닫아주는 것이 좋다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
    $txt = &amp;quot;John Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    $txt = &amp;quot;Jane Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    fclose($myfile);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=37974</id>
		<title>PHP 파일 쓰기</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=PHP_%ED%8C%8C%EC%9D%BC_%EC%93%B0%EA%B8%B0&amp;diff=37974"/>
		<updated>2023-02-18T02:43:30Z</updated>

		<summary type="html">&lt;p&gt;계발자: 새 문서: == 파일 열기 ==  * 쓰기 모드(w)로 파일을 연다. * fopen을 사용한다. &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; &amp;lt;?php     $myFile = fopen(&amp;quot;testfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;); ?&amp;gt; &amp;lt;/syntaxhighlight&amp;gt;  == 파일 쓰기 ==  * fwrite를 이용해 파일을 쓴다. &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; &amp;lt;?php     $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);     $txt = &amp;quot;John Doe\n&amp;quot;;     fwrite($myfile, $txt);     $txt = &amp;quot;Jane Doe\n&amp;quot;;     fwrite($...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 파일 열기 ==&lt;br /&gt;
&lt;br /&gt;
* 쓰기 모드(w)로 파일을 연다.&lt;br /&gt;
* fopen을 사용한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myFile = fopen(&amp;quot;testfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 파일 쓰기 ==&lt;br /&gt;
&lt;br /&gt;
* fwrite를 이용해 파일을 쓴다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $myfile = fopen(&amp;quot;newfile.txt&amp;quot;, &amp;quot;w&amp;quot;) or die(&amp;quot;Unable to open file!&amp;quot;);&lt;br /&gt;
    $txt = &amp;quot;John Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    $txt = &amp;quot;Jane Doe\n&amp;quot;;&lt;br /&gt;
    fwrite($myfile, $txt);&lt;br /&gt;
    fclose($myfile);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 결과는 아래와 같다. (newfile.txt)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
John Doe&lt;br /&gt;
Jane Doe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>계발자</name></author>
	</entry>
</feed>