본문 바로가기

포스트464

[Java] JNI 사용법 및 예제 자바는 가상 머신인 JVM위에서 실행되도록 만들어진 언어다. 프로그래머가 자바 언어로 작성한 프로그램은 JVM 위에서 동작하도록 중간 언어인 바이트 코드로 컴파일 된다. 운영체제나 아키텍처와 관련된 호환은 JVM이 신경써주기 때문에 하나의 소스코드로 작성한 프로그램을 플랫폼에 상관없이 실행할 수 있다. 다시말해서 자바로 작성된 프로그램을 윈도우에서도 실행할 수 있고, 리눅스에서도 동일하게 실행할 수 있다는 의미다. JVM이 하는 이런 역할은 자바뿐 아니라 JVM 언어들의 강점이다. 하지만 운영체제가 제공하는 특정 기능들을 자바에서는 사용하기 힘들다는 단점도 있다. 리눅스 커널이 업데이트 되면서 새로운 시스템 콜이 추가되거나 특정 유닉스의 시스템 콜을 호출하고 싶지만 JVM이 지원하지 않으면 자바에서 사용.. 2021. 4. 19.
[Java] Java Unsupported major.minor version 52.0 에러 Java 프로그램을 작성한 다음 클러스터에 배포를 할 때 가끔씩 Java Unsupported major.minor version 52.0 에러를 만나게 된다. 톰캣(Tomcat)이나 하둡 맵 리듀스(MapReduce)처럼 jar 파일로 묶어서 배포하는 경우에 쉽게 만나볼 수 있는 에러다. "Java Unsupported major.minor version 52.0"라는 메시지에서 알 수 있듯이 Java 버전이 맞지 않아서 발생하는 에러다. 정확히는 jar 파일을 생성한 빌드환경과 생성한 jar 파일을 실행하려는 환경이 다른 JDK 버전을 사용하고 있는 경우 발생한다. Java SE 8 (JDK 1.8)에서 빌드한 Jar 파일을 Java SE 7 (JDK 1.7)이 설치되어 있는 환경에서 실행하려고 하면.. 2021. 4. 1.
[Java] 람다식(Lambda Expressions) 사용법 및 예제 자바8에서 '람다식(Lambda Expression)'이 지원되면서 자바는 완전히 새로운 언어처럼 보이기 시작했다. 지네릭스(Generics)가 자바을 크게 변화시킨 것처럼 람다식 역시 자바를 어마어마하게 변화시켰다. 람다식의 등장으로 자바는 객체지향 언어의 특징과 함께 함수형 언어의 특성을 갖추게 되었다. 람다식(Lambda expression) 람다식은 1930년대 알론조 처치(Alonzo Church)라는 수학자가 처음 제시한 함수의 수학적 표기방식인 '람다 대수(lambda calculus)'에 그 뿌리를 두고 있다. 람다식을 이용하면 코드가 간결해지고, 지연 연산 등을 통해서 성능 향상을 도모할 수 있다. 반면 모든 엘리먼트를 순회하는 경우에는 성능이 떨어질 수도 있고, 코드를 분석하기 어려워 .. 2021. 3. 31.
[Java] Project Lombok Annotation 자바의 버전이 올라가면서 간결한 코드 작성을 위한 장치들이 많이 도입되고 있다. 하지만 여전히 자바의 가장 큰 문제점 중 하나로 군더더기가 많은 점이 꼽힌다. '프로젝트 롬복(Project Lombok)'은 자바로 작성된 소스코드를 좀 더 간결하게 만들어주기 위한 프로젝트다. 간단한 클래스를 작성해보자. public class Student { private final int id; private final String name; private final int age; private final String department; public Student(int id, String name, int age, String department) { this.id = id; this.name = name; t.. 2021. 3. 30.
[Java] SimpleDateFormat을 이용한 날짜 포맷 변환 예제 Java를 이용해서 시간 데이터를 다루는 방법에는 몇 가지가 있다. 그 중에 가장 간단한 방법은 SimpleDateFormat 클래스를 이용해서 문자열을 파싱하거나 문자열로 시간 데이터를 표현하기도 한다. 이번 포스트에서는 SimpleDateFormat 클래스의 사용방법과 예제, 주의 사항을 다뤄보겠다. SimpleDateFormat은 java.text.DataFormat 이라는 abstract 클래스를 상속받은 클래스다. 이름에서도 알 수 있듯이 간단하게(Simple) 날짜 포맷을 다룰 수 있는 메소드를 제공한다. SimpleDateFormat 예제 - 문자열을 Date 객체로 변환 문자열로 표현된 날짜 정보를 파싱하여 Date 객체로 변환해보자. // 변환할 문자열 String dateStr = "2.. 2021. 3. 30.
[책] 돈 공부는 처음이라 - 김종봉, 제갈현열, 다산북스 코로나 이후 주식시장이 폭등하면서 '돈 공부'에 대한 관심이 그 어느때보다 높아져있다. 돈에 대해서 공부하지 않고, 돈 공부를 천한 것으로 여기는 사람은 최근 1년 동안 '벼락 거지'가 되어버렸다. 자산의 가치가 폭등하고, 화폐와 노동의 가치가 하락하는 시대에 살고 있는 우리는 필히 돈공부를 해야한다. 이 책을 알게 된 것은 팟 캐스트 '월급쟁이 부자들'에서 저자인 김종봉, 제갈현열님 편을 통해서였다. 경제적 자유를 이룩한 사람들을 인터뷰하는 코너였다. 그 코너에서 라는 책을 알게 되었고, 마침 리디셀렉트에서 읽을 수 있게 되어 첫 장을 넘기게 되었다. 그렇기에 당신은 돈을 더 많이 벌 수 있는 방법을 고민해야한다. 내가 깨달은 방법은 다음의 다섯 가지가 전부다 1. 기존의 소득을 늘리기 2. 새로운 소.. 2021. 3. 3.
[Linux] ulimit 옵션 사용법 및 설정법 시스템 리소스를 질서있게 사용하려면 시스템에서 동작하는 프로세서의 자원 사용 한도를 명확하게 정해둬야한다. 마치 어린이보호 구역에서는 30km/h 이하의 속도로 달리고 고속도로에서는 100km/h로 달리도록 정해놓는 것과 같다. 리눅스 시스템에도 여러가지 자원 사용의 한계값(limit)이 정해져 있다. 시스템 리소스의 한계값에는 'soft limit'과 'hard limit'이 있다. soft limit은 프로세스가 생성되면 기본적으로 적용되는 한도 값이다. 이 값은 변경될 수 있다. hard limit은 soft limit에서 최대로 늘릴 수 있는 값으로 시스템의 수퍼 유저만 바꿀 수 있다. 리눅스 시스템에서 자원의 한계 값을 확인하고 설정할 수 있는 명령어로 ulimit을 알아둬야한다. ulimit .. 2021. 3. 2.
[Linux] nf_conntrack: table full, dropping packet 에러 - ssh connection timed out 대규모 클러스터를 모니터링 하는 과정에서 간혹 ssh 접속이 안되는 문제가 발생한다. 모니터링을 수행하는 서버에서 주기적으로 클러스터의 각 노드에 접속해서 동작하고 있어야하는 데몬들이 정상적으로 떠있는지를 확인하게 되는데, 이 과정에서 ssh 접속이 안되는 문제가 발생했다. sshd 등의 데몬은 정상 동작하고 있었다. 특이한 점은 특정 호스트에서만 접속 오류가 보고되는게 아닌 클러스터의 노드들이 랜덤하게 'ssh connectin timed out' 메시지를 보인다는 것이었다. 문제를 확인하기 위해 직접 문제의 서버로 ssh 접속을 하면 접속이 잘 된다. 하이젠버그를 몸소 체함하면서 문제의 원인을 분석해봤다. 1. nf_conntrack: table full dropping packet 메시지 ssh 접.. 2021. 2. 24.
[Java] java.library.path와 LD_LIBRARY_PATH 리눅스 환경에서 자바 프로그램을 실행할 때 설정해줘야 하는 환경 변수 중에 LD_LIBRARY_PATH라는게 있다. LD_LIBRARY_PATH는 '로더(Loader)'가 공유 라이브러리나 동적 라이브러리를 찾을 때 찾아가는 경로를 지정하는 환경변수다. 맨 앞에 있는 LD라는 프리픽스(Prefix)가 로더를 의미한다. 리눅스 환경에서 실행 파일을 PATH 환경변수에 지정한 경로에서 찾는 것과 동일하다고 생각하면 된다. .bashrc 파일이나 스크립트 파일에서 다음과 같이 LD_LIBRARY_PATH 환경 변수를 지정해주면 된다. $ LD_LIBRARY_PATH=/home/user/lib:/home/user/test/lib $ export LD_LIBRARY_PATH PATH 환경변수처럼 각 경로들은 '콜.. 2021. 2. 23.