guava Lists.transform

Java 2014.10.21 11:46

요즘 많이 사용하는 라이브러리중 하나가 Guava인데요

Guava의 Lists.transform 사용시 주의(?)해야 하는 부분이 하나가 있습니다.


오늘 코드리뷰를 동료와 하다가 발견한 부분인데요...


Lists.transform을 사용하는 경우 TransformingRandomAccessList 객체가 반환되는데요

이 List 구현체는 일반적으로 알고 있는 ArrayList와는 조금 다르게 동작합니다.




1번의 transform 메서드의 결과가 어떻게 나올까요?

우리가 알고있는 일반적인 ArrayList라면 기존에 가지고 있던 1,2,3 String에 "11"이 붙어서

결과가 나와야하지만 실제로 돌려보면 1,2,3이 나옵니다.


그럼 구현체를 볼까요?


  @Override public T get(int index) {
return .apply(.get(index));
   }

function.apply를 사용해서 return합니다.


바로 transform에서 넘겨준 Function 객체를 들고 있다가 실제 객체가 요청될때 transform을 처리하여 주는 것이죠.

지연처리를 내부적으로 구현한 List입니다.


때문에 일반적인 ArrayList를 사용하듯이 안의 객체를 get으로 꺼내어 값을 setting하면서 List가 들고있는 객체의 값이

변경될거라고 생각하고 사용하면 큰 낭패를 보게됩니다.


transform의 결과를 일반적인 ArrayList로 받고 싶은 경우에는 Itrables.transform을 사용하면 됩니다.

Posted by 용식
Posted by 용식
TAG java, map

[펌] OOP Basic

Java 2014.06.07 23:49

http://beginnersbook.com/


http://vandbt.tistory.com/39


http://vandbt.tistory.com/10

Posted by 용식

[Joda] DateTime Convert

Java 2014.05.28 13:30
Posted by 용식

[Java] Map.Entry

Java 2013.11.28 14:01

for(ClassA key : myMap.keySet()) {

    System.out.println(key);

    System.out.println(myMap.get(key);

}


보다는..


for(Map.Entry<ClassA, ClassB> entrie : myMap.entrySet()) {
    System.out.println(entrie.getKey());
    System.out.println(entrie.getValue());
}

Posted by 용식
TAG java, map

몇개월전에 현기형님의 주도하게 팀 프로젝트를 간단하게 진행한적이 있습니다.

그때 형님께서 Spring-data-Jpa + QueryDSL로 프로젝트 셋팅을 하셨고 그에 맞춰서 간단하게 진행을 했었습니다.

그전까지 ORM을 책으로만 봐왔던 저에게는 처음 경험하는 ORM이 신기할뿐이었는데요... 그 아쉬움으로

따로 JPA 설정을 하면서 포스팅을 하기도 했었습니다.

(http://devyongsik.tistory.com/640)


그리고 한참 잊고 지내다가 이번에 CMD를 하면서 제가 다시 한번 프로젝트 셋팅을 할 기회가 생겼는데

프로젝트 리딩하시는 빌리님과 협의하여 Spring-data-jpa로 한번 다시 해보기로 하였습니다.


많은 부분을 현기형님께서 만드셨던 build.gradle을 참조하여 작업을 하였고..

실제 프로젝트를 진행하면서 "와.. 이거 너무 편하다.. 신세계다" 라는 생각을 하게되면서

좀 더 이 JPA을 더 경험해보고 싶어졌습니다.


아무튼 spring-data-jpa의 매력에 푹 빠졌습니다.


그래서 앞으로 자주 써보고 싶은데.. 아무리 maven이나 gradle이 있어도 파일럿을 만들려고 할 때마다 

뭔가 셋팅하고 하는게 귀찮습니다. 그냥 rails server 이런것처럼 되었으면 좋겠어요...


하지만 자바에서 그럴 수는 없죠. 그래도 최대한 귀차니즘을 존중하여 

spring-data-jpa, spring-data-jpa + queryDSL로 각각 프로젝트 템플릿을 만들어

github에 올려보았습니다. 마찬가지로 현기형님의 build.gradle을 참조하여.. 조금 제 생각대로 수정을 하면서 스크립트를 작성하였습니다.



간단한 웹어플리케이션설정과 테스트케이스등이 포함되어 있습니다.

위의것은 spring-data-jpa + hibernate이고..

아래것은 거기에 queryDSL이 추가되었습니다.


clone 받으신 후 이클립스의 경우 "gradle eclipse"를 실행하시면 됩니다.

dsl 프로젝트의 경우 Entity를 만드신 후 Q~ 자바 소스 생성을 위해 다시한번 gradle eclipse를 실행하시면 됩니다.

이 부분은 다른 task로 빼던가 해야겠어요..


intelliJ의 경우는 자동으로 인식됩니다.


공부를 하려는 것이 목적이다보니 설정이나 API를 사용하는 방법이 best practice는 아닙니다.

그럼에도 불구하고 잘못된 부분에 대한 조언을 듣고 싶기도해서 이렇게 포스팅해봅니다.


감사합니다.

Posted by 용식

How Lombok works

Java 2013.07.23 06:08

 http://stackoverflow.com/questions/6107197/how-lombok-works

Posted by 용식
TAG Lombok

마찬가지로 "테스트 주도 개발로 배우는 객체 지향 설계와 실천"의 4부에 나오는 예제입니다.

전체적인 책의 내용은 Swing 소스라서 눈에 잘 안들어와서 읽기가 힘들었는데.. 4부는 일반적인 상황에 대한 이야기라서 잘 읽히네요..;; 편식도 아니고..편독을...


아무튼.. 테스트 케이스 가독성 높이기에 대한 예제 코드 2개입니다.




1. 첫번째 코드는 테스트 케이스의 메서드명을 테스트 대상 객체의 메서드명을 그대로 쓰거나, 의미없는 메서드명을 사용하지 말고, 기능을 설명하는 형태로 메서드명을 작성하라는 것입니다. TO-BE 코드를 보시면 메서드명이 상당히 길게 작성이 되어있는데요, 이 책에서는 어차피 이 메서드를 누군가 직접 쳐서 사용할 일이 없으므로 아무리 길어도 상관없다라고 하고 있네요.  그리고 채수원님께서 쓰신 책 TDD 관련 책에도 있는것처럼 한글등으로 메서드명을 작성하면 Junit 테스트 결과가 그대로 훌륭한 보고서가 될 수 있습니다.

2. 설명을 하는 Assert 구문인데요, 단순히 assert를 사용해서 expected, but was 만 나오게 할것이 아니라 앞에 간단한 설명 구문을 붙여주면 테스트 결과 자체가 훨씩 읽기 좋아질것이라는 예제입니다.



또한 String 메시지로 단정문을 작성해야 할 때 간혹 공백문자등으로 Fail이 나는 경우가 있습니다.

이런 경우에도 문자 자체가 중요하다고 하면, indexOf와 같이 문자열이 들어있는지를 파악할수 있는 메서드등을 사용하는 것도 방법이 될 수 있습니다.

Posted by 용식

먼저 "테스트 주도 개발로 배우는 객체 지향 설계와 실천" 책의 22장에 나오는 예제 코드임을 밝힙니다.


책을 읽던 중 평소에 테스트케이스를 작성하면서 가장 귀찮았고 보기 안 좋았던 부분에 대한 해결방법이 나와서

gist에 정리 후 블로그를 이용하여 포스트해봅니다.




1. Sample1.java
테스트를 위한 객체가 필요한데 이 객체를 생성하기위해 위와 같이 다수의 객체 혹은 String등을 입력해줘야 할때 사용 할 수 있는 방법입니다. Builder 클래스를 작성하는 것..

2. Sample2.java
비슷한 객체를 다수 생성해야 할때가 있습니다. 특정 필드의 값만 다른... 그럴때 사용하는 방법입니다.

3. Sample3.java
2의 예를 사용해서 테스트 데이터를 생성하다보면, 비슷한 이름의 필드에 대해서 값을 설정할때 문제가 발생 할 수 있습니다. 위 코드에서는 orderWithGiftVoucher의 discount 필드가 0.10으로 셋팅이 된 상태이죠. 하지만 코드상으로 이 부분이 명확하게 드러나지 않습니다. 그럴 때 Builder를 넘겨주거나 혹은 현재 상태를 지닌 Builder의 사본을 반환하는 팩터리 메서드(but())를 추가하는등의 방법입니다.

4.Sample4.java
Builder의 조합의 경우 build() 메서드의 다수 출현으로 코드가 산만해집니다. 이럴때 사용하는 방법이며, 팩터리 메서드를 이용해서 도메인 모델을 강조하는 방법도 나와있습니다.


gist가 파일마다 링크가 생성되면 좋은데.. 그렇게는 안되네요... :)

Posted by 용식

http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar


<target name="jar" depends="compile" description="Create one big jarfile.">
    <jar jarfile="${output.dir}/deps.jar">
        <zipgroupfileset dir="jars">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>
    <sleep seconds="1" />
    <jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
        <zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
        <manifest>
            <attribute name="Main-Class" value="com.mycompany.MyMain" />
        </manifest>
    </jar

</target>




Posted by 용식
TAG jar