콘텐츠로 건너뛰기

java

Base64 encode 와 encodeUrlSafe 차이

Base64 인코딩을 사용하고 있는데, java.lang.IllegalArgumentException: Illegal base64 character 2b 오류가 발생하여 디버깅하다가 알게된 내용을 정리한다. 컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩… 더 보기 »Base64 encode 와 encodeUrlSafe 차이

Guava Joiner/splitter 활용

나는 variable type을 정확하게 하는 편을 좋아하는데, 외부API를 연동하게 되면 어쩔 수 없이 텍스트를 다루어야 할 때 생긴다. 그럴 때마다 Guava 유틸 클래스들을 자주 이용하는 편인데, 특히 Joiner는 오래 전부터 사용하고 있었다. 그러다가 최근에 아래 로직을 refactoring하려다보니 Joiner의 반대 기능이… 더 보기 »Guava Joiner/splitter 활용

Lombok @ExtensionMethod 오류

Lombok에서 getter/setter/constructor/log 등을 만들어주는 기능을 아주 잘 사용하고 있다. 이제는 lombok이 없으면 개발을 하기 힘들 지경. 새로운 회사에 와서 가장 먼저 pom.xml에 추가하자고 주장했던 것 중에 하나도 lombok이었다. 최근에는 Lombok Experimental도 관심을 많이 가지고 @UtilityClass와 같은 걸 잘 사용하고 있다.… 더 보기 »Lombok @ExtensionMethod 오류

PowerMock 예제

예전에 PowerMock사용법(final class의 테스트)라는 제목으로 블로깅을 한 적 있다. 그게 2011년 7월이니까 근 6년 가까이 PowerMock을 사용할 일이 생기지 않았다. 단순히 SpringRunner나 Mockito만으로도 충분한 테스트를 만들 수 있었다. 그런데 최근에 작업중인 프로젝트에서 시간에 의존하는 테스트가 존재했다. 그래서 평소에는 Ignore시키고 있다가… 더 보기 »PowerMock 예제

@SuppressWarnings 활용

Overview 나는 @SuppressWarnings 를 별로 좋아하지 않는다. 코드를 잘 만들면 되는데, 굳이 정적분석을 무시할 필요가 없다는 생각때문이다. 그런데 코딩을 하다보니 반드시 써야할 경우가 생겼다. 단순히 IDE에서 노란 밑줄을 보고 무시해도 되지만, 불필요한 경고가 너무 많아지면 정말 필요한 경고를 무시하게 되는 경향이… 더 보기 »@SuppressWarnings 활용

ModelAndView의 addObject() 분석

최근에는 API서버만 개발하다보니 RestContoller만 다루다가, 간만에 ModelAndView를 다룰 일이 생겼다. 오랜만에 ModelAndView를 사용하니 Object를 어떻게 추가해야하는지 기억이 가물가물해서 찾아본 김에 기록을 남긴다. ModelAndView를 다룰 때는 단순히 return new ModelAndView("/foo");와 같이 쓰는 경우는 드물고, 대부분 아래처럼 object parameter를 mapping해서 사용하게 된다.

위의… 더 보기 »ModelAndView의 addObject() 분석

Java8에서 interface 변경

자바8에서 interface에 default라는 지시자가 추가되었다. 원래 자바의 interface에는 구현체가 들어갈 수가 없었다. 느슨한 결합에 대한 최소한의 제약 사항과 상수정도를 지정해줄 수 밖에 없었다.

만약 여러 가지 객체에서 사용되는 공통 메소드를 지정하고, 필요한 경우에만 다르게 지정하고 싶으면 abstract class를 사용해야만… 더 보기 »Java8에서 interface 변경

JPassKit 적용중 오류 발생

서비스에서 ios wallet을 제공하려고 하니, 예전과는 다르게 서버단 통신을 통해 인증받는 절차가 추가로 생겼단다. 다만, 애플에서 제공하는 서버쪽 데모를 보면 ruby로 만들어져있다. 왜 하필 루비인가? swift도 아니고… 여튼 그걸 java로 porting하려니 이미 만들어 놓은 것이 있을 것 같아서 구글링했더니, jpasskit이 그나마… 더 보기 »JPassKit 적용중 오류 발생

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 오류