얼마전, Oracle에서 JDK8 을 정식 출시했다. 가장 큰 변화라면 람다 표현식(Lamda expression)일텐데...

차근차근 학습해보도록 하자.


http://www.oracle.com/technetwork/java/javase/downloads/index.html



 

 JDK8 Release note 

 

http://www.oracle.com/technetwork/java/javase/8train-relnotes-latest-2153846.html



바로 JDK8을 적용하기보다는 JDK8u10 까지는 차분히 기다리면서 학습을 하며 준비하는 것이 좋아보인다고 한다.

   파란색 구분선!  
 

* 참고: OpenJDK 8 : http://openjdk.java.net/projects/jdk8/


스프링 등 다양한 라이브러리에서 Groovy DSL을 지원하고, 그레들gradle 사용도 늘어나면서 그루비Groovy(http://groovy.codehaus.org/)를 학습해야겠다는 생각에 프로젝트를 생성했다.

  • rocking-the-groovy - github
    gradle init --type groovy-library
    
    로 생성한 프로젝트를 이클립스에 import 하고 실행하려고 해도 정상적으로 인식이 안되는 문제에 봉착했다(지금 생각하면 매우 간단한 문제였는데… 역시 기초는 중요하다).

수동으로 환경설정을 하면 어찌어찌 실행할 수 있게 되기는 했는데 왜 그랬는지 풀 수 있는 방법을 알고 싶었다.

그러다가 문득…

‘eclipse’ 플러그인을 넣었던가?

하는 생각이 스쳐지나간다. .gitignore 내에는 이클립스와 인텔리제이에서 생성하는 생성물들에 대한 목록은 추가시켜놓고, 정작 build.gradle 에다가 이클립스 플러그인을 넣었던가? ㅡ_-)?


아니나 다를까…
추가하고 다시 프로젝트를 임포트 하니 정상적으로 동작한다.
하아. 머리가 나쁘면 몸이 고생한다더니...



이펙티브 자바(EFFECTIVE JAVA)

저자
JOSHUA BLOCH 지음
출판사
대웅 | 2009-04-13 출간
카테고리
컴퓨터/IT
책소개
더 명쾌하고, 더 정확하고, 더 강력하고, 재사용 가능한 코드를...
가격비교 글쓴이 평점  


이펙티브 자바를 읽다가

static 팩토리 메소드의 네 번쨰 장점 중 하나인, 매개변수화 타입parameterized type의 인스턴스를 생성하는 코드를 간결하게 해준다.

는 내용을 보고, 문득 구글 Guava Library의 Maps, Lists 클래스를 떠올렸다. 아무런 생각없이 무심코 사용하던 녀석들이었는데…


자바에서는 인스턴스를 생성할 때 클래스의 생성자를 호출해주어야 한다.

Map<String, Object> map = new HashMap<String, Object>();

위의 map 인스턴스를 생성하는 코드를 guava 에서는 아래와 같은 형태로 선언하여 사용가능하다.

Map<String, Object> map = Maps.newHashMap()

앞선 기존 방식의 인스턴스에 비해 guava의 Maps를 통해 얻을 수 있는 이점은 <String, Object> 매개변수화 타입을 선언하지 않아도 된다는 것이다. 어떻게 보면 미묘한 차이지만, 번거로운 타이핑을 줄일 수 있다는 것만으로도 큰 이득이다. 아마 Maps.newHashMap() static 메소드는 다음과 같은 형태를 띄고 있을 것이다.

public static <K, V> HashMap<K,V> newHashMap() {
    return new HashMap<K, V>();
}


실제코드는 Maps.java - guava-library 에서 살펴볼 수 있는데, 실제코드를 살펴보면

 /**
   * Creates a <i>mutable</i>, empty {@code HashMap} instance.
   *
   * <p><b>Note:</b> if mutability is not required, use {@link
   * ImmutableMap#of()} instead.
   *
   * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
   * #newEnumMap} instead.
   *
   * @return a new, empty {@code HashMap}
   */
  public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
  }

으로 되어 있는 것을 볼 수 있다. 아직까지 JDK7(HashMap - openjdk 7) 까지도 이런 형태의 static 팩토리 메소드를 가지고 있지 않다. 딱히 나올 것 같아보이지도 않긴 하다. static 팩토리 메소드는 개발자의 몫이니까…

편하게 Guava를 가져다 사용하던가, 필요한 부분만 개발자가 구현해서 사용하던가…


참고

  • Google guava

    The Guava project contains several of Google’s core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.

    구글에서 제공하는 라이브러리로, 나는 collections 에 대한 처리용도로만 사용을 했었는데… 생각보다 지원하는 기능이 다양하다…!



2014/02/26 - [Java/Tools] - [Gradle] gradle init --type java-library

이전 포스팅에서 설명했던 그레들을 이용해서 자바프로젝트를 초기화해보자.

gradle init --type java-library

실행결과는 다음과 같다

.
├── README.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── Library.java
    └── test
        └── java
            └── LibraryTest.java

7 directories, 9 files
  • gradle-wrapper.jar: 운영체제에 그레들이 설치되어 있지 않아도 JDK가 설치되어 있다면 래퍼를 통해서 실행이 가능하다.
  • gradlewgradlew.bat: 운영체제에서 실행가능한 스크립트로 리눅스, 유닉스 계열은 gradlew, 윈도우는gradlew.bat를 실행하면 된다. 그레들 래퍼를 사용할 때 필요한 그레들과 자바에 대한 환경설정을 할 수 있으며, 이는 개발팀 공통 적용이 가능해진다. 파일을 열어보면 위에 보이는 gradle-wrapper.jar을 classpath로 지정하여 실행된다는 것을 확인할 수 있다.

    즉, 운영체제에 설치된 그레들이 아니라, 현재 프로젝트 내에 있는 gradle-wrapper를 중심으로 그레들 실행이 된다는 이야기다.

  • build.gradle: 메이븐의 pom.xml과 같은 기능을 하는 빌드스크립트이며, 그루비groovy를 DSL로 채용하여 그루비의 문법을 사용한 동적인 빌드 스크립트를 작성하고, 의존성dependency 설정이 가능하다는 장점을 제공한다.
  • settings.gradle: 프로젝트 설정 및 멀티프로젝트에 대한 설정을 할 수 있다.
    • 참고: Settings

      build.gradle과 settings.gradle이 프로젝트 루트경로(/)에 존재하는 경우에는 그레들을 이용한 프로젝트 초기화가 적용되지 않는다.

이제 build.gradle에 있는 apply plugin: 'java'를 살펴보도록 하자.

apply plugin: 'java': 그레들 자바 플러그인 사용 선언

build.gradle 상단 부분을 보면 다음과 같은 항목을 볼 수 있을 것이다.

// Apply the java plugin to add support for Java
apply plugin: 'java'

주석으로 알 수 있듯이 java를 사용하기 위한 java plugin을 사용한다는 것을 선언한 것이다.

그레들은 플러그인을 추가하면, 그 플러그인에 선언되어 있는 태스크task들도 추가된다. 추가된 태스크를 확인하는 방법은 다음과 같다.

gradle tasks

자바 플러그인을 설치하고 나면 Build tasks가 추가된다.

ihoneymon@gradle-starter (master)$ gradle tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'gradle-starter'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-starter'.
help - Displays a help message
projects - Displays the sub-projects of root project 'gradle-starter'.
properties - Displays the properties of root project 'gradle-starter'.
tasks - Displays the tasks runnable from root project 'gradle-starter'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: clean<TaskName>: Cleans the output files of a task.

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 3.875 secs

메이븐을 접해본 사람이라면, ‘메이븐의 build lifecycle과 유사한 것 같은데?’라고 생각할수도 있다.

간단하게 test 태스크를 실행해보자.

./gradlew test

별다른 변화는 없다. 그냥 보면 심심하니까 테스트를 실패해보자. 소스코드를 다음과 같이 수정하고


테스트를 실행하면 다음과 같이 AssertionError 가 발생했다는 메시지와 함께 테스트가 실패한 곳을 표시한다.


이렇게 간단하게 gradle의 java 플러그인을 살펴봤다. 다음에는 간단하게 태스크를 작성하고 실행해보도록 하겠다. 그레들 플러그인을 설치하여 추가되는 태스크 외에도 사용자가 태스크 스크립트를 작성하여 실행할 수 있으며, 빌드에 지정한 태스크를 실행되도록 할 수도 있다.

참고사항


최근에 나는 프론트쪽을 거의 다루지 않았다. 백엔드쪽에서 프론트에 필요한 API만 만들어서 추가하는 쪽으로 활용했었다. 그래서 툴에 별로 관심을 두지 않아서 Aptna를 이용했었다. 그런데, 운영체제를 자주 밀어버리는 편(우분투를 사용하다보니 이게 일상이다)이라 설치가 가벼운 녀석을 찾았다. 그러다가 우연히 Brackets를 발견했다. 데비안 계열의 운영체제까지 지원한다. 오우.

- 공식사이트: http://brackets.io/

- Github: https://github.com/adobe/brackets

Adobe에서 내놓은 웹플랫폼 개발툴IDE Brackets([])를 소개한다.

모양은 이렇다.

모습도 깔끔하다. node를 기반으로 해서 동작하는 녀석으로 보인다.

현재 36번째 릴리즈버전이 출시되었고, 지속적으로 출시가 될 것으로 보인다. 쓸만한 플러그인들도 많이 제공한다. 


한글화도 잘 되어 있다.

JCO에서 발표했던 REST API에 대한 백엔드를 직접 활용하는 예제를 작성하고 있는 중이다.

실시간 미리보기 기능(현재는 크롬chrome 브라우저에 대해서만 지원)도 지원(Ctrl + Alt + P(review))한다. 코드를 수정 후에 저장하면 바로 브라우저에 갱신신호가 가면서 다시 읽는 것으로 보인다. 아마... 크롬 내부의 API겠지?

태그에서 지정한 class에 대한 CSS 파일도 바로호출이 가능하며,

선택된 class에 적용대상을 미리보기로 호출된 브라우저에 표시도 해준다.

사용자 폴더에 설정파일인 brackets.json 을 수정하여 환경을 설정할 수 있다(지만 귀찮다). 나름 중요한 탭형식과 사이즈 조정은 편집기 오른쪽 하단에 입력하여 설정할 수 있다. 기본은 '스페이스, 크기 4'로 설정되어 있는데, 프론트 쪽에서는 '스페이스 크기 2'를 선호하기에 바꿔봤다. 그러면 brackets.json에 설정내용이 추가된다.


ㅡ_-); 이때 이야기했던 28일되면 VM 인스턴스 내릴거에요.

라고 한 이야기가 거짓말이 되었다. 두둥. AngularJS 공부도 할겸해서 예제를 만들고 있다. 코드만 보여줘서는 의미가 많이 약해질 것이라는 개인적인 욕심이 어울어져 이런 일을 벌이게 되었다. 흠… 지금 예제가 돌고 있는 서버에 CI를 설치해둘까 하는 생각이 들었는데… 문득, OpenShift에서 Jenkins 기어만들고 거기서 빌드하도록 만들면 되겠구나…!! 하는 생각이 든다. ㅎㅎ 돈이 굳었다. ㅡ_-);;

OpenShift에 대해서는 아래내용을 참고하세요.

2014/02/28 - [Java/Tools] - 무료로 쓸만한 통합된 개발환경 시스템 OpenShift(By redhat)를 소개합니다.

프로젝트는… ihoneymon@github.com/rocking-the-rest-api-view를 참고하기 바란다. Yeoman을 활용해서 웹애플리케이션을 초기생성했다.

Yeoman으로 AngularJS 프로젝트 구성하기(http://www.hans.or.kr/2014/02/yeoman-angularjs.html)

위의 내용을 이용해서 초기화를 하고 작업 진행중이다.


깃헙github에서 내놓을 Atom editor(https://atom.io/)이 정식 출시되기 전까지는 쓸만한 녀석으로 보인다.

Atom editor 소개(http://blog.outsider.ne.kr/1035)

Atom editor가 정식 출시가 되면(리눅스도 지원한다면) 바로 옮겨가지 않을까? ㅡ_-)?

+ Recent posts