2016년 10월 25일 화요일

MyBatis Java 8 관련 TypeHandler 설정 불필요

일전에 'Spring Boot war에서 MyBatis 사용시 TypeHandler scan 오류가 발생하는 현상' 이라는 글을 이곳에 썼었다.

시간이 지나 해당 글의 문제에 대한 패치가 되었다.

mybatis 3.4.0 이후 사용자는 더이상 java 8의 typehandler를 따로 선언할 필요가 없이 아래 dependeny만 추가하면 알아서 typehandler가 등록된다.
mybatis-typehandlers-jsr310

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.1</version>
</dependency>

또한 boot war에서 mapper xml을 찾지못해 추가로 선언하던 SpringBootVFS 설정도 더 이상 하지 않아도 된다. (이 부분에 대한 릴리즈/패치 노트는 찾지 못했다.)

2016년 10월 17일 월요일

spring DispatcherServlet이 강제하는 이름들

boot를 사용하다보면 빈 생성을 참 편하게 할 수 있어 좋다.

ContitionalOnMissingBean 만 확인하고 개별 구현하고 연계처리를 별달리 하지 않아도 알아서 가져가서 써주니 편하다.

하지만 이따금 안되는 케이스들이 있는데 이번에 겪은 경우가 그랬다.

CookieLocaleResolver를 별도로 구현할 일이 있어 생성한 후 빈선언을 해주었는데 디버그를 해보니 acceptHeaderLocaleResolver (기본 LocaleResolver)을 사용하는 것이다.

boot의 설정상으론 해당 빈이 있는 경우 기본 LocaleResolver를 생성하지 않도록 되어 있는데 어째서 그런 것인가 살펴보니 boot가 아닌 spring mvc의 dispatcherServlet이 강제로 bean name을 고정해서 사용하고 있었다.

기본적으로 1개만 등록하는 빈들에 대해서 강제한 사항인 듯 싶다.

다음과 같은 이름들이 고정된 이름들이다.

  • multipartResolver
  • localeResolver
  • themeResolver
  • handlerMapping
  • handlerAdapter
  • handlerExceptionResolver
  • viewNameTranslator
  • viewResolver
  • flashMapManager


이런 빈들에 대해서는 다음과 같이 이름을 지정하고 사용해야 한다.
@Component("localeResolver")
public class MyLocaleResolver extends CookieLocaleResolver {
    // 구현
}

2016년 10월 13일 목요일

int array 를 list 로 변환하기

array 를 list로 변환할 때 보통 다음과 같이 사용한다.
String[] strings = new String[] {"a", "b", "c"};
List<string> stringList = Arrays.asList(strings);

이 변환은 non primitive 타입에 대해서만 가능한 변환이다.

만약 primitive 타입인 int array를 Arrays.asList를 사용하면 반환값은 다음과 같다.
int[] ints = {1, 4, 3};
List<int[]> intList = Arrays.asList(ints);

즉 Arrays.asList를 통해 primitive 타입을 list로 변환을 할 수 없다.

다음과 같이 변환해야 한다.
int[] ints = {1, 4, 3};
List<Integer> intList = Arrays.stream(ints).boxed().collect(Collectors.toList());