빌드 툴 : 정형화 된 작업을 자동화 하기 위한 소프트웨어 


빌드

1. 소스 코드( .java)를 컴팰해서 클래스 파일(.class)를 생성한다.

2. 코딩 규약에 맞게 작성했는지 확인한다.

3. 코드를 정적으로 해석한다.

4. 테스트를 하고 테스트 결과나 커버리지 측정 결과를 리포트로 출력한다. 

5. javsdoc과 같은 문서를 작성한다.

6. 클래스 파일과 리소스 파일을 패키지이해서 압축 파일을 만든다.(.jar 과 .war 파일)

7. 압출파일을 테스트 환경이나 스테이징 환경에 배포한다.

8. 압축 파일을 저장소에 등록한다. 


그래들 특징

  빌드스크립트 생산성이 높다 : 규칙 기반 빌드 접근법을 사용한다. 규칙예외사항은 스크립트를 추가할 수 있어 유연하게 대응할 수 있다.  

  빌드 순서를 제어하기 쉽다 : 그레들의 빌드 순서는 테스크 의존관계에 따라 정해진다. (메이븐과 앤드의 중간단계) 

  멀티 프로젝트에 대응한다. 

  컴포넌트로 만들기 쉽다. : 빌드 스크립트에서 메서드나 클래스 추출 / 빌드 스크립트의 분할과 재사용 

                                        / 프로젝트에서만 사용할 수 있는 확장 모듈 / 여러 프로젝트에서            

                                         범용적으로 사용할 수 있는 라이브러리

 별도로 설치할 필요가 없다. : 그래들 래퍼 태스크를 실행해서 부트스트랩을 생성하기만 하면 된다. 


그래들의 설치 

JDK 6이상 필요하다 

Gvm 설치


gvm 

$ gvm install gradle

$ gvm install gradle <version>

$ gvm list gradle 


1. 자바 프로젝트

build.gradlew 

=============================================================

진행 프로젝트 빌드 스크립트 전문


apply plugin: 'java'

apply plugin: 'eclipse'

apply plugin: 'application'


mainClassName = 'VerticleManager'

def defaultEncoding = 'UTF-8'

compileJava.options.encodind = defaultEncoding; // 소스 세트 main을 컴파일 할때 적용하는 인코딩 지정 

sourceCompatibility = 1.8  // java jdk 버전 설정 컴파일할때 생성하는 클래스 파일의 jdk버전설정은 targetCompatibility 이다. 

def vertxVersion = '3.5.3'


//의존 관계 해결위치로 매이븐 저장소 사용

repositories {

mavenCentral();

}


dependencies {

compile "io.vertx:vertx-core:${vertxVersion}"

compile "org.slf4j:slf4j-api:1.7.25"

compile "io.vertx:vertx-hazelcast:${vertxVersion}"

}


sourceSets {


main {

java {

srcDirs = ['src/main/java']

}

resources {

srcDirs = ['src/main/resources']

}

}

}


//기타 설정들 예시

//jar {

baseName : 'example'

appendix = 'bin'

}


//compileJava{

options.fork = true

}

=============================================================


그레들의 핵심 기능 

 - 전형적인 반복 작업을 자동화하기 위한 구조 

 - 자동화된 처리를 실행하기 위한 부품

자동화 대상이 되는 구체적인 작업들은 모드 플로그인으로 구현되어 있으며 핵심기능과 분리되어 있다.


 apply plugin: 'java' 

>>그레들에게 자바 프로젝트를 빌드할 때 반드시 팔요한 java 플러그인 사용한다는 선언문

자바 플러그인이란 자바 빌드에 필요한 테스크 설정을 단순화하는 규칙, 그것을 구현하기 위한 속성 및 소스 세트가 패키지로 구성된 빌드 기능 컴포넌트이다. 


 -Source set

빌드 스크립트에 자유롭게 추가할수있으며 컴파일 대상인 자바 코드와 리소스를 세트로 지정 할 수 있다. 

컴파일 출력 경로를 지정할 수 있다. 

 자바 플러그인에는 이미 main과  test 두가지 소스 세트가 정의되어 있다. 따라서 프로덕션 코드의 단위 테스트 코드 이렇게 두 가지 소스 세트만으로 대응 가능한 자바 프로젝트라면 다른 소스 세트를 추가하지 않아도 된다. 


 - task

자바 플러그인이 제공하는 테스크는

 1 .complie.Java : 프로덕션 코드를 컴파일 한다. 대상 소스세트 main의 java. srcDirs 속성에서 지정한 디렉터리에 있는 코드 중 확장자가 .java 인 파일이다. 


 2. processResources : 프로덕션 코드의 리소스르르 클래스 패스에 복사한다. compileJava 디렉터리중 .java를 제외한 모든 파일 

 3. classes : 1.2번 실행

 4.. compileTest.java

 5. processTestResources 

 6 etc : testClasses / jar/ javadoc / test/ clean/ clean<tastname>.assemble/ build/ uploadArchives /check / buildNeeded / buildDependents

 

=============================================================

현재 진행중인 프로젝트 task 출력


:compileJava UP-TO-DATE

:processResources UP-TO-DATE

:classes UP-TO-DATE

:jar

:startScripts UP-TO-DATE

:distTar

:distZip

:assemble

:compileTestJava NO-SOURCE

:processTestResources NO-SOURCE

:testClasses UP-TO-DATE

:test NO-SOURCE

:check UP-TO-DATE

:build

=============================================================



 -규칙

프로덕션 코드 파일은 src/main/java 디렉터리 아래 둔다.

프로덕션 리소스 파일은 src/main/resources에 아래 둔다. 


 -속성

 태스크를 제어하거나 규칙을 구현하기 위해 속성을 제공한다. 


https://docs.gradle.org/current/userguide/java_plugin.html


$ gradlew build: task 실행

$ gradlew run: 프로젝트가 실행 

$ gradlew clean: 빌드 결과물을 삭제함 



'STUDY > PROGRAMMING' 카테고리의 다른 글

웹 개발 공략서  (0) 2018.09.02
failover cluster / LoadBanlancing  (0) 2018.08.30
1. Blocing / NonBlocking & Synchronous / Asynchronous  (1) 2018.08.27

[그렇게 살고 싶다고 했어]


넌 그렇게 살고 싶다고 했어


 어깨가 맞지 않는 낡은 옷을 입은 것이 비참하다 생각하지 않고

담배를 필터 부분까지 야무지게 피워도 부끄러워 하지 않고 

앞으로 어떻게 될지 모르지만 열 살 연하의 여자친구를 사랑하며

주머니 속 구겨진 지폐 몇 장에 초라해지지 않고


 너를 게으름 뱅이라고 몰아세우는 아버지를 그래도 이해하며

지금도 행복하지만 내일은 더욱 더 행복해질거라는 믿을을 가지고,

정오의 햇살에 반짝이는 비눗방울처럼 바람 안에서 춤추듯 휘날리며 

넌 그렇게 살고 싶다고 했어


난 이렇게 살고 싶다고 했어

목적도 없이 가던 길을 잃어 조금 더 돌아가더라도 조급해 하지 않고 

아무리 달려도 늘 제자리일지라도, 이미 자리 잡은 친구들과 비교해 내가 초라해도 주눅들지 않고


이뤄지지 않을지도 모르는 꿈을 악착같이 잡고 늘어지며 내가 하는 일이 정확하게 무엇을 위한 것인지 모르지만

그래도 나 자신을 의심하지 않고 난 그렇게 살고 싶다고 했어


 비록 지금 우리는 이렇게 초라하고 

앞으로 계속 이런 식으로 대책없이 살아갈지도 모르지만 모두 우리가 선택한 것이니까

후회하지 않고 지치지 않고 

의심하지 않으며 우리는 그렇게 살고 싶다. 

 


'READ' 카테고리의 다른 글

1. 삶의 격  (0) 2018.08.27
Verticle code 는 각 verticle instance 당 할당된 class loader에 의해서 로딩되고 객체화가 된다. 
Vert.x 는 cpu 코어수에 따라서 자동으로 ELP Thread를 생성해준다.
 
동시에 여러개의 ELP Thead를 생성 할 수 있기 때문에 같은 verticle이라도 여러개의 thread에서 수행 할 수 있다. 같은 verticle code라도 verticle instance는 각기 다른 인스턴스이다. 
 인스턴스를 3개 생성하게 되면 각기 다른 class loader에 의해서 verticle인스턴스가 생성된다. 그래서 jvm입장에서는 전혀 다른 오브젝트가 되며 각각 다 독립된 ELP에서 다른게 수행된다. 그래서 인스턴트간 공유하는 것이 없고 결과적으로 thread safe하게 된다. 


1.독립성으로서의 존엄성
2.만남으로서의 존엄성
3.사적 은밀함을 존중하는 존엄성
4.진정성으로서의 존엄성
5.자아 존중으로서의 존엄성
6.도덕성 진실성으로서의 존엄성
7.사물의 경중을 인식하는 존엄성
8.유연함을 받아들이는 존엄성

-삶의 형태로서의 존엄성

인간삶에 관한 전체적이고 종합적인 확인
인간으로서 살아야 하는 삶이라는 것이 진정 무엇인가?
삶에서 우린 무엇을 기대할 수 있는가?
그리고 그 기대를 우리는 어떻게 이해해야 하는가?

존엄성이 있는 방식은 매끈하지도 완벽하지도 않다. 금이 갈수도 있고 이가 빠질수도 있고 울퉁불퉁하거나 다른 것이 섞여 들어 갈수도 있다. 인간의 존엄성을 이해한다는 것은 이 불완전함을 덮거나 외면하는 것이 아니다. 그 불안전함을 이해하고 논리성을 설명하려는 시도이다. 동일한 경험이라고 하더라도 반드시 하나만으로 해석할수 없다, 

1.독립성으로서의 존엄성
주체되기
우리는 각자가 경험의 중심체이다. 우리는 경험을 함으로써 특정한 방식으로 우리 자신이 인간임을 실감한다. 세상을 바라보는 생각과 믿음, 무엇이 옳고 무엇이 그르다고 판단하는지, 어떤것을 정당하거나 부당하다고 생각하는지의 기준 또는 합리적이냐 비합리적이냐를 가르는 경계가 한사람의 세계관이다.
 내가 어떤 행위를 하는 것은 내가 어떤 것을 느끼고 소망하며 과거의 무엇을 기억하고 상상하고 또 숙고하며 믿기 때문이다. 그럴때 나는 내 행위의 장본인이 되며 내 경험에서 비롯된 행동의 행위자가 된다. 또한 나를 이끄는 동기는 내 행위에 의미를 부여한다. 

 우리가 하나의 주체로서 갖는 자화상은 현재 우리의 모습에 국한되지않고 우리가 되고 싶은 모습, 그리고 되어야만 하는 모습도 해당된다. 주체가 가진 능력에는 스스로를 평가대상으로 삼고 행동과 경험이 만족할 만한 것인지, 즉 기꺼이 받아들일 만한 것인지 내쳐야 할 것인지 자문하는 일련의 과정도 포함된다. 
 현재 존재하는 모습과 되고 싶은 모습 사이에서 갈등을 체험하는 것, 되고 싶은 대로 되지 못할 수도 있다는 것을 체험하는 것도 주체가 가진 본질이다. 그러므로 인간은 내적 검열을 할 수있는 존재여야 한다. 자신의 행위와 사고,희망,공상을 금지할 수있는 능력이 그것이다. 이 능력의 원천은 스스로에게 책임을 물을수 있는 능력이다. 주체적 인간은 내적갈등을 안고 살아갈 수 있어야 하며 스스로의 행위와 경험을 존중할 것인지, 무시할 것인지 자문할 줄 알아야 한다.
 주체적 인간의 특징은 무엇가에 끌려가는 것처럼 그저 앞만 보고 터덜터덜 나아가는 것이 아니라 이러한 방식으로 자신에 대해 의구심을 품어보는 것이다. 그러나 자문하는 것으로 끝이 아니다. 주체적 인간은 의심의 여지를 가지고 자신을 돌아볼 뿐 아니라 계획을 갖고 자신과의 행동에 대해 영향을 미쳐 원하는 방향으로 변화시킬 수 있어야 한다.
 우리는 마구잡이로 일어나는 온갖 경험의 희생양이 아니라 자신을 성찰 할수 있도록 한 걸을 떨어져서 새로운 사고와 희망과 감정을 시작할 수있는 가능성을 숙고하고 그 방향으로 발을 내 디딜수있는 존재이기 때문이다.
 -존체 자체로 목적되기

3.사적 은밀함을 존중하는 존엄성
결함은 객관적이고 사실적인 것들의 범주에 속하지 않는다. 결합은 가치가 결합된 것으로 부정적이고 거부적인 판정에 의해 만들어 진다. 
 그리고 이 결함은 또 다른 경험을 불러일으킨다. 
자신의 존엄성을 되찾은 사람은 외부의 판단을 반드시 자신의 판단과 동일시해야만 할 불가피한 이유가 없다는 것을 어째서 나 자신을 타인을 통해서 봐야하는지 아무런 근거가 없음을 아는 사람이다. 

누구에게나 절대 포기 할수 없는 정신적 경계선이 있다. 나의 경험과 나의 체험은 아무도 가져갈수없다. 경험이라는 말 자체가 반드시 특정한 누군가를 주체로 하기 때문에 어떤 경험은 그의 정체성에 속한다. 이런 의미에서 경험은 나눌 수 없는 것이다. 같은 직업, 같은 물건을 공유한다고 해서 두 사람이 똑같은 경험을 나눌수 없다. 이러한 개인성은 다른것으로 대치 될 수 없고 이것이 지닌 개인의 불변성 또한 엄정하게 따지지 않아도 자명하다. 어떤 경험의 내적 영역을 지키려는 우리의 욕구는 그 경험을 소유하고 있느나 아니냐에 달린것이 아니고 그 경험을 알고 있으냐, 그러지 않느냐 하는것에 달려있다. 내가 지켜내야 할것은 남이 내 경험을 얼마나 아느냐 하는 양과 정도다. 

우리는 타인이 무엇을 경험하는지에 대해 전적으로 알고 싶은 사람들이다. 그런데 우리가 알고싶은 것은 아무나의 경험이 아니다. 그리고 알고 싶은지 여부도 우리 스스로 판단한다. 또 혼자만 간직하고 싶은 것도 분명히 있다. 

4장 진정성으로서의 존엄성


'READ' 카테고리의 다른 글

3. 무엇이 되지 않더라도 , 괜찮아  (0) 2018.08.27
생각없이, 목표없이 늙어가는건 무서운 일이다. 
  이정표 없이 길을 걷다가 문득 정신을 차렸을때,
그때의 나 자신의 독백은 소스라치게 놀랍다. 
 흔들리는 목표라도 계속 세우고, 이루지 못하면 수정하면서 이어나가면 된다.
잊지말아라. 내가 걷고 있는 길에 도착지를.  


'THINK' 카테고리의 다른 글

이해  (1) 2018.09.04
2018-09-01  (0) 2018.09.01
온도의 차이  (0) 2018.08.30
2018-08-30  (0) 2018.08.30
2018-08-29   (0) 2018.08.29
hotspot vm은 어떻게 구성되어 있는가 자바 1.3 버전부터 기본 vm으로 사용되어 왔다 
 자바를 만든 sun에서 자바의 성능을 개선하기 위해 just in time( JIT )컴파일러를 만들었고 hots spot이라고 지었다.
자바에서 컴파일을 하면 바이트코드로 변환된다( java complier)

 이 바이트코드는 기계가 바로 읽을 수 있는 형태가 아니며 실제 실행될때 다시 한번 기계가 읽을 수 있는 형태(native code)로 interpreter를 통해 해석된다.
 이때 반복되는 내용을 컴퍼일을 해서 사용한다. 이 과정을 JIT 컴파일링 이라고 한다.  JIT 컴파일이 실행될때 최초 시행되기 최초 실행에서 조금 느릴수 있다.하지만 컴파일 없이 interpret 만 하는 경우보다 반복적인 작업을 할때 훨씬 높은 성능을 낼수있다.

 Jit컴파일링은 어떻게 진행될꺄?
각 메서드들에 있는 카운터를 통해서 통제되며 수행카운터( Invocaiont count), 백에지 카운터( backage counter )를 사용한다. 
이 카운터들이 인터프리터에 의해 증가될때마다 그 값들이 한계치에 도달했는지 확인하고 도달했을 경우 인터프리터는 컴파일을 요청한다. 

컴파일이 요청되면 컴파일 대상 목록에 큐가 쌓이고 하나 이상의 컴파일러 스레드가 이 큐를 모니터링한다. 그동안 수행카운터를 리셋한다. 
 Hotspot은 osr이라는 특별한 컴파일도 수행한다. 인터프리터에서 수행한 코드중에 오랫동안 루프가 지속되는 경우에 사용된다. 


동기와 비동기 
동기 : 호출이 종료된 이후에 처리 결과를 응답 받을 수있다. 서비스 처리가 완료 된 후에 처리 결과를 알 수 있는 방식을 동기식 호출이라고 한다. 
비동기 : 실제로 처리가 완료되지 않았음에도 종료가 이루어 지며 그 응답을 호출자에게 전달한다. 
비동기 호출을 지원하는 패턴은 다양하다. 퓨쳐 패턴, 이벤트 리스너는 옵저버 패턴,  node.js는 콜백함수 , 네티는 리액터 패턴을 사용한다. 

블로킹과 논 블로킹
소켓 동작 방식은 블로킹 모드와 논블로킹 모드로 나눈다. 
블로킹은 요청한 작업이 성공하거나 에러가 밠행하기 전까지 응답을 돌려주지 않는 것을 의미하여 논 블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려준다. 이때 요청의 응답값에 의해서 에러나 성공 여부를 판단한다. 
 블로킹 소켓은 serverSocket, socket 클래스, 논블로킹 소켓은 serverSocketChannel, SocketChannel 클래스를 사용한다. 

블로킹 소켓은 데이터입출력에서 스레드의 블로킹이 발생하기 때문에 동시에 여러 클라이언트에 대한 처리가 불가능하다. 이 단점을 보완하기 위해 해결한 모델이 연결된 클라이언트 별로 스레드를 할당한다. 
 접속 클라이언트별 스레드르 생성한다면 OOM뿐 아니라 대기시간이 길어질 수 있다. 이를 방자하기 위해 서버에 생성되는 스레드 수를 제한하는 방법인 스레드 풀링을 사용하기도 한다. 
 처음부터 너무 많은 풀링을 사용하게 되면 시간이 흐름에 따라 가비지 콜렉션이 작동하고 자바 프로세스는 가비지를 작동시키는 동안 다른 스레드를 멈추는데 이때  어플리 케이션이 먹통이 된것처럼 보일 수 있다.
 특히 힙의 크기가 클수록 가비지 컬렉션에 드는 시간이 길어진다.
 힙 크기와 생성 가능한 스레드 수는 비례하고 힙에 할당된 메모리가 클수록 가비지 컬렉션이 수행되는 횟수는 줄어들지만 수행시간은 상대적으로 길어진다. 
  
 두번째는 컨텍스트 스위칭에 대한 고찰이다. 한 프로세스에 수행되는 스레들이 cpu점유를 위해서 자신의 상태를 변경하는 작업이다. 이때 수많은 스레드가 cpu자원을 획득하기 위하여 경쟁하면서 cpu 자원을 소모하기 때문에 실제로 작업에 사용할 cpu가 줄어들게 된다. 

>> Blocing / NonBlocking
호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘기는가? 
제어권은 메인프로세스에서 어디로 가고 있는가? 
=제어권의 문제 

>>Synchronous / Asynchronous
호출되는 함수에게 callback을 전달해서 사용하고 있는가?
=작업 완료 여부 


'STUDY > PROGRAMMING' 카테고리의 다른 글

웹 개발 공략서  (0) 2018.09.02
failover cluster / LoadBanlancing  (0) 2018.08.30
2. GRADLE ( 도서: gradle 철저입문 )  (0) 2018.08.27

+ Recent posts