Engineering/Java 28

CompletableFuture 기능 살펴보기

Java 5 에 추가되었던 Future 는 다음과 같은 제한 사항이 있다. 1. 수동(manually)으로 완료시킬수없다. 예를 들어 remote API 로 이커머스 상품의 가장 비싼 상품을 가져오는 기능을 작성하는데 스레드를 분리해서 해당 기능에서 Future 로 반환하고자 한다. 이때 리모트 API 서비스가 down 이 되면 Future 를 수동으로 완료시킬 수 없다. 2. Future 의 결과값을 블럭킹 없이 더 이상의 행동(action) 을 수행할 수 없다. Future 는 완료를 공지하지(notify) 않는다. 그래서 get() 메소드로 결과가 나올때까지 블럭(block)해야한다. 3. 멀티 Future 들이 서로 묶을(chain) 수 없다. 시간이 긴 연산을 실행해야하고 그 연산이 끝났을때 다..

Engineering/Java 2019.08.23

java 8 stream API 실행시간 비교

java 8 에 포함된 stream 을 사용해서 foreach 문과 비교해서 수행 시간이 얼마나 차이 나는지 비교를 해보았다. ※ 환경은 i7-4790 3.6GHz, 16GB, 윈도우 머신에서 테스트했다. 30 만개의 랜덤한 수열에서 (i % 2) == 0 조건을 만족하는 숫자들의 갯수을 구해보았다. @Test public void streamExecutionTimeTest() { List list = new ArrayList(); Random random = new Random(); for (int i = 0; i < 300000; i++) { list.add(random.nextInt()); } StopWatch stopWatch = new StopWatch(); stopWatch.start(); S..

Engineering/Java 2019.08.22

MySQL insert all on update MyBatis 쿼리문

MySQL DB 에 MyBatis(마이바티스)로 다수의 데이터를 insert 와 update 를 동시에 하려고 쿼리문을 찾아보았다. 여러건의 데이터들은 마이바티스 쿼리문에 파라미터로 구문으로 list 형태의 데이터를 전달할 수 있다. 그런데, "on duplicate key update" 뒤의 문장을 완성하려고 하니깐 어떤 식으로 쿼리문을 작성해야할 지 난감했다. 다음 쿼리문처럼 list 에서 insert 하다가 동일키에 대해서 update 를 할때, list 의 현재 위치값을 표시해야하는데 일단 방법을 몰라서 문의 #{element.type} 으로 하고 테스트를 해보니깐 list 의 맨 마지막 값으로 모든 값들이 update 되어 버렸다. insert into tbl_word(word, type, mo..

Engineering/Java 2016.07.08

Thymeleaf 에서 자주 사용하는 예제

Thymeleaf 에서 자주 사용하는 예제들을 정리해본다. * Javascript 에서 비교 연산자- Thymeleaf 에서 '' 태그를 엄격하게 검사하기 때문에 자바스크립트 코드가 포함되어 있다면 [[CDATA]] 로 묶어줘야한다. ... function checkLevel() {var rate = $("#level").val();/*if (rate > 100) {alert("레벨은 100 이하의 숫자여야 합니다.");return;} /*]]>*/} * 조건식- 로 테이블 형태의 데이터를 표시할때, 값의 존재 유무에 따라서 컬럼값을 다르게 표현하는 경우 - if / unless 사용0 - ? 이항 연산자 사용 - switch / case 사용접속레벨업만료 * select 사용- 컨트롤러에서 List 를..

Engineering/Java 2016.05.18

이클립스(STS) 에서 프로젝트 폴더 관리

이클립스(STS) 에서 프로젝트 폴더 관리 이클립스의 왼쪽 프로젝트 창에서 프로젝트들을 추가하다보면, 수많은 프로젝트들 사이에서 소스 찾아서 클릭하는 것도 일이 된다.관련 프로젝트끼리 묶어서 관리하려고 처음에는 프로젝트 창에서 폴더를 생성할까 생각했었는데, 방법을 찾아보니 "working set" 을 이용하라는 글들이 많이 보인다.다음 그림과 같이 두개의 폴더를 생성해서 프로젝트들을 관리하기로 했다. 사용하는 툴인 STS 의 워크스페이스 폴더에서 보니 "module", "business" 는 생성되지 않았다. 아마도 가상폴더 식으로 따로 관리되는게 아닌가 싶다. working set 설정 방법1. STS/eclipse 의 "Package Explorer" 에서 "View Menu"(▽ 모양)을 클릭하고,..

Engineering/Java 2016.03.24

jackson 라이브러리 deserialize 오류

jackson 라이브러리 deserialize 오류- Class com.fasterxml.jackson.databind.deser.std.NumberDeserializers$BooleanDeserializer has no default (no arg) constructor : XML 데이터중에서 boolean 데이터 형태가 boolean 형태가 아닐 경우에 발생. XML 문자열을 다음 Test 클래스로 deserialize 할때, B 요소(element) 가 true/false 형태이어야하는데, 0 또는 1일 경우가 있다. 이럴 경우에는 따로 BooleanDeserializer 를 작성하고, 해당 클래스의 필드에 annotatin 을 표시해야한다. class Test { public int A; publ..

Engineering/Java 2016.01.04

java version 변경(update-alternatives)

update-alternatives 명령어를 사용해서 자바 버전 변경 centOS 에 기본 설치된 open-jdk 를 사용안하고 oracle 홈페이지에서 다운받아서 jdk 를 설치하고자 할때, 이미 설치된 OpenJDK 를 삭제해도 되지만 open-libre 등 자바를 사용하는 어플리케이션이 많아서 dependency 문제가 발생한다. (보통 그런 오피스 제품들을 사용안하기 때문에 다 지워버려도 되겠지만....) 기존 OpenJDK(1.8.0_65) 를 그대로 두고 오라클 jdk(1.8.0_66) 를 설치하고, update-altenatives 명령어를 이용하면 자바 기본 패스를 변경할 수 있다. 아래에서 jdk1.8.0_66 부분은 JDK 버전에 따라서 변경될 수 있다. 1. open-JDK 버전 확인..

Engineering/Java 2015.12.03

com.fasterxml.jackson.databind.ObjectMapper 와 org.codehaus.jackson.map.ObjectMapper 차이점 비교

com.fasterxml.jackson.databind.ObjectMapper 와 org.codehaus.jackson.map.ObjectMapper 차이점 비교 먼저 두개를 비교하자면 com.fasterxml.jackson.databind.ObjectMapper 가 2.X 이고, org.codehaus.jackson.map.ObjectMapper 가 2.X 이전 버전이다.(https://groups.google.com/forum/#!topic/jackson-user/CSFwq72lZC8) Jackson 라이브러리의 ObjectMapper 를 가지고 JSON 변환 작업을 하는데, 두 가지를 혼용해서 사용하다가 Date 관련 필드를 변환하다가 차이점이 있다는 것을 발견했다. @JsonFormat(shape..

Engineering/Java 2015.11.18