Java 9 REPL (JShell)

오라클은 쉘과 REPL(Read Evaluate Print Loop)을 위한 새로운 툴인 "JShell"을 소개한다.

이것은 자바 클래스, 인터페이스, 객체 등의 생성을 매우 쉽게 실행하고 테스트하기 위해 사용된다.


프로그래밍 언어를 구현하는 방법 중에서 인터프리터(해석기) 방식이 있다.
사용자가 입력한 프로그램을 읽고 값을 계산한 다음 출력하는 일을 반복한다.
이렇게 읽고(read), 계산하고(evaluate), 출력하는(print) 반복 구조를 REPL(read-eval-print loop)이라고 한다


다운 가능한 곳 : https://jdk9.java.net/download/



G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10



JShell에 대해 더 잘 알고 싶다면 아래 링크를 참고.




Factory Methods for Immutable List, Set, Map and Map.Entry

불변 List, Set, Map, Map.Entry를 만들어주는 편리한 팩토리 메서드가 제공된다.

그 유틸 메서드들은 비어있거나 비어있지 않은 Collection 객체를 만드는데 사용됩니다.


자바8이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX와 같은 유틸 메서드를 사용해서 불변 Collection 객체를 만들었다.

그러나 그 메서드들을 이용한 방법은 지루하고 장황했다. 그 단점을 없애기 위해서 새로운 팩토리 메서드가 추가되었다.


List와 Set 인터페이스는 불변의 비어있거나 비어있지 않은 List 또는 Set을 만들어주기 위한 "of" 메서드를 갖는다.


Empty List Example

List immutableList = List.of();

Non-Empty List Example

List immutableList = List.of("one","two","three");


Map은 두 개의 메서드를 갖는다.
"of"는 비어있는 불변 맵을, "ofEntires"는 데이터를 추가해준 불변 맵을 만들어준다.

Empty Map Example

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

Non-Empty Map Example

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}


위 메서드에 대해 더 자세히 알고 싶다면 아래 링크를 참고.




Private methods in Interfaces

Java8에서 Default와 Static 메서드를 이용해서 인터페이스에 구현체를 넣는 방법이 추가되었다.

하지만 private으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었다.

아래 메서드들에 차이는 없다.


public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

더 알고 싶다면 아래 링크를 참고




Java 9 Module System

자바9의 큰 변화중 하나는 모듈 시스템이다.

직소 프로젝트(Jigsaw project)는 다음과 같은 특징을 갖고 있다.

  • Modular JDK
  • Modular Java Source Code
  • Modular Run-time Images
  • Encapsulate Java Internal APIs
  • Java Platform Module System


자바 SE 9 버전 전에, 우리는 자바 기반 응용 프로그램을 개발할 때 모노리틱 Jar 방식을 사용하고 있었습니다. 

이 아키텍처는 한계와 단점이 많았습니다. 이러한 모든 단점을 방지하기 위해, 자바 SE 9 모듈 시스템이 나왔습니다..


JDK 9는 92 모듈 (최종 릴리스에서 변경 될 수 있습니다)와 함께 오고 있다.

우리는 JDK 모듈을 사용할 수 있고 아래와 같이 우리 자신의 모듈을 만들 수 있습니다 :



Simple Module Example

module com.foo.bar { }


여기에서 우리는 간단한 모듈을 만드는 'module'을 사용하고 있습니다.

각 모듈의 이름, 관련 코드 및 기타 자원을 보유하고 있습니다.




Process API Improvements

자바9에서 프로세스 API를 개선하였다.

다음과 같은 두 커플 형태의 신규 클래스가 추가되었다. (OS 프로세스를 관리 및 컨트롤할 수 있는)


  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info


Process API example

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());





Try With Resources Improvement

우리는 자바 7에서 새로운 자원 관리 방법(try with resource)이 나온 것을 알고 있다.

이것의 핵심 목표는 자원관리의 보다 나은 자동화이다.  자바9에서는 더 향상된 방법을 제공한다.



Java SE 7 example

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

Java 9 example

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}


더 많은 정보를 원하면 아래 링크를 참고




CompletableFuture API Improvements

자바8에서 CompletableFuture가 가지는 문제점을 개선하였다.



Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

delayedExecutor()은 static 유틸 메서드로 사용된다.

주어진 시간 딜레이 이후에 기본 실행자로 보내진 new Executor를 반환한다.




Reactive Streams

아름다운 혜택들로 애플리케이션을 배포하기 위해 지금 리액티브 프로그래밍은 큰 인기를 끌고 있다.

Scala, Play, Akka 등의 프레임워크는 이미 리액티브 스트림을 구축하고 많은 혜택을 얻고 있다.

오라클은 새로운 리액티브 스트림 API를 소개한다.


자바9의 리액티브 스트림 API는 자바 언어를 이용해서 매우 쉽게 병행성, 확장성, 비동기 애플리케이션을 구현한 Publish / Subscribe 프레임워크이다.


다음은 자바 기반 애플리케이션에서 리액티브 스트림을 개발하기 위한 API이다.


  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor




Diamond Operator for Anonymous Inner Class

자바 7에서 다이아몬드 오퍼레이터를 추가했지만, 자바 8에서 익명 내부 클래스 사용시 한계가 있다는 것을 찾게 되었다.

그것을 수정하였고 아래와 같은 예를 들 수 있다. 자세한 타입 파라미터 없이 단순히 "List"만을 사용하였지만 상세한 타입을 알아서 확인해서 읽어준다.



public List getEmployee(String empid){
     // Code to get Employee details from Data Store
     return new List(emp){ };
  }




Optional Class Improvements

Optional 클래스에 신규 메서드를 추가했다.

값이 Optional 객체로 주어질 때 Stream 메서드는 값과 함께 sequential stream을 리턴한다. 값이 비어 있다면 빈 스트림을 리턴한다.


다음은 Optional에서 stream의 사용 형태를 보여준다.


Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

위 Optional.stream 메서드는 Employee 객체의 Optional 스트림을 Employee 객체 스트림으로 변환해준다.




Stream API Improvements

자바9에서 Stream 인터페이스에 사용 가능한 4개의 메서드가 추가되었다.

Stream은 인터페이스이므로 신규 구현된 메서드는 모두 default 메서드이다.

그 중 두 개는 매우 중요하다. dropWhile과 takeWhile 메서드

takeWhile은 인수로서의 predicate를 취하고 주어진 값의 스트림 서브셋을 리턴합니다.

해당 값을 만족시키는 값이 없으면 빈 스트림을 리턴합니다.



jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4







Enhanced @Deprecated annotation

자바8과 이전 버전에서 @Deprecated 어느테이션은 어느 메서드도 없이 단순히 마커 인터페이스였다.

Java SE 9에서 Oracle Corporation은 @Deprecated 주석을 강화하여 지원 중단 된 API에 대한 자세한 정보를 제공하고 지원 중단 된 API의 정적 사용을 분석하는 도구를 제공합니다.

forRemovalsince가 추가되었고 이 메서드들은 그 정보를 제공합니다.




HTTP 2 Client

HTTP/2 프로토콜과 WebSocket 기능을 지원하기 위해 새로운 HTTP 2 클라이언트 API가 추가된다.

기존 또는 기존 HTTP 클라이언트 API에 많은 문제점이 있으므로, 이 HttpURLConnection API를 새로운 HTTP 클라이언트로 대체하고 있습니다.


"java.net.http" 패키지 아래에 새로운 HTTP 2 클라이언트 API를 도입 할 것입니다.

HTTP / 1.1 및 HTTP / 2 프로토콜을 모두 지원합니다. 그것은 동기화(블로킹 모드)와 비동기 모드를 모두 지원합니다.

WebSocket API를 사용하여 비동기 모드를 지원합니다.


We can see this new API at: http://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html



HTTP 2 Client Example

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("http://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> http://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))





Мulti-Resolution Image API

Java SE 9에서 Oracle Corp은 새로운 multi-Resolution Image API를 도입 할 예정입니다.

이 API의 중요한 인터페이스는 MultiResolutionImage입니다.

java.awt.image 패키지로 이용 가능합니다.

MultiResolutionImage는 서로 다른 높이와 너비 (해상도가 다름)의 이미지 세트를 캡슐화하고 우리가 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록합니다.




Miscellaneous Java 9 Features

아래 특징들이 덜 중요한 특징은 아니지만 현재로서는 확실히 나온 정보가 많지 않음


  • GC (Garbage Collector) Improvements
  • Stack-Walking API
  • Filter Incoming Serialization Data
  • Deprecate the Applet API
  • Indify String Concatenation
  • Enhanced Method Handles
  • Java Platform Logging API and Service
  • Compact Strings
  • Parser API for Nashorn
  • Javadoc Search
  • HTML5 Javadoc



Reference

[1] Java9 Feature (http://www.journaldev.com/13121/java-9-features-with-examples)






'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

웹 기술에 JPA 표준기술과 그 구현체인 하어버네이트가 있다.

그리고 DDD(Domain driven design) 도메인 주도 설계가 있다.


DDD나 JPA에 대해서 모른다고 해도 개발하고 구현을 하는데는 아무런 문제가 없다.

내 대부분의 경력 또한 두가지를 모르고 개발을 해왔고, DDD와 JPA에 대해서 잘 알고 있는 사람도 많지 않다.


그리고 이런 부분에 대해서 좋게 평가를 해주는 관리자도 많지 않으며, 

어떤 관리자는 왜 팀원들이 모르는 JPA기술을 혼자만 사용했냐고 할지도 모른다.

어떤 관리자는 왜 기존의 설계와 다른 DDD라는 방식을 썼냐고 반문할지도 모른다.



가끔 나 스스로도 생각을 한다.

왜 JPA를 사용하려 하는걸까? iBatis와 myBatis로도 충분히 개발이 되는데?

왜 DDD를 사용하려 하는걸까? 기존의 컨트롤러, 서비스 구현체(또는 BO 구현체 등), VO(또는 DTO 또는 Map)을 이용한 방식이 깔끔하고 익숙한데?



내 경험으로 비추어 내가 왜 DDD와 JPA에 대해서 공부하고 사용하려 하는지 얘기를 해보겠다.



PRO-C 이야기

잠시, 오래전 이야기를 해본다.

내가 신입으로 회사에 입사했던 시절 잠시 PRO-C를 개발했다. (나는 JAVA개발을 하고 싶었지만 잠시 업무를 맡게 되었다.)

PRO-C는 모르는 개발자들이 많은데, 일반적인 C언어에서 DB 프로그래밍을 가능하게 해놓은 것으로서 금융권에서 아직도 대부분 사용을 하고 있다. 


그런데 이 PRO-C는 미들웨어 위에서 돌아가는데 이 미들웨어가 복잡한 처리는 모두 해주고

개발자는 오직 비즈니스 로직만을 작성하면 된다. 그런데 이 비즈니스 로직이라고 하는 것도 트랜잭션 내에서 데이터 CRUD 작업을 절차적으로 하는 것뿐이다. 비즈니스 로직만을 작성하면 된다는 장점이 있지만, 반대로 시스템에 대해서 설계할 내용이 없다보니 개발자의 역량이 뛰어나지 않아도 되고 DB에 대해 잘 알고 쿼리만을 잘 작성하면 되었다.


업무를 맡고 있던 동안 내가 하고 싶던 객체지향 프로그래밍, 자바, 디자인 패턴 등의 일들을 할 수가 없어서 많이 힘들었다.

그래서 업무 내에서 할 수 있는 DB에 집중했고 DB쪽 쿼리 분석이나 튜닝 등의 공부에만 집중할 수 밖에 없었다.



자바 이야기

내가 잘하고 하고 싶어했던 자바 개발 업무를 하게 되었다.

웹 개발시에는 회사에서 말로만 듣던 스프링을 사용하게 되었다.

스프링 프레임워크를 사용하는 것은 기존에 JSP 모델2나 싱글톤 패턴을 많이 사용하던 기존의 방식과는 많이 달랐다.

처음에는 스프링 프레임워크에 대해 정신없이 공부를 하다가 시간이 흘러갔는데

몇년이 지나면서 나는 묘하게 PRO-C 때와 같은 고민이 들게 되었다.


어느 프로젝트에서던지 웹에서는 대부분 컨트롤러, 서비스 구현체, DAO 구현체, VO(또는 DTO)를 만들고

중요한 비즈니스 로직은 서비스 구현체 또는 BO 구현체에 모두 넣었다.


나름대로 역할을 분리해서 다른 클래스들을 이용하기도 하지만 핵심 비즈니스 로직은 모두 서비스 구현체에서 처리를 하는게

약간 다르지만 PRO-C 때의 절차적인 방식과 크게 다르지 않게 느껴졌다.


게다가 간혹 중요한 비즈니스 로직을 쿼리를 통해서 구현을 하게 되면

시스템의 핵심이 결국 DB에 있게 되고 자바 프로그램은 결국 DB를 위한 껍데기로 느껴져버렸다.

(간혹 로직을 DB 프로시져 등에 담는 경우도 보았다. 이건 정말 절망적이었다..)


나는 객체지향 프로그래밍을 하고 있는걸까? 의문이 들었다.


객체지향 5원칙 SOLID, 객체지향의 4대 특성, 자바 EE 디자인 패턴들에 대해서

공부하고 알고 있지만 이것을 제대로 사용하고 있는 것일까란 생각이 늘 떠나지 않았다.



JPA (Java persistance API)

Slide Share에서 김영한님의 자료들을 보면서 JPA에 대해서 알게 되었다.

하이버네이트는 알고 있었지만 자료들을 보면서 새롭게 와닿았다. 


iBatis, myBatis를 사용하면서 늘 지겨운 쿼리 작성이나 문제점에서 해방될 수 있었다.

게다가 Spring DATA JPA는 최고라고 생각되었다.


그런데 문득 JPA와 ORM의 장점에 대해서 보던 중 "DDD 개발을 가능하게 해준다."라는 문구가 들어왔다.



DDD (Domain driven design)

도메인 주도 설계는 2006년 에릭 에반스의 책을 통해서 이슈가 되었다.

스프링이 DDD를 개발을 지원하려 만들었다고 말이 나왔을 정도였고, 스프링 개발 또한 도메인 주도 설계를 통하여 이루어졌다고 한다.


처음 DDD를 알게 된 것은 다른 사람이 DDD 공부를 하는 것을 보고 알게 되었다.

그 당시 나는 참 쓸데없는 걸 공부한다고 생각하였다.

그런데 시간이 지나서 DDD에 대해서 알게 되고 책을 보면서 나는 DDD가 내가 갖고 있던 갈증을 해소해 줄 방법 같다고 여겨졌다.


기존 서비스나 BO에 비즈니스 로직을 담던 방식은 대부분 잦은 수정을 하게 된다.

객체지향 5원칙에도 늘 맞지 않고, 비즈니스 로직이 복잡해질수록 늘어가는 방어 로직과 사이드 이펙트로 인하여 유지보수가 어려워진다.


DDD는 복잡한 비즈니스 로직을 도메인 모델에 담고 복잡했던 로직을 쉽게 풀어 나간다.

그 풀어나가는 방식을 보다보면 객체지향 5원칙에 맞아 들어가고

초기 설계를 할 때도 또한 도메인 모델을 기반으로 UML을 그리다보면 명쾌하고 간략해진다.




기타

JPA를 쓰다보면 핵심 로직을 DB 쿼리에 두지 않고, 자바 로직으로 많이 옮겨오게 되는데 이 부분에 대해서는 나도 간혹 고민이 된다.

DB를 통해서 한번에 처리할 수 있는 쿼리나 쿼리를 통하는게 성능이 더 좋을 경우가 있는데

이것을 무조건 자바 로직으로 처리해서 성능을 떨어트리는 것은 좋은 방법이 아닌 것 같다.


그런데 쿼리를 통하려고 하다보면 Native Query를 사용해야 하는데

그럴때는 또 iBatis와 myBatis만 한 것이 없다.

(같이 병행해서 사용하는 방법도 있지만 그러고 싶지는 않아서 늘 고민이 되는 부분이다.)



'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

.

함수형 프로그래밍이 주목받는 배경과 장점에 대해서 Refreence [1][2]를 참조해서 요약을 해보았습니다.



배경

무어의 법칙이 깨지고 멀티코어 CPU의 등장

* 컴퓨터에서 사용하는 반도체 회로 성능은 대략 18개월마다 2배로 빨라진다는 법칙

* 2000년대 중반부터 법칙이 깨짐

* 물리적인 한계에 부딪힌 CPU 회사들은 여러 개의 칩이 병렬적으로 동작을 하도록 만드는 수평적 전략을 채택


프로그래밍 환경의 변화

* 단일코어 환경 : “멀티쓰레딩” 코드는 여러 개의 쓰레드가 하나의 CPU를 가장 효율적인 방식으로 공유하도록 만드는데 초점을 기울임

* 멀티코어 환경 : “멀티쓰레드” 코드는 이제 어플리케이션이 동작하는 동안 놀고 있는 CPU가 없도록 만드는데 초점을 기울임


동시성 코드 작성의 어려움

* 브라이언 괴츠의 Java Concurrency in Practice

* 현대의 프로그래머들에게 동시성 코드를 작성하는 것이 왜 어려운지, 어느 정도로 어려운지, 알려줌

* 잠금(lock), 세마포(semaphore) 같은 동시성 프로그래밍의 어셈블리 언어를 사용하는 상황을 피해야 하는지 잘 보여주었다.


명령형(imperative), 객체 지향적 언어에서 동시성 코드 작성이 어려운 이유

* 객체 상태나 데이터 값이 기본적으로 변경 가능(mutable)

* 여러 쓰레드에서 공유하는 데이터가 변경 가능하다는 점




함수형 프로그래밍

* 모든 데이터가 기본적으로 변수가 아니라 상수

* 값이 변경 불가능(immutable)

* 값이 변경되지 않는 상수는 많은 쓰레드가 동시에 접근하더라도 동시성과 관련된 문제를 야기하지 않음

* 잠금(lock)을 통해서 보호될 필요도 없고, CPU의 레지스터에 저장되는 캐시 값과 관련된 가시성(visibility) 문제를 일으키지도 않음
* 동시성 프로그래밍의 문제를 멀티쓰레딩 구조물을 통해서 해결하는 것이 아닌 구조물의 필요성 자체를 제거하는 방식



"모든 대입문의 사용을 포기해라! 그러면 놀라운 동시성의 세계로 들어갈 수 있다."

 의심할 여지없이, 만약 메모리의 어떤 위치에 맨 처음 한번만 값을 할당하고 프로그램이 실행되는 동안 이 값을 변경하지 않는다면, 131072개의 프로세서들이 서로 먼저 이 메모리 값을 사용하려고 한다 할지라도 우리는 더이상 신경쓸 필요가 없다.

 이전에는 두 개 이상의 프로세스가 동시에 하나의 메모리 값을 변경하는 경우를 방지하기 위해서 세마포어(semaphores)라는 기술을 사용해야만 했지만, 이제는 그럴 필요가 없다. 왜냐하면, 이제는 더 이상 메모리 값이 변경되는 일이 발생하지 않기 때문이다.


- 로버트 마틴[2] -


참조 투명성

* 정의를 가지고 있는 문장의 어디에서나 동일한 단어라면 그 단어를 서로 맞바꾸어 놓아도 그 문장이 가지고 있는 원래 의미가 절대 변하지 않는 것을 의미


코드의 간결함

* 반드시 필요한 논리와 추상을 추려내서 우아하게 표현

* 디자인 패턴 등의 비본질적인 코드를 제외

* 비본직절인 코드 : 하일스버그는 세레모니(ceremony)라고 표현






Reference

[1] 씨넷코리아, 함수형 프로그래밍이 주목 받는 3가지 이유 (http://www.cnet.co.kr/view/6472)

[2] 함수형 프로그래밍(Functional Programming) 기초 (http://kwangshin.pe.kr/blog/2013/01/21/%EB%B2%88%EC%97%AD-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dfunctional-programming-%EA%B8%B0%EC%B4%88/)

'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

적정 스레드 수치라는 것을 잡는다는게 어렵다.

다음은 [1]에서 본 것으로 윈도우즈 네트워크 프로그래밍이란 책에서 추천하는 스레드의 수라고 한다.


스레드 개수 = ( 프로세스 개수 X 2 ) + 1 


스레드 개수 = ( 프로세스 개수 X 2 ) + 2 


성능 및 안정성에서 위에 수치가 적정하다고 본다.

하지만 최상의 성능을 끌어내기 위한 수치는 아니라고 본다.


적정 스레드 수치가 아닌 최상의 스레드 수치를 끌어내려면

하드웨어 성능과 소프트웨어의 시스템 설계를 고려해서 정해야만 한다.


JBoss 경우에는 512개, Netty의 경우에는 코어의 수만큼이 되어 있다.

Netty가 가지고 있는 스레드 이 기본값(코어의 수)은 스레드가 CPU를 100% 사용한다고 할 때의 수치이다.

만약 각 스레드가 CPU를 10%사용한다면 각 CPU들은 90%가 놀게 되니 최적의 성능을 끌어낼 수 없을 것이다.

JBoss가 갖는 기본값이 512개도 설계상의 이유가 있을것이다.



Reference

[1] GrpStudy ( http://www.gpgstudy.com/forum/viewtopic.php?p=60875 )

'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

작년에 회사에서 한 부장님이 Qt가 정말 좋다라면서 극찬을 했는데 요즘 보니 Qt를 많이 쓰는 것 같다.

늘 관심이 가고 있었는데 오늘 잠시 조사를 해보았다.


Qt는 Qt Development Frameworks에서 나왔다. 이 회사는 과거 Trolltech로서 2008년에 노키아에 인수되면서 노키아 내 그룹으로서 있다.


Qt의 장점은 여러가지가 있지만, Qt의 홈페이지에는 다음과 같이 나와 있다.


"Qt는 크로스 플랫폼 어플리케이션 및 UI 개발을 위한 프레임워크입니다. Qt를 사용하여 애플리케이션을 작성한 후에 소스 코드를 다시 작성하지 않고 다수의 데스크톱과 임베디드 운영 체제에 배포할 수 있습니다."


Qt를 이용하여 C++코드를 작성하면 플랫폼에 구애받지 않고 돌릴 수 있는 것이다. 놀라워라.

EmbedLinux, max OS X, Windows, Linux/x11, Windows CE/Mobile, Symbian, Meego를 지원한다. 이 정도면 거의 모두 지원한다고 해도 되지 않나 싶다.


나는 개인적으로 Java를 좋아했다. Java의 깔끔한 코드와 Java SDK만 설치하면 OS에 구애받지 않고 구동시킬 수 있는 것에 매력을 느꼈다. 하지만 어느정도 수준에 다다르고 나니 메모리 관리를 직접 할 수 없다는 것이 큰 단점이다. 또한 Java는 웹쪽을 제외하고는 시장에서 잘 쓰이지 않는다. 원래 임베디드를 겨냥하고 나온 Java가 왜 이렇게 되었는지는 모르겠지만 C/C++에 비해서 우수한 성능을 낼 수 없다는 점이 크다고 본다.


어쨌든 Qt는 C/C++을 이용하여 작성한 코드를 각 플랫폼에서 구동시킬 수 있다.

각 플랫폼에 맞춰 코드를 재작성할 필요가 없다는 것은 정말 엄청난 장점이다. 거기에서 C/C++의 가독성까지 그대로 가져간다. 정말 매력적이다.


현재 업무상 Qt를 이용하여 개발할 일은 없지만 기회가 되면 써보고 싶다.


Qt의 장점

  • 직관적인 C++ 클래스 라이브러리
  • 데스크톱 및 임베디드 운영 체제에서의 휴대성
  • 크로스 플랫폼 IDE를 가진 통합 개발 도구
  • 임베디드 환경에서 높은 런타임 성능 및 작은 크기


Qt : http://qt.nokia.com/title-ko



'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

정규식은 참 좋은 것 같다. 그러나 그떄 그때 정규식 짜는 것도 참 일이다.

그래서 주로 쓰는 정규식 예제를 모아보았다.



// IPv4
^([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}$"

// IPv6
^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|    1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$


// 한글 완성형
[\uAC00-\uD7A3]

// 영문자
^[a-zA-Z]*$

// 정수
^[0-9]*$

// 실수
^[+-]?\d*(\.?\d*)$

// 이메일
^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\w+\.)+\w+$

// 폰
^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

// 전화
^\d{2,3} - \d{3,4} - \d{4}$

// 주민등록번호
\d{6} \- [1-4]\d{6}



Java에서는 다음과 같이 쓴다.
마지막에 find메소드 호출시 boolean값이 리턴되어서 정규식에 맞는 값인지 확인할 수 있다.

Pattern pattern = Pattern.compile("정규식 표현");
Matcher matcher = pattern.matcher("정규식 검사할 문자열");
matcher.find();




Reference
[1] http://ishyeok.tistory.com/tag/%EC%A0%95%EA%B7%9C%EC%8B%9D
[2] http://easymicro.egloos.com/5461610
[3] http://cafe.naver.com/hermeneus.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=140& 


'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment

자바로 된 핑 프로그램에 대해 분석하다가 이상한 점을 발견했다.
JNI를 이용해서 핑 프로그램을 구현한 것이다. 웹에서 찾다보면 자바로 구현한 소스도 있는데, 왜 굳이 JNI를 썼을까 알 수가 없었는데 책을 찾아보다가 그 이유를 알게 되었다.



핑 프로그램은 ICMP(Internet Control Message Protocol)을 사용하는데, ICMP 패킷은 SOCK_RAW형식의 소켓만을 지원한다. 이런 이유로 자바에서는 제대로 된 핑 프로그램을 구현할 수 없다. 결국 대부분의 자바 네트워크 책에서 소개되는 핑 프로그램은 핑 프로그램을 흉내를 내는것 뿐이다.

SOCK_RAW의 경우는 좀 더 높은 수준의 제어를 하고 싶은 사용자를 위한 것으로, 패킷(Packet)을 전달할 때 패킷이 지나갈 경로까지도 지정할 수 있따. 이는 패킷을 받는 쪽에게 잘못된 경로의 패킷을 전송할 수도 있다는 것을 의미한다. 마치, 이미 접근을 허락 받은 클라이언트인 것처럼 잘못된 내용을 담아서 전송할 수 있다는 것이다. 이러한 이유로 보안상 문제가 발생할 수 있기 때문에 자바 언어에서는 SOCK_RAW를 지원하지 않는다.

자바 IO&NIO 네트워크 프로그래밍에서 발췌.


참고
SOCKET의 3가지 타입 - SOCK_STREAM, SOCK_DGRAM, SOCK_RAW
자바에서는 SOCK_RAW를 지원하지 않음.

Leave a Comment

SVN은 너무나 당연하게 쓰고 있었지만 이슈 관리 시스템에 대해서는 조금 무지했던 것 같다. 나중에 내가 선장이 될 경우에 이런 정도는 선원들에게 제공해줘야겠지.

버전 관리 시스템 [ Revision Control System ]
- 프로그램 수정 파일을 관리하는 시스템
- 소스 코드 모듈을 유지하거나 문서 파일의 수정에 사용
- 대형 프로젝트 수행 시 반드시 필요한 도구
- 소스 히스토리를 관리
- 동시에 소스를 수정하는 것을 방지
- 개발 결과를 합치거나 변경 내용을 추적할 수 있음

SVN [ SubVersion]
- CVS이후에 나옴
- 바이너리 까지 버전관리 할수 있음
- Open Source

이슈 관리 시스템
- 버그 관리 시스템이라고도 함
-  각종 개선점과 버그와 같은 프로젝트의 이슈 트래킹

Trac
- 이슈 관리 시스템중 하나
- SVN과 연동 


Reference
[1] 위키피디아, 이슈관리시스템 비교 (http://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems)
[2] Trac 소개 (http://ko.wikipedia.org/wiki/Trac)
[3] Trac 설치 방법 (http://nogune.blog.me/30092280323
[4] Trac 설치 방법2 (http://pcandme.net/64)
[5] Linux에 SVN 및 Trac 설치 방법 (http://andromedarabbit.net/wp/continuousintegration_2008_02/
[6] Subversion (http://subversion.apache.org/)
[7] 버그관리시스템 사용 현황 (http://allofsoftware.net/111)

'Software > 정리 글' 카테고리의 다른 글

함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27
객체 지향 원칙  (0) 2008.08.21
리소스 지향 아키텍처(ROA)  (0) 2008.07.29

Leave a Comment


C와 Java의 컴파일 과정에 대해서 찾아보는 중에 좋은 책을 찾았다. 국내 웹에는 C의 컴파일 과정에 대한 내용밖에 없었다. Reverse Engineering Software[1]라는 책인데 2장에 컴파일 과정에 대한 내용이 나와 있었다.

1. C Compile
아래는 C의 컴파일 과정이다. 

Figure 1. 컴파일 과정(출처 : [1])

1.1 Preprocessor
C는 다른 언어의 컴파일러와 다르게 전처리 과정이 들어간다. 전처리([3] 참조)는 컴파일에 앞서 필요한 처리를 해주는 것이다. 전처리문에는 다음과 같은 것들이 있다. 

Table 1. 전처리문의 종류
 전처리문 기능 
 #include  디스크상의 파일을 편입
 #define  매크로를 정의
 #undef  정의되어 있는 매크로를 취소
 #if~#dndif  조건부 컴파일
 #line  행번호 제어

소스코드는 전처리 과정을 거쳐 source.c 소스코드를 source.i 파일로 만든다.

1.2 Parser
[5]를 참조하였다.
Parser란 컴파일 과정중 구문 분석을 담당하는 Syntax Analyzer이다. 스트링을 입력으로 받아 문법의 문장이 맞는지 아닌지를 확인하여 아니라면 에러 메시지를 출력한다.

1.3 Translation
source.i 파일은 C 컴파일러인 cc1에 의하여 어셈블리 코드인 like.s로 컴파일한다.

1.4 Assembler
source.s를 as 어셈블러에 의해 어셈블 과정을 거쳐 source.o 오브젝트 파일로 생성한다.

1.5 Linker
source.o 파일은 다시 Linker에 의해 libc.a와 같은 표준 C 라이브러리와 링크하여 최종적으로 실행 파일인 source 파일을 만들게 된다. 

1.6. Disk
1.7 OS Exe Loader

 
 
2. Java Compile 

Figure 2. Java 컴파일 과정(출처 : [1])

자바의 컴파일 단계는 더 상세하게 나온 것이 없었습니다. 

2.1 컴파일
Compiler에 의해서 source.java를 source.class로 만들어줍니다.

2.2 실행
class파일을 JRE(Java Runtime Environment)에 의해서 플랫폼에 상관없이 실행되게 해줍니다.

Reference
[1] 2. The Compile Process (http://www.acm.uiuc.edu/sigmil/RevEng/ch02.html)
[2] JAVA의 컴파일 과정 (http://blog.naver.com/rapha0?Redirect=Log&logNo=110080053861) 
[3] C 컴파일 과정의 전처리문 (http://www.cworldlab.com/CandCplus/c/c-6.htm) 
[4] GCC를 이용한 C소스의 전체 컴파일 과정 (http://ttongfly.net/zbxe/?document_srl=45255)
[5] Parser의 의미 (http://blog.naver.com/ldldldld04?Redirect=Log&logNo=10014127447
 

'Software > 정리 글' 카테고리의 다른 글

적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27
객체 지향 원칙  (0) 2008.08.21
리소스 지향 아키텍처(ROA)  (0) 2008.07.29
검색엔진  (1) 2008.07.17

Comments

  1. 10박대규 2011.10.04 23:12 신고 Permalink Modify/Delete Reply

    #if ~ #dndif
    #endif 아닌가요?

Leave a Comment



난수 발생기
난수를 발생시키는 프로그램
친구의 요청에 의해 아무 생각 없이 제작

기능-_-
  • 지정한 최소값과 최대갑 사이에서 난수를 발생
  • 지정한 추출수만큼 난수를 발생
  • 결과값들을 파일로 저장


 

RandonNumber.zip






'Software > 정리 글' 카테고리의 다른 글

Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27
객체 지향 원칙  (0) 2008.08.21
리소스 지향 아키텍처(ROA)  (0) 2008.07.29
검색엔진  (1) 2008.07.17
REST  (0) 2008.07.09

Comments

  1. 꺼비까비 2010.09.14 22:42 신고 Permalink Modify/Delete Reply

    아, 난수표 찾아 돌아다니다가 우연히 발견했어요. 좋은 프로그램 잘 갈무리 해갑니다.
    감사합니다~

  2. 유니 2011.09.24 13:44 신고 Permalink Modify/Delete Reply

    이거 찾고있었는데 감사히 잘받아갑니다!!

Leave a Comment


to Top