Jekyll2022-03-17T01:46:13+00:00https://nesoy.github.io/atom.xmlNesoy BlogSoftware Engineer권영재kubernetes 명령어 모음2022-03-17T00:00:00+00:002022-03-17T00:00:00+00:00https://nesoy.github.io/articles/2022-03/command-k8s<h4 id="restart된-컨테이너의-이전-로그-확인하기">Restart된 컨테이너의 이전 로그 확인하기</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl logs podname -c containername --previous
</code></pre></div></div>
<h2 id="reference">Reference</h2>권영재du 명령어2021-12-26T00:00:00+00:002021-12-26T00:00:00+00:00https://nesoy.github.io/articles/2021-12/command-du<h2 id="du-명령어">du 명령어</h2>
<blockquote>
<p>The du utility displays the file system block usage for each file argument and for each directory in the file hierarchy rooted in each directory argument. If no file is specified, the block usage of the hierarchy rooted in the current directory is displayed.</p>
</blockquote>
<ul>
<li>디렉토리와 모든 하위 디렉토리의 용량을 표시</li>
</ul>
<h4 id="example">Example</h4>
<ul>
<li>선택한 디렉토리만의 용량을 표시</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>du -sh /something
du -sh /something/* // 아래도 표기
</code></pre></div></div>
<ul>
<li>가장 많은 용량을 차지하는 디렉토리 찾기</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>du -h --max-depth=1 | sort -hr
</code></pre></div></div>
<ul>
<li>directory도 실제 용량을 표시
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>du -h --apparent-size
</code></pre></div> </div>
</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://www.manualfactory.net/10591">https://www.manualfactory.net/10591</a></li>
</ul>권영재ifkakao 20212021-12-16T00:00:00+00:002021-12-16T00:00:00+00:00https://nesoy.github.io/articles/2021-12/if-kakao-2021<h2 id="thing-for-post-cloud-native"><a href="https://if.kakao.com/session/34">Thing for Post Cloud Native</a></h2>
<ul>
<li><a href="https://www.ciokorea.com/news/37632">CMMI(Capability Maturity Model Integration)</a></li>
<li>Level 4
<ul>
<li>정말 많이 쓰고 있기 때문에 측정이 필요한 단계</li>
<li>정말 많이 쓰는데 효율적으로 쓰고 있는건가?</li>
<li>사내에서 리소스 탐지하는 프로그램을 만듬</li>
</ul>
</li>
<li>Level 5
<ul>
<li>새로운 고민들</li>
<li>네트워크 모델 / 디바이스 / 시스템</li>
<li>컴퓨팅 시스템 / 아키텍쳐</li>
<li>새로운 데이터 시스템</li>
</ul>
</li>
<li>Cloud-Native?
<ul>
<li>정말 많은 리소스 / 데이터 / 이벤트 / 의존성이 발생</li>
<li>점점 효율화 방향으로 생각하게 됨</li>
<li>리소스 / 의존성
<ul>
<li>멀티 클러스터 / 멀티 서비스 모니터링 Sass 개발</li>
</ul>
</li>
<li>데이터
<ul>
<li>RDB Service</li>
<li>K/V Service</li>
<li>Time Series DB Service</li>
<li>Log Stream DB Service</li>
</ul>
</li>
<li>이벤트
<ul>
<li>CNCF Cloud EVENT Pub/Sub as a Service</li>
<li><a href="https://cloudevents.io">https://cloudevents.io</a></li>
</ul>
</li>
</ul>
</li>
<li>Sass로 구성된 새로운 Cloud Native가 시작이 되는게 아닐까?
<ul>
<li>새로운 클라우드 고민의 시작</li>
</ul>
</li>
</ul>
<h2 id="카카오톡-서버의-스프링-공화국-탈출기"><a href="https://if.kakao.com/session/49">카카오톡 서버의 스프링 공화국 탈출기</a></h2>
<ul>
<li>스프링 공화국이 좋은점
<ul>
<li>많은 경험자</li>
<li>생태계</li>
<li>장기간 지원</li>
<li>따라서 만들기 쉽고 오랫동안 쓰기 좋은 어플리케이션 서버</li>
</ul>
</li>
<li>스프링의 단점은 없을까?
<ul>
<li>표준보다 관습</li>
<li>RFC7235 구현의 다름
<ul>
<li>Spring 예외를 던짐</li>
<li>Ktor 표준을 잘 지킴</li>
</ul>
</li>
<li>전의 되는 의존성
<ul>
<li>여러개 버젼을 동시에 사용.</li>
<li>변경하기 매우 불편한 상황</li>
</ul>
</li>
</ul>
</li>
<li>스프링 공화국의 혜택들?
<ul>
<li>Dependency Injection</li>
<li>Database Integration</li>
<li>Interceptor & Filter</li>
</ul>
</li>
<li>탈출하기 위한 노력들
<ul>
<li>Kotiln?
<ul>
<li>최신 기능 / 코루틴</li>
</ul>
</li>
<li>Spring MVC
<ul>
<li>복잡한 Servlet</li>
</ul>
</li>
<li>Ktor
<ul>
<li>간단한 처리</li>
<li>필요한 기능은 직접 사용해 구성</li>
<li>비동기 프로그래밍 - 코루틴 제공</li>
</ul>
</li>
</ul>
</li>
<li>Dependency Injection
<ul>
<li>Spring
<ul>
<li>다양한 Callback 제공</li>
<li>Annotation 기반</li>
</ul>
</li>
<li>Kotiln
<ul>
<li>Callback은 따로 없음</li>
<li>DSL 형식</li>
</ul>
</li>
</ul>
</li>
<li>Database Integration
<ul>
<li>Spring
<ul>
<li>String으로 구성</li>
<li>컴파일 체킹이 안됨</li>
<li>DSL 사용하려면 QueryDSL 사용해야 함.</li>
</ul>
</li>
<li>Kotlin
<ul>
<li>자체 DSL 지원</li>
</ul>
</li>
</ul>
</li>
<li>Interceptor & Filter
<ul>
<li>Spring
<ul>
<li>Filter - Interceptor 순으로 구성</li>
</ul>
</li>
<li>Kotiln
<ul>
<li>자유롭게 pipeline을 추가할 수 있음</li>
<li>ApplicationCallPipeline으로 구성</li>
</ul>
</li>
</ul>
</li>
<li>탈출 후기
<ul>
<li>스프링은 완성된 기능이 많아 편하지만 특정 프레임 워크에 대한 의존성을 가지고 싶지 않다.</li>
</ul>
</li>
</ul>
<h2 id="다음카페-쿠버네티스-이관기"><a href="https://if.kakao.com/session/58">다음카페 쿠버네티스 이관기</a></h2>
<ul>
<li>Object manifest definition too
<ul>
<li>Helm</li>
<li>Kustomize</li>
</ul>
</li>
<li>CI / CD
<ul>
<li>CI - Jenkins / Github action</li>
<li>CD - Spinnaker / ArgoCD</li>
</ul>
</li>
<li>Stateless vs Stateful
<ul>
<li>기존 Stateful한 어플리케이션을 Stateless로 변경</li>
</ul>
</li>
<li>Log System 변경
<ul>
<li>기존은 Filebeat로 읽어서 로그를 사용</li>
<li>쿠버네티스로 전환하게 되면서 출력형태로 변경 - FluentD로 읽어 로그를 사용</li>
<li>불필요한 로그를 제거</li>
</ul>
</li>
<li>배포방식
<ul>
<li>기존은 Rolling Update</li>
<li>전환 후 Blue/Green, Canary 배포 방식</li>
<li>Warm up 이슈 -> Canary로 문제 해결</li>
<li>502 -> 504 에러
<ul>
<li>EndPoint 업데이트가 느려 기존 Pod에 트래픽이 넘어가게 되고 에러가 발생하게 됨</li>
<li>위 문제를 해결하기 위한 방법
<ul>
<li>GracefulShutdown</li>
<li>PreStop hook</li>
<li>ArgoRollout의 설정값</li>
<li>최근 kubernetes에서 이런 문제를 해결하기 위해 endpointslice 컨셉을 도입
<ul>
<li><a href="https://kubernetes.io/ko/docs/concepts/services-networking/endpoint-slices/">https://kubernetes.io/ko/docs/concepts/services-networking/endpoint-slices/</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>kubernetes 디버깅 도구 Telepresence
<ul>
<li><a href="https://d2.naver.com/helloworld/7861046">https://d2.naver.com/helloworld/7861046</a></li>
</ul>
</li>
</ul>
<h2 id="이-멋진-코드에-컨벤션을--2달간의-컨벤션-구축-여정"><a href="https://if.kakao.com/session/88">이 멋진 코드에 컨벤션을! : 2달간의 컨벤션 구축 여정</a></h2>
<ul>
<li>컨벤션을 맞추기 위한 노력
<ul>
<li>사공을 줄이기
<ul>
<li>많은 사람들을 의견을 맞추는건 좋지만, 정답이 없는 문제를 하나로 모으는 과정은 매우 오래 걸린다.</li>
</ul>
</li>
<li>리서치
<ul>
<li>유명한 컨벤션을 찾아보고 비교 분석</li>
</ul>
</li>
<li>선택하기
<ul>
<li>적절하게 비교하고 선택하기</li>
</ul>
</li>
</ul>
</li>
<li>여정이 끝난 후 얻은 것들
<ul>
<li>PR Template</li>
<li>Commit Message Template
<ul>
<li>Change log</li>
<li>Release Note 작성</li>
</ul>
</li>
<li>EsLint
<ul>
<li>사람대신 해줄 자동화</li>
</ul>
</li>
<li>Provisioning Script
<ul>
<li>brew install script 작성으로 편한게 환경셋팅이 가능
<h2 id="kubernetes-cluster-확장-어디까지-알아보고-오셨어요"><a href="https://if.kakao.com/session/119">Kubernetes Cluster 확장 어디까지 알아보고 오셨어요?</a></h2>
</li>
</ul>
</li>
</ul>
</li>
<li>리젼별로 클러스터를 구성
<ul>
<li>고민 포인트
<ul>
<li>멀티 클러스터로 변경하게 되면서 관리 포인트 증가</li>
<li>모니터링 대상도 증가</li>
</ul>
</li>
</ul>
</li>
<li>해결 과정
<ul>
<li>클러스터 노드 관리
<ul>
<li>노드 관리 시스템 - Labeling과 taint 관리</li>
</ul>
</li>
<li>Service의 Resource 관리</li>
<li>서비스 배포</li>
</ul>
</li>
</ul>
<h2 id="멀티-클러스터-환경을-위한-kubernetes-operator-패턴"><a href="https://if.kakao.com/session/86">멀티 클러스터 환경을 위한 Kubernetes Operator 패턴</a></h2>
<ul>
<li>쿠버네티스 워커 노드에 컨트롤러가 동작하는 일반적인 구조
<ul>
<li>클러스터와 워커는 1대1 관계로 운영되었음</li>
<li>단일 클러스터는 문제가 안되었다.</li>
<li>하지만 멀티 클러스터 환경에서는 문제가 발생하게 됨.</li>
<li>GitOps가 문제해결은 가능하지만 근본적인 해답이 아님</li>
</ul>
</li>
<li>멀티 클러스터 환경을 위한 k8s 컨트롤러 디자인 패턴 적용
<ul>
<li>매니저 클러스터
<ul>
<li>컨트롤러가 존재</li>
</ul>
</li>
<li>서비스 클러스터
<ul>
<li>파드만 존재하게 된다.</li>
</ul>
</li>
</ul>
</li>
<li>Resource, Management
<ul>
<li>자원 중복 제거</li>
<li>관리 편의성 제공</li>
</ul>
</li>
<li>Kubernetes Operator
<ul>
<li><a href="https://kubernetes.io/ko/docs/concepts/extend-kubernetes/operator/">https://kubernetes.io/ko/docs/concepts/extend-kubernetes/operator/</a></li>
<li><a href="https://coffeewhale.com/kubernetes/gitops/helm/2020/05/13/helm-operator/">https://coffeewhale.com/kubernetes/gitops/helm/2020/05/13/helm-operator/</a></li>
<li><a href="https://frozenpond.tistory.com/145?category=1209055">https://frozenpond.tistory.com/145?category=1209055</a></li>
<li><a href="https://ccambo.blogspot.com/2020/12/kubernetes-operator-kubernetes-operator.html">https://ccambo.blogspot.com/2020/12/kubernetes-operator-kubernetes-operator.html</a></li>
<li>Example
<ul>
<li><a href="https://prometheus-operator.dev">https://prometheus-operator.dev</a></li>
<li><a href="https://github.com/argoproj-labs/argocd-operator/">https://github.com/argoproj-labs/argocd-operator/</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="티스토리에서-airflow활용기"><a href="https://if.kakao.com/session/55">티스토리에서 airflow활용기</a></h2>
<h2 id="아랑고야-피드를-부탁해-rdb도-모르는-개발자의-아랑고db-삽질기"><a href="https://if.kakao.com/session/54">아랑고야 피드를 부탁해! (RDB도 모르는 개발자의 아랑고DB 삽질기)</a></h2>
<h2 id="commerce-query-data-rebuild-success-했을까"><a href="https://if.kakao.com/session/106">Commerce Query data Rebuild Success 했을까</a></h2>
<h2 id="webflux로-막힘없는-프로젝트-만들기"><a href="https://if.kakao.com/session/107">Webflux로 막힘없는 프로젝트 만들기</a></h2>권영재awk 명령어2021-10-28T00:00:00+00:002021-10-28T00:00:00+00:00https://nesoy.github.io/articles/2021-10/command-awk<h2 id="awk-명령어">awk 명령어</h2>
<blockquote>
<p>Awk scans each input file for lines that match any of a set of patterns specified literally in prog or in one or more files specified as -f progfile.</p>
</blockquote>
<h4 id="example">Example</h4>
<ul>
<li>읽고 싶은 데이터는 아래와 같다.
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
</code></pre></div> </div>
</li>
</ul>
<h4 id="3번째-항목과-4번째-항목을-출력하고-싶은-경우">3번째 항목과 4번째 항목을 출력하고 싶은 경우?</h4>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># awk '{print $3 "\t" $4}' marks.txt</span>
Physics 80
Maths 90
Biology 87
English 85
History 89
</code></pre></div></div>
<h4 id="rahul가-포함한-라인을-출력하고-싶은-경우">Rahul가 포함한 라인을 출력하고 싶은 경우?</h4>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># awk '/Rahul/' marks.txt</span>
2<span class="o">)</span> Rahul Maths 90
</code></pre></div></div>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://zzsza.github.io/development/2017/12/20/linux-6/">https://zzsza.github.io/development/2017/12/20/linux-6/</a></li>
<li><a href="https://www.tutorialspoint.com/awk/awk_basic_examples.htm">https://www.tutorialspoint.com/awk/awk_basic_examples.htm</a></li>
</ul>권영재Reactive Stream이란?2021-09-17T00:00:00+00:002021-09-17T00:00:00+00:00https://nesoy.github.io/articles/2021-09/Reactive-Stream<h2 id="reactive-stream-이란">Reactive Stream 이란?</h2>
<blockquote>
<p>Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blocking back pressure.</p>
<ul>
<li>논블로킹(Non-blocking) 백 프레셔(back pressure)를 이용한 비동기 데이터 처리의 표준</li>
</ul>
</blockquote>
<h4 id="왜-reactive-stream이-탄생하게-되었을까">왜 Reactive Stream이 탄생하게 되었을까?</h4>
<ul>
<li>기존에는 Thread Pool을 활용해서 일처리를 진행했다.</li>
<li>I/O 작업이 많은 일을 하게 되는 Thread 경우 대부분 기다리는 상황이 벌어진다.</li>
<li>물론 다른 Thread로 제어권이 넘어가 일을 하지만 Thread Pool의 크기는 정해져 있다보니 성능에 한계가 찾아온다.
<ul>
<li>Thread Pool Size보다 더 많은 사용자의 요청이 온다면 Thread Pool Hell인 상황</li>
</ul>
</li>
<li>위 문제를 해결하기 위해 Thread Pool 대신 비동기 & non-blocking 모델을 사용해서 메시지 커뮤니케이션으로 전환하게 된다.
<ul>
<li>이를 Reactive Stream이라고 부른다.</li>
</ul>
</li>
</ul>
<h4 id="reactive-stream은-어떻게-구성되어-있을까">Reactive Stream은 어떻게 구성되어 있을까?</h4>
<ul>
<li>I/O를 기다리지 않기 위해 적용한 <a href="https://johngrib.github.io/wiki/observer-pattern/">Observer pattern</a>으로 시작된다.
<ul>
<li>이를 통해 Thread들을 역할별로 분리할 수 있다.</li>
</ul>
</li>
<li>Observer Pattern의 단점은 없을까?
<ul>
<li>Observer - Subject간의 서로 의존하는 상황</li>
<li>다양한 토픽들을 사용하려면 별도로 생성해야 하는 상황</li>
</ul>
</li>
</ul>
<p><img src="/assets/posts/img/2021-09-17-16-34-41.png" alt="" /></p>
<ul>
<li>서로 의존하지 않기 위해 중간에 Message Broker를 추가하여 Pub-sub Pattern이 등장하게 된다.
<ul>
<li>Pub, Sub 서로 의존하지 않아도 되는 상황</li>
<li>이를 통해 Topic based로 개선되어 다양한 토픽들을 다양한 구독자들에게 전달할 수 있게 된다.</li>
</ul>
</li>
<li><a href="https://github.com/reactive-streams/reactive-streams-jvm">Reactive Stream 명세에 따르면 총 4가지 인터페이스로 구성되어있다.</a>
<ul>
<li>Publisher</li>
<li>Subscriber</li>
<li>Subscription</li>
<li>Processor</li>
</ul>
</li>
</ul>
<h4 id="flow-control-problemback-pressure">Flow Control Problem(back pressure)</h4>
<ul>
<li>Push 방식(빠른 Publisher & 느린 Subscriber)
<ul>
<li>Publisher가 초당 100개의 메시지를 생산해 Subscriber에게 보낸다.</li>
<li>Subscriber은 초당 10개밖에 소비를 하지 못한다.</li>
<li>그럼 나머지 초당 90개는 어디에 쌓아두어야 할까?
<ul>
<li>고정된 버퍼를 가지고 있다면? -> 버퍼 크기를 넘어서면 버리거나 OOM 발생하거나..</li>
</ul>
</li>
</ul>
</li>
<li>이를 해결하기 위해 Dynamic Pull 방식으로 바꾼다.
<ul>
<li>Subscriber은 자신이 소비할 수 있는 크기만큼 Publisher에게 요청한다.</li>
<li>Publisher는 요청받은 메시지 크기만큼 Subscriber에게 전달한다.</li>
<li>Subscriber는 자신이 소화할 수 있는 만큼 메시지를 받기 때문에 처리하는데 문제가 없다.</li>
</ul>
</li>
<li>남은 궁금증?
<ul>
<li>그럼 Publisher가 넘치는 상황은 어떻게 핸들링하는가?</li>
<li>같은 Topic에 다른 Subscriber의 소비속도가 다르면 이를 어떻게 핸들링할까?</li>
</ul>
</li>
</ul>
<h4 id="reactive-stream은-spec-이를-구현한-구현체들">Reactive Stream은 Spec 이를 구현한 구현체들</h4>
<ul>
<li>RxJava, Reactor Core, Akka Streams</li>
<li>ReactiveMongo, Slick</li>
<li>Armeria, Vert.x, Play Framework, Spring WebFlux</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://engineering.linecorp.com/ko/blog/reactive-streams-with-armeria-1/">https://engineering.linecorp.com/ko/blog/reactive-streams-with-armeria-1/</a></li>
<li><a href="https://howtodoinjava.com/spring-webflux/spring-webflux-tutorial/">https://howtodoinjava.com/spring-webflux/spring-webflux-tutorial/</a></li>
<li><a href="https://jistol.github.io/software%20engineering/2018/04/11/observer-pubsub-pattern/">https://jistol.github.io/software%20engineering/2018/04/11/observer-pubsub-pattern/</a></li>
</ul>권영재StackVM, RegisterVM이란?2021-08-20T00:00:00+00:002021-08-20T00:00:00+00:00https://nesoy.github.io/articles/2021-08/StackVM-RegisterVM<h2 id="들어가며">들어가며</h2>
<ul>
<li>CPU는 Operand를 저장하는 위치에 따라 Register-Based VM, Stack-based VM 두
가지로 나뉘게 된다.</li>
<li>Operand의 예는 어셈블리어에서 명렁어를 실행할 때 저장되는 Operand라고 생각하면 된다.
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MOV DS, AX // AX의 값은 DS로 이동된다.
</code></pre></div> </div>
</li>
</ul>
<h4 id="stack-based-vm">Stack Based VM</h4>
<ul>
<li>JAVA VM, .NET CLR
<ul>
<li>대다수의 VM이 스택 기반으로 이루어져 있다.</li>
</ul>
</li>
<li>동작방법은 다음과 같다.
<ul>
<li>Operand와 연산 후 결과를 스택에 저장한다.</li>
<li>예를 들어 덧셈을 하는 경우?
<ul>
<li>스택 구조로 Operand를 저장하기 때문에 PUSH & POP이 필요하다</li>
<li>4단계 명령이 필요하다.
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> POP 20
POP 7
ADD 20, 7 RESULT
PUSH RESULT
</code></pre></div> </div>
</li>
</ul>
</li>
</ul>
</li>
<li>특징
<ul>
<li>다음 피연산자의 메모리 위치를 기억할 필요가 없다.</li>
<li>SP가 다음 피연산자의 위치를 나타낸다.</li>
<li>즉 스택에서 POP만 하면 다음 피연산자가 나오기 때문에 피연산자의 메모리를 기억할 필요가 없다.</li>
</ul>
</li>
</ul>
<p><img src="/assets/posts/img/2021-08-19-23-41-49.png" alt="" /></p>
<h4 id="register-based-vm">Register-Based VM</h4>
<ul>
<li>Lua VM, Dalvik VM
<ul>
<li>피연산자가 CPU의 레지스터에 저장된다.</li>
<li>PUSH & POP 연산자가 없다.</li>
<li>명령어가 피연산자의 위치인 레지스터의 주소를 기억해야 한다.</li>
</ul>
</li>
<li>장점
<ul>
<li>아래와 같이 POP & PUSH 과정이 없기 때문에 같은 덧셈이라도 하나의 명령으로 충분하다.</li>
<li>스택기반에서는 할 수 없는 명령어 최적화를 적용할 수 있다.</li>
</ul>
</li>
<li>단점
<ul>
<li>스택 기반보다 명령어의 길이가 길다.</li>
<li>피연산자의 주소를 명시해줘야 하므로 평균적으로 길 수 밖에 없다.</li>
</ul>
</li>
</ul>
<h4 id="java의-example">Java의 Example</h4>
<p><img src="/assets/posts/img/2021-08-19-23-58-14.png" alt="" /></p>
<ul>
<li>addAndPrint()에 대한 Stack Frame이 있고 1, 88.88이 존재한다.</li>
<li>addTwoTypes라는 메소드를 호출하면서 Stack Frame을 생성하고 local variable에 1, 88.88가 존재하게 된다.</li>
<li>연산이 끝난 후 기존에 있던 스택프레임의 Operand값이 변경된 것을 확인할 수 있다.</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=221292870568">https://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=221292870568</a></li>
<li><a href="https://www.usenix.org/legacy/events/vee05/full_papers/p153-yunhe.pdf">https://www.usenix.org/legacy/events/vee05/full_papers/p153-yunhe.pdf</a></li>
<li><a href="https://markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/">https://markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/</a></li>
<li><a href="http://blog.comprehend.in/2018/02/26/stack-VM-and-register-VM.html">http://blog.comprehend.in/2018/02/26/stack-VM-and-register-VM.html</a></li>
<li><a href="https://stackoverflow.com/questions/2719469/why-is-the-jvm-stack-based-and-the-dalvik-vm-register-based">https://stackoverflow.com/questions/2719469/why-is-the-jvm-stack-based-and-the-dalvik-vm-register-based</a></li>
<li><a href="https://www.slideshare.net/ssusere3af56/how-to-implement-a-simple-dalvik-virtual-machine">https://www.slideshare.net/ssusere3af56/how-to-implement-a-simple-dalvik-virtual-machine</a></li>
</ul>권영재Java Garbage Collection에 대해2021-06-24T00:00:00+00:002021-06-24T00:00:00+00:00https://nesoy.github.io/articles/2021-06/Java-Garbage-Collection<h2 id="garbage-collector">Garbage Collector</h2>
<h4 id="gc-log-rotate">GC Log Rotate</h4>
<ul>
<li><code class="language-plaintext highlighter-rouge">-XX:+UseGCLogFileRotation</code>
<ul>
<li>default : false</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">-XX:NumberOfGCLogFiles</code>
<ul>
<li>default : 0</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">-XX:GCLogFileSize</code>
<ul>
<li>default : 0</li>
</ul>
</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://kwonnam.pe.kr/wiki/java/gc">https://kwonnam.pe.kr/wiki/java/gc</a></li>
<li><a href="https://d2.naver.com/helloworld/1329">https://d2.naver.com/helloworld/1329</a></li>
<li><a href="https://linux.systemv.pe.kr/유용한-jvm-플래그들-part-8-gc-logging/">https://linux.systemv.pe.kr/유용한-jvm-플래그들-part-8-gc-logging/</a></li>
</ul>권영재Variance이란?2021-05-13T00:00:00+00:002021-05-13T00:00:00+00:00https://nesoy.github.io/articles/2021-05/variance<h2 id="들어가며">들어가며</h2>
<ul>
<li>제네릭을 다루게 되면 매번봐도 이해가 잘 안되는 단어들이 매번 등장한다.
<ul>
<li>변성, 공변, 반공변, 그리고 무공변</li>
</ul>
</li>
<li>역시 제대로 이해하기 위해 정리합니다 :)</li>
</ul>
<h2 id="가변성variance이란"><a href="https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)">가변성(Variance)이란?</a></h2>
<blockquote>
<p>Variance refers to how subtyping between more complex types relates to subtyping between their components.</p>
<ul>
<li>Google Translate
<ul>
<li>Variance는 더 복잡한 유형 간의 하위 유형이 해당 구성 요소 간의 하위 유형과 관련되는 방식을 나타냅니다.</li>
</ul>
</li>
<li>역시 이해가 안되니 가장 작은 단어인 subtype에 대해 알아보자.</li>
</ul>
</blockquote>
<h4 id="subtyping이란"><a href="https://en.wikipedia.org/wiki/Subtyping">Subtyping이란?</a></h4>
<blockquote>
<p>a subtype is a datatype that is related to another datatype (the supertype) by some notion of substitutability</p>
<ul>
<li>A라는 <a href="https://en.wikipedia.org/wiki/Data_type">Data type</a>이 B라는 Data type을 대체할 수 있을 경우
<ul>
<li>이때 A는 B의 Subtype이라고 말할 수 있다.</li>
<li>B는 A의 Supertype이라고 말할 수 있다.</li>
<li>역할을 대체가 가능한지가 Subtype의 중요한 포인트인거 같다.</li>
<li><a href="https://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a></li>
<li><a href="https://en.wikipedia.org/wiki/Category_theory">Category Theory</a></li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>간단한 예를 들어보자.</li>
</ul>
<p><img src="/assets/posts/img/2021-05-02-23-54-40.png" alt="No Image" /></p>
<ul>
<li>bird라는 클래스가 존재하고 하위에 duck, cuckoo, ostrich라는 클래스가 존재한다.</li>
<li>duck, cuckoo, ostrich는 <code class="language-plaintext highlighter-rouge">bird라는 고유의 특성</code>을 가지고 있으며 각자의 특성을 가지고 있다.</li>
<li>그렇기 때문에 bird와 duck, cuckoo, ostrich는 <code class="language-plaintext highlighter-rouge">supertype - subtype</code>의 관계를 가지고 있다.
<ul>
<li>이 관계는 <code class="language-plaintext highlighter-rouge">duck, cuckoo, ostrich <: bird</code> 로 표기할 수 있다.</li>
<li>여기까지는 이해가 잘 된다.</li>
</ul>
</li>
<li>이제 코드를 통해 이해해보자.
<ul>
<li>아래의 그림은 Java의 Collection Subtyping 관계도를 표현한 것이다.</li>
</ul>
</li>
</ul>
<p><img src="/assets/posts/img/2021-05-13-00-12-00.png" alt="" /></p>
<ul>
<li><code class="language-plaintext highlighter-rouge">Cat <: Animal</code>의 관계일때
<ul>
<li>그림을 보면 <code class="language-plaintext highlighter-rouge">List<Cat> <: List<Animal></code>이 성립하지 않는 것을 확인할 수 있다.</li>
</ul>
</li>
</ul>
<h4 id="왜-자연스럽지-못하여-이해하기-어려운-것일까">왜 자연스럽지 못하여 이해하기 어려운 것일까?</h4>
<ul>
<li>예를 들어 Animal은 여러가지의 Subtype을 가지고 있다고 가정해보자
<ul>
<li>Dog, Cat, Bird와 같은 Subtype이 있다.</li>
</ul>
</li>
<li>아래의 코드는 아무 문제가 없다.
<ul>
<li>Animal의 Subtype인 Dog, Cat, Bird는 대체 가능하다.</li>
</ul>
</li>
</ul>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">List</span><span class="o"><</span><span class="nc">Animal</span><span class="o">></span> <span class="n">animals</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span>
<span class="n">animals</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">dog</span><span class="o">);</span> <span class="c1">// dog</span>
<span class="n">animals</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">cat</span><span class="o">);</span> <span class="c1">// cat</span>
<span class="n">animals</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">bird</span><span class="o">);</span> <span class="c1">// bird</span>
</code></pre></div></div>
<h4 id="조금-더-확장해서-listcat는-listanimal의-subtype인가">조금 더 확장해서 <code class="language-plaintext highlighter-rouge">List<Cat></code>는 <code class="language-plaintext highlighter-rouge">List<Animal></code>의 Subtype인가?</h4>
<ul>
<li>
<p>즉 <code class="language-plaintext highlighter-rouge">대체가능한가?</code>라는 관점에서 바라보자</p>
</li>
<li>
<p>아래의 코드는 컴파일 에러가 발생한다.</p>
<ul>
<li>왜 컴파일 에러가 발생할까?</li>
</ul>
</li>
</ul>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">List</span><span class="o"><</span><span class="nc">Cat</span><span class="o">></span> <span class="n">cats</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span>
<span class="n">cats</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">smallCat</span><span class="o">);</span>
<span class="n">cats</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">bigCat</span><span class="o">);</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Animal</span><span class="o">></span> <span class="n">animals</span> <span class="o">=</span> <span class="n">cats</span> <span class="c1">// compile error</span>
</code></pre></div></div>
<ul>
<li><code class="language-plaintext highlighter-rouge">List<Cat></code>은 배열을 Heap 메모리에 생성하며 주소를 할당받는다.
<ul>
<li><code class="language-plaintext highlighter-rouge">List<Animal> = List<Cat></code>이 가능하게 된다면?</li>
<li>두 개의 <code class="language-plaintext highlighter-rouge">List</code>는 같은 메모리 주소를 가지게된다.</li>
<li>이때 <code class="language-plaintext highlighter-rouge">List<Animal></code>에 <code class="language-plaintext highlighter-rouge">Dog</code>를 넣게 되면 어떻게 될까?
<ul>
<li>Dog는 Animal의 Subtype이기 때문에 Dog는 <code class="language-plaintext highlighter-rouge">List<Animal></code>에 추가가 된다.</li>
<li>같은 주소를 가지고 있던 <code class="language-plaintext highlighter-rouge">List<Cat></code>는 엉뚱한 <code class="language-plaintext highlighter-rouge">Dog</code>가 들어와 Type이 깨지게 되는 상황이 발생한다.</li>
<li>타입 안정성을 위해 Java에서는 공변을 허용하지 않는다.</li>
<li>반대 상황(<code class="language-plaintext highlighter-rouge">List<Animal> <: List<Cat></code>)도 허용하지 않는다.</li>
<li><a href="https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html#heap_pollution">Reference</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="하지만-이런-상황은">하지만 이런 상황은?</h4>
<ul>
<li><code class="language-plaintext highlighter-rouge">List<Animal></code>이 단순히 읽기만 한다면?
<ul>
<li>즉 변경하지 않는 상황이라면 타입 안정성이 깨질 이유가 없지 않을까?</li>
<li>이렇게 사용하면 더 편하지 않을까?</li>
<li>Java의 Wildcard를 통해 해결할 수 있다.</li>
</ul>
</li>
</ul>
<h4 id="가변성variance-종류에-대해">가변성(Variance) 종류에 대해</h4>
<ul>
<li>공변(Covariant)
<ul>
<li>Subtype은 허용하지만 SuperType은 허용하지 않는 경우</li>
</ul>
</li>
<li>반공변(Contravariant)
<ul>
<li>SuperType은 허용하지만 Subtype은 허용하지 않는 경우</li>
</ul>
</li>
<li>Bivariant
<ul>
<li>SuperType, Subtype 둘 다 허용하는 경우</li>
</ul>
</li>
<li>무공변(Invariant)
<ul>
<li>SuperType, Subtype 둘 다 허용하지 않는 경우</li>
</ul>
</li>
</ul>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://asuraiv.tistory.com/17?category=813980">https://asuraiv.tistory.com/17?category=813980</a></li>
<li><a href="https://cla9.tistory.com/44?category=814455">https://cla9.tistory.com/44?category=814455</a></li>
<li><a href="http://happinessoncode.com/2017/05/22/java-generic-and-variance-2/">http://happinessoncode.com/2017/05/22/java-generic-and-variance-2/</a></li>
<li><a href="https://woowacourse.github.io/javable/post/2020-11-09-generics-basic/">https://woowacourse.github.io/javable/post/2020-11-09-generics-basic/</a></li>
<li><a href="https://medium.com/mj-studio/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A0%9C%EB%84%A4%EB%A6%AD-in-out-3b809869610e">https://medium.com/mj-studio/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A0%9C%EB%84%A4%EB%A6%AD-in-out-3b809869610e</a></li>
<li><a href="https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html">https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html</a></li>
<li><a href="https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html">https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html</a></li>
<li><a href="https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html">https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html</a></li>
<li><a href="https://dzone.com/articles/covariance-and-contravariance">https://dzone.com/articles/covariance-and-contravariance</a></li>
<li><a href="https://www.facebook.com/baekjun.lim/posts/1169171089767945">https://www.facebook.com/baekjun.lim/posts/1169171089767945</a></li>
</ul>권영재Maven Plugins에 대해2021-03-31T00:00:00+00:002021-03-31T00:00:00+00:00https://nesoy.github.io/articles/2021-03/maven-plugins<h2 id="maven-resources-plugin"><a href="https://maven.apache.org/plugins/maven-resources-plugin/">maven-resources-plugin</a></h2>
<ul>
<li>Resource들을 원하는 장소에 복사 하는 플러그인</li>
<li>The Resources Plugin handles the copying of project resources to the output directory.</li>
</ul>
<h2 id="maven-compiler-plugin"><a href="http://maven.apache.org/plugins/maven-compiler-plugin/">maven-compiler-plugin</a></h2>
<ul>
<li>사용할 JDK 버젼 설정하기</li>
</ul>
<h2 id="maven-surefire-plugin">maven-surefire-plugin</h2>
<h2 id="maven-shade-plugin">maven-shade-plugin</h2>
<h2 id="maven-source-plugin"><a href="https://maven.apache.org/plugins/maven-source-plugin/plugin-info.html">maven-source-plugin</a></h2>
<h2 id="build-helper-maven-plugin">build-helper-maven-plugin</h2>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://maven.apache.org/plugins/index.html">https://maven.apache.org/plugins/index.html</a></li>
</ul>권영재Maven의 Settings에 대해2021-03-19T00:00:00+00:002021-03-19T00:00:00+00:00https://nesoy.github.io/articles/2021-03/maven-settings<h2 id="들어가며">들어가며</h2>
<ul>
<li>Maven에서 자주 마주치는 설정 파일인 <code class="language-plaintext highlighter-rouge">settings.xml</code>이 있습니다.</li>
<li>무슨 역할을 가지고 있는지 어떻게 사용하는지 정리합니다.</li>
</ul>
<h3 id="settingsxml은-무슨-설정을-위한-파일일까">settings.xml은 무슨 설정을 위한 파일일까?</h3>
<ul>
<li>Maven 실행에 필요한 설정들을 정의하는 파일입니다.</li>
<li>그럼 왜 <code class="language-plaintext highlighter-rouge">pom.xml</code>에 안 넣고 settings.xml을 따로 만들었을까?
<ul>
<li>특정 프로젝트에 종속되는 정보가 아니다.</li>
</ul>
</li>
</ul>
<h3 id="settingsxml은-어디곳에-있을까">settings.xml은 어디곳에 있을까?</h3>
<ul>
<li><code class="language-plaintext highlighter-rouge">${user.home}/.m2/settings.xml</code>
<ul>
<li>default path</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">${maven.home}/conf/settings.xml</code></li>
<li>명령어를 통해 custom settings.xml을 적용할 수 있습니다.
<ul>
<li><code class="language-plaintext highlighter-rouge">mvn package -s ./setting/settings.xml</code></li>
</ul>
</li>
</ul>
<h3 id="settingsxml은-무슨-정보를-가지고-있을까">settings.xml은 무슨 정보를 가지고 있을까?</h3>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
<span class="nt"><localRepository/></span>
<span class="nt"><interactiveMode/></span>
<span class="nt"><offline/></span>
<span class="nt"><pluginGroups/></span>
<span class="nt"><servers/></span>
<span class="nt"><mirrors/></span>
<span class="nt"><proxies/></span>
<span class="nt"><profiles/></span>
<span class="nt"><activeProfiles/></span>
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="simple-values">Simple Values</h4>
<ul>
<li>localRepository
<ul>
<li>maven 로컬 저장소 위치</li>
</ul>
</li>
<li>interactiveMode
<ul>
<li>사용자의 input에 움직있는 모드로 변경</li>
<li>default true</li>
</ul>
</li>
<li>offline
<ul>
<li>remote 저장소에 연결하지 않고 빌드를 하기 위한 옵션</li>
<li>default false</li>
</ul>
</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
<span class="nt"><localRepository></span>${user.home}/.m2/repository<span class="nt"></localRepository></span>
<span class="nt"><interactiveMode></span>true<span class="nt"></interactiveMode></span>
<span class="nt"><offline></span>false<span class="nt"></offline></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="plugin-groups">Plugin Groups</h4>
<ul>
<li><code class="language-plaintext highlighter-rouge">pom.xml</code>에 groupId가 설정되어 있지 않을 때 선언된 GroupId로 플러그인을 탐색
<ul>
<li>plugin에 groupId를 표시했다면 아무 기능도 하지 않음.</li>
</ul>
</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><pluginGroups></span>
<span class="nt"><pluginGroup></span>org.eclipse.jetty<span class="nt"></pluginGroup></span>
<span class="nt"></pluginGroups></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="servers">Servers</h4>
<ul>
<li>저장소 서버에 관련된 설정
<ul>
<li>저장소(nexus)의 인증하는 방법을 제공합니다.</li>
</ul>
</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><servers></span>
<span class="nt"><server></span>
<span class="nt"><id></span>server001<span class="nt"></id></span>
<span class="nt"><username></span>my_login<span class="nt"></username></span>
<span class="nt"><password></span>my_password<span class="nt"></password></span>
<span class="nt"><privateKey></span>${user.home}/.ssh/id_dsa<span class="nt"></privateKey></span>
<span class="nt"><passphrase></span>some_passphrase<span class="nt"></passphrase></span>
<span class="nt"><filePermissions></span>664<span class="nt"></filePermissions></span>
<span class="nt"><directoryPermissions></span>775<span class="nt"></directoryPermissions></span>
<span class="nt"><configuration></configuration></span>
<span class="nt"></server></span>
<span class="nt"></servers></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="mirros">Mirros</h4>
<ul>
<li>저장소에 대한 다운로드 mirror를 설정하는 속성</li>
<li>왜 Mirror가 필요할까?
<ul>
<li>지리적으로 가깝워 속도가 빠르게 동기화할 수 있기 때문입니다.</li>
<li><a href="https://maven.apache.org/guides/mini/guide-mirror-settings.html">https://maven.apache.org/guides/mini/guide-mirror-settings.html</a></li>
</ul>
</li>
<li>아래의 예는 <code class="language-plaintext highlighter-rouge">https://repo.maven.apache.org/maven2/</code>로 등록된 plugin들을 <code class="language-plaintext highlighter-rouge">planetmirror.com</code>으로 mirror합니다.</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><mirrors></span>
<span class="nt"><mirror></span>
<span class="nt"><id></span>planetmirror.com<span class="nt"></id></span>
<span class="nt"><name></span>PlanetMirror Australia<span class="nt"></name></span>
<span class="nt"><url></span>http://downloads.planetmirror.com/pub/maven2<span class="nt"></url></span>
<span class="nt"><mirrorOf></span>central<span class="nt"></mirrorOf></span>
<span class="nt"></mirror></span>
<span class="nt"></mirrors></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="proxies">Proxies</h4>
<ul>
<li>방화벽이나 SSL 이슈를 해결하기 위해 Proxy 설정을 합니다.</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><proxies></span>
<span class="nt"><proxy></span>
<span class="nt"><id></span>myproxy<span class="nt"></id></span>
<span class="nt"><active></span>true<span class="nt"></active></span>
<span class="nt"><protocol></span>http<span class="nt"></protocol></span>
<span class="nt"><host></span>proxy.somewhere.com<span class="nt"></host></span>
<span class="nt"><port></span>8080<span class="nt"></port></span>
<span class="nt"><username></span>proxyuser<span class="nt"></username></span>
<span class="nt"><password></span>somepassword<span class="nt"></password></span>
<span class="nt"><nonProxyHosts></span>*.google.com|ibiblio.org<span class="nt"></nonProxyHosts></span> // 해당 도메인은 Proxy 적용이 되지 않습니다.
<span class="nt"></proxy></span>
<span class="nt"></proxies></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="profiles">Profiles</h4>
<ul>
<li>JDK 버젼, OS에 맞게 빌드 구성을 다르게 설정할 수 있습니다.</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><profiles></span>
<span class="nt"><profile></span>
<span class="nt"><id></span>test<span class="nt"></id></span>
<span class="nt"><activation></span>
<span class="nt"><activeByDefault></span>false<span class="nt"></activeByDefault></span>
<span class="nt"><jdk></span>1.5<span class="nt"></jdk></span>
<span class="nt"><os></span>
<span class="nt"><name></span>Windows XP<span class="nt"></name></span>
<span class="nt"><family></span>Windows<span class="nt"></family></span>
<span class="nt"><arch></span>x86<span class="nt"></arch></span>
<span class="nt"><version></span>5.1.2600<span class="nt"></version></span>
<span class="nt"></os></span>
<span class="nt"><property></span>
<span class="nt"><name></span>mavenVersion<span class="nt"></name></span>
<span class="nt"><value></span>2.0.3<span class="nt"></value></span>
<span class="nt"></property></span>
<span class="nt"><file></span>
<span class="nt"><exists></span>${basedir}/file2.properties<span class="nt"></exists></span>
<span class="nt"><missing></span>${basedir}/file1.properties<span class="nt"></missing></span>
<span class="nt"></file></span>
<span class="nt"></activation></span>
...
<span class="nt"></profile></span>
<span class="nt"></profiles></span>
...
<span class="nt"></settings></span>
</code></pre></div></div>
<h4 id="active-profiles">Active Profiles</h4>
<ul>
<li>위에 선언한 Profile을 정의하면 해당 Profile로 빌드가 됩니다.</li>
<li>여러 Profile을 선언하면 순서대로 빌드가 됩니다.</li>
</ul>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><settings</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span class="nt">></span>
...
<span class="nt"><activeProfiles></span>
<span class="nt"><activeProfile></span>env-test<span class="nt"></activeProfile></span>
<span class="nt"></activeProfiles></span>
<span class="nt"></settings></span>
</code></pre></div></div>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://maven.apache.org/settings.html#Introduction">https://maven.apache.org/settings.html#Introduction</a></li>
<li><a href="http://jin-study.blogspot.com/2013/05/tool-maven-settingsxml-settingxml.html">http://jin-study.blogspot.com/2013/05/tool-maven-settingsxml-settingxml.html</a></li>
</ul>권영재