자바에서 Map 데이터를 loop를 돌리면서 가져오는 방법은 한가지만 있는 것이 아니다. 게다가 Stream이 지원이 되는 1.8부터는 더더욱 그 방법들이 늘어났는데 방법들을 정리해보고, 성능을 비교해보도록 한다. 고전적인 방법들 Iterator 방식 public static void main(String[] args) { Map map = new HashMap (); for(int i = 0; i < 1000000; i++) { map.put("key" + i, "value" + i); } long startTime = System.currentTimeMillis(); iteratorloop(map); long endTime = System.currentTimeMillis(); System.out.pr..
불현듯, 자바에서 제공하는 랜덤함수의 속도 차이가 있을까 궁금해서 테스트를 해보기로 했다. 자바는 기본적으로 java.util.Random 클래스와 Math 클래스에서 제공하는 random이 있는데 둘의 차이점은 Math는 별도로 import를 할 필요가 없고, Random은 import하는 대신 좀 더 자유롭게 커스터마이징 할 수 있다는 정도가 있을 수 있겠다. Random 클래스로 1000만번 nextInt 호출하기 우선 가장 많이 사용되는 Random 클래스의 nextInt를 1000만번 호출해보도록 한다. 다만 예제에서 nextInt값을 total로 담은 후, 최종적으로 total값을 뿌린다. 이렇게 한 이유는 보편적으로 Random을 사용할 때 정수값을 많이 호출하기 때문이다. import ja..
포조(Plain Old Java Object, POJO) 개념 스프링(Spring)을 공부 하거나, 자바를 공부하다보면 POJO(Plain Old Java Object)라는 용어를 자주 보게 될 것이다. 그때마다 뭔말이야? 하면서 넘어가는 경우가 많을텐데 왜냐하면 정말 별 말이 아니기 때문이다. 포조는 Java EE 등으로 인해서 점점 무거워지는 객체에 대해서 반발하며 나타난 개념이다. 2000년 9월에 마틴 파울러(Martin Fowler), 레베카 파슨(Rebecca Parsons), 조쉬 맥킨지(Josh MacKenzie) 등이 시작하였으며 그 기원에 대한 내용은 마틴 파울러가 다음과 같이 말했다. "We wondered why people were so against using regular ob..
Math.round 방식 double a = 12.3456789; System.out.println(a*100); 1234.56789 System.out.println((double)Math.round(a*100)); 1235.0 System.out.println((double)Math.round(a*100)/100); 12.35 자바의 대표적인 수학모듈인 Math는 다양한 소수점을 처리하는 기능도 제공한다. Math.round를 쓰게 되면, 소수점 위치에 반올림하게 되는데 원하는 위치를 반올림을 하기 위해서는 별도의 인자값을 넣는 것이 아니라 위 소스처럼 그만큼의 소수점을 Shift해야 한다. 즉 2자리까지 보여주고 반올림을 하고 싶을 경우 우선 현재 값에 100을 곱하고, Math.round를 쓰면 ..
영상에서 썸네일을 자동으로 추출하여, 썸네일을 만들거나 이미지 파일을 분석하는 방법을 활용할 수 있을 것이다. 필자는 썸네일의 용도보다는 주기적으로 영상에 이미지를 추출하여 사진을 분석하는 용도로 사용하기 위해서 구글링을 하게 되었다. 다양한 방법이 있고, 라이브러리마다 성능의 차이는 있을 수 있다. 예를 들어 좀 더 복잡한 방식은 더 높은 성능을 자랑할 수 있다. 단순한 라이브러리는 상대적으로 낮은 성능(ex: 추출 속도)을 보여줄 수 있지만 이미지를 수집하는데 큰 지장이 없기에 이번에는 쉬운 방법의 썸네일을 추출하는 라이브러리를 소개하고자 한다. Maven 설정 Java 기반이며 필자는 Maven 기반으로 프로젝트를 생성하였다. 라이브러리는 "jcodec"이라는 라이브러리를 활용하였는데 아래 2개의 ..
List 형으로 String으로 변환하는 방법이야 for 문으로 list Loop를 돌면서 String에 Add하고 처리하는 고전적인 방법이 있는 반면 stream 을 활용하여 처리하는 방법, 외부 라이브러리를 사용하여 처리하는 방법등 여러가지 방법이 존재할 것이다. 본 강의는 List를 Loop돌아서 String에 Add하는 방법 뿐만 아니라 외부 라이브러리와 Stream 기능을 써서 처리하는 2가지 방법도 추가하여 포스팅 하고자 한다 실험 방법 우선 랜덤형으로 List 형 데이터를 N개 생성한다. 랜덤 소스는 아래와 같다. /** * int를 받아서, 랜덤 알파벳을 출력함 * * @param wordLength * @return */public String randomAlphaWord(int word..
간혹 프로젝트를 하다보면, 정렬을 어렵게 수행하는 사람들을 보는 경우가 있다. 예를 들어 sort algorithm을 별도로 만들어서 리스트 데이터를 정렬하는 경우를 본적이 있는데, 복잡한 구조라면 필요한 경우도 있겠지만 간단한 데이터 타입의 리스트 구조마저 자신들이 만들어 놓은 알고리즘으로 정렬을 하는 말그대로 삽X을 하는 경우를 종종 본적이 있다. JAVA에서는 매우 간단하게 정렬을 할 수 있는 방법을 제공하니, 본인의 알고리즘을 믿지 말고 제공해주는 라이브러리를 활용하는 것이 현명하겠다. List 정렬하기 java.util 라이브러리 안에는 Collections라는 하위 라이브러리가 존재한다. 이놈은 여러가지 다양한 기능을 제공하는데(정렬, 셔플 등등) 정렬에 대해서만 정리해보도록 하겠다. 오름차순..
자바로 MySQL(혹은 MariaDB)에 대량의 데이터를 넣는 방법이 2가지 존재한다. 하나는 Batch 기능을 활용하여 Insert를 하는 방법, 나머지 하나는 Load 명령어를 활용하여 넣는 방법. 본 포스팅은 2가지 방법에 대해서 설명해 보고 장단점에 대해 말해보도록 하겠다. add Batch 방법 Java에서 DB 데이터를 핸들링 할 수 있는 PreparedStatement 같은 라이브러리에 Batch 하는 방식을 제공하는 기능이 있다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263Connection conn = null;Prepare..
자바에서는 사이트 데이터를 읽기 위해서 기본적으로 라이브러리들을 제공하고 있다. 그 중 2가지의 대표적인 방식을 포스팅에 적어보고자 한다. 사이트 데이터를 읽는다는 것은, 특정 URL(ex: www.naver.com)을 입력하였을 때, HTML(Hyper Text Markup Language), JSON(JavaScript Object Notation), XML(Extensible Markup Language), OpenAPI 등의 데이터를 읽어 들인다는 것을 의미한다. 이렇게 다른 사이트의 데이터를 읽어와서 자신만의 데이터베이스를 구축하는 경우가 많은데, 물론 이것을 서비스 하는 것은 법적으로 문제가 있을 수 있겠지만 이 데이터로 무언가를 분석하거나, 2차적인 아이디어를 구축하는 경우가 많다. Type..
비트코인에서 쓰고 있기도 한 해싱 알고리즘인 SHA-256은, 안전한 해시 알고리즘인 Secure Hash Algorithm에서 따온 명칭이다. 이 함수는 미국 국가안보국(NSA)에서 1993년 처음 설계했으며, 미국 국가 표준으로 지정되었다. 1993년에 SHA-0 버전을 시작으로, SHA-1은 1995년에 나왔고, SHA-2는 2001년 SHA-3은 2012년에 나오게 된다. 여기서 설명할 SHA-256은 SHA-2 중에 하나로서, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 패밀리를 보유하고 있다. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 fam..
자바 프로젝트를 수행 중, 로그성 데이터를 읽거나 프로퍼티등을 읽거나 라인별로 읽어야 프로젝트 수행이 원활 할 때가 있다. 기본적으로 많이 쓰이는 방식이 FileReader를 BufferedReader에 담아서, readLine 메소드를 활용하는 방법이다. FileReader에는 기본적으로 read 메소드(Byte별로 읽는 방법)는 있지만, readLine 메소드(라인별로 읽는 방법)는 없기에 로그성 데이터를 읽기에는 용이하지가 않다. Scanner 메소드는 대용량의 로그 데이터를 제대로 읽지 못하는 결과를 보여줬다. 처음에는 너무 빨라서 놀랐지만, length를 호출해보니, 적은 양의 파일을 읽고 있었다. 대상로그 로그치곤, 용량이 꽤 많다. 현재 운영중인 프로젝트의 로그를 대상으로 테스트 해보았다. ..
스프링으로 웹을 구현하는 경우, jsp 출력은 십중팔구 JSTL을 사용할 것이다. JSTL로 로직을 구현하는 경우도 존재하지만, 왠만해서는 자바에서 비즈니스 로직을 구현하여 페이지에 전송하게 되는데.. 태그를 붙인 상태로 보내는 경우가 존재한다. (ex: 하이라이트 태그) 이럴 경우, 아래와 같은 경우가 발생한다. 검색어를 하이라이트 처리하여 전달하였지만, 하이라이트 태그가 화면에 그대로 노출되었다.위에 적힌, 전화번호, 사람이름 등은 가라로 만든 가상의 인물이다. JSTL로 처리를 할 때, 태그처리를 자동으로 해서 생기는 문제이다. 기본적으로 escapeXml 이라는 값이 true로 처리가 되고, 이 속성은 와 같은 값들을 등으로 변경하여 화면에 뿌려주게 된다. 하지만, 태그를 원하는 대로 뿌..