자바

Controller에서 primitive type과 wrapper type의 변형과 유효성검사

최근에 새로 자바/스프링을 공부하는 친구들에게 질문을 받았는데, 문득 어? 잘 모르겠는데 싶어서 테스트해보았다. 과연 @RequestBody에 null 값을 받게 되었을 때, wrapper type에서는 null로 매핑되겠지만, primitive type에서는 NPE가 발생할까? default value인 0이 매핑될까?

결과를 확인해보니,

primitive type에서는 default value인… 더 보기 »Controller에서 primitive type과 wrapper type의 변형과 유효성검사

Mockito에서 Multi-Stubbing 적용하기

Overview 팀에서 초기부터 Junit5를 적용하다보니, MockitoExtension을 제대로 제공받지(?) 못했다. 그래서 오픈소스로 공개되어 있던 것 중에 하나를 그냥 복사해서 프로젝트내에 class를 두고 사용했다. 그러다가 최근에 SpringBoot에서 Junit5를 지원1 해주는 김에 SpringBoot로 의존성 관리하도록 바꿨다. 그랬더니 자연스럽게 Mockito 버전도 올라가고, MockitoExtension이 제공되고… 더 보기 »Mockito에서 Multi-Stubbing 적용하기

Integer.getInteger()의 잘못된 사용

애시당초에 올바른 데이터타입을 사용했다면 문제가 없었겠지만, 레거시 코드에 붙이다보면 타입캐스팅이 필요한 경우가 있다.

  평상시라면, required=true인 값이기 때문에 apache commons를 이용해서 파싱했을 것이다

  그런데 이후에 로직이 변경될 경우(가령, required가 빠진다거나), NumberUtils의 default value = 0으로 적용되면 side-effect이… 더 보기 »Integer.getInteger()의 잘못된 사용

JPA datetime 오류

JPA에서는 persistence context 라는 개념이 있어서, 사실상 DB와 Application 사이에 하나의 proxy가 더 존재한다. 캐시나 관리 등의 측면에서 장점도 분명이 있지만, mybatis와 같이 direct로 데이터를 주고 받을 때와 다르게 data의 sync가 맞지 않으면 곤란한 경우가 발생한다. 그 중에 하나가 datetime… 더 보기 »JPA datetime 오류

MockMvc에서 ExceptionHandler 등록해서 쓰는 방법

단순히 Exception을 throw하면, ExceptionHandler가 Code와 Message를 json형태로 잘 매핑해서 응답하게 됩니다. (추가로 HttpStatusCode까지도 매핑하게 됩니다) 그래서 아래처럼 테스트를 하게 되면 오류가 발생하게 됩니다.

그렇다면 보통 아래처럼 테스트를 고치게 되겠죠?

그러고 나서 테스트를 돌리게 되면 또다른 오류가… 더 보기 »MockMvc에서 ExceptionHandler 등록해서 쓰는 방법

Spring Batch의 getJobParameters()의 동작법

Spring Batch 코드를 만들 때, 보통 아래와 같은 코드를 이용해서 jobParameter를 전달받습니다.

물론 배치를 실행할 때, argument를 주게 되겠죠.

그런데 말입니다… maxCount=1 숫자입니다. 그렇다면, 아래와 같은 코드도 가능하지 않을까요?

실제로 JobParameters는 getLong(), getString(), getDate(), getDouble() 메소드를 지원합니다.… 더 보기 »Spring Batch의 getJobParameters()의 동작법

FastDateFormat(SimpleDateFormat) 오동작

// Wed Apr 29 00:00:00 KST 2015 FastDateFormat.getInstance(“yyyyMMdd”).parse(“20150429”); // throws ParseException FastDateFormat.getInstance(“yyyyMMdd”).parse(“2015”); // Thu Mar 16 00:00:00 KST 81724 FastDateFormat.getInstance(“yyyyMMdd”).parse(“20150429113100”);   위와 같은 내용이고요, DateFormat과 입력값의 형태가 다를 때 결과가 다르게 나옵니다. yyyyMMdd 포맷이고, 20150429 인 경우는 정상적으로 2015/4/29로 파싱되구요(시간은… 더 보기 »FastDateFormat(SimpleDateFormat) 오동작

SimpleDateFormat은 Multi-thread 환경에서 쓸 수 없다.

java.lang.ArrayIndexOutOfBoundsException: 13 at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:454) ~[na:1.7.0_45] at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2333) ~[na:1.7.0_45] at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2248) ~[na:1.7.0_45] at java.util.Calendar.setTimeInMillis(Calendar.java:1140) ~[na:1.7.0_45] at java.util.Calendar.setTime(Calendar.java:1106) ~[na:1.7.0_45] at java.text.SimpleDateFormat.format(SimpleDateFormat.java:955) ~[na:1.7.0_45] at java.text.SimpleDateFormat.format(SimpleDateFormat.java:948) ~[na:1.7.0_45] at java.text.DateFormat.format(DateFormat.java:296) ~[na:1.7.0_45] 위처럼 에러가 나고, 확인했더니 SimpleDateFormat은 thread-safe 하지 않다고 한다. 멀티 스레드 환경에서 값의 변조에… 더 보기 »SimpleDateFormat은 Multi-thread 환경에서 쓸 수 없다.

자바 value validation의 코드 스타일별 비교

회사에서 정보 공유 메일중에서 Guava의 Precondtion을 이용하자는 의견이 있었다.  평소에도 Guava를 많이 사용하긴 했는데, 말나온김에 구글링을 한 번 해봤다.

특별히 장단점이 없다면 개인의 취향에 따라서 골라서 써도 좋을 것 같다. 하지만 내생각(원작자 블로거의 생각도..)에는 Guava가 제일 나은 듯. 출처… 더 보기 »자바 value validation의 코드 스타일별 비교

java.lang.NoClassDefFoundError: org/mockito/mock/MockName

powermock을 적용하는데 위와 같은 에러가 발생했다. 처음에는 powermock을 잘못 사용한 줄 알고 이래저래 삽질을 많이 했는데… https://code.google.com/p/powermock/wiki/MockitoUsage13 위 글에 확인하면 mockito와 powermock 끼리 서로 지원되는 버전이 달랐다. mockito는 1.9.0을 사용했는데, powermock은 1.5버전을 사용해서 생긴 문제. 버전을 호환되는 것으로 맞추니 해결되었다.… 더 보기 »java.lang.NoClassDefFoundError: org/mockito/mock/MockName