Category: Programming

Java 8 람다 표현식

이 글은 다음의 Youtube 강의 내용을 요약 정리한 것입니다.

  • Java 8 Lambda Basics – Java Brains

왜 람다(Lambda) 인가?

  • 함수형 프로그램이 가능하다.
  • 읽기 쉽고 간결한 코드
  • API 나 라이브러리 사용이 좀 더 쉽다.
  • 패러럴 프로그래밍이 가능하다.

람다는 함수 자체를 값으롤 할당할 수 있는 Inline 함수처럼 표현된다.

 

람다 표현식(Lambda Expressions)

자바에서 메소드로 불리우는 함수 표현식은 대략 다음과 같은 형식을 갖는다.

Inline Values

위 예제는 Inline Values 가 무엇인지 보여준다. 별다른 객체, 메소드의 도움이 바로 할당하는 형식이 바로 Inline Values 라고 보면 된다.

그렇다면 코드 블럭(Code Block) 자체를 인라인으로 할당 할 수 있지 않을까? 다음과 같이 말이다.

실제로 JavaScript 에서는 Inline 함수라고 해서 존재한다. 다음과 같은 형식을 갖는다.

Java 8 에서의 람다 표현식은 JavaScript 에서의 인라인 표기와 유사하다.

HelloWorld 람다

HelloWorld 를 통해서 람다 표현식을 익혀보자.

전형적인 HelloWorld 코드다. 이것을 람다 표현식으로 어떻게 바꿀까? 먼저 메소드 자체를 Inline Value 할당하듯이 가상의 변수에 할당해보자. 다음과 같이.

public 은 접근제한자라고 해서 protected, private 등이 있다. 변수에 할당하는 행위에서 있어서 이러한 접근제한자는 의미가 없다. OOP 에서는 객체의 변수를 직접 받는것이 아니라 메소드를 통해서 할당 받는데, 람다 표현식에서는 Inline Value 로 직접 할당하는 방식이기 때문에 무의미하다. 지우자!

코드를 다시보면 perform  이라는 함수 이름이 존재한다. 하지만 코드 블럭자체를 왼쪽 변수에 할당하고 그러한 코드 블럭은 왼쪽 aBlockOfCode 를 호출함으로써 동작하게 될터이다. 따라서 perform 이라는 함수 자체를 지칭하는 이름은 불 필요하다. 이는 앞서본 JavaScript 의 인라인함수 표현식에서처럼 할당되는 함수의 이름이 없는것과 같다. 지우자!

void 는 리턴타입을 말한다. 아무런 리턴도 없다는 의미이기도 하다. Java 8 컴파일러는 똑똑하다. 람다 표현식에서 리턴타입을 명시하지 않더라도 컴파일러가 알아서 해준다. 지우자!

다 됐다. Java 8 에서 람다 표현식에서는 ->  를 이용한다. 다음이 Java 8의 람다 표현식의 완성이다.

이게 정상적인 코드라구? 그렇다. Java 8 에 도입된 람다표현식이다. 정확하게 잘 동작한다. 위를 좀 더 간결하게 바꿔 쓸수도 있다.

 

람다(Lambda) 예제.

다음을 람다 표현식으로 바꿔보자.

Inline 변수 할당이기 때문에 객체 접근제한자는 필요가 없다. public 삭제..

Inline 변수 할당이기 때문에 double 이라는 함수자체이 이름도 필요가 없다. double 삭제.. 그러면 다음과 같은 형태만 남는다.

자바 컴파일러는 매우 똑똑하다. 리턴타입을 추론해 맞춰준다. 먼저 인자 타입이 int 형이라 결과도 나름대로 int 형일것으로 추정하기도 하고 리턴 되는 계산을 하면서 리턴타입을 추론하기도한다. 별도로 리턴타입을 정의해줄 필요가 없다. int 리턴타입 삭제…

그렇게 하고 나면 다음과 같이 람다 표현식을 쓸수 있게 된다.

람다 표현식이다. 하지만 이를 좀 더 줄이면 다음과 같이 쓸 수 있다.

한줄로 다 작성할 수가 있다면 {} 블럭을 사용할 필요가 없고 {} 없는 경우에 return 을 쓰지 않아도 된다.

모든 람다가 {} 이 필요 없는 것은 아니다. 다음과 같이 블럭내에 로직이 들어갈 경우에 {} 블럭과 return 이 필요하다.

문자열 길이를 알아내고자 한다면 어떻게 람다 표현식을 쓸 수 있나? 다음과 같다.

물론, 앞에서 처럼 뭔가 로직을 넣어야 한다면 {} 감싸고 return 을 해주면 된다.

Mac 에서 JAVA_HOME 찾기

참조: http://stackoverflow.com/questions/6588390/where-is-java-home-on-osx-sierra-10-12-el-captain-10-11-yosemite-10-10

Mac 에는 여러버전의 Java 가 설치되어 있습니다. 그런데, 가끔씩 JAVA_HOME 이 어디인지를 알고 싶을때가 있습니다. 그럴때 다음과 같이 하면 알수 있습니다.

 

 

Java 설치

이 글은 Java 를 리눅스에 설치하는 법을 다룹니다.  Java 는 JDK, JRE가 존재하는데 WAS 서버 운영을 위해서는 JDK를 설치하는게 여러모로 좋습니다.

다운로드

다운로드는 Oracle 홈페이지의 Java 페이지에서 받을 수 있습니다. 보시면 다양한 패키지를 제공하는데, 저는 64bit 리눅스 tar.gz 파일을 다운로드 받았습니다.

설치

tar.gz 파일을 다운로드 받았다면 설치는 압축을 해제하는 것으로 사실상 끝이 납니다.

설정하기

자바 설치가 끝났다면 이를 시스템이 인식할 수 있도록 설정해줍니다. 설정은 자바 홈 디렉토리, 패스, 클래스패스등을 입니다.

이를 매번 입력하기 보다는 /etc/profile 맨 아래에 적어주면 부팅할때마다 자동적으로 시스템 전체에 적용 됩니다.

 

pom.xml Plugin execution not covered by lifecycle configuration 오류

앞에서 mave timestamp 의 TimeZone 변경을 위해서 build-helper-maven-plugin 를 사용했는데 Eclipse 에서 다음과 같이 오류가 난다.

build-helper-maven-plugin Eclipse 오류
build-helper-maven-plugin Eclipse 오류

위 오류내용은 다음과 같다.

Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:build-helper-maven-plugin: 1.11:timestamp-property (execution: timestamp-property, phase: validate)

Eclipse 는 오류를 표시했지만 maven 은 정상적으로 동작한다. 이는 Ecliplse 의 m2e 커넥터의 lifecycle mapping 정보를 명확하게 해야하는데 이것이 없어서 오류로 표시하는 것이다. 다음 URL 에 관련 내용이 있다.

내용을 보면 <pluginManagement> 를 이용해서 lifecycle-mapping 을 설정해주어야 한다. 위 내용을 기반으로  build-helper-maven-plugin 의 execution 에 대해서 mapping 을 지정해주면 해결된다.

위와 같이 설정을하면 Eclipse 의 오류가 사라진다.

 

Maven timestamp 에 timezone 변경하기

maven 은 build timestamp 를 변수로 지원한다. 하지만 자세히 보면 이 timestamp 는 UTC timezone 에 맞춰져 있다. maven 에서 timestamp 는 기본적으로 UTC timezone 을 기반으로 한다. 그런데 이것을 다른 timezone 으로 변경할려면 어떻게 해야할까?

build-helper-maven-plugin

maven 에선 많은 plugin 을 지원한다. build-helper-maven-plugin 은 우리가 필요하는 기능인 timestamp 에 timezone 변경을 지원한다. 변경된 timezone 의 시간을 표시할 변수와 timestamp format, timezone 등을 지정하면 여기서 지정한 변수를 사용할 수 있게 된다.

위와같이 current.time 변수에 한국시간의 timezone 으로 지정한 timestamp 값을 할당해주고 maven-war-plugin 에서 warName 태그에서 current.time 변수를 사용해주면 된다.

war 파일이름에 TimeStamp 찍기

Maven 을 이용하면 자동으로 컴파일을 해주고 war 파일로 만들어 준다. 그런데, 이때에 war 파일에 TimeStamp 를 찍을 수 있다. war  파일명이 project.name-timestamp.war 형식으로 파일을 작성하도록 할수 있다. 방법도 대략 두가지 방법이 있다.

maven 자체 기능

maven 3.0 이상이라면 자체 기능을 이용할 수 있다. properties 에 timestamp 와 maven.build.timestamp.format 을 지정하고 build 영역에서 파일명을 지정해주면 된다. 예를들면 다음과 같다.

위와같이 설정하고 maven build 를 하면 다음과 같이 출력되는 것을 볼수가 있다.

maven-war-plugin 으로 war 파일명 지정

이것은 사실 위 방법을 쓴다면 사용할 일이 별로 없다. 하지만 war 파일을 생성할때에 많은 옵션을 주고 싶다면 이 플러그인을 사용하는게 좋다. 이를 사용하면 build 영역에서 finalName 을 지정하지 않고 이 플러그인에서 지정해주면 된다.

결과는 처음과 같다.

Spring MVC hello world Example in STS

spring pivotal이 글은 STS(혹은 Eclipse) 를 사용해서 Hello World 를 만드는 법에 대한 것이다.  Eclipse, STS 를 설치했다면 자체적으로 간단한 샘플 프로젝트를 제공 한다. 아무런 설정도 필요없고 간단하게 패키지명만 입력해주면 샘플 프로젝트가 제공되고 브라우저를 통해서 확인할 수 있다.

Eclipse 에는 Spring IDE 플러그인이 설치된 것으로 가정한다.

Spring Legacy Project

STS나 Eclipse 를 설치했다면 Spring Legacy Project 를 제공한다. File 메뉴 -> New -> Other.. 를 클릭하면 나오는 팝업창에서 ‘Spring’ 폴더를 클릭하면 다음과 같은 화면에 ‘Spring Legacy Project’ 가 보입니다.

Spring Legacy Project 생성 팝업
Spring Legacy Project 생성 팝업

이제 ‘Next’ 를 누르면 다음과 같은 화면이 나온다.

Spring 템플릿. 그런데 MVC Project 가 없다.
Spring 템플릿. 그런데 MVC Project 가 없다.

하지만 위 화면과 같이 나올 수도 있다. 원래는 MVC Project 가 나와야 하는데, 보이지 않는다. 그럴때는 위 화면에 ‘Configure templates…’ 를 클릭한다.

Template Projects 수정
Template Projects 수정

위 화면과 같이 두가지를 순차적으로 삭제 해준다. 위와같이 하면 이전화면이 다음과 같이 나온다. 삭제하고 난후에도 이전화면에서 ‘Spring MVC Project’ 가 나타나지 않으면 Eclipse 를 재시작해준다.

Spring MVC Project 생성
Spring MVC Project 생성

위 화면과 같이 Project name 에는 ‘HelloWorld’ 를 적어주고 아래 Template 은 ‘Spring MVC Project’ 를 선택하고 ‘Next’ 를 해준다.

패키지명 작성
패키지명 작성

위와같이 패키지명을 입력하고 난 후에 Finish 를 누르면 Hello World 프로젝트가 작성된다.

Spring MVC Project 로 작성된 Hello World
Spring MVC Project 로 작성된 Hello World

이를 실행시키면 Hello World 를 브라우져에서 확인해 볼수 있다.

UTF-8 로 출력하기

이는 Deployment Discriptor 인 Web.xml 파일에 Encoding 설정을 UTF-8 로 설정해 줘야한다. 이는 다음과 같다.

Session 공유 테스트 코드

WAS 서버를 세팅할때에 Session 을 공유하도록 가끔은 구성할 때가 있다. 요즘은 spring-data-redis 를 이용해서 Redis 에 Session 을 저장하도록 지원하고 있지만 WAS  서버 자체적으로 Session 을 공유하도록 설정해서 운영할 수 있다.

이때 과연 WAS  서버들간 Session 이 제대로 공유되고 있는지를 확인할 필요가 있는데 이때 사용할 수 있는 코드다. 참고로 이 코드는 다음의 github 저장소에서 가지고 왔다.

먼저, Controller 를 다음과 같이 수정한다.

그리고 다음과 같이 home.jsp 파일을 수정해준다.

위와같이 수정하고 실행을하면 세션관련된 내용을 출력되고 세션 공유를 테스트해 볼 수 있다.

JBoss EAP 에서 세션 공유

코딩만으로는 Session 공유가 되지 않는다. WEB-INF 디렉토리에 ‘jboss-web.xml’ 을 만들고 다음과 같이 작성한다.

그리고 web.xml 파일에 다음을 추가해 준다.

위와 같이 하면 웹 애플리케이션에서 세션이 공유된다.

Spring 개발을 위한 Eclipse 세팅하기

eclipse ide

이제 Java 개발을 하기위해서는 Eclipse가 필수가 됐다. 아니 Java 뿐만이 아니라 웬만한 언어들과 개발에 필요한 각종 인프라들을 제공해주는 단순한 하나의 IDE 가 아닌 개발환경 그 자체가 되어가는 듯한 느낌이다.

Java 개발에 거의 표준이 된 Spring Framework 를 이용한 개발을 할때도 Eclipse도 필수중에 필수이다.

Spring 개발을 위해 필요한 Eclipse 세팅에 대한 글이다. 초보자분들을 대상으로 함으로 이미 많은 경력을 쌓은 개발자는 읽을 필요가 없다.

준비물

현시점(2016.05)에서 안정적인 자바 개발을 위한 프로그램과 버전들은 다음과 같다.

  • Jdk 1.8
  • Maven 3.3.9
  • Eclipse 4.5.2 (mar2), STS 3.7.3

한가지 알아야 할 것은 STS 3.7.3 이다. Springsource Tools Suites 로서 Spring 개발사(?)에서 Eclipse 와 Spring Tools Suites 를 통합시킨 것이다. Eclipse 와 완전히 동일한 환경이지만 STS를 설치하면 별도의 Spring 을 위한 설치작업을 할 필요가 없기 때문에 많이 사용한다.

여기서는 Eclipse 4.5.2 를 가져다 Spring 을 위한 환경을 구축하는 것으로 하겠다. 설치와 환경설정으로 나뉘어 서술할 것인데, 설치를 제외한 환경설정 부분은 Eclipse 나 STS나 동일하기게 적용된다.

마지막으로 시스템은 Windows 64bit 을 사용하는 것으로 한다.

설치하기

Jdk 1.8 설치

먼저, Jdk 1.8 을 설치해야 한다. Maven 때문에 반드시 JDK를 설치해야 한다. Windows 64bit 버전을 다운받아 설치한다. 그리고 JAVA_HOME, CLASS_PATH, PATH를 시스템 환경 설정을 해준다. 이 과정은 검색해보면 많이 나오니까 따로 기술하진 않겠다.

Maven 3.3.9 설치

Maven 은 Java 개발에 필요한 각종 라이브리 의존성, 빌드, 테스트를 자동화해주는 툴이다. 대부분 Java 개발이 대규모로 이루어지고 있어 이러한 것을 자동으로 처리해주는 필요가 많이 생겼는데 Maven이 그걸 자동으로 해준다.

Eclipse 에서는 Maven 과 통합이 되어서 사용자가 별도의 명령어를 치거나하는게 아니라 Eclipse 에서 전부 Maven 관련된 일을 수행할 수 있다.

설치는 아주 간단하다. Maven 홈페이지에서 다운받아서 압축해제만 해주면 끝이다. 나는 압축을 해준 다음에 C:\ 디렉토리로 그냥 옮겨줬다.

  • C:\apache-maven-3.3.9

설치를 했다면 설정을 해줘야 한다. Maven 설치한 디렉토리에 repository 라는 디렉토리를 생성한다.

maven repository 디렉토리 생성
maven repository 디렉토리 생성

conf 디렉토리에 보면 setting.xml 파일을 텍스트 에디터로 열어서 다음과 같이 localRepository 부분에 방금 생성한 repository 디렉토리를 지정해준다.

Maven 자체에 대한 설정은 아주 많은데, 보통의 경우에 여기까지만 해도 개발하면서 이용하는데 아무런 문제가 되지 않는다.

Eclipse 설치

Eclipse 설치를 위해서 홈페이지에 가보면 다양한 Eclipse를 볼수 있다. 그것들은 마치 STS 와 동일한 것들이라고 보면 된다. C/C++ 를 위한 Ecclipse, PHP를 위한 Eclipse, Java 를 위한 Eclipse 등 많은 Eclipse 통합 제품들을 제공하는데 우리는 Java EE 를 위한 Eclipse 를 다운받는다.

  • Eclipse IDE for Java EE Developers

시스템 운영체제에 맞는것을 다운받으면 된다. 다 다운받으면 압축해제해서 C:\ 로 옮겨준다. 나 같은 경우에는 다음과 같다.

  • C:\eclipse-jee-mars2

Eclipse 설정

먼저 Eclipse 를 실행한다. 모든 설정은 Eclipse 실행한 상태에서 하게 된다.

실행을 했다면 ‘Help’ 메뉴 -> Check for Updates 를 실행해서 Eclipse 를 최신상태로 업데이트를 반드시 해준다.

Spring Tools Suites Plugin 설치

Plugin 설치는 Marketplace 를 이용해서 아주 쉽게 할 수 있다. ‘Help’ 메뉴 -> Eclipse Marketplace 를 클릭하면 Marketplace가 실행된다.

Marketplace 에서 Spring 으로 검색해서 설치버튼 클릭
Marketplace 에서 Spring 으로 검색해서 설치버튼 클릭

위 화면과 같이 ‘Spring’ 으로 검색해서 나오는 ‘Spring IDE 3.7.3.RELEASE’ 에 Install 클릭해준다. 그러면 화면이 바뀌고 설치하고자하는 추가 컴포넌트들을 선택하는 화면이나오는데 잘 모르면 그냥 ‘Confirm’ 클릭하고 라이센스에 동의해주고 ‘Finish’ 클릭하면 설치가 진행된다.

중간에 인증되지 않은 Plugin 을 설치하겠냐고 물어보는 팝업창이 나오기도 하는데 ‘Yes’를 해주면 설치가 완료 된다.

Maven 설정

Eclipse 를 실행하고 ‘Window’ 메뉴 -> Preferences 를 클릭하고 나오는 창에서 ‘maven’ 으로 검색한다.

maven 설정
maven 설정

위 화면과 같이 ‘User Settings’ 부분에 앞에서 Maven 설치시에 수정했었던 settings.xml 파일을 인식 시켜준다.

한가지 더 Maven 을 위한 설정이 존재하는데 다음과 같이 Jdk 의 tools.jar 을 library 에 포함시켜줘야 한다. 만일 이것을 하지 않게되면 Maven 사용시에 다음과 같은 오류를 만나게 될 수도 있다.

이는 tools.jar 을 필요로 하는 것인데 다음과 같이 인식시켜주면 된다.

tools.jar 추가해주기
tools.jar 추가해주기

이로써 Spring 개발을 위한 설정은 모두 끝났다.

하지만, 추가적인 필요한 설정을 해주자.

Edit Encoding,  line delimiter 설정

Windows 에서 Eclipse 를 사용하게되면 Eclipse의 기본 파일 인코딩은 MS949로 시스템 기본 문자셋을 따른다. 하지만 지금 세상은 UTF-8 세상이 된지 오래다.

또, Line delimiter 라고 해서 한줄을 다 쓰고나서 Enter 를 누르면 ‘\n’, ‘\r\n’ 이 두가지 형태로 라인이 끝임을 마킹하게 되는데 이는 Windows 나 Unix 에 따라 다르다. 이는 개발한 애플리케이션이 어느 시스템에서 동작하는지에 따라 선택해준다. 나는 Unix 로 바꿔줬다.

Encoding, Line delimiter 변경
Encoding, Line delimiter 변경

Line Numbering

텍스트 화면 왼쪽에 줄번호를 보이게 하면 개발시에 아주 편리하다. 설정은 다음과 같이 한다.

Line Number 보이기
Line Number 보이기

Eclipse Color Themes 설치

개발을 하다보면 Edit에 Syntax Highlight 를 변경하고자 하는 욕구가 나온다. 이럴때에 Color Theme를 설치하고 바꿔주면 된다. 이것도 Plugin Marketplace 에서 설치가능하다.

Eclipse Color Theme 설정
Eclipse Color Theme 설정

Plugin 을 설치하고 나면 위와같이 전에 안보이던 Color Theme 가 나오고 많은 Syntax Highlight Color 들을 볼수 있고 원하는 것을 선택할 수 있게된다. (원래는 선택하면 미리보기 기능을 제공했지만 현시점(2016.05)에서는 어찌된 영문인지 ‘곧 돌아온다’라는 문구만 나온다.)

이로써 Spring 개발을 위한 Eclipse 세팅에 대해서 간단히 알아봤다.