롬복(Lombok)이 사실은 호불호가 상당히 많이 갈리는 유틸리티이고, 같이 프로젝트를 진행할 때 롬복을 사용 안해본 사람들이 있다면 더욱 문제가 발생할 수 있는 기능이고 git 등에 공유하기도 힘들어서 적극적으로 추천하는 기능은 아니지만 롬복을 사용하는 추세가 증가하다보니 설정 방법에 대해서 정리해보고자 한다. 우선 롬복이라는 것은 단순히 라이브러리만 세팅해서 되는 기능이 아니다. 그렇게 간단했었다면 롬복을 비선호할 이유도 없었을 것이다. 롬복(Lombok) 이란? 우선 롬복을 사용하는 사람들은 게터(Getter), 세터(Setter) 등을 편리하게 만들어주기 때문에 사용한다고 하지만 필자는 이것이 뭐가 불편한지 모르기 때문에 왜 이것이 편리한지를 되묻고 싶다. Getter, Setter 만들때 수동으..
개발자가 접근하기 쉽고, SI가 아니라 솔루션 업체나 회사 전산실이나 IT부서 같은 곳에 근무하게 된다면 별도의 디자이너가 붙지 않고 부트스트랩(bootstrap) 등을 이용해서 직접 디자인을 선택하고 만들어야 되는 경우가 많다. 예를 들어 소수가 사용하는 관리기의 경우 웹디자이너가 붙으면 공수(Man Month, M/M)가 많이 들 뿐만 아니라 이미 부트스트랩으로 만들어진 디자인들이 훌륭해서 디자이너가 붙는다고 해서 심미적이나 기능적으로 뛰어나다 장담할 수 없기 때문이다. 현재는 관리기 뿐만 아니라 서비스를 하는 페이지에도 부트스트랩을 받아서 커스터마이징을 하는 경우도 상당히 많은데 이미 웹개발과 부트스트랩 프로젝트는 떼려야 뗄 수 없는 프로젝트가 되어 버렸다. 부트스트랩(Bootstrap) 부트스트랩..
String부터 StringBuffer, StringBuilder까지 자바는 문자열을 다루기 위한 3개의 클래스를 제공한다. 개발 초기에는 아무런 생각 없이 String에 값을 계속 더하는 행위를 하지만, 이 방법이 잘못 되었다는 것은 개발이 어느정도 능숙해지고부터이다. String은 불변적인 객체이다보니 동적으로 문자열이 바뀌는 것에 취약하다. 그래서 새로운 문자열을 더할 경우 기존 문자열을 삭제하고 다시 두개의 문자열을 합친 후 String 변수에 보내는데 이때 garbage collector가 발생하게 된다. 최근의 자바 버전에서는 내부적으로 String에서도 문자열을 합칠 때 강제적으로 StringBuilder로 변하게 되는데 아무튼 적당한 문자열을 String에 하는 것은 큰 문제가 되지 않지만..
티카(Tika)는 아파치 재단에서 운영하는 문서 필터링 프로젝트이다. 워드(Doc)나 PDF, PPT 등 문서형태의 파일에서 내용을 추출하는 프로젝트로 오래된 만큼 괜찮은 성능을 보여준다. 라이브러리 추가(maven) org.apache.tika tika-core 1.26 org.apache.tika tika-parsers 1.26 org.apache.poi openxml4j 1.0-beta org.apache.poi poi-ooxml 3.9 티카 라이브러리만 설치하면 에러가 발생하는데 아래의 2가지 openxml4j와 poi-ooxml을 설치하면 이 문제를 해결 할 수 있다. 샘플 예제 import org.apache.tika.metadata.Metadata; import org.apache.tika...
데이터 분석을 많이 하거나, 대용량의 텍스트를 저장하기에 상당히 유용한 객체로 StringBuffer가 있다. 값을 한번에 저장하는 방법은 String으로 선언된 변수에 한번에 값을 넣는 방법이겠지만, 사이즈가 좀 큰 문자열은 한번에 넣기가 쉽지가 않다. 예를 들어 csv를 만든다고 할 때 그때그때 bw.write로 파일을 내리는 것보다 StringBuffer에 일정만큼 저장한 후 한번에 bw.write에 값을 전달하는 것이 훨씬 속도면에서 유리하다. 그러나 StringBuffer에서 데이터를 새로 담을 때, 아무 생각없이 new StringBuffer()로 계속된 초기화를 한적이 있는데 우연찮게 찾아본 문서를 보고 이 부분에 대해서 좀 더 고민할 필요가 있을 것 같아 포스팅을 공유해보고자 한다. new..
네이버 API 등록을 하는 것은 바로 이전 포스팅을 참고하면 되며 [Java] 네이버 검색 API 등록 및 호출하기 [Java] 네이버 검색 API 등록 및 호출하기 네이버 검색 API 등록 모든 API가 그러하지만 네이버 검색도 사용하기 위해서는 우선적으로 API 등록해서 키를 발급받아야 한다. developers.naver.com/docs/search/blog/ 검색 API 블로그 검색 개발가이드 NAVER needjarvis.tistory.com 위 내용이 마무리 된 사람을 기준으로 네이버 검색 및 간단하게 파싱(Parsing)하는 법에 대해서 설명하고자 한다. NaverCrawlerMain.java import java.net.URLEncoder; import java.util.Map; /** *..
네이버 검색 API 등록 모든 API가 그러하지만 네이버 검색도 사용하기 위해서는 우선적으로 API 등록해서 키를 발급받아야 한다. developers.naver.com/docs/search/blog/ 검색 API 블로그 검색 개발가이드 NAVER Developers - 검색 API 블로그 검색 개발가이드 developers.naver.com 위 링크로 들어가면 위와 같이 녹색으로 되어 있는 오픈 API 이용 신청 버튼이 존재한다. 이 녀석을 클릭하고 사용 API는 검색을 선택하고 환경을 추가로 설정하는데 웹 형태로 만들고 싶고 내 로컬에서 작업을 하고 싶다면, 위와 같이 로컬호스트 주소를 입력하고 등록하기를 선택한다. 등록하기를 완료하면 이렇게 Client ID와 Client Secret이라는 값들이 ..
스케쥴링을 위해서 while(true)로 무한으로 돌린 후, sleep 걸어서 사용하거나 linux에서 crontab으로 주기적으로 실행하는 방법을 이용할 수 있겠지만 스프링 프레임워크(spring framework)에서는 crontab을 내장해서 사용하는 듯한 매우 편리한 방법을 제공해준다. 스케쥴러를 사용하기 위해서는 spring task라는 내장되어 있는 기능을 사용하면 된다. 예전에는 쿼츠(Quartz)를 많이 활용했던 걸로 기억하는데 본 포스팅의 방식으로 핸들링이 안된다면 Quartz를 한번 찾아보길 바란다. 스프링 scheduler를 사용할 때 어노테이션(annotation)으로 심플하게 제어하는 방법과 xml으로 핸들링하는 방법이 있는데 본 포스팅에서는 xml이 아닌 annotation으로만..
엑셀을 쉽게 읽는 방법으로 판다스(Pandas)를 활용하는 방법도 있지만, OpenPyXL을 사용하여 엑셀을 디테일하게 컨트롤 할 수 있다. 테스트에 사용한 엑셀 키움증권과 카카오에 있는 FAQ 내용을 몇개 가져와서 2개의 sheet를 만든 구조이며 컬럼은 질문과 답변으로 되어 있는 구조이다. 모든 데이터 읽어오기 import openpyxl as xl wb = xl.load_workbook('C:/Project/steel/faq.xlsx') for sheet_nm in wb.sheetnames: print('*' * 100) print('시트명:', sheet_nm) sheet = wb[sheet_nm] for row_data in sheet.iter_rows(min_row=1):# min_row는 시..
파이썬은 아직 언어가 완벽하지 않은 프로그램 언어이다. 그러다보니 버전업이 될때마다 개발에 대해서 호환이 잘 안되는 경우가 많고, 이는 파이썬 자체뿐만 아니라 라이브러리들도 그러하다. 텐서플로우(Tensorflow)를 하나 예로 들면 이제 나온지 5년도 안된 라이브러리, 프레임워크지만 버전간 호환이 안되는 경우가 허다하고, 이는 곧 특정 버전에 정체 되는 문제를 만든다. 파이썬이란 언어가 개발자보다는 연구원과 같은 비개발자들이 좀 더 선호하는 경향이 많아서 그런지 코딩하는 방식도 워낙 천차만별이고, 서비스에 접목시키기 상당히 어려운 예제들이 많다. 자바 개발자는 gradle이나 maven과 같은 빌드툴로 동일한 환경에서 개발을 매우 쉽게 할 수 있으며, war나 jar안에 패키지로 묶어서 실행하는 할 수..
자바에서 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..
필자는 아나콘다(Anaconda)를 선호하기 때문에 가상환경도 폴더 형태로 만들지 않고 아나콘다에서 가상환경을 생성하여 연결하는 것을 선호한다. 이 포스팅은 새로운 아나콘다 가상환경 상태에서 주피터를 연결하는 방법을 진행하려 한다. 물론 이 방식은 아나콘다 가상환경이 아니라 폴더별 가상환경도 설정이 가능하니 본인의 상황에 맞게 환경을 추가하면 될 것이다. 주피터로 새로운 notebook을 만드려고 하지만, 가상환경을 설정하는 메뉴가 존재하지 않는다. 일단 Python 3로 생성 후, Kernel 메뉴에서 Change Kernel을 하지만 보다시피 주피터에서 다른 가상환경을 못불러들이고 있다. 필자는 주피터로 코딩을 하는 것을 좋아하지 않기 때문에 사실 필요성을 못느꼈지만 최근 내부 공유자료를 만들기 위해..