
객체에 분류와 구현에 대해 공부하다보면 VO(Value Object)라는 용어를 알게되고, VO를 공부하면 대표적으로 등장하는 예시가 Money 클래스이다. long이나 BigDecimal 같은 숫자를 다루는 타입으로 통화를 표현하게 되는데 이런 타입을 사용하지 말고 직접 통화를 의미하는 타입을 만들어서 표현력을 올리고, 통화의 책임을 다루라는 의미다. 테스트주도개발이라는 책에서도 Money 클래스를 TDD로 만들어가는걸로 책을 시작한다. java에서는 JDK 안에 time 패키지를 제공함으로써 날짜에 대한 표준 구현 클래스들을 제공한다. 언어표준이기 때문에 대부분의 라이브러리에서도 지원하고 있어 날짜나 시간을 직접 구현하거나 String같은 타입으로 표현하는 경우는 드물다. 미처 몰랐는데 통화에 대해서..
소스 레벨 애노테이션을 정의하고 컴파일을 할때 아래와 같은 에러가 발생했다.. javac -processor processor compileJava 명령어를 치니까.. error: Could not instantiate an instance of processor 'com.yong.java10.AnnotationProcessor' 1 error 왜 안되는건지 정말 오랜시간 탐구했는데....내가 processor 클래스의 접근제어자를 default 로 해놨었다 ㅡㅡ;;IDE가 만들어주는대로 썼으면 public이 붙어있었을텐데 다른데서 작성하고 복붙하다가.... 이것때문에 주말 몇시간 날렸다.
스프링에서 AOP를 구현하는 방법중 하나가 dynamic proxy 를 이용하는 방법이다. 특별한 내용은 아니고, dynamic proxy 를 직접 구현해보는 포스팅을 하나 하고자한다. public interface Inter { String toMessage(); } 먼저 인터페이스를 하나 정의해준다. 예제를 위한 인터페이스라 대충 만들었다. 이제 proxy 를 구현해주자. Proxy 클래스에있는 팩토리메서드를 호출하면 된다. public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)(호출해야할 메서드) 파라미터들을 확인해보자. 클래스로더와 구현해야할 인터페이스, 그리고 호출핸들러를 필..
API 문서화 도구로 swagger 를 세팅하는데 objectMapperConfigurer bean을 생성하다가 예외가 발생하는 경우가 있다. 그러면서 java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 이런 에러메세지가 나올수있는데 당황하지말고 jackson 의존성이 있는지 확인해보자. 레거시 프로젝트에 swagger 를 설정하고있는데, jackson이 없을거라는 생각은 전혀 못하고있어서 삽질을 좀 했다.
JDK6로 돌아가고있는 서버를 JDK8로 업그레이드를 해야했다. 자세히말하면 JDK 뿐만아니라 Spring3을 Spring5로, Tomcat6를 Tomcat8로 함께 업그레이드를 진행했다. Spring 버전이 변경되면서 인터페이스자체가 변경된 몇가지 부분외엔 크게 수정이 필요하지않았다. 수정해야할 부분을 모두 수정하고 서비스에 투입하자 갑자기 예외로그가 쭉쭉 올라오기 시작했다. 기존 JDK6에서는 발생하지않았던 문제이며, 발생한 예외는 ConcurrentModificationException 이었다. 예외로그가 쭉쭉 쌓이다보니 일단 서비스에서 제외하고 원인을 찾기시작했다. 보통 ConcurrentModificationException은 Iterator가 반복하고있을때 내부에서 remove등으로 Colle..
아직 Java9을 사용해본적은 없지만 Java9이 나오고 초창기에 롬복을 사용할 수 없다는 이슈를 들은적이 있다. Java9을 할일이 없어서 크게 신경은 쓰지않고 있었는데 얼마전 롬복의 버전업을 할일이 있었다. 기존사용버전은 1.16.14였고, 1.16.20까지 나와있길래 최신버전으로 업데이트를 했다. 그리고나서 테스트를 실행하니 여기저기서 테스트가 깨지는 문제가 발생했다. 주로(전부다) jackson을 이용해 json을 deserialize 하는 코드에서 테스트를 실패했는데 롬복이 만들어주는 생성자가 기존코드와는 다르게 변경됐다. @AllArgsConstructor public class Person { private int age = 30; private String name; } 이 코드를 롬복 버..
class 파일을 역어셈블리할때 사용하는 명령어 javap -c .class
자바를 이용해 파일 입출력 작업시 주로 io 패키지를 이용하게된다. io를 다듬은 nio(new io) 패키지가 처음 등장한게 JDK1.5 이니 상당히 오래된 셈이지만, 상당수(내가 본 바로는 전부 다) 자바 입문서들과 블로그들이 파일입출력을 io 패키지로 소개하고있어 nio에 대해 잘 모르는 개발자들이 많다. 요즘 논블럭킹(Non-Blocking)이 이슈가 되면서 io를 논블럭킹으로 처리해주는 nio도 많이 주목을 받고있는데 이 때문인지 nio 의 n 이 non blocking인줄 알고있는 분들도 많다. 하지만 위에 괄호에 써놨듯 n 은 단지 new이며, 1.7에는 nio2 패키지가 추가되어있는 상태다. 패키지작명에 좀 실패한 케이스가 아닌가 싶다. 이번 포스팅에서는 nio를 깊게 들여다보는것보다는 아..
자바를 이용해 외부 자원에 접근하는 경우 한가지 주의해야할 점은 외부자원을 사용한 뒤 제대로 자원을 닫아줘야한다는 점이다. public static void main(String[] args) { FileInputStream fis = null; try{ fis = new FileInputStream(""); }catch(IOException e){ }finally { fis.close(); } } 이정도로 끝나면 좋겠지만 문제는 저 close() 메서드도 Checked Exception 인 IOException 을 던지므로 이런 코드가 나타난다. public static void main(String[] args) { FileInputStream fis = null; try{ fis = new File..
얼마전 사내에서 작업했던 내용이다. 간단한 코드긴하지만... 코드는 각색해서 해당 내용을 포스팅하고자 한다. 1. Utils 클래스1-1. Utils 클래스 생성 요구사항 * 현재 전화번호, 주민번호, 카드번호 데이터는 - 없이 순수 숫자로만 저장되어있다. * 해당 데이터를 노출할때 -를 추가하고싶다. 음...뭐 딱히 어렵지 않은 내용이다. 어떤 내용으로 작업할지 고민을 했고, 특정 상태에 얽매이는게 아니라 인자로 넘어오는 값의 양식만 변경하면 되니 정적 메서드로 만들어도 충분하다고 판단했다. 그렇게 FormatUtils 클래스가 추가됐다. class FormatUtils { private static final String TEL_NO_PATTERN = "(02|0[\\d]{2})([\\d]{3,4})..
- Total
- Today
- Yesterday
- Design Pattern
- JavaScript Core
- TEST
- JPA
- go-core
- spring cloud
- java
- DesignPattern
- db
- java8
- javascript
- code
- http
- EffectiveJava
- frontcode
- Jackson
- 정규표현식
- frontend개발환경
- clean code
- generics
- toby
- Git
- OOP
- mariadb
- programming
- Kotlin
- backend개발환경
- servlet
- Spring
- MySQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |