본문 바로가기

Programing/JVM(Java, Kotlin)

guava MyBatis에서 괜찮은 쓰임새

구아바: https://github.com/google/guava


iBatis에서 queryForList를 사용할 때 파라메터 클래스는 하나만 가능하다.

여러개 이상을 넘길 경우에는 클래스를 만들던지 컬렉션에 넣게 된다.


아래와 같은 코드가 있다고 치면

// String id, name

Map<String, String> params = new HashMap<String, String >();

params.put("id", id);

params.put("name", name);

// params는 인자로 쏙


구아바를 이용하면 세 줄이, 다음과 같이 한 줄로 가능하다.

ImmutableMap.of("id", id, "name", name)


ImmutableMap<K, V> of의 오버로딩이 여러개 있는데 인자가 가장 많은 것의 형태가

(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)

인 걸로 봐서 인자는 5개까지 가능한 것 같다.


주의해야 할 점은 인자로 들어가는 값이 null일 경우 NullPointException이 발생할 수 있다는 것이다.

다음과 같은 방어 코드 잊지 말자!

if (CollectionUtils.isEmpty(name)) {
throw new IllegalArgumentException("Missing parameter: name was null or empty.");
}

(위의 CollectionUtils는 org.springframework.util의 CollectionUtils이다)


또한 리스트 인스턴스를 생성시에 new ArrayList()등을 사용할 수 있는데, 구아바의 정적 유틸리티 메서드를 이용할 수 있다.

List<Long> ids = new ArrayList<Long>();
ids.add(33961072L);
ids.add(37257834L);

대신에

List<Long> ids = Lists.newArrayList(33961072L, 37257834L);

로 사용할 수 있다.


만약, 메서드의 인자처럼 왼쪽 변수(LHS: left hand side)가 없을 경우 타입 추정을 할 수 없기에 아래와 같이 에러가 난다.


그럴 경우 아래와 같이 사용을 하면 추정이 가능해지기 때문에 에러가 사라진다.

Lists.<Long>newArrayList();

참고로, 구아바의 코드가 아래와 같이 되어 있다.

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}