Browse Tag: java

[Java]Java 8

Java 8은 2014년 발표된 Java의 Version 8 이다.

Java 5 이후로 Version  6, 7 도 있었지만 Version 8이 중요한 이유는 언어 자체에 변화가 있었던 버전업이기 때문이다. 그래서 Java에 대한 지식을 누군가가 물어본다면 Java 8에 대한 점은 기존의 자바 언어와 별개의 언어처럼 물어보는 경우도 있다. 그만큼 Java 8은 새로운 세상이다.

가장 큰 특징은 Lambda, Map , Filter 같은 함수형 언어의 여러 개념이 도입한 것이다.

함수형 언어에 대한 이야기는 http://kwangshin.pe.kr/blog/2013/01/21/번역-함수형-프로그래밍functional-programming-기초 에서 확인할 수 있다.

함수형 언어의 특징을 이해하면 왜 Java 8이 함수형 언어의 개념을 도입했는지 이해할 수 있다. 프로세서의 성능이 높아짐에 따라 소프트웨어는 그것을 활용할 수 있는 방향으로 발전해나가야 하기 때문이다.

[Java]JPA란

Java Persistence API

EJB에서 구현 되었던 엔티티빈을 POJO철학을 반영하여 구현한 기술.

Persistence 란 어플리케이션의 데이터가 프로세스(JVM)보다 오래 지속 되는것을 말한다.(참고)

관계형 데이터베이스에서 받은 데이터를 Row단위로 오브젝트에 매핑 시키는 것이 ORM인데 이를 표준화 했다.

대표적으로 Hibernate가 있는데, Hibernate가 나왔기 때문에 JPA스팩이 정의된것인지 , JPA에의해서 Hibernate가 구현된것인지는 비밀.

소스로 한번 참고해보자. Spring Data JPA 로 구현한것이다.

  1. Entity 클래스 생성 – 클래스 이름이 테이블 이름

 

2. CrudRepository를 상속 받아 구현

 

3.실행

 

간단히 개념적인 부분만 코드로 적어본 것이다. 자세한 내용을 원한다면 http://jekalmin.tistory.com/entry/springdatajpa-%EA%B8%B0%EB%B3%B8-%EC%98%88%EC%A0%9C 를 참고

진짜 이런 설정 하다보면 그냥 PHP하고 싶을때가 많다. Laravel에서는 저런거 없이 ORM개념을 잘 구현하는거 같던데.. 시간 되면 PHP의 ORM과 Java의 ORM을 비교

[Java]AOP

Aspect-Oriented Programming

객체 지향 프로그래밍(OOP)로 개발 하다보니 단점이 발견되었다. 분산된 중복 소스 , 소스간 의존성 증가 등등.

이런 문제를 해결하기 위해 등장한것이 AOP.

“Aspect” 란 로깅 , 보안, 트렌젝션 같은 비지니스 로직 사이에 공통으로 존재하는 “관심사”들이다.  이런 부분들이 객체지향프로그래밍에서는 전체 어플리케이션에서 중구난방으로 등장(횡단 관심사)해서 정리가 안되니 이런 부분을 따로 때서 개발하자 라는 것이다.

결국 객체지향 프로그래밍을 중심으로 거기서 발견된 문제를 관심사 분리를 통해 해결하자 라는 것이 AOP

AOP의 Aspect를 구현하기 위해서는 Advice(무엇을 해야하는가) point cut(어디서 해야하는가)를 정의해야한다. 정의된 것을 weaving(point cut 지점에 Advice를 삽입)한다.

일련의 작업을 통해 공통의 관심사를 분리하고 이로 중복 코드를 제거하여 유지보수에 큰 이점을 가질 수 있게 된다.

글로만 쓰면 무슨말인지 잘 모르니, Spring에서 구현된 AOP의 실전 예제를 통해 이해해보자.

Spring에서 AOP를 구현하기위한 방법은 여러가지인데 어노테이션(AspectJ)를 이용한 방법을 사용해보자

 

Interface로 정의되고 Spring Bean으로 등록된 객체만이 Aspect가 실행되는 대상이된다.

해당 문법(@Before , @After 등)에 대해서는 AspectJ 문법을 찾아 사용하면 될것 같다.

[Java]POJO 클래스

Plain Old Java Object

EJB에 반대급부로 등장한 개념. EJB는 엔터프라이즈 어플리케이션에서 필요로 하는 트랜젝션 관리, 보안 등을 처리해주었고 개발자는 비지니스 로직만 걱정할 수 있도록 도와주었다. 그러나 너무 복잡했다고 함(사용해본적이 없어서..)

그래서 등장 한것이 POJO클래스 . POJO 프레임워크.

POJO는 특정 프레임워크에 종속 되지 않는다.(POJO 클래스의 경우 프레임워크에서 제공된 interface/class의 상속이 없음) 이외에도 객체 지향적이다 등의 특징이 있지만 핵심은 프레임워크에 종속 되지 않는다는것.

POJO 의 장점은 간결한 코드와 쉬운 테스팅.

POJO 철학을 반영한 프레임워크의 예

Hiberate – JPA(Java persistence API)구현, 오브젝트-관계형 DB매핑

Spring – EJB의 세션빈이 하던(트렉젝션 , 보안)일을 POJO기반으로 구현.

 

#JPA #Hiberate #Spring 

 

*EJB(Enterprise JavaBeans ) : 세션빈(Session Bean)과 엔티티빈(Entity Bean)으로 구성

[Java]자바 용어

자바 용어에 대해 명확히 하고 넘어 가기 위해 정리한다.

#POJO 클래스 – 프레임워크에 의존(상속)하지 클래스. 프레임워크가 빠진 순수 자바 클래스.

#AOP – 객체지향 프로그래밍의 단점을 보완하기 위한 관심사(aspect) 중심의 프로그래밍

#JPA – 관계형 데이터베이스에 접근하기 위한 표준 ORM(Object-relational mapping)

#Java 8 – Java version 8

JTA – 데이터베이스를 이용할 경우 트랜잭션을 제어하기 위한 기술 ( J2EE 스팩 )

JMS – 메시징 시스템은 응용프로그램 간에 비동기적으로 메시지를 교환할 수 있는 기술 (J2EE 스팩)

JMH 설치 및 사용하기

JMH는 OpenJDK에서 만든 성능 측정용 library다

JMH를 설치하기 위해서는 Mercurial이라는 코드 저장소를 설치해야하는데(JMH가 Mercurial에 올라가 있기 때문) Mercurial은 해당 링크를 따라 설치하면 된다(간단) https://www.mercurial-scm.org/downloads

Mercurial 설치 이후 hg 명령어를 통해 JMH를 설치하는데(윈도우의 경우 설치시 환경 변수 등록 체크를 선택해서 귀찮게 환경변수를 추가하는 일이 없도록 하자)

hg clone http://hg.openjdk.java.net/code-tools/jmh/ jmh

을 실행해서 JMH를 설치하자.

JMH가 설치 되었다면, 메이븐을 이용해 빌드 해야한다.

mvn clean install -DskipTests=true

메이븐이 설치 되어 있지않다면 , https://maven.apache.org/download.cgi 에 가서 메이븐을 다운받고 환경변수 등록하도록 하자(윈도우 기준)

빌드가 완료 되었다면, 메이븐 로컬 저장소에 JMH 라이브러리가 등록 되었다.

이후

mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jmh -DarchetypeArtifactId=jmh-java-benchmark-archetype -DgroupId=org.sample -DartifactId=test -Dversion=1.0

을 실행하라고 하는데.. 정확한 이유는 모르겟음. 벤치마크 프로젝트를 빌드해야한다고 한다.

이후 메이븐으로 빌드 시 JMH를 사용할 수 있음.

메이븐 pom.xml 에 JMH 관련 의존 관계와 플러그인 추가 방법은

 

해당 링크의 pom.xml 을 참고해서 본인 프로젝트의 pom.xml에 JMH 관련 내용을 정의하자

이후 JMH사용법에 맞춰 프로그램을 만들고 빌드하여 jar파일을 실행한다면 원하는 테스트 결과를 볼 수 있다.

JMH 사용법 샘플

http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

 

책을 따라했는데 잘 안됨 ㅠ. 해보고 내가 성공한 방법으로 업데이트 예정

 

참고 : 자바성능 튜닝이야기[이상민 지음] , http://openjdk.java.net/projects/code-tools/jmh/

아파치 톰캣 연동 방법

기술 면접시에 받았던 내용이였으므로 정리해둔다.

톰캣은 WAS 서버지만 웹서버(아파치)의 기능도 제공한다.

그럼에도 아파치를 사용하는 이유는 아파치에서 제공하는 기능들을 톰캣이 제공하지 않기 때문이다.

(아파치만의 기능이라함은.. 1. 서버내에서 PHP와 Java가 동시에 사용될 경우 , 2. 로드벨런싱 기능..)

아파치와 톰캣을 연동하는 방법은 2가지가 있다.

  1. AJP, mod_jk
    AJP란 아파치가 외부 서비스와 연동하기 위한 프로토콜. 이를 구현한 모듈이 mod_jk로 아파치 서버에 설치하여 톰캣과 연동 가능
  2. mod_proxy
    아파치 서버를 프록시 형태로 구현하여 실제 response는 톰캣에서 받아오는 방법

추가적으로 mod_proxy_ajp 라는 모듈이 있지만 proxy방법과 비슷하지만 AJP 프로토콜을 이용한다는 방식이 다르다.

 

참고 : https://www.lesstif.com/pages/viewpage.action?pageId=12943367 , http://joont.tistory.com/55

Java functional Interface

Functional Interface Java 8 이후로 지원하는 기능으로

Interface 중 단 하나의 abstract method 를 가지는 interface이다.

자바는 기본적으로 First class Object Oriented Language 인데, functional interface의 등장으로 functional programming 을 점점 지원하는 방향으로 발전 중.

Function 을 파라미터로 넘기는 등의 작업이 가능함

 

GC(가비지 컬랙터)의 알고리즘

자바는 개발자가 메모리를 명시적으로 해지 하지 않고 GC가 더 이상 사용하지 않는 객체에 대해 메모리를 해지 하는 작업을 진행한다. GC에 대해 이해하기 위해서는 자바의 메모리 할당 방식에 대해 먼저 알필요가 있는데 ,

자바가 사용하는 메모리 영역은 크게 PC레지스터 , JVM 스택 , Heap , 메서드 영역, 런타임 상수 풀 , 네이티브 메서드 스택이 있다. (자세한건 여기 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5)  이 중 CG의 대상이 되는 영역은 Heap 영역인데 인스턴스 객체나 array가 쌓이는 메모리 영역이다.

이 Heap영역에 대해 JVM은 물리적 공간을 크게 두가지로 나누었다. Young 영역, Old 영역.

명칭대로 Young 영역에는 최근에 생성된 객체들이 할당 되고, Old영역에는 Young 영역에서 몇번의 GC이 실행 된 후 생존한 객체들이 옮겨 오는 영역이다.

Young 영역보다는 Old영역의 크기가 큰데, 이 때문에 Young 영역에서의 GC 작업은 minor GC라고 부르고 Old영역은 Major GC(Full GC)라고 부른다.

Young 영역 은 다시 Eden , Survivor 영역으로 나눠지는데, 이글을 작성하기 위해 참조한 naver D2의 글에 보면,

Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다는 사실은 꼭 기억하기 바란다.

라고 되어 있다. 꼭 기억하자.

GC의 알고리즘을 이해하고 상황에 따라 알맞는 알고리즘을 선택해야하는 이유는, JVM에서 GC가 일어날경우 GC를 실행하는 스레드를 제외하고 모든 스레드는 정지된다. 이 순간을 stop the world라고 부르며, 이 stop the world의 시간을 줄이는것이 GC 튜닝의 핵심이라고 이야기한다. CPU/메모리 등의 여러 조건을 보고 효과적인 알고리즘을 선택하여 stop the world를 줄이기 위해 GC에 대해 이해해야하는 것이다.

 

  • Serial GC
    -> 싱글 CPU의 경우 사용, 성능이 좋지 않음. 실제 운영서버에서 사용 X
    -> 클라이언트 JIT컴파일러의 경우 Serial GC를 사용
    ->Old 영역에 대해서는 Mark-sweep-compact 컬렉션을 사용(살아있는 객체를 마크-> sweep->남은 객체를 앞으로 정리)
  • Parallel GC
    -> Serial GC와 같은 알고리즘이지만, GC를 위한 스레드가 여러개
    -> Old영역에 대해 Mark-sweep-compact 컬렉션을 사용한다는 점은 serial과 같음
  • Parallel Old GC(Parallel Compacting GC)
    -> Old영역에 대한 컬렉션 알고리즘이 Parallet GC와 다름
  • Concurrent Mark & Sweep GC(이하 CMS)
    -> 힙 메모리 영역이 클 경우 적합한 GC
    -> Young영역에 대한 컬렉션은 Parallel GC와 같은 알고리즘을 사용하지만 Old영역에 대한 알고리즘이 다름
    -> 재표시 단계와 생존한 객체를 왼쪽으로 몰아넣는(컴팩트) 단계가 없음
    -> Parallel GC에서 사용되는 알고리즘에 비해 Stop-the-world 가 짧게 두번 발생한다는 점이 다름
  • G1(Garbage First) GC
    -> 다른 4개의 컬렉터와 좀 다른형태, Young과 Old영역이 물리적으로 나눠져 있지않고 해당 영역의 객체들을 Region이라는 구역에 할당한다. 이 region이라는 구역이 Eden, Survivor, Old 같은 영역의 역활을 바꿔가며 수행하게 된다.
    -> Old 영역의 GC알고리즘 경우, CMS CG와 비슷한데, 살아 있는 객체 에 대해 마지막에 복사단계를 통해 비어있는 구역으로 이동시키는점이 추가적으로 발생된다.
    -> CG 성능이 가장 빠름(stop-the-world의 시간이 가장짧음)

참고 : http://d2.naver.com/helloworld/1329, 자바성능튜닝이야기(이상민 지음)

EHCache 캐쉬 엔진

Java 캐쉬 엔진인 EHCache.

기본적으로 웹어플리케이션에서 캐쉬는 HTTP의 캐시 , View 레이어 캐쉬(HTML, xml, Json등의 캐쉬) , 비지니스 로직 캐쉬(메소드 캐싱 등) , DB 캐쉬가 있다. EHCache의 경우 HTTP캐시 를 제외한 모든 영역의 캐쉬를 지원한다고 볼 수 있다.

EHCache의 간단한 장점은

  • 경량의 빠른 캐쉬엔진
  • 분산 지원
  • 높은 품질

나머지 장점은 공식 페이지에서 확인해보자(스토리지 엔진을 사용해서 캐쉬를 memory나 disk에 올리는것등 다양한 장점이…)

EHCache에서 중요한점은 분산캐쉬Spring 에서 사용 인데,


분산 캐쉬부터 살펴보자

분산 캐쉬는 크게 두가지로 나눠질 수 있다.

  • Hub and Spoke
    중앙에 각 JVM이 가진 캐쉬 노드를 제어 하는 캐쉬 서버를 두는 아키텍쳐 인데, 각 노드에서 데이터가 변경 되면 중앙의 캐쉬서버에 변경사항을 전달하고 캐쉬서버가 다시 나머지 노드에 변경 사항을 전달하는 구조로 되어 있다.
  • Replication, Invalidation
    각 노드간 캐쉬를 노드 자체적으로 클러스터링 하여 작동하는 아키텍쳐다. 한 노드에서 변경이 발생하면 나머지 노드에 직접 변경을 알려주는 구조로 되어 있다.

EHCache는 Hub and Spoke(document 에서는 Distributed라고 표현), Replication, Invalidation 모두 선택이 가능하다. (참고)  Distributed 를 선택할 경우 Terracotta Server Array 를 사용해서 캐쉬서버가 구현되며 Replication 아키텍쳐를 선택할 경우 변경통지는 RMI나 JGroups같은 매커니즘을 플러그인 형태로 선택해서 사용할 수 있다.


다음으로 Spring 에서 EHcache를 사용하는 법은

캐시 설정 파일을 통해 Max Heap 메모리 크기나, max 디스크 크기 등 몇가지 설정을 설정파일에 입력(http://www.nextree.co.kr/p3151)한 후 어노테이션을 이용하거나 CacheManager 객체를 생성해 캐쉬를 관리 할 수 있다.

참고 : http://www.nextree.co.kr/p3151/ , http://greatkim91.tistory.com/116